diff --git a/.circleci/config.yml b/.circleci/config.yml index fe279d6d1d..af99d5604d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -12,20 +12,36 @@ jobs: working_directory: ~/repo steps: + - run: sudo npm i -g codeclimate-test-reporter + - checkout # Download and cache dependencies - restore_cache: keys: - - v1-dependencies-{{ checksum "package.json" }} + - v1-dependencies-root-{{ checksum "package.json" }} + # fallback to using the latest cache if no exact match is found + - v1-dependencies-root- + - restore_cache: + keys: + - v1-dependencies-app-{{ checksum "app/package.json" }} # fallback to using the latest cache if no exact match is found - - v1-dependencies- + - v1-dependencies-app- - - run: yarn install + - run: yarn - save_cache: paths: + - yarn.lock - node_modules - key: v1-dependencies-{{ checksum "package.json" }} + key: v1-dependencies-root-{{ checksum "package.json" }} + - save_cache: + paths: + - app/yarn.lock + - app/node_modules + key: v1-dependencies-app-{{ checksum "app/package.json" }} - run: yarn lint + - run: npm run pack + - run: xvfb-run -e /dev/stdout -a npm run test + - run: codeclimate-test-reporter < test/unit/coverage/lcov.info \ No newline at end of file diff --git a/.circleci/images/primary/DOCKERFILE b/.circleci/images/primary/DOCKERFILE new file mode 100644 index 0000000000..d3e52dcd44 --- /dev/null +++ b/.circleci/images/primary/DOCKERFILE @@ -0,0 +1,12 @@ +FROM circleci/golang:1.8.1-browsers + +RUN curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - +RUN sudo apt-get install -y nodejs + +RUN go get -d github.com/cosmos/cosmos-sdk +RUN cd $GOPATH/src/github.com/cosmos/cosmos-sdk && git checkout v0.7.1 && make get_vendor_deps && make install + +RUN go get -d github.com/tendermint/tendermint/cmd/tendermint +RUN cd $GOPATH/src/github.com/tendermint/tendermint && git checkout v0.11.1 && make get_vendor_deps && make install + +RUN sudo npm i -g yarn \ No newline at end of file diff --git a/.gitignore b/.gitignore index 08743e09c5..9ebf344184 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ npm-debug.log npm-debug.log.* thumbs.db !.gitkeep +env.js diff --git a/README.md b/README.md index be60b26e65..bbdb37d3f8 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ This is still alpha-level software as of September 2017. Do not enter in your Co ## Development -To run the dev build, first you will need the following binaries installed in your GOPATH: `basecoin`, `baseserver`, and `tendermint`. +To run the dev build, first you will need the following binaries installed in your GOPATH: `basecoin`, `baseserver`, and `tendermint`. Download those from `https://tendermint.com/downloads`. ```fish # check your versions @@ -20,8 +20,7 @@ $ tendermint version 0.11.0-7682ad9a ``` -``` -npm install +# on Window set GOPATH in `./env.js`. This file is gitignored. # run on the default testnet npm run testnet @@ -50,14 +49,14 @@ brew install glide # install basecoin/baseserver go get -d github.com/cosmos/cosmos-sdk -cd $GOPATH/src/github.com/cosmos/cosmos-sdk +cd $GOPATH/src/github.com/cosmos/cosmos-sdk // Windows: cd %GOPATH%/src/github.com/cosmos/cosmos-sdk git checkout develop make get_vendor_deps make install # install tendermint go get -d github.com/tendermint/tendermint/cmd/tendermint -cd $GOPATH/src/github.com/tendermint/tendermint +cd $GOPATH/src/github.com/tendermint/tendermint // Windows: cd %GOPATH%/src/github.com/tendermint/tendermint git checkout v0.11.0 make get_vendor_deps make install @@ -68,3 +67,30 @@ Then build and run the app: npm run pack && npm run build:darwin open builds/cosmos-ui-darwin-x64/cosmos-ui.app ``` + +## Testing + +To test you need to first package the web content of the app, as this content can only be used bundled by the electron instance. + +```bash +$ npm run pack +$ npm run test +``` + + +## FAQ + +- If tendermint crashes and the log shows "Tendermint state.AppHash does not match AppHash after replay." delete the config folders at $HOME/.cosmos-ui[-dev]. + +- If you use yarn, the postinstall hook may not execute. In this case you have to execute these script manualy: +```bash +$ cd app +$ yarn +$ cd .. +$ npm run rebuild +``` + +- If electron shows the error: "A DLL initialization routine has failed." rebuild the electron dependencies. +```bash +$ npm run rebuild +``` \ No newline at end of file diff --git a/app/package-lock.json b/app/package-lock.json index 79baf319af..b47a177693 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -2,15 +2,11 @@ "name": "cosmos-ui", "version": "0.1.0", "lockfileVersion": 1, - "requires": true, "dependencies": { "abstract-leveldown": { "version": "0.12.4", "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz", "integrity": "sha1-KeGOYy5g5OIh1YECR4UqY9ey5BA=", - "requires": { - "xtend": "3.0.0" - }, "dependencies": { "xtend": { "version": "3.0.0", @@ -22,11 +18,7 @@ "ajv": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=" }, "ansi-regex": { "version": "2.1.1", @@ -42,10 +34,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.3" - }, "dependencies": { "isarray": { "version": "1.0.0", @@ -55,24 +43,12 @@ "readable-stream": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } + "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=" }, "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=" } } }, @@ -109,20 +85,13 @@ "axios": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/axios/-/axios-0.16.2.tgz", - "integrity": "sha1-uk+S8XFn37q0CYN4VFS5rBScPG0=", - "requires": { - "follow-redirects": "1.2.4", - "is-buffer": "1.1.5" - } + "integrity": "sha1-uk+S8XFn37q0CYN4VFS5rBScPG0=" }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "2.5.0", - "regenerator-runtime": "0.11.0" - } + "dev": true }, "base-x": { "version": "1.1.0", @@ -133,28 +102,11 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/basecoin/-/basecoin-2.3.1.tgz", "integrity": "sha1-5P88CUa3OQF93GkImdNU1JzKG8c=", - "requires": { - "crypto-service-client": "1.1.1", - "deep-equal": "1.0.1", - "ed25519-supercop": "1.0.2", - "level-browserify": "1.1.1", - "level-transactions": "2.1.4", - "old": "0.1.3", - "secp256k1": "3.3.0", - "tendermint": "2.0.3", - "tendermint-crypto": "github:mappum/js-crypto#1be988d2aecd81e824ff0d1fc4ea88d5c8e19bdb", - "varstruct": "5.3.0", - "varstruct-match": "3.1.0", - "watt": "3.3.0" - }, "dependencies": { "old": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/old/-/old-0.1.3.tgz", - "integrity": "sha1-WCTZn/xOxujFKz886VWhel+BStE=", - "requires": { - "object-assign": "4.1.1" - } + "integrity": "sha1-WCTZn/xOxujFKz886VWhel+BStE=" } } }, @@ -162,19 +114,13 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } + "optional": true }, "bigi": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/bigi/-/bigi-1.4.2.tgz", "integrity": "sha1-nGZalfiLiwj8Bc/XMfVhhZ1yWCU=" }, - "bignumber.js": { - "version": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2" - }, "bindings": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", @@ -183,50 +129,22 @@ "bip39": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/bip39/-/bip39-2.4.0.tgz", - "integrity": "sha512-1++HywqIyPtWDo7gm4v0ylYbwkLvHkuwVSKbBlZBbTCP/mnkyrlARBny906VLAwxJbC5xw9EvuJasHFIZaIFMQ==", - "requires": { - "create-hash": "1.1.3", - "pbkdf2": "3.0.13", - "randombytes": "2.0.5", - "safe-buffer": "5.1.1", - "unorm": "1.4.1" - } + "integrity": "sha1-oLitvxY/U0lfAPBdnt58JTaczxM=" }, "bip66": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", - "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", - "requires": { - "safe-buffer": "5.1.1" - } + "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=" }, "bitcoinjs-lib": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-2.3.0.tgz", "integrity": "sha1-+k0nuWlkFdWzA1furF0iJxPhlmo=", - "requires": { - "bigi": "1.4.2", - "bip66": "1.1.5", - "bs58check": "1.3.4", - "buffer-compare": "1.1.1", - "buffer-equals": "1.0.4", - "buffer-reverse": "1.0.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "ecurve": "1.0.5", - "randombytes": "2.0.5", - "typeforce": "1.11.3", - "wif": "2.0.6" - }, "dependencies": { "bs58check": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-1.3.4.tgz", - "integrity": "sha1-xSVABzdJEXcU+gQsMEfrj5FRy/g=", - "requires": { - "bs58": "3.1.0", - "create-hash": "1.1.3" - } + "integrity": "sha1-xSVABzdJEXcU+gQsMEfrj5FRy/g=" } } }, @@ -239,9 +157,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", - "requires": { - "readable-stream": "2.3.3" - }, "dependencies": { "isarray": { "version": "1.0.0", @@ -251,24 +166,12 @@ "readable-stream": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } + "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=" }, "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=" } } }, @@ -280,15 +183,12 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=" }, "boom": { "version": "2.10.1", "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "requires": { - "hoek": "2.16.3" - } + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=" }, "brorand": { "version": "1.1.0", @@ -303,47 +203,27 @@ "browserify-aes": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", - "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=", - "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.0", - "inherits": "2.0.3" - } + "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=" }, "bs58": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bs58/-/bs58-3.1.0.tgz", - "integrity": "sha1-1MJjiL9IBMrHFBQbGUWqR+XrJI4=", - "requires": { - "base-x": "1.1.0" - } + "integrity": "sha1-1MJjiL9IBMrHFBQbGUWqR+XrJI4=" }, "bs58check": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.0.2.tgz", "integrity": "sha1-BvY7AcL6YXMDPJDrh/H+PS4T2Jo=", - "requires": { - "bs58": "4.0.1", - "create-hash": "1.1.3" - }, "dependencies": { "base-x": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.2.tgz", - "integrity": "sha1-v4c4YbdRQnm3lp80CSnquHwR0TA=", - "requires": { - "safe-buffer": "5.1.1" - } + "integrity": "sha1-v4c4YbdRQnm3lp80CSnquHwR0TA=" }, "bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", - "requires": { - "base-x": "3.0.2" - } + "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=" } } }, @@ -385,21 +265,12 @@ "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } + "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=" }, "clipboard": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-1.7.1.tgz", - "integrity": "sha1-Ng1taUbpmnof7zleQrqStem1oWs=", - "requires": { - "good-listener": "1.2.2", - "select": "1.1.2", - "tiny-emitter": "2.0.2" - } + "integrity": "sha1-Ng1taUbpmnof7zleQrqStem1oWs=" }, "co": { "version": "4.6.0", @@ -414,10 +285,7 @@ "combined-stream": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "requires": { - "delayed-stream": "1.0.0" - } + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=" }, "console-control-strings": { "version": "1.1.0", @@ -427,7 +295,8 @@ "core-js": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.0.tgz", - "integrity": "sha1-VpwFCRi+ZIazg3VSAorgRmtxcIY=" + "integrity": "sha1-VpwFCRi+ZIazg3VSAorgRmtxcIY=", + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -438,84 +307,38 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/cosmos-delegation-game/-/cosmos-delegation-game-0.1.2.tgz", "integrity": "sha1-HzCGPHd1GSdU+R63km4iGrQ4U9Y=", - "requires": { - "basecoin": "2.3.1", - "bluebird": "3.5.0", - "cosmos-fundraiser": "7.14.4", - "old": "0.2.0", - "tendermint": "2.0.3", - "tendermint-crypto": "github:mappum/js-crypto#1be988d2aecd81e824ff0d1fc4ea88d5c8e19bdb", - "varstruct": "6.1.1" - }, "dependencies": { "varstruct": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/varstruct/-/varstruct-6.1.1.tgz", - "integrity": "sha1-QtQ0f72R9Yznhi94YH3RgTvUUDY=", - "requires": { - "int53": "0.2.4" - } + "integrity": "sha1-QtQ0f72R9Yznhi94YH3RgTvUUDY=" } } }, "cosmos-fundraiser": { "version": "7.14.4", "resolved": "https://registry.npmjs.org/cosmos-fundraiser/-/cosmos-fundraiser-7.14.4.tgz", - "integrity": "sha1-99h+m5K3024Favt7NiXKUy3x6a8=", - "requires": { - "bip39": "2.4.0", - "bitcoinjs-lib": "2.3.0", - "bitwise-xor": "0.0.0", - "browser-request": "0.3.3", - "bs58check": "2.0.2", - "create-hash": "1.1.3", - "keccak": "1.3.0", - "left-pad": "1.1.3", - "request": "2.81.0", - "secp256k1": "3.3.0", - "web3": "0.18.4" - } + "integrity": "sha1-99h+m5K3024Favt7NiXKUy3x6a8=" }, "cosmos-sdk": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/cosmos-sdk/-/cosmos-sdk-1.3.0.tgz", - "integrity": "sha512-3d7hTB0s7T4BhQbmev0Qc/iOFekuB+QkI3/IMDXDiK2xGeeAIJZRYYyxezcEWB7/er5vXF7UNuVEySynw4UU3g==", - "requires": { - "axios": "0.16.2", - "old": "0.2.0" - } + "integrity": "sha1-ViV/Ao3Preo9W/E1R3gubZfJTFA=" }, "create-hash": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", - "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "sha.js": "2.4.8" - } + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=" }, "create-hmac": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", - "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.8" - } + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=" }, "cryptiles": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "requires": { - "boom": "2.10.1" - } + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=" }, "crypto-js": { "version": "3.1.8", @@ -526,19 +349,11 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/crypto-service-client/-/crypto-service-client-1.1.1.tgz", "integrity": "sha1-D1WAVTa1HDz6/hD/Okde2nAAIIQ=", - "requires": { - "browser-request": "0.3.3", - "old": "0.1.3", - "request": "2.81.0" - }, "dependencies": { "old": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/old/-/old-0.1.3.tgz", - "integrity": "sha1-WCTZn/xOxujFKz886VWhel+BStE=", - "requires": { - "object-assign": "4.1.1" - } + "integrity": "sha1-WCTZn/xOxujFKz886VWhel+BStE=" } } }, @@ -546,9 +361,6 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "1.0.0" - }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -560,18 +372,12 @@ "debug": { "version": "2.6.8", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "requires": { - "ms": "2.0.0" - } + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=" }, "decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "requires": { - "mimic-response": "1.0.0" - } + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=" }, "deep-equal": { "version": "1.0.1", @@ -586,18 +392,12 @@ "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.2" - }, + "integrity": "sha1-Os0uC3XRZpkkvApLZChRExFz4es=", "dependencies": { "abstract-leveldown": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.2.tgz", - "integrity": "sha512-6RmGuGZSsvwIYS9otANM+Rie7/6UNdE0IbxwUiXFjXmjHNCJZEjyX2Pltl5BvIYszLODlsnXtyA7A7Ujlca4Gw==", - "requires": { - "xtend": "4.0.1" - } + "integrity": "sha512-6RmGuGZSsvwIYS9otANM+Rie7/6UNdE0IbxwUiXFjXmjHNCJZEjyX2Pltl5BvIYszLODlsnXtyA7A7Ujlca4Gw==" }, "xtend": { "version": "4.0.1", @@ -624,12 +424,7 @@ "drbg.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", - "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", - "requires": { - "browserify-aes": "1.0.6", - "create-hash": "1.1.3", - "create-hmac": "1.1.6" - } + "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=" }, "duplexer3": { "version": "0.1.4", @@ -639,13 +434,7 @@ "duplexify": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.1.tgz", - "integrity": "sha512-j5goxHTwVED1Fpe5hh3q9R93Kip0Bg2KVAt4f8CEYM3UEwYcPSvWbXaUQOzdX/HtiNomipv+gU7ASQPDbV7pGQ==", - "requires": { - "end-of-stream": "1.4.0", - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "stream-shift": "1.0.0" - }, + "integrity": "sha1-ThUWvmiDi8kKSZlPCzmm5ZYL780=", "dependencies": { "isarray": { "version": "1.0.0", @@ -655,24 +444,12 @@ "readable-stream": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } + "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=" }, "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=" } } }, @@ -680,56 +457,32 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true, - "requires": { - "jsbn": "0.1.1" - } + "optional": true }, "ecurve": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/ecurve/-/ecurve-1.0.5.tgz", - "integrity": "sha1-0Ujo/lCmdPmDu1uuCdoOoj4QU14=", - "requires": { - "bigi": "1.4.2" - } + "integrity": "sha1-0Ujo/lCmdPmDu1uuCdoOoj4QU14=" }, "ed25519-supercop": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/ed25519-supercop/-/ed25519-supercop-1.0.2.tgz", - "integrity": "sha1-gOadCB0hZHtc1OOR1aO4Qhramc4=", - "requires": { - "nan": "2.6.2" - } + "integrity": "sha1-gOadCB0hZHtc1OOR1aO4Qhramc4=" }, "elliptic": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", - "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" - } + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=" }, "end-of-stream": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", - "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", - "requires": { - "once": "1.4.0" - } + "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=" }, "errno": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", - "requires": { - "prr": "0.0.0" - }, "dependencies": { "prr": { "version": "0.0.0", @@ -746,10 +499,7 @@ "evp_bytestokey": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", - "integrity": "sha1-SXtmrZ/vZc18CKYYCCS6FHa2blM=", - "requires": { - "create-hash": "1.1.3" - } + "integrity": "sha1-SXtmrZ/vZc18CKYYCCS6FHa2blM=" }, "expand-template": { "version": "1.0.3", @@ -774,10 +524,7 @@ "follow-redirects": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.2.4.tgz", - "integrity": "sha512-Suw6KewLV2hReSyEOeql+UUkBVyiBm3ok1VPrVFRZnQInWpdoZbbiG5i8aJVSjTr0yQ4Ava0Sh6/joCg1Brdqw==", - "requires": { - "debug": "2.6.8" - } + "integrity": "sha1-NV6PTRaHa0P1d7DVziZouXIyFOo=" }, "forever-agent": { "version": "0.6.1", @@ -787,21 +534,12 @@ "form-data": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.16" - } + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=" }, "fs-extra": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", - "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0" - } + "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=" }, "functional-red-black-tree": { "version": "1.0.1", @@ -811,17 +549,7 @@ "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "1.1.2", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=" }, "get-stream": { "version": "3.0.0", @@ -832,9 +560,6 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "1.0.0" - }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -851,31 +576,12 @@ "good-listener": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", - "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", - "requires": { - "delegate": "3.1.3" - } + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=" }, "got": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "requires": { - "decompress-response": "3.3.0", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-plain-obj": "1.1.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "isurl": "1.0.0", - "lowercase-keys": "1.0.0", - "p-cancelable": "0.3.0", - "p-timeout": "1.2.0", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "url-parse-lax": "1.0.0", - "url-to-options": "1.0.1" - } + "integrity": "sha1-BUUP2ECU5rvqVvRRpDqcKJFmOFo=" }, "graceful-fs": { "version": "4.1.11", @@ -890,11 +596,7 @@ "har-validator": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=" }, "has-symbol-support-x": { "version": "1.4.0", @@ -904,10 +606,7 @@ "has-to-string-tag-x": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.0.tgz", - "integrity": "sha512-R3OdOP9j6AH5hS1yXeu9wAS+iKSZQx/CC6aMdN6WiaqPlBoA2S+47MtoMsZgKr2m0eAJ+73WWGX0RaFFE5XWKA==", - "requires": { - "has-symbol-support-x": "1.4.0" - } + "integrity": "sha512-R3OdOP9j6AH5hS1yXeu9wAS+iKSZQx/CC6aMdN6WiaqPlBoA2S+47MtoMsZgKr2m0eAJ+73WWGX0RaFFE5XWKA==" }, "has-unicode": { "version": "2.0.1", @@ -917,40 +616,22 @@ "hash-base": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", - "requires": { - "inherits": "2.0.3" - } + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=" }, "hash.js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" - } + "integrity": "sha1-NA3tvmKQGHFRweodd3o0SJNd+EY=" }, "hawk": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=" }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" - } + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=" }, "hoek": { "version": "2.16.3", @@ -960,12 +641,7 @@ "http-signature": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - } + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=" }, "idb-wrapper": { "version": "1.7.1", @@ -1000,10 +676,7 @@ "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.1" - } + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=" }, "is-object": { "version": "1.0.1", @@ -1048,20 +721,12 @@ "isurl": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "requires": { - "has-to-string-tag-x": "1.4.0", - "is-object": "1.0.1" - } + "integrity": "sha1-sn9PSfPNqj6kSgpbfzRi5u3DnWc=" }, "js-weave": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/js-weave/-/js-weave-1.3.0.tgz", - "integrity": "sha512-yY0DU2QYk9SjvqnjDiINRIJaSXoIk71ruKRNyz+/VQVMSx46x744lWsWR3dInQhswGNNy1JNLuKBbBdfjqHrrw==", - "requires": { - "axios": "0.16.2", - "old": "0.2.0" - } + "integrity": "sha1-PPeVWHiLXw9E4wCrd++5KSjQXvI=" }, "jsbn": { "version": "0.1.1", @@ -1077,10 +742,7 @@ "json-stable-stringify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "requires": { - "jsonify": "0.0.0" - } + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=" }, "json-stringify-safe": { "version": "5.0.1", @@ -1090,10 +752,7 @@ "jsonfile": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "requires": { - "graceful-fs": "4.1.11" - } + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=" }, "jsonify": { "version": "0.0.0", @@ -1104,12 +763,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -1121,14 +774,7 @@ "keccak": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.3.0.tgz", - "integrity": "sha512-JgsKPxYhcJxKrV+TrCyg/GwZbOjhpRPrz2kG8xbAsUaIDelUlKjm08YcwBO9Fm8sqf/Kg8ZWkk6nWujhLykfvw==", - "requires": { - "bindings": "1.2.1", - "inherits": "2.0.3", - "nan": "2.6.2", - "prebuild-install": "2.2.2", - "safe-buffer": "5.1.1" - } + "integrity": "sha1-NoG9ma09A1TdspuQQMG2VgzOCKw=" }, "left-pad": { "version": "1.1.3", @@ -1138,36 +784,22 @@ "level-browserify": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/level-browserify/-/level-browserify-1.1.1.tgz", - "integrity": "sha1-Ebk/h0yHIy3HUJrWGlkM5lyvBQM=", - "requires": { - "level-js": "2.2.4", - "level-packager": "1.2.1", - "leveldown": "1.7.2" - } + "integrity": "sha1-Ebk/h0yHIy3HUJrWGlkM5lyvBQM=" }, "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==" + "integrity": "sha1-NB8i+QfODxZ2PyS93WgeOVoPuKc=" }, "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.4" - } + "integrity": "sha1-g9v7EvC4olFr3JoxxIdgOOInuFk=" }, "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.3", - "level-errors": "1.0.5", - "readable-stream": "1.1.14", - "xtend": "4.0.1" - }, "dependencies": { "xtend": { "version": "4.0.1", @@ -1179,45 +811,22 @@ "level-js": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/level-js/-/level-js-2.2.4.tgz", - "integrity": "sha1-vAVfQYBjXUSJtWHJSG+jcOjBFpc=", - "requires": { - "abstract-leveldown": "0.12.4", - "idb-wrapper": "1.7.1", - "isbuffer": "0.0.0", - "ltgt": "2.2.0", - "typedarray-to-buffer": "1.0.4", - "xtend": "2.1.2" - } + "integrity": "sha1-vAVfQYBjXUSJtWHJSG+jcOjBFpc=" }, "level-packager": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-1.2.1.tgz", - "integrity": "sha1-Bn/t/Qcrf+PGvsYIDAy9SmsuEfQ=", - "requires": { - "levelup": "1.3.9" - } + "integrity": "sha1-Bn/t/Qcrf+PGvsYIDAy9SmsuEfQ=" }, "level-transactions": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/level-transactions/-/level-transactions-2.1.4.tgz", "integrity": "sha1-tDLlb/7GxDoi0YwDJT/17VW6igs=", - "requires": { - "abstract-leveldown": "2.6.2", - "async-depth-first": "1.0.3", - "errno": "0.1.4", - "functional-red-black-tree": "1.0.1", - "levelup": "1.3.9", - "stream-iterate": "1.2.0", - "xtend": "4.0.1" - }, "dependencies": { "abstract-leveldown": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.2.tgz", - "integrity": "sha512-6RmGuGZSsvwIYS9otANM+Rie7/6UNdE0IbxwUiXFjXmjHNCJZEjyX2Pltl5BvIYszLODlsnXtyA7A7Ujlca4Gw==", - "requires": { - "xtend": "4.0.1" - } + "integrity": "sha512-6RmGuGZSsvwIYS9otANM+Rie7/6UNdE0IbxwUiXFjXmjHNCJZEjyX2Pltl5BvIYszLODlsnXtyA7A7Ujlca4Gw==" }, "xtend": { "version": "4.0.1", @@ -1230,21 +839,11 @@ "version": "1.7.2", "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-1.7.2.tgz", "integrity": "sha1-XjRnuyfuJGpKe429j7KxYgam64s=", - "requires": { - "abstract-leveldown": "2.6.2", - "bindings": "1.2.1", - "fast-future": "1.0.2", - "nan": "2.6.2", - "prebuild-install": "2.2.2" - }, "dependencies": { "abstract-leveldown": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.2.tgz", - "integrity": "sha512-6RmGuGZSsvwIYS9otANM+Rie7/6UNdE0IbxwUiXFjXmjHNCJZEjyX2Pltl5BvIYszLODlsnXtyA7A7Ujlca4Gw==", - "requires": { - "xtend": "4.0.1" - } + "integrity": "sha512-6RmGuGZSsvwIYS9otANM+Rie7/6UNdE0IbxwUiXFjXmjHNCJZEjyX2Pltl5BvIYszLODlsnXtyA7A7Ujlca4Gw==" }, "xtend": { "version": "4.0.1", @@ -1256,16 +855,7 @@ "levelup": { "version": "1.3.9", "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", - "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", - "requires": { - "deferred-leveldown": "1.2.2", - "level-codec": "7.0.1", - "level-errors": "1.0.5", - "level-iterator-stream": "1.3.1", - "prr": "1.0.1", - "semver": "5.4.1", - "xtend": "4.0.1" - }, + "integrity": "sha1-LbyuhFsrsra+qE3zNMR1Uzu9gqs=", "dependencies": { "xtend": { "version": "4.0.1", @@ -1288,21 +878,11 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.2.4.tgz", "integrity": "sha1-zZo0qvB01TRFonEQjrS43U7A8n8=", - "requires": { - "abstract-leveldown": "2.4.1", - "functional-red-black-tree": "1.0.1", - "immediate": "3.2.3", - "inherits": "2.0.3", - "ltgt": "2.1.3" - }, "dependencies": { "abstract-leveldown": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.4.1.tgz", - "integrity": "sha1-s7/tuITraToSd18MVenwpCDM7mQ=", - "requires": { - "xtend": "4.0.1" - } + "integrity": "sha1-s7/tuITraToSd18MVenwpCDM7mQ=" }, "ltgt": { "version": "2.1.3", @@ -1324,10 +904,7 @@ "mime-types": { "version": "2.1.16", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", - "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=", - "requires": { - "mime-db": "1.29.0" - } + "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=" }, "mimic-response": { "version": "1.0.0", @@ -1353,9 +930,6 @@ "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", @@ -1377,13 +951,7 @@ "ndjson": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-1.5.0.tgz", - "integrity": "sha1-rmA7NrE0vOw0e0UkIrC/mNWDLsg=", - "requires": { - "json-stringify-safe": "5.0.1", - "minimist": "1.2.0", - "split2": "2.1.1", - "through2": "2.0.3" - } + "integrity": "sha1-rmA7NrE0vOw0e0UkIrC/mNWDLsg=" }, "node-abi": { "version": "2.1.0", @@ -1398,13 +966,7 @@ "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } + "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=" }, "number-is-nan": { "version": "1.0.1", @@ -1429,18 +991,12 @@ "old": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/old/-/old-0.2.0.tgz", - "integrity": "sha1-rnWp8zuufLP+BjEombeuWnO6JO8=", - "requires": { - "object-assign": "4.1.1" - } + "integrity": "sha1-rnWp8zuufLP+BjEombeuWnO6JO8=" }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1.0.2" - } + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" }, "options": { "version": "0.0.6", @@ -1455,7 +1011,7 @@ "p-cancelable": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" + "integrity": "sha1-ueEjgAvOu3rBOkeb4ZW1B7mNMPo=" }, "p-finally": { "version": "1.0.0", @@ -1465,22 +1021,12 @@ "p-timeout": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.0.tgz", - "integrity": "sha1-mCD5lDTFgXhotPNICe5SkWYNW2w=", - "requires": { - "p-finally": "1.0.0" - } + "integrity": "sha1-mCD5lDTFgXhotPNICe5SkWYNW2w=" }, "pbkdf2": { "version": "3.0.13", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.13.tgz", - "integrity": "sha512-+dCHxDH+djNtjgWmvVC/my3SYBAKpKNqKSjLkp+GtWWYe4XPE+e/PSD2aCanlEZZnqPk2uekTKNC/ccbwd2X2Q==", - "requires": { - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.8" - } + "integrity": "sha512-+dCHxDH+djNtjgWmvVC/my3SYBAKpKNqKSjLkp+GtWWYe4XPE+e/PSD2aCanlEZZnqPk2uekTKNC/ccbwd2X2Q==" }, "performance-now": { "version": "0.2.0", @@ -1490,23 +1036,7 @@ "prebuild-install": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-2.2.2.tgz", - "integrity": "sha512-F46pcvDxtQhbV3B+dm+exHuKxIyJK26fVNiJRmbTW/5D7o0Z2yzc8CKeu7UWbo9XxQZoVOC88aKgySAsza+cWw==", - "requires": { - "expand-template": "1.0.3", - "github-from-package": "0.0.0", - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "node-abi": "2.1.0", - "noop-logger": "0.1.1", - "npmlog": "4.1.2", - "os-homedir": "1.0.2", - "pump": "1.0.2", - "rc": "1.2.1", - "simple-get": "1.4.3", - "tar-fs": "1.15.3", - "tunnel-agent": "0.6.0", - "xtend": "4.0.1" - }, + "integrity": "sha1-3UfE1h83VPsXu/YBdZ5ZIuFuBnE=", "dependencies": { "xtend": { "version": "4.0.1", @@ -1533,21 +1063,12 @@ "pump": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.2.tgz", - "integrity": "sha1-Oz7mUS+U8OV1U4wXmV+fFpkKXVE=", - "requires": { - "end-of-stream": "1.4.0", - "once": "1.4.0" - } + "integrity": "sha1-Oz7mUS+U8OV1U4wXmV+fFpkKXVE=" }, "pumpify": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.3.5.tgz", - "integrity": "sha1-G2ccYZlAq8rqwK0OOjwWS+dgmTs=", - "requires": { - "duplexify": "3.5.1", - "inherits": "2.0.3", - "pump": "1.0.2" - } + "integrity": "sha1-G2ccYZlAq8rqwK0OOjwWS+dgmTs=" }, "punycode": { "version": "1.4.1", @@ -1562,96 +1083,43 @@ "randombytes": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", - "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", - "requires": { - "safe-buffer": "5.1.1" - } + "integrity": "sha1-3ACaJGuNCaF3tLegrne8Vw9LG3k=" }, "rc": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - } + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=" }, "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.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=" }, "regenerator-runtime": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", - "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==" + "integrity": "sha1-flT+W1zNXWYk6mJVw0c74JC4AuE=", + "dev": true }, "request": { "version": "2.81.0", "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.16", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - } + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=" }, "ripemd160": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", - "requires": { - "hash-base": "2.0.2", - "inherits": "2.0.3" - } + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=" }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=" }, "secp256k1": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.3.0.tgz", - "integrity": "sha512-CbrQoeGG5V0kQ1ohEMGI+J7oKerapLTpivLICBaXR0R4HyQcN3kM9itLsV5fdpV1UR1bD14tOkJ1xughmlDIiQ==", - "requires": { - "bindings": "1.2.1", - "bip66": "1.1.5", - "bn.js": "4.11.8", - "create-hash": "1.1.3", - "drbg.js": "1.0.1", - "elliptic": "6.4.0", - "nan": "2.6.2", - "prebuild-install": "2.2.2", - "safe-buffer": "5.1.1" - } + "integrity": "sha1-UOybIBukAUA90TzL8h0x7rP/Q88=" }, "select": { "version": "1.1.2", @@ -1661,7 +1129,7 @@ "semver": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=" }, "set-blocking": { "version": "2.0.0", @@ -1676,10 +1144,7 @@ "sha.js": { "version": "2.4.8", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", - "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=", - "requires": { - "inherits": "2.0.3" - } + "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=" }, "signal-exit": { "version": "3.0.2", @@ -1690,11 +1155,6 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-1.4.3.tgz", "integrity": "sha1-6XVe2kB+ltpAxeUVjJ6jezO+y+s=", - "requires": { - "once": "1.4.0", - "unzip-response": "1.0.2", - "xtend": "4.0.1" - }, "dependencies": { "xtend": { "version": "4.0.1", @@ -1706,33 +1166,17 @@ "sntp": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "requires": { - "hoek": "2.16.3" - } + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=" }, "split2": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/split2/-/split2-2.1.1.tgz", - "integrity": "sha1-eh9VHhdqkOzTNF9yRqDP4XXvT9A=", - "requires": { - "through2": "2.0.3" - } + "integrity": "sha1-eh9VHhdqkOzTNF9yRqDP4XXvT9A=" }, "sshpk": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -1745,10 +1189,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/stream-iterate/-/stream-iterate-1.2.0.tgz", "integrity": "sha1-K9fHcpbBcCpGSIuK1B95hl7s1OE=", - "requires": { - "readable-stream": "2.3.3", - "stream-shift": "1.0.0" - }, "dependencies": { "isarray": { "version": "1.0.0", @@ -1758,24 +1198,12 @@ "readable-stream": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } + "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=" }, "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=" } } }, @@ -1792,12 +1220,7 @@ "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.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=" }, "stringstream": { "version": "0.0.5", @@ -1807,10 +1230,7 @@ "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.1.1" - } + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=" }, "strip-json-comments": { "version": "2.0.1", @@ -1825,24 +1245,12 @@ "tar-fs": { "version": "1.15.3", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.15.3.tgz", - "integrity": "sha1-7M+TXpQUk9gVECjmNuUc5MPKfyA=", - "requires": { - "chownr": "1.0.1", - "mkdirp": "0.5.1", - "pump": "1.0.2", - "tar-stream": "1.5.4" - } + "integrity": "sha1-7M+TXpQUk9gVECjmNuUc5MPKfyA=" }, "tar-stream": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.4.tgz", "integrity": "sha1-NlSc8E7RrumyowwBQyUiONr5QBY=", - "requires": { - "bl": "1.2.1", - "end-of-stream": "1.4.0", - "readable-stream": "2.3.3", - "xtend": "4.0.1" - }, "dependencies": { "isarray": { "version": "1.0.0", @@ -1852,24 +1260,12 @@ "readable-stream": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } + "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=" }, "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=" }, "xtend": { "version": "4.0.1", @@ -1882,44 +1278,21 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/tendermint/-/tendermint-2.0.3.tgz", "integrity": "sha1-av72U2IrNRRVWREVtD246EXpWXI=", - "requires": { - "browser-request": "0.3.3", - "camelcase": "4.1.0", - "ndjson": "1.5.0", - "old": "0.1.3", - "pumpify": "1.3.5", - "request": "2.81.0", - "websocket-stream": "3.3.3" - }, "dependencies": { "old": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/old/-/old-0.1.3.tgz", - "integrity": "sha1-WCTZn/xOxujFKz886VWhel+BStE=", - "requires": { - "object-assign": "4.1.1" - } + "integrity": "sha1-WCTZn/xOxujFKz886VWhel+BStE=" } } }, "tendermint-crypto": { "version": "github:mappum/js-crypto#1be988d2aecd81e824ff0d1fc4ea88d5c8e19bdb", - "requires": { - "create-hash": "1.1.3", - "ed25519-supercop": "1.0.2", - "old": "0.1.3", - "secp256k1": "3.3.0", - "supercop.js": "2.0.1", - "varstruct": "5.3.0" - }, "dependencies": { "old": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/old/-/old-0.1.3.tgz", - "integrity": "sha1-WCTZn/xOxujFKz886VWhel+BStE=", - "requires": { - "object-assign": "4.1.1" - } + "integrity": "sha1-WCTZn/xOxujFKz886VWhel+BStE=" } } }, @@ -1927,10 +1300,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "requires": { - "readable-stream": "2.3.3", - "xtend": "4.0.1" - }, "dependencies": { "isarray": { "version": "1.0.0", @@ -1940,24 +1309,12 @@ "readable-stream": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } + "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=" }, "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=" }, "xtend": { "version": "4.0.1", @@ -1974,23 +1331,17 @@ "tiny-emitter": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.2.tgz", - "integrity": "sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow==" + "integrity": "sha1-gtJ0aKylrejl/R5tIrV91D69+3w=" }, "tough-cookie": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", - "requires": { - "punycode": "1.4.1" - } + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=" }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "5.1.1" - } + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=" }, "tweetnacl": { "version": "0.14.5", @@ -2006,10 +1357,7 @@ "typeforce": { "version": "1.11.3", "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.11.3.tgz", - "integrity": "sha512-+vllWbxe1AKLkO3KNyZPjb51NRHwRE/8bAi/cmF6TK24VqrPiQPRiHrFV19j1xHxxCHQbIvN4Zfco+skuiXSWQ==", - "requires": { - "inherits": "2.0.3" - } + "integrity": "sha512-+vllWbxe1AKLkO3KNyZPjb51NRHwRE/8bAi/cmF6TK24VqrPiQPRiHrFV19j1xHxxCHQbIvN4Zfco+skuiXSWQ==" }, "ultron": { "version": "1.0.2", @@ -2029,10 +1377,7 @@ "url-parse-lax": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "requires": { - "prepend-http": "1.0.4" - } + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=" }, "url-to-options": { "version": "1.0.1", @@ -2042,10 +1387,7 @@ "user-home": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", - "requires": { - "os-homedir": "1.0.2" - } + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=" }, "utf8": { "version": "2.1.2", @@ -2065,10 +1407,7 @@ "varstruct": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/varstruct/-/varstruct-5.3.0.tgz", - "integrity": "sha1-1RtT4gMW0K/dtUz3yt6JTmKPHLU=", - "requires": { - "int53": "0.2.4" - } + "integrity": "sha1-1RtT4gMW0K/dtUz3yt6JTmKPHLU=" }, "varstruct-match": { "version": "3.1.0", @@ -2079,11 +1418,6 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -2105,15 +1439,12 @@ "vue-resource": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/vue-resource/-/vue-resource-1.3.4.tgz", - "integrity": "sha1-n8C99qL1yrQwEp/JnTR7PernsJk=", - "requires": { - "got": "7.1.0" - } + "integrity": "sha1-n8C99qL1yrQwEp/JnTR7PernsJk=" }, "vue-router": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-2.7.0.tgz", - "integrity": "sha512-kxgsT50dDExua3i103nxNBjlfk8LeUmO9iujVxXV42MnISINHUjqMrknpOOJEg+i9nEkoVgG8N86Pklze35c/A==" + "integrity": "sha1-FtQkSTqlHDyMzot8chDqTDqJr/E=" }, "vuex": { "version": "2.3.1", @@ -2123,34 +1454,17 @@ "watt": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/watt/-/watt-3.3.0.tgz", - "integrity": "sha1-yEY8QI0bSHhwKlPSG4RnaqpsATY=", - "requires": { - "setimmediate": "1.0.5" - } + "integrity": "sha1-yEY8QI0bSHhwKlPSG4RnaqpsATY=" }, "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.8", - "utf8": "2.1.2", - "xhr2": "0.1.4", - "xmlhttprequest": "1.8.0" - } + "integrity": "sha1-gewXhBRUkfLqqJVbMcBgSeB8Xn0=" }, "websocket-stream": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/websocket-stream/-/websocket-stream-3.3.3.tgz", "integrity": "sha1-Nh2lQEozfmDPvCm0pGNodiZ53ws=", - "requires": { - "duplexify": "3.5.1", - "inherits": "2.0.3", - "through2": "2.0.3", - "ws": "1.1.4", - "xtend": "4.0.1" - }, "dependencies": { "xtend": { "version": "4.0.1", @@ -2162,18 +1476,12 @@ "wide-align": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", - "requires": { - "string-width": "1.0.2" - } + "integrity": "sha1-Vx4PGwYEY268DfwhsDObvjE0FxA=" }, "wif": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", - "integrity": "sha1-CNP1IFbGZnkplyb63g1DKudLRwQ=", - "requires": { - "bs58check": "2.0.2" - } + "integrity": "sha1-CNP1IFbGZnkplyb63g1DKudLRwQ=" }, "wrappy": { "version": "1.0.2", @@ -2183,11 +1491,7 @@ "ws": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.4.tgz", - "integrity": "sha1-V/QNA2gy5fUFVmKjl8Tedu1mv2E=", - "requires": { - "options": "0.0.6", - "ultron": "1.0.2" - } + "integrity": "sha1-V/QNA2gy5fUFVmKjl8Tedu1mv2E=" }, "xhr2": { "version": "0.1.4", @@ -2202,10 +1506,7 @@ "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" - } + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=" } } } diff --git a/app/package.json b/app/package.json index 8e56a37798..ff1b5ce28f 100644 --- a/app/package.json +++ b/app/package.json @@ -6,7 +6,6 @@ "author": "All In Bits, Inc ", "license": "Apache-2.0", "dependencies": { - "babel-runtime": "^6.23.0", "basecoin": "^2.3.1", "clipboard": "^1.6.0", "cosmos-delegation-game": "^0.1.0", @@ -30,6 +29,7 @@ "watt": "^3.3.0" }, "devDependencies": { + "babel-runtime": "^6.26.0", "create-hash": "^1.1.3", "prebuild-install": "^2.1.2" } diff --git a/app/src/helpers/rmdir.js b/app/src/helpers/rmdir.js new file mode 100644 index 0000000000..22b4a39bd2 --- /dev/null +++ b/app/src/helpers/rmdir.js @@ -0,0 +1,24 @@ +const fs = require('fs') + +// under windows removing folders results in several errors EPERM, ENOTEMPTY +// adding the timeout solves these issues +async function deleteFolderRecursive (path) { + if (fs.existsSync(path)) { + fs.readdirSync(path).forEach(async function (file, index) { + var curPath = path + '/' + file + if (fs.lstatSync(curPath).isDirectory()) { // recurse + await deleteFolderRecursive(curPath) + } else { // delete file + fs.unlinkSync(curPath) + } + }) + await sleep(10) + fs.rmdirSync(path) + } +} + +function sleep (ms) { + return new Promise((resolve) => setTimeout(resolve, ms)) +} + +module.exports = deleteFolderRecursive diff --git a/app/src/main/index.js b/app/src/main/index.js index c1019b6a56..01d2b0208f 100644 --- a/app/src/main/index.js +++ b/app/src/main/index.js @@ -5,17 +5,21 @@ let fs = require('fs-extra') let { join } = require('path') let { spawn } = require('child_process') let home = require('user-home') -let mkdirp = require('mkdirp').sync let RpcClient = require('tendermint') let semver = require('semver') +// this dependency is wrapped in a file as it was not possible to mock the import with jest any other way let event = require('event-to-promise') let pkg = require('../../package.json') +let rmdir = require('../helpers/rmdir.js') let shuttingDown = false let mainWindow let basecoinProcess, baseserverProcess, tendermintProcess +let streams = [] const DEV = process.env.NODE_ENV === 'development' -const TEST = !!process.env.COSMOS_TEST +const TEST = JSON.parse(process.env.COSMOS_TEST || 'false') !== false +// TODO default logging or default disable logging? +const LOGGING = JSON.parse(process.env.LOGGING || DEV) !== false const winURL = DEV ? `http://localhost:${require('../../../config').port}` : `file://${__dirname}/index.html` @@ -27,29 +31,63 @@ let DEFAULT_NETWORK = join(__dirname, '../networks/tak') let NODE_BINARY = 'basecoin' let SERVER_BINARY = 'baseserver' +function log (...args) { + if (LOGGING) { + console.log(...args) + } +} + +function logProcess (process, logPath) { + fs.ensureFileSync(logPath) + // Writestreams are blocking fs cleanup in tests, if you get errors, disable logging + if (LOGGING) { + let logStream = fs.createWriteStream(logPath) + streams.push(logStream) + process.stdout.pipe(logStream) + process.stderr.pipe(logStream) + } +} + function sleep (ms) { return new Promise((resolve) => setTimeout(resolve, ms)) } +function expectCleanExit (process, errorMessage = 'Process exited unplaned') { + return new Promise((resolve, reject) => { + process.on('exit', code => { + if (code !== 0 && !shuttingDown) { + throw new Error(errorMessage) + } + resolve() + }) + }) +} + function shutdown () { + if (shuttingDown) return + mainWindow = null shuttingDown = true if (basecoinProcess) { - console.log('killing basecoin') + log('killing basecoin') basecoinProcess.kill('SIGKILL') basecoinProcess = null } if (baseserverProcess) { - console.log('killing baseserver') + log('killing baseserver') baseserverProcess.kill('SIGKILL') baseserverProcess = null } if (tendermintProcess) { - console.log('killing tendermint') + log('killing tendermint') tendermintProcess.kill('SIGKILL') tendermintProcess = null } + + return Promise.all( + streams.map(stream => new Promise((resolve) => stream.close(resolve))) + ) } function createWindow () { @@ -70,7 +108,7 @@ function createWindow () { mainWindow.on('closed', shutdown) // eslint-disable-next-line no-console - console.log('mainWindow opened') + log('mainWindow opened') // handle opening external links in OS's browser let webContents = mainWindow.webContents @@ -123,11 +161,17 @@ function startProcess (name, args, env) { } let argString = args.map((arg) => JSON.stringify(arg)).join(' ') - console.log(`spawning ${binPath} with args "${argString}"`) + log(`spawning ${binPath} with args "${argString}"`) let child = spawn(binPath, args, env) - child.stdout.on('data', (data) => console.log(`${name}: ${data}`)) - child.stderr.on('data', (data) => console.log(`${name}: ${data}`)) - child.on('exit', (code) => console.log(`${name} exited with code ${code}`)) + child.stdout.on('data', (data) => !shuttingDown && log(`${name}: ${data}`)) + child.stderr.on('data', (data) => !shuttingDown && log(`${name}: ${data}`)) + child.on('exit', (code) => !shuttingDown && log(`${name} exited with code ${code}`)) + child.on('error', function (err) { + if (!(shuttingDown && err.code === 'ECONNRESET')) { + // Ignore ECONNRESET and re throw anything else + throw err + } + }) return child } @@ -145,7 +189,6 @@ app.on('activate', () => { // start basecoin node function startBasecoin (root) { - let log = fs.createWriteStream(join(root, 'basecoin.log')) let opts = { env: { BCHOME: root, @@ -160,14 +203,13 @@ function startBasecoin (root) { ] if (DEV) args.push('--log_level', 'info') let child = startProcess(NODE_BINARY, args, opts) - child.stdout.pipe(log) - child.stderr.pipe(log) + logProcess(child, join(root, 'basecoin.log')) + expectCleanExit(child, 'Basecoin start exited unplanned') return child } // start tendermint node async function startTendermint (root) { - let log = fs.createWriteStream(join(root, 'tendermint.log')) let opts = { env: { BCHOME: root, @@ -179,24 +221,35 @@ async function startTendermint (root) { 'node', '--home', root ] - if (DEV) args.push('--log_level', 'info') + // if (DEV) args.push('--log_level', 'info') let child = startProcess('tendermint', args, opts) - child.stdout.pipe(log) - child.stderr.pipe(log) + logProcess(child, join(root, 'tendermint.log')) + expectCleanExit(child, 'Tendermint exited unplanned') let rpc = RpcClient('localhost:46657') let status = () => new Promise((resolve, reject) => { - // ignore errors, since we'll just poll until we get a response - rpc.status((_, res) => { + rpc.status((err, res) => { + // ignore connection errors, since we'll just poll until we get a response + if (err && err.code !== 'ECONNREFUSED') { + reject(err) + return + } resolve(res) }) }) - while (true) { - console.log('trying to get tendermint RPC status') + let noFailure = true + while (noFailure) { + if (shuttingDown) return + + log('trying to get tendermint RPC status') let res = await status() + .catch(e => { + noFailure = false + throw new Error(`Tendermint produced an unexpected error: ${e.message}`) + }) if (res) { if (res.latest_block_height > 0) break - console.log('waiting for blockchain to start syncing') + log('waiting for blockchain to start syncing') } await sleep(1000) } @@ -206,26 +259,25 @@ async function startTendermint (root) { // start baseserver REST API async function startBaseserver (home) { - console.log('startBaseserver', home) - let log = fs.createWriteStream(join(home, 'baseserver.log')) - + log('startBaseserver', home) let child = startProcess(SERVER_BINARY, [ 'serve', '--home', home // , // '--trust-node' ]) - child.stdout.pipe(log) - child.stderr.pipe(log) + logProcess(child, join(home, 'baseserver.log')) // restore baseserver if it crashes child.on('exit', async () => { if (shuttingDown) return - console.log('baseserver crashed, restarting') + log('baseserver crashed, restarting') await sleep(1000) await startBaseserver(home) }) while (true) { + if (shuttingDown) break + let data = await event(child.stderr, 'data') if (data.toString().includes('Serving on')) break } @@ -248,15 +300,15 @@ async function initBasecoin (root) { '1B1BE55F969F54064628A63B9559E7C21C925165', '--home', root ], opts) - await event(child, 'exit') + await expectCleanExit(child, 'Basecoin init exited unplanned') // copy predefined genesis.json and config.toml into root let networkPath = process.env.COSMOS_NETWORK || DEFAULT_NETWORK fs.accessSync(networkPath) // crash if invalid path fs.copySync(networkPath, root) - if (DEV || TEST) { - console.log('adding self to validator set') + if (DEV) { + log('adding self to validator set') // replace validator set so our node has 100% of voting power let privValidatorText = fs.readFileSync(join(root, 'priv_validator.json'), 'utf8') let privValidator = JSON.parse(privValidatorText) @@ -272,6 +324,8 @@ async function initBasecoin (root) { genesisText = JSON.stringify(genesis, null, ' ') fs.writeFileSync(join(root, 'genesis.json'), genesisText) } + + log('basecoin initialized') } function exists (path) { @@ -294,14 +348,15 @@ async function initBaseserver (chainId, home) { // '--trust-node' ]) child.stdout.on('data', (data) => { + if (shuttingDown) return // answer 'y' to the prompt about trust seed. we can trust this is correct // since the baseserver is talking to our own full node child.stdin.write('y\n') }) - await event(child, 'exit') + await expectCleanExit(child, 'Baseserver init exited unplanned') } -function backupData (root) { +async function backupData (root) { let i = 1 let path do { @@ -309,11 +364,12 @@ function backupData (root) { i++ } while (exists(path)) - console.log(`backing up data to "${path}"`) - fs.moveSync(root, path, { + log(`backing up data to "${path}"`) + fs.copySync(root, path, { overwrite: false, errorOnExist: true }) + await rmdir(root) } process.on('exit', shutdown) @@ -325,17 +381,21 @@ async function main () { let init = true if (exists(root)) { - console.log(`root exists (${root})`) + log(`root exists (${root})`) // check if the existing data came from a compatible app version // if not, backup the data and re-initialize if (exists(versionPath)) { let existingVersion = fs.readFileSync(versionPath, 'utf8') let compatible = semver.diff(existingVersion, pkg.version) !== 'major' - if (compatible) init = false - else backupData(root) + if (compatible) { + log('configs are compatible with current app version') + init = false + } else { + await backupData(root) + } } else { - backupData(root) + await backupData(root) } // check to make sure the genesis.json we want to use matches the one @@ -347,24 +407,34 @@ async function main () { if (genesisJSON.chain_id !== 'local') { let specifiedGenesis = fs.readFileSync(join(process.env.COSMOS_NETWORK, 'genesis.json'), 'utf8') if (existingGenesis.trim() !== specifiedGenesis.trim()) { - console.log('genesis has changed') - backupData(root) + log('genesis has changed') + await backupData(root) + init = true } } } } if (init) { - console.log(`initializing data directory (${root})`) - mkdirp(root) + log(`initializing data directory (${root})`) + await fs.ensureDir(root) await initBasecoin(root) + .catch(e => { + e.message = `Initialization of basecoin failed: ${e.message}` + throw e + }) fs.writeFileSync(versionPath, pkg.version) } - if (!DEV) { + if (!DEV && !TEST) { + let logFilePath = join(root, 'main.log') + log('Redirecting console output to logfile', logFilePath) // redirect stdout/err to logfile - let mainLog = fs.createWriteStream(join(root, 'main.log')) - console.log = function (...args) { + // TODO overwriting console.log sounds like a bad idea, can we find an alternative? + let mainLog = fs.createWriteStream(logFilePath) + streams.push(mainLog) + // eslint-disable-next-line no-func-assign + log = function (...args) { mainLog.write(`${args.join(' ')}\n`) } console.error = function (...args) { @@ -372,30 +442,52 @@ async function main () { } } - console.log('starting app') - console.log(`dev mode: ${DEV}`) - console.log(`winURL: ${winURL}`) + log('starting app') + log(`dev mode: ${DEV}`) + log(`winURL: ${winURL}`) // read chainId from genesis.json - let genesisText = fs.readFileSync(genesisPath, 'utf8') + let genesisText + try { + genesisText = fs.readFileSync(genesisPath, 'utf8') + } catch (e) { + throw new Error(`Can't open genesis.json: ${e.message}`) + } let genesis = JSON.parse(genesisText) let chainId = genesis.chain_id - console.log('starting basecoin and tendermint') + log('starting basecoin and tendermint') basecoinProcess = startBasecoin(root) tendermintProcess = await startTendermint(root) - console.log('basecoin and tendermint are ready') + .catch(e => { + e.message = `Can't start Tendermint: ${e.message}` + throw e + }) + log('basecoin and tendermint are ready') let baseserverHome = join(root, 'baseserver') if (init) { - initBaseserver(chainId, baseserverHome) + await initBaseserver(chainId, baseserverHome) } - console.log('starting baseserver') + log('starting baseserver') baseserverProcess = await startBaseserver(baseserverHome) - console.log('baseserver ready') + .catch(e => { + e.message = `Can't start baseserver: ${e.message}` + throw e + }) + log('baseserver ready') } -main().catch(function (err) { - console.error(err.stack) - process.exit(1) -}) +module.exports = Object.assign( + main() + // HACK if we need process.exit(1) we can wrap this whole file in another file + // We need the responses from main to test + // .catch(function (err) { + // console.error('Error in main process:', err.stack) + // // process.exit(1) + // }) + .then(() => ({ + shutdown, + processes: {basecoinProcess, tendermintProcess, baseserverProcess} + })) +) diff --git a/app/src/renderer/components/staking/PanelSort.vue b/app/src/renderer/components/staking/PanelSort.vue index c9d971c8ce..629ecb02f2 100644 --- a/app/src/renderer/components/staking/PanelSort.vue +++ b/app/src/renderer/components/staking/PanelSort.vue @@ -8,6 +8,7 @@