diff --git a/.eslintrc.json b/.eslintrc.json index 91bad378..4636c068 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -5,12 +5,14 @@ "jest/globals": true }, "parser": "babel-eslint", - "extends": ["airbnb"], + "extends": [ + "airbnb", + "plugin:jsdoc/recommended" + ], "globals": { "Atomics": "readonly", "SharedArrayBuffer": "readonly" }, - "parserOptions": { "ecmaFeatures": { "jsx": true @@ -18,7 +20,11 @@ "ecmaVersion": 2018, "sourceType": "module" }, - "plugins": ["react", "jest"], + "plugins": [ + "react", + "jsdoc", + "jest" + ], "rules": { "react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }], "no-underscore-dangle":"off", diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..486a2325 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.zip filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore index a0ab4d28..68355866 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,13 @@ node_modules/ docs/ build/ -dist/ +dist/linux-unpacked/ +dist/builder-effective-config.yaml +dist/zero_one-app_1.0.0_amd64.deb +dist/config.json +dist/contracts/ +dist/wallets/ +dist/data/ +dist/win-unpacked/ coverage/ +src/data/ diff --git a/dist/linux.zip b/dist/linux.zip new file mode 100644 index 00000000..a4a7bbd5 --- /dev/null +++ b/dist/linux.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4d30c428aa3bedd28e1d6247f2acd8814592f51f31dc94842d15bc2086debaca +size 109840162 diff --git a/dist/mac.zip b/dist/mac.zip new file mode 100644 index 00000000..3e1445a5 --- /dev/null +++ b/dist/mac.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3bed43c90a1892552c5f0107ea51b19e4464fba90aadb8042cb209299191fd1 +size 107905159 diff --git a/dist/win.zip b/dist/win.zip new file mode 100644 index 00000000..2628c3ca --- /dev/null +++ b/dist/win.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07fa61020ed1a61fe721045a684d81c5a07c3f0707f2e836be14904245022562 +size 119072240 diff --git a/package-lock.json b/package-lock.json index 5b262551..1840793e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,35 +14,146 @@ "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, "requires": { "@babel/highlight": "^7.0.0" } }, "@babel/core": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.2.tgz", - "integrity": "sha512-eeD7VEZKfhK1KUXGiyPFettgF3m513f8FoBSWiQ1xTvl1RAopLs42Wp9+Ze911I6H0N9lNqJMDgoZT7gHsipeQ==", - "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.2", - "@babel/helpers": "^7.7.0", - "@babel/parser": "^7.7.2", - "@babel/template": "^7.7.0", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.7.2", + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.7.tgz", + "integrity": "sha512-rBlqF3Yko9cynC5CCFy6+K/w2N+Sq/ff2BPy+Krp7rHlABIr5epbA7OxVeKoMHB39LZOp1UY5SuLjy6uWi35yA==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.7", + "@babel/helpers": "^7.8.4", + "@babel/parser": "^7.8.7", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.7", "convert-source-map": "^1.7.0", "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", "json5": "^2.1.0", "lodash": "^4.17.13", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/generator": { + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.8.tgz", + "integrity": "sha512-HKyUVu69cZoclptr8t8U5b6sx6zoWjh8jiUhnuj3MpZuKT2dJ8zPTuiy31luq32swhI0SpwItCIlU8XW7BZeJg==", + "requires": { + "@babel/types": "^7.8.7", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helpers": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", + "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", + "requires": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.4", + "@babel/types": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.8.tgz", + "integrity": "sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA==" + }, + "@babel/template": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/traverse": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz", + "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.6", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz", + "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/generator": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.2.tgz", "integrity": "sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==", + "dev": true, "requires": { "@babel/types": "^7.7.2", "jsesc": "^2.5.1", @@ -138,6 +249,7 @@ "version": "7.7.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz", "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==", + "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.7.0", "@babel/template": "^7.7.0", @@ -148,6 +260,7 @@ "version": "7.7.0", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz", "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==", + "dev": true, "requires": { "@babel/types": "^7.7.0" } @@ -255,6 +368,7 @@ "version": "7.7.0", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz", "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==", + "dev": true, "requires": { "@babel/types": "^7.7.0" } @@ -275,6 +389,7 @@ "version": "7.7.0", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.7.0.tgz", "integrity": "sha512-VnNwL4YOhbejHb7x/b5F39Zdg5vIQpUUNzJwx0ww1EcVRt41bbGRZWhAURrfY32T5zTT3qwNOQFWpn+P0i0a2g==", + "dev": true, "requires": { "@babel/template": "^7.7.0", "@babel/traverse": "^7.7.0", @@ -285,6 +400,7 @@ "version": "7.5.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, "requires": { "chalk": "^2.0.0", "esutils": "^2.0.2", @@ -294,7 +410,8 @@ "@babel/parser": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.3.tgz", - "integrity": "sha512-bqv+iCo9i+uLVbI0ILzKkvMorqxouI+GbV13ivcARXn9NNEabi2IEz912IgNpT/60BNXac5dgcfjb94NjsF33A==" + "integrity": "sha512-bqv+iCo9i+uLVbI0ILzKkvMorqxouI+GbV13ivcARXn9NNEabi2IEz912IgNpT/60BNXac5dgcfjb94NjsF33A==", + "dev": true }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.7.0", @@ -978,6 +1095,7 @@ "version": "7.7.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz", "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==", + "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "@babel/parser": "^7.7.0", @@ -988,6 +1106,7 @@ "version": "7.7.2", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz", "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==", + "dev": true, "requires": { "@babel/code-frame": "^7.5.5", "@babel/generator": "^7.7.2", @@ -1156,9 +1275,9 @@ "dev": true }, "@hapi/hoek": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.0.tgz", - "integrity": "sha512-7XYT10CZfPsH7j9F1Jmg1+d0ezOux2oM2GfArAzLwWe4mE2Dr3hVjsAL6+TFY49RRJlCdJDMw3nJsLFroTc8Kw==", + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", "dev": true }, "@hapi/joi": { @@ -2164,6 +2283,14 @@ "@types/babel-types": "*" } }, + "@types/bignumber.js": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/bignumber.js/-/bignumber.js-5.0.0.tgz", + "integrity": "sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==", + "requires": { + "bignumber.js": "*" + } + }, "@types/bn.js": { "version": "4.11.5", "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.5.tgz", @@ -2457,6 +2584,54 @@ } } }, + "@web3-js/scrypt-shim": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@web3-js/scrypt-shim/-/scrypt-shim-0.1.0.tgz", + "integrity": "sha512-ZtZeWCc/s0nMcdx/+rZwY1EcuRdemOK9ag21ty9UsHkFxsNb/AaoucUz0iPuyGe0Ku+PFuRmWZG7Z7462p9xPw==", + "requires": { + "scryptsy": "^2.1.0", + "semver": "^6.3.0" + }, + "dependencies": { + "scryptsy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz", + "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@web3-js/websocket": { + "version": "1.0.30", + "resolved": "https://registry.npmjs.org/@web3-js/websocket/-/websocket-1.0.30.tgz", + "integrity": "sha512-fDwrD47MiDrzcJdSeTLF75aCcxVVt8B1N74rA+vh2XCAvFy4tEWJjtnUtj2QG7/zlQ6g9cQ88bZFBxwd9/FmtA==", + "requires": { + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "nan": "^2.14.0", + "typedarray-to-buffer": "^3.1.5", + "yaeti": "^0.0.6" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "@webassemblyjs/ast": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", @@ -2637,6 +2812,14 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, + "abstract-leveldown": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", + "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", + "requires": { + "xtend": "~4.0.0" + } + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -2647,9 +2830,9 @@ } }, "acorn": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", - "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==" + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" }, "acorn-globals": { "version": "3.1.0", @@ -2900,6 +3083,11 @@ } } }, + "app-module-path": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", + "integrity": "sha1-ZBqlXft9am8KgUHEucCqULbCTdU=" + }, "app-root-dir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz", @@ -3169,6 +3357,14 @@ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" }, + "async-eventemitter": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", + "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", + "requires": { + "async": "^2.4.0" + } + }, "async-exit-hook": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", @@ -3376,6 +3572,17 @@ "loader-utils": "^1.0.2", "mkdirp": "^0.5.1", "pify": "^4.0.1" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } } }, "babel-plugin-add-react-displayname": { @@ -4067,6 +4274,11 @@ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" }, + "bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" + }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", @@ -4322,6 +4534,11 @@ "resolved": "https://registry.npmjs.org/browser-solc/-/browser-solc-1.0.0.tgz", "integrity": "sha512-0qiaQc65DqOukrNCew7Olg3EUXWOh54h7nUBeYyebhxwl4n5fXT/D5M3AllgKJ1msVOV9L5XIp2uAZrGSRF9iw==" }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -4365,15 +4582,6 @@ "randombytes": "^2.0.1" } }, - "browserify-sha3": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.4.tgz", - "integrity": "sha1-CGxHuMgjFsnUcCLCYYWVRXbdjiY=", - "requires": { - "js-sha3": "^0.6.1", - "safe-buffer": "^5.1.1" - } - }, "browserify-sign": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", @@ -4549,6 +4757,16 @@ "ssri": "^6.0.1", "unique-filename": "^1.1.1", "y18n": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "requires": { + "minimist": "^1.2.5" + } + } } }, "cache-base": { @@ -4747,6 +4965,14 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "checkpoint-store": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/checkpoint-store/-/checkpoint-store-1.1.0.tgz", + "integrity": "sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY=", + "requires": { + "functional-red-black-tree": "^1.0.1" + } + }, "cheerio": { "version": "1.0.0-rc.3", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", @@ -4850,8 +5076,7 @@ "classnames": { "version": "2.2.6", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==", - "dev": true + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" }, "clean-css": { "version": "4.2.1", @@ -4985,6 +5210,11 @@ } } }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, "clone-deep": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", @@ -5112,6 +5342,11 @@ "integrity": "sha512-Jrx3xsP4pPv4AwJUDWY9wOXGtwPXARej6Xd99h4TUGotmf8APuquKMpK+dnD3UgyxK7OEWaisjZz+3b5jtL6xQ==", "dev": true }, + "command-exists": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.8.tgz", + "integrity": "sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw==" + }, "commander": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", @@ -5120,6 +5355,12 @@ "graceful-readlink": ">= 1.0.0" } }, + "comment-parser": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.7.0.tgz", + "integrity": "sha512-m0SGP0RFO4P3hIBlIor4sBFPe5Y4HUeGgo/UZK/1Zdea5eUiqxroQ3lFqBDDSfWo9z9Q6LLnt2u0JqwacVEd/A==", + "dev": true + }, "common-tags": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", @@ -5386,6 +5627,16 @@ "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "requires": { + "minimist": "^1.2.5" + } + } } }, "copy-descriptor": { @@ -5397,15 +5648,14 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.2.0.tgz", "integrity": "sha512-eOZERzvCmxS8HWzugj4Uxl8OJxa7T2k1Gi0X5qavwydHIfuSHq2dTD09LOg/XyGq4Zpb5IsR/2OJ5lbOegz78w==", - "dev": true, "requires": { "toggle-selection": "^1.0.6" } }, "copy-webpack-plugin": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.0.5.tgz", - "integrity": "sha512-7N68eIoQTyudAuxkfPT7HzGoQ+TsmArN/I3HFwG+lVE3FNzqvZKIiaxtYh4o3BIznioxUvx9j26+Rtsc9htQUQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz", + "integrity": "sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==", "dev": true, "requires": { "cacache": "^12.0.3", @@ -5418,7 +5668,7 @@ "normalize-path": "^3.0.0", "p-limit": "^2.2.1", "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.0", + "serialize-javascript": "^2.1.2", "webpack-log": "^2.0.0" }, "dependencies": { @@ -5443,9 +5693,9 @@ "dev": true }, "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -5463,12 +5713,6 @@ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, - "serialize-javascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.0.tgz", - "integrity": "sha512-a/mxFfU00QT88umAJQsNWOnUKckhNCqOl028N48e7wFmo2/EHpTo9Wso+iJJCMrQnmFvcjto5RJdAHEvVhcyUQ==", - "dev": true - }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", @@ -5676,6 +5920,11 @@ "randomfill": "^1.0.3" } }, + "crypto-js": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", + "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" + }, "crypto-random-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", @@ -5852,6 +6101,67 @@ "type": "^1.0.1" } }, + "d3-array": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.4.0.tgz", + "integrity": "sha512-KQ41bAF2BMakf/HdKT865ALd4cgND6VcIztVQZUTt0+BH3RWy6ZYnHghVXf6NFjt2ritLr8H1T8LreAAlfiNcw==" + }, + "d3-color": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.0.tgz", + "integrity": "sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg==" + }, + "d3-format": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.2.tgz", + "integrity": "sha512-gco1Ih54PgMsyIXgttLxEhNy/mXxq8+rLnCb5shQk+P5TsiySrwWU5gpB4zen626J4LIwBxHvDChyA8qDm57ww==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "d3-scale": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.1.tgz", + "integrity": "sha512-huz5byJO/6MPpz6Q8d4lg7GgSpTjIZW/l+1MQkzKfu2u8P6hjaXaStOpmyrD6ymKoW87d2QVFCKvSjLwjzx/rA==", + "requires": { + "d3-array": "1.2.0 - 2", + "d3-format": "1", + "d3-interpolate": "^1.2.0", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "requires": { + "d3-path": "1" + } + }, + "d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "d3-time-format": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.2.2.tgz", + "integrity": "sha512-pweL2Ri2wqMY+wlW/wpkl8T3CUzKAha8S9nmiQlMABab8r5MJN0PD1V4YyRNVaKQfeh4Z0+VO70TLw6ESVOYzw==", + "requires": { + "d3-time": "1" + } + }, "damerau-levenshtein": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz", @@ -5930,6 +6240,11 @@ } } }, + "decimal.js-light": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.0.tgz", + "integrity": "sha512-b3VJCbd2hwUpeRGG3Toob+CRo8W22xplipNhP3tN7TSVB/cyMX71P1vM2Xjc9H74uV6dS2hDDmo/rHq8L87Upg==" + }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -6081,6 +6396,14 @@ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.0.tgz", "integrity": "sha512-WE2sZoctWm/v4smfCAdjYbrfS55JiMRdlY9ZubFhsYbteCK9+BvAx4YV7nPjYM6ZnX5BcoVKwfmyx9sIFTgQMQ==" }, + "deferred-leveldown": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", + "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", + "requires": { + "abstract-leveldown": "~2.6.0" + } + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -6126,6 +6449,11 @@ } } }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, "del": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", @@ -6242,6 +6570,11 @@ } } }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + }, "diff-match-patch": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.4.tgz", @@ -6340,6 +6673,14 @@ "utila": "~0.4" } }, + "dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "requires": { + "@babel/runtime": "^7.1.2" + } + }, "dom-serializer": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", @@ -6440,6 +6781,14 @@ "dotenv-defaults": "^1.0.2" } }, + "dotignore": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", + "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", + "requires": { + "minimatch": "^3.0.4" + } + }, "drbg.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", @@ -6844,7 +7193,6 @@ "version": "0.1.12", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "dev": true, "requires": { "iconv-lite": "~0.4.13" } @@ -7006,6 +7354,7 @@ "version": "1.16.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz", "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==", + "dev": true, "requires": { "es-to-primitive": "^1.2.0", "function-bind": "^1.1.1", @@ -7030,12 +7379,12 @@ } }, "es5-ext": { - "version": "0.10.52", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.52.tgz", - "integrity": "sha512-bWCbE9fbpYQY4CU6hJbJ1vSz70EClMlDgJ7BmwI+zEJhxrwjesZRPglGJlsZhu0334U3hI+gaspwksH9IGD6ag==", + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", "requires": { "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.2", + "es6-symbol": "~3.1.3", "next-tick": "~1.0.0" } }, @@ -7257,6 +7606,15 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, + "mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, "mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", @@ -7551,6 +7909,30 @@ "@typescript-eslint/experimental-utils": "^2.5.0" } }, + "eslint-plugin-jsdoc": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-18.1.3.tgz", + "integrity": "sha512-QmdxsDzGG9eb20VD3V8hw4huehTnU6x1/we9tN56p8MOkJNEiHDFW59stcS2/sk+BSnsJy61qZ+6wCPya8B45w==", + "dev": true, + "requires": { + "comment-parser": "^0.7.0", + "debug": "^4.1.1", + "jsdoctypeparser": "^6.0.0", + "lodash": "^4.17.15", + "object.entries-ponyfill": "^1.0.1", + "regextras": "^0.6.1", + "semver": "^6.3.0", + "spdx-expression-parse": "^3.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, "eslint-plugin-jsx-a11y": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", @@ -7637,9 +8019,9 @@ }, "dependencies": { "acorn": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", - "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", "dev": true } } @@ -7698,13 +8080,12 @@ } }, "eth-lib": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.27.tgz", - "integrity": "sha512-B8czsfkJYzn2UIEMwjc7Mbj+Cy72V+/OXH/tb44LV8jhrjizQJJ325xMOMyk3+ETa6r6oi0jsUY14+om8mQMWA==", + "version": "0.1.29", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", + "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", "requires": { "bn.js": "^4.11.6", "elliptic": "^6.4.0", - "keccakjs": "^0.2.1", "nano-json-stream-parser": "^0.1.2", "servify": "^0.1.12", "ws": "^3.0.0", @@ -7717,23 +8098,113 @@ "integrity": "sha512-dE9CGNzgOOsdh7msZirvv8qjHtnHpvBlKe2647kM8v+yeF71IRso55jpojemvHV+jMjr48irPWxMRaHuOWzAFA==", "requires": { "js-sha3": "^0.8.0" + } + }, + "ethereum-common": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz", + "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==" + }, + "ethereumjs-account": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz", + "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==", + "requires": { + "ethereumjs-util": "^5.0.0", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" }, "dependencies": { - "js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + "ethereumjs-util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", + "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "ethjs-util": "^0.1.3", + "keccak": "^1.0.2", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1", + "secp256k1": "^3.0.1" + } + }, + "keccak": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", + "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", + "requires": { + "bindings": "^1.2.1", + "inherits": "^2.0.3", + "nan": "^2.2.1", + "safe-buffer": "^5.1.0" + } } } }, - "ethereumjs-common": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.4.0.tgz", - "integrity": "sha512-ser2SAplX/YI5W2AnzU8wmSjKRy4KQd4uxInJ36BzjS3m18E/B9QedPUIresZN1CSEQb/RgNQ2gN7C/XbpTafA==" - }, - "ethereumjs-tx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.1.tgz", + "ethereumjs-block": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", + "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", + "requires": { + "async": "^2.0.1", + "ethereum-common": "0.2.0", + "ethereumjs-tx": "^1.2.2", + "ethereumjs-util": "^5.0.0", + "merkle-patricia-tree": "^2.1.2" + }, + "dependencies": { + "ethereumjs-tx": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", + "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", + "requires": { + "ethereum-common": "^0.0.18", + "ethereumjs-util": "^5.0.0" + }, + "dependencies": { + "ethereum-common": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", + "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=" + } + } + }, + "ethereumjs-util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", + "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "ethjs-util": "^0.1.3", + "keccak": "^1.0.2", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1", + "secp256k1": "^3.0.1" + } + }, + "keccak": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", + "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", + "requires": { + "bindings": "^1.2.1", + "inherits": "^2.0.3", + "nan": "^2.2.1", + "safe-buffer": "^5.1.0" + } + } + } + }, + "ethereumjs-common": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz", + "integrity": "sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ==" + }, + "ethereumjs-tx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.1.tgz", "integrity": "sha512-QtVriNqowCFA19X9BCRPMgdVNJ0/gMBS91TQb1DfrhsbR748g4STwxZptFAwfqehMyrF8rDwB23w87PQwru0wA==", "requires": { "ethereumjs-common": "^1.3.1", @@ -7754,6 +8225,65 @@ "secp256k1": "^3.0.1" } }, + "ethereumjs-vm": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz", + "integrity": "sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==", + "requires": { + "async": "^2.1.2", + "async-eventemitter": "^0.2.2", + "ethereumjs-account": "^2.0.3", + "ethereumjs-block": "~2.2.0", + "ethereumjs-common": "^1.1.0", + "ethereumjs-util": "^6.0.0", + "fake-merkle-patricia-tree": "^1.0.1", + "functional-red-black-tree": "^1.0.1", + "merkle-patricia-tree": "^2.3.2", + "rustbn.js": "~0.2.0", + "safe-buffer": "^5.1.1" + }, + "dependencies": { + "ethereumjs-block": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz", + "integrity": "sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==", + "requires": { + "async": "^2.0.1", + "ethereumjs-common": "^1.5.0", + "ethereumjs-tx": "^2.1.1", + "ethereumjs-util": "^5.0.0", + "merkle-patricia-tree": "^2.1.2" + }, + "dependencies": { + "ethereumjs-util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", + "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "ethjs-util": "^0.1.3", + "keccak": "^1.0.2", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1", + "secp256k1": "^3.0.1" + } + } + } + }, + "keccak": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", + "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", + "requires": { + "bindings": "^1.2.1", + "inherits": "^2.0.3", + "nan": "^2.2.1", + "safe-buffer": "^5.1.0" + } + } + } + }, "ethereumjs-wallet": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-0.6.3.tgz", @@ -7788,9 +8318,9 @@ }, "dependencies": { "@types/node": { - "version": "10.17.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.5.tgz", - "integrity": "sha512-RElZIr/7JreF1eY6oD5RF3kpmdcreuQPjg5ri4oQ5g9sq7YWU8HkfB3eH8GwAwxf5OaCh0VPi7r4N/yoTGelrA==" + "version": "10.17.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.11.tgz", + "integrity": "sha512-dNd2pp8qTzzNLAs3O8nH3iU9DG9866KHq9L3ISPB7DOGERZN81nW/5/g/KzMJpCU8jrbCiMRBzV9/sCEdRosig==" }, "aes-js": { "version": "3.0.0", @@ -8046,9 +8576,9 @@ } }, "ext": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.2.0.tgz", - "integrity": "sha512-0ccUQK/9e3NreLFg6K6np8aPyRgwycx+oFGtfx1dSp7Wj00Ozw9r05FgBRlzjf2XBM7LAzwgLyDscRrtSU91hA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", "requires": { "type": "^2.0.0" }, @@ -8184,6 +8714,21 @@ "pend": "~1.2.0" } }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -8206,6 +8751,14 @@ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, + "fake-merkle-patricia-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz", + "integrity": "sha1-S4w6z7Ugr635hgsfFM2M40As3dM=", + "requires": { + "checkpoint-store": "^1.1.0" + } + }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", @@ -9246,6 +9799,17 @@ "inherits": "~2.0.0", "mkdirp": ">=0.5 0", "rimraf": "2" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } } }, "function-bind": { @@ -9268,8 +9832,7 @@ "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 + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, "functions-have-names": { "version": "1.2.0", @@ -9345,6 +9908,11 @@ "globule": "^1.0.0" } }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" + }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", @@ -9493,13 +10061,13 @@ "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=" }, "globule": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", - "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.1.tgz", + "integrity": "sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==", "dev": true, "requires": { "glob": "~7.1.1", - "lodash": "~4.17.10", + "lodash": "~4.17.12", "minimatch": "~3.0.2" } }, @@ -9556,6 +10124,11 @@ "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" + }, "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", @@ -9582,26 +10155,6 @@ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==" }, - "handlebars": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz", - "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==", - "dev": true, - "requires": { - "neo-async": "^2.6.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -9883,6 +10436,12 @@ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" }, + "html-escaper": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", + "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==", + "dev": true + }, "html-minifier": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", @@ -10100,6 +10659,11 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==" }, + "immediate": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", + "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=" + }, "immer": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", @@ -10675,8 +11239,7 @@ "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" }, "is-whitespace-character": { "version": "1.0.3", @@ -10729,7 +11292,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "dev": true, "requires": { "node-fetch": "^1.0.1", "whatwg-fetch": ">=0.10.0" @@ -10833,12 +11395,12 @@ } }, "istanbul-reports": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", - "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", + "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", "dev": true, "requires": { - "handlebars": "^4.1.2" + "html-escaper": "^2.0.0" } }, "isurl": { @@ -11431,6 +11993,15 @@ "semver": "^6.2.0" }, "dependencies": { + "mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -11465,6 +12036,15 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, + "mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -11538,9 +12118,9 @@ } }, "js-base64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", - "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", + "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==", "dev": true }, "js-levenshtein": { @@ -11550,9 +12130,9 @@ "dev": true }, "js-sha3": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.6.1.tgz", - "integrity": "sha1-W4n3enR3Z5h39YxKB1JAk0sflcA=" + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" }, "js-stringify": { "version": "1.0.2", @@ -11625,6 +12205,15 @@ "graceful-fs": "^4.1.9" } }, + "mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, "strip-json-comments": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", @@ -11633,6 +12222,12 @@ } } }, + "jsdoctypeparser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-6.0.0.tgz", + "integrity": "sha512-61VtBXLkHfOFSIdp/VDVNMksxK0ID0cPTNvxDR92tPA6K7r2AX0OcJegYxhJIwtpWKU4p3D9L3U02hhlP1kQLQ==", + "dev": true + }, "jsdom": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", @@ -11668,9 +12263,9 @@ }, "dependencies": { "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", "dev": true }, "acorn-globals": { @@ -11684,9 +12279,9 @@ }, "dependencies": { "acorn": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", - "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "dev": true } } @@ -11807,15 +12402,6 @@ "safe-buffer": "^5.1.0" } }, - "keccakjs": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.3.tgz", - "integrity": "sha512-BjLkNDcfaZ6l8HBG9tH0tpmDv3sS2mA7FNQxFHpCdzP3Gb2MVruXBSuoM66SnVxKJpAr5dKGdkHD+bDokt8fTg==", - "requires": { - "browserify-sha3": "^0.0.4", - "sha3": "^1.2.2" - } - }, "keyboardevent-from-electron-accelerator": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-2.0.0.tgz", @@ -11840,15 +12426,14 @@ "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, "klaw": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, "requires": { "graceful-fs": "^4.1.9" } @@ -11920,6 +12505,109 @@ "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", "dev": true }, + "level-codec": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", + "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==" + }, + "level-errors": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", + "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", + "requires": { + "errno": "~0.1.1" + } + }, + "level-iterator-stream": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", + "integrity": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=", + "requires": { + "inherits": "^2.0.1", + "level-errors": "^1.0.3", + "readable-stream": "^1.0.33", + "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "level-ws": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", + "integrity": "sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=", + "requires": { + "readable-stream": "~1.0.15", + "xtend": "~2.1.1" + }, + "dependencies": { + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "requires": { + "object-keys": "~0.4.0" + } + } + } + }, + "levelup": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", + "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", + "requires": { + "deferred-leveldown": "~1.2.1", + "level-codec": "~7.0.0", + "level-errors": "~1.0.3", + "level-iterator-stream": "~1.3.0", + "prr": "~1.0.1", + "semver": "~5.4.1", + "xtend": "~4.0.0" + }, + "dependencies": { + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + } + } + }, "leven": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", @@ -11944,6 +12632,11 @@ "uc.micro": "^1.0.1" } }, + "litepicker": { + "version": "1.0.29", + "resolved": "https://registry.npmjs.org/litepicker/-/litepicker-1.0.29.tgz", + "integrity": "sha512-QbJhpfZf/2AziOjmWR9VUszHCwcTZAiK8SRyjHumq2QxQ9lCwzWYVAMBp05iqWCSXn0vbaQeLGS/ogkdpIMX+w==" + }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -11993,6 +12686,21 @@ "pinkie-promise": "^2.0.0" } }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, "path-exists": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", @@ -12052,6 +12760,16 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, + "lodash-es": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz", + "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==" + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" + }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -12175,6 +12893,11 @@ "yallist": "^3.0.2" } }, + "ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=" + }, "make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", @@ -12281,6 +13004,11 @@ "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==", "dev": true }, + "math-expression-evaluator": { + "version": "1.2.17", + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", + "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=" + }, "mathml-tag-names": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.1.tgz", @@ -12331,6 +13059,29 @@ "p-is-promise": "^2.0.0" } }, + "memdown": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", + "integrity": "sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=", + "requires": { + "abstract-leveldown": "~2.7.1", + "functional-red-black-tree": "^1.0.1", + "immediate": "^3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "abstract-leveldown": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", + "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", + "requires": { + "xtend": "~4.0.0" + } + } + } + }, "memoizerific": { "version": "1.11.3", "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", @@ -12378,6 +13129,11 @@ } } }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=" + }, "meow": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", @@ -12432,33 +13188,107 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==" }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "microevent.ts": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", - "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", + "merkle-patricia-tree": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", + "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", + "requires": { + "async": "^1.4.2", + "ethereumjs-util": "^5.0.0", + "level-ws": "0.0.0", + "levelup": "^1.2.1", + "memdown": "^1.0.0", + "readable-stream": "^2.0.0", + "rlp": "^2.0.0", + "semaphore": ">=1.0.1" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "ethereumjs-util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", + "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "ethjs-util": "^0.1.3", + "keccak": "^1.0.2", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1", + "secp256k1": "^3.0.1" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "keccak": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", + "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", + "requires": { + "bindings": "^1.2.1", + "inherits": "^2.0.3", + "nan": "^2.2.1", + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "microevent.ts": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" } @@ -12579,9 +13409,9 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "minimist-options": { "version": "3.0.2", @@ -12664,19 +13494,9 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", + "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==" }, "mkdirp-promise": { "version": "5.0.1", @@ -12717,10 +13537,92 @@ "resolved": "https://registry.npmjs.org/mobx-utils/-/mobx-utils-5.5.2.tgz", "integrity": "sha512-cOlFJDWU/NHyGKvdhWqPdHmhPfeKewElAIZp5XticWIsSLGAA+4Uou3+8ookhQ/yG7qZXzvjAq90TZWXiR5+XA==" }, + "mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" + }, + "dependencies": { + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "mock-fs": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.10.3.tgz", - "integrity": "sha512-bcukePBvuA3qovmq0Qtqu9+1APCIGkFHnsozrPIVromt5XFGGgkQSfaN0H6RI8gStHkO/hRgimvS3tooNes4pQ==" + "version": "4.10.4", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.10.4.tgz", + "integrity": "sha512-gDfZDLaPIvtOusbusLinfx6YSe2YpQsDT8qdP41P47dQ/NQggtkHukz7hwqgt8QvMBmAv+Z6DGmXPyb5BWX2nQ==" + }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" }, "moo": { "version": "0.4.3", @@ -12739,6 +13641,16 @@ "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.3" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "requires": { + "minimist": "^1.2.5" + } + } } }, "ms": { @@ -12863,7 +13775,6 @@ "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "dev": true, "requires": { "encoding": "^0.1.11", "is-stream": "^1.0.1" @@ -12894,6 +13805,15 @@ "which": "1" }, "dependencies": { + "mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, "semver": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", @@ -13035,9 +13955,9 @@ } }, "node-sass": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.0.tgz", - "integrity": "sha512-W1XBrvoJ1dy7VsvTAS5q1V45lREbTlZQqFbiHb3R3OTTCma0XBtuG6xZ6Z4506nR4lmHPTqVRwxT6KgtWC97CA==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.1.tgz", + "integrity": "sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw==", "dev": true, "requires": { "async-foreach": "^0.1.3", @@ -13182,6 +14102,15 @@ "trim-newlines": "^1.0.0" } }, + "mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -13499,7 +14428,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, "requires": { "define-properties": "^1.1.2", "function-bind": "^1.1.1", @@ -13519,6 +14447,12 @@ "has": "^1.0.3" } }, + "object.entries-ponyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.entries-ponyfill/-/object.entries-ponyfill-1.0.1.tgz", + "integrity": "sha1-Kavfd8v70mVm3RqiTp2I9lQz0lY=", + "dev": true + }, "object.fromentries": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.1.tgz", @@ -13629,24 +14563,6 @@ "is-wsl": "^1.1.0" } }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - } - } - }, "optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", @@ -13669,6 +14585,11 @@ "url-parse": "^1.4.3" } }, + "original-require": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/original-require/-/original-require-1.0.1.tgz", + "integrity": "sha1-DxMEcVhM0zURxew4yNWSE/msXiA=" + }, "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -13693,8 +14614,7 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "osenv": { "version": "0.1.5", @@ -13803,6 +14723,11 @@ } } }, + "paginator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/paginator/-/paginator-1.0.0.tgz", + "integrity": "sha1-dWVwKvmrlhbcph/CLHDroqQ1cmU=" + }, "pako": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", @@ -13917,13 +14842,9 @@ } }, "parse-headers": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.2.tgz", - "integrity": "sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg==", - "requires": { - "for-each": "^0.3.3", - "string.prototype.trim": "^1.1.2" - } + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", + "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==" }, "parse-json": { "version": "4.0.0", @@ -14181,6 +15102,14 @@ "requires": { "ms": "^2.1.1" } + }, + "mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "requires": { + "minimist": "^1.2.5" + } } } }, @@ -15060,13 +15989,20 @@ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, "query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.9.0.tgz", + "integrity": "sha512-KG4bhCFYapExLsUHrFt+kQVEegF2agm4cpF/VNc6pZVthIfCc/GK8t8VyNIE3nyXG9DK3Tf2EGkxjR6/uRdYsA==", "requires": { "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "dependencies": { + "strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=" + } } }, "querystring": { @@ -15093,11 +16029,15 @@ "version": "3.4.1", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "dev": true, "requires": { "performance-now": "^2.1.0" } }, + "raf-schd": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.2.tgz", + "integrity": "sha512-VhlMZmGy6A6hrkJWHLNTGl5gtgMUm+xfGza6wbwnE914yeQ5Ybm18vgM734RZhMgfw4tacUrWseGZlpUrrakEQ==" + }, "railroad-diagrams": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", @@ -15208,6 +16148,20 @@ "@babel/runtime": "^7.0.0" } }, + "react-collapse": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-collapse/-/react-collapse-5.0.0.tgz", + "integrity": "sha512-VpNmFZIUhHcl2Xqt9+N9PpjK14J6DyF56mdFn9Ci+3WqR+duQrQ0U2cuaMXw0VrHWLy/pACFX/bGSMVe303gNQ==" + }, + "react-copy-to-clipboard": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.2.tgz", + "integrity": "sha512-/2t5mLMMPuN5GmdXo6TebFa8IoFxZ+KTDDqYhcDm0PhkgEzSxVvIX26G20s1EB02A4h2UZgwtfymZ3lGJm0OLg==", + "requires": { + "copy-to-clipboard": "^3", + "prop-types": "^15.5.8" + } + }, "react-dev-utils": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-9.1.0.tgz", @@ -15536,16 +16490,31 @@ "html-parse-stringify2": "2.0.1" } }, + "react-id-generator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-id-generator/-/react-id-generator-3.0.0.tgz", + "integrity": "sha512-egmdswpzA/z8UlignCZKmJqrO0EaqmW13M8756wE+V/6NtYf0CdvDjkGpat/Q/djXfg7F/C0267Gff1RHgpfIQ==" + }, "react-is": { "version": "16.11.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.11.0.tgz", "integrity": "sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw==" }, + "react-js-pagination": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/react-js-pagination/-/react-js-pagination-3.0.2.tgz", + "integrity": "sha512-gsXaQVis1YDKhbeZC7VT9dsSWyZ8GZNEX06dy2HLl36LohY2Vt/iWJ5k6HAb0YOKW0mklCY7wjxJIfJeeP295g==", + "requires": { + "classnames": "^2.2.5", + "paginator": "^1.0.0", + "prop-types": "15.x.x - 16.x.x", + "react": "15.x.x - 16.x.x" + } + }, "react-lifecycles-compat": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", - "dev": true + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "react-popper": { "version": "1.3.6", @@ -15600,6 +16569,18 @@ "prop-types": "^15.5.8" } }, + "react-resize-detector": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-4.2.1.tgz", + "integrity": "sha512-ZfPMBPxXi0o3xox42MIEtz84tPSVMW9GgwLHYvjVXlFM+OkNzbeEtpVSV+mSTJmk4Znwomolzt35zHN9LNBQMQ==", + "requires": { + "lodash": "^4.17.15", + "lodash-es": "^4.17.15", + "prop-types": "^15.7.2", + "raf-schd": "^4.0.2", + "resize-observer-polyfill": "^1.5.1" + } + }, "react-router": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.1.2.tgz", @@ -15643,6 +16624,17 @@ "throttle-debounce": "^2.1.0" } }, + "react-smooth": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-1.0.5.tgz", + "integrity": "sha512-eW057HT0lFgCKh8ilr0y2JaH2YbNcuEdFpxyg7Gf/qDKk9hqGMyXryZJ8iMGJEuKH0+wxS0ccSsBBB3W8yCn8w==", + "requires": { + "lodash": "~4.17.4", + "prop-types": "^15.6.0", + "raf": "^3.4.0", + "react-transition-group": "^2.5.0" + } + }, "react-syntax-highlighter": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-8.1.0.tgz", @@ -15656,6 +16648,15 @@ "refractor": "^2.4.1" } }, + "react-tabs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-3.0.0.tgz", + "integrity": "sha512-z90cDIb+5V7MzjXFHq1VLxYiMH7dDQWan7mXSw6BWQtw+9pYAnq/fEDvsPaXNyevYitvLetdW87C61uu27JVMA==", + "requires": { + "classnames": "^2.2.0", + "prop-types": "^15.5.0" + } + }, "react-test-renderer": { "version": "16.12.0", "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.12.0.tgz", @@ -15690,6 +16691,17 @@ "prop-types": "^15.6.0" } }, + "react-transition-group": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", + "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", + "requires": { + "dom-helpers": "^3.4.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" + } + }, "read-config-file": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-3.2.2.tgz", @@ -15839,6 +16851,39 @@ } } }, + "recharts": { + "version": "2.0.0-beta.1", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.0.0-beta.1.tgz", + "integrity": "sha512-awJH2DE6JRgp5ymzmH5dKh2Pu6prqZJCr3NRaYCcyub1fBa+fIG3ZlpLyl9hWizHPGEvfZLvcjIM+qgTsr9aSQ==", + "requires": { + "classnames": "^2.2.5", + "core-js": "^3.4.2", + "d3-interpolate": "^1.3.0", + "d3-scale": "^3.1.0", + "d3-shape": "^1.3.5", + "lodash": "^4.17.5", + "prop-types": "^15.6.0", + "react-resize-detector": "^4.2.1", + "react-smooth": "^1.0.5", + "recharts-scale": "^0.4.2", + "reduce-css-calc": "^1.3.0" + }, + "dependencies": { + "core-js": { + "version": "3.4.8", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.4.8.tgz", + "integrity": "sha512-b+BBmCZmVgho8KnBUOXpvlqEMguko+0P+kXCwD4vIprsXC6ht1qgPxtb1OK6XgSlrySF71wkwBQ0Hv695bk9gQ==" + } + } + }, + "recharts-scale": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.3.tgz", + "integrity": "sha512-t8p5sccG9Blm7c1JQK/ak9O8o95WGhNXD7TXg/BW5bYbVlr6eCeRBNpgyigD4p6pSSMehC5nSvBUPj6F68rbFA==", + "requires": { + "decimal.js-light": "^2.4.1" + } + }, "rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", @@ -15866,6 +16911,31 @@ "strip-indent": "^2.0.0" } }, + "reduce-css-calc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", + "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", + "requires": { + "balanced-match": "^0.4.2", + "math-expression-evaluator": "^1.2.14", + "reduce-function-call": "^1.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" + } + } + }, + "reduce-function-call": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.3.tgz", + "integrity": "sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==", + "requires": { + "balanced-match": "^1.0.0" + } + }, "reflect.ownkeys": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz", @@ -15949,6 +17019,12 @@ "unicode-match-property-value-ecmascript": "^1.1.0" } }, + "regextras": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.6.1.tgz", + "integrity": "sha512-EzIHww9xV2Kpqx+corS/I7OBmf2rZ0pKKJPsw5Dc+l6Zq1TslDmtRIP9maVn3UH+72MIXmn8zzDgP07ihQogUA==", + "dev": true + }, "registry-auth-token": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.0.0.tgz", @@ -16168,6 +17244,11 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", @@ -16190,8 +17271,7 @@ "resize-observer-polyfill": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", - "dev": true + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" }, "resolve": { "version": "1.12.0", @@ -16285,9 +17365,17 @@ "signal-exit": "^3.0.2" } }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "resumer": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", + "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", + "requires": { + "through": "~2.3.4" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, "retry": { @@ -16362,6 +17450,11 @@ "aproba": "^1.1.1" } }, + "rustbn.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", + "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" + }, "rx": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", @@ -16731,26 +17824,6 @@ "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz", "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q=" }, - "scrypt-shim": { - "version": "github:web3-js/scrypt-shim#be5e616323a8b5e568788bf94d03c1b8410eac54", - "from": "github:web3-js/scrypt-shim", - "requires": { - "scryptsy": "^2.1.0", - "semver": "^6.3.0" - }, - "dependencies": { - "scryptsy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz", - "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==" - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, "scrypt.js": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.3.0.tgz", @@ -16832,6 +17905,11 @@ "node-forge": "0.9.0" } }, + "semaphore": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", + "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==" + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -16889,9 +17967,9 @@ } }, "serialize-javascript": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", - "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==" }, "serve-favicon": { "version": "2.5.0", @@ -17038,21 +18116,6 @@ "safe-buffer": "^5.0.1" } }, - "sha3": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/sha3/-/sha3-1.2.3.tgz", - "integrity": "sha512-sOWDZi8cDBRkLfWOw18wvJyNblXDHzwMGnRWut8zNNeIeLnmMRO17bjpLc7OzMuj1ASUgx2IyohzUCAl+Kx5vA==", - "requires": { - "nan": "2.13.2" - }, - "dependencies": { - "nan": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", - "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==" - } - } - }, "shallow-clone": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", @@ -17391,6 +18454,56 @@ } } }, + "solc": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.6.1.tgz", + "integrity": "sha512-iKqNYps2p++x8L9sBg7JeAJb7EmW8VJ/2asAzwlLYcUhj86AzuWLe94UTSQHv1SSCCj/x6lya8twvXkZtlTbIQ==", + "requires": { + "command-exists": "^1.2.8", + "commander": "3.0.2", + "fs-extra": "^0.30.0", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "require-from-string": "^2.0.0", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "dependencies": { + "commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" + }, + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "requires": { + "graceful-fs": "^4.1.6" + } + } + } + }, + "solidity-bytes-utils": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/solidity-bytes-utils/-/solidity-bytes-utils-0.0.6.tgz", + "integrity": "sha512-kOQ1uRvorR6q0PT0mEnIDDhrSRSyDxL5XYCpyQ6GYXWPZRTGB4vzkhuIHxZRsVKvHFIFVtft6C3HTq3r0Sfosw==", + "requires": { + "truffle-hdwallet-provider": "0.0.3" + } + }, "sort-keys": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", @@ -17519,6 +18632,11 @@ "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=", "dev": true }, + "split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==" + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -17619,9 +18737,9 @@ "dev": true }, "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -17830,6 +18948,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.0.tgz", "integrity": "sha512-9EIjYD/WdlvLpn987+ctkLf0FfvBefOCuiEr2henD8X+7jfwPnyvTdmW8OJhj5p+M0/96mBdynLWkxUr+rHlpg==", + "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.13.0", @@ -17840,6 +18959,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "dev": true, "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" @@ -17849,6 +18969,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "dev": true, "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" @@ -18129,6 +19250,15 @@ "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==", "dev": true + }, + "mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } } } }, @@ -18235,6 +19365,115 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" }, + "tape": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/tape/-/tape-4.13.2.tgz", + "integrity": "sha512-waWwC/OqYVE9TS6r1IynlP2sEdk4Lfo6jazlgkuNkPTHIbuG2BTABIaKdlQWwPeB6Oo4ksZ1j33Yt0NTOAlYMQ==", + "requires": { + "deep-equal": "~1.1.1", + "defined": "~1.0.0", + "dotignore": "~0.1.2", + "for-each": "~0.3.3", + "function-bind": "~1.1.1", + "glob": "~7.1.6", + "has": "~1.0.3", + "inherits": "~2.0.4", + "is-regex": "~1.0.5", + "minimist": "~1.2.0", + "object-inspect": "~1.7.0", + "resolve": "~1.15.1", + "resumer": "~0.0.0", + "string.prototype.trim": "~1.2.1", + "through": "~2.3.8" + }, + "dependencies": { + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "es-abstract": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "requires": { + "has": "^1.0.3" + } + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "string.prototype.trim": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz", + "integrity": "sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + } + } + }, "tar": { "version": "4.4.13", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", @@ -18247,6 +19486,16 @@ "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", "yallist": "^3.0.3" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "requires": { + "minimist": "^1.2.5" + } + } } }, "tar-stream": { @@ -18415,9 +19664,9 @@ } }, "terser": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.4.0.tgz", - "integrity": "sha512-oDG16n2WKm27JO8h4y/w3iqBGAOSCtq7k8dRmrn4Wf9NouL0b2WpMHGChFGZq4nFAQy1FsNJrVQHfurXOSTmOA==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.4.3.tgz", + "integrity": "sha512-0ikKraVtRDKGzHrzkCv5rUNDzqlhmhowOBqC0XqUHFpW+vJ45+20/IFBcebwKfiS2Z9fJin6Eo+F1zLZsxi8RA==", "requires": { "commander": "^2.20.0", "source-map": "~0.6.1", @@ -18437,15 +19686,15 @@ } }, "terser-webpack-plugin": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz", - "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", "requires": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", "is-wsl": "^1.1.0", "schema-utils": "^1.0.0", - "serialize-javascript": "^1.7.0", + "serialize-javascript": "^2.1.2", "source-map": "^0.6.1", "terser": "^4.1.2", "webpack-sources": "^1.4.0", @@ -18638,7 +19887,6 @@ "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" } @@ -18710,8 +19958,7 @@ "toggle-selection": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=", - "dev": true + "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" }, "toidentifier": { "version": "1.0.0", @@ -18750,9 +19997,9 @@ } }, "tree-kill": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", - "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, "trim": { @@ -18784,6 +20031,62 @@ "glob": "^7.1.2" } }, + "truffle": { + "version": "5.1.17", + "resolved": "https://registry.npmjs.org/truffle/-/truffle-5.1.17.tgz", + "integrity": "sha512-x8CNCjtsX3B34Q6TI467+kgxqzjCRMvLsGIqf/MHo1NpntP1tIOySGJ+idEg857X0hJz8zfOVz9QKbvrrsKUGQ==", + "requires": { + "app-module-path": "^2.2.0", + "mocha": "5.2.0", + "original-require": "1.0.1" + } + }, + "truffle-hdwallet-provider": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/truffle-hdwallet-provider/-/truffle-hdwallet-provider-0.0.3.tgz", + "integrity": "sha1-Dh3gIQS3PTh14c9wkzBbTqii2EM=", + "requires": { + "bip39": "^2.2.0", + "ethereumjs-wallet": "^0.6.0", + "web3": "^0.18.2", + "web3-provider-engine": "^8.4.0" + }, + "dependencies": { + "bignumber.js": { + "version": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", + "from": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2" + }, + "bip39": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-2.6.0.tgz", + "integrity": "sha512-RrnQRG2EgEoqO24ea+Q/fftuPUZLmrEM3qNhhGsA3PbaXaCW791LTzPuVyx/VprXQcTbPJ3K3UeTna8ZnVl2sg==", + "requires": { + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1", + "safe-buffer": "^5.0.1", + "unorm": "^1.3.3" + } + }, + "utf8": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", + "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" + }, + "web3": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/web3/-/web3-0.18.4.tgz", + "integrity": "sha1-gewXhBRUkfLqqJVbMcBgSeB8Xn0=", + "requires": { + "bignumber.js": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", + "crypto-js": "^3.1.4", + "utf8": "^2.1.1", + "xhr2": "*", + "xmlhttprequest": "*" + } + } + } + }, "truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", @@ -19101,6 +20404,11 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, + "unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==" + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -19577,31 +20885,31 @@ } }, "web3": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.2.tgz", - "integrity": "sha512-/ChbmB6qZpfGx6eNpczt5YSUBHEA5V2+iUCbn85EVb3Zv6FVxrOo5Tv7Lw0gE2tW7EEjASbCyp3mZeiZaCCngg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.4.tgz", + "integrity": "sha512-xPXGe+w0x0t88Wj+s/dmAdASr3O9wmA9mpZRtixGZxmBexAF0MjfqYM+MS4tVl5s11hMTN3AZb8cDD4VLfC57A==", "requires": { "@types/node": "^12.6.1", - "web3-bzz": "1.2.2", - "web3-core": "1.2.2", - "web3-eth": "1.2.2", - "web3-eth-personal": "1.2.2", - "web3-net": "1.2.2", - "web3-shh": "1.2.2", - "web3-utils": "1.2.2" + "web3-bzz": "1.2.4", + "web3-core": "1.2.4", + "web3-eth": "1.2.4", + "web3-eth-personal": "1.2.4", + "web3-net": "1.2.4", + "web3-shh": "1.2.4", + "web3-utils": "1.2.4" }, "dependencies": { "@types/node": { - "version": "12.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.7.tgz", - "integrity": "sha512-E6Zn0rffhgd130zbCbAr/JdXfXkoOUFAKNs/rF8qnafSJ8KYaA/j3oz7dcwal+lYjLA7xvdd5J4wdYpCTlP8+w==" + "version": "12.12.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.20.tgz", + "integrity": "sha512-VAe+DiwpnC/g448uN+/3gRl4th0BTdrR9gSLIOHA+SUQskaYZQDOHG7xmjiE7JUhjbXnbXytf6Ih+/pA6CtMFQ==" } } }, "web3-bzz": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.2.tgz", - "integrity": "sha512-b1O2ObsqUN1lJxmFSjvnEC4TsaCbmh7Owj3IAIWTKqL9qhVgx7Qsu5O9cD13pBiSPNZJ68uJPaKq380QB4NWeA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.4.tgz", + "integrity": "sha512-MqhAo/+0iQSMBtt3/QI1rU83uvF08sYq8r25+OUZ+4VtihnYsmkkca+rdU0QbRyrXY2/yGIpI46PFdh0khD53A==", "requires": { "@types/node": "^10.12.18", "got": "9.6.0", @@ -19610,132 +20918,133 @@ }, "dependencies": { "@types/node": { - "version": "10.17.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.5.tgz", - "integrity": "sha512-RElZIr/7JreF1eY6oD5RF3kpmdcreuQPjg5ri4oQ5g9sq7YWU8HkfB3eH8GwAwxf5OaCh0VPi7r4N/yoTGelrA==" + "version": "10.17.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.11.tgz", + "integrity": "sha512-dNd2pp8qTzzNLAs3O8nH3iU9DG9866KHq9L3ISPB7DOGERZN81nW/5/g/KzMJpCU8jrbCiMRBzV9/sCEdRosig==" } } }, "web3-core": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.2.tgz", - "integrity": "sha512-miHAX3qUgxV+KYfaOY93Hlc3kLW2j5fH8FJy6kSxAv+d4d5aH0wwrU2IIoJylQdT+FeenQ38sgsCnFu9iZ1hCQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.4.tgz", + "integrity": "sha512-CHc27sMuET2cs1IKrkz7xzmTdMfZpYswe7f0HcuyneTwS1yTlTnHyqjAaTy0ZygAb/x4iaVox+Gvr4oSAqSI+A==", "requires": { + "@types/bignumber.js": "^5.0.0", "@types/bn.js": "^4.11.4", "@types/node": "^12.6.1", - "web3-core-helpers": "1.2.2", - "web3-core-method": "1.2.2", - "web3-core-requestmanager": "1.2.2", - "web3-utils": "1.2.2" + "web3-core-helpers": "1.2.4", + "web3-core-method": "1.2.4", + "web3-core-requestmanager": "1.2.4", + "web3-utils": "1.2.4" }, "dependencies": { "@types/node": { - "version": "12.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.7.tgz", - "integrity": "sha512-E6Zn0rffhgd130zbCbAr/JdXfXkoOUFAKNs/rF8qnafSJ8KYaA/j3oz7dcwal+lYjLA7xvdd5J4wdYpCTlP8+w==" + "version": "12.12.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.20.tgz", + "integrity": "sha512-VAe+DiwpnC/g448uN+/3gRl4th0BTdrR9gSLIOHA+SUQskaYZQDOHG7xmjiE7JUhjbXnbXytf6Ih+/pA6CtMFQ==" } } }, "web3-core-helpers": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.2.tgz", - "integrity": "sha512-HJrRsIGgZa1jGUIhvGz4S5Yh6wtOIo/TMIsSLe+Xay+KVnbseJpPprDI5W3s7H2ODhMQTbogmmUFquZweW2ImQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.4.tgz", + "integrity": "sha512-U7wbsK8IbZvF3B7S+QMSNP0tni/6VipnJkB0tZVEpHEIV2WWeBHYmZDnULWcsS/x/jn9yKhJlXIxWGsEAMkjiw==", "requires": { "underscore": "1.9.1", - "web3-eth-iban": "1.2.2", - "web3-utils": "1.2.2" + "web3-eth-iban": "1.2.4", + "web3-utils": "1.2.4" } }, "web3-core-method": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.2.tgz", - "integrity": "sha512-szR4fDSBxNHaF1DFqE+j6sFR/afv9Aa36OW93saHZnrh+iXSrYeUUDfugeNcRlugEKeUCkd4CZylfgbK2SKYJA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.4.tgz", + "integrity": "sha512-8p9kpL7di2qOVPWgcM08kb+yKom0rxRCMv6m/K+H+yLSxev9TgMbCgMSbPWAHlyiF3SJHw7APFKahK5Z+8XT5A==", "requires": { "underscore": "1.9.1", - "web3-core-helpers": "1.2.2", - "web3-core-promievent": "1.2.2", - "web3-core-subscriptions": "1.2.2", - "web3-utils": "1.2.2" + "web3-core-helpers": "1.2.4", + "web3-core-promievent": "1.2.4", + "web3-core-subscriptions": "1.2.4", + "web3-utils": "1.2.4" } }, "web3-core-promievent": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.2.tgz", - "integrity": "sha512-tKvYeT8bkUfKABcQswK6/X79blKTKYGk949urZKcLvLDEaWrM3uuzDwdQT3BNKzQ3vIvTggFPX9BwYh0F1WwqQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.4.tgz", + "integrity": "sha512-gEUlm27DewUsfUgC3T8AxkKi8Ecx+e+ZCaunB7X4Qk3i9F4C+5PSMGguolrShZ7Zb6717k79Y86f3A00O0VAZw==", "requires": { "any-promise": "1.3.0", "eventemitter3": "3.1.2" } }, "web3-core-requestmanager": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.2.tgz", - "integrity": "sha512-a+gSbiBRHtHvkp78U2bsntMGYGF2eCb6219aMufuZWeAZGXJ63Wc2321PCbA8hF9cQrZI4EoZ4kVLRI4OF15Hw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.4.tgz", + "integrity": "sha512-eZJDjyNTDtmSmzd3S488nR/SMJtNnn/GuwxnMh3AzYCqG3ZMfOylqTad2eYJPvc2PM5/Gj1wAMQcRpwOjjLuPg==", "requires": { "underscore": "1.9.1", - "web3-core-helpers": "1.2.2", - "web3-providers-http": "1.2.2", - "web3-providers-ipc": "1.2.2", - "web3-providers-ws": "1.2.2" + "web3-core-helpers": "1.2.4", + "web3-providers-http": "1.2.4", + "web3-providers-ipc": "1.2.4", + "web3-providers-ws": "1.2.4" } }, "web3-core-subscriptions": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.2.tgz", - "integrity": "sha512-QbTgigNuT4eicAWWr7ahVpJyM8GbICsR1Ys9mJqzBEwpqS+RXTRVSkwZ2IsxO+iqv6liMNwGregbJLq4urMFcQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.4.tgz", + "integrity": "sha512-3D607J2M8ymY9V+/WZq4MLlBulwCkwEjjC2U+cXqgVO1rCyVqbxZNCmHyNYHjDDCxSEbks9Ju5xqJxDSxnyXEw==", "requires": { "eventemitter3": "3.1.2", "underscore": "1.9.1", - "web3-core-helpers": "1.2.2" + "web3-core-helpers": "1.2.4" } }, "web3-eth": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.2.tgz", - "integrity": "sha512-UXpC74mBQvZzd4b+baD4Ocp7g+BlwxhBHumy9seyE/LMIcMlePXwCKzxve9yReNpjaU16Mmyya6ZYlyiKKV8UA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.4.tgz", + "integrity": "sha512-+j+kbfmZsbc3+KJpvHM16j1xRFHe2jBAniMo1BHKc3lho6A8Sn9Buyut6odubguX2AxoRArCdIDCkT9hjUERpA==", "requires": { "underscore": "1.9.1", - "web3-core": "1.2.2", - "web3-core-helpers": "1.2.2", - "web3-core-method": "1.2.2", - "web3-core-subscriptions": "1.2.2", - "web3-eth-abi": "1.2.2", - "web3-eth-accounts": "1.2.2", - "web3-eth-contract": "1.2.2", - "web3-eth-ens": "1.2.2", - "web3-eth-iban": "1.2.2", - "web3-eth-personal": "1.2.2", - "web3-net": "1.2.2", - "web3-utils": "1.2.2" + "web3-core": "1.2.4", + "web3-core-helpers": "1.2.4", + "web3-core-method": "1.2.4", + "web3-core-subscriptions": "1.2.4", + "web3-eth-abi": "1.2.4", + "web3-eth-accounts": "1.2.4", + "web3-eth-contract": "1.2.4", + "web3-eth-ens": "1.2.4", + "web3-eth-iban": "1.2.4", + "web3-eth-personal": "1.2.4", + "web3-net": "1.2.4", + "web3-utils": "1.2.4" } }, "web3-eth-abi": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.2.tgz", - "integrity": "sha512-Yn/ZMgoOLxhTVxIYtPJ0eS6pnAnkTAaJgUJh1JhZS4ekzgswMfEYXOwpMaD5eiqPJLpuxmZFnXnBZlnQ1JMXsw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.4.tgz", + "integrity": "sha512-8eLIY4xZKoU3DSVu1pORluAw9Ru0/v4CGdw5so31nn+7fR8zgHMgwbFe0aOqWQ5VU42PzMMXeIJwt4AEi2buFg==", "requires": { "ethers": "4.0.0-beta.3", "underscore": "1.9.1", - "web3-utils": "1.2.2" + "web3-utils": "1.2.4" } }, "web3-eth-accounts": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.2.tgz", - "integrity": "sha512-KzHOEyXOEZ13ZOkWN3skZKqSo5f4Z1ogPFNn9uZbKCz+kSp+gCAEKxyfbOsB/JMAp5h7o7pb6eYsPCUBJmFFiA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.4.tgz", + "integrity": "sha512-04LzT/UtWmRFmi4hHRewP5Zz43fWhuHiK5XimP86sUQodk/ByOkXQ3RoXyGXFMNoRxdcAeRNxSfA2DpIBc9xUw==", "requires": { + "@web3-js/scrypt-shim": "^0.1.0", "any-promise": "1.3.0", "crypto-browserify": "3.12.0", "eth-lib": "0.2.7", "ethereumjs-common": "^1.3.2", "ethereumjs-tx": "^2.1.1", - "scrypt-shim": "github:web3-js/scrypt-shim", "underscore": "1.9.1", "uuid": "3.3.2", - "web3-core": "1.2.2", - "web3-core-helpers": "1.2.2", - "web3-core-method": "1.2.2", - "web3-utils": "1.2.2" + "web3-core": "1.2.4", + "web3-core-helpers": "1.2.4", + "web3-core-method": "1.2.4", + "web3-utils": "1.2.4" }, "dependencies": { "eth-lib": { @@ -19756,119 +21065,429 @@ } }, "web3-eth-contract": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.2.tgz", - "integrity": "sha512-EKT2yVFws3FEdotDQoNsXTYL798+ogJqR2//CaGwx3p0/RvQIgfzEwp8nbgA6dMxCsn9KOQi7OtklzpnJMkjtA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.4.tgz", + "integrity": "sha512-b/9zC0qjVetEYnzRA1oZ8gF1OSSUkwSYi5LGr4GeckLkzXP7osEnp9lkO/AQcE4GpG+l+STnKPnASXJGZPgBRQ==", "requires": { "@types/bn.js": "^4.11.4", "underscore": "1.9.1", - "web3-core": "1.2.2", - "web3-core-helpers": "1.2.2", - "web3-core-method": "1.2.2", - "web3-core-promievent": "1.2.2", - "web3-core-subscriptions": "1.2.2", - "web3-eth-abi": "1.2.2", - "web3-utils": "1.2.2" + "web3-core": "1.2.4", + "web3-core-helpers": "1.2.4", + "web3-core-method": "1.2.4", + "web3-core-promievent": "1.2.4", + "web3-core-subscriptions": "1.2.4", + "web3-eth-abi": "1.2.4", + "web3-utils": "1.2.4" } }, "web3-eth-ens": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.2.tgz", - "integrity": "sha512-CFjkr2HnuyMoMFBoNUWojyguD4Ef+NkyovcnUc/iAb9GP4LHohKrODG4pl76R5u61TkJGobC2ij6TyibtsyVYg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.4.tgz", + "integrity": "sha512-g8+JxnZlhdsCzCS38Zm6R/ngXhXzvc3h7bXlxgKU4coTzLLoMpgOAEz71GxyIJinWTFbLXk/WjNY0dazi9NwVw==", "requires": { "eth-ens-namehash": "2.0.8", "underscore": "1.9.1", - "web3-core": "1.2.2", - "web3-core-helpers": "1.2.2", - "web3-core-promievent": "1.2.2", - "web3-eth-abi": "1.2.2", - "web3-eth-contract": "1.2.2", - "web3-utils": "1.2.2" + "web3-core": "1.2.4", + "web3-core-helpers": "1.2.4", + "web3-core-promievent": "1.2.4", + "web3-eth-abi": "1.2.4", + "web3-eth-contract": "1.2.4", + "web3-utils": "1.2.4" } }, "web3-eth-iban": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.2.tgz", - "integrity": "sha512-gxKXBoUhaTFHr0vJB/5sd4i8ejF/7gIsbM/VvemHT3tF5smnmY6hcwSMmn7sl5Gs+83XVb/BngnnGkf+I/rsrQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.4.tgz", + "integrity": "sha512-D9HIyctru/FLRpXakRwmwdjb5bWU2O6UE/3AXvRm6DCOf2e+7Ve11qQrPtaubHfpdW3KWjDKvlxV9iaFv/oTMQ==", "requires": { "bn.js": "4.11.8", - "web3-utils": "1.2.2" + "web3-utils": "1.2.4" } }, "web3-eth-personal": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.2.tgz", - "integrity": "sha512-4w+GLvTlFqW3+q4xDUXvCEMU7kRZ+xm/iJC8gm1Li1nXxwwFbs+Y+KBK6ZYtoN1qqAnHR+plYpIoVo27ixI5Rg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.4.tgz", + "integrity": "sha512-5Russ7ZECwHaZXcN3DLuLS7390Vzgrzepl4D87SD6Sn1DHsCZtvfdPIYwoTmKNp69LG3mORl7U23Ga5YxqkICw==", "requires": { "@types/node": "^12.6.1", - "web3-core": "1.2.2", - "web3-core-helpers": "1.2.2", - "web3-core-method": "1.2.2", - "web3-net": "1.2.2", - "web3-utils": "1.2.2" + "web3-core": "1.2.4", + "web3-core-helpers": "1.2.4", + "web3-core-method": "1.2.4", + "web3-net": "1.2.4", + "web3-utils": "1.2.4" }, "dependencies": { "@types/node": { - "version": "12.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.7.tgz", - "integrity": "sha512-E6Zn0rffhgd130zbCbAr/JdXfXkoOUFAKNs/rF8qnafSJ8KYaA/j3oz7dcwal+lYjLA7xvdd5J4wdYpCTlP8+w==" + "version": "12.12.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.20.tgz", + "integrity": "sha512-VAe+DiwpnC/g448uN+/3gRl4th0BTdrR9gSLIOHA+SUQskaYZQDOHG7xmjiE7JUhjbXnbXytf6Ih+/pA6CtMFQ==" } } }, "web3-net": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.2.tgz", - "integrity": "sha512-K07j2DXq0x4UOJgae65rWZKraOznhk8v5EGSTdFqASTx7vWE/m+NqBijBYGEsQY1lSMlVaAY9UEQlcXK5HzXTw==", - "requires": { - "web3-core": "1.2.2", - "web3-core-method": "1.2.2", - "web3-utils": "1.2.2" + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.4.tgz", + "integrity": "sha512-wKOsqhyXWPSYTGbp7ofVvni17yfRptpqoUdp3SC8RAhDmGkX6irsiT9pON79m6b3HUHfLoBilFQyt/fTUZOf7A==", + "requires": { + "web3-core": "1.2.4", + "web3-core-method": "1.2.4", + "web3-utils": "1.2.4" + } + }, + "web3-provider-engine": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-8.6.1.tgz", + "integrity": "sha1-TYbhnjDKr5ffNRUR7A9gE25bMOs=", + "requires": { + "async": "^2.1.2", + "clone": "^2.0.0", + "ethereumjs-block": "^1.2.2", + "ethereumjs-tx": "^1.2.0", + "ethereumjs-util": "^5.0.1", + "ethereumjs-vm": "^2.0.2", + "isomorphic-fetch": "^2.2.0", + "request": "^2.67.0", + "semaphore": "^1.0.3", + "solc": "^0.4.2", + "tape": "^4.4.0", + "web3": "^0.16.0", + "xhr": "^2.2.0", + "xtend": "^4.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "bignumber.js": { + "version": "git+https://github.com/debris/bignumber.js.git#c7a38de919ed75e6fb6ba38051986e294b328df9", + "from": "git+https://github.com/debris/bignumber.js.git#master" + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "ethereum-common": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", + "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=" + }, + "ethereumjs-tx": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", + "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", + "requires": { + "ethereum-common": "^0.0.18", + "ethereumjs-util": "^5.0.0" + } + }, + "ethereumjs-util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", + "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", + "requires": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "ethjs-util": "^0.1.3", + "keccak": "^1.0.2", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1", + "secp256k1": "^3.0.1" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "keccak": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", + "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", + "requires": { + "bindings": "^1.2.1", + "inherits": "^2.0.3", + "nan": "^2.2.1", + "safe-buffer": "^5.1.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=" + }, + "solc": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", + "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", + "requires": { + "fs-extra": "^0.30.0", + "memorystream": "^0.3.1", + "require-from-string": "^1.1.0", + "semver": "^5.3.0", + "yargs": "^4.7.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "utf8": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", + "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" + }, + "web3": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/web3/-/web3-0.16.0.tgz", + "integrity": "sha1-pFVBdc1GKUMDWx8dOUMvdBxrYBk=", + "requires": { + "bignumber.js": "git+https://github.com/debris/bignumber.js.git#master", + "crypto-js": "^3.1.4", + "utf8": "^2.1.1", + "xmlhttprequest": "*" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yargs": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", + "requires": { + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.1", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.1" + } + }, + "yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", + "requires": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + } + } } }, "web3-providers-http": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.2.tgz", - "integrity": "sha512-BNZ7Hguy3eBszsarH5gqr9SIZNvqk9eKwqwmGH1LQS1FL3NdoOn7tgPPdddrXec4fL94CwgNk4rCU+OjjZRNDg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.4.tgz", + "integrity": "sha512-dzVCkRrR/cqlIrcrWNiPt9gyt0AZTE0J+MfAu9rR6CyIgtnm1wFUVVGaxYRxuTGQRO4Dlo49gtoGwaGcyxqiTw==", "requires": { - "web3-core-helpers": "1.2.2", + "web3-core-helpers": "1.2.4", "xhr2-cookies": "1.1.0" } }, "web3-providers-ipc": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.2.tgz", - "integrity": "sha512-t97w3zi5Kn/LEWGA6D9qxoO0LBOG+lK2FjlEdCwDQatffB/+vYrzZ/CLYVQSoyFZAlsDoBasVoYSWZK1n39aHA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.4.tgz", + "integrity": "sha512-8J3Dguffin51gckTaNrO3oMBo7g+j0UNk6hXmdmQMMNEtrYqw4ctT6t06YOf9GgtOMjSAc1YEh3LPrvgIsR7og==", "requires": { "oboe": "2.1.4", "underscore": "1.9.1", - "web3-core-helpers": "1.2.2" + "web3-core-helpers": "1.2.4" } }, "web3-providers-ws": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.2.tgz", - "integrity": "sha512-Wb1mrWTGMTXOpJkL0yGvL/WYLt8fUIXx8k/l52QB2IiKzvyd42dTWn4+j8IKXGSYYzOm7NMqv6nhA5VDk12VfA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.4.tgz", + "integrity": "sha512-F/vQpDzeK+++oeeNROl1IVTufFCwCR2hpWe5yRXN0ApLwHqXrMI7UwQNdJ9iyibcWjJf/ECbauEEQ8CHgE+MYQ==", "requires": { + "@web3-js/websocket": "^1.0.29", "underscore": "1.9.1", - "web3-core-helpers": "1.2.2", - "websocket": "github:web3-js/WebSocket-Node#polyfill/globalThis" + "web3-core-helpers": "1.2.4" } }, "web3-shh": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.2.tgz", - "integrity": "sha512-og258NPhlBn8yYrDWjoWBBb6zo1OlBgoWGT+LL5/LPqRbjPe09hlOYHgscAAr9zZGtohTOty7RrxYw6Z6oDWCg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.4.tgz", + "integrity": "sha512-z+9SCw0dE+69Z/Hv8809XDbLj7lTfEv9Sgu8eKEIdGntZf4v7ewj5rzN5bZZSz8aCvfK7Y6ovz1PBAu4QzS4IQ==", "requires": { - "web3-core": "1.2.2", - "web3-core-method": "1.2.2", - "web3-core-subscriptions": "1.2.2", - "web3-net": "1.2.2" + "web3-core": "1.2.4", + "web3-core-method": "1.2.4", + "web3-core-subscriptions": "1.2.4", + "web3-net": "1.2.4" } }, "web3-utils": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.2.tgz", - "integrity": "sha512-joF+s3243TY5cL7Z7y4h1JsJpUCf/kmFmj+eJar7Y2yNIGVcW961VyrAms75tjUysSuHaUQ3eQXjBEUJueT52A==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.4.tgz", + "integrity": "sha512-+S86Ip+jqfIPQWvw2N/xBQq5JNqCO0dyvukGdJm8fEWHZbckT4WxSpHbx+9KLEWY4H4x9pUwnoRkK87pYyHfgQ==", "requires": { "bn.js": "4.11.8", "eth-lib": "0.2.7", @@ -19899,9 +21518,9 @@ "dev": true }, "webpack": { - "version": "4.41.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.2.tgz", - "integrity": "sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A==", + "version": "4.41.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.3.tgz", + "integrity": "sha512-EcNzP9jGoxpQAXq1VOoTet0ik7/VVU1MovIfcUSAjLowc7GhcQku/sOXALvq5nPpSei2HF6VRhibeJSC3i/Law==", "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/helper-module-context": "1.8.5", @@ -19923,9 +21542,19 @@ "node-libs-browser": "^2.2.1", "schema-utils": "^1.0.0", "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.1", + "terser-webpack-plugin": "^1.4.3", "watchpack": "^1.6.0", "webpack-sources": "^1.4.1" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "requires": { + "minimist": "^1.2.5" + } + } } }, "webpack-cli": { @@ -20103,6 +21732,14 @@ "version": "2.4.4", "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" + }, + "mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "requires": { + "minimist": "^1.2.5" + } } } }, @@ -20236,32 +21873,6 @@ } } }, - "websocket": { - "version": "github:web3-js/WebSocket-Node#905deb4812572b344f5801f8c9ce8bb02799d82e", - "from": "github:web3-js/WebSocket-Node#polyfill/globalThis", - "requires": { - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "nan": "^2.14.0", - "typedarray-to-buffer": "^3.1.5", - "yaeti": "^0.0.6" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, "websocket-driver": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", @@ -20289,8 +21900,7 @@ "whatwg-fetch": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==", - "dev": true + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" }, "whatwg-mimetype": { "version": "2.3.0", @@ -20522,6 +22132,16 @@ "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", "requires": { "mkdirp": "^0.5.1" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "requires": { + "minimist": "^1.2.5" + } + } } }, "write-file-atomic": { @@ -20579,6 +22199,18 @@ "timed-out": "^4.0.1", "url-set-query": "^1.0.0", "xhr": "^2.0.4" + }, + "dependencies": { + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + } } }, "xhr-request-promise": { @@ -20589,6 +22221,11 @@ "xhr-request": "^1.0.1" } }, + "xhr2": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.0.tgz", + "integrity": "sha512-BDtiD0i2iKPK/S8OAZfpk6tyzEDnKKSjxWHcMBVmh+LuqJ8A32qXTyOx+TVOg2dKvq6zGBq2sgKPkEeRs1qTRA==" + }, "xhr2-cookies": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", @@ -20757,6 +22394,36 @@ "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } + }, + "zeroone-contracts": { + "version": "github:Neos1/zeroone-contracts#b3bf7308f9b96dc3faa1563693afb3a74e3712fd", + "from": "github:Neos1/zeroone-contracts#zeroone", + "requires": { + "solc": "^0.6.1", + "solidity-bytes-utils": "0.0.6", + "truffle": "^5.1.8", + "zeroone-translator": "github:Neos1/zeroone-translator#master", + "zeroone-voting-vm": "github:Neos1/zeroone-voting-vm#master" + }, + "dependencies": { + "zeroone-translator": { + "version": "github:Neos1/zeroone-translator#ddf70025bd83f05e5546240b027e583f7074f794", + "from": "github:Neos1/zeroone-translator#master" + } + } + }, + "zeroone-translator": { + "version": "github:Neos1/zeroone-translator#ddf70025bd83f05e5546240b027e583f7074f794", + "from": "github:Neos1/zeroone-translator" + }, + "zeroone-voting-vm": { + "version": "github:Neos1/zeroone-voting-vm#abaa67309763c0f1ce3921cd69998508ea7ce83e", + "from": "github:Neos1/zeroone-voting-vm#master", + "requires": { + "solc": "^0.6.1", + "solidity-bytes-utils": "0.0.6", + "truffle": "^5.1.14" + } } } } diff --git a/package.json b/package.json index cf708e48..62825652 100644 --- a/package.json +++ b/package.json @@ -9,16 +9,16 @@ }, "scripts": { "test": "jest", - "dev": "webpack-dev-server --hot --config webpack.dev.js", "build": "webpack --mode=production --config webpack.dev.js && electron-builder", - "electron-dev": "concurrently \"npm run dev\" \"wait-on http://localhost:3000 && electron ./src/electron.js\"", - "electron-build": "electron-builder", + "react-dev": "webpack-dev-server --hot --config webpack.dev.js", + "electron": "electron ./src/electron.js", + "electron-dev": "concurrently \"webpack-dev-server --hot --config webpack.dev.js\" \"wait-on http://localhost:3000 && electron ./src/electron.js\"", "storybook": "start-storybook", "docs": "jsdoc -c ./jsdoc.json" }, "license": "ISC", "dependencies": { - "@babel/core": "^7.6.4", + "@babel/core": "^7.8.7", "@babel/preset-react": "^7.6.3", "@babel/preset-stage-0": "^7.0.0", "@namics/stylelint-bem": "^6.1.0", @@ -27,27 +27,42 @@ "electron-is-dev": "^1.1.0", "electron-localshortcut": "^3.1.0", "eslint-plugin-jest": "^23.1.1", + "ethereumjs-common": "^1.5.0", "ethereumjs-tx": "^2.1.1", "ethereumjs-util": "^6.2.0", "ethereumjs-wallet": "^0.6.3", "i18next": "^19.0.0", "i18next-xhr-backend": "^3.2.2", + "litepicker": "^1.0.29", "mobx": "^5.15.0", "mobx-react": "^6.1.4", "mobx-react-form": "^2.0.8", "mobx-utils": "^5.5.1", + "moment": "^2.24.0", "prop-types": "^15.7.2", + "query-string": "^6.9.0", "react": "^16.10.2", + "react-collapse": "^5.0.0", + "react-copy-to-clipboard": "^5.0.2", "react-dom": "^16.10.2", "react-i18next": "^11.1.0", + "react-id-generator": "^3.0.0", + "react-js-pagination": "^3.0.2", "react-portal": "^4.2.0", "react-router-dom": "^5.1.2", + "react-tabs": "^3.0.0", + "recharts": "^2.0.0-beta.1", + "solc": "^0.6.1", "stylelint-config-rational-order": "^0.1.2", "stylelint-config-standard": "^19.0.0", "validatorjs": "^3.17.1", - "web3": "^1.0.0-beta.34", + "web3": "^1.2.4", + "web3-utils": "^1.2.4", "webpack": "^4.41.2", - "webpack-dev-server": "^3.8.2" + "webpack-dev-server": "^3.8.2", + "zeroone-contracts": "github:Neos1/zeroone-contracts#zeroone", + "zeroone-translator": "github:Neos1/zeroone-translator", + "zeroone-voting-vm": "github:Neos1/zeroone-voting-vm#master" }, "devDependencies": { "@babel/plugin-proposal-class-properties": "^7.5.5", @@ -60,7 +75,7 @@ "better-docs": "^1.3.3", "clean-webpack-plugin": "^3.0.0", "concurrently": "^5.0.0", - "copy-webpack-plugin": "^5.0.4", + "copy-webpack-plugin": "^5.1.1", "cross-env": "^6.0.3", "css-loader": "^3.2.0", "electron": "^3.0.11", @@ -71,13 +86,14 @@ "eslint-config-airbnb": "^18.0.1", "eslint-loader": "^3.0.2", "eslint-plugin-import": "^2.18.2", + "eslint-plugin-jsdoc": "^18.1.3", "eslint-plugin-jsx-a11y": "^6.2.3", "eslint-plugin-react": "^7.16.0", "eslint-plugin-react-hooks": "^1.7.0", "jest": "^24.9.0", "jest-css-modules": "^2.1.0", "jsdoc": "^3.6.3", - "node-sass": "^4.12.0", + "node-sass": "^4.13.1", "sass-loader": "^8.0.0", "style-loader": "^1.0.0", "wait-on": "^3.3.0", @@ -109,15 +125,19 @@ "appId": "ZeroOne", "files": [ "build/**/*", - "src/wallets/**/*", - "src/contracts/**/*", - "src/config.json", - "src/electron.js" + "src/electron.js", + "src/splash.html" + ], + "extraResources": [ + "build/wallets/**/*", + "build/contracts/**/*", + "build/config.json", + "node_modules/zeroone-contracts/**/*", + "node_modules/zeroone-voting-vm/**/*", + "node_modules/zeroone-translator**/*" ], "win": { - "target": [ - "portable" - ] + "target": "dir" }, "linux": { "target": "deb" @@ -131,8 +151,7 @@ "portable": { "artifactName": "voter_portable--win.exe" }, - "compression": "store", - "asar": false + "compression": "store" }, "jest": { "moduleNameMapper": { diff --git a/src/assets/images/activeTab.svg b/src/assets/images/activeTab.svg new file mode 100644 index 00000000..be16684f --- /dev/null +++ b/src/assets/images/activeTab.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/images/activeVoting.svg b/src/assets/images/activeVoting.svg new file mode 100644 index 00000000..5c86abe4 --- /dev/null +++ b/src/assets/images/activeVoting.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/assets/styles/includes/_fonts.scss b/src/assets/styles/includes/_fonts.scss index b4c0eb13..ffecfc70 100644 --- a/src/assets/styles/includes/_fonts.scss +++ b/src/assets/styles/includes/_fonts.scss @@ -1,17 +1,3 @@ @import url('https://fonts.googleapis.com/css?family=Roboto+Mono:700&display=swap'); +@import url('https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap&subset=cyrillic'); -@font-face { - font-weight: 300; - font-family: "Grotesk"; - src: url("../fonts/AktivGroteskCorp-Light.ttf"); -} -@font-face { - font-weight: 400; - font-family: "Grotesk"; - src: url("../fonts/AktivGroteskCorp-Regular.ttf"); -} -@font-face { - font-weight: 700; - font-family: "Grotesk"; - src: url("../fonts/AktivGroteskCorp-Bold.ttf"); -} diff --git a/src/assets/styles/includes/_mixin.scss b/src/assets/styles/includes/_mixin.scss new file mode 100644 index 00000000..ea0778c4 --- /dev/null +++ b/src/assets/styles/includes/_mixin.scss @@ -0,0 +1,59 @@ +@import '../partials/variables'; + +@mixin scrollbar { + &::-webkit-scrollbar { + width: 20px; + } + + /* Track */ + &::-webkit-scrollbar-track { + background: #fff; + border: 2px solid #f1f1f1; + } + + /* Handle */ + &::-webkit-scrollbar-thumb { + background-image: url(../../assets/images/thumb.png); + background-repeat: no-repeat; + background-position: center; + border: 1px solid $border; + } + + &::-webkit-scrollbar-button:vertical:decrement{ + width: 20px; + height: 20px; + background-image: url(../../assets/images/scrollbarBtn.svg); + background-repeat: no-repeat; + background-position: center; + background-size: cover; + } + + &::-webkit-scrollbar-button:vertical:increment{ + position: relative; + width: 20px; + height: 20px; + background-image: url(../../assets/images/scrollbarBtnDown.svg); + background-repeat: no-repeat; + background-position: center; + background-size: cover; + } +} + +@mixin title { + margin-top: 18px; + margin-bottom: 8px; + color: #000; + font-weight: 700; + font-size: 24px; + font-family: "Roboto"; + line-height: 28px; + text-align: center; +} + +@mixin clearfix { + &::after { + display: block; + clear: both; + content: ""; + } +} \ No newline at end of file diff --git a/src/assets/styles/partials/_variables.scss b/src/assets/styles/partials/_variables.scss index 354989c4..ef5edd4b 100644 --- a/src/assets/styles/partials/_variables.scss +++ b/src/assets/styles/partials/_variables.scss @@ -1,6 +1,7 @@ $primary: #000; $secondary: #4d4d4d; $white: #fff; +$gray: #c8c9ca; $grey: rgba( $color: $primary, diff --git a/src/assets/styles/style.scss b/src/assets/styles/style.scss index c6318625..091b06d5 100644 --- a/src/assets/styles/style.scss +++ b/src/assets/styles/style.scss @@ -6,7 +6,13 @@ margin: 0; padding: 0; font-weight: 400; - font-family: "Grotesk"; + font-family: "Roboto"; +} + +html, +body, +#root { + height: 100%; } body { @@ -43,6 +49,223 @@ a { } svg { - width: 18px; - height: 18px; + width: 20px; + height: 20px; +} + +.step-indicator { + position: absolute; + bottom: 100%; + left: 50%; + color: #808080; + font-size: 12px; + text-align: center; + transform: translate(-50%, 30%); +} + +.progress-block{ + position: relative; + display: inline-block; + width: 80px; + height: 80px; + transition: .3s linear; + + .progress-line{ + position: relative; + top: 50%; + left: -96px; + width: 96px; + height: 4px; + overflow: hidden; + border: unset; + transform: translateY(-50%); + opacity: 0; + transition: .3s ease-in; + + &::after { + position: absolute; + top: 2px; + left: -100%; + z-index: 1; + width: 200%; + height: 2px; + background-image: linear-gradient(90deg, #000, #000 75%, transparent 75%, transparent 100%); + background-size: 4px 2px; + animation: ticker-animation 6s linear; + animation-play-state: running; + animation-delay: 0s; + animation-iteration-count: infinite; + content: ''; + } + } + + &__icon { + position: absolute; + top: 50%; + left: 50%; + display: inline-block; + transform: translate(-50%, -50%); + + & > svg { + width: 42px; + height: 42px; + + path { + transition: .2s; + fill: rgba($color: $primary, $alpha: .5); + } + } + } + + &>svg { + position: absolute; + top: 0%; + left: 50%; + width: 80px; + height: 80px; + transform: translate(-50%, 0%) scale(1); + } + + .stroke-still { + stroke-dasharray: 2; + stroke-width: 4; + transition: .2s; + stroke: rgba($color: $primary, $alpha: .5); + } + + & > img { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + opacity: .5; + } + + &>p{ + width: 100%; + margin: 90px 0 0; + color: #37474F; + font-size: 12px; + opacity: .5; + + span { + display: block; + margin-bottom: 10px; + } + + &+strong { + display: inline-block; + width: 165%; + margin: 5px 0 0 -35%; + } + } + + &.success{ + .progress-block__icon { + &>svg { + path { + fill: rgba($color: $primary, $alpha: 1); + } + } + } + + .stroke-still { + stroke-dasharray: 0; + stroke: rgba($color: $primary, $alpha: 1); + } + + & > img { + opacity: 1; + } + + .progress-line{ + width: 96px; + border: unset; + opacity: 1; + + &::after { + background-color: $primary; + background-image: unset; + } + } + + &>p{ + color: $primary; + opacity: 1; + } + } + &.active{ + & > img { + opacity: 1; + } + + .progress-block__icon { + svg { + path { + fill: $primary + } + } + } + + .progress-line { + opacity: 1; + } + + .stroke-still { + stroke: transparent; + } + + .stroke-animation { + stroke-width: 4; + transform-origin: center center; + animation: stroke-spacing 6s linear, stroke-color 6s linear; + animation-play-state: running; + animation-delay: 0s; + animation-iteration-count: infinite; + } + + &>p{ + color: $primary; + opacity: 1; + } + } +} + +.ReactCollapse--collapse { + transition: height 500ms; +} + +@keyframes stroke-spacing { + 0% { + stroke-dasharray: 2; + } + 100% { + stroke-dashoffset: -108; + stroke-dasharray: 2; + } +} + + +@keyframes stroke-color { + 0% { stroke: $primary; } + 24% { stroke: $primary; } + 25% { stroke: $primary; } + 49% { stroke: $primary; } + 50% { stroke: $primary; } + 74% { stroke: $primary; } + 75% { stroke: $primary; } + 99% { stroke: $primary; } +} + +@keyframes ticker-animation { + 0% { + left: -100%; + } + 100% { + left: 0; + } +} + +::-webkit-scrollbar-thumb { + border: 1px solid $border; } \ No newline at end of file diff --git a/src/components/AddExisitingProject/index.js b/src/components/AddExisitingProject/index.js index baa72b36..e0263d91 100644 --- a/src/components/AddExisitingProject/index.js +++ b/src/components/AddExisitingProject/index.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; import propTypes from 'prop-types'; -import { NavLink } from 'react-router-dom'; +import { NavLink, Redirect } from 'react-router-dom'; import { inject, observer } from 'mobx-react'; import { withTranslation } from 'react-i18next'; import Button from '../Button/Button'; @@ -23,9 +23,7 @@ import styles from '../Login/Login.scss'; class AddExistingProject extends Component { connectForm = new ConnectProjectForm({ hooks: { - onSuccess: (form) => { - this.connectProject(form); - }, + onSuccess: (form) => this.connectProject(form), onError: () => { this.showError(); }, @@ -36,6 +34,7 @@ class AddExistingProject extends Component { default: 0, loading: 1, success: 2, + redirect: 3, } // eslint-disable-next-line react/static-property-placement @@ -44,6 +43,9 @@ class AddExistingProject extends Component { checkProject: propTypes.func.isRequired, addProjectToList: propTypes.func.isRequired, displayAlert: propTypes.func.isRequired, + checkIsQuestionsUploaded: propTypes.func.isRequired, + gotoProject: propTypes.func.isRequired, + setProjectAddress: propTypes.func.isRequired, }).isRequired, t: propTypes.func.isRequired, }; @@ -52,29 +54,36 @@ class AddExistingProject extends Component { super(props); this.state = { currentStep: this.steps.default, + projectName: '', + projectAddress: '', }; } connectProject = (form) => { const { steps } = this; const { appStore, t } = this.props; - const { name, address } = form.values(); + const { name, address: rawAddress } = form.values(); + const address = rawAddress.trim(); this.setState({ currentStep: steps.loading, }); return new Promise((resolve, reject) => { appStore.checkProject(address) .then(() => { - this.setState({ currentStep: steps.success }); + this.setState({ + currentStep: steps.success, + projectAddress: address, + projectName: name, + }); appStore.addProjectToList({ name, address }); - resolve(); + return resolve(); }) .catch(() => { appStore.displayAlert(t('errors:tryAgain'), 3000); - this.state = { + this.setState({ currentStep: steps.default, - }; - reject(); + }); + return reject(); }); }); } @@ -84,8 +93,27 @@ class AddExistingProject extends Component { appStore.displayAlert(t('errors:validationError'), 3000); } + startUploading = (address) => { + const { appStore } = this.props; + appStore.setProjectAddress(address); + this.setState({ currentStep: this.steps.redirect }); + } + + checkProject = async ({ + address, + name, + }) => { + const { appStore } = this.props; + const isQuestionsUploaded = await appStore.checkIsQuestionsUploaded(address); + // eslint-disable-next-line no-unused-expressions + isQuestionsUploaded + ? appStore.gotoProject({ address, name }) + : this.startUploading(address); + } + renderSwitch(step) { const { steps } = this; + const { projectAddress, projectName } = this.state; const { t } = this.props; switch (step) { case steps.default: @@ -100,7 +128,15 @@ class AddExistingProject extends Component { ); case steps.success: - return ; + return ( + + ); + case steps.redirect: + return ; default: return ''; } @@ -121,8 +157,8 @@ class AddExistingProject extends Component { const InputBlock = withTranslation()(({ t, form }) => ( - {t('headings:сonnectProject.heading')} - {t('headings:сonnectProject.subheading')} + {t('headings:connectProject.heading')} + {t('headings:connectProject.subheading')}
@@ -157,13 +193,15 @@ const InputBlock = withTranslation()(({ t, form }) => ( )); -const MessageBlock = withTranslation()(({ t }) => ( +const MessageBlock = withTranslation()(observer(({ + t, onClick, address, name, +}) => ( {t('headings:projectConnected.heading')} {t('headings:projectConnected.subheading')} - @@ -172,7 +210,7 @@ const MessageBlock = withTranslation()(({ t }) => ( -)); +))); InputBlock.propTypes = { form: propTypes.shape({ diff --git a/src/components/Button/Button.js b/src/components/Button/Button.js index 522fa169..4afb07ee 100644 --- a/src/components/Button/Button.js +++ b/src/components/Button/Button.js @@ -1,5 +1,5 @@ import React from 'react'; -import propTypes from 'prop-types'; +import PropTypes from 'prop-types'; import styles from './Button.scss'; @@ -12,16 +12,33 @@ const Button = ({ icon, iconPosition, onClick, + hint, + className, }) => ( // eslint-disable-next-line react/button-has-type +
+
+ {t('other:voteLaunchAdminDescription')} +
+ + ); + } +} + +export default CreateGroupQuestions; diff --git a/src/components/CreateGroupQuestions/CreateGroupQuestions.scss b/src/components/CreateGroupQuestions/CreateGroupQuestions.scss new file mode 100644 index 00000000..6f90303a --- /dev/null +++ b/src/components/CreateGroupQuestions/CreateGroupQuestions.scss @@ -0,0 +1,54 @@ +@import '../../assets/styles/includes/mixin'; + +.create-group-questions { + padding: 61px 30px 33px; + + &__title { + @include title; + + .hint { + margin-left: 16px; + vertical-align: middle; + } + } + + &__subtitle { + max-width: 297px; + margin: 0 auto; + color: rgba(0, 0, 0, 0.7); + font-size: 14px; + line-height: 16px; + text-align: center; + } + + &__subtext { + color: rgba(0, 0, 0, 0.7); + font-size: 11px; + line-height: 13px; + text-align: center; + } + + form { + margin-top: 48px; + } + + button { + width: 100%; + margin-bottom: 8px; + } + + .field { + width: 100%; + margin-bottom: 32px; + + &__input--textarea { + width: 100%; + min-width: 100%; + max-height: 100px; + } + + &--textarea { + margin-bottom: 48px; + } + } +} \ No newline at end of file diff --git a/src/components/CreateGroupQuestions/CreateGroupQuestions.test.js b/src/components/CreateGroupQuestions/CreateGroupQuestions.test.js new file mode 100644 index 00000000..5ff49367 --- /dev/null +++ b/src/components/CreateGroupQuestions/CreateGroupQuestions.test.js @@ -0,0 +1,19 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import CreateGroupQuestions from './CreateGroupQuestions'; + +jest.mock('../../utils/Validator'); + +describe('CreateGroupQuestions', () => { + let wrapper; + + beforeEach(() => { + wrapper = shallow( + , + ).dive(); + }); + + it('should render without error', () => { + expect(wrapper.length).toEqual(1); + }); +}); diff --git a/src/components/CreateGroupQuestions/index.js b/src/components/CreateGroupQuestions/index.js new file mode 100644 index 00000000..2388dc76 --- /dev/null +++ b/src/components/CreateGroupQuestions/index.js @@ -0,0 +1,3 @@ +import CreateGroupQuestions from './CreateGroupQuestions'; + +export default CreateGroupQuestions; diff --git a/src/components/CreateNewProjectWithTokens/InputProjectData.js b/src/components/CreateNewProjectWithTokens/InputProjectData.js new file mode 100644 index 00000000..dfcd288a --- /dev/null +++ b/src/components/CreateNewProjectWithTokens/InputProjectData.js @@ -0,0 +1,70 @@ +import React from 'react'; +import { observer } from 'mobx-react'; +import PropTypes from 'prop-types'; +import { withTranslation } from 'react-i18next'; +import FormBlock from '../FormBlock'; +import Heading from '../Heading'; +import Input from '../Input'; +import { TokenName, Password, BackIcon } from '../Icons'; +import Button from '../Button/Button'; +import Explanation from '../Explanation'; +import CreateProjectForm from '../../stores/FormsStore/CreateProject'; + +import styles from '../Login/Login.scss'; + +@withTranslation() +@observer +class InputProjectData extends React.Component { + static propTypes = { + form: PropTypes.instanceOf(CreateProjectForm).isRequired, + onClick: PropTypes.func.isRequired, + t: PropTypes.func.isRequired, + }; + + render() { + const { props } = this; + const { onClick, form, t } = props; + return ( + + + {t('headings:projectCreating.heading')} + + {t('headings:projectCreating.subheading.0')} +
+ {t('headings:projectCreating.subheading.1')} +
+
+
+ + + + + + +
+ +
+
+ +

+ {t('explanations:project.name')} +

+
+ +

+ {t('explanations:freeze')} +

+
+
+ + +
+ ); + } +} + +export default InputProjectData; diff --git a/src/components/CreateNewProjectWithTokens/index.js b/src/components/CreateNewProjectWithTokens/index.js index 1bdf36f5..2c361f3c 100644 --- a/src/components/CreateNewProjectWithTokens/index.js +++ b/src/components/CreateNewProjectWithTokens/index.js @@ -1,4 +1,5 @@ import React, { Component } from 'react'; +import { observable } from 'mobx'; import { inject, observer } from 'mobx-react'; import propTypes from 'prop-types'; import { NavLink, Redirect } from 'react-router-dom'; @@ -10,14 +11,14 @@ import Container from '../Container'; import LoadingBlock from '../LoadingBlock'; import Input from '../Input'; import StepIndicator from '../StepIndicator'; -import Explanation from '../Explanation'; import { - BackIcon, Address, TokenName, Password, + BackIcon, Address, } from '../Icons'; import ConnectTokenForm from '../../stores/FormsStore/ConnectToken'; import CreateProjectForm from '../../stores/FormsStore/CreateProject'; import styles from '../Login/Login.scss'; +import InputProjectData from './InputProjectData'; @withTranslation() @inject('userStore', 'appStore') @@ -30,7 +31,7 @@ class CreateNewProjectWithTokens extends Component { }, }); - createProject = new CreateProjectForm({ + @observable createProject = new CreateProjectForm({ hooks: { onSuccess: (form) => this.gotoUploading(form), onError: () => {}, @@ -63,7 +64,8 @@ class CreateNewProjectWithTokens extends Component { checkToken = (form) => { const { steps } = this; - const { address } = form.values(); + const { address: rawAddress } = form.values(); + const address = rawAddress.trim(); const { appStore } = this.props; this.setState({ currentStep: steps.check, @@ -149,7 +151,7 @@ class CreateNewProjectWithTokens extends Component { render() { const { steps } = this; const { currentStep, indicatorStep } = this.state; - if (currentStep === steps.uploading) return ; + if (currentStep === steps.uploading) return ; return (
@@ -209,44 +211,6 @@ const ContractConfirmation = inject('appStore')(observer(withTranslation()(({ t, )))); -const InputProjectData = withTranslation()(({ - t, form, onClick, -}) => ( - - - {t('headings:projectCreating.heading')} - - {t('headings:projectCreating.subheading.0')} -
- {t('headings:projectCreating.subheading.1')} -
-
-
- - - - - - -
- -
-
- -

- {t('explanations:project.name')} -

-
-
- - -
-)); - CreateNewProjectWithTokens.propTypes = { appStore: propTypes.shape({ checkErc: propTypes.func.isRequired, @@ -275,12 +239,5 @@ InputTokenAddress.propTypes = { ContractConfirmation.propTypes = { onSubmit: propTypes.func.isRequired, }; -InputProjectData.propTypes = { - form: propTypes.shape({ - $: propTypes.func.isRequired, - onSubmit: propTypes.func.isRequired, - }).isRequired, - onClick: propTypes.func.isRequired, -}; export default CreateNewProjectWithTokens; diff --git a/src/components/CreateNewProjectWithoutTokens/index.js b/src/components/CreateNewProjectWithoutTokens/index.js index cc2286a7..8f15194c 100644 --- a/src/components/CreateNewProjectWithoutTokens/index.js +++ b/src/components/CreateNewProjectWithoutTokens/index.js @@ -1,3 +1,4 @@ +/* eslint-disable react/sort-comp */ import React, { Component } from 'react'; import { inject, observer } from 'mobx-react'; import propTypes from 'prop-types'; @@ -16,6 +17,8 @@ import { } from '../Icons'; import CreateTokenForm from '../../stores/FormsStore/CreateToken'; import CreateProjectForm from '../../stores/FormsStore/CreateProject'; +import AppStore from '../../stores/AppStore/AppStore'; +import UserStore from '../../stores/UserStore'; import styles from '../Login/Login.scss'; @@ -23,6 +26,12 @@ import styles from '../Login/Login.scss'; @inject('userStore', 'appStore') @observer class CreateNewProjectWithoutTokens extends Component { + static propTypes = { + appStore: propTypes.instanceOf(AppStore).isRequired, + userStore: propTypes.instanceOf(UserStore).isRequired, + t: propTypes.func.isRequired, + }; + form = new CreateTokenForm({ hooks: { onSuccess: (form) => this.createToken(form), @@ -42,6 +51,7 @@ class CreateNewProjectWithoutTokens extends Component { creation: 2, tokenCreated: 3, projectInfo: 4, + uploading: 5, } constructor(props) { @@ -180,8 +190,9 @@ class CreateNewProjectWithoutTokens extends Component { } render() { + const { steps } = this; const { currentStep, indicatorStep } = this.state; - if (currentStep === 'uploading') return ; + if (currentStep === steps.uploading) return ; return (
@@ -196,7 +207,9 @@ class CreateNewProjectWithoutTokens extends Component { const CreateTokenData = withTranslation()(inject('userStore', 'appStore')(observer((({ t, userStore: { address }, appStore: { balances }, form, }) => ( - + {t('headings:newTokens.heading')} {t('headings:newTokens.subheading')} @@ -328,6 +341,7 @@ const InputProjectData = withTranslation()(({ theme="back" icon={} onClick={onClick} + disabled={form.loading} > {t('buttons:back')} @@ -335,24 +349,6 @@ const InputProjectData = withTranslation()(({ )); -CreateNewProjectWithoutTokens.propTypes = { - appStore: propTypes.shape({ - deployContract: propTypes.func.isRequired, - checkReceipt: propTypes.func.isRequired, - deployArgs: propTypes.arrayOf(propTypes.any).isRequired, - displayAlert: propTypes.func.isRequired, - setProjectName: propTypes.func.isRequired, - password: propTypes.string.isRequired, - setDeployArgs: propTypes.func.isRequired, - }).isRequired, - userStore: propTypes.shape({ - readWallet: propTypes.func.isRequired, - checkBalance: propTypes.func.isRequired, - address: propTypes.string.isRequired, - setPassword: propTypes.func.isRequired, - }).isRequired, - t: propTypes.func.isRequired, -}; CreateTokenData.propTypes = { form: propTypes.shape({ onSubmit: propTypes.func.isRequired, @@ -360,9 +356,11 @@ CreateTokenData.propTypes = { loading: propTypes.bool.isRequired, }).isRequired, }; + TokenCreationAlert.propTypes = { onSubmit: propTypes.func.isRequired, }; + InputProjectData.propTypes = { form: propTypes.shape({ $: propTypes.func.isRequired, diff --git a/src/components/CreateNewQuestion/CreateNewQuestion.js b/src/components/CreateNewQuestion/CreateNewQuestion.js new file mode 100644 index 00000000..4258cf51 --- /dev/null +++ b/src/components/CreateNewQuestion/CreateNewQuestion.js @@ -0,0 +1,126 @@ +/* eslint-disable react/static-property-placement */ +import React from 'react'; +import PropTypes from 'prop-types'; +import { withTranslation } from 'react-i18next'; +import { inject, observer } from 'mobx-react'; +import SimpleDropdown from '../SimpleDropdown'; +import { QuestionIcon } from '../Icons'; +import CreateNewQuestionForm from './CreateNewQuestionForm'; +import StepIndicator from '../StepIndicator'; + +import styles from './CreateNewQuestion.scss'; + +/** + * Component for creating a new question + * + * @param selected + */ +@withTranslation() +@inject('projectStore') +@observer +class CreateNewQuestion extends React.Component { + static propTypes = { + t: PropTypes.func.isRequired, + projectStore: PropTypes.shape().isRequired, + }; + + constructor() { + super(); + this.state = { + isSelected: false, + activeTab: 0, + selectedGroup: 0, + }; + } + + handleDropdownSelect = (selected) => { + this.setState({ isSelected: true, selectedGroup: selected.value }); + } + + /** + * Method for toggle active tab + * + * @param {number} number index active tab + */ + toggleActiveTab = (number) => { + this.setState({ activeTab: number }); + } + + render() { + const { isSelected, activeTab, selectedGroup } = this.state; + const { props } = this; + const { t, projectStore: { questionStore } } = props; + return ( +
+
+
+

+ {t('other:createANewQuestion')} +

+ { + isSelected + ? ( + <> +
+ {t('other:basicInfo')} +
+
+ +
+ + ) + : null + } +
+
+
+ + + +
+ { + isSelected + ? ( +
+ {/* TODO change to description for selected group questions */} + Description text +
+ ) + : null + } +
+
+
+ { + isSelected + ? ( + this.toggleActiveTab(0)} + /> + ) + : ( +
+

+ {t('other:selectQuestionGroup')} +

+
+ ) + } +
+
+ ); + } +} + +export default CreateNewQuestion; diff --git a/src/components/CreateNewQuestion/CreateNewQuestion.scss b/src/components/CreateNewQuestion/CreateNewQuestion.scss new file mode 100644 index 00000000..fef3e663 --- /dev/null +++ b/src/components/CreateNewQuestion/CreateNewQuestion.scss @@ -0,0 +1,212 @@ +@import "../../assets/styles/partials/variables"; +@import "../../assets/styles/includes/mixin"; + +.create-question { + width: 100%; + padding: 40px 60px 0; + + &__top { + display: inline-block; + width: 100%; + margin: 0 -15px; + + .dropdown { + width: 100%; + } + + &-left, + &-right { + display: inline-block; + width: 50%; + padding: 0 15px; + text-align: left; + vertical-align: top; + } + } + + &__title { + color: $primary; + font-weight: 700; + font-size: 36px; + line-height: 42px; + } + + &__sub-title { + margin-top: 8px; + margin-bottom: 13px; + color: rgba(0, 0, 0, 0.7); + font-size: 14px; + line-height: 16px; + } + + &__content { + min-height: 324px; + padding: 10px 0; + + &--empty { + height: 100%; + max-height: 324px; + text-align: center; + + &::after { + display: inline-block; + height: 100%; + vertical-align: middle; + content: ''; + } + + &-text { + display: inline-block; + max-width: 261px; + color: rgba(0, 0, 0, 0.7); + font-weight: 300; + font-size: 18px; + line-height: 21px; + vertical-align: middle; + } + } + } + + &__description { + margin-top: 9px; + margin-bottom: 10px; + color: rgba(0, 0, 0, 0.7); + font-size: 11px; + line-height: 13px; + } + + &__step-progress { + .step-indicator { + position: relative; + left: unset; + text-align: left; + transform: unset; + } + + p { + &:first-child { + display: inline-block; + margin: 8px 13px; + } + + &:last-child { + float: left; + } + } + } + + &__field-remove { + position: absolute; + top: 50%; + padding: 15px 8px; + background-color: transparent; + border: unset; + outline: none; + transform: translateY(-50%); + cursor: pointer; + opacity: 0; + transition: opacity 0.2s; + + svg { + width: 10px; + height: 10px; + } + } + + &__field-description { + margin-top: 8px; + padding: 11px 18px 10px; + color: rgba(0, 0, 0, 0.7); + font-weight: 300; + font-size: 11px; + line-height: 13px; + background: #fff; + border: 1px dashed #000; + } + + &__form { + &--basic { + padding-top: 49px; + padding-bottom: 20px; + } + + &--dynamic { + padding-top: 46px; + padding-bottom: 29px; + } + + .field { + width: 100%; + + &__input--textarea { + width: 100%; + min-width: 100%; + } + } + + .dropdown { + width: 100%; + } + + &-row { + position: relative; + margin: 0 -15px; + padding: 15px 0; + text-align: left; + + &:hover { + .create-question__field-remove { + opacity: 1; + } + } + } + + &-col { + display: inline-block; + width: 50%; + padding: 0 15px; + vertical-align: top; + + &--full { + width: 100%; + } + + button { + width: 100%; + } + } + + &-text { + margin-top: 8px; + padding: 0 10px; + color: rgba(0, 0, 0, 0.7); + font-size: 11px; + line-height: 13px; + text-align: center; + } + } + + &__button-new-param { + margin-bottom: 26px; + padding: 8px 0; + color: $placeholderColor; + font-size: 14px; + line-height: 16px; + text-align: left; + background-color: transparent; + border: unset; + border-bottom: 1px solid $placeholderColor; + outline: none; + cursor: pointer; + transition: color 0.2s, border-color 0.2s; + + &:hover, + &:active { + color: $primary; + border-bottom: 1px solid $primary; + } + } +} +.extra-padding { + padding-top: 20px; +} diff --git a/src/components/CreateNewQuestion/CreateNewQuestion.test.js b/src/components/CreateNewQuestion/CreateNewQuestion.test.js new file mode 100644 index 00000000..f9ac077a --- /dev/null +++ b/src/components/CreateNewQuestion/CreateNewQuestion.test.js @@ -0,0 +1,31 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import CreateNewQuestion from './CreateNewQuestion'; + +describe('CreateNewQuestion', () => { + let wrapper; + let wrapperInstance; + + beforeEach(() => { + wrapper = shallow( + , + ).dive(); + wrapperInstance = wrapper.instance(); + }); + + it('should render without error', () => { + expect(wrapper.length).toEqual(1); + }); + + it('handleDropdownSelect should change isSelected to true', () => { + expect(wrapperInstance.state.isSelected).toEqual(false); + wrapperInstance.handleDropdownSelect(); + expect(wrapperInstance.state.isSelected).toEqual(true); + }); + + it('toggleActiveTab with (1) should change activeTab to 1', () => { + expect(wrapperInstance.state.activeTab).toEqual(0); + wrapperInstance.toggleActiveTab(1); + expect(wrapperInstance.state.activeTab).toEqual(1); + }); +}); diff --git a/src/components/CreateNewQuestion/CreateNewQuestionForm.js b/src/components/CreateNewQuestion/CreateNewQuestionForm.js new file mode 100644 index 00000000..6f21b7bd --- /dev/null +++ b/src/components/CreateNewQuestion/CreateNewQuestionForm.js @@ -0,0 +1,214 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable react/static-property-placement */ +import React from 'react'; +import PropTypes from 'prop-types'; +import { withTranslation } from 'react-i18next'; +import { observer, inject } from 'mobx-react'; +import CreateQuestionBasicForm from '../../stores/FormsStore/CreateQuestionBasicForm'; +import CreateQuestionDynamicForm from '../../stores/FormsStore/CreateQuestionDynamicForm'; +import FormBasic from './FormBasic'; +import Question from '../../services/ContractService/entities/Question'; +import FormDynamic from './FormDynamic'; +import { systemQuestionsId } from '../../constants'; + +import styles from './CreateNewQuestion.scss'; + +@withTranslation() +@inject('dialogStore', 'projectStore') +@observer +class CreateNewQuestionForm extends React.PureComponent { + /** Form with basic info for new question */ + + formBasic = new CreateQuestionBasicForm({ + hooks: { + onSuccess: (form) => { + this.onBasicSubmit(form); + const { data: { groupId } } = this; + return Promise.resolve(); + }, + onError: () => { + console.log('error'); + }, + }, + }) + + /** Form with additional info for new question */ + formDynamic = new CreateQuestionDynamicForm({ + hooks: { + onSuccess: (form) => { + this.onDynamicSubmit(form); + return Promise.resolve(); + }, + onError: () => { + console.log('error'); + }, + }, + }); + + static propTypes = { + /** Current active tab */ + activeTab: PropTypes.number.isRequired, + /** Method called on toggle tab */ + onToggle: PropTypes.func.isRequired, + /** Method called on success fill all data */ + onComplete: PropTypes.func.isRequired, + dialogStore: PropTypes.shape({ + toggle: PropTypes.func.isRequired, + }).isRequired, + projectStore: PropTypes.shape().isRequired, + selectedGroup: PropTypes.number.isRequired, + }; + + constructor(props) { + super(props); + this.data = { + name: '', + description: '', + groupId: '', + time: 0, + formula: '', + target: '', + methodSelector: '', + }; + } + + /** + * Action on basic form submit + * + * @param form + */ + onBasicSubmit = (form) => { + const { props, data } = this; + const { selectedGroup } = props; + const { onToggle } = props; + const { + question_title: Name, + question_life_time: time, + description, + target, + methodSelector, + voting_formula: formula, + } = form.values(); + data.name = Name.trim(); + data.time = time; + data.formula = formula.trim(); + data.target = target.trim(); + data.description = description.trim(); + data.methodSelector = methodSelector.trim() || '0x00000000'; + data.groupId = selectedGroup; + onToggle(1); + } + + /** + * Method for getting uniq key for + * similar fields (input & select) + * + * @param {string} key name field + * @returns {string} uniq key for + * select & input + */ + getUniqKey = (key) => { + if (!key || !key.split) return ''; + return key.split('--')[1] || ''; + } + + /** + * Method for getting parameters array + * from form with dynamic fields + * + * @param {object} form form + * @returns {Array} array parameters + */ + getParametersFromForm = (form) => { + let values; + if (form.values()) { + values = form.values(); + } else { + values = {}; + } + const paramTypes = []; + const paramNames = []; + Object.keys(values).forEach((key, index) => { + if (Number.isInteger(index / 2) === false) return; + const uniqKey = this.getUniqKey(key); + const selectValue = values[`select--${uniqKey}`]; + const inputValue = values[`input--${uniqKey}`]; + paramTypes.push(selectValue); + paramNames.push(inputValue); + }); + // parameters = parameters.filter((e) => e !== ''); + return { paramTypes, paramNames }; + } + + /** + * Action on dynamic form submit + * + * @param form + */ + onDynamicSubmit = (form) => { + const { data } = this; + const { + dialogStore, + projectStore: { questionStore, rootStore: { Web3Service, contractService } }, + projectStore, + onComplete, + } = this.props; + const futureQuestionId = questionStore.questions.length + 1; + const { paramTypes, paramNames } = this.getParametersFromForm(form); + const question = new Question({ + id: futureQuestionId, + group: data.groupId, + name: data.name, + caption: data.description, + time: Number(data.time), + method: data.methodSelector, + formula: data.formula, + paramTypes, + paramNames, + }); + const rawVotingData = question.getUploadingParams(data.target); + const votingData = Web3Service.web3.eth.abi.encodeParameters( + ['tuple(uint, uint, uint, uint, uint)', 'tuple(bool, string, string, uint, uint, string[], string[], address, bytes4, string, bytes)'], + [[0, 0, 0, 0, 0], rawVotingData], + ); + projectStore.setVotingData(systemQuestionsId.addingNewQuestion, 0, votingData); + dialogStore.toggle('password_form_questions'); + this.formBasic.clear(); + form.clear(); + onComplete(); + } + + renderStep = () => { + const { props, formBasic, formDynamic } = this; + const { activeTab, onToggle } = props; + switch (activeTab) { + case 0: + return ( + + ); + case 1: + return ( + + ); + default: + return ( + + ); + } + } + + render() { + return ( +
+ {this.renderStep()} +
+ ); + } +} + +export default CreateNewQuestionForm; diff --git a/src/components/CreateNewQuestion/CreateNewQuestionForm.test.js b/src/components/CreateNewQuestion/CreateNewQuestionForm.test.js new file mode 100644 index 00000000..81ccb782 --- /dev/null +++ b/src/components/CreateNewQuestion/CreateNewQuestionForm.test.js @@ -0,0 +1,65 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import CreateNewQuestionForm from './CreateNewQuestionForm'; +import FormBasic from './FormBasic'; +import FormDynamic from './FormDynamic'; + +jest.mock('../../utils/Validator'); + +describe('CreateNewQuestionForm', () => { + describe('With activeTab 0', () => { + let wrapper; + let mockOnToggle; + let wrapperInstance; + + beforeEach(() => { + mockOnToggle = jest.fn(); + wrapper = shallow( + , + ).dive(); + wrapperInstance = wrapper.instance(); + }); + + it('should render without error with correct form', () => { + expect(wrapper.length).toEqual(1); + expect(wrapper.find(FormBasic).length).toEqual(1); + expect(wrapper.find(FormDynamic).length).toEqual(0); + }); + + it('onBasicSubmit should call mockOnToggle with 1', () => { + wrapperInstance.onBasicSubmit(); + expect(mockOnToggle).toHaveBeenCalledWith(1); + }); + }); + + describe('With activeTab 1', () => { + let wrapper; + let mockOnToggle; + let wrapperInstance; + + beforeEach(() => { + mockOnToggle = jest.fn(); + wrapper = shallow( + , + ).dive(); + wrapperInstance = wrapper.instance(); + }); + + it('should render without error with correct form', () => { + expect(wrapper.length).toEqual(1); + expect(wrapper.find(FormBasic).length).toEqual(0); + expect(wrapper.find(FormDynamic).length).toEqual(1); + }); + + it('onBasicSubmit should call mockOnToggle with 1', () => { + wrapperInstance.onBasicSubmit(); + expect(mockOnToggle).toHaveBeenCalledWith(1); + }); + }); +}); diff --git a/src/components/CreateNewQuestion/FormBasic.js b/src/components/CreateNewQuestion/FormBasic.js new file mode 100644 index 00000000..de926072 --- /dev/null +++ b/src/components/CreateNewQuestion/FormBasic.js @@ -0,0 +1,128 @@ +import React from 'react'; +import { withTranslation, Trans } from 'react-i18next'; +import PropTypes from 'prop-types'; +import { inject, observer } from 'mobx-react'; +import Input from '../Input'; +// import { SquareHint } from '../Hint'; +import { TokenName, DateIcon, Address } from '../Icons'; +import InputTextarea from '../Input/InputTextarea'; +import Button from '../Button/Button'; + +import styles from './CreateNewQuestion.scss'; +import { FormulaHint, SelectorHint } from '../Hint'; + +@withTranslation() +@inject('projectStore') +@observer +class FormBasic extends React.Component { + static propTypes = { + formBasic: PropTypes.shape({ + onSubmit: PropTypes.func.isRequired, + $: PropTypes.func.isRequired, + }).isRequired, + t: PropTypes.func.isRequired, + projectStore: PropTypes.shape({ + historyStore: PropTypes.shape({ + isVotingActive: PropTypes.bool.isRequired, + }), + }).isRequired, + }; + + render() { + const { props } = this; + const { formBasic, t, projectStore: { historyStore } } = props; + return ( +
+
+
+ + + +
+
+ + + +
+
+
+
+ } + > +
+ + { + !formBasic.$('methodSelector').error + ? ( +
+ {t('other:selectorNonexistentFunctionDescription')} +
+ ) + : null + } +
+
+ +
+ +
+
+
+
+ } + /> +
+
+ +
+
+
+
+
+ +
+
+ + ); + } +} + +export default FormBasic; diff --git a/src/components/CreateNewQuestion/FormBasic.test.js b/src/components/CreateNewQuestion/FormBasic.test.js new file mode 100644 index 00000000..39c2e674 --- /dev/null +++ b/src/components/CreateNewQuestion/FormBasic.test.js @@ -0,0 +1,24 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import FormBasic from './FormBasic'; +import CreateQuestionBasicForm from '../../stores/FormsStore/CreateQuestionBasicForm'; + +describe('FormBasic', () => { + let wrapper; + let formBasic; + + beforeEach(() => { + formBasic = new CreateQuestionBasicForm({ + hooks: { + onSuccess: () => (Promise.resolve()), + }, + }); + wrapper = shallow( + , + ).dive(); + }); + + it('should render without error', () => { + expect(wrapper.length).toEqual(1); + }); +}); diff --git a/src/components/CreateNewQuestion/FormDynamic.js b/src/components/CreateNewQuestion/FormDynamic.js new file mode 100644 index 00000000..5a2c0e08 --- /dev/null +++ b/src/components/CreateNewQuestion/FormDynamic.js @@ -0,0 +1,210 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { withTranslation, Trans } from 'react-i18next'; +import { observer, inject } from 'mobx-react'; +import uniqKey from 'react-id-generator'; +import Input from '../Input'; +import { TokenName, CloseIcon } from '../Icons'; +import Button from '../Button/Button'; + +import styles from './CreateNewQuestion.scss'; +import SimpleDropdown from '../SimpleDropdown'; + +@withTranslation() +@inject('projectStore') +@observer +class FormDynamic extends React.Component { + static propTypes = { + formDynamic: PropTypes.shape({ + onSubmit: PropTypes.func.isRequired, + $: PropTypes.func.isRequired, + map: PropTypes.func.isRequired, + add: PropTypes.func.isRequired, + del: PropTypes.func.isRequired, + }).isRequired, + t: PropTypes.func.isRequired, + onToggle: PropTypes.func.isRequired, + projectStore: PropTypes.shape({ + historyStore: PropTypes.shape({ + isVotingActive: PropTypes.bool.isRequired, + }), + }).isRequired, + }; + + /** + * Method for adding new fields (input & select) + * to dynamic form + */ + addDynamicFields = () => { + const { props } = this; + const { t, formDynamic } = props; + const key = uniqKey(); + // Add input field + formDynamic.add({ + // this format important!!! + // @see getFieldKey + // @see removeRowFields + name: `input--${key}`, + type: 'text', + label: 'parameter', + placeholder: t('fields:enterNewParameterName'), + rules: 'required', + }); + // Add select field + formDynamic.add({ + // this format important!!! + // @see getFieldKey + // @see removeRowFields + name: `select--${key}`, + type: 'text', + label: 'parameter', + placeholder: t('fields:selectParameterType'), + rules: 'required', + }); + } + + /** + * Method for getting uniq key for + * similar fields (input & select) + * + * @param {string} name name field + * @returns {string} uniq key for + * select & input + */ + getFieldKey = (name) => { + if (!name || !name.split) return ''; + return name.split('--')[1] || ''; + } + + /** + * Method for removing fields + * with similar uniq key (input & select) + * + * @param {string} name name field + */ + removeRowFields = (name) => { + const key = this.getFieldKey(name); + const { props } = this; + const { formDynamic } = props; + formDynamic.del(`input--${key}`); + formDynamic.del(`select--${key}`); + } + + render() { + const { props } = this; + const { + formDynamic, t, onToggle, projectStore: { historyStore }, + } = props; + const options = [{ + label: 'uint', + value: 'uint', + }, { + label: 'String', + value: 'string', + }, { + label: 'Address', + value: 'address', + }, { + label: 'bytes4', + value: 'bytes4', + }, { + label: 'bytes32', + value: 'bytes32', + }]; + return ( +
+ {/* Render dynamic fields start */} + { + formDynamic.map((field, index) => { + const key = this.getFieldKey(field.name); + // Since two fields are added at a time, + // duplicates need to be excluded + // @see addDynamicFields method + if (Number.isInteger(index / 2) === false) return null; + return ( +
+
+ + + +
+
+ {}} + > + + +
+ +
+ ); + }) + } + {/* Render dynamic fields end */} +
+
+ +
+
+
+
+ +
+
+ +
+ {t('other:voteLaunchDescription')} +
+
+
+
+ ); + } +} + +export default FormDynamic; diff --git a/src/components/CreateNewQuestion/FormDynamic.test.js b/src/components/CreateNewQuestion/FormDynamic.test.js new file mode 100644 index 00000000..073d9ea3 --- /dev/null +++ b/src/components/CreateNewQuestion/FormDynamic.test.js @@ -0,0 +1,60 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import FormDynamic from './FormDynamic'; +import CreateQuestionDynamicForm from '../../stores/FormsStore/CreateQuestionDynamicForm'; + +jest.mock('../../utils/Validator'); + +describe('FormDynamic', () => { + let wrapper; + let wrapperInstance; + let formDynamic; + + beforeEach(() => { + formDynamic = new CreateQuestionDynamicForm({ + hooks: { + onSuccess: () => (Promise.resolve()), + }, + }); + wrapper = shallow( + {}} + />, + ).dive(); + wrapperInstance = wrapper.instance(); + }); + + it('should render without error', () => { + expect(wrapper.length).toEqual(1); + }); + + it('addDynamicFields should add fields', () => { + // Ignore error inside mobx (test work correctly!) + console.error = jest.fn(); + expect(formDynamic.fields.size).toEqual(2); + wrapperInstance.addDynamicFields(); + expect(formDynamic.fields.size).toEqual(4); + }); + + it('getFieldKey with some params should be correct', () => { + let result = wrapperInstance.getFieldKey('select--id1'); + expect(result).toEqual('id1'); + result = wrapperInstance.getFieldKey('select-id1'); + expect(result).toEqual(''); + result = wrapperInstance.getFieldKey(undefined); + expect(result).toEqual(''); + result = wrapperInstance.getFieldKey({}); + expect(result).toEqual(''); + result = wrapperInstance.getFieldKey(null); + expect(result).toEqual(''); + }); + + it('removeRowFields should remove fields', () => { + // Ignore error inside mobx (test work correctly!) + console.error = jest.fn(); + expect(formDynamic.fields.size).toEqual(2); + wrapperInstance.removeRowFields('input--0'); + expect(formDynamic.fields.size).toEqual(0); + }); +}); diff --git a/src/components/CreateNewQuestion/index.js b/src/components/CreateNewQuestion/index.js new file mode 100644 index 00000000..0728c1b7 --- /dev/null +++ b/src/components/CreateNewQuestion/index.js @@ -0,0 +1,3 @@ +import CreateNewQuestion from './CreateNewQuestion'; + +export default CreateNewQuestion; diff --git a/src/components/CreateWallet/PasswordForm.js b/src/components/CreateWallet/PasswordForm.js index 36c35e91..8c0464e7 100644 --- a/src/components/CreateWallet/PasswordForm.js +++ b/src/components/CreateWallet/PasswordForm.js @@ -15,6 +15,16 @@ import styles from '../Login/Login.scss'; @withTranslation() class PasswordForm extends Component { + static propTypes = { + state: propTypes.bool.isRequired, + form: propTypes.shape({ + $: propTypes.func.isRequired, + onSubmit: propTypes.func.isRequired, + loading: propTypes.bool.isRequired, + }).isRequired, + t: propTypes.func.isRequired, + }; + constructor(props) { super(props); this.state = { @@ -22,6 +32,15 @@ class PasswordForm extends Component { }; } + componentDidMount() { + const { form } = this.props; + if (form.$('password').value !== '') { + const { value } = form.$('password'); + const validity = passwordValidation(value); + this.setState({ validity }); + } + } + handleInput = (value) => { const validity = passwordValidation(value); this.setState({ validity }); @@ -30,7 +49,6 @@ class PasswordForm extends Component { render() { const { state, form, t } = this.props; const { validity } = this.state; - return ( @@ -65,26 +83,26 @@ class PasswordForm extends Component {
{ t('explanations:passwordCreating.1')}

-

+

  • - + { t('explanations:passwordRules.numeric')}
  • - + { t('explanations:passwordRules.upperCase')}
  • - + { t('explanations:passwordRules.symbol')}
  • - + { t('explanations:passwordRules.length')}
-

+
@@ -101,13 +119,4 @@ class PasswordForm extends Component { } } -PasswordForm.propTypes = { - state: propTypes.bool.isRequired, - form: propTypes.shape({ - $: propTypes.func.isRequired, - onSubmit: propTypes.func.isRequired, - loading: propTypes.bool.isRequired, - }).isRequired, - t: propTypes.func.isRequired, -}; export default PasswordForm; diff --git a/src/components/CreateWallet/index.js b/src/components/CreateWallet/index.js index 38b36b31..eb270ac1 100644 --- a/src/components/CreateWallet/index.js +++ b/src/components/CreateWallet/index.js @@ -1,3 +1,4 @@ +/* eslint-disable react/sort-comp */ import React, { Component } from 'react'; import propTypes from 'prop-types'; import { observer, inject } from 'mobx-react'; @@ -17,6 +18,19 @@ import styles from '../Login/Login.scss'; @inject('userStore', 'appStore') @observer class CreateWallet extends Component { + static propTypes = { + userStore: propTypes.shape({ + recoverWallet: propTypes.func.isRequired, + saveWalletToFile: propTypes.func.isRequired, + createWallet: propTypes.func.isRequired, + }).isRequired, + recover: propTypes.bool, + }; + + static defaultProps = { + recover: false, + }; + createForm = new CreateWalletForm({ hooks: { onSuccess: (form) => this.createWallet(form), @@ -95,13 +109,4 @@ const CreationLoader = withTranslation(['headings'])(({ t }) => (
)); -CreateWallet.propTypes = { - userStore: propTypes.shape({ - recoverWallet: propTypes.func.isRequired, - saveWalletToFile: propTypes.func.isRequired, - createWallet: propTypes.func.isRequired, - }).isRequired, - recover: propTypes.bool.isRequired, -}; - export default CreateWallet; diff --git a/src/components/DatePicker/DatePicker.js b/src/components/DatePicker/DatePicker.js new file mode 100644 index 00000000..3455f269 --- /dev/null +++ b/src/components/DatePicker/DatePicker.js @@ -0,0 +1,273 @@ +import React from 'react'; +import ReactDOMServer from 'react-dom/server'; +import PropTypes from 'prop-types'; +import Litepicker from 'litepicker'; +import moment from 'moment'; +import { observer } from 'mobx-react'; +import { computed, observable, action } from 'mobx'; +import { withTranslation } from 'react-i18next'; +import { getCorrectPickerLocale } from '../../utils/Date'; +import i18n from '../../i18n'; +import { + ThinArrow, + Arrow, + DateIcon, + CloseIcon, +} from '../Icons'; + +import styles from './DatePicker.scss'; + +@withTranslation() +@observer +class DateTest extends React.Component { + @observable start = null; + + @observable end = null; + + ref; + + picker; + + static propTypes = { + t: PropTypes.func.isRequired, + onDatesSet: PropTypes.func.isRequired, + onDatesClear: PropTypes.func.isRequired, + init: PropTypes.shape({ + startDate: PropTypes.instanceOf(moment), + endDate: PropTypes.instanceOf(moment), + }), + }; + + static defaultProps = { + init: { + startDate: null, + endDate: null, + }, + } + + componentDidMount() { + const { props } = this; + const { + init: { + startDate, + endDate, + }, + } = props; + this.picker = new Litepicker({ + element: this.minRef, + elementEnd: this.maxRef, + format: 'DD.MM.YYYY', + firstDay: 1, + numberOfMonths: 2, + numberOfColumns: 2, + minDate: null, + maxDate: null, + minDays: null, + maxDays: null, + singleMode: false, + autoApply: true, + scrollToDate: true, + showWeekNumbers: false, + showTooltip: true, + disableWeekends: false, + splitView: true, + onSelect: this.handleSelect, + buttonText: { + previousMonth: ReactDOMServer.renderToStaticMarkup( + , + ), + nextMonth: ReactDOMServer.renderToStaticMarkup( + , + ), + }, + startDate, + endDate, + }); + this.updateLanguage(); + this.start = startDate; + this.end = endDate; + window.ipcRenderer.on('change-language:confirm', () => { + this.updateLanguage(); + }); + } + + componentWillUnmount() { + window.ipcRenderer.removeListener('change-language:confirm', () => { + this.updateLanguage(); + }); + } + + @computed + get startDate() { + return this.start; + } + + @computed + get endDate() { + return this.end; + } + + /** + * Method for handle date select + * + * @param {Date} startDate start date + * @param {Date} endDate end date + */ + @action + handleSelect = (startDate, endDate) => { + const { props } = this; + const { onDatesSet } = props; + const start = moment(startDate); + // To include the maximum date in the range + const end = moment(endDate) + .add('hours', 23) + .add('minutes', 59) + .add('seconds', 59); + this.start = start; + this.end = end; + onDatesSet({ startDate: start, endDate: end }); + } + + /** + * Method for clearing selected date + */ + @action + handleClear = () => { + const { props } = this; + const { onDatesClear } = props; + if (this.picker) { + this.picker.clearSelection(); + } + this.start = null; + this.end = null; + onDatesClear(); + } + + /** + * Method for getting correct plural + * text for tooltip + * + * @param {string} language actual language + * @returns {object} correct tooltip text + */ + getTooltipText = (language) => { + switch (language) { + case 'ru-RU': + return { + one: 'день', + many: 'дней', + few: 'дня', + }; + case 'en-US': + return { + one: 'day', + other: 'days', + }; + default: + return { + one: 'day', + other: 'days', + }; + } + } + + /** + * Method for update options in picker + * on change language event + */ + updateLanguage = () => { + const lang = getCorrectPickerLocale(i18n.language); + const tooltipText = this.getTooltipText(lang); + if (this.picker) { + this.picker.setOptions({ + lang: getCorrectPickerLocale(i18n.language), + tooltipText, + }); + } + } + + render() { + const { start, end, props } = this; + const { t } = props; + const filled = Boolean(start && end); + return ( +
+ { /* eslint-disable-next-line */} + +
+ +
+ { /* eslint-disable-next-line */} + + +
+ ); + } +} + +export default DateTest; diff --git a/src/components/DatePicker/DatePicker.scss b/src/components/DatePicker/DatePicker.scss new file mode 100644 index 00000000..73a223b1 --- /dev/null +++ b/src/components/DatePicker/DatePicker.scss @@ -0,0 +1,293 @@ +.date-picker { + position: relative; + display: inline-block; + max-width: 240px; + + &__base { + position: relative; + } + + &__input { + position: relative; + display: inline-block; + width: 73px; + padding: 8px 0; + color: #181818; + font-size: 14px; + line-height: 16px; + background: transparent; + border: unset; + outline: none; + transition: border-bottom-color 0.3s; + + &-line { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 1px; + background-color: rgba(0, 0, 0, 0.1); + transition: background-color 0.3s; + } + + &-placeholder { + position: absolute; + top: 50%; + color: rgba(24, 24, 24, 0.5); + font-size: 14px; + line-height: 16px; + transform: translateY(-50%); + cursor: text; + transition: all 0.3s; + } + + &::-webkit-input-placeholder { + color: transparent; + } + + &:focus { + & + .date-picker__input-after { + .date-picker__input-line { + background-color: rgba(0, 0, 0, 1); + } + } + } + + &:focus, + &:not(:placeholder-shown) { + & + .date-picker__input-after { + .date-picker__input-placeholder { + top: 0; + font-size: 9px; + line-height: 11px; + } + } + } + } + + &__min { + margin-left: 22px; + + & + .date-picker__input-after { + .date-picker__input-placeholder { + left: 38px; + } + } + } + + label { + position: relative; + display: inline-block; + vertical-align: middle; + } + + &__arrow { + &--basic { + display: inline-block; + margin-right: 7px; + margin-left: 9px; + vertical-align: middle; + } + + svg { + width: auto; + height: auto; + } + } + + &__icon { + position: relative; + display: inline-block; + vertical-align: middle; + + &::after { + position: absolute; + top: 50%; + right: -10px; + width: 1px; + height: 13px; + background-color: rgba(0, 0, 0, 0.1); + transform: translate(-50%, -50%); + content: ""; + } + } + + &__clear { + position: absolute; + top: 50%; + right: -28px; + padding: 5px; + color: #e1e4e8; + background-color: #fff; + border: 1px solid #e1e4e8; + outline: none; + transform: translateY(-50%); + visibility: hidden; + cursor: pointer; + opacity: 0; + transition: color 0.3s, border-color 0.3s, opacity 0.3s; + + &:hover, + &:active { + color: #000; + border-color: #000; + } + + &--visible { + visibility: visible; + opacity: 1; + } + + svg { + width: 7px; + height: 7px; + } + } +} + +$month-padding: 21px; + +.litepicker { + .container__months { + &.columns-2 { + width: calc((var(--litepickerMonthWidth) * 2) + #{$month-padding * 4}) !important; + margin-top: 12px; + border: 1px solid #e1e4e8; + border-radius: 0; + box-shadow: unset; + } + + .month-item { + position: relative; + padding: 5px $month-padding !important; + + &::after { + position: absolute; + top: 0; + right: 0; + width: 1px; + height: 100%; + background-color: #e1e4e8; + content: ''; + } + + &:last-child { + &::after { + content: none; + } + } + + &-weekdays-row { + position: relative; + + &::after { + position: absolute; + bottom: 0; + left: -$month-padding; + width: calc(100% + #{$month-padding * 2}); + height: 1px; + background-color: #e1e4e8; + content: ''; + } + + & > div { + font-size: 14px; + line-height: 16px; + text-transform: lowercase; + } + } + + .button-previous-month, + .button-next-month { + position: absolute; + top: 9px; + cursor: pointer; + + svg { + width: auto; + height: auto; + } + } + + .button-previous-month { + left: -16px; + } + + .button-next-month { + right: -16px; + margin-top: 1px; + } + } + + .month-item-header { + position: relative; + font-size: 14px; + line-height: 16px; + text-transform: uppercase; + } + } + + .container__days { + .day-item { + font-size: 14px; + line-height: 16px; + border-color: transparent; + border-radius: 0px !important; + box-shadow: unset !important; + + &.is-today { + font-weight: 700; + } + + &:hover { + background-color: rgba(128, 128, 128, 0.8) !important; + } + } + } + + .container__tooltip { + margin-top: -12px; + padding: 5px 8px; + color: #fff; + font-size: 14px; + line-height: 16px; + background-color: #000; + border-radius: 0; + + &::after { + bottom: -10px; + left: calc(50% - 10px); + border-top: 10px solid #000; + border-right: 10px solid transparent; + border-left: 10px solid transparent; + } + + &::before { + content: none; + } + } +} + +:root { + --litepickerBgColor: #fff !important; + --litepickerMonthHeaderTextColor: #000 !important; + --litepickerMonthButton: rgba(0, 0, 0, 0.5) !important; + --litepickerMonthButtonHover: rgba(0, 0, 0, 0.5) !important; + --litepickerMonthWidth: calc(var(--litepickerDayWidth) * 7) !important; + --litepickerMonthWeekdayColor: #c8c9ca !important; + --litepickerDayColor: #000 !important; + --litepickerDayColorHover: #000 !important; + --litepickerDayIsTodayColor: #000 !important; + --litepickerDayIsInRange: rgba(230, 230, 230, 0.8) !important; + --litepickerDayIsLockedColor: rgba(230, 230, 230, 0.2) !important; + --litepickerDayIsBookedColor: #9e9e9e !important; + --litepickerDayIsStartColor: #000 !important; + --litepickerDayIsStartBg: rgba(128, 128, 128, 0.8) !important; + --litepickerDayIsEndColor: #000 !important; + --litepickerDayIsEndBg: rgba(128, 128, 128, 0.8) !important; + --litepickerDayWidth: 32px !important; + --litepickerButtonCancelColor: #000 !important; + --litepickerButtonCancelBg: rgba(128, 128, 128, 0.8) !important; + --litepickerButtonApplyColor: #000 !important; + --litepickerButtonApplyBg: rgba(128, 128, 128, 0.8) !important; +} diff --git a/src/components/DatePicker/index.js b/src/components/DatePicker/index.js new file mode 100644 index 00000000..949a9240 --- /dev/null +++ b/src/components/DatePicker/index.js @@ -0,0 +1,3 @@ +import DatePicker from './DatePicker'; + +export default DatePicker; diff --git a/src/components/Decision/Decision.js b/src/components/Decision/Decision.js new file mode 100644 index 00000000..4a8efae5 --- /dev/null +++ b/src/components/Decision/Decision.js @@ -0,0 +1,47 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { withTranslation } from 'react-i18next'; +import FinPassFormWrapper from '../FinPassFormWrapper/FinPassFormWrapper'; + +import styles from './Decision.scss'; + +@withTranslation() +class Decision extends React.Component { + static propTypes = { + t: PropTypes.func.isRequired, + form: PropTypes.shape().isRequired, + icon: PropTypes.oneOfType([ + () => null, + PropTypes.node, + ]), + title: PropTypes.string.isRequired, + buttonText: PropTypes.string.isRequired, + }; + + static defaultProps = { + icon: null, + } + + render() { + const { props } = this; + const { + t, icon, title, form, buttonText, + } = props; + return ( +
+
+ {icon} +
+

+ {title} +

+

+ {t('other:enterPassForConfirm')} +

+ +
+ ); + } +} + +export default Decision; diff --git a/src/components/Decision/Decision.scss b/src/components/Decision/Decision.scss new file mode 100644 index 00000000..48143e0b --- /dev/null +++ b/src/components/Decision/Decision.scss @@ -0,0 +1,46 @@ +@import '../../assets/styles/includes/mixin'; + +.decision { + width: 100%; + text-align: center; + + &__title { + @include title; + } + + &__subtext { + color: rgba(0, 0, 0, 0.7); + font-size: 14px; + line-height: 16px; + text-align: center; + } + + &__icon { + svg { + width: auto; + height: auto; + margin-top: 47px; + } + } + + &__token-form { + width: 100%; + padding: 0 40px; + .field { + width: 100%; + margin-bottom: 20px; + } + &__group{ + display: flex; + flex-flow: row nowrap; + align-items: center; + justify-content: space-between; + .field{ + width: 45%; + &__input{ + width: 60%; + } + } + } + } +} \ No newline at end of file diff --git a/src/components/Decision/Decision.test.js b/src/components/Decision/Decision.test.js new file mode 100644 index 00000000..0b78456f --- /dev/null +++ b/src/components/Decision/Decision.test.js @@ -0,0 +1,31 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import { DecisionReject, DecisionAgree } from '.'; + +describe('DecisionReject', () => { + let wrapper; + + beforeEach(() => { + wrapper = shallow( + , + ).dive(); + }); + + it('should render without error', () => { + expect(wrapper.length).toEqual(1); + }); +}); + +describe('DecisionAgree', () => { + let wrapper; + + beforeEach(() => { + wrapper = shallow( + , + ).dive(); + }); + + it('should render without error', () => { + expect(wrapper.length).toEqual(1); + }); +}); diff --git a/src/components/Decision/DecisionAgree.js b/src/components/Decision/DecisionAgree.js new file mode 100644 index 00000000..e293ef35 --- /dev/null +++ b/src/components/Decision/DecisionAgree.js @@ -0,0 +1,33 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { inject, observer } from 'mobx-react'; +import { withTranslation } from 'react-i18next'; +import Decision from './Decision'; +import { VerifyIcon } from '../Icons'; + +@withTranslation() +@inject('dialogStore') +@observer +class DecisionAgree extends React.Component { + static propTypes = { + t: PropTypes.func.isRequired, + form: PropTypes.shape().isRequired, + }; + + render() { + const { props } = this; + const { t, form } = props; + return ( + <> + )} + form={form} + buttonText={t('buttons:vote')} + /> + + ); + } +} + +export default DecisionAgree; diff --git a/src/components/Decision/DecisionClose.js b/src/components/Decision/DecisionClose.js new file mode 100644 index 00000000..6a087097 --- /dev/null +++ b/src/components/Decision/DecisionClose.js @@ -0,0 +1,33 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { inject, observer } from 'mobx-react'; +import { withTranslation } from 'react-i18next'; +import Decision from './Decision'; + +@withTranslation() +@inject('dialogStore') +@observer +class DecisionClose extends React.Component { + static propTypes = { + t: PropTypes.func.isRequired, + form: PropTypes.shape().isRequired, + }; + + render() { + const { props } = this; + // eslint-disable-next-line no-unused-vars + const { t, form } = props; + return ( + <> + + + ); + } +} + +export default DecisionClose; diff --git a/src/components/Decision/DecisionReject.js b/src/components/Decision/DecisionReject.js new file mode 100644 index 00000000..b3e63429 --- /dev/null +++ b/src/components/Decision/DecisionReject.js @@ -0,0 +1,33 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { inject, observer } from 'mobx-react'; +import { withTranslation } from 'react-i18next'; +import Decision from './Decision'; +import { RejectIcon } from '../Icons'; + +@withTranslation() +@inject('dialogStore') +@observer +class DecisionReject extends React.Component { + static propTypes = { + t: PropTypes.func.isRequired, + form: PropTypes.shape().isRequired, + }; + + render() { + const { props } = this; + const { t, form } = props; + return ( + <> + )} + form={form} + buttonText={t('buttons:vote')} + /> + + ); + } +} + +export default DecisionReject; diff --git a/src/components/Decision/index.js b/src/components/Decision/index.js new file mode 100644 index 00000000..9077e969 --- /dev/null +++ b/src/components/Decision/index.js @@ -0,0 +1,11 @@ +import Decision from './Decision'; +import DecisionReject from './DecisionReject'; +import DecisionAgree from './DecisionAgree'; + +export default Decision; + +export { + Decision, + DecisionReject, + DecisionAgree, +}; diff --git a/src/components/Dialog/Dialog.js b/src/components/Dialog/Dialog.js index c6fd776c..885413c6 100644 --- a/src/components/Dialog/Dialog.js +++ b/src/components/Dialog/Dialog.js @@ -18,6 +18,7 @@ class Dialog extends React.Component { 'sm', 'md', 'lg', + 'xlg', ]), name: PropTypes.string.isRequired, header: PropTypes.string, diff --git a/src/components/Dialog/Dialog.scss b/src/components/Dialog/Dialog.scss index 80c3a289..c34ba23f 100644 --- a/src/components/Dialog/Dialog.scss +++ b/src/components/Dialog/Dialog.scss @@ -13,7 +13,7 @@ &__inner { position: relative; z-index: 1; - min-height: 325px; + min-height: 309px; } } @@ -42,7 +42,7 @@ padding: 0; font-weight: 700; font-size: 24px; - font-family: "Grotesk"; + font-family: "Roboto"; line-height: 28px; } @@ -57,11 +57,17 @@ z-index: 5; box-sizing: border-box; width: 100%; - padding: 25px 10px; + padding: 0 10px 25px; &--default { padding-top: 55px; } + + .text { + padding: 0 40px; + color: #c8c9ca; + font-size: 14px; + } } &--open { @@ -110,8 +116,38 @@ &--lg { .content { - width: 740px; - min-width: 740px; + width: 754px; + min-width: 754px; + } + } + + &--xlg { + .content { + width: 845px; + min-width: 845px; + } + } + + &#dialog-success { + &_modal, + &_modal_voting_info_wrapper, + &_modal_contract_uploading, + &_modal_questions, + &_modal_return_tokens, + &_modal_voting { + .dialog { + &__header { + padding: 20px; + padding-top: 55px; + } + &__body { + padding-bottom: 10px; + } + } + .content__inner { + height: auto; + min-height: 255px; + } } } } @@ -152,6 +188,8 @@ } } + + @keyframes anim-open { 0% { transform: translate(0, -800px); diff --git a/src/components/Dialog/Dialog.test.js b/src/components/Dialog/Dialog.test.js index d1772409..1ed75529 100644 --- a/src/components/Dialog/Dialog.test.js +++ b/src/components/Dialog/Dialog.test.js @@ -203,11 +203,11 @@ describe('Dialog', () => { ).dive().dive(); }); - it('should has dialog--close class', () => { + it('should have dialog--close class', () => { expect(wrapper.find('.dialog').hasClass('dialog--close')).toEqual(true); }); - it('should has dialog--open class', () => { + it('should have dialog--open class', () => { expect(wrapper.find('.dialog').hasClass('dialog--open')).toEqual(true); }); }); diff --git a/src/components/Dialog/index.js b/src/components/Dialog/index.js index 16772f4f..4a07e93e 100644 --- a/src/components/Dialog/index.js +++ b/src/components/Dialog/index.js @@ -1,3 +1,8 @@ import Dialog from './Dialog'; +import DefaultDialogFooter from './DefaultDialogFooter'; export default { Dialog }; + +export { + DefaultDialogFooter, +}; diff --git a/src/components/Dropdown/Dropdown.scss b/src/components/Dropdown/Dropdown.scss index 90dba5cc..bd307ccc 100644 --- a/src/components/Dropdown/Dropdown.scss +++ b/src/components/Dropdown/Dropdown.scss @@ -2,11 +2,31 @@ .dropdown { position: relative; display: inline-block; - + button { background: transparent; outline: none; } + + &--simple { + &.dropdown--opened { + .dropdown__options { + height: 160px; + } + } + .dropdown__options { + width: 100%; + max-height: 160px; + } + .dropdown__option { + display: block; + width: 100%; + overflow: hidden; + white-space: nowrap; + text-align: left; + text-overflow: ellipsis; + } + } &__head { position: relative; @@ -39,6 +59,27 @@ } } + &__error-text { + position: absolute; + bottom: -15px; + width: 100%; + font-size: 11px; + text-align: center; + visibility: hidden; + opacity: 0; + } + + &--error { + .dropdown__error-text { + visibility: visible; + opacity: 1; + } + + .dropdown__head { + border-bottom: 1px dashed rgba(0, 0, 0, 1); + } + } + &__arrow { position: absolute; top: 50%; @@ -47,10 +88,11 @@ transform: translateY(-50%) rotate(0deg); transition: 0.2s; svg { + width: 12px; path { opacity: 1; transition: 0.2s; - stroke: $lightGrey; + stroke: $border; } } } @@ -78,18 +120,26 @@ display: inline-block; max-width: 80%; overflow: hidden; + white-space: nowrap; text-overflow: ellipsis; vertical-align: middle; + &-label { + position: absolute; + bottom: 90%; + left: 45px; + color: rgba(0, 0, 0, 0.7); + font-size: 10px; + } } &__options { position: absolute; top: 100%; z-index: 1; - width: 155%; + width: 156%; height: 0; max-height: 150px; - padding: 5px 10px; + padding: 5px 0; overflow-x: hidden; overflow-y: auto; background-color: $white; @@ -97,6 +147,8 @@ opacity: 0; transition: .3s ease-in-out; &::-webkit-scrollbar { + position: relative; + right: -30px; width: 20px; } /* Track */ @@ -131,16 +183,32 @@ } &__option { - display: block; - padding: 10px 0; + display: flex; + flex-flow: row nowrap; + justify-content: space-between; + width: 100%; + padding: 10px; + text-align: left; border: none; cursor: pointer; + transition: .2s; + + &:hover { + background-color: rgba($color: #E6E6E6, $alpha: .8); + } + + &-label { + display: inline-block; + width: 320px; + } } &__suboption { - margin-left: 30px; + margin-left: 20px; color: $linkColor; font-weight: 700; + font-size: 14px; + text-align: right; } &--opened { diff --git a/src/components/Dropdown/index.js b/src/components/Dropdown/index.js index 2e346f3d..d4b26bdb 100644 --- a/src/components/Dropdown/index.js +++ b/src/components/Dropdown/index.js @@ -1,18 +1,45 @@ import React, { Component } from 'react'; -import propTypes from 'prop-types'; +import PropTypes from 'prop-types'; import DropdownOption from '../DropdownOption'; import { DropdownArrowIcon } from '../Icons'; +import i18n from '../../i18n'; + import styles from './Dropdown.scss'; class Dropdown extends Component { + static propTypes = { + children: PropTypes.element, + options: PropTypes.arrayOf(PropTypes.object).isRequired, + subOptions: PropTypes.shape({}), + onSelect: PropTypes.func.isRequired, + field: PropTypes.shape({ + set: PropTypes.func.isRequired, + value: PropTypes.string.isRequired, + placeholder: PropTypes.oneOfType([ + PropTypes.string, + PropTypes.shape({}), + ]).isRequired, + validate: PropTypes.func.isRequired, + label: PropTypes.string.isRequired, + error: PropTypes.string, + }).isRequired, + }; + + static defaultProps = { + children: '', + subOptions: {}, + }; + constructor(props) { super(props); this.state = { selectedValue: '', }; - this.setWrapperRef = this.setWrapperRef.bind(this); this.handleClickOutside = this.handleClickOutside.bind(this); + window.ipcRenderer.on('change-language:confirm', () => { + this.updateLanguage(); + }); } componentDidMount() { @@ -21,12 +48,20 @@ class Dropdown extends Component { componentWillUnmount() { document.addEventListener('mousedown', this.handleClickOutside); + window.ipcRenderer.removeListener('change-language:confirm', () => { + this.updateLanguage(); + }); } setWrapperRef(node) { this.wrapperRef = node; } + updateLanguage = () => { + const { field } = this.props; + field.set('placeholder', i18n.t(`fields:${field.label}`)); + } + toggleOptions = () => { const { opened } = this.state; this.setState({ opened: !opened }); @@ -36,12 +71,19 @@ class Dropdown extends Component { this.setState({ opened: false }); } + calculateHeight = () => { + const optionsLength = document.querySelectorAll('.dropdown__option').length; + const height = optionsLength * 40; + return height > 150 ? 150 : height; + } + handleSelect = (selected) => { const { onSelect, field } = this.props; this.setState({ selectedValue: selected, }); field.set(selected); + field.validate(); onSelect(selected); this.toggleOptions(); } @@ -69,7 +111,14 @@ class Dropdown extends Component { )); return ( -
+
-
+
{getOptions}
+

+ {field.error} +

); } } -Dropdown.propTypes = { - children: propTypes.element, - options: propTypes.arrayOf(propTypes.object).isRequired, - subOptions: propTypes.shape({}), - onSelect: propTypes.func.isRequired, - field: propTypes.shape({ - set: propTypes.func.isRequired, - value: propTypes.string.isRequired, - placeholder: propTypes.string.isRequired, - }).isRequired, -}; - -Dropdown.defaultProps = { - children: '', - subOptions: {}, -}; - - export default Dropdown; diff --git a/src/components/DropdownOption/index.js b/src/components/DropdownOption/index.js index 69a6cf81..e183d6e7 100644 --- a/src/components/DropdownOption/index.js +++ b/src/components/DropdownOption/index.js @@ -11,7 +11,9 @@ const DropdownOption = ({ className={styles.dropdown__option} onClick={() => { select(value); }} > - {label} + + {label} + {subOption !== '' ? ( @@ -27,10 +29,11 @@ DropdownOption.propTypes = { value: propTypes.string.isRequired, label: propTypes.string.isRequired, select: propTypes.func.isRequired, - subOption: propTypes.string.isRequired, + subOption: propTypes.string, }; DropdownOption.defaultProps = { + subOption: '', }; export default DropdownOption; diff --git a/src/components/Explanation/Explanation.scss b/src/components/Explanation/Explanation.scss index 1d03db9b..d73449d0 100644 --- a/src/components/Explanation/Explanation.scss +++ b/src/components/Explanation/Explanation.scss @@ -17,4 +17,13 @@ } } } + &--bold { + color: $primary; + .explanation__string { + border-left: 2px solid $primary; + } + p { + font-weight: 700; + } + } } \ No newline at end of file diff --git a/src/components/Explanation/index.js b/src/components/Explanation/index.js index 61f3208b..cc3e26b5 100644 --- a/src/components/Explanation/index.js +++ b/src/components/Explanation/index.js @@ -2,17 +2,19 @@ import React from 'react'; import propTypes from 'prop-types'; import styles from './Explanation.scss'; -const Explanation = ({ children }) => ( -

-

{children}

-

+const Explanation = ({ children, bold }) => ( +
+
{children}
+
); Explanation.defaultProps = { children: '', + bold: false, }; Explanation.propTypes = { children: propTypes.node, + bold: propTypes.bool, }; export default Explanation; diff --git a/src/components/FinPassFormWrapper/FinPassFormWrapper.js b/src/components/FinPassFormWrapper/FinPassFormWrapper.js new file mode 100644 index 00000000..3cec825c --- /dev/null +++ b/src/components/FinPassFormWrapper/FinPassFormWrapper.js @@ -0,0 +1,51 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { withTranslation } from 'react-i18next'; +import Input from '../Input'; +import { Password } from '../Icons'; +import Button from '../Button/Button'; + +import styles from './FinPassFormWrapper.scss'; + +@withTranslation() +class FinPassFormWrapper extends React.Component { + static propTypes = { + t: PropTypes.func.isRequired, + form: PropTypes.shape({ + onSubmit: PropTypes.func.isRequired, + $: PropTypes.func.isRequired, + }).isRequired, + buttonText: PropTypes.string.isRequired, + }; + + render() { + const { props } = this; + const { t, form, buttonText } = props; + return ( +
+
+
+ + + +
+
+ +
+
+
+ ); + } +} + +export default FinPassFormWrapper; diff --git a/src/components/FinPassFormWrapper/FinPassFormWrapper.scss b/src/components/FinPassFormWrapper/FinPassFormWrapper.scss new file mode 100644 index 00000000..9e1ed67d --- /dev/null +++ b/src/components/FinPassFormWrapper/FinPassFormWrapper.scss @@ -0,0 +1,21 @@ +.form-fin-pass { + margin-top: 56px; + + .input__wrapper { + .field { + width: 100%; + max-width: 309px; + margin-bottom: 0px; + } + } + + .button__wrapper { + margin-top: 48px; + margin-bottom: 59px; + + button { + width: 100%; + max-width: 309px; + } + } +} diff --git a/src/components/FinPassFormWrapper/FinPassFormWrapper.stories.js b/src/components/FinPassFormWrapper/FinPassFormWrapper.stories.js new file mode 100644 index 00000000..6df33427 --- /dev/null +++ b/src/components/FinPassFormWrapper/FinPassFormWrapper.stories.js @@ -0,0 +1,24 @@ +import React from 'react'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { storiesOf } from '@storybook/react'; +import FinPassFormWrapper from './FinPassFormWrapper'; +import FinPassForm from '../../stores/FormsStore/FinPassForm'; + +const form = new FinPassForm({ + hooks: { + onSuccess() { + return Promise.resolve(); + }, + onError() { + /* eslint-disable-next-line */ + console.error('error'); + }, + }, +}); + +storiesOf('FinPassFormWrapper', module) + .add('Default', () => ( + + )); diff --git a/src/components/Footer/Footer.scss b/src/components/Footer/Footer.scss new file mode 100644 index 00000000..ef7e038e --- /dev/null +++ b/src/components/Footer/Footer.scss @@ -0,0 +1,39 @@ +@import '../../assets/styles/partials/variables'; + +.footer { + position: relative; + z-index: 1; + padding: 15px 0; + text-align: center; + + a { + flex-flow: row nowrap; + align-items: center; + justify-content: center; + color: $border; + font-size: 11px; + text-align: center; + svg { + vertical-align: middle; + path { + transition: .2s; + } + } + span { + margin-left: 10px; + vertical-align: middle; + transition: .2s; + } + &:hover{ + svg { + path { + opacity: 1; + fill: $primary; + } + } + span { + color: $primary; + } + } + } +} \ No newline at end of file diff --git a/src/components/Footer/index.js b/src/components/Footer/index.js new file mode 100644 index 00000000..10d5f276 --- /dev/null +++ b/src/components/Footer/index.js @@ -0,0 +1,16 @@ + +import React from 'react'; +import { GithubIcon } from '../Icons'; + +import styles from './Footer.scss'; + +const Footer = () => ( + +); + +export default Footer; diff --git a/src/components/Forms/ProjectInputForm.js b/src/components/Forms/ProjectInputForm.js new file mode 100644 index 00000000..aa41e54b --- /dev/null +++ b/src/components/Forms/ProjectInputForm.js @@ -0,0 +1,59 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { withTranslation } from 'react-i18next'; +import { observer } from 'mobx-react'; +import Input from '../Input'; +import { + TokenName, Password, Address, +} from '../Icons'; +import Button from '../Button/Button'; + +import styles from '../Decision/Decision.scss'; + +@withTranslation() +@observer +class ProjectInputForm extends Component { + static propTypes = { + t: PropTypes.func.isRequired, + form: PropTypes.shape().isRequired, + }; + + constructor(props) { + super(props); + this.state = {}; + } + + render() { + const { props } = this; + const { + t, form, + } = props; + return ( +
+
+ + + + +
+ + + + +
+ +
+ +
+ ); + } +} + +export default ProjectInputForm; diff --git a/src/components/Forms/TokenInputForm.js b/src/components/Forms/TokenInputForm.js new file mode 100644 index 00000000..d67a62ea --- /dev/null +++ b/src/components/Forms/TokenInputForm.js @@ -0,0 +1,64 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { withTranslation } from 'react-i18next'; +import { observer } from 'mobx-react'; +import Input from '../Input'; +import { + TokenName, TokenSymbol, TokenCount, Password, +} from '../Icons'; +import Button from '../Button/Button'; + +import styles from '../Decision/Decision.scss'; + +@withTranslation() +@observer +class TokenInputForm extends Component { + static propTypes = { + t: PropTypes.func.isRequired, + form: PropTypes.shape().isRequired, + }; + + constructor(props) { + super(props); + this.state = {}; + } + + render() { + const { props } = this; + const { + t, form, + } = props; + return ( +
+
+ + + +
+ + + + + + +
+ + + +
+ +
+ +
+ ); + } +} + +export default TokenInputForm; diff --git a/src/components/Header/Header.scss b/src/components/Header/Header.scss index 392cf70d..8f2ac892 100644 --- a/src/components/Header/Header.scss +++ b/src/components/Header/Header.scss @@ -1,7 +1,7 @@ @import '../../assets/styles/partials/variables'; .header { - position: absolute; + position: relative; top: 30px; left: 50%; z-index: 2; @@ -27,14 +27,31 @@ background-color: $lightGrey; border: none; transform: translate(-50%, -50%); + &--bold { + height: 2px; + background-color: $primary; + } } &__link { position: relative; - margin: 0 30px; + display: inline-block; + width: 105px; + margin: 0 20px; + text-align: center; transition: .2s linear; + svg { + path { + fill: $white; + } + } &.active{ font-weight: bold; + svg { + path { + fill: $primary; + } + } &:before, &:after { position: absolute; left: 50%; @@ -48,17 +65,54 @@ top: 100%; transform: translateX(-50%) rotate(180deg); } - } + } + } + + &__settings { + svg { + path { + fill: $white; + } + } + &.active{ + font-weight: bold; + svg { + path { + fill: $primary; + } + } + } } + &__right { + display: flex; + flex-flow: row nowrap; + align-items: center; + justify-content: space-between; + background-color: #FAFBFC; + .user { + &:hover { + position: absolute; + right: 17px; + } + } + + } + + .lang { padding: 10px; background-color: #fafbfc; } - + .user { + margin-right: 10px; margin-left: 10px; vertical-align: middle; - background-color: #FAFBFC; + background-color: $white; } + +} +.is-logged { + width: 260px; } \ No newline at end of file diff --git a/src/components/Header/HeaderNav/index.js b/src/components/Header/HeaderNav/index.js index 169a1b5c..e4a93544 100644 --- a/src/components/Header/HeaderNav/index.js +++ b/src/components/Header/HeaderNav/index.js @@ -1,16 +1,24 @@ import React from 'react'; import { NavLink } from 'react-router-dom'; +import { withTranslation } from 'react-i18next'; +import PropTypes from 'prop-types'; import styles from '../Header.scss'; -const HeaderNav = () => ( +const HeaderNav = ({ + t, +}) => ( ); -export default HeaderNav; +HeaderNav.propTypes = { + t: PropTypes.func.isRequired, +}; + +export default withTranslation()(HeaderNav); diff --git a/src/components/Header/index.js b/src/components/Header/index.js index 4cb974f4..44b53744 100644 --- a/src/components/Header/index.js +++ b/src/components/Header/index.js @@ -1,20 +1,31 @@ import React from 'react'; import { inject, observer } from 'mobx-react'; +import { NavLink } from 'react-router-dom'; import Logo from '../Logo'; import HeaderNav from './HeaderNav'; import LangSwitcher from '../LangSwitcher'; import User from '../User'; import styles from './Header.scss'; +import { SettingsIcon } from '../Icons'; const Header = inject('userStore', 'appStore')(observer(({ appStore: { inProject }, userStore: { authorized, address } }) => (
{inProject ? : ''} -
-
+
+
{authorized ? {address} : ''} + { + authorized + ? ( + + + + ) + : null + }
))); diff --git a/src/components/Heading/index.js b/src/components/Heading/index.js index fca314fa..f47ff389 100644 --- a/src/components/Heading/index.js +++ b/src/components/Heading/index.js @@ -1,5 +1,5 @@ import React from 'react'; -import propTypes from 'prop-types'; +import PropTypes from 'prop-types'; import styles from './Heading.scss'; const Heading = ({ children }) => ( @@ -10,7 +10,10 @@ const Heading = ({ children }) => ( ); Heading.propTypes = { - children: propTypes.arrayOf(propTypes.string).isRequired, + children: PropTypes.oneOfType([ + PropTypes.node, + PropTypes.string, + ]).isRequired, }; export default Heading; diff --git a/src/components/Hint/Hint.scss b/src/components/Hint/Hint.scss index e1c23c5c..7047564e 100644 --- a/src/components/Hint/Hint.scss +++ b/src/components/Hint/Hint.scss @@ -17,11 +17,12 @@ line-height: 15px; text-align: center; transition: 0.2s; + &::before { position: absolute; top: 50%; left: 50%; - z-index: -1; + z-index: 2; width: 100%; height: 100%; background-color: $white; @@ -30,31 +31,72 @@ transition: 0.2s; content: ''; } + + &::after { + position: relative; + top: 1px; + z-index: 3; + font-weight: 400; + content: ' ? '; + } + &:hover { color: $white; + &:before { background-color: $primary; border-color: $primary; } + & + .hint__text { visibility: visible; opacity: 1; } } } - + &__text { position: absolute; - top:50%; + top:50%; left: 50%; - z-index: -2; - width: 185px; - padding: 24px; + z-index: 1; + width: 292px; + padding: 21px; font-size: 11px; + line-height: 13px; + white-space: pre-wrap; + text-align: left; + background-color: #fff; border: 1px solid $border; - transform: translate(-1px, 2px); + transform: translateZ(0); visibility: hidden; opacity: 0; transition: 0.2s; + strong { + font-weight: 700; + } + } + + &--square { + .hint__icon { + &::before{ + transform: translate(-50%, -50%); + } + } + } + &--formula { + .hint__text { + top: unset; + bottom: 50%; + width: 570px; + &>p { + margin: 5px 0; + font-size: 11px; + line-height: 13px; + &:first-child, &:last-child { + margin: 10px 0; + } + } + } } } \ No newline at end of file diff --git a/src/components/Hint/index.js b/src/components/Hint/index.js index e55184fa..11279efd 100644 --- a/src/components/Hint/index.js +++ b/src/components/Hint/index.js @@ -1,19 +1,109 @@ import React from 'react'; import propTypes from 'prop-types'; +import { withTranslation } from 'react-i18next'; import styles from './Hint.scss'; const Hint = ({ children }) => (
- ? + {children}
); +const SquareHint = ({ children }) => ( +
+ + + {children} + +
+); + +const FormulaHint = withTranslation()(() => ( +
+ +
+

+ Формула голосования записывается в примерном виде: +
+ {'erc20{0x123...EF}->exclude{0x234...FE}->conditions{quorum>50%, positive>50% of all}, где:'} +

+ +

+ {'1) erc20{0x123...EF} / custom{0x123...EF}'} + {' '} + - тип токенов и адрес токенов необходимой группы +

+

+ {'2) exclude{0x234...FE}'} + {' '} + – пользователи, которые не должны голосовать (опционально) +

+

+ {'3) conditions{quorum>50%, positive>50% of all}'} + {' '} + - условия для принятия решения по голосованию +

+

+ {'3.1) quorum>50%'} + {' '} + min% голосов в общем +

+

+ {'3.2) positive>50%'} + {' '} + min% голосов «ЗА» +

+

+ 3.3 of quorum / of all + {' '} + – модификатор, от какого числа считать условие positive - от числа токенов, + которые учавствовали в голосовании, или от всех токенов из контракта группы +

+

+ Вы можете связывать несколько групп пользователей, объединяя их формулы операторами + and + или + or + .Например: + «Формула 1» + or + «Формула 2» + and + «Формула 3» +

+
+
+)); + + +const SelectorHint = () => ( +
+ + +

Выглядит как 4 байта Keccak хэша от сигнатуры функции в ASCII кодировке

+

Пример:

+

+ bytes4(keccak256(baz(uint32,bool))) = + {' '} + 0xcdcd77c0 +

+
+
+); + Hint.propTypes = { - children: propTypes.arrayOf(propTypes.string).isRequired, + children: propTypes.string.isRequired, }; -export default Hint; +SquareHint.propTypes = { + children: propTypes.string.isRequired, +}; + + +export { + Hint, SquareHint, FormulaHint, SelectorHint, +}; diff --git a/src/components/Icons/entities/AdminIcon.js b/src/components/Icons/entities/AdminIcon.js new file mode 100644 index 00000000..b587a17e --- /dev/null +++ b/src/components/Icons/entities/AdminIcon.js @@ -0,0 +1,67 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +const AdminIcon = ({ + width, + height, + color, +}) => ( + + + + + + + + +); + +AdminIcon.propTypes = { + width: PropTypes.number, + height: PropTypes.number, + color: PropTypes.string, +}; + +AdminIcon.defaultProps = { + width: 16, + height: 16, + color: '#000', +}; + +export default AdminIcon; diff --git a/src/components/Icons/entities/Arrow.js b/src/components/Icons/entities/Arrow.js new file mode 100644 index 00000000..5d1123dc --- /dev/null +++ b/src/components/Icons/entities/Arrow.js @@ -0,0 +1,12 @@ +import React from 'react'; + +const Arrow = () => ( + + + +); + +export default Arrow; diff --git a/src/components/Icons/entities/BinaryIcon.js b/src/components/Icons/entities/BinaryIcon.js new file mode 100644 index 00000000..16bc2923 --- /dev/null +++ b/src/components/Icons/entities/BinaryIcon.js @@ -0,0 +1,42 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +const BinaryIcon = ({ + width, + height, + color, +}) => ( + + + + +); + +BinaryIcon.propTypes = { + width: PropTypes.number, + height: PropTypes.number, + color: PropTypes.string, +}; + +BinaryIcon.defaultProps = { + width: 16, + height: 16, + color: '#4D4D4D', +}; + +export default BinaryIcon; diff --git a/src/components/Icons/entities/BorderArrowIcon.js b/src/components/Icons/entities/BorderArrowIcon.js new file mode 100644 index 00000000..188de531 --- /dev/null +++ b/src/components/Icons/entities/BorderArrowIcon.js @@ -0,0 +1,44 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +const BorderArrowIcon = ({ + width, + height, + color, +}) => ( + + + + +); + +BorderArrowIcon.propTypes = { + width: PropTypes.number, + height: PropTypes.number, + color: PropTypes.string, +}; + +BorderArrowIcon.defaultProps = { + width: 25, + height: 25, + color: '#000', +}; + +export default BorderArrowIcon; diff --git a/src/components/Icons/entities/DateIcon.js b/src/components/Icons/entities/DateIcon.js new file mode 100644 index 00000000..4658fc83 --- /dev/null +++ b/src/components/Icons/entities/DateIcon.js @@ -0,0 +1,39 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +const DateIcon = ({ + width, + height, + color, +}) => ( + + + + + + +); + +DateIcon.propTypes = { + width: PropTypes.number, + height: PropTypes.number, + color: PropTypes.string, +}; + +DateIcon.defaultProps = { + width: 16, + height: 17, + color: '#4D4D4D', +}; +export default DateIcon; diff --git a/src/components/Icons/entities/DescisionIcon.js b/src/components/Icons/entities/DescisionIcon.js new file mode 100644 index 00000000..b750f54d --- /dev/null +++ b/src/components/Icons/entities/DescisionIcon.js @@ -0,0 +1,10 @@ +import React from 'react'; + +const DescisionIcon = () => ( + + + + +); + +export default DescisionIcon; diff --git a/src/components/Icons/entities/GithubIcon.js b/src/components/Icons/entities/GithubIcon.js new file mode 100644 index 00000000..f6f0d017 --- /dev/null +++ b/src/components/Icons/entities/GithubIcon.js @@ -0,0 +1,8 @@ +import React from 'react'; + +const GithubIcon = () => ( + + + +); +export default GithubIcon; diff --git a/src/components/Icons/entities/NoQuorum.js b/src/components/Icons/entities/NoQuorum.js new file mode 100644 index 00000000..ab485355 --- /dev/null +++ b/src/components/Icons/entities/NoQuorum.js @@ -0,0 +1,24 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +const NoQuorum = ({ + width, + height, +}) => ( + + + + +); + +NoQuorum.propTypes = { + width: PropTypes.number, + height: PropTypes.number, +}; + +NoQuorum.defaultProps = { + width: 32, + height: 32, +}; + +export default NoQuorum; diff --git a/src/components/Icons/entities/PlayCircleIcon.js b/src/components/Icons/entities/PlayCircleIcon.js new file mode 100644 index 00000000..0570e037 --- /dev/null +++ b/src/components/Icons/entities/PlayCircleIcon.js @@ -0,0 +1,48 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +const PlayCircleIcon = ({ + width, + height, + color, + opacity, +}) => ( + + + + + + +); + +PlayCircleIcon.propTypes = { + width: PropTypes.number, + height: PropTypes.number, + opacity: PropTypes.number, + color: PropTypes.string, +}; + +PlayCircleIcon.defaultProps = { + width: 32, + height: 32, + opacity: 0.7, + color: '#000', +}; + +export default PlayCircleIcon; diff --git a/src/components/Icons/entities/Pudding.js b/src/components/Icons/entities/Pudding.js new file mode 100644 index 00000000..0a377b4c --- /dev/null +++ b/src/components/Icons/entities/Pudding.js @@ -0,0 +1,35 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +const Pudding = ({ + width, + height, + color, +}) => ( + + + +); + +Pudding.propTypes = { + width: PropTypes.number, + height: PropTypes.number, + color: PropTypes.string, +}; + +Pudding.defaultProps = { + width: 19, + height: 17, + color: '#000', +}; + +export default Pudding; diff --git a/src/components/Icons/entities/QuestionIcon.js b/src/components/Icons/entities/QuestionIcon.js new file mode 100644 index 00000000..dbfe2cfd --- /dev/null +++ b/src/components/Icons/entities/QuestionIcon.js @@ -0,0 +1,54 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +const QuestionIcon = ({ + width, + height, + opacity, + color, +}) => ( + + + + + + + +); + +QuestionIcon.propTypes = { + width: PropTypes.number, + height: PropTypes.number, + opacity: PropTypes.number, + color: PropTypes.string, +}; + +QuestionIcon.defaultProps = { + width: 16, + height: 16, + opacity: 0.7, + color: '#000', +}; + +export default QuestionIcon; diff --git a/src/components/Icons/entities/SettingsIcon.js b/src/components/Icons/entities/SettingsIcon.js new file mode 100644 index 00000000..5c6a6217 --- /dev/null +++ b/src/components/Icons/entities/SettingsIcon.js @@ -0,0 +1,9 @@ +import React from 'react'; + +const SettingsIcon = () => ( + + + +); + +export default SettingsIcon; diff --git a/src/components/Icons/entities/SigningIcon.js b/src/components/Icons/entities/SigningIcon.js new file mode 100644 index 00000000..328b9831 --- /dev/null +++ b/src/components/Icons/entities/SigningIcon.js @@ -0,0 +1,15 @@ +import React from 'react'; + +const SigningIcon = () => ( + + + + + + + + + +); + +export default SigningIcon; diff --git a/src/components/Icons/entities/StartIcon.js b/src/components/Icons/entities/StartIcon.js new file mode 100644 index 00000000..699eba1b --- /dev/null +++ b/src/components/Icons/entities/StartIcon.js @@ -0,0 +1,12 @@ +import React from 'react'; + +const StartIcon = () => ( + + + + + + +); + +export default StartIcon; diff --git a/src/components/Icons/entities/StatsIcon.js b/src/components/Icons/entities/StatsIcon.js index 22cbe455..0f69a1ae 100644 --- a/src/components/Icons/entities/StatsIcon.js +++ b/src/components/Icons/entities/StatsIcon.js @@ -3,8 +3,18 @@ import React from 'react'; const Stats = () => ( - - + + diff --git a/src/components/Icons/entities/ThinArrow.js b/src/components/Icons/entities/ThinArrow.js new file mode 100644 index 00000000..f491cc06 --- /dev/null +++ b/src/components/Icons/entities/ThinArrow.js @@ -0,0 +1,37 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +const ThinArrow = ({ + width, + height, + color, + reverse, +}) => ( + + + +); + +ThinArrow.propTypes = { + width: PropTypes.number, + height: PropTypes.number, + color: PropTypes.string, + reverse: PropTypes.bool, +}; + +ThinArrow.defaultProps = { + width: 5, + height: 9, + color: 'currentColor', + reverse: false, +}; + +export default ThinArrow; diff --git a/src/components/Icons/index.js b/src/components/Icons/index.js index fa86a243..73c10f18 100644 --- a/src/components/Icons/index.js +++ b/src/components/Icons/index.js @@ -13,6 +13,8 @@ import EyeIcon from './entities/EyeIcon'; import IconInfo from './entities/InfoIcon'; import Login from './entities/LoginIcon'; import Password from './entities/PasswordIcon'; +import PlayCircleIcon from './entities/PlayCircleIcon'; +import Pudding from './entities/Pudding'; import QuestionUploadingIcon from './entities/QuestionUploadingIcon'; import SendingIcon from './entities/SendingIcon'; import Stats from './entities/StatsIcon'; @@ -22,7 +24,19 @@ import TokenName from './entities/TokenNameIcon'; import TxHashIcon from './entities/TxHashIcon'; import TxRecieptIcon from './entities/TxRecieptIcon'; import VerifyIcon from './entities/VerifyIcon'; +import StartIcon from './entities/StartIcon'; +import GithubIcon from './entities/GithubIcon'; import RejectIcon from './entities/RejectIcon'; +import BorderArrowIcon from './entities/BorderArrowIcon'; +import AdminIcon from './entities/AdminIcon'; +import QuestionIcon from './entities/QuestionIcon'; +import ThinArrow from './entities/ThinArrow'; +import DateIcon from './entities/DateIcon'; +import SettingsIcon from './entities/SettingsIcon'; +import NoQuorum from './entities/NoQuorum'; +import DescisionIcon from './entities/DescisionIcon'; +import Arrow from './entities/Arrow'; +import SigningIcon from './entities/SigningIcon'; export { AddIcon, @@ -40,6 +54,8 @@ export { IconInfo, Login, Password, + PlayCircleIcon, + Pudding, QuestionUploadingIcon, SendingIcon, Stats, @@ -49,5 +65,17 @@ export { TxHashIcon, TxRecieptIcon, VerifyIcon, + StartIcon, + GithubIcon, RejectIcon, + BorderArrowIcon, + AdminIcon, + QuestionIcon, + ThinArrow, + DateIcon, + SettingsIcon, + NoQuorum, + DescisionIcon, + Arrow, + SigningIcon, }; diff --git a/src/components/Input/Input.scss b/src/components/Input/Input.scss index f07437e7..f164c17d 100644 --- a/src/components/Input/Input.scss +++ b/src/components/Input/Input.scss @@ -12,7 +12,7 @@ &__input { width: 85%; - margin-left: 20px; + margin-left: 17px; padding: 8px 0; vertical-align: middle; background: transparent; @@ -32,6 +32,26 @@ font-size: 9px; } } + + &--textarea { + max-width: 100%; + min-height: 80px; + padding: 10px; + background-color: transparent; + border: 1px solid #e1e4e8; + border-radius: 2px; + outline: none; + transition: .2s; + &::-webkit-input-placeholder { + opacity: 0; + } + &:focus { + border-color: $primary; + & + .field__label--textarea { + color: $primary; + } + } + } } &__label { @@ -43,6 +63,18 @@ font-size: 14px; transform: translateY(-50%); transition: 0.2s; + + &--textarea { + position: absolute; + bottom: 100%; + margin-bottom: 4px; + &>span { + color: $placeholderColor; + font-size: 14px; + line-height: 16px; + text-align: left; + } + } } &__error-text { @@ -54,7 +86,7 @@ visibility: hidden; opacity: 0; } - + &__line { position: absolute; bottom: -1px; @@ -62,6 +94,7 @@ width: 0; height: 1px; background-color: $primary; + border-bottom: 1px solid $primary; transition: 0.3s ease-in; } @@ -82,6 +115,10 @@ style: dashed; color: $primary; } + &.field--textarea { + padding-bottom: 1px; + border-bottom: none; + } .field__error-text { visibility: visible; opacity: 1; @@ -100,9 +137,37 @@ } &:focus { & ~ .field__line { - width: 0; + width: 100%; } } + + &--textarea { + border-color: $primary; + border-style: dashed; + } + } + + } + + &--textarea { + position: relative; + .field__error-text { + top: unset; + bottom: -17px; } + .hint { + position: relative; + z-index: 1; + margin-left: 10px; + transform: translate(0,0); + } + } + + .hint { + position: absolute; + top: 50%; + right: 0; + z-index: 1; + transform: translateY(-50%); } } diff --git a/src/components/Input/InputTextarea.js b/src/components/Input/InputTextarea.js new file mode 100644 index 00000000..f458a9d8 --- /dev/null +++ b/src/components/Input/InputTextarea.js @@ -0,0 +1,66 @@ +/* eslint-disable react/jsx-props-no-spreading */ +import React, { Component } from 'react'; +import propTypes from 'prop-types'; +import { observer } from 'mobx-react'; + +import styles from './Input.scss'; + +@observer +class InputTextarea extends Component { + handleOnChange = (e) => { + const { field, onInput } = this.props; + field.onChange(e); + onInput(field.value); + } + + render() { + const { + field, className, hint, + } = this.props; + return ( +
+