Merge pull request #85 from poanetwork/eslint+prettier

(Feature) Eslint+prettier configuration
This commit is contained in:
Victor Baranov 2018-10-18 18:06:53 +03:00 committed by GitHub
commit 84aa1c5a52
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 1287 additions and 544 deletions

8
.babelrc Normal file
View File

@ -0,0 +1,8 @@
{
"presets": [
"es2015",
"stage-1",
"react"
],
"plugins": ["transform-decorators-legacy"]
}

8
.editorconfig Normal file
View File

@ -0,0 +1,8 @@
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 2

16
.eslintrc Normal file
View File

@ -0,0 +1,16 @@
{
"extends": [
"react-app",
"plugin:prettier/recommended"
],
"plugins": [
"dependencies"
],
"rules": {
"no-control-regex": 0,
"dependencies/no-cycles": "error",
"dependencies/no-unresolved": ["error", {
"ignore": ["web3"]
}]
}
}

7
.prettierignore Normal file
View File

@ -0,0 +1,7 @@
assets
build_scripts
config
public
scripts
submodules
*.js

5
.prettierrc Normal file
View File

@ -0,0 +1,5 @@
{
"semi": false,
"singleQuote": true,
"printWidth": 120
}

653
package-lock.json generated
View File

@ -452,9 +452,9 @@
}
},
"babel-core": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz",
"integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=",
"version": "6.26.3",
"resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
"integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
"requires": {
"babel-code-frame": "^6.26.0",
"babel-generator": "^6.26.0",
@ -466,17 +466,36 @@
"babel-traverse": "^6.26.0",
"babel-types": "^6.26.0",
"babylon": "^6.18.0",
"convert-source-map": "^1.5.0",
"debug": "^2.6.8",
"convert-source-map": "^1.5.1",
"debug": "^2.6.9",
"json5": "^0.5.1",
"lodash": "^4.17.4",
"minimatch": "^3.0.4",
"path-is-absolute": "^1.0.1",
"private": "^0.1.7",
"private": "^0.1.8",
"slash": "^1.0.0",
"source-map": "^0.5.6"
"source-map": "^0.5.7"
},
"dependencies": {
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"core-js": {
"version": "2.5.7",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
"integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
},
"source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
@ -510,6 +529,25 @@
"trim-right": "^1.0.1"
},
"dependencies": {
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"core-js": {
"version": "2.5.7",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
"integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
},
"source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
@ -517,6 +555,16 @@
}
}
},
"babel-helper-bindify-decorators": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz",
"integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=",
"requires": {
"babel-runtime": "^6.22.0",
"babel-traverse": "^6.24.1",
"babel-types": "^6.24.1"
}
},
"babel-helper-builder-binary-assignment-operator-visitor": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
@ -535,6 +583,27 @@
"babel-runtime": "^6.26.0",
"babel-types": "^6.26.0",
"esutils": "^2.0.2"
},
"dependencies": {
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"core-js": {
"version": "2.5.7",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
"integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
}
}
},
"babel-helper-call-delegate": {
@ -557,6 +626,27 @@
"babel-runtime": "^6.26.0",
"babel-types": "^6.26.0",
"lodash": "^4.17.4"
},
"dependencies": {
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"core-js": {
"version": "2.5.7",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
"integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
}
}
},
"babel-helper-explode-assignable-expression": {
@ -569,6 +659,17 @@
"babel-types": "^6.24.1"
}
},
"babel-helper-explode-class": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz",
"integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=",
"requires": {
"babel-helper-bindify-decorators": "^6.24.1",
"babel-runtime": "^6.22.0",
"babel-traverse": "^6.24.1",
"babel-types": "^6.24.1"
}
},
"babel-helper-function-name": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
@ -616,6 +717,27 @@
"babel-runtime": "^6.26.0",
"babel-types": "^6.26.0",
"lodash": "^4.17.4"
},
"dependencies": {
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"core-js": {
"version": "2.5.7",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
"integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
}
}
},
"babel-helper-remap-async-to-generator": {
@ -729,11 +851,26 @@
"resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
"integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU="
},
"babel-plugin-syntax-async-generators": {
"version": "6.13.0",
"resolved": "http://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz",
"integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o="
},
"babel-plugin-syntax-class-constructor-call": {
"version": "6.18.0",
"resolved": "http://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz",
"integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY="
},
"babel-plugin-syntax-class-properties": {
"version": "6.13.0",
"resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz",
"integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94="
},
"babel-plugin-syntax-decorators": {
"version": "6.13.0",
"resolved": "http://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz",
"integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs="
},
"babel-plugin-syntax-dynamic-import": {
"version": "6.18.0",
"resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz",
@ -744,6 +881,11 @@
"resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
"integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4="
},
"babel-plugin-syntax-export-extensions": {
"version": "6.13.0",
"resolved": "http://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz",
"integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE="
},
"babel-plugin-syntax-flow": {
"version": "6.18.0",
"resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz",
@ -764,6 +906,16 @@
"resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
"integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM="
},
"babel-plugin-transform-async-generator-functions": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz",
"integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=",
"requires": {
"babel-helper-remap-async-to-generator": "^6.24.1",
"babel-plugin-syntax-async-generators": "^6.5.0",
"babel-runtime": "^6.22.0"
}
},
"babel-plugin-transform-async-to-generator": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
@ -774,6 +926,16 @@
"babel-runtime": "^6.22.0"
}
},
"babel-plugin-transform-class-constructor-call": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz",
"integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=",
"requires": {
"babel-plugin-syntax-class-constructor-call": "^6.18.0",
"babel-runtime": "^6.22.0",
"babel-template": "^6.24.1"
}
},
"babel-plugin-transform-class-properties": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz",
@ -785,6 +947,28 @@
"babel-template": "^6.24.1"
}
},
"babel-plugin-transform-decorators": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz",
"integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=",
"requires": {
"babel-helper-explode-class": "^6.24.1",
"babel-plugin-syntax-decorators": "^6.13.0",
"babel-runtime": "^6.22.0",
"babel-template": "^6.24.1",
"babel-types": "^6.24.1"
}
},
"babel-plugin-transform-decorators-legacy": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.5.tgz",
"integrity": "sha512-jYHwjzRXRelYQ1uGm353zNzf3QmtdCfvJbuYTZ4gKveK7M9H1fs3a5AKdY1JUDl0z97E30ukORW1dzhWvsabtA==",
"requires": {
"babel-plugin-syntax-decorators": "^6.1.18",
"babel-runtime": "^6.2.0",
"babel-template": "^6.3.0"
}
},
"babel-plugin-transform-es2015-arrow-functions": {
"version": "6.22.0",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
@ -811,6 +995,27 @@
"babel-traverse": "^6.26.0",
"babel-types": "^6.26.0",
"lodash": "^4.17.4"
},
"dependencies": {
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"core-js": {
"version": "2.5.7",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
"integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
}
}
},
"babel-plugin-transform-es2015-classes": {
@ -900,6 +1105,27 @@
"babel-runtime": "^6.26.0",
"babel-template": "^6.26.0",
"babel-types": "^6.26.0"
},
"dependencies": {
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"core-js": {
"version": "2.5.7",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
"integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
}
}
},
"babel-plugin-transform-es2015-modules-systemjs": {
@ -1007,6 +1233,15 @@
"babel-runtime": "^6.22.0"
}
},
"babel-plugin-transform-export-extensions": {
"version": "6.22.0",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz",
"integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=",
"requires": {
"babel-plugin-syntax-export-extensions": "^6.8.0",
"babel-runtime": "^6.22.0"
}
},
"babel-plugin-transform-flow-strip-types": {
"version": "6.22.0",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz",
@ -1023,6 +1258,27 @@
"requires": {
"babel-plugin-syntax-object-rest-spread": "^6.8.0",
"babel-runtime": "^6.26.0"
},
"dependencies": {
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"core-js": {
"version": "2.5.7",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
"integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
}
}
},
"babel-plugin-transform-react-constant-elements": {
@ -1094,6 +1350,39 @@
"babel-types": "^6.24.1"
}
},
"babel-polyfill": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
"integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=",
"requires": {
"babel-runtime": "^6.26.0",
"core-js": "^2.5.0",
"regenerator-runtime": "^0.10.5"
},
"dependencies": {
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
},
"dependencies": {
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
}
}
},
"core-js": {
"version": "2.5.7",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
"integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
}
}
},
"babel-preset-env": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz",
@ -1131,6 +1420,37 @@
"semver": "^5.3.0"
}
},
"babel-preset-es2015": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz",
"integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=",
"requires": {
"babel-plugin-check-es2015-constants": "^6.22.0",
"babel-plugin-transform-es2015-arrow-functions": "^6.22.0",
"babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0",
"babel-plugin-transform-es2015-block-scoping": "^6.24.1",
"babel-plugin-transform-es2015-classes": "^6.24.1",
"babel-plugin-transform-es2015-computed-properties": "^6.24.1",
"babel-plugin-transform-es2015-destructuring": "^6.22.0",
"babel-plugin-transform-es2015-duplicate-keys": "^6.24.1",
"babel-plugin-transform-es2015-for-of": "^6.22.0",
"babel-plugin-transform-es2015-function-name": "^6.24.1",
"babel-plugin-transform-es2015-literals": "^6.22.0",
"babel-plugin-transform-es2015-modules-amd": "^6.24.1",
"babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
"babel-plugin-transform-es2015-modules-systemjs": "^6.24.1",
"babel-plugin-transform-es2015-modules-umd": "^6.24.1",
"babel-plugin-transform-es2015-object-super": "^6.24.1",
"babel-plugin-transform-es2015-parameters": "^6.24.1",
"babel-plugin-transform-es2015-shorthand-properties": "^6.24.1",
"babel-plugin-transform-es2015-spread": "^6.22.0",
"babel-plugin-transform-es2015-sticky-regex": "^6.24.1",
"babel-plugin-transform-es2015-template-literals": "^6.22.0",
"babel-plugin-transform-es2015-typeof-symbol": "^6.22.0",
"babel-plugin-transform-es2015-unicode-regex": "^6.24.1",
"babel-plugin-transform-regenerator": "^6.24.1"
}
},
"babel-preset-flow": {
"version": "6.23.0",
"resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz",
@ -1180,6 +1500,39 @@
"babel-preset-react": "6.24.1"
}
},
"babel-preset-stage-1": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz",
"integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=",
"requires": {
"babel-plugin-transform-class-constructor-call": "^6.24.1",
"babel-plugin-transform-export-extensions": "^6.22.0",
"babel-preset-stage-2": "^6.24.1"
}
},
"babel-preset-stage-2": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz",
"integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=",
"requires": {
"babel-plugin-syntax-dynamic-import": "^6.18.0",
"babel-plugin-transform-class-properties": "^6.24.1",
"babel-plugin-transform-decorators": "^6.24.1",
"babel-preset-stage-3": "^6.24.1"
}
},
"babel-preset-stage-3": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz",
"integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=",
"requires": {
"babel-plugin-syntax-trailing-function-commas": "^6.22.0",
"babel-plugin-transform-async-generator-functions": "^6.24.1",
"babel-plugin-transform-async-to-generator": "^6.24.1",
"babel-plugin-transform-exponentiation-operator": "^6.24.1",
"babel-plugin-transform-object-rest-spread": "^6.22.0"
}
},
"babel-register": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
@ -1194,26 +1547,40 @@
"source-map-support": "^0.4.15"
},
"dependencies": {
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"core-js": {
"version": "2.5.7",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
"integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
}
}
},
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"version": "6.23.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
"integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=",
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
"regenerator-runtime": "^0.10.0"
},
"dependencies": {
"core-js": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz",
"integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs="
"version": "2.5.7",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
"integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
}
}
},
@ -1227,6 +1594,27 @@
"babel-types": "^6.26.0",
"babylon": "^6.18.0",
"lodash": "^4.17.4"
},
"dependencies": {
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"core-js": {
"version": "2.5.7",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
"integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
}
}
},
"babel-traverse": {
@ -1243,6 +1631,27 @@
"globals": "^9.18.0",
"invariant": "^2.2.2",
"lodash": "^4.17.4"
},
"dependencies": {
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"core-js": {
"version": "2.5.7",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
"integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
}
}
},
"babel-types": {
@ -1254,6 +1663,27 @@
"esutils": "^2.0.2",
"lodash": "^4.17.4",
"to-fast-properties": "^1.0.3"
},
"dependencies": {
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"core-js": {
"version": "2.5.7",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
"integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
}
}
},
"babylon": {
@ -3407,6 +3837,21 @@
}
}
},
"eslint-config-prettier": {
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-2.9.0.tgz",
"integrity": "sha512-ag8YEyBXsm3nmOv1Hz991VtNNDMRa+MNy8cY47Pl4bw6iuzqKbJajXdqUpiw13STdLLrznxgm1hj9NhxeOYq0A==",
"requires": {
"get-stdin": "^5.0.1"
},
"dependencies": {
"get-stdin": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz",
"integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g="
}
}
},
"eslint-config-react-app": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-2.1.0.tgz",
@ -3452,6 +3897,15 @@
}
}
},
"eslint-plugin-dependencies": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-dependencies/-/eslint-plugin-dependencies-2.4.0.tgz",
"integrity": "sha512-IaW2phNpktrok2eDziZLYxmNaGysXjNj6NVji7LEv/qagHG2oshsmV+mUSxAGG5Jv9seuRBdX1YXEIaNlhkFJg==",
"requires": {
"commondir": "^1.0.1",
"resolve": "^1.1.6"
}
},
"eslint-plugin-flowtype": {
"version": "2.39.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.39.1.tgz",
@ -3553,6 +4007,22 @@
"jsx-ast-utils": "^1.4.0"
}
},
"eslint-plugin-prettier": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-2.6.0.tgz",
"integrity": "sha512-floiaI4F7hRkTrFe8V2ItOK97QYrX75DjmdzmVITZoAP6Cn06oEDPQRsO6MlHEP/u2SxI3xQ52Kpjw6j5WGfeQ==",
"requires": {
"fast-diff": "^1.1.1",
"jest-docblock": "^21.0.0"
},
"dependencies": {
"jest-docblock": {
"version": "21.2.0",
"resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz",
"integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw=="
}
}
},
"eslint-plugin-react": {
"version": "7.4.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.4.0.tgz",
@ -3883,6 +4353,11 @@
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
"integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
},
"fast-diff": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
"integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w=="
},
"fast-json-stable-stringify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
@ -4248,13 +4723,11 @@
},
"balanced-match": {
"version": "1.0.0",
"bundled": true,
"optional": true
"bundled": true
},
"brace-expansion": {
"version": "1.1.11",
"bundled": true,
"optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@ -4271,8 +4744,7 @@
},
"concat-map": {
"version": "0.0.1",
"bundled": true,
"optional": true
"bundled": true
},
"console-control-strings": {
"version": "1.1.0",
@ -4401,7 +4873,6 @@
"minimatch": {
"version": "3.0.4",
"bundled": true,
"optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
@ -9528,6 +9999,11 @@
"resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
"integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks="
},
"prettier": {
"version": "1.14.3",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-1.14.3.tgz",
"integrity": "sha512-qZDVnCrnpsRJJq5nSsiHCE3BYMED2OtsI+cmzIzF1QIfqm5ALf8tEJcO27zV1gKNKRPdhjO0dNWnrzssDQ1tFg=="
},
"pretty-bytes": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz",
@ -9770,6 +10246,27 @@
"dom-align": "1.x",
"prop-types": "^15.5.8",
"rc-util": "^4.0.4"
},
"dependencies": {
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"core-js": {
"version": "2.5.7",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
"integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
}
}
},
"rc-animate": {
@ -9926,6 +10423,46 @@
"whatwg-fetch": "2.0.3"
},
"dependencies": {
"babel-core": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz",
"integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=",
"requires": {
"babel-code-frame": "^6.26.0",
"babel-generator": "^6.26.0",
"babel-helpers": "^6.24.1",
"babel-messages": "^6.23.0",
"babel-register": "^6.26.0",
"babel-runtime": "^6.26.0",
"babel-template": "^6.26.0",
"babel-traverse": "^6.26.0",
"babel-types": "^6.26.0",
"babylon": "^6.18.0",
"convert-source-map": "^1.5.0",
"debug": "^2.6.8",
"json5": "^0.5.1",
"lodash": "^4.17.4",
"minimatch": "^3.0.4",
"path-is-absolute": "^1.0.1",
"private": "^0.1.7",
"slash": "^1.0.0",
"source-map": "^0.5.6"
}
},
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
}
},
"core-js": {
"version": "2.5.7",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
"integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
},
"fs-extra": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz",
@ -9951,6 +10488,16 @@
"requires": {
"asap": "~2.0.3"
}
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
},
"source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
}
}
},
@ -10063,9 +10610,9 @@
"integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg=="
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
"version": "0.10.5",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
"integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg="
},
"regenerator-transform": {
"version": "0.10.1",
@ -12020,6 +12567,14 @@
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
},
"typedarray-to-buffer": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
"integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
"requires": {
"is-typedarray": "^1.0.0"
}
},
"ua-parser-js": {
"version": "0.7.17",
"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz",
@ -12738,13 +13293,11 @@
},
"balanced-match": {
"version": "1.0.0",
"bundled": true,
"optional": true
"bundled": true
},
"brace-expansion": {
"version": "1.1.11",
"bundled": true,
"optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@ -12757,18 +13310,15 @@
},
"code-point-at": {
"version": "1.1.0",
"bundled": true,
"optional": true
"bundled": true
},
"concat-map": {
"version": "0.0.1",
"bundled": true,
"optional": true
"bundled": true
},
"console-control-strings": {
"version": "1.1.0",
"bundled": true,
"optional": true
"bundled": true
},
"core-util-is": {
"version": "1.0.2",
@ -12871,8 +13421,7 @@
},
"inherits": {
"version": "2.0.3",
"bundled": true,
"optional": true
"bundled": true
},
"ini": {
"version": "1.3.5",
@ -12882,7 +13431,6 @@
"is-fullwidth-code-point": {
"version": "1.0.0",
"bundled": true,
"optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
@ -12895,7 +13443,6 @@
"minimatch": {
"version": "3.0.4",
"bundled": true,
"optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
@ -12995,8 +13542,7 @@
},
"number-is-nan": {
"version": "1.0.1",
"bundled": true,
"optional": true
"bundled": true
},
"object-assign": {
"version": "4.1.1",
@ -13111,7 +13657,6 @@
"string-width": {
"version": "1.0.2",
"bundled": true,
"optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
@ -13576,19 +14121,8 @@
"integrity": "sha1-fecPG4Py3jZHZ3IVa+z+9uNRbrM=",
"requires": {
"underscore": "1.8.3",
"web3-core-helpers": "1.0.0-beta.34"
},
"dependencies": {
"websocket": {
"version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2",
"from": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2",
"requires": {
"debug": "^2.2.0",
"nan": "^2.3.3",
"typedarray-to-buffer": "^3.1.2",
"yaeti": "^0.0.6"
}
}
"web3-core-helpers": "1.0.0-beta.34",
"websocket": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2"
}
},
"web3-shh": {
@ -13986,6 +14520,16 @@
}
}
},
"websocket": {
"version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2",
"from": "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible",
"requires": {
"debug": "^2.2.0",
"nan": "^2.3.3",
"typedarray-to-buffer": "^3.1.2",
"yaeti": "^0.0.6"
}
},
"websocket-driver": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
@ -14237,6 +14781,11 @@
"resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
"integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
},
"yaeti": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz",
"integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc="
},
"yallist": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",

View File

@ -5,7 +5,25 @@
"homepage": "https://poanetwork.github.io/",
"dependencies": {
"ajv": "^6.5.2",
"babel-core": "^6.26.3",
"babel-eslint": "^7.2.3",
"babel-plugin-transform-decorators-legacy": "^1.3.5",
"babel-polyfill": "^6.26.0",
"babel-preset-es2015": "^6.24.1",
"babel-preset-react-app": "^3.0.1",
"babel-preset-stage-1": "^6.24.1",
"babel-preset-stage-2": "^6.24.1",
"babel-runtime": "6.23.0",
"clipboard": "^1.7.1",
"eslint": "^4.1.1",
"eslint-config-prettier": "2.9.0",
"eslint-config-react-app": "^2.1.0",
"eslint-plugin-dependencies": "^2.4.0",
"eslint-plugin-flowtype": "^2.34.1",
"eslint-plugin-import": "^2.6.0",
"eslint-plugin-jsx-a11y": "^5.1.1",
"eslint-plugin-prettier": "2.6.0",
"eslint-plugin-react": "^7.1.0",
"file-saver": "^1.3.3",
"gh-pages": "^1.2.0",
"jszip": "^3.1.5",
@ -14,6 +32,7 @@
"node-sass-chokidar": "1.3.0",
"npm-run-all": "^4.1.2",
"password-generator": "^2.2.0",
"prettier": "^1.13.7",
"rc-tooltip": "^3.7.0",
"react": "^16.2.0",
"react-dom": "^16.2.0",
@ -31,6 +50,7 @@
"build-js": "react-scripts build",
"build": "npm-run-all build-css build-js",
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
"eject": "react-scripts eject",
"lint": "./node_modules/.bin/eslint src"
}
}

View File

@ -1,78 +1,86 @@
import React, { Component } from 'react';
import React, { Component } from 'react'
import getWeb3 from './getWeb3'
import KeysManager from './keysManager';
import Keys from './Keys';
import swal from 'sweetalert';
import './index/index.css';
import KeysManager from './keysManager'
import Keys from './Keys'
import swal from 'sweetalert'
import './index/index.css'
import addressGenerator from './addressGenerator'
import JSzip from 'jszip';
import FileSaver from 'file-saver';
import { constants } from './constants';
import networkAddresses from './addresses';
import Header from './Header';
import Footer from './Footer';
import Loading from './Loading';
import JSzip from 'jszip'
import FileSaver from 'file-saver'
import { constants } from './constants'
import networkAddresses from './addresses'
import Header from './Header'
import Footer from './Footer'
import Loading from './Loading'
function generateElement(msg){
let errorNode = document.createElement("div");
function generateElement(msg) {
let errorNode = document.createElement('div')
errorNode.innerHTML = `<div style="line-height: 1.6;">
${msg}
</div>`;
return errorNode;
</div>`
return errorNode
}
class App extends Component {
constructor(props){
super(props);
this.onClick = this.onClick.bind(this);
this.saveFile = (blob) => {
FileSaver.saveAs(blob, `poa_network_validator_keys.zip`);
};
constructor(props) {
super(props)
this.onClick = this.onClick.bind(this)
this.saveFile = blob => {
FileSaver.saveAs(blob, `poa_network_validator_keys.zip`)
}
this.state = {
web3Config: {},
mining: null,
isDisabledBtn: props.generateKeysIsDisabled
}
this.keysManager = null;
getWeb3().then(async (web3Config) => {
return networkAddresses(web3Config)
}).then(async (config) => {
const {web3Config, addresses} = config;
this.keysManager = new KeysManager();
await this.keysManager.init({
web3: web3Config.web3Instance,
netId: web3Config.netId,
addresses
});
this.setState({
isDisabledBtn: false,
web3Config
this.keysManager = null
getWeb3()
.then(async web3Config => {
return networkAddresses(web3Config)
})
.then(async config => {
const { web3Config, addresses } = config
this.keysManager = new KeysManager()
await this.keysManager.init({
web3: web3Config.web3Instance,
netId: web3Config.netId,
addresses
})
this.setState({
isDisabledBtn: false,
web3Config
})
})
.catch(error => {
if (error.msg) {
this.setState({ isDisabledBtn: true })
swal({
icon: 'warning',
title: 'Warning',
content: error.node
})
}
})
}).catch((error) => {
if(error.msg){
this.setState({isDisabledBtn: true});
swal({
icon: 'warning',
title: 'Warning',
content: error.node
});
}
})
}
componentDidMount(){
if(window.location.hash.indexOf('just-generate-keys') !== -1) {
this.setState({loading:true});
componentDidMount() {
if (window.location.hash.indexOf('just-generate-keys') !== -1) {
this.setState({ loading: true })
setTimeout(async () => {
const {mining, voting, payout} = await this.generateKeys();
this.setState({loading:false});
await this.generateZip({mining, voting, payout, netIdName: "manualCreation"});
const { mining, voting, payout } = await this.generateKeys()
this.setState({ loading: false })
await this.generateZip({
mining,
voting,
payout,
netIdName: 'manualCreation'
})
}, 150)
}
}
async generateKeys(cb) {
const mining = await addressGenerator();
const voting = await addressGenerator();
const payout = await addressGenerator();
const mining = await addressGenerator()
const voting = await addressGenerator()
const payout = await addressGenerator()
this.setState({
mining,
voting,
@ -80,35 +88,37 @@ class App extends Component {
keysGenerated: true
})
return {
mining, voting, payout
mining,
voting,
payout
}
}
async generateZip({mining, voting, payout, netIdName}){
const zip = new JSzip();
zip.file(`${netIdName}_keys/mining_key_${mining.jsonStore.address}.json`, JSON.stringify(mining.jsonStore));
zip.file(`${netIdName}_keys/mining_password_${mining.jsonStore.address}.txt`, mining.password);
async generateZip({ mining, voting, payout, netIdName }) {
const zip = new JSzip()
zip.file(`${netIdName}_keys/mining_key_${mining.jsonStore.address}.json`, JSON.stringify(mining.jsonStore))
zip.file(`${netIdName}_keys/mining_password_${mining.jsonStore.address}.txt`, mining.password)
zip.file(`${netIdName}_keys/voting_key_${voting.jsonStore.address}.json`, JSON.stringify(voting.jsonStore));
zip.file(`${netIdName}_keys/voting_password_${voting.jsonStore.address}.txt`, voting.password);
zip.file(`${netIdName}_keys/voting_key_${voting.jsonStore.address}.json`, JSON.stringify(voting.jsonStore))
zip.file(`${netIdName}_keys/voting_password_${voting.jsonStore.address}.txt`, voting.password)
zip.file(`${netIdName}_keys/payout_key_${payout.jsonStore.address}.json`, JSON.stringify(payout.jsonStore));
zip.file(`${netIdName}_keys/payout_password_${payout.jsonStore.address}.txt`, payout.password);
zip.generateAsync({type:"blob"}).then((blob) => {
FileSaver.saveAs(blob, `poa_network_validator_keys.zip`);
});
zip.file(`${netIdName}_keys/payout_key_${payout.jsonStore.address}.json`, JSON.stringify(payout.jsonStore))
zip.file(`${netIdName}_keys/payout_password_${payout.jsonStore.address}.txt`, payout.password)
zip.generateAsync({ type: 'blob' }).then(blob => {
FileSaver.saveAs(blob, `poa_network_validator_keys.zip`)
})
}
async onClick() {
this.setState({loading:true});
const initialKey = this.state.web3Config.defaultAccount;
this.setState({ loading: true })
const initialKey = this.state.web3Config.defaultAccount
let isValid
try {
isValid = await this.keysManager.isInitialKeyValid(initialKey);
} catch(e) {
isValid = false;
isValid = await this.keysManager.isInitialKeyValid(initialKey)
} catch (e) {
isValid = false
}
console.log(isValid);
if(Number(isValid) !== 1){
this.setState({loading:false});
console.log(isValid)
if (Number(isValid) !== 1) {
this.setState({ loading: false })
const invalidKeyMsg = `The key is an invalid Initial key<br/>
or you're connected to the incorrect chain!<br/>
Please make sure you have loaded correct Initial key in MetaMask.<br/><br/>
@ -119,90 +129,97 @@ class App extends Component {
title: 'Error',
content: generateElement(invalidKeyMsg)
})
return;
return
}
if(Number(isValid) === 1){
const {mining, voting, payout} = await this.generateKeys()
if (Number(isValid) === 1) {
const { mining, voting, payout } = await this.generateKeys()
// add loading screen
await this.keysManager.createKeys({
mining: mining.jsonStore.address,
voting: voting.jsonStore.address,
payout: payout.jsonStore.address,
sender: initialKey
}).then(async (receipt) => {
console.log(receipt);
if (receipt.status === true || receipt.status === "0x1") {
this.setState({loading: false})
swal("Congratulations!", "Your keys are generated!", "success");
await this.generateZip({mining, voting, payout, netIdName: this.state.web3Config.netIdName});
} else {
this.setState({loading: false, keysGenerated: false})
let content = document.createElement("div");
let msg = `Transaction failed`;
content.innerHTML = `<div>
await this.keysManager
.createKeys({
mining: mining.jsonStore.address,
voting: voting.jsonStore.address,
payout: payout.jsonStore.address,
sender: initialKey
})
.then(async receipt => {
console.log(receipt)
if (receipt.status === true || receipt.status === '0x1') {
this.setState({ loading: false })
swal('Congratulations!', 'Your keys are generated!', 'success')
await this.generateZip({
mining,
voting,
payout,
netIdName: this.state.web3Config.netIdName
})
} else {
this.setState({ loading: false, keysGenerated: false })
let content = document.createElement('div')
let msg = `Transaction failed`
content.innerHTML = `<div>
Something went wrong!<br/><br/>
Please contact Master Of Ceremony<br/><br/>
${msg}
</div>`;
</div>`
swal({
icon: 'error',
title: 'Error',
content: content
})
}
})
.catch(error => {
console.error(error.message)
this.setState({ loading: false, keysGenerated: false })
let content = document.createElement('div')
let msg
if (error.message.includes(constants.userDeniedTransactionPattern))
msg = `Error: ${constants.userDeniedTransactionPattern}`
else msg = error.message
content.innerHTML = `<div>
Something went wrong!<br/><br/>
Please contact Master Of Ceremony<br/><br/>
${msg}
</div>`
swal({
icon: 'error',
title: 'Error',
content: content
});
}
}).catch((error) => {
console.error(error.message);
this.setState({loading: false, keysGenerated: false})
let content = document.createElement("div");
let msg;
if (error.message.includes(constants.userDeniedTransactionPattern))
msg = `Error: ${constants.userDeniedTransactionPattern}`
else
msg = error.message
content.innerHTML = `<div>
Something went wrong!<br/><br/>
Please contact Master Of Ceremony<br/><br/>
${msg}
</div>`;
swal({
icon: 'error',
title: 'Error',
content: content
});
})
})
})
}
}
render() {
let loader = this.state.loading ? <Loading netId={this.state.web3Config.netId}/> : '';
let createKeyBtn = (<div className="create-keys">
<h1>Create keys from initial key</h1>
<h2>
In this application, you will create mining, payout and voting keys.
The app will make your initial key unusable after the process.
Please proceed with care, don't lose your keys and follow instructions.
</h2>
<div className="create-keys-button-container">
<button className="create-keys-button" onClick={this.onClick} disabled={this.state.isDisabledBtn}>Generate keys</button>
</div>
</div>)
let content;
if(this.state.keysGenerated){
content = <Keys mining={this.state.mining} voting={this.state.voting} payout={this.state.payout}/>
render() {
let loader = this.state.loading ? <Loading netId={this.state.web3Config.netId} /> : ''
let createKeyBtn = (
<div className="create-keys">
<h1>Create keys from initial key</h1>
<h2>
In this application, you will create mining, payout and voting keys. The app will make your initial key
unusable after the process. Please proceed with care, don't lose your keys and follow instructions.
</h2>
<div className="create-keys-button-container">
<button className="create-keys-button" onClick={this.onClick} disabled={this.state.isDisabledBtn}>
Generate keys
</button>
</div>
</div>
)
let content
if (this.state.keysGenerated) {
content = <Keys mining={this.state.mining} voting={this.state.voting} payout={this.state.payout} />
} else {
content = createKeyBtn
}
return (
<div className="App">
<Header netId={this.state.web3Config.netId}/>
<Header netId={this.state.web3Config.netId} />
{loader}
<section className="content">
{content}
</section>
<Footer netId={this.state.web3Config.netId}/>
<section className="content">{content}</section>
<Footer netId={this.state.web3Config.netId} />
</div>
);
)
}
}
export default App;
export default App

View File

@ -1,8 +1,8 @@
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import React from 'react'
import ReactDOM from 'react-dom'
import App from './App'
it('renders without crashing', () => {
const div = document.createElement('div');
ReactDOM.render(<App />, div);
});
const div = document.createElement('div')
ReactDOM.render(<App />, div)
})

View File

@ -1,24 +1,32 @@
import React from "react";
import moment from "moment";
import { constants } from "./constants";
import React from 'react'
import moment from 'moment'
import { constants } from './constants'
const Footer = ({netId}) => {
const footerClassName = netId in constants.NETWORKS && constants.NETWORKS[netId].TESTNET ? "sokol" : "";
const Footer = ({ netId }) => {
const footerClassName = netId in constants.NETWORKS && constants.NETWORKS[netId].TESTNET ? 'sokol' : ''
return (
<footer className={`footer ${footerClassName}`}>
<div className="container">
<p className="footer-rights">{moment().format('YYYY')} POA Network. All rights reserved.</p>
<a href="/poa-dapps-keys-generation" className="footer-logo"></a>
<div className="socials">
<a href="https://twitter.com/poanetwork" className="socials-i socials-i_twitter">Twitter</a>
<a href="https://poa.network" className="socials-i socials-i_oracles">POA Network</a>
<a href="https://t.me/oraclesnetwork" className="socials-i socials-i_telegram">Telegram</a>
<a href="https://github.com/poanetwork/" className="socials-i socials-i_github">GitHub</a>
<footer className={`footer ${footerClassName}`}>
<div className="container">
<p className="footer-rights">{moment().format('YYYY')} POA Network. All rights reserved.</p>
<a href="/poa-dapps-keys-generation" className="footer-logo" />
<div className="socials">
<a href="https://twitter.com/poanetwork" className="socials-i socials-i_twitter">
Twitter
</a>
<a href="https://poa.network" className="socials-i socials-i_oracles">
POA Network
</a>
<a href="https://t.me/oraclesnetwork" className="socials-i socials-i_telegram">
Telegram
</a>
<a href="https://github.com/poanetwork/" className="socials-i socials-i_github">
GitHub
</a>
</div>
</div>
</div>
</footer>
</footer>
)
}
export default Footer;
export default Footer

View File

@ -1,17 +1,17 @@
import React from 'react';
import { constants } from "./constants";
import React from 'react'
import { constants } from './constants'
let Header = ({netId}) => {
const thisIsTestnet = netId in constants.NETWORKS && constants.NETWORKS[netId].TESTNET;
const headerClassName = thisIsTestnet ? "sokol" : "";
const logoClassName = thisIsTestnet ? "header-logo-sokol" : "header-logo";
let Header = ({ netId }) => {
const thisIsTestnet = netId in constants.NETWORKS && constants.NETWORKS[netId].TESTNET
const headerClassName = thisIsTestnet ? 'sokol' : ''
const logoClassName = thisIsTestnet ? 'header-logo-sokol' : 'header-logo'
return (
<header className={`header ${headerClassName}`}>
<div className="container">
<a href="/poa-dapps-keys-generation" className={logoClassName}></a>
</div>
</header>
<header className={`header ${headerClassName}`}>
<div className="container">
<a href="/poa-dapps-keys-generation" className={logoClassName} />
</div>
</header>
)
}
export default Header;
export default Header

View File

@ -1,15 +1,15 @@
import React, { Component } from 'react';
import Tooltip from 'rc-tooltip';
import 'rc-tooltip/assets/bootstrap.css';
import React, { Component } from 'react'
import Tooltip from 'rc-tooltip'
import 'rc-tooltip/assets/bootstrap.css'
const encodeJson = (json) => {
const encoded = window.encodeURIComponent(JSON.stringify(json));
return `data:application/json;charset=utf-8,${encoded}`;
const encodeJson = json => {
const encoded = window.encodeURIComponent(JSON.stringify(json))
return `data:application/json;charset=utf-8,${encoded}`
}
export default class Keys extends Component{
export default class Keys extends Component {
constructor(props) {
super(props);
super(props)
this.onVisibleChange = this.onVisibleChange.bind(this)
this.onCopyBtnClick = this.onCopyBtnClick.bind(this)
this.state = {
@ -37,166 +37,260 @@ export default class Keys extends Component{
copyPayoutKey: {
visible: false,
text: 'Copy'
},
}
}
}
}
componentWillUpdate(nextProps, nextState) {
if (this.refs.miningKeyAddress) {
const Clipboard = require('clipboard');
const Clipboard = require('clipboard')
// this.clipboard = new Clipboard(this.refs.copyBtn);
new Clipboard(this.refs.miningKeyAddress);
new Clipboard(this.refs.miningKeyPass);
new Clipboard(this.refs.payoutKeyAddress);
new Clipboard(this.refs.payoutKeyPass);
new Clipboard(this.refs.votingKeyAddress);
new Clipboard(this.refs.votingKeyPass);
new Clipboard(this.refs.miningKeyAddress)
new Clipboard(this.refs.miningKeyPass)
new Clipboard(this.refs.payoutKeyAddress)
new Clipboard(this.refs.payoutKeyPass)
new Clipboard(this.refs.votingKeyAddress)
new Clipboard(this.refs.votingKeyPass)
}
}
onVisibleChange(id) {
console.log(id);
let copyBtns = this.state.copyBtns;
console.log(id)
let copyBtns = this.state.copyBtns
copyBtns[id].visible = !copyBtns[id].visible
copyBtns[id].text = 'Copy'
this.setState({
copyBtns
})
// const id = e.target.id;
}
onCopyBtnClick(e){
const id = e.target.id;
let copyBtns = this.state.copyBtns;
onCopyBtnClick(e) {
const id = e.target.id
let copyBtns = this.state.copyBtns
copyBtns[id].text = 'Copied!'
this.setState({
copyBtns
})
}
render(){
return ( <div className="container">
<div className="keys">
<div className="keys-i">
<p className="keys-title">Mining key</p>
<div className="keys-hash-container">
<p className="keys-hash" id="miningKey">0x{this.props.mining.jsonStore.address}</p>
<Tooltip
visible={this.state.copyBtns.copyMiningKey.visible}
animation="zoom"
trigger="hover"
onVisibleChange={() => { this.onVisibleChange('copyMiningKey')}}
placement="right"
overlay={this.state.copyBtns.copyMiningKey.text}
>
<span id="copyMiningKey" onClick={this.onCopyBtnClick} className="copy" ref="miningKeyAddress" data-clipboard-text={"0x"+this.props.mining.jsonStore.address} ></span>
</Tooltip>
render() {
return (
<div className="container">
<div className="keys">
<div className="keys-i">
<p className="keys-title">Mining key</p>
<div className="keys-hash-container">
<p className="keys-hash" id="miningKey">
0x
{this.props.mining.jsonStore.address}
</p>
<Tooltip
visible={this.state.copyBtns.copyMiningKey.visible}
animation="zoom"
trigger="hover"
onVisibleChange={() => {
this.onVisibleChange('copyMiningKey')
}}
placement="right"
overlay={this.state.copyBtns.copyMiningKey.text}
>
<span
id="copyMiningKey"
onClick={this.onCopyBtnClick}
className="copy"
ref="miningKeyAddress"
data-clipboard-text={'0x' + this.props.mining.jsonStore.address}
/>
</Tooltip>
</div>
<p className="keys-hash">
<label className="password-label">Password:</label>
<input
disabled={true}
defaultValue={this.props.mining.password}
type="password"
id="miningKeyPass"
className="pass"
/>
<Tooltip
visible={this.state.copyBtns.copyMiningPass.visible}
animation="zoom"
trigger="hover"
onVisibleChange={() => {
this.onVisibleChange('copyMiningPass')
}}
placement="right"
overlay={this.state.copyBtns.copyMiningPass.text}
>
<span
id="copyMiningPass"
onClick={this.onCopyBtnClick}
className="copy"
ref="miningKeyPass"
data-clipboard-text={this.props.mining.password}
/>
</Tooltip>
</p>
<p className="keys-description">
Download this key and use it in your mining node to validate blocks in the network. Mined coins will be
deposited to your payout account.
</p>
<div className="keys-footer">
<a
className="keys-download"
id="miningKeyDownload"
href={encodeJson(this.props.mining.jsonStore)}
download={`mining_${this.props.mining.jsonStore.address}.json`}
>
Download Mining Key
</a>
</div>
</div>
<div className="keys-i">
<p className="keys-title">Payout key</p>
<div className="keys-hash-container">
<p className="keys-hash" id="payoutKey">
0x
{this.props.payout.jsonStore.address}
</p>
<Tooltip
visible={this.state.copyBtns.copyPayoutKey.visible}
animation="zoom"
trigger="hover"
onVisibleChange={() => {
this.onVisibleChange('copyPayoutKey')
}}
placement="right"
overlay={this.state.copyBtns.copyPayoutKey.text}
>
<span
id="copyPayoutKey"
onClick={this.onCopyBtnClick}
className="copy"
ref="payoutKeyAddress"
data-clipboard-text={'0x' + this.props.payout.jsonStore.address}
/>
</Tooltip>
</div>
<p className="keys-hash">
<label className="password-label">Password:</label>
<input
type="password"
disabled={true}
id="payoutKeyPass"
className="pass"
defaultValue={this.props.payout.password}
/>
<Tooltip
visible={this.state.copyBtns.copyPayoutPass.visible}
animation="zoom"
trigger="hover"
onVisibleChange={() => {
this.onVisibleChange('copyPayoutPass')
}}
placement="right"
overlay={this.state.copyBtns.copyPayoutPass.text}
>
<span
id="copyPayoutPass"
onClick={this.onCopyBtnClick}
className="copy"
ref="payoutKeyPass"
data-clipboard-text={this.props.payout.password}
/>
</Tooltip>
</p>
<p className="keys-description">
Download this key and use it on your client node/wallet to spend earned coins.
</p>
<div className="keys-footer">
<a
className="keys-download"
id="payoutKeyDownload"
href={encodeJson(this.props.payout.jsonStore)}
download={`payout_${this.props.payout.jsonStore.address}.json`}
>
Download Payout Key
</a>
</div>
</div>
<div className="keys-i">
<p className="keys-title">Voting key</p>
<div className="keys-hash-container">
<p className="keys-hash" id="votingKey">
0x
{this.props.voting.jsonStore.address}
</p>
<Tooltip
visible={this.state.copyBtns.copyVotingKey.visible}
animation="zoom"
trigger="hover"
onVisibleChange={() => {
this.onVisibleChange('copyVotingKey')
}}
placement="right"
overlay={this.state.copyBtns.copyVotingKey.text}
>
<span
id="copyVotingKey"
onClick={this.onCopyBtnClick}
className="copy"
ref="votingKeyAddress"
data-clipboard-text={'0x' + this.props.voting.jsonStore.address}
/>
</Tooltip>
</div>
<p className="keys-hash">
<label className="password-label">Password:</label>
<input
type="password"
disabled={true}
id="votingKeyPass"
className="pass"
defaultValue={this.props.voting.password}
/>
<Tooltip
visible={this.state.copyBtns.copyVotingPass.visible}
animation="zoom"
trigger="hover"
onVisibleChange={() => {
this.onVisibleChange('copyVotingPass')
}}
placement="right"
overlay={this.state.copyBtns.copyVotingPass.text}
>
<span
id="copyVotingPass"
onClick={this.onCopyBtnClick}
className="copy"
ref="votingKeyPass"
data-clipboard-text={this.props.voting.password}
/>
</Tooltip>
</p>
<p className="keys-description">
Download this key and use it on your client node to vote for necessary ballots, such as adding or removing
miners from the network.
</p>
<div className="keys-footer">
<a
className="keys-download"
id="votingKeyDownload"
href={encodeJson(this.props.voting.jsonStore)}
download={`voting_${this.props.voting.jsonStore.address}.json`}
>
Download Voting Key
</a>
</div>
</div>
</div>
<p className="keys-hash">
<label className="password-label">Password:</label>
<input disabled={true} defaultValue={this.props.mining.password} type="password" id="miningKeyPass" className="pass"/>
<Tooltip
visible={this.state.copyBtns.copyMiningPass.visible}
animation="zoom"
trigger="hover"
onVisibleChange={() => { this.onVisibleChange('copyMiningPass')}}
placement="right"
overlay={this.state.copyBtns.copyMiningPass.text}
>
<span id="copyMiningPass" onClick={this.onCopyBtnClick} className="copy" ref="miningKeyPass" data-clipboard-text={this.props.mining.password} ></span>
</Tooltip>
</p>
<p className="keys-description">
Download this key and use it in your mining node to
validate blocks in the network. Mined coins will be
deposited to your payout account.
</p>
<div className="keys-footer">
<a className="keys-download" id="miningKeyDownload" href={encodeJson(this.props.mining.jsonStore)} download={`mining_${this.props.mining.jsonStore.address}.json`}>Download Mining Key</a>
<div className="keys-note">
<p className="keys-note-title">Important</p>
<p className="keys-note-description">
Do not close this tab until you download all keys and save passwords. Keep keys secure and protected. If you
lose your keys, you will need to get a new initial key using Voting DAPP.
</p>
</div>
</div>
<div className="keys-i">
<p className="keys-title">Payout key</p>
<div className="keys-hash-container">
<p className="keys-hash" id="payoutKey">0x{this.props.payout.jsonStore.address}</p>
<Tooltip
visible={this.state.copyBtns.copyPayoutKey.visible}
animation="zoom"
trigger="hover"
onVisibleChange={() => { this.onVisibleChange('copyPayoutKey')}}
placement="right"
overlay={this.state.copyBtns.copyPayoutKey.text}
>
<span id="copyPayoutKey" onClick={this.onCopyBtnClick} className="copy" ref="payoutKeyAddress" data-clipboard-text={"0x"+this.props.payout.jsonStore.address} ></span>
</Tooltip>
</div>
<p className="keys-hash">
<label className="password-label">Password:</label>
<input type="password" disabled={true} id="payoutKeyPass" className="pass" defaultValue={this.props.payout.password}/>
<Tooltip
visible={this.state.copyBtns.copyPayoutPass.visible}
animation="zoom"
trigger="hover"
onVisibleChange={() => { this.onVisibleChange('copyPayoutPass')}}
placement="right"
overlay={this.state.copyBtns.copyPayoutPass.text}
>
<span id="copyPayoutPass" onClick={this.onCopyBtnClick} className="copy" ref="payoutKeyPass" data-clipboard-text={this.props.payout.password} ></span>
</Tooltip>
</p>
<p className="keys-description">
Download this key and use it on your client
node/wallet to spend earned coins.
</p>
<div className="keys-footer">
<a className="keys-download" id="payoutKeyDownload" href={encodeJson(this.props.payout.jsonStore)} download={`payout_${this.props.payout.jsonStore.address}.json`}>Download Payout Key</a>
</div>
</div>
<div className="keys-i">
<p className="keys-title">Voting key</p>
<div className="keys-hash-container">
<p className="keys-hash" id="votingKey">0x{this.props.voting.jsonStore.address}</p>
<Tooltip
visible={this.state.copyBtns.copyVotingKey.visible}
animation="zoom"
trigger="hover"
onVisibleChange={() => { this.onVisibleChange('copyVotingKey')}}
placement="right"
overlay={this.state.copyBtns.copyVotingKey.text}
>
<span id="copyVotingKey" onClick={this.onCopyBtnClick} className="copy" ref="votingKeyAddress" data-clipboard-text={"0x"+this.props.voting.jsonStore.address} ></span>
</Tooltip>
</div>
<p className="keys-hash">
<label className="password-label">Password:</label>
<input type="password" disabled={true} id="votingKeyPass" className="pass" defaultValue={this.props.voting.password}/>
<Tooltip
visible={this.state.copyBtns.copyVotingPass.visible}
animation="zoom"
trigger="hover"
onVisibleChange={() => { this.onVisibleChange('copyVotingPass')}}
placement="right"
overlay={this.state.copyBtns.copyVotingPass.text}
>
<span id="copyVotingPass" onClick={this.onCopyBtnClick} className="copy" ref="votingKeyPass" data-clipboard-text={this.props.voting.password} ></span>
</Tooltip>
</p>
<p className="keys-description">
Download this key and use it on your client node to
vote for necessary ballots, such as adding or
removing miners from the network.
</p>
<div className="keys-footer">
<a className="keys-download" id="votingKeyDownload" href={encodeJson(this.props.voting.jsonStore)} download={`voting_${this.props.voting.jsonStore.address}.json`}>Download Voting Key</a>
</div>
</div>
</div>
<div className="keys-note">
<p className="keys-note-title">Important</p>
<p className="keys-note-description">
Do not close this tab until you download all keys and save passwords. Keep keys secure and protected. If you lose your keys, you will need to get a new initial key using Voting DAPP.
</p>
</div>
</div>
)
)
}
}

View File

@ -1,10 +1,10 @@
import React from 'react';
import { constants } from "./constants";
import React from 'react'
import { constants } from './constants'
const styles = (netId) => {
const styles = netId => {
const core = {
backgroundColor: 'rgba(35, 29, 115, 0.8)'
};
}
const sokol = {
backgroundColor: 'rgba(47, 109, 99, 0.8)'
}
@ -15,16 +15,16 @@ const styles = (netId) => {
return core
}
const Loading = ({netId}) => (
const Loading = ({ netId }) => (
<div className="loading-container" style={styles(netId)}>
<div className="loading">
<div className="loading-i"></div>
<div className="loading-i"></div>
<div className="loading-i"></div>
<div className="loading-i"></div>
<div className="loading-i"></div>
<div className="loading-i"></div>
<div className="loading-i" />
<div className="loading-i" />
<div className="loading-i" />
<div className="loading-i" />
<div className="loading-i" />
<div className="loading-i" />
</div>
</div>
)
export default Loading;
export default Loading

View File

@ -1,16 +1,16 @@
import keythereum from 'keythereum';
import passwordGenerator from 'password-generator';
import keythereum from 'keythereum'
import passwordGenerator from 'password-generator'
export default function generateAddress(cb) {
return new Promise((resolve, reject) => {
var params = { keyBytes: 32, ivBytes: 16 };
keythereum.create(params, function (dk) {
var options = {};
var password = passwordGenerator(20, false);
keythereum.dump(password, dk.privateKey, dk.salt, dk.iv, options, function (jsonStore) {
resolve({jsonStore, password});
});
});
var params = { keyBytes: 32, ivBytes: 16 }
keythereum.create(params, function(dk) {
var options = {}
var password = passwordGenerator(20, false)
keythereum.dump(password, dk.privateKey, dk.salt, dk.iv, options, function(jsonStore) {
resolve({ jsonStore, password })
})
})
})
}
}

View File

@ -1,20 +1,22 @@
import { constants } from "./constants";
import helpers from "./helpers";
import { constants } from './constants'
import helpers from './helpers'
//const local = {
// "KEYS_MANAGER_ADDRESS": "0x3ef32bb244016ad9af8c8f45398511e7e551b581"
// "KEYS_MANAGER_ADDRESS": "0x3ef32bb244016ad9af8c8f45398511e7e551b581"
//}
export default (web3Config) => {
const branch = constants.NETWORKS[web3Config.netId].BRANCH;
return new Promise((resolve, reject) => {
fetch(helpers.addressesURL(branch)).then((response) => {
response.json().then((json) => {
resolve({addresses: json, web3Config});
})
}).catch(function(err) {
let addr = helpers.addressesURL(branch);
helpers.wrongRepoAlert(addr);
reject(err);
});
})
export default web3Config => {
const branch = constants.NETWORKS[web3Config.netId].BRANCH
return new Promise((resolve, reject) => {
fetch(helpers.addressesURL(branch))
.then(response => {
response.json().then(json => {
resolve({ addresses: json, web3Config })
})
})
.catch(function(err) {
let addr = helpers.addressesURL(branch)
helpers.wrongRepoAlert(addr)
reject(err)
})
})
}

View File

@ -1,11 +1,11 @@
let constants = {};
constants.organization = 'poanetwork';
constants.repoName = 'poa-chain-spec';
constants.addressesSourceFile = 'contracts.json';
let constants = {}
constants.organization = 'poanetwork'
constants.repoName = 'poa-chain-spec'
constants.addressesSourceFile = 'contracts.json'
constants.ABIsSources = {
'KeysManager': 'KeysManager.abi.json'
};
constants.userDeniedTransactionPattern = 'User denied transaction';
KeysManager: 'KeysManager.abi.json'
}
constants.userDeniedTransactionPattern = 'User denied transaction'
constants.NETWORKS = {
'77': {
@ -28,8 +28,8 @@ constants.NETWORKS = {
BRANCH: 'dai',
TESTNET: false
}
};
}
module.exports = {
constants
}
}

View File

@ -1,74 +1,83 @@
import Web3 from "web3";
import { constants } from "./constants";
import Web3 from 'web3'
import { constants } from './constants'
const errorMsgNoMetamaskAccount = `You haven't chosen any account in MetaMask.
Please choose your initial key in MetaMask and reload the page.
Check POA Network <a href='https://github.com/poanetwork/wiki' target='blank'>wiki</a> for more info.`;
Check POA Network <a href='https://github.com/poanetwork/wiki' target='blank'>wiki</a> for more info.`
const errorMsgDeniedAccess = "You have denied access to your accounts";
const errorMsgDeniedAccess = 'You have denied access to your accounts'
function generateElement(msg){
let errorNode = document.createElement("div");
function generateElement(msg) {
let errorNode = document.createElement('div')
errorNode.innerHTML = `<div style="line-height: 1.6;">
${msg}
</div>`;
return errorNode;
</div>`
return errorNode
}
let getWeb3 = () => {
return new Promise(function (resolve, reject) {
return new Promise(function(resolve, reject) {
// Wait for loading completion to avoid race conditions with web3 injection timing.
window.addEventListener("load", async function () {
let web3;
window.addEventListener('load', async function() {
let web3
// Checking if Web3 has been injected by the browser (Mist/MetaMask)
if (window.ethereum) {
web3 = new Web3(window.ethereum);
console.log("Injected web3 detected.");
web3 = new Web3(window.ethereum)
console.log('Injected web3 detected.')
try {
await window.ethereum.enable();
await window.ethereum.enable()
} catch (e) {
reject({msg: errorMsgDeniedAccess, node: generateElement(errorMsgDeniedAccess)});
return;
reject({
msg: errorMsgDeniedAccess,
node: generateElement(errorMsgDeniedAccess)
})
return
}
} else if (window.web3) {
web3 = new Web3(window.web3.currentProvider);
console.log("Injected web3 detected.");
web3 = new Web3(window.web3.currentProvider)
console.log('Injected web3 detected.')
} else {
console.error("Metamask not found");
reject({msg: errorMsgNoMetamaskAccount, node: generateElement(errorMsgNoMetamaskAccount)});
return;
console.error('Metamask not found')
reject({
msg: errorMsgNoMetamaskAccount,
node: generateElement(errorMsgNoMetamaskAccount)
})
return
}
const netId = await web3.eth.net.getId();
console.log("netId", netId);
const netId = await web3.eth.net.getId()
console.log('netId', netId)
let netIdName;
let errorMsg = null;
let netIdName
let errorMsg = null
if (netId in constants.NETWORKS) {
netIdName = constants.NETWORKS[netId].NAME;
console.log(`This is ${netIdName}`);
netIdName = constants.NETWORKS[netId].NAME
console.log(`This is ${netIdName}`)
} else {
netIdName = "ERROR";
netIdName = 'ERROR'
errorMsg = `You aren't connected to POA Network.
Please switch on Metamask and refresh the page.
Check POA Network <a href='https://github.com/poanetwork/wiki' target='blank'>wiki</a> for more info.
<b>Current Network ID</b> is <i>${netId}</i>`;
console.log("This is an unknown network.");
<b>Current Network ID</b> is <i>${netId}</i>`
console.log('This is an unknown network.')
}
document.title = `${netIdName} - DApp Keys Generation`;
document.title = `${netIdName} - DApp Keys Generation`
if (errorMsg !== null) {
reject({msg: errorMsg, node: generateElement(errorMsg)});
return;
reject({ msg: errorMsg, node: generateElement(errorMsg) })
return
}
const accounts = await web3.eth.getAccounts();
const defaultAccount = accounts[0] || null;
const accounts = await web3.eth.getAccounts()
const defaultAccount = accounts[0] || null
if (defaultAccount === null) {
reject({msg: errorMsgNoMetamaskAccount, node: generateElement(errorMsgNoMetamaskAccount)});
return;
reject({
msg: errorMsgNoMetamaskAccount,
node: generateElement(errorMsgNoMetamaskAccount)
})
return
}
resolve({
@ -76,7 +85,7 @@ let getWeb3 = () => {
netIdName,
netId,
defaultAccount
});
})
})
})
}

View File

@ -1,50 +1,54 @@
import { constants } from "./constants";
import { messages } from "./messages";
import swal from 'sweetalert';
import { constants } from './constants'
import { messages } from './messages'
import swal from 'sweetalert'
var toAscii = function(hex) {
var str = '',
i = 0,
l = hex.length;
l = hex.length
if (hex.substring(0, 2) === '0x') {
i = 2;
i = 2
}
for (; i < l; i+=2) {
var code = parseInt(hex.substr(i, 2), 16);
if (code === 0) continue; // this is added
str += String.fromCharCode(code);
for (; i < l; i += 2) {
var code = parseInt(hex.substr(i, 2), 16)
if (code === 0) continue // this is added
str += String.fromCharCode(code)
}
return str;
};
return str
}
function addressesURL(branch) {
const URL = `https://raw.githubusercontent.com/${constants.organization}/${constants.repoName}/${branch}/${constants.addressesSourceFile}`;
return URL;
const URL = `https://raw.githubusercontent.com/${constants.organization}/${constants.repoName}/${branch}/${
constants.addressesSourceFile
}`
return URL
}
function ABIURL(branch, contract) {
const URL = `https://raw.githubusercontent.com/${constants.organization}/${constants.repoName}/${branch}/abis/${constants.ABIsSources[contract]}`;
return URL;
const URL = `https://raw.githubusercontent.com/${constants.organization}/${constants.repoName}/${branch}/abis/${
constants.ABIsSources[contract]
}`
return URL
}
function getABI(branch, contract) {
let addr = ABIURL(branch, contract);
let addr = ABIURL(branch, contract)
return fetch(addr).then(function(response) {
return response.json();
return response.json()
})
}
function wrongRepoAlert(addr) {
var content = document.createElement("div");
var content = document.createElement('div')
content.innerHTML = `<div>
Something went wrong!<br/><br/>
${messages.wrongRepo(addr)}
</div>`;
</div>`
swal({
icon: 'error',
title: 'Error',
content: content
});
})
}
let helpers = {

View File

@ -1,9 +1,9 @@
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import registerServiceWorker from './registerServiceWorker';
window.addEventListener("beforeunload", function (event) {
event.returnValue = "Are you sure?";
});
ReactDOM.render(<App generateKeysIsDisabled={true} />, document.getElementById('root'));
registerServiceWorker();
import React from 'react'
import ReactDOM from 'react-dom'
import App from './App'
import registerServiceWorker from './registerServiceWorker'
window.addEventListener('beforeunload', function(event) {
event.returnValue = 'Are you sure?'
})
ReactDOM.render(<App generateKeysIsDisabled={true} />, document.getElementById('root'))
registerServiceWorker()

View File

@ -1,21 +1,21 @@
import addressGenerator from './addressGenerator';
import helpers from "./helpers";
import { constants } from "./constants";
import addressGenerator from './addressGenerator'
import helpers from './helpers'
import { constants } from './constants'
export default class KeysManager {
async init({web3, netId, addresses}){
const {KEYS_MANAGER_ADDRESS} = addresses;
console.log('Keys Manager ', KEYS_MANAGER_ADDRESS);
async init({ web3, netId, addresses }) {
const { KEYS_MANAGER_ADDRESS } = addresses
console.log('Keys Manager ', KEYS_MANAGER_ADDRESS)
const KeysManagerAbi = await helpers.getABI(constants.NETWORKS[netId].BRANCH, 'KeysManager')
this.instance = new web3.eth.Contract(KeysManagerAbi, KEYS_MANAGER_ADDRESS);
this.instance = new web3.eth.Contract(KeysManagerAbi, KEYS_MANAGER_ADDRESS)
const networkName = constants.NETWORKS[netId].NAME.toLowerCase();
const networkName = constants.NETWORKS[netId].NAME.toLowerCase()
if (networkName === 'dai-test' || networkName === 'dai') {
this.gasPrice = web3.utils.toWei('0', 'gwei');
this.gasPrice = web3.utils.toWei('0', 'gwei')
} else {
this.gasPrice = web3.utils.toWei('2', 'gwei');
this.gasPrice = web3.utils.toWei('2', 'gwei')
}
}
@ -28,22 +28,25 @@ export default class KeysManager {
} else {
getInitialKeyStatus = methods.initialKeys
}
getInitialKeyStatus(initialKey).call().then(function(result){
resolve(result);
}).catch(function(e) {
reject(false);
});
getInitialKeyStatus(initialKey)
.call()
.then(function(result) {
resolve(result)
})
.catch(function(e) {
reject(false)
})
})
}
async generateKeys() {
return await addressGenerator();
return await addressGenerator()
}
createKeys({mining, voting, payout, sender}) {
createKeys({ mining, voting, payout, sender }) {
return this.instance.methods.createKeys(mining, voting, payout).send({
from: sender,
gasPrice: this.gasPrice
});
})
}
}
}

View File

@ -1,7 +1,7 @@
let messages = {};
let messages = {}
messages.wrongRepo = function(repo) {
return `There is no contracts.json in configured repo ${repo}`;
};
return `There is no contracts.json in configured repo ${repo}`
}
module.exports = {
messages
};
}

View File

@ -13,33 +13,31 @@ const isLocalhost = Boolean(
// [::1] is the IPv6 localhost address.
window.location.hostname === '[::1]' ||
// 127.0.0.1/8 is considered localhost for IPv4.
window.location.hostname.match(
/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
)
);
window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)
)
export default function register() {
if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
// The URL constructor is available in all browsers that support SW.
const publicUrl = new URL(process.env.PUBLIC_URL, window.location);
const publicUrl = new URL(process.env.PUBLIC_URL, window.location)
if (publicUrl.origin !== window.location.origin) {
// Our service worker won't work if PUBLIC_URL is on a different origin
// from what our page is served on. This might happen if a CDN is used to
// serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374
return;
return
}
window.addEventListener('load', () => {
const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`
if (isLocalhost) {
// This is running on localhost. Lets check if a service worker still exists or not.
checkValidServiceWorker(swUrl);
checkValidServiceWorker(swUrl)
} else {
// Is not local host. Just register service worker
registerValidSW(swUrl);
registerValidSW(swUrl)
}
});
})
}
}
@ -48,7 +46,7 @@ function registerValidSW(swUrl) {
.register(swUrl)
.then(registration => {
registration.onupdatefound = () => {
const installingWorker = registration.installing;
const installingWorker = registration.installing
installingWorker.onstatechange = () => {
if (installingWorker.state === 'installed') {
if (navigator.serviceWorker.controller) {
@ -56,20 +54,20 @@ function registerValidSW(swUrl) {
// the fresh content will have been added to the cache.
// It's the perfect time to display a "New content is
// available; please refresh." message in your web app.
console.log('New content is available; please refresh.');
console.log('New content is available; please refresh.')
} else {
// At this point, everything has been precached.
// It's the perfect time to display a
// "Content is cached for offline use." message.
console.log('Content is cached for offline use.');
console.log('Content is cached for offline use.')
}
}
};
};
}
}
})
.catch(error => {
console.error('Error during service worker registration:', error);
});
console.error('Error during service worker registration:', error)
})
}
function checkValidServiceWorker(swUrl) {
@ -77,32 +75,27 @@ function checkValidServiceWorker(swUrl) {
fetch(swUrl)
.then(response => {
// Ensure service worker exists, and that we really are getting a JS file.
if (
response.status === 404 ||
response.headers.get('content-type').indexOf('javascript') === -1
) {
if (response.status === 404 || response.headers.get('content-type').indexOf('javascript') === -1) {
// No service worker found. Probably a different app. Reload the page.
navigator.serviceWorker.ready.then(registration => {
registration.unregister().then(() => {
window.location.reload();
});
});
window.location.reload()
})
})
} else {
// Service worker found. Proceed as normal.
registerValidSW(swUrl);
registerValidSW(swUrl)
}
})
.catch(() => {
console.log(
'No internet connection found. App is running in offline mode.'
);
});
console.log('No internet connection found. App is running in offline mode.')
})
}
export function unregister() {
if ('serviceWorker' in navigator) {
navigator.serviceWorker.ready.then(registration => {
registration.unregister();
});
registration.unregister()
})
}
}