diff --git a/.babelrc b/.babelrc deleted file mode 100644 index cfa759dd9047..000000000000 --- a/.babelrc +++ /dev/null @@ -1,23 +0,0 @@ -{ - "presets": [ - [ - "env", - { - "targets": { - "browsers": [ - ">0.25%", - "not ie 11", - "not op_mini all" - ] - } - } - ], - "react", - "stage-0" - ], - "plugins": [ - "transform-runtime", - "transform-async-to-generator", - "transform-class-properties" - ] -} \ No newline at end of file diff --git a/.circleci/config.yml b/.circleci/config.yml index a69903373487..d4b0febd7ab0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,107 +1,130 @@ -version: 2 +version: 2.1 workflows: - version: 2 - full_test: + test_and_release: jobs: - - prep-deps-npm + - create_release_pull_request: + filters: + branches: + only: + - /^Version-v(\d+)[.](\d+)[.](\d+)/ + - prep-deps + - test-deps - prep-build: requires: - - prep-deps-npm - # - prep-docs: - # requires: - # - prep-deps-npm - - prep-scss: + - prep-deps + - prep-build-test: + requires: + - prep-deps + - prep-build-storybook: requires: - - prep-deps-npm + - prep-deps - test-lint: requires: - - prep-deps-npm - - test-deps: + - prep-deps + - test-lint-shellcheck + - test-lint-lockfile: requires: - - prep-deps-npm + - prep-deps - test-e2e-chrome: requires: - - prep-deps-npm + - prep-build-test - test-e2e-firefox: requires: - - prep-deps-npm - # - test-e2e-beta-drizzle: - # requires: - # - prep-deps-npm - # - prep-build + - prep-build-test - test-unit: requires: - - prep-deps-npm - - test-mozilla-lint: + - prep-deps + - test-unit-global: requires: - - prep-deps-npm - - prep-build - - test-integration-flat-chrome: + - prep-deps + - validate-source-maps: requires: - - prep-deps-npm - - prep-scss - - test-integration-flat-firefox: + - prep-build + - test-mozilla-lint: requires: - - prep-deps-npm - - prep-scss + - prep-deps + - prep-build - all-tests-pass: requires: - test-lint + - test-lint-shellcheck + - test-lint-lockfile - test-unit + - test-unit-global + - validate-source-maps - test-mozilla-lint - test-e2e-chrome - test-e2e-firefox - # - test-e2e-beta-drizzle - - test-integration-flat-chrome - - test-integration-flat-firefox - - job-screens: + - benchmark: requires: - - prep-deps-npm - - prep-build - - all-tests-pass + - prep-build-test - job-publish-prerelease: requires: - - prep-deps-npm + - prep-deps - prep-build - - job-screens + - benchmark - all-tests-pass - job-publish-release: filters: branches: only: master requires: - - prep-deps-npm + - prep-deps - prep-build - # - prep-docs - - job-screens - all-tests-pass + - job-publish-storybook: + filters: + branches: + only: develop + requires: + - prep-build-storybook + - coveralls-upload: + requires: + - test-unit jobs: - prep-deps-npm: + create_release_pull_request: + docker: + - image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88 + steps: + - checkout + - run: + name: Create GitHub Pull Request for version + command: | + .circleci/scripts/release-bump-changelog-version + .circleci/scripts/release-bump-manifest-version + .circleci/scripts/release-create-release-pr + + prep-deps: docker: - - image: circleci/node:10.16-browsers + - image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88 steps: - checkout - run: - name: Install deps via npm + name: Install deps command: | - npm ci + .circleci/scripts/deps-install.sh + - run: + name: Collect yarn install HAR logs + command: | + .circleci/scripts/collect-har-artifact.sh - persist_to_workspace: root: . paths: - node_modules + - build-artifacts prep-build: docker: - - image: circleci/node:10.16-browsers + - image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88 steps: - checkout - attach_workspace: at: . - run: name: build:dist - command: npm run dist + command: yarn dist - run: name: build:debug command: find dist/ -type f -exec md5sum {} \; | sort -k 2 @@ -111,85 +134,98 @@ jobs: - dist - builds - prep-docs: + prep-build-test: docker: - - image: circleci/node:10.16-browsers + - image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88 steps: - checkout - attach_workspace: at: . - run: - name: build:dist - command: npm run doc + name: Build extension for testing + command: yarn build:test + - run: + name: Move test build to 'dist-test' to avoid conflict with production build + command: mv ./dist ./dist-test - persist_to_workspace: root: . paths: - - docs/jsdocs + - dist-test - prep-scss: + prep-build-storybook: docker: - - image: circleci/node:10.16-browsers + - image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88 steps: - checkout - attach_workspace: at: . - run: - name: Get Scss Cache key - # this allows us to checksum against a whole directory - command: find ui/app/css -type f -exec md5sum {} \; | sort -k 2 > scss_checksum - - run: - name: Build for integration tests - command: npm run test:integration:build + name: Build Storybook + command: yarn storybook:build - persist_to_workspace: root: . paths: - - ui/app/css/output + - .out test-lint: docker: - - image: circleci/node:10.16-browsers + - image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88 + steps: + - checkout + - attach_workspace: + at: . + - run: + name: Lint + command: yarn lint + - run: + name: Verify locales + command: yarn verify-locales --quiet + + test-lint-shellcheck: + docker: + - image: koalaman/shellcheck-alpine@sha256:169a51b086af0ab181e32801c15deb78944bb433d4f2c0a21cc30d4e60547065 + steps: + - checkout + - run: apk add --no-cache bash jq yarn + - run: + name: Shellcheck Lint + command: yarn lint:shellcheck + + test-lint-lockfile: + docker: + - image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88 steps: - checkout - attach_workspace: at: . - run: - name: Test - command: npm run lint + name: lockfile-lint + command: yarn lint:lockfile test-deps: docker: - - image: circleci/node:10.16-browsers + - image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88 steps: - checkout - attach_workspace: at: . - run: - name: npm audit - command: .circleci/scripts/npm-audit + name: yarn audit + command: .circleci/scripts/yarn-audit - # test-e2e-beta-drizzle: - # docker: - # - image: circleci/node:8.11.3-browsers - # steps: - # - checkout - # - attach_workspace: - # at: . - # - run: - # name: test:e2e:drizzle:beta - # command: npm run test:e2e:drizzle:beta - # - store_artifacts: - # path: test-artifacts - # destination: test-artifacts test-e2e-chrome: docker: - - image: circleci/node:10.16-browsers + - image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88 steps: - checkout - attach_workspace: at: . + - run: + name: Move test build to dist + command: mv ./dist-test ./dist - run: name: test:e2e:chrome - command: npm run build:test && npm run test:e2e:chrome + command: yarn test:e2e:chrome no_output_timeout: 20m - store_artifacts: path: test-artifacts @@ -197,7 +233,7 @@ jobs: test-e2e-firefox: docker: - - image: circleci/node:10.16-browsers + - image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88 steps: - checkout - run: @@ -205,24 +241,33 @@ jobs: command: ./.circleci/scripts/firefox-install - attach_workspace: at: . + - run: + name: Move test build to dist + command: mv ./dist-test ./dist - run: name: test:e2e:firefox - command: npm run build:test && npm run test:e2e:chrome + command: yarn test:e2e:firefox no_output_timeout: 20m - store_artifacts: path: test-artifacts destination: test-artifacts - job-screens: + benchmark: docker: - - image: circleci/node:10.16-browsers + - image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88 steps: - checkout - attach_workspace: at: . - run: - name: Test - command: npm run test:screens + name: Move test build to dist + command: mv ./dist-test ./dist + - run: + name: Run page load benchmark + command: yarn benchmark:chrome --out test-artifacts/chrome/benchmark/pageload.json + - store_artifacts: + path: test-artifacts + destination: test-artifacts - persist_to_workspace: root: . paths: @@ -230,11 +275,14 @@ jobs: job-publish-prerelease: docker: - - image: circleci/node:10.16-browsers + - image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88 steps: - checkout - attach_workspace: at: . + - run: + name: build:source-map-explorer + command: ./development/source-map-explorer.sh - store_artifacts: path: dist/sourcemaps destination: builds/sourcemaps @@ -244,79 +292,114 @@ jobs: - store_artifacts: path: test-artifacts destination: test-artifacts + # important: generate sesify viz AFTER uploading builds as artifacts + - run: + name: build:sesify-viz + command: ./.circleci/scripts/create-sesify-viz + - store_artifacts: + path: build-artifacts + destination: build-artifacts - run: name: build:announce command: ./development/metamaskbot-build-announce.js job-publish-release: docker: - - image: circleci/node:10.16-browsers + - image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88 steps: - checkout - attach_workspace: at: . - run: name: sentry sourcemaps upload - command: npm run sentry:publish - # - run: - # name: github gh-pages docs publish - # command: > - # git config --global user.name "metamaskbot" && - # git config --global user.email "admin@metamask.io" && - # npm run publish-docs + command: yarn sentry:publish + - run: + name: Create GitHub release + command: | + .circleci/scripts/release-create-gh-release + - run: + name: Create GitHub Pull Request to sync master with develop + command: .circleci/scripts/release-create-master-pr + + job-publish-storybook: + docker: + - image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88 + steps: + - add_ssh_keys: + fingerprints: + - "5e:a3:2d:35:b6:25:b5:87:b1:41:11:0d:77:50:96:73" + - checkout + - attach_workspace: + at: . + - run: + name: storybook:deploy + command: | + git remote add storybook git@github.com:MetaMask/metamask-storybook.git + yarn storybook:deploy test-unit: docker: - - image: circleci/node:10.16-browsers + - image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88 steps: - checkout - attach_workspace: at: . - run: name: test:coverage - command: npm run test:coverage - test-mozilla-lint: + command: yarn test:coverage + - persist_to_workspace: + root: . + paths: + - .nyc_output + - coverage + test-unit-global: docker: - - image: circleci/node:10.16-browsers + - image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88 steps: - checkout - attach_workspace: at: . - run: - name: test:mozilla-lint - command: npm run mozilla-lint + name: test:unit:global + command: yarn test:unit:global - test-integration-flat-firefox: + validate-source-maps: docker: - - image: circleci/node:10.16-browsers + - image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88 steps: - checkout - attach_workspace: at: . - run: - name: Install Firefox - command: ./.circleci/scripts/firefox-install - - run: - name: test:integration:flat - command: npm run test:flat + name: Validate source maps + command: yarn validate-source-maps - test-integration-flat-chrome: - environment: - browsers: '["Chrome"]' + test-mozilla-lint: docker: - - image: circleci/node:10.16-browsers + - image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88 steps: - checkout - attach_workspace: at: . - run: - name: test:integration:flat - command: npm run test:flat + name: test:mozilla-lint + command: NODE_OPTIONS=--max_old_space_size=3072 yarn mozilla-lint all-tests-pass: docker: - - image: circleci/node:10.16-browsers + - image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88 steps: - run: name: All Tests Passed command: echo 'weew - everything passed!' + + coveralls-upload: + docker: + - image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88 + steps: + - checkout + - attach_workspace: + at: . + - run: + name: Coveralls upload + command: yarn test:coveralls-upload diff --git a/.circleci/scripts/collect-har-artifact.sh b/.circleci/scripts/collect-har-artifact.sh new file mode 100755 index 000000000000..7f6f1aa41957 --- /dev/null +++ b/.circleci/scripts/collect-har-artifact.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -x + +mkdir -p build-artifacts/yarn-install-har +mv ./*.har build-artifacts/yarn-install-har/ diff --git a/.circleci/scripts/create-sesify-viz b/.circleci/scripts/create-sesify-viz new file mode 100755 index 000000000000..33dc0bc721c3 --- /dev/null +++ b/.circleci/scripts/create-sesify-viz @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +set -x +set -e +set -u +set -o pipefail + +# prepare artifacts dir +mkdir -p ./build-artifacts/deps-viz/ + +# generate viz +SESIFY_AUTOGEN=1 yarn build scripts:core:prod:background +npx sesify-viz --deps sesify/deps-background.json --config sesify/background.json --dest ./build-artifacts/deps-viz/background \ No newline at end of file diff --git a/.circleci/scripts/deps-install.sh b/.circleci/scripts/deps-install.sh new file mode 100755 index 000000000000..c8b15e29b61d --- /dev/null +++ b/.circleci/scripts/deps-install.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +# Print commands and their arguments as they are executed. +set -x +# Exit immediately if a command exits with a non-zero status. +set -e + +yarn --frozen-lockfile --ignore-scripts --har + +# run each in subshell so directory change does not persist +# scripts can be any of: +# preinstall +# install +# postinstall + +# for build +(cd node_modules/node-sass && yarn run postinstall) +(cd node_modules/optipng-bin && yarn run postinstall) +(cd node_modules/gifsicle && yarn run postinstall) +(cd node_modules/jpegtran-bin && yarn run postinstall) + +# for test +(cd node_modules/scrypt && yarn run install) +(cd node_modules/weak && yarn run install) +(cd node_modules/chromedriver && yarn run install) +(cd node_modules/geckodriver && yarn run postinstall) + +# for release +(cd node_modules/@sentry/cli && yarn run install) diff --git a/.circleci/scripts/firefox-install b/.circleci/scripts/firefox-install index 7c785b98783e..21766467e731 100755 --- a/.circleci/scripts/firefox-install +++ b/.circleci/scripts/firefox-install @@ -4,7 +4,7 @@ set -e set -u set -o pipefail -FIREFOX_VERSION='62.0' +FIREFOX_VERSION='70.0' FIREFOX_BINARY="firefox-${FIREFOX_VERSION}.tar.bz2" FIREFOX_BINARY_URL="https://ftp.mozilla.org/pub/firefox/releases/${FIREFOX_VERSION}/linux-x86_64/en-US/${FIREFOX_BINARY}" FIREFOX_PATH='/opt/firefox' diff --git a/.circleci/scripts/npm-audit b/.circleci/scripts/npm-audit deleted file mode 100755 index 00a6876ffc15..000000000000 --- a/.circleci/scripts/npm-audit +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -u -set -o pipefail - -if ! npm audit -then - ! npm audit --json > audit.json - printf '%s\n' '' - node .circleci/scripts/npm-audit-check.js -fi diff --git a/.circleci/scripts/npm-audit-check.js b/.circleci/scripts/npm-audit-check.js deleted file mode 100644 index 2fb408add0fb..000000000000 --- a/.circleci/scripts/npm-audit-check.js +++ /dev/null @@ -1,24 +0,0 @@ -const path = require('path') -const audit = require(path.join(__dirname, '..', '..', 'audit.json')) -const error = audit.error -const advisories = Object.keys(audit.advisories || []).map((k) => audit.advisories[k]) - -if (error) { - process.exit(1) -} - -let count = 0 -for (const advisory of advisories) { - if (advisory.severity === 'low') { - continue - } - - count += advisory.findings.some((finding) => (!finding.dev && !finding.optional)) -} - -if (count > 0) { - console.log(`Audit shows ${count} moderate or high severity advisories _in the production dependencies_`) - process.exit(1) -} else { - console.log(`Audit shows _zero_ moderate or high severity advisories _in the production dependencies_`) -} diff --git a/.circleci/scripts/release-bump-changelog-version b/.circleci/scripts/release-bump-changelog-version new file mode 100755 index 000000000000..9fd4ddbb85b5 --- /dev/null +++ b/.circleci/scripts/release-bump-changelog-version @@ -0,0 +1,44 @@ +#!/usr/bin/env bash + +set -e +set -u +set -o pipefail + +if [[ "${CI:-}" != 'true' ]] +then + printf '%s\n' 'CI environment variable must be set to true' + exit 1 +fi + +if [[ "${CIRCLECI:-}" != 'true' ]] +then + printf '%s\n' 'CIRCLECI environment variable must be set to true' + exit 1 +fi + +version="${CIRCLE_BRANCH/Version-v/}" + +if ! grep --quiet --fixed-strings "$version" CHANGELOG.md +then + printf '%s\n' 'Adding this release to CHANGELOG.md' + date_str="$(date '+%a %b %d %Y')" + cp CHANGELOG.md{,.bak} + +update_headers=$(cat < CHANGELOG.md + rm CHANGELOG.md.bak +else + printf '%s\n' "CHANGELOG.md already includes a header for ${version}" + exit 0 +fi diff --git a/.circleci/scripts/release-bump-manifest-version b/.circleci/scripts/release-bump-manifest-version new file mode 100755 index 000000000000..7579ad70a9a5 --- /dev/null +++ b/.circleci/scripts/release-bump-manifest-version @@ -0,0 +1,38 @@ +#!/usr/bin/env bash + +set -e +set -u +set -o pipefail + +if [[ "${CI:-}" != 'true' ]] +then + printf '%s\n' 'CI environment variable must be set to true' + exit 1 +fi + +if [[ "${CIRCLECI:-}" != 'true' ]] +then + printf '%s\n' 'CIRCLECI environment variable must be set to true' + exit 1 +fi + +printf '%s\n' 'Updating the manifest version if needed' + +version="${CIRCLE_BRANCH/Version-v/}" +updated_manifest="$(jq ".version = \"$version\"" app/manifest/_base.json)" +printf '%s\n' "$updated_manifest" > app/manifest/_base.json + +if [[ -z $(git status --porcelain) ]] +then + printf '%s\n' 'App manifest version already set' + exit 0 +fi + +git \ + -c user.name='MetaMask Bot' \ + -c user.email='metamaskbot@users.noreply.github.com' \ + commit --message "${CIRCLE_BRANCH/-/ }" \ + CHANGELOG.md app/manifest/_base.json + +repo_slug="$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME" +git push "https://$GITHUB_TOKEN_USER:$GITHUB_TOKEN@github.com/$repo_slug" "$CIRCLE_BRANCH" diff --git a/.circleci/scripts/release-create-gh-release b/.circleci/scripts/release-create-gh-release new file mode 100755 index 000000000000..93303f576ebe --- /dev/null +++ b/.circleci/scripts/release-create-gh-release @@ -0,0 +1,51 @@ +#!/usr/bin/env bash + +set -x +set -e +set -u +set -o pipefail + +if [[ "${CI:-}" != 'true' ]] +then + printf '%s\n' 'CI environment variable must be set to true' + exit 1 +fi + +if [[ "${CIRCLECI:-}" != 'true' ]] +then + printf '%s\n' 'CIRCLECI environment variable must be set to true' + exit 1 +fi + +function install_github_cli () +{ + printf '%s\n' 'Installing hub CLI' + pushd "$(mktemp -d)" + curl -sSL 'https://github.com/github/hub/releases/download/v2.11.2/hub-linux-amd64-2.11.2.tgz' | tar xz + PATH="$PATH:$PWD/hub-linux-amd64-2.11.2/bin" + popd +} + +current_commit_msg=$(git show -s --format='%s' HEAD) + +if [[ $current_commit_msg =~ Version[-[:space:]](v[[:digit:]]+.[[:digit:]]+.[[:digit:]]+) ]] +then + tag="${BASH_REMATCH[1]}" + + install_github_cli + + printf '%s\n' 'Creating GitHub Release' + release_body="$(awk -v version="${tag##v}" -f .circleci/scripts/show-changelog.awk CHANGELOG.md)" + pushd builds + hub release create \ + --attach metamask-chrome-*.zip \ + --attach metamask-firefox-*.zip \ + --message "Version ${tag##v}" \ + --message "$release_body" \ + --commitish "$CIRCLE_SHA1" \ + "$tag" + popd +else + printf '%s\n' 'Version not found in commit message; skipping GitHub Release' + exit 0 +fi diff --git a/.circleci/scripts/release-create-master-pr b/.circleci/scripts/release-create-master-pr new file mode 100755 index 000000000000..9b62d2397f7f --- /dev/null +++ b/.circleci/scripts/release-create-master-pr @@ -0,0 +1,52 @@ +#!/usr/bin/env bash + +set -e +set -u +set -o pipefail + +if [[ "${CI:-}" != 'true' ]] +then + printf '%s\n' 'CI environment variable must be set to true' + exit 1 +fi + +if [[ "${CIRCLECI:-}" != 'true' ]] +then + printf '%s\n' 'CIRCLECI environment variable must be set to true' + exit 1 +fi + +if [[ -z "${GITHUB_TOKEN:-}" ]] +then + printf '%s\n' 'GITHUB_TOKEN environment variable must be set' + exit 1 +fi + +function install_github_cli () +{ + printf '%s\n' 'Installing hub CLI' + pushd "$(mktemp -d)" + curl -sSL 'https://github.com/github/hub/releases/download/v2.11.2/hub-linux-amd64-2.11.2.tgz' | tar xz + PATH="$PATH:$PWD/hub-linux-amd64-2.11.2/bin" + popd +} + +base_branch='develop' + +if [[ -n "${CI_PULL_REQUEST:-}" ]] +then + printf '%s\n' 'CI_PULL_REQUEST is set, pull request already exists for this build' + exit 0 +fi + +install_github_cli + +printf '%s\n' "Creating a Pull Request to sync 'master' with 'develop'" + +if ! hub pull-request \ + --message "Master => develop" --message 'Merge latest release back into develop' \ + --base "$CIRCLE_PROJECT_USERNAME:$base_branch" \ + --head "$CIRCLE_PROJECT_USERNAME:$CIRCLE_BRANCH"; +then + printf '%s\n' 'Pull Request already exists' +fi diff --git a/.circleci/scripts/release-create-release-pr b/.circleci/scripts/release-create-release-pr new file mode 100755 index 000000000000..f209422cd927 --- /dev/null +++ b/.circleci/scripts/release-create-release-pr @@ -0,0 +1,53 @@ +#!/usr/bin/env bash + +set -e +set -u +set -o pipefail + +if [[ "${CI:-}" != 'true' ]] +then + printf '%s\n' 'CI environment variable must be set to true' + exit 1 +fi + +if [[ "${CIRCLECI:-}" != 'true' ]] +then + printf '%s\n' 'CIRCLECI environment variable must be set to true' + exit 1 +fi + +if [[ -z "${GITHUB_TOKEN:-}" ]] +then + printf '%s\n' 'GITHUB_TOKEN environment variable must be set' + exit 1 +fi + +function install_github_cli () +{ + printf '%s\n' 'Installing hub CLI' + pushd "$(mktemp -d)" + curl -sSL 'https://github.com/github/hub/releases/download/v2.11.2/hub-linux-amd64-2.11.2.tgz' | tar xz + PATH="$PATH:$PWD/hub-linux-amd64-2.11.2/bin" + popd +} + +version="${CIRCLE_BRANCH/Version-v/}" +base_branch='master' + +if [[ -n "${CI_PULL_REQUEST:-}" ]] +then + printf '%s\n' 'CI_PULL_REQUEST is set, pull request already exists for this build' + exit 0 +fi + +install_github_cli + +printf '%s\n' "Creating a Pull Request for $version on GitHub" + +if ! hub pull-request \ + --message "${CIRCLE_BRANCH/-/ } RC" --message ':package: :rocket:' \ + --base "$CIRCLE_PROJECT_USERNAME:$base_branch" \ + --head "$CIRCLE_PROJECT_USERNAME:$CIRCLE_BRANCH"; +then + printf '%s\n' 'Pull Request already exists' +fi diff --git a/.circleci/scripts/show-changelog.awk b/.circleci/scripts/show-changelog.awk new file mode 100644 index 000000000000..e490df9db2e0 --- /dev/null +++ b/.circleci/scripts/show-changelog.awk @@ -0,0 +1,52 @@ +# DESCRIPTION +# +# This script will print out all of the CHANGELOG.md lines for a given version +# with the assumption that the CHANGELOG.md files looks something along the +# lines of: +# +# ``` +# ## 6.6.2 Fri Jun 07 2019 +# +# - [#6690](https://github.com/MetaMask/metamask-extension/pull/6690): Some words +# - [#6700](https://github.com/MetaMask/metamask-extension/pull/6700): some more words +# +# ## 6.6.1 Thu Jun 06 2019 +# +# - [#6691](https://github.com/MetaMask/metamask-extension/pull/6691): Revert other words +# +# ## 6.6.0 Mon Jun 03 2019 +# +# - [#6659](https://github.com/MetaMask/metamask-extension/pull/6659): foo +# - [#6671](https://github.com/MetaMask/metamask-extension/pull/6671): bar +# - [#6625](https://github.com/MetaMask/metamask-extension/pull/6625): baz +# - [#6633](https://github.com/MetaMask/metamask-extension/pull/6633): Many many words +# +# +# ``` +# +# EXAMPLE +# +# Run this script like so, passing in the version: +# +# ``` +# awk -v version='6.6.0' -f .circleci/scripts/show-changelog.awk CHANGELOG.md +# ``` +# + +BEGIN { + inside_section = 0; +} + +$1 == "##" && $2 == version { + inside_section = 1; + next; +} + +$1 == "##" && $2 != version { + inside_section = 0; + next; +} + +inside_section && !/^$/ { + print $0; +} diff --git a/.circleci/scripts/yarn-audit b/.circleci/scripts/yarn-audit new file mode 100755 index 000000000000..ebe0368158e5 --- /dev/null +++ b/.circleci/scripts/yarn-audit @@ -0,0 +1,20 @@ +#!/usr/bin/env bash + +set -u +set -o pipefail + +yarn audit --level moderate --groups dependencies +audit_status="$?" + +# Use a bitmask to ignore INFO and LOW severity audit results +# See here: https://yarnpkg.com/lang/en/docs/cli/audit/ +audit_status="$(( audit_status & 11100 ))" + +if [[ "$audit_status" != 0 ]] +then + count="$(yarn audit --level moderate --groups dependencies --json | tail -1 | jq '.data.vulnerabilities.moderate + .data.vulnerabilities.high + .data.vulnerabilities.critical')" + printf "Audit shows %s moderate or high severity advisories _in the production dependencies_\n" "$count" + exit 1 +else + printf "Audit shows _zero_ moderate or high severity advisories _in the production dependencies_\n" +fi diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index ea6720feba22..000000000000 --- a/.dockerignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -builds -development \ No newline at end of file diff --git a/.eslintignore b/.eslintignore index 5923e1bc214d..659550cc74f4 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,19 +1,11 @@ +!.eslintrc.js + node_modules/** dist/** builds/** -test-builds/** +test-*/** docs/** coverage/ -development/bundle.js -development/states.js - -app/scripts/lib/extension-instance.js app/scripts/chromereload.js app/vendor/** - -ui/lib/blockies.js - -test/integration/bundle.js -test/integration/jquery-3.1.0.min.js -test/integration/helpers.js diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 53033b753bc9..000000000000 --- a/.eslintrc +++ /dev/null @@ -1,166 +0,0 @@ -{ - "parser": "babel-eslint", - "parserOptions": { - "sourceType": "module", - "ecmaVersion": 2017, - "ecmaFeatures": { - "experimentalObjectRestSpread": true, - "impliedStrict": true, - "modules": true, - "blockBindings": true, - "arrowFunctions": true, - "objectLiteralShorthandMethods": true, - "objectLiteralShorthandProperties": true, - "templateStrings": true, - "classes": true, - "jsx": true - }, - }, - - "extends": ["plugin:react/recommended"], - - "env": { - "es6": true, - "node": true, - "browser": true, - "mocha" : true - }, - - "plugins": [ - "mocha", - "chai", - "react", - "json" - ], - - "globals": { - "document": false, - "navigator": false, - "web3": true, - "window": false, - "$": false, - "QUnit": false - }, - - "rules": { - "no-restricted-globals": ["error", "event"], - "accessor-pairs": 2, - "arrow-spacing": [2, { "before": true, "after": true }], - "block-spacing": [2, "always"], - "brace-style": [2, "1tbs", { "allowSingleLine": true }], - "camelcase": [2, { "properties": "never" }], - "comma-dangle": [2, "always-multiline"], - "comma-spacing": [2, { "before": false, "after": true }], - "comma-style": [2, "last"], - "constructor-super": 2, - "curly": [2, "multi-line"], - "dot-location": [2, "property"], - "eol-last": 2, - "eqeqeq": [2, "allow-null"], - "generator-star-spacing": [2, { "before": true, "after": true }], - "handle-callback-err": [2, "^(err|error)$" ], - "indent": "off", - "jsx-quotes": [2, "prefer-double"], - "key-spacing": 2, - "keyword-spacing": [2, { "before": true, "after": true }], - "new-cap": [2, { "newIsCap": true, "capIsNew": false }], - "new-parens": 2, - "no-array-constructor": 2, - "no-caller": 2, - "no-class-assign": 2, - "no-cond-assign": 2, - "no-const-assign": 2, - "no-control-regex": 2, - "no-debugger": 2, - "no-delete-var": 2, - "no-dupe-args": 2, - "no-dupe-class-members": 2, - "no-dupe-keys": 2, - "no-duplicate-case": 2, - "no-duplicate-imports": 2, - "no-empty-character-class": 2, - "no-empty-pattern": 2, - "no-eval": 2, - "no-ex-assign": 2, - "no-extend-native": 2, - "no-extra-bind": 2, - "no-extra-boolean-cast": 2, - "no-extra-parens": [2, "functions"], - "no-fallthrough": 2, - "no-floating-decimal": 2, - "no-func-assign": 2, - "no-implied-eval": 2, - "no-inner-declarations": [2, "functions"], - "no-invalid-regexp": 2, - "no-irregular-whitespace": 2, - "no-iterator": 2, - "no-label-var": 2, - "no-labels": [2, { "allowLoop": false, "allowSwitch": false }], - "no-lone-blocks": 2, - "no-mixed-spaces-and-tabs": 2, - "no-multi-spaces": 2, - "no-multi-str": 2, - "no-multiple-empty-lines": [2, { "max": 2 }], - "no-native-reassign": 2, - "no-negated-in-lhs": 2, - "no-new": 2, - "no-new-func": 2, - "no-new-object": 2, - "no-new-require": 2, - "no-new-symbol": 2, - "no-new-wrappers": 2, - "no-obj-calls": 2, - "no-octal": 2, - "no-octal-escape": 2, - "no-path-concat": 2, - "no-proto": 2, - "no-redeclare": 2, - "no-regex-spaces": 2, - "no-return-assign": [2, "except-parens"], - "no-self-assign": 2, - "no-self-compare": 2, - "no-sequences": 2, - "no-shadow-restricted-names": 2, - "no-spaced-func": 2, - "no-sparse-arrays": 2, - "no-this-before-super": 2, - "no-throw-literal": 2, - "no-trailing-spaces": 2, - "no-undef": 2, - "no-undef-init": 2, - "no-unexpected-multiline": 2, - "no-unmodified-loop-condition": 2, - "no-unneeded-ternary": [2, { "defaultAssignment": false }], - "no-unreachable": 2, - "no-unsafe-finally": 2, - "no-unused-vars": [2, { "vars": "all", "args": "all", "argsIgnorePattern": "[_]+" }], - "no-useless-call": 2, - "no-useless-computed-key": 2, - "no-useless-constructor": 2, - "no-useless-escape": 2, - "no-whitespace-before-property": 2, - "no-with": 2, - "one-var": [2, { "initialized": "never" }], - "operator-linebreak": [2, "after", { "overrides": { "?": "ignore", ":": "ignore" } }], - "padded-blocks": "off", - "quotes": [2, "single", {"avoidEscape": true, "allowTemplateLiterals": true}], - "react/no-deprecated": 0, - "semi": [2, "never"], - "semi-spacing": [2, { "before": false, "after": true }], - "space-before-blocks": [2, "always"], - "space-before-function-paren": [2, "always"], - "space-in-parens": [2, "never"], - "space-infix-ops": 2, - "space-unary-ops": [2, { "words": true, "nonwords": false }], - "spaced-comment": [2, "always", { "markers": ["global", "globals", "eslint", "eslint-disable", "*package", "!", ","], "exceptions": ["=", "-"] } ], - "strict": 0, - "template-curly-spacing": [2, "never"], - "use-isnan": 2, - "valid-typeof": 2, - "wrap-iife": [2, "any"], - "yield-star-spacing": [2, "both"], - "yoda": [2, "never"], - "prefer-const": 2, - "mocha/no-exclusive-tests": "error" - } -} diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 000000000000..2fbadc34ff5d --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,155 @@ +module.exports = { + root: true, + parser: 'babel-eslint', + parserOptions: { + 'sourceType': 'module', + 'ecmaVersion': 2017, + 'ecmaFeatures': { + 'experimentalObjectRestSpread': true, + 'impliedStrict': true, + 'modules': true, + 'blockBindings': true, + 'arrowFunctions': true, + 'objectLiteralShorthandMethods': true, + 'objectLiteralShorthandProperties': true, + 'templateStrings': true, + 'classes': true, + 'jsx': true, + }, + }, + + extends: [ + '@metamask/eslint-config', + '@metamask/eslint-config/config/nodejs', + '@metamask/eslint-config/config/mocha', + 'plugin:react/recommended', + 'plugin:react-hooks/recommended', + ], + + plugins: [ + 'babel', + 'react', + 'json', + 'import', + ], + + globals: { + '$': 'readonly', + document: 'readonly', + QUnit: 'readonly', + window: 'readonly', + }, + + rules: { + 'default-param-last': 'off', + 'require-atomic-updates': 'off', + 'import/no-unassigned-import': 'off', + 'prefer-destructuring': ['error', { + 'VariableDeclarator': { + 'array': false, + 'object': true, + }, + 'AssignmentExpression': { + 'array': false, + 'object': false, + }, + }, { + 'enforceForRenamedProperties': false, + }], + 'prefer-object-spread': 'error', + 'react/no-unused-prop-types': 'error', + 'react/no-unused-state': 'error', + 'react/jsx-boolean-value': 'error', + 'react/jsx-curly-brace-presence': ['error', { 'props': 'never', 'children': 'never' }], + 'react/jsx-equals-spacing': 'error', + 'react/no-deprecated': 'error', + 'react/default-props-match-prop-types': 'error', + 'react/jsx-closing-tag-location': 'error', + 'react/jsx-no-duplicate-props': 'error', + 'react/jsx-closing-bracket-location': 'error', + 'react/jsx-first-prop-new-line': ['error', 'multiline'], + 'react/jsx-max-props-per-line': ['error', { 'maximum': 1, 'when': 'multiline' }], + 'react/jsx-tag-spacing': ['error', { + 'closingSlash': 'never', + 'beforeSelfClosing': 'always', + 'afterOpening': 'never', + }], + 'react/jsx-wrap-multilines': ['error', { + 'declaration': 'parens-new-line', + 'assignment': 'parens-new-line', + 'return': 'parens-new-line', + 'arrow': 'parens-new-line', + 'condition': 'parens-new-line', + 'logical': 'parens-new-line', + 'prop': 'parens-new-line', + }], + + 'no-invalid-this': 'off', + 'babel/no-invalid-this': 'error', + + 'babel/semi': ['error', 'never'], + 'mocha/no-setup-in-describe': 'off', + }, + + overrides: [{ + files: [ + 'test/e2e/**/*.js', + ], + rules: { + 'mocha/no-hooks-for-single-case': 'off', + }, + }, { + files: [ + 'app/scripts/migrations/*.js', + '*.stories.js', + ], + rules: { + 'import/no-anonymous-default-export': ['error', { 'allowObject': true }], + }, + }, { + files: [ + 'app/scripts/migrations/*.js', + ], + rules: { + 'global-require': 'off', + }, + }, { + files: [ + 'test/**/*-test.js', + 'test/**/*.spec.js', + ], + rules: { + // Mocha will re-assign `this` in a test context + 'babel/no-invalid-this': 'off', + }, + }, { + files: [ + 'development/**/*.js', + 'test/e2e/benchmark.js', + 'test/helper.js', + ], + rules: { + 'no-process-exit': 'off', + }, + }, { + files: [ + '.eslintrc.js', + 'babel.config.js', + 'nyc.config.js', + 'stylelint.config.js', + 'development/**/*.js', + 'test/e2e/**/*.js', + 'test/env.js', + 'test/setup.js', + ], + parserOptions: { + sourceType: 'script', + }, + }], + + settings: { + 'react': { + 'version': 'detect', + }, + }, +} diff --git a/.gitattributes b/.gitattributes index a19ade077d36..34ffa305db03 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,10 @@ +* text=auto CHANGELOG.md merge=union + +# Reviewing the lockfile contents is an important step in verifying that +# we're using the dependencies we expect to be using +package-lock.json linguist-generated=false +yarn.lock linguist-generated=false + +test/e2e/send-eth-with-private-key-test/ethereumjs-tx.js linguist-vendored linguist-generated -diff +test/e2e/send-eth-with-private-key-test/web3js.js linguist-vendored linguist-generated -diff diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 5ee6fac12e6f..d2dddc92faab 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,7 +1,6 @@ # Lines starting with '#' are comments. # Each line is a file pattern followed by one or more owners. -package*.json @whymarrh -ui/ @danjm @whymarrh -app/scripts/controllers/transactions @frankiebee - +* @MetaMask/extension-devs +.circleci/ @MetaMask/extension-devs @kumavis +development/ @MetaMask/extension-devs @kumavis diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 000000000000..19fdf3242cb5 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,24 @@ +# Welcome to MetaMask! + +If you're submitting code to MetaMask, there are some simple things we'd appreciate you doing to help us stay organized! + +### Finding the right project + +Before taking the time to code and implement something, feel free to open an issue and discuss it! There may even be an issue already open, and together we may come up with a specific strategy before you take your precious time to write code. + +There are also plenty of open issues we'd love help with. Search the [`good first issue`](https://github.com/MetaMask/metamask-extension/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) label, or head to Gitcoin and earn ETH for completing projects we've posted bounties on. + +If you're picking up a bounty or an existing issue, feel free to ask clarifying questions on the issue as you go about your work. + +### Submitting a pull request +When you're done with your project / bugfix / feature and ready to submit a PR, there are a couple guidelines we ask you to follow: + +- [ ] **Test it**: For any new programmatic functionality, we like unit tests when possible, so if you can keep your code cleanly isolated, please do add a test file to the `tests` folder. +- [ ] **Add to the CHANGELOG**: Help us keep track of all the moving pieces by adding an entry to the [`CHANGELOG.md`](https://github.com/MetaMask/metamask-extension/blob/develop/CHANGELOG.md) with a link to your PR. +- [ ] **Meet the spec**: Make sure the PR adds functionality that matches the issue you're closing. This is especially important for bounties: sometimes design or implementation details are included in the conversation, so read carefully! +- [ ] **Close the issue**: If this PR closes an open issue, add the line `Fixes #$ISSUE_NUMBER`. Ex. For closing issue 418, include the line `Fixes #418`. If it doesn't close the issue but addresses it partially, just include a reference to the issue number, like `#418`. +- [ ] **Keep it simple**: Try not to include multiple features in a single PR, and don't make extraneous changes outside the scope of your contribution. All those touched files make things harder to review ;) +- [ ] **PR against `develop`**: Submit your PR against the `develop` branch. This is where we merge new features so they get some time to receive extra testing before being pushed to `master` for production. If your PR is a hot-fix that needs to be published urgently, you may submit a PR against the `master` branch, but this PR will receive tighter scrutiny before merging. +- [ ] **Get reviewed by a core contributor**: Make sure you get a `:thumbsup`, `:+1`, or `LGTM` from a user with a `Member` badge before merging. + +And that's it! Thanks for helping out. diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000000..bf601447e4ff --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: metamask +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/ISSUE_TEMPLATE b/.github/ISSUE_TEMPLATE.md similarity index 100% rename from ISSUE_TEMPLATE rename to .github/ISSUE_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index 69dffc7b8ba4..0f815d2d3987 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -5,16 +5,17 @@ about: Using MetaMask, but it's not working as you expect? --- **Describe the bug** A clear and concise description of what the bug is. -**To Reproduce** -Steps to reproduce the behavior: +**To Reproduce (REQUIRED)** +Steps to reproduce the behavior, libraries used with version number, and/or any setup information to easily reproduce: + 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' @@ -28,8 +29,9 @@ If applicable, add screenshots to help explain your problem. **Browser details (please complete the following information):** - OS: [e.g. OS X, Windows] - - Browser [e.g. chrome, safari] + - Hardware Wallet [e.g. Trezor Firmware version 1.8.3, Ledger Nano S Firmware version 1.6.0] + - Browser [e.g. Chrome Version 79.0.3945.79 (Official Build) (64-bit), Firefox Browser 71.0 (64-bit)] - MetaMask Version [e.g. 5.0.2] -**Additional context** +**Additional context (Error Messages, etc.)** Add any other context about the problem here. diff --git a/.gitignore b/.gitignore index 4ee0c1c626fc..6d11965cb7d2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,9 @@ npm-debug.log +yarn-error.log node_modules -yarn.lock +package-lock.json + +audit.json app/bower_components test/bower_components @@ -11,6 +14,8 @@ package .vscode .sublime-project +*.bak + # VIM *.swp *.swo @@ -21,22 +26,15 @@ temp .DS_Store app/.DS_Store +.out/ coverage/ dist builds/ -disc/ builds.zip -docs/jsdocs - -development/bundle.js -development/states.js -test/integration/bundle.js -test/background.js -test/bundle.js -test/test-bundle.js test-artifacts test-builds +build-artifacts #ignore css output and sourcemaps ui/app/css/output/ @@ -45,3 +43,5 @@ notes.txt .coveralls.yml .nyc_output + +.metamaskrc diff --git a/.nvmrc b/.nvmrc index f0da09441446..1de6ab5e2616 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v10.16.0 +v10.18.1 diff --git a/.storybook/README.md b/.storybook/README.md index 03b06d854d98..b358744e7ed0 100644 --- a/.storybook/README.md +++ b/.storybook/README.md @@ -1,8 +1,8 @@ # Storybook We're currently using [Storybook](https://storybook.js.org/) as part of our design system. To run Storybook and test some of our UI components, clone the repo and run the following: ``` -npm install -npm run storybook +yarn +yarn storybook ``` You should then see: > info Storybook started on => http://localhost:6006/ diff --git a/.storybook/addons.js b/.storybook/addons.js deleted file mode 100644 index 4e162fa2787c..000000000000 --- a/.storybook/addons.js +++ /dev/null @@ -1,2 +0,0 @@ -import '@storybook/addon-knobs/register' -import '@storybook/addon-actions/register' diff --git a/.storybook/config.js b/.storybook/config.js deleted file mode 100644 index 48e3997ebcc5..000000000000 --- a/.storybook/config.js +++ /dev/null @@ -1,11 +0,0 @@ -import { configure } from '@storybook/react' -import '../ui/app/css/index.scss' - -const req = require.context('../ui/app/components', true, /\.stories\.js$/) - -function loadStories () { - require('./decorators') - req.keys().forEach((filename) => req(filename)) -} - -configure(loadStories, module) diff --git a/.storybook/decorators.js b/.storybook/decorators.js deleted file mode 100644 index 7b0745ac4902..000000000000 --- a/.storybook/decorators.js +++ /dev/null @@ -1,21 +0,0 @@ -import React from 'react' -import { addDecorator } from '@storybook/react' -import { withInfo } from '@storybook/addon-info' -import { withKnobs } from '@storybook/addon-knobs/react' - -const styles = { - height: '100vh', - display: 'flex', - justifyContent: 'center', - alignItems: 'center', -} - -const CenterDecorator = story => ( -
- { story() } -
-) - -addDecorator((story, context) => withInfo()(story)(context)) -addDecorator(withKnobs) -addDecorator(CenterDecorator) diff --git a/.storybook/main.js b/.storybook/main.js new file mode 100644 index 000000000000..74acf6fb81a4 --- /dev/null +++ b/.storybook/main.js @@ -0,0 +1,8 @@ +module.exports = { + stories: ['../ui/app/**/*.stories.js'], + addons: [ + '@storybook/addon-knobs', + '@storybook/addon-actions', + '@storybook/addon-backgrounds' + ], +} diff --git a/.storybook/preview-body.html b/.storybook/preview-body.html new file mode 100644 index 000000000000..a9676ff1f1b1 --- /dev/null +++ b/.storybook/preview-body.html @@ -0,0 +1,2 @@ +
+
diff --git a/.storybook/preview.js b/.storybook/preview.js new file mode 100644 index 000000000000..b28733bad7aa --- /dev/null +++ b/.storybook/preview.js @@ -0,0 +1,46 @@ +import React from 'react' +import { addDecorator, addParameters } from '@storybook/react' +import { withKnobs } from '@storybook/addon-knobs/react' +import { I18nProvider, LegacyI18nProvider } from '../ui/app/contexts/i18n' +import { Provider } from 'react-redux' +import configureStore from '../ui/app/store/store' +import '../ui/app/css/index.scss' +import en from '../app/_locales/en/messages' + +addParameters({ + backgrounds: [ + { name: 'light', value: '#FFFFFF'}, + { name: 'dark', value: '#333333' }, + ], +}) + +const styles = { + height: '100vh', + display: 'flex', + justifyContent: 'center', + alignItems: 'center', +} + +const store = configureStore({ + metamask: { metamask: { currentLocale: 'en' } }, + + localeMessages: { + current: en, + en: en, + }, +}) + +const metamaskDecorator = story => ( + + + +
+ { story() } +
+
+
+
+) + +addDecorator(withKnobs) +addDecorator(metamaskDecorator) diff --git a/.storybook/webpack.config.js b/.storybook/webpack.config.js index bd66954f3170..be7dfeceaea1 100644 --- a/.storybook/webpack.config.js +++ b/.storybook/webpack.config.js @@ -1,23 +1,22 @@ const path = require('path') +const CopyWebpackPlugin = require('copy-webpack-plugin') + module.exports = { module: { + strictExportPresence: true, rules: [ - { - test: /\.(woff(2)?|ttf|eot|svg|otf)(\?v=\d+\.\d+\.\d+)?$/, - loaders: [{ - loader: 'file-loader', - options: { - name: '[name].[ext]', - outputPath: 'fonts/', - }, - }], - }, { test: /\.scss$/, loaders: [ 'style-loader', - 'css-loader', + { + loader: 'css-loader', + options: { + import: false, + url: false, + }, + }, 'resolve-url-loader', { loader: 'sass-loader', @@ -29,9 +28,14 @@ module.exports = { }, ], }, - resolve: { - alias: { - './fonts/Font_Awesome': path.resolve(__dirname, '../fonts/Font_Awesome'), - }, - }, + plugins: [ + new CopyWebpackPlugin({ + patterns: [ + { + from: path.join('node_modules', '@fortawesome', 'fontawesome-free', 'webfonts'), + to: path.join('fonts', 'fontawesome'), + }, + ], + }), + ], } diff --git a/.stylelintignore b/.stylelintignore index a42709a90e0b..a2aefc538cff 100644 --- a/.stylelintignore +++ b/.stylelintignore @@ -1,9 +1,9 @@ -app/ -development/ -dist/ -docs/ -fonts/ -images/ -node_modules/ -notices/ -test/ +/app +/development +/dist +/docs +/fonts +/images +/node_modules +/notices +/test diff --git a/.stylelintrc b/.stylelintrc deleted file mode 100644 index d080d68d93a0..000000000000 --- a/.stylelintrc +++ /dev/null @@ -1,50 +0,0 @@ -{ - "extends": "stylelint-config-standard", - "rules": { - "color-named": "never", - "font-family-name-quotes": "always-where-recommended", - "font-weight-notation": "numeric", - "function-url-quotes": "always", - "number-leading-zero": "never", - "value-no-vendor-prefix": true, - "value-list-comma-newline-before": "never-multi-line", - "custom-property-empty-line-before": "never", - "property-no-unknown": [ - true, - { - "ignoreProperties": [ - "composes", - "all", - "-webkit-appearance" - ] - } - ], - "declaration-block-semicolon-newline-after": "always", - "block-opening-brace-newline-after": "always", - "selector-attribute-quotes": "always", - "selector-max-specificity": "0,5,2", - "selector-pseudo-class-no-unknown": [ - true, - { - "ignorePseudoClasses": ["local", "global"] - } - ], - "at-rule-empty-line-before": [ - "always", - { - "ignore": [ - "after-comment", - ] - } - ], - "indentation": [ - 2, - { - "indentInsideParens": "once-at-root-twice-in-block" - } - ], - "max-nesting-depth": 3, - "no-duplicate-selectors": true, - "no-unknown-animations": true - } -} diff --git a/CHANGELOG.md b/CHANGELOG.md index 0bd3ccc7ffbb..f4f649f0ec08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,16 +2,405 @@ ## Current Develop Branch +## 8.0.9 Wed Aug 19 2020 +- [#9228](https://github.com/MetaMask/metamask-extension/pull/9228): Move transaction confirmation footer buttons to scrollable area +- [#9256](https://github.com/MetaMask/metamask-extension/pull/9256): Handle non-String web3 property access +- [#9266](https://github.com/MetaMask/metamask-extension/pull/9266): Use @metamask/controllers@2.0.5 +- [#9189](https://github.com/MetaMask/metamask-extension/pull/9189): Hide ETH Gas Station estimates on non-main network + +## 8.0.8 Fri Aug 14 2020 +- [#9211](https://github.com/MetaMask/metamask-extension/pull/9211): Fix Etherscan redirect on notification click +- [#9237](https://github.com/MetaMask/metamask-extension/pull/9237): Reduce volume of web3 usage metrics +- [#9227](https://github.com/MetaMask/metamask-extension/pull/9227): Permit all-caps addresses + +## 8.0.7 Fri Aug 07 2020 +- [#9065](https://github.com/MetaMask/metamask-extension/pull/9065): Change title of "Reveal Seed Words" page to "Reveal Seed Phrase" +- [#8974](https://github.com/MetaMask/metamask-extension/pull/8974): Add tooltip to copy button for contacts and seed phrase +- [#9063](https://github.com/MetaMask/metamask-extension/pull/9063): Fix broken UI upon failed password validation +- [#9075](https://github.com/MetaMask/metamask-extension/pull/9075): Fix shifted popup notification when browser is in fullscreen on macOS +- [#9085](https://github.com/MetaMask/metamask-extension/pull/9085): Support longer text in network dropdown +- [#8873](https://github.com/MetaMask/metamask-extension/pull/8873): Fix onboarding bug where user can be asked to verify seed phrase twice +- [#9104](https://github.com/MetaMask/metamask-extension/pull/9104): Replace "Email us" button with "Contact us" button +- [#9137](https://github.com/MetaMask/metamask-extension/pull/9137): Fix bug where `accountsChanged` events stop after a dapp connection is closed. +- [#9152](https://github.com/MetaMask/metamask-extension/pull/9152): Fix network name alignment +- [#9144](https://github.com/MetaMask/metamask-extension/pull/9144): Add web3 usage metrics and prepare for web3 removal + +## 8.0.6 Wed Jul 22 2020 +- [#9030](https://github.com/MetaMask/metamask-extension/pull/9030): Hide "delete" button when editing contact of wallet account +- [#9031](https://github.com/MetaMask/metamask-extension/pull/9031): Fix crash upon removing contact +- [#9032](https://github.com/MetaMask/metamask-extension/pull/9032): Do not show spend limit for approvals +- [#9046](https://github.com/MetaMask/metamask-extension/pull/9046): Update @metamask/inpage-provider@6.1.0 +- [#9048](https://github.com/MetaMask/metamask-extension/pull/9048): Skip attempts to resolve 0x contract prefix +- [#9051](https://github.com/MetaMask/metamask-extension/pull/9051): Use content-hash@2.5.2 +- [#9056](https://github.com/MetaMask/metamask-extension/pull/9056): Display at least one significant digit of small non-zero token balances + +## 8.0.5 Thu Jul 16 2020 +- [#8942](https://github.com/MetaMask/metamask-extension/pull/8942): Fix display of incoming transactions (#8942) +- [#8998](https://github.com/MetaMask/metamask-extension/pull/8998): Fix `web3_clientVersion` method (#8998) +- [#9003](https://github.com/MetaMask/metamask-extension/pull/9003): @metamask/inpage-provider@6.0.1 (#9003) +- [#9006](https://github.com/MetaMask/metamask-extension/pull/9006): Hide loading indication after `personal_sign` (#9006) +- [#9011](https://github.com/MetaMask/metamask-extension/pull/9011): Display pending notifications after connect flow (#9011) +- [#9012](https://github.com/MetaMask/metamask-extension/pull/9012): Skip render when home page is closing or redirecting (#9012) +- [#9010](https://github.com/MetaMask/metamask-extension/pull/9010): Limit number of transactions passed outside of TransactionController (#9010) +- [#9023](https://github.com/MetaMask/metamask-extension/pull/9023): Clear AccountTracker accounts and CachedBalances on createNewVaultAndRestore (#9023) +- [#9025](https://github.com/MetaMask/metamask-extension/pull/9025): Catch gas estimate errors (#9025) +- [#9026](https://github.com/MetaMask/metamask-extension/pull/9026): Clear transactions on createNewVaultAndRestore (#9026) + +## 8.0.4 Tue Jul 07 2020 +- [#8934](https://github.com/MetaMask/metamask-extension/pull/8934): Fix transaction activity on custom networks +- [#8936](https://github.com/MetaMask/metamask-extension/pull/8936): Fix account tracker optimization + +## 8.0.3 Mon Jul 06 2020 +- [#8921](https://github.com/MetaMask/metamask-extension/pull/8921): Restore missing 'data' provider event, and fix 'notification' event +- [#8923](https://github.com/MetaMask/metamask-extension/pull/8923): Normalize the 'from' parameter for `eth_sendTransaction` +- [#8924](https://github.com/MetaMask/metamask-extension/pull/8924): Fix handling of multiple `eth_requestAccount` messages from the same domain +- [#8917](https://github.com/MetaMask/metamask-extension/pull/8917): Update Italian translations + +## 8.0.2 Fri Jul 03 2020 +- [#8907](https://github.com/MetaMask/metamask-extension/pull/8907): Tolerate missing or falsey substitutions +- [#8908](https://github.com/MetaMask/metamask-extension/pull/8908): Fix activity log inline buttons +- [#8909](https://github.com/MetaMask/metamask-extension/pull/8909): Prevent confirming blank suggested token +- [#8910](https://github.com/MetaMask/metamask-extension/pull/8910): Handle suggested token resolved elsewhere +- [#8913](https://github.com/MetaMask/metamask-extension/pull/8913): Fix Kovan chain ID constant + +## 8.0.1 Thu Jul 02 2020 +- [#8874](https://github.com/MetaMask/metamask-extension/pull/8874): Fx overflow behaviour of add token list +- [#8885](https://github.com/MetaMask/metamask-extension/pull/8885): Show `origin` in connect flow rather than site name +- [#8883](https://github.com/MetaMask/metamask-extension/pull/8883): Allow setting a custom nonce of zero +- [#8889](https://github.com/MetaMask/metamask-extension/pull/8889): Fix language code format mismatch +- [#8891](https://github.com/MetaMask/metamask-extension/pull/8891): Prevent showing connected accounts without origin +- [#8893](https://github.com/MetaMask/metamask-extension/pull/8893): Prevent manually connecting to extension UI +- [#8895](https://github.com/MetaMask/metamask-extension/pull/8895): Allow localized messages to not use substitutions +- [#8897](https://github.com/MetaMask/metamask-extension/pull/8897): Update eth-keyring-controller to fix erasure of imported/hardware account names +- [#8896](https://github.com/MetaMask/metamask-extension/pull/8896): Include relative time polyfill locale data +- [#8898](https://github.com/MetaMask/metamask-extension/pull/8898): Replace percentage opacity value + +## 8.0.0 Mon Jun 23 2020 +- [#7004](https://github.com/MetaMask/metamask-extension/pull/7004): Add permission system +- [#7261](https://github.com/MetaMask/metamask-extension/pull/7261): Search accounts by name +- [#7483](https://github.com/MetaMask/metamask-extension/pull/7483): Buffer 3 blocks before dropping a transaction +- [#7620](https://github.com/MetaMask/metamask-extension/pull/7620): Handle one specific permissions request per tab +- [#7686](https://github.com/MetaMask/metamask-extension/pull/7686): Add description to Reset Account in settings +- [#7362](https://github.com/MetaMask/metamask-extension/pull/7362): Allow custom IPFS gateway and use more secure default gateway +- [#7696](https://github.com/MetaMask/metamask-extension/pull/7696): Adjust colour of Reset Account button to reflect danger +- [#7602](https://github.com/MetaMask/metamask-extension/pull/7602): Support new onboarding library +- [#7672](https://github.com/MetaMask/metamask-extension/pull/7672): Update custom token symbol length restriction message +- [#7747](https://github.com/MetaMask/metamask-extension/pull/7747): Handle 'Enter' keypress on restore from seed screen +- [#7810](https://github.com/MetaMask/metamask-extension/pull/7810): Remove padding around advanced gas info icon +- [#7840](https://github.com/MetaMask/metamask-extension/pull/7840): Force background state update after removing an account +- [#7853](https://github.com/MetaMask/metamask-extension/pull/7853): Change "Log In/Out" terminology to "Unlock/Lock" +- [#7863](https://github.com/MetaMask/metamask-extension/pull/7863): Add mechanism to randomize seed phrase filename +- [#7933](https://github.com/MetaMask/metamask-extension/pull/7933): Sort seed phrase confirmation buttons alphabetically +- [#7987](https://github.com/MetaMask/metamask-extension/pull/7987): Add support for 24 word seed phrases +- [#7971](https://github.com/MetaMask/metamask-extension/pull/7971): Use contact name instead of address during send flow +- [#8050](https://github.com/MetaMask/metamask-extension/pull/8050): Add title attribute to transaction title +- [#7831](https://github.com/MetaMask/metamask-extension/pull/7831): Implement encrypt/decrypt feature +- [#8125](https://github.com/MetaMask/metamask-extension/pull/8125): Add setting for disabling Eth Phishing Detection +- [#8148](https://github.com/MetaMask/metamask-extension/pull/8148): Prevent external domains from submitting more than one perm request at a time +- [#8149](https://github.com/MetaMask/metamask-extension/pull/8149): Wait for extension unlock before processing eth_requestAccounts +- [#8201](https://github.com/MetaMask/metamask-extension/pull/8201): Add Idle Timeout for Sync with mobile +- [#8247](https://github.com/MetaMask/metamask-extension/pull/8247): Update Italian translation +- [#8246](https://github.com/MetaMask/metamask-extension/pull/8246): Make seed phrase import case-insensitive +- [#8254](https://github.com/MetaMask/metamask-extension/pull/8254): Convert Connected Sites page to modal +- [#8259](https://github.com/MetaMask/metamask-extension/pull/8259): Update token cell to show inline stale balance warning +- [#8264](https://github.com/MetaMask/metamask-extension/pull/8264): Move asset list to home tab on small screens +- [#8270](https://github.com/MetaMask/metamask-extension/pull/8270): Connected status indicator +- [#8078](https://github.com/MetaMask/metamask-extension/pull/8078): Allow selecting multiple accounts during connect flow +- [#8318](https://github.com/MetaMask/metamask-extension/pull/8318): Focus the notification popup if it's already open +- [#8356](https://github.com/MetaMask/metamask-extension/pull/8356): Position notification relative to last focused window +- [#8358](https://github.com/MetaMask/metamask-extension/pull/8358): Close notification UI if no unapproved confirmations +- [#8293](https://github.com/MetaMask/metamask-extension/pull/8293): Add popup explaining connection indicator to existing users +- [#8435](https://github.com/MetaMask/metamask-extension/pull/8435): Correctly detect changes to background state +- [#7912](https://github.com/MetaMask/metamask-extension/pull/7912): Disable import button for empty string/file +- [#8246](https://github.com/MetaMask/metamask-extension/pull/8246): Make seed phrase import case-insensitive +- [#8312](https://github.com/MetaMask/metamask-extension/pull/8312): Alert user upon switching to unconnected account +- [#8445](https://github.com/MetaMask/metamask-extension/pull/8445): Only updating pending transactions upon block update +- [#8467](https://github.com/MetaMask/metamask-extension/pull/8467): Fix firefox popup location +- [#8486](https://github.com/MetaMask/metamask-extension/pull/8486): Prevent race condition where transaction value set in UI is overwritten +- [#8490](https://github.com/MetaMask/metamask-extension/pull/8490): Fix default gas race condition +- [#8491](https://github.com/MetaMask/metamask-extension/pull/8491): Update tokens after importing account +- [#8496](https://github.com/MetaMask/metamask-extension/pull/8496): Enable disconnecting a single account or all accounts +- [#8502](https://github.com/MetaMask/metamask-extension/pull/8502): Add support for IPFS address resolution +- [#8419](https://github.com/MetaMask/metamask-extension/pull/8419): Add version dimension to metrics event +- [#8508](https://github.com/MetaMask/metamask-extension/pull/8508): Open notification UI when eth_requestAccounts waits for unlock +- [#8533](https://github.com/MetaMask/metamask-extension/pull/8533): Prevent negative values on gas inputs +- [#8550](https://github.com/MetaMask/metamask-extension/pull/8550): Allow disabling alerts +- [#8563](https://github.com/MetaMask/metamask-extension/pull/8563): Synchronously update transaction status +- [#8567](https://github.com/MetaMask/metamask-extension/pull/8567): Improve Spanish localized message +- [#8532](https://github.com/MetaMask/metamask-extension/pull/8532): Add switch to connected account alert +- [#8575](https://github.com/MetaMask/metamask-extension/pull/8575): Stop polling for recent blocks on custom networks when UI is closed +- [#8579](https://github.com/MetaMask/metamask-extension/pull/8579): Fix Matomo dimension IDs +- [#8592](https://github.com/MetaMask/metamask-extension/pull/8592): Handle trailing / in block explorer URLs +- [#8313](https://github.com/MetaMask/metamask-extension/pull/8313): Add Connected Accounts modal +- [#8609](https://github.com/MetaMask/metamask-extension/pull/8609): Sticky position the tabs at the top +- [#8634](https://github.com/MetaMask/metamask-extension/pull/8634): Define global `web3` as non-enumerable +- [#8601](https://github.com/MetaMask/metamask-extension/pull/8601): warn user when sending from different account +- [#8612](https://github.com/MetaMask/metamask-extension/pull/8612): Persist home tab state +- [#8564](https://github.com/MetaMask/metamask-extension/pull/8564): Implement new transaction list design +- [#8596](https://github.com/MetaMask/metamask-extension/pull/8596): Restrict the size of the permissions metadata store +- [#8654](https://github.com/MetaMask/metamask-extension/pull/8654): Update account options menu design +- [#8657](https://github.com/MetaMask/metamask-extension/pull/8657): Implement new fullscreen design +- [#8663](https://github.com/MetaMask/metamask-extension/pull/8663): Show hostname in the disconnect confirmation +- [#8665](https://github.com/MetaMask/metamask-extension/pull/8665): Make address display wider in Account Details +- [#8670](https://github.com/MetaMask/metamask-extension/pull/8670): Fix token `decimal` type +- [#8653](https://github.com/MetaMask/metamask-extension/pull/8653): Limit Dapp permissions to primary account +- [#8666](https://github.com/MetaMask/metamask-extension/pull/8666): Manually connect via the full connect flow +- [#8677](https://github.com/MetaMask/metamask-extension/pull/8677): Add metrics events for Wyre and CoinSwitch +- [#8680](https://github.com/MetaMask/metamask-extension/pull/8680): Fix connect hardware styling +- [#8689](https://github.com/MetaMask/metamask-extension/pull/8689): Fix create account form styling +- [#8702](https://github.com/MetaMask/metamask-extension/pull/8702): Fix tab content disappearing during scrolling on macOS Firefox +- [#8696](https://github.com/MetaMask/metamask-extension/pull/8696): Implement asset page +- [#8716](https://github.com/MetaMask/metamask-extension/pull/8716): Add nonce to transaction details +- [#8717](https://github.com/MetaMask/metamask-extension/pull/8717): Use URL origin instead of hostname for permission domains +- [#8747](https://github.com/MetaMask/metamask-extension/pull/8747): Fix account menu entry for imported accounts +- [#8768](https://github.com/MetaMask/metamask-extension/pull/8768): Permissions: Do not display HTTP/HTTPS URL schemes for unique hosts +- [#8730](https://github.com/MetaMask/metamask-extension/pull/8730): Hide seed phrase during Account Import +- [#8785](https://github.com/MetaMask/metamask-extension/pull/8785): Rename 'History' tab to 'Activity' +- [#8781](https://github.com/MetaMask/metamask-extension/pull/8781): use UI button for add token functionality +- [#8786](https://github.com/MetaMask/metamask-extension/pull/8786): Show fiat amounts inline on token transfers +- [#8789](https://github.com/MetaMask/metamask-extension/pull/8789): Warn users to only add custom networks that they trust +- [#8802](https://github.com/MetaMask/metamask-extension/pull/8802): Consolidate connected account alerts +- [#8810](https://github.com/MetaMask/metamask-extension/pull/8810): Remove all user- and translator-facing instances of 'dapp' +- [#8836](https://github.com/MetaMask/metamask-extension/pull/8836): Update method data when cached method data is empty +- [#8833](https://github.com/MetaMask/metamask-extension/pull/8833): Improve error handling when signature requested without a keyholder address +- [#8850](https://github.com/MetaMask/metamask-extension/pull/8850): Stop upper-casing exported private key +- [#8631](https://github.com/MetaMask/metamask-extension/pull/8631): Include imported accounts in mobile sync + +## 7.7.9 Tue Apr 28 2020 +- [#8446](https://github.com/MetaMask/metamask-extension/pull/8446): Fix popup not opening +- [#8449](https://github.com/MetaMask/metamask-extension/pull/8449): Skip adding history entry for empty txMeta diffs +- [#8447](https://github.com/MetaMask/metamask-extension/pull/8447): Delete Dai/Sai migration notification +- [#8460](https://github.com/MetaMask/metamask-extension/pull/8460): Update deposit copy for Wyre +- [#8458](https://github.com/MetaMask/metamask-extension/pull/8458): Snapshot txMeta without cloning history +- [#8459](https://github.com/MetaMask/metamask-extension/pull/8459): Fix method registry initialization +- [#8455](https://github.com/MetaMask/metamask-extension/pull/8455): Add Dai/Sai to currency display +- [#8461](https://github.com/MetaMask/metamask-extension/pull/8461): Prevent network switch upon close of network timeout overlay +- [#8457](https://github.com/MetaMask/metamask-extension/pull/8457): Add INR currency option +- [#8462](https://github.com/MetaMask/metamask-extension/pull/8462): Fix display of Kovan and Rinkeby chain IDs +- [#8465](https://github.com/MetaMask/metamask-extension/pull/8465): Use ethereum-ens-network-map for network support +- [#8463](https://github.com/MetaMask/metamask-extension/pull/8463): Update deprecated Etherscam link +- [#8474](https://github.com/MetaMask/metamask-extension/pull/8474): Only update pending transactions upon block update +- [#8476](https://github.com/MetaMask/metamask-extension/pull/8476): Update eth-contract-metadata +- [#8509](https://github.com/MetaMask/metamask-extension/pull/8509): Fix Tohen Typo + +## 7.7.8 Wed Mar 11 2020 +- [#8176](https://github.com/MetaMask/metamask-extension/pull/8176): Handle and set gas estimation when max mode is clicked +- [#8178](https://github.com/MetaMask/metamask-extension/pull/8178): Use specified gas limit when speeding up a transaction + +## 7.7.7 Wed Mar 04 2020 +- [#8162](https://github.com/MetaMask/metamask-extension/pull/8162): Remove invalid Ledger accounts +- [#8163](https://github.com/MetaMask/metamask-extension/pull/8163): Fix account index check + +## 7.7.6 Mon Mar 02 2020 +- [#8154](https://github.com/MetaMask/metamask-extension/pull/8154): Prevent signing from incorrect Ledger account + +## 7.7.5 Fri Feb 14 2020 +- [#8053](https://github.com/MetaMask/metamask-extension/pull/8053): Inline the source text not the binary encoding for inpage script +- [#8049](https://github.com/MetaMask/metamask-extension/pull/8049): Add warning to watchAsset API when editing a known token +- [#8051](https://github.com/MetaMask/metamask-extension/pull/8051): Update Wyre ETH purchase url +- [#8059](https://github.com/MetaMask/metamask-extension/pull/8059): Attempt ENS resolution on any valid domain name + +## 7.7.4 Wed Jan 29 2020 +- [#7918](https://github.com/MetaMask/metamask-extension/pull/7918): Update data on Approve screen after updating custom spend limit +- [#7919](https://github.com/MetaMask/metamask-extension/pull/7919): Allow editing max spend limit +- [#7920](https://github.com/MetaMask/metamask-extension/pull/7920): Validate custom spend limit +- [#7944](https://github.com/MetaMask/metamask-extension/pull/7944): Only resolve ENS on mainnet +- [#7954](https://github.com/MetaMask/metamask-extension/pull/7954): Update ENS registry addresses + +## 7.7.3 Fri Jan 24 2020 +- [#7894](https://github.com/MetaMask/metamask-extension/pull/7894): Update GABA dependency version +- [#7901](https://github.com/MetaMask/metamask-extension/pull/7901): Use eth-contract-metadata@1.12.1 +- [#7910](https://github.com/MetaMask/metamask-extension/pull/7910): Fixing broken JSON import help link + +## 7.7.2 Fri Jan 10 2020 +- [#7753](https://github.com/MetaMask/metamask-extension/pull/7753): Fix gas estimate for tokens +- [#7473](https://github.com/MetaMask/metamask-extension/pull/7473): Fix transaction order on transaction confirmation screen + +## 7.7.1 Wed Dec 04 2019 +- [#7488](https://github.com/MetaMask/metamask-extension/pull/7488): Fix text overlap when expanding transaction +- [#7491](https://github.com/MetaMask/metamask-extension/pull/7491): Update gas when asset is changed on send screen +- [#7500](https://github.com/MetaMask/metamask-extension/pull/7500): Remove unused onClick prop from Dropdown component +- [#7502](https://github.com/MetaMask/metamask-extension/pull/7502): Fix chainId for non standard networks +- [#7519](https://github.com/MetaMask/metamask-extension/pull/7519): Fixing hardware connect error display +- [#7501](https://github.com/MetaMask/metamask-extension/pull/7501): Fix accessibility of first-time-flow terms checkboxes +- [#7579](https://github.com/MetaMask/metamask-extension/pull/7579): Prevent Maker migration dismissal timeout state from being overwritten +- [#7581](https://github.com/MetaMask/metamask-extension/pull/7581): Persist Maker migration dismissal timeout +- [#7484](https://github.com/MetaMask/metamask-extension/pull/7484): Ensure transactions are shown in the order they are received +- [#7604](https://github.com/MetaMask/metamask-extension/pull/7604): Process URL fragment for ens-ipfs redirects +- [#7628](https://github.com/MetaMask/metamask-extension/pull/7628): Fix typo that resulted in degrated account menu performance +- [#7558](https://github.com/MetaMask/metamask-extension/pull/7558): Use localized messages for NotificationModal buttons + +## 7.7.0 Thu Nov 28 2019 [WITHDRAWN] +- [#7004](https://github.com/MetaMask/metamask-extension/pull/7004): Connect distinct accounts per site +- [#7480](https://github.com/MetaMask/metamask-extension/pull/7480): Fixed link on root README.md +- [#7482](https://github.com/MetaMask/metamask-extension/pull/7482): Update Wyre ETH purchase url +- [#7484](https://github.com/MetaMask/metamask-extension/pull/7484): Ensure transactions are shown in the order they are received +- [#7491](https://github.com/MetaMask/metamask-extension/pull/7491): Update gas when token is changed on the send screen +- [#7501](https://github.com/MetaMask/metamask-extension/pull/7501): Fix accessibility of first-time-flow terms checkboxes +- [#7502](https://github.com/MetaMask/metamask-extension/pull/7502): Fix chainId for non standard networks +- [#7579](https://github.com/MetaMask/metamask-extension/pull/7579): Fix timing of DAI migration notifications after dismissal +- [#7519](https://github.com/MetaMask/metamask-extension/pull/7519): Fixing hardware connect error display +- [#7558](https://github.com/MetaMask/metamask-extension/pull/7558): Use localized messages for NotificationModal buttons +- [#7488](https://github.com/MetaMask/metamask-extension/pull/7488): Fix text overlap when expanding transaction + +## 7.6.1 Tue Nov 19 2019 +- [#7475](https://github.com/MetaMask/metamask-extension/pull/7475): Add 'Remind Me Later' to the Maker notification +- [#7436](https://github.com/MetaMask/metamask-extension/pull/7436): Add additional rpcUrl verification +- [#7468](https://github.com/MetaMask/metamask-extension/pull/7468): Show transaction fee units on approve screen + +## 7.6.0 Mon Nov 18 2019 +- [#7450](https://github.com/MetaMask/metamask-extension/pull/7450): Add migration notification for users with non-zero Sai +- [#7461](https://github.com/MetaMask/metamask-extension/pull/7461): Import styles for showing multiple notifications +- [#7451](https://github.com/MetaMask/metamask-extension/pull/7451): Add button disabled when password is empty + +## 7.5.3 Fri Nov 15 2019 +- [#7412](https://github.com/MetaMask/metamask-extension/pull/7412): lock eth-contract-metadata (#7412) +- [#7416](https://github.com/MetaMask/metamask-extension/pull/7416): Add eslint import plugin to help detect unresolved paths +- [#7414](https://github.com/MetaMask/metamask-extension/pull/7414): Ensure SignatureRequestOriginal 'beforeunload' handler is bound (#7414) +- [#7430](https://github.com/MetaMask/metamask-extension/pull/7430): Update badge colour +- [#7408](https://github.com/MetaMask/metamask-extension/pull/7408): Utilize the full size of icon space (#7408) +- [#7431](https://github.com/MetaMask/metamask-extension/pull/7431): Add all icons to manifest (#7431) +- [#7426](https://github.com/MetaMask/metamask-extension/pull/7426): Ensure Etherscan result is valid before reading it (#7426) +- [#7434](https://github.com/MetaMask/metamask-extension/pull/7434): Update 512px icon (#7434) +- [#7410](https://github.com/MetaMask/metamask-extension/pull/7410): Fix sourcemaps for Sentry +- [#7420](https://github.com/MetaMask/metamask-extension/pull/7420): Adds and end to end test for typed signature requests +- [#7439](https://github.com/MetaMask/metamask-extension/pull/7439): Add metricsEvent to contextTypes (#7439) +- [#7419](https://github.com/MetaMask/metamask-extension/pull/7419): Added webRequest.RequestFilter to filter main_frame .eth requests (#7419) + +## 7.5.2 Thu Nov 14 2019 +- [#7414](https://github.com/MetaMask/metamask-extension/pull/7414): Ensure SignatureRequestOriginal 'beforeunload' handler is bound + +## 7.5.1 Tuesday Nov 13 2019 +- [#7402](https://github.com/MetaMask/metamask-extension/pull/7402): Fix regression for signed types data screens +- [#7390](https://github.com/MetaMask/metamask-extension/pull/7390): Update json-rpc-engine +- [#7401](https://github.com/MetaMask/metamask-extension/pull/7401): Reject connection request on window close + +## 7.5.0 Mon Nov 04 2019 +- [#7328](https://github.com/MetaMask/metamask-extension/pull/7328): ignore known transactions on first broadcast and continue with normal flow +- [#7327](https://github.com/MetaMask/metamask-extension/pull/7327): eth_getTransactionByHash will now check metamask's local history for pending transactions +- [#7333](https://github.com/MetaMask/metamask-extension/pull/7333): Cleanup beforeunload handler after transaction is resolved +- [#7038](https://github.com/MetaMask/metamask-extension/pull/7038): Add support for ZeroNet +- [#7334](https://github.com/MetaMask/metamask-extension/pull/7334): Add web3 deprecation warning +- [#6924](https://github.com/MetaMask/metamask-extension/pull/6924): Add Estimated time to pending tx +- [#7177](https://github.com/MetaMask/metamask-extension/pull/7177): ENS Reverse Resolution support +- [#6891](https://github.com/MetaMask/metamask-extension/pull/6891): New signature request v3 UI +- [#7348](https://github.com/MetaMask/metamask-extension/pull/7348): fix width in first time flow button +- [#7271](https://github.com/MetaMask/metamask-extension/pull/7271): Redesign approve screen +- [#7354](https://github.com/MetaMask/metamask-extension/pull/7354): fix account menu width +- [#7379](https://github.com/MetaMask/metamask-extension/pull/7379): Set default advanced tab gas limit +- [#7380](https://github.com/MetaMask/metamask-extension/pull/7380): Fix advanced tab gas chart +- [#7374](https://github.com/MetaMask/metamask-extension/pull/7374): Hide accounts dropdown scrollbars on Firefox +- [#7357](https://github.com/MetaMask/metamask-extension/pull/7357): Update to gaba@1.8.0 +- [#7335](https://github.com/MetaMask/metamask-extension/pull/7335): Add onbeforeunload and have it call onCancel + +## 7.4.0 Tue Oct 29 2019 +- [#7186](https://github.com/MetaMask/metamask-extension/pull/7186): Use `AdvancedGasInputs` in `AdvancedTabContent` +- [#7304](https://github.com/MetaMask/metamask-extension/pull/7304): Move signTypedData signing out to keyrings +- [#7306](https://github.com/MetaMask/metamask-extension/pull/7306): correct the zh-TW translation +- [#7309](https://github.com/MetaMask/metamask-extension/pull/7309): Freeze Promise global on boot +- [#7296](https://github.com/MetaMask/metamask-extension/pull/7296): Add "Retry" option for failed transactions +- [#7319](https://github.com/MetaMask/metamask-extension/pull/7319): Fix transaction list item status spacing issue +- [#7218](https://github.com/MetaMask/metamask-extension/pull/7218): Add hostname and extensionId to site metadata +- [#7324](https://github.com/MetaMask/metamask-extension/pull/7324): Fix contact deletion +- [#7326](https://github.com/MetaMask/metamask-extension/pull/7326): Fix edit contact details +- [#7325](https://github.com/MetaMask/metamask-extension/pull/7325): Update eth-json-rpc-filters to fix memory leak +- [#7334](https://github.com/MetaMask/metamask-extension/pull/7334): Add web3 deprecation warning + +## 7.3.1 Mon Oct 21 2019 +- [#7298](https://github.com/MetaMask/metamask-extension/pull/7298): Turn off full screen vs popup a/b test + +## 7.3.0 Fri Sep 27 2019 +- [#6972](https://github.com/MetaMask/metamask-extension/pull/6972): 3box integration +- [#7168](https://github.com/MetaMask/metamask-extension/pull/7168): Add fixes for German translations +- [#7170](https://github.com/MetaMask/metamask-extension/pull/7170): Remove the disk store +- [#7176](https://github.com/MetaMask/metamask-extension/pull/7176): Performance: Delivery optimized images +- [#7189](https://github.com/MetaMask/metamask-extension/pull/7189): add goerli to incoming tx +- [#7190](https://github.com/MetaMask/metamask-extension/pull/7190): Remove unused locale messages +- [#7173](https://github.com/MetaMask/metamask-extension/pull/7173): Fix RPC error messages +- [#7205](https://github.com/MetaMask/metamask-extension/pull/7205): address book entries by chainId +- [#7207](https://github.com/MetaMask/metamask-extension/pull/7207): obs-store/local-store should upgrade webextension error to real error +- [#7162](https://github.com/MetaMask/metamask-extension/pull/7162): Add a/b test for full screen transaction confirmations +- [#7089](https://github.com/MetaMask/metamask-extension/pull/7089): Add advanced setting to enable editing nonce on confirmation screens +- [#7239](https://github.com/MetaMask/metamask-extension/pull/7239): Update ETH logo, update deposit Ether logo height and width +- [#7255](https://github.com/MetaMask/metamask-extension/pull/7255): Use translated string for state log +- [#7266](https://github.com/MetaMask/metamask-extension/pull/7266): fix issue of xyz ens not resolving +- [#7253](https://github.com/MetaMask/metamask-extension/pull/7253): Prevent Logout Timer that's longer than a week. +- [#7285](https://github.com/MetaMask/metamask-extension/pull/7285): Lessen the length of ENS validation to 3 +- [#7287](https://github.com/MetaMask/metamask-extension/pull/7287): Fix phishing detect script + +## 7.2.3 Fri Oct 04 2019 +- [#7252](https://github.com/MetaMask/metamask-extension/pull/7252): Fix gas limit when sending tx without data to a contract +- [#7260](https://github.com/MetaMask/metamask-extension/pull/7260): Do not transate on seed phrases +- [#7252](https://github.com/MetaMask/metamask-extension/pull/7252): Ensure correct tx category when sending to contracts without tx data + +## 7.2.2 Tue Sep 24 2019 +- [#7213](https://github.com/MetaMask/metamask-extension/pull/7213): Update minimum Firefox verison to 56.0 + +## 7.2.1 Tue Sep 17 2019 +- [#7180](https://github.com/MetaMask/metamask-extension/pull/7180): Add `appName` message to each locale + +## 7.2.0 Mon Sep 8, 2019 +- [#7099](https://github.com/MetaMask/metamask-extension/pull/7099): Update localization from Transifex Brave +- [#7137](https://github.com/MetaMask/metamask-extension/pull/7137): Fix validation of empty block explorer url's in custom network form +- [#7128](https://github.com/MetaMask/metamask-extension/pull/7128): Support for eth_signTypedData_v4 +- [#7110](https://github.com/MetaMask/metamask-extension/pull/7110): Adds `chaindIdChanged` event to the ethereum provider +- [#7091](https://github.com/MetaMask/metamask-extension/pull/7091): Improve browser performance issues caused by missing locale errors +- [#7085](https://github.com/MetaMask/metamask-extension/pull/7085): Prevent ineffectual speed ups of pending transactions that don't have the lowest nonce +- [#7156](https://github.com/MetaMask/metamask-extension/pull/7156): Set minimum Firefox version to v56.2 to support Waterfox +- [#7157](https://github.com/MetaMask/metamask-extension/pull/7157): Add polyfill for AbortController +- [#7161](https://github.com/MetaMask/metamask-extension/pull/7161): Replace `undefined` selectedAddress with `null` +- [#7171](https://github.com/MetaMask/metamask-extension/pull/7171): Fix recipient field of approve screen + +## 7.1.1 Tue Aug 27 2019 +- [#7059](https://github.com/MetaMask/metamask-extension/pull/7059): Remove blockscale, replace with ethgasstation +- [#7037](https://github.com/MetaMask/metamask-extension/pull/7037): Remove Babel 6 from internal dependencies +- [#7093](https://github.com/MetaMask/metamask-extension/pull/7093): Allow dismissing privacy mode notification from popup +- [#7087](https://github.com/MetaMask/metamask-extension/pull/7087): Add breadcrumb spacing on Contacts page +- [#7081](https://github.com/MetaMask/metamask-extension/pull/7081): Fix confirm token transaction amount display +- [#7088](https://github.com/MetaMask/metamask-extension/pull/7088): Fix BigNumber conversion error +- [#7072](https://github.com/MetaMask/metamask-extension/pull/7072): Right-to-left CSS (using module for conversion) +- [#6878](https://github.com/MetaMask/metamask-extension/pull/6878): Persian translation +- [#7012](https://github.com/MetaMask/metamask-extension/pull/7012): Added missed phrases to RU locale + +## 7.1.0 Fri Aug 16 2019 +- [#7035](https://github.com/MetaMask/metamask-extension/pull/7035): Filter non-ERC-20 assets during mobile sync (#7035) +- [#7021](https://github.com/MetaMask/metamask-extension/pull/7021): Using translated string for end of flow messaging (#7021) +- [#7018](https://github.com/MetaMask/metamask-extension/pull/7018): Rename Contacts List settings tab to Contacts (#7018) +- [#7013](https://github.com/MetaMask/metamask-extension/pull/7013): Connections settings tab (#7013) +- [#6996](https://github.com/MetaMask/metamask-extension/pull/6996): Fetch & display received transactions (#6996) +- [#6991](https://github.com/MetaMask/metamask-extension/pull/6991): Remove reload from Share Address button (#6991) +- [#6978](https://github.com/MetaMask/metamask-extension/pull/6978): Address book fixes (#6978) +- [#6944](https://github.com/MetaMask/metamask-extension/pull/6944): Show recipient alias in confirm header if exists (#6944) +- [#6930](https://github.com/MetaMask/metamask-extension/pull/6930): Add support for eth_signTypedData_v4 (#6930) +- [#7046](https://github.com/MetaMask/metamask-extension/pull/7046): Update Italian translation (#7046) +- [#7047](https://github.com/MetaMask/metamask-extension/pull/7047): Add warning about reload on network change + +## 7.0.1 Thu Aug 08 2019 +- [#6975](https://github.com/MetaMask/metamask-extension/pull/6975): Ensure seed phrase backup notification only shows up for new users + +## 7.0.0 Fri Aug 02 2019 +- [#6828](https://github.com/MetaMask/metamask-extension/pull/6828): Capitalized speed up label to match rest of UI +- [#6874](https://github.com/MetaMask/metamask-extension/pull/6928): Allows skipping of seed phrase challenge during onboarding, and completing it at a later time +- [#6900](https://github.com/MetaMask/metamask-extension/pull/6900): Prevent opening of asset dropdown if no tokens in account +- [#6904](https://github.com/MetaMask/metamask-extension/pull/6904): Set privacy mode as default +- [#6914](https://github.com/MetaMask/metamask-extension/pull/6914): Adds Address Book feature +- [#6928](https://github.com/MetaMask/metamask-extension/pull/6928): Disable Copy Tx ID and block explorer link for transactions without hash +- [#6967](https://github.com/MetaMask/metamask-extension/pull/6967): Fix mobile sync + +## 6.7.3 Thu Jul 18 2019 + +- [#6888](https://github.com/MetaMask/metamask-extension/pull/6888): Fix bug with resubmitting unsigned transactions. + ## 6.7.2 Mon Jul 01 2019 -- [#6713](https://github.com/MetaMask/metamask-extension/pull/6713): * Normalize and Validate txParams in TransactionStateManager.addTx too +- [#6713](https://github.com/MetaMask/metamask-extension/pull/6713): * Normalize and Validate txParams in TransactionStateManager.addTx too - [#6759](https://github.com/MetaMask/metamask-extension/pull/6759): Update to Node.js v10 -- [#Fixes #6694 ](https://github.com/MetaMask/metamask-extension/pull/Fixes #6694 ): Fixes #6694 -- [#6743](https://github.com/MetaMask/metamask-extension/pull/6743): * Add tests for ImportWithSeedPhrase#parseSeedPhrase -- [#Fixes #6740](https://github.com/MetaMask/metamask-extension/pull/Fixes #6740): Fixes #6740 -- [#Fixes #6741](https://github.com/MetaMask/metamask-extension/pull/Fixes #6741): Fixes #6741 +- [#6694](https://github.com/MetaMask/metamask-extension/pull/6694): Fixes #6694 +- [#6743](https://github.com/MetaMask/metamask-extension/pull/6743): * Add tests for ImportWithSeedPhrase#parseSeedPhrase +- [#6740](https://github.com/MetaMask/metamask-extension/pull/6740): Fixes #6740 +- [#6741](https://github.com/MetaMask/metamask-extension/pull/6741): Fixes #6741 - [#6761](https://github.com/MetaMask/metamask-extension/pull/6761): Fixes #6760, correct PropTypes for nextRoute -- [#6754](https://github.com/MetaMask/metamask-extension/pull/6754): There is currently a bug in chrome that prevents reading source maps +- [#6754](https://github.com/MetaMask/metamask-extension/pull/6754): Use inline source maps in development - [#6589](https://github.com/MetaMask/metamask-extension/pull/6589): Document hotfix protocol - [#6738](https://github.com/MetaMask/metamask-extension/pull/6738): Add codeowner for package-lock-old.json package-lock.json package.json packagelock-old.json files - [#6648](https://github.com/MetaMask/metamask-extension/pull/6648): Add loading view to notification.html @@ -24,11 +413,12 @@ - [#6623](https://github.com/MetaMask/metamask-extension/pull/6623): Improve contract method data fetching (#6623) - [#6551](https://github.com/MetaMask/metamask-extension/pull/6551): Adds 4byte registry fallback to getMethodData() (#6435) -- [#6718, #6650](https://github.com/MetaMask/metamask-extension/pull/6718, #6650): Add delete to custom RPC form +- [#6718](https://github.com/MetaMask/metamask-extension/pull/6718): Add delete to custom RPC form - [#6700](https://github.com/MetaMask/metamask-extension/pull/6700): Fix styles on 'import account' page, update help link - [#6714](https://github.com/MetaMask/metamask-extension/pull/6714): Wrap smaller custom block explorer url text - [#6706](https://github.com/MetaMask/metamask-extension/pull/6706): Pin ethereumjs-tx - [#6700](https://github.com/MetaMask/metamask-extension/pull/6700): Fix styles on 'import account' page, update help link +- [#6775](https://github.com/MetaMask/metamask-extension/pull/6775): Started adding visual documentation of MetaMask plugin components with the account menu component first ## 6.6.2 Fri Jun 07 2019 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 63d19c633716..000000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,51 +0,0 @@ -# Welcome to MetaMask! - -If you're submitting code to MetaMask, there are some simple things we'd appreciate you doing to help us stay organized! - -### Finding the right project - -Before taking the time to code and implement something, feel free to open an issue and discuss it! There may even be an issue already open, and together we may come up with a specific strategy before you take your precious time to write code. - -There are also plenty of open issues we'd love help with. Search the [`good first issue`](https://github.com/MetaMask/metamask-extension/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) label, or head to Gitcoin and earn ETH for completing projects we've posted bounties on. - -If you're picking up a bounty or an existing issue, feel free to ask clarifying questions on the issue as you go about your work. - -### Submitting a pull request -When you're done with your project / bugfix / feature and ready to submit a PR, there are a couple guidelines we ask you to follow: - -- [ ] **Test it**: For any new programmatic functionality, we like unit tests when possible, so if you can keep your code cleanly isolated, please do add a test file to the `tests` folder. -- [ ] **Add to the CHANGELOG**: Help us keep track of all the moving pieces by adding an entry to the [`CHANGELOG.md`](https://github.com/MetaMask/metamask-extension/blob/develop/CHANGELOG.md) with a link to your PR. -- [ ] **Meet the spec**: Make sure the PR adds functionality that matches the issue you're closing. This is especially important for bounties: sometimes design or implementation details are included in the conversation, so read carefully! -- [ ] **Close the issue**: If this PR closes an open issue, add the line `Fixes #$ISSUE_NUMBER`. Ex. For closing issue 418, include the line `Fixes #418`. If it doesn't close the issue but addresses it partially, just include a reference to the issue number, like `#418`. -- [ ] **Keep it simple**: Try not to include multiple features in a single PR, and don't make extraneous changes outside the scope of your contribution. All those touched files make things harder to review ;) -- [ ] **PR against `develop`**: Submit your PR against the `develop` branch. This is where we merge new features so they get some time to receive extra testing before being pushed to `master` for production. If your PR is a hot-fix that needs to be published urgently, you may submit a PR against the `master` branch, but this PR will receive tighter scrutiny before merging. -- [ ] **Get reviewed by a core contributor**: Make sure you get a `:thumbsup`, `:+1`, or `LGTM` from a user with a `Member` badge before merging. - -And that's it! Thanks for helping out. - -### Developing inside a node_modules folder - -First make sure you are comfortable with [how require works](https://github.com/maxogden/art-of-node#how-require-works) in node. - -We recommend creating a folder somewhere manually called `node_modules`. For example in `~/code/node_modules`. Clone all of your git copies of modules that you want to work on into here, so for example: - -- `~/code/node_modules/dat` -- `~/code/node_modules/hyperdrive` - -When you run `npm install` inside of `~/code/node_modules/dat`, dat will get its own copy of `hyperdrive` (one if its dependencies) inside `~/code/node_modules/dat/node_modules`. However, if you encounter a bug in hyperdrive that you need to fix, but you want to test your fix in dat, you want dat to use your git copy of hyperdrive at `~/code/node_modules/hyperdrive` and not the npm copy of hyperdrive at `~/code/node_modules/dat/node_modules/hyperdrive`. - -How do you get dat to use the git copy of hyperdrive? Just delete the npm copy! - -``` -rm -rf ~/code/node_modules/dat/node_modules/hyperdrive -``` - -Now when you run dat, and it tries to `require('hyperdrive')` it first looks in its own `node_modules` folder at `~/code/node_modules/dat/node_modules` but doesnt find hyperdrive. So it goes up to `~/code/node_modules` and finds `hyperdrive` there and uses that one, your git copy. - -If you want to switch back to an npm copy, just run `npm install` inside `~/code/node_modules/dat/` and npm will download any missing modules into `~/code/node_modules/dat/node_modules` but wont touch anything in `~/code/node_modules`. - -This might seem a bit complicated at first, but is simple once you get the hang of it. Here are some rules to help you get started: - -- Never make any meaningful edits to code inside an "npm-managed" node_modules folder (such as `~/code/node_modules/dat/node_modules`), because when you run `npm install` inside those folders it could inadvertently delete all of your edits when installing an updated copy of a module. This has happened to me many times, so I just always use my git copy and delete the npm copy (as described above) to make edits to a module. -- You should never need to run any npm commands in terminal when at your "manually managed"" node_modules folder at `~/code/node_modules`. Never running npm commands at that folder also prevents npm from accidentally erasing your git copies of modules -- The location of your "manually managed" node_modules folder should be somewhere isolated from your normal require path. E.g. if you put it at `~/node_modules`, then when you run `npm install dat` at `~/Desktop` npm might decide to erase your git copy of dat at `~/node_modules/dat` and replace it with a copy from npm, which could make you lose work. Putting your manually managed `node_modules` folder in a sub-folder like `~/code` gets it "out of the way" and prevents accidents like that from happening. diff --git a/README.md b/README.md index 055d9053be84..09f8d2857da1 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,9 @@ # MetaMask Browser Extension -[![Build Status](https://circleci.com/gh/MetaMask/metamask-extension.svg?style=shield&circle-token=a1ddcf3cd38e29267f254c9c59d556d513e3a1fd)](https://circleci.com/gh/MetaMask/metamask-extension) [![Coverage Status](https://coveralls.io/repos/github/MetaMask/metamask-extension/badge.svg?branch=master)](https://coveralls.io/github/MetaMask/metamask-extension?branch=master) You can find the latest version of MetaMask on [our official website](https://metamask.io/). For help using MetaMask, visit our [User Support Site](https://metamask.zendesk.com/hc/en-us). +MetaMask supports Firefox, Google Chrome, and Chromium-based browsers. We recommend using the latest available browser version. + For up to the minute news, follow our [Twitter](https://twitter.com/metamask_io) or [Medium](https://medium.com/metamask) pages. To learn how to develop MetaMask-compatible applications, visit our [Developer Docs](https://metamask.github.io/metamask-docs/). @@ -11,30 +12,29 @@ To learn how to contribute to the MetaMask project itself, visit our [Internal D ## Building locally -- Install [Node.js](https://nodejs.org) version 10 and the latest available npm@6 +- Install [Node.js](https://nodejs.org) version 10 - If you are using [nvm](https://github.com/creationix/nvm#installation) (recommended) running `nvm use` will automatically choose the right node version for you. - - If you install Node.js manually, ensure you're using npm@6 - - Install npm@6 using `npm install -g npm@6` -- Install dependencies: `npm ci` - - If you have issues with node-sass compilation, try `npm rebuild node-sass` -- Build the project to the `./dist/` folder with `npm run dist`. -- Optionally, to start a development build (e.g. with logging and file watching) run `npm start` instead. +- Install [Yarn](https://yarnpkg.com/en/docs/install) +- Install dependencies: `yarn` +- Build the project to the `./dist/` folder with `yarn dist`. +- Optionally, to start a development build (e.g. with logging and file watching) run `yarn start` instead. + - To start the [React DevTools](https://github.com/facebook/react-devtools) and [Redux DevTools Extension](http://extension.remotedev.io) + alongside the app, use `yarn start:dev`. + - React DevTools will open in a separate window; no browser extension is required + - Redux DevTools will need to be installed as a browser extension. Open the Redux Remote Devtools to access Redux state logs. This can be done by either right clicking within the web browser to bring up the context menu, expanding the Redux DevTools panel and clicking Open Remote DevTools OR clicking the Redux DevTools extension icon and clicking Open Remote DevTools. + - You will also need to check the "Use custom (local) server" checkbox in the Remote DevTools Settings, using the default server configuration (host `localhost`, port `8000`, secure connection checkbox unchecked) Uncompressed builds can be found in `/dist`, compressed builds can be found in `/builds` once they're built. ## Contributing -You can read [our internal docs here](https://metamask.github.io/metamask-extension/). - -You can re-generate the docs locally by running `npm run doc`, and contributors can update the hosted docs by running `npm run publish-docs`. - ### Running Tests -Run tests with `npm test`. +Run tests with `yarn test`. -You can also test with a continuously watching process, via `npm run watch`. +You can also test with a continuously watching process, via `yarn watch`. -You can run the linter by itself with `npm run lint`. +You can run the linter by itself with `yarn lint`. ## Architecture @@ -43,32 +43,23 @@ You can run the linter by itself with `npm run lint`. ## Development ```bash -npm install -npm start +yarn +yarn start ``` ## Build for Publishing ```bash -npm run dist +yarn dist ``` -#### Writing Browser Tests - -To write tests that will be run in the browser using QUnit, add your test files to `test/integration/lib`. - ## Other Docs - [How to add custom build to Chrome](./docs/add-to-chrome.md) - [How to add custom build to Firefox](./docs/add-to-firefox.md) - [How to add a new translation to MetaMask](./docs/translating-guide.md) - [Publishing Guide](./docs/publishing.md) -- [The MetaMask Team](./docs/team.md) -- [How to live reload on local dependency changes](./docs/developing-on-deps.md) -- [How to add new networks to the Provider Menu](./docs/adding-new-networks.md) -- [How to manage notices that appear when the app starts up](./docs/notices.md) -- [How to port MetaMask to a new platform](./docs/porting_to_new_environment.md) - [How to use the TREZOR emulator](./docs/trezor-emulator.md) -- [How to generate a visualization of this repository's development](./docs/development-visualization.md) +- [How to generate a visualization of this repository's development](./development/gource-viz.sh) -[1]: http://www.nomnoml.com/#view/%5B%3Cactor%3Euser%5D%0A%0A%5Bmetamask-ui%7C%0A%20%20%20%5Btools%7C%0A%20%20%20%20%20react%0A%20%20%20%20%20redux%0A%20%20%20%20%20thunk%0A%20%20%20%20%20ethUtils%0A%20%20%20%20%20jazzicon%0A%20%20%20%5D%0A%20%20%20%5Bcomponents%7C%0A%20%20%20%20%20app%0A%20%20%20%20%20account-detail%0A%20%20%20%20%20accounts%0A%20%20%20%20%20locked-screen%0A%20%20%20%20%20restore-vault%0A%20%20%20%20%20identicon%0A%20%20%20%20%20config%0A%20%20%20%20%20info%0A%20%20%20%5D%0A%20%20%20%5Breducers%7C%0A%20%20%20%20%20app%0A%20%20%20%20%20metamask%0A%20%20%20%20%20identities%0A%20%20%20%5D%0A%20%20%20%5Bactions%7C%0A%20%20%20%20%20%5BaccountManager%5D%0A%20%20%20%5D%0A%20%20%20%5Bcomponents%5D%3A-%3E%5Bactions%5D%0A%20%20%20%5Bactions%5D%3A-%3E%5Breducers%5D%0A%20%20%20%5Breducers%5D%3A-%3E%5Bcomponents%5D%0A%5D%0A%0A%5Bweb%20dapp%7C%0A%20%20%5Bui%20code%5D%0A%20%20%5Bweb3%5D%0A%20%20%5Bmetamask-inpage%5D%0A%20%20%0A%20%20%5B%3Cactor%3Eui%20developer%5D%0A%20%20%5Bui%20developer%5D-%3E%5Bui%20code%5D%0A%20%20%5Bui%20code%5D%3C-%3E%5Bweb3%5D%0A%20%20%5Bweb3%5D%3C-%3E%5Bmetamask-inpage%5D%0A%5D%0A%0A%5Bmetamask-background%7C%0A%20%20%5Bprovider-engine%5D%0A%20%20%5Bhooked%20wallet%20subprovider%5D%0A%20%20%5Bid%20store%5D%0A%20%20%0A%20%20%5Bprovider-engine%5D%3C-%3E%5Bhooked%20wallet%20subprovider%5D%0A%20%20%5Bhooked%20wallet%20subprovider%5D%3C-%3E%5Bid%20store%5D%0A%20%20%5Bconfig%20manager%7C%0A%20%20%20%20%5Brpc%20configuration%5D%0A%20%20%20%20%5Bencrypted%20keys%5D%0A%20%20%20%20%5Bwallet%20nicknames%5D%0A%20%20%5D%0A%20%20%0A%20%20%5Bprovider-engine%5D%3C-%5Bconfig%20manager%5D%0A%20%20%5Bid%20store%5D%3C-%3E%5Bconfig%20manager%5D%0A%5D%0A%0A%5Buser%5D%3C-%3E%5Bmetamask-ui%5D%0A%0A%5Buser%5D%3C%3A--%3A%3E%5Bweb%20dapp%5D%0A%0A%5Bmetamask-contentscript%7C%0A%20%20%5Bplugin%20restart%20detector%5D%0A%20%20%5Brpc%20passthrough%5D%0A%5D%0A%0A%5Brpc%20%7C%0A%20%20%5Bethereum%20blockchain%20%7C%0A%20%20%20%20%5Bcontracts%5D%0A%20%20%20%20%5Baccounts%5D%0A%20%20%5D%0A%5D%0A%0A%5Bweb%20dapp%5D%3C%3A--%3A%3E%5Bmetamask-contentscript%5D%0A%5Bmetamask-contentscript%5D%3C-%3E%5Bmetamask-background%5D%0A%5Bmetamask-background%5D%3C-%3E%5Bmetamask-ui%5D%0A%5Bmetamask-background%5D%3C-%3E%5Brpc%5D%0A +[1]: http://www.nomnoml.com/#view/%5B%3Cactor%3Euser%5D%0A%0A%5Bmetamask-ui%7C%0A%20%20%20%5Btools%7C%0A%20%20%20%20%20react%0A%20%20%20%20%20redux%0A%20%20%20%20%20thunk%0A%20%20%20%20%20ethUtils%0A%20%20%20%20%20jazzicon%0A%20%20%20%5D%0A%20%20%20%5Bcomponents%7C%0A%20%20%20%20%20app%0A%20%20%20%20%20account-detail%0A%20%20%20%20%20accounts%0A%20%20%20%20%20locked-screen%0A%20%20%20%20%20restore-vault%0A%20%20%20%20%20identicon%0A%20%20%20%20%20config%0A%20%20%20%20%20info%0A%20%20%20%5D%0A%20%20%20%5Breducers%7C%0A%20%20%20%20%20app%0A%20%20%20%20%20metamask%0A%20%20%20%20%20identities%0A%20%20%20%5D%0A%20%20%20%5Bactions%7C%0A%20%20%20%20%20%5BbackgroundConnection%5D%0A%20%20%20%5D%0A%20%20%20%5Bcomponents%5D%3A-%3E%5Bactions%5D%0A%20%20%20%5Bactions%5D%3A-%3E%5Breducers%5D%0A%20%20%20%5Breducers%5D%3A-%3E%5Bcomponents%5D%0A%5D%0A%0A%5Bweb%20dapp%7C%0A%20%20%5Bui%20code%5D%0A%20%20%5Bweb3%5D%0A%20%20%5Bmetamask-inpage%5D%0A%20%20%0A%20%20%5B%3Cactor%3Eui%20developer%5D%0A%20%20%5Bui%20developer%5D-%3E%5Bui%20code%5D%0A%20%20%5Bui%20code%5D%3C-%3E%5Bweb3%5D%0A%20%20%5Bweb3%5D%3C-%3E%5Bmetamask-inpage%5D%0A%5D%0A%0A%5Bmetamask-background%7C%0A%20%20%5Bprovider-engine%5D%0A%20%20%5Bhooked%20wallet%20subprovider%5D%0A%20%20%5Bid%20store%5D%0A%20%20%0A%20%20%5Bprovider-engine%5D%3C-%3E%5Bhooked%20wallet%20subprovider%5D%0A%20%20%5Bhooked%20wallet%20subprovider%5D%3C-%3E%5Bid%20store%5D%0A%20%20%5Bconfig%20manager%7C%0A%20%20%20%20%5Brpc%20configuration%5D%0A%20%20%20%20%5Bencrypted%20keys%5D%0A%20%20%20%20%5Bwallet%20nicknames%5D%0A%20%20%5D%0A%20%20%0A%20%20%5Bprovider-engine%5D%3C-%5Bconfig%20manager%5D%0A%20%20%5Bid%20store%5D%3C-%3E%5Bconfig%20manager%5D%0A%5D%0A%0A%5Buser%5D%3C-%3E%5Bmetamask-ui%5D%0A%0A%5Buser%5D%3C%3A--%3A%3E%5Bweb%20dapp%5D%0A%0A%5Bmetamask-contentscript%7C%0A%20%20%5Bplugin%20restart%20detector%5D%0A%20%20%5Brpc%20passthrough%5D%0A%5D%0A%0A%5Brpc%20%7C%0A%20%20%5Bethereum%20blockchain%20%7C%0A%20%20%20%20%5Bcontracts%5D%0A%20%20%20%20%5Baccounts%5D%0A%20%20%5D%0A%5D%0A%0A%5Bweb%20dapp%5D%3C%3A--%3A%3E%5Bmetamask-contentscript%5D%0A%5Bmetamask-contentscript%5D%3C-%3E%5Bmetamask-background%5D%0A%5Bmetamask-background%5D%3C-%3E%5Bmetamask-ui%5D%0A%5Bmetamask-background%5D%3C-%3E%5Brpc%5D%0A diff --git a/app/_locales/am/messages.json b/app/_locales/am/messages.json new file mode 100644 index 000000000000..c0ccc935204f --- /dev/null +++ b/app/_locales/am/messages.json @@ -0,0 +1,1307 @@ +{ + "chartOnlyAvailableEth": { + "message": "ቻርት የሚገኘዠበ Ethereum አá‹á‰³áˆ¨ መረቦች ላይ ብቻ áŠá‹á¢" + }, + "contractInteraction": { + "message": "የáŒáŠ•áŠ™áŠá‰µ ተáŒá‰£á‰¦á‰µ" + }, + "reject": { + "message": "አይቀበሉ" + }, + "about": { + "message": "ስለ" + }, + "aboutSettingsDescription": { + "message": "ስሪትᣠየድጋá መስጫ ማዕከáˆáŠ“ የáŒáŠ•áŠ™áŠá‰µ መረጃ " + }, + "acceleratingATransaction": { + "message": "* ከáተኛ የáŠá‹³áŒ… ዋጋን በመጠቀሠáŒá‰¥á‹­á‰µáŠ• ማá‹áŒ áŠ• በአá‹á‰³áˆ¨ መረቡ በáጥáŠá‰µ እንዲከወን የማድረጠዕድáˆáŠ• ይጨáˆáˆ«áˆá¤ áŠáŒˆáˆ­ áŒáŠ• áˆáˆáŒŠá‹œáˆ የተረጋገጠ አይደለáˆá¢" + }, + "accessingYourCamera": { + "message": "ወደ ካሜራዎ መድረስ..." + }, + "account": { + "message": "መለያ" + }, + "accountDetails": { + "message": "የመለያ á‹áˆ­á‹áˆ®á‰½" + }, + "accountName": { + "message": "የመለያ ስáˆ" + }, + "accountOptions": { + "message": "የመለያ አማራጮች" + }, + "accountSelectionRequired": { + "message": "መለያ መáˆáˆ¨áŒ¥ ይኖርብዎታáˆ!" + }, + "activityLog": { + "message": "የእንቅስቃሴ áˆá‹áŒá‰¥ ማስታወሻ" + }, + "addNetwork": { + "message": "አá‹á‰³áˆ¨ መረብ አክáˆ" + }, + "addRecipient": { + "message": "ተቀባይ አክáˆ" + }, + "advanced": { + "message": "የላቀ" + }, + "advancedSettingsDescription": { + "message": "አዘጋጅ ባህርያትን መድረስᣠየስቴት መዛáŒá‰¥á‰µáŠ• ማá‹áˆ¨á‹µá£ መለያን ዳáŒáˆ መሙላትᣠtestnets እና ብጠRPC አዋቅርá¢" + }, + "advancedOptions": { + "message": "የላበአማራጮች" + }, + "addToAddressBook": { + "message": "በአድራሻ መá‹áŒˆá‰¥ ላይ አክáˆ" + }, + "addToAddressBookModalPlaceholder": { + "message": "ለáˆáˆ³áˆŒá¡ ጆን ዲ." + }, + "addAlias": { + "message": "ተለዋጭ ስሠአክáˆ" + }, + "addToken": { + "message": "ተለዋጭ ስሠአክáˆ" + }, + "addTokens": { + "message": "ተለዋጭ ስሞችን አክáˆ" + }, + "addSuggestedTokens": { + "message": "የተጠቆሙ ተለዋጭ ስሞችን አክáˆ" + }, + "addAcquiredTokens": { + "message": "MetaMask በመጠቀሠየገዟቸá‹áŠ• ተለዋጭ ስሞች ያክሉ" + }, + "amount": { + "message": "ሰርዠ" + }, + "appDescription": { + "message": "በማሰሺያዎ á‹áˆµáŒ¥ የ Ethereum ቋት", + "description": "The description of the application" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "approve": { + "message": "áቀድ" + }, + "approved": { + "message": "የተáˆá‰€á‹°" + }, + "asset": { + "message": "áˆá‰¥á‰µ" + }, + "attemptingConnect": { + "message": "ከ blockchain ጋር ለመገናኘት መሞከርá¢" + }, + "attemptToCancel": { + "message": "ለመሰረዠይሞክራሉ?" + }, + "attemptToCancelDescription": { + "message": "ይህን ሙከራ ማቅረብ የመጀመሪያዠáŒá‰¥á‹­á‰µá‹Ž እንደሚሰረዠዋስትና አይሰጥáˆá¢ የመሰረዠሙከራዠከተሳካᣠከላይ የተጠቀሰá‹áŠ• የáŒá‰¥á‹­á‰µ ክáá‹« እንዲከáሉ ይደረጋሉá¢" + }, + "attributions": { + "message": "አይáŠá‰³" + }, + "autoLockTimeLimit": { + "message": "በራስ ሰር ዘáŒá‰¶ መá‹áŒ« ሰዓት ቆጣሪ (ደቂቃ)" + }, + "autoLockTimeLimitDescription": { + "message": "MetaMask በራስ ሰር መንገድ ዘáŒá‰¶ ከመá‹áŒ£á‰± በáŠá‰µ የቦዘአጊዜን በደቂቃዎች ሙላ" + }, + "average": { + "message": "አማካይ" + }, + "back": { + "message": "ተመለስ" + }, + "backToAll": { + "message": "ወደ áˆáˆ‰áˆ ተመለስ" + }, + "backupApprovalNotice": { + "message": "የቋትዎንና የገáŠá‹˜á‰¥á‹ŽáŠ• ደህንáŠá‰µ ለማስጠበቅ ሚስጥራዊ የማስመለሻ ኮድዎን መጠባበቂያ á‹­á‹«á‹™á¢" + }, + "backupApprovalInfo": { + "message": "መሳሪያዎ ቢጠá‹á£ የይለá ቃáˆá‹ŽáŠ• ቢረሱᣠMetaMask እንደገና መጫን ቢያስáˆáˆáŒá‹Ž ወይሠበሌላ መሳሪያ ወደ ቋትዎ ለመድረስ ቢáˆáˆáŒ‰ ይህ ሚስጥራዊ ኮድ ቋትዎን መáˆáˆ¶ ለማáŒáŠ˜á‰µ ያስáˆáˆáŒ‹áˆá¢" + }, + "backupNow": { + "message": "አáˆáŠ• መጠባበቂያ á‹«á‹" + }, + "balance": { + "message": "ቀሪ ሂሳብ" + }, + "balanceOutdated": { + "message": "ቀሪ ሂሳብ ጊዜዠያለáˆá‰ á‰µ ሊሆን ይችላáˆ" + }, + "basic": { + "message": "መሠረታዊ" + }, + "blockExplorerUrl": { + "message": "ኤክስá•ሎረር አáŒá‹µ" + }, + "blockExplorerView": { + "message": "መለያን በ$1እይ", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "Blockies Identicon ተጠቀáˆ" + }, + "browserNotSupported": { + "message": "ማሰሺያዎት አáˆá‰°á‹°áŒˆáˆáˆ..." + }, + "builtInCalifornia": { + "message": "MetaMask ካሊáŽáˆ­áŠ’á‹« á‹áˆµáŒ¥ ተዘጋጅቶ የተገáŠá‰£ áŠá‹á¢" + }, + "buyWithWyre": { + "message": "ETH በ Wyre á‹­áŒá‹™" + }, + "buyWithWyreDescription": { + "message": "Wyre ክሬዲት ካርድ ተጠቅመዠETH በቀጥታ በ MetaMask መለያዎ ላይ እንዲያስቀáˆáŒ¡ ያስችáˆá‹Žá‰³áˆá¢" + }, + "buyCoinSwitch": { + "message": "በ CoinSwitch ላይ á‹­áŒá‹™" + }, + "buyCoinSwitchExplainer": { + "message": "CoinSwitch ከ300 በላይ ክሪá•ቶ ከረንሲዎችን በጥሩ ዋጋ ለመመንዘር ባለ አንድ ማቆሚያ መዳረሻ áŠá‹á¢" + }, + "bytes": { + "message": "ባይት" + }, + "off": { + "message": "አጥá‹" + }, + "ok": { + "message": "እሺ" + }, + "on": { + "message": "በርቷáˆ" + }, + "optionalBlockExplorerUrl": { + "message": "ኤክስá•ሎረር URL አáŒá‹µ (አማራጭ)" + }, + "cancel": { + "message": "ሰርá‹" + }, + "cancelAttempt": { + "message": "ሙከራን ሰርá‹" + }, + "cancellationGasFee": { + "message": "የስረዛ áŠá‹³áŒ… ወጪ" + }, + "cancelled": { + "message": "ተሰርዟáˆ" + }, + "chainId": { + "message": "የሰንሰለት መታወቂያ" + }, + "clickToRevealSeed": { + "message": "ሚስጥራዊ ቃላትን ለመáŒáˆˆáŒ½ እዚህ ጠቅ ያድርጉ" + }, + "close": { + "message": "á‹áŒ‹" + }, + "chromeRequiredForHardwareWallets": { + "message": "ከሃርድዌርዎ ቋት ጋር ለመገናኘት MetaMask በ Google Chrome ላይ መጠቀሠአለብዎትá¢" + }, + "confirm": { + "message": "አረጋáŒáŒ¥" + }, + "confirmed": { + "message": "ተረጋáŒáŒ§áˆ" + }, + "confirmPassword": { + "message": "የይለá ቃሠያረጋáŒáŒ¡" + }, + "confirmSecretBackupPhrase": { + "message": "ሚስጥራዊ የመጠባበቂያ áˆá‹•ራáዎን ያረጋáŒáŒ¡" + }, + "congratulations": { + "message": "እንኳን ደስ አለዎት" + }, + "connectHardwareWallet": { + "message": "ከሃርድዌር ቋት ጋር ይገናኙ" + }, + "connect": { + "message": "ይገናኙ" + }, + "connectingTo": { + "message": "ከ $1ጋር መገናኘት" + }, + "connectingToKovan": { + "message": "ከ Kovan የሙከራ አá‹á‰³áˆ¨ መረብ መገናኘት" + }, + "connectingToMainnet": { + "message": "ከዋናዠየ Ethereum አá‹á‰³áˆ¨ መረብ ጋር መገናኘት" + }, + "connectingToRopsten": { + "message": "ከ Ropsten የሙከራ አá‹á‰³áˆ¨ መረብ ጋር በመገናኘት ላይ" + }, + "connectingToRinkeby": { + "message": "ከ Rinkeby የሙከራ አá‹á‰³áˆ¨ መረብ ጋር በመገናኘት ላይ" + }, + "connectingToLocalhost": { + "message": "ከ Localhost 8545 ጋር መገናኘት" + }, + "connectingToGoerli": { + "message": "ከ Goerli የሙከራ አá‹á‰³áˆ¨ መረብ ጋር መገናኘት" + }, + "continueToWyre": { + "message": "ወደ Wyre ይቀጥሉ" + }, + "continueToCoinSwitch": { + "message": "ወደ CoinSwitch ይቀጥሉ" + }, + "contractDeployment": { + "message": "የኮንትራት ስáˆáˆªá‰µ" + }, + "copiedExclamation": { + "message": "ተቀድቷáˆ" + }, + "copyAddress": { + "message": "አድራሻን ወደ ቅንጥብ ሰሌዳ ቅዳ" + }, + "copyTransactionId": { + "message": "የáŒá‰¥á‹­á‰µ መለያ á‰áŒ¥áˆ­áŠ• ቅዳ" + }, + "copiedTransactionId": { + "message": "የተቀዳ የáŒá‰¥á‹­á‰µ መለያ á‰áŒ¥áˆ­" + }, + "copyToClipboard": { + "message": "ወደ ቅንጥብ ሰሌዳ ገáˆá‰¥áŒ¥" + }, + "copyPrivateKey": { + "message": "የáŒáˆ á‰áˆáዎ ይህ áŠá‹ (ለመቅዳት ጠቅ ያድርጉ)" + }, + "create": { + "message": "áጠር" + }, + "createAccount": { + "message": "መለያ áጠር" + }, + "createAWallet": { + "message": "ቋት áጠር" + }, + "createPassword": { + "message": "የይለá ቃሠáጠር" + }, + "currencyConversion": { + "message": "የገንዘብ áˆá‹ˆáŒ£" + }, + "currentLanguage": { + "message": "ወቅታዊ ቋንቋ" + }, + "customGas": { + "message": "áŠá‹³áŒ…ን አብጅ" + }, + "customGasSubTitle": { + "message": "ክáá‹« መጨመር የመከወኛ ጊዜን ሊቀንስ ቢችáˆáˆ ይህ áŒáŠ• ዋስትና የለá‹áˆá¢" + }, + "customToken": { + "message": "ብጠተለዋጭ ስáˆ" + }, + "customRPC": { + "message": "ብጠRPC" + }, + "decimalsMustZerotoTen": { + "message": "አስርዮሽ ቢያንስ 0 ቢበዛ á‹°áŒáˆž 36 መሆን አለባቸá‹á¢" + }, + "decimal": { + "message": "የትክክለኛáŠá‰µ አስርዮሽ" + }, + "defaultNetwork": { + "message": "የ Ether áŒá‰¥á‹­á‰¶á‰½ ንቡር አá‹á‰³áˆ¨ መረብ Main Net áŠá‹á¢" + }, + "delete": { + "message": "ሰርá‹" + }, + "deleteAccount": { + "message": "መለያን ሰርá‹" + }, + "deposit": { + "message": "ማጠራቀáˆ" + }, + "depositEther": { + "message": "Ether አስቀáˆáŒ¥" + }, + "details": { + "message": "á‹áˆ­á‹áˆ®á‰½" + }, + "directDepositEther": { + "message": "Ether በቀጥታ ያስቀáˆáŒ¡" + }, + "directDepositEtherExplainer": { + "message": "ቀደሠሲሠየተወሰአEther ካለዎትᣠበአዲሱ ቋትዎ Ether ለማáŒáŠ˜á‰µ áˆáŒ£áŠ‘ መንገድ ቀጥተኛ ተቀማጭ áŠá‹á¢" + }, + "done": { + "message": "ተጠናቅቋáˆ" + }, + "downloadGoogleChrome": { + "message": "Google Chrome አá‹áˆ­á‹µ" + }, + "downloadSecretBackup": { + "message": "ይህን ሚስጥራዊ መጠባበቂያ áˆáˆ¨áŒ በማá‹áˆ¨á‹µ በተመሰጠረ á‹áŒ«á‹Š ሃርድ ድራይቭ ወይሠየማከማቻ መሳሪያ ላይ ያስቀáˆáŒ¡á‰µá¢" + }, + "downloadStateLogs": { + "message": "የስቴት መዛáŒá‰¥á‰µáŠ• አá‹áˆ­á‹µ" + }, + "dontHaveAHardwareWallet": { + "message": "የሃርድዌር ቋት የለዎትáˆ?" + }, + "dropped": { + "message": "የተጣለ" + }, + "edit": { + "message": "አርትዕ" + }, + "editContact": { + "message": "á‹•á‹á‰‚ያን አርትዕ" + }, + "endOfFlowMessage1": { + "message": "áˆá‰°áŠ“á‹áŠ• አáˆáˆá‹‹áˆ - የዘር áˆáˆ¨áŒá‹ŽáŠ• ደህንáŠá‰± በተጠበቀ መንገድ ያስቀáˆáŒ¡á£ የእርስዎ ሃላáŠáŠá‰µ áŠá‹! " + }, + "endOfFlowMessage2": { + "message": "ደህንáŠá‰± በተጠበቀ መንገድ የማከማቻ áንጮች" + }, + "endOfFlowMessage3": { + "message": "በብዙ ቦታዎች ላይ መጠባበቂያ ያስቀáˆáŒ¡á¢" + }, + "endOfFlowMessage4": { + "message": "áˆáˆ¨áŒ‰áŠ• በጭራሽ ከሌላ ሰዠጋር አይጋሩá¢" + }, + "endOfFlowMessage5": { + "message": "አጭበርባሪ áŠáŒˆáˆ®á‰½áŠ• ይጠንቀá‰! MetaMask በድንገት የዘር áˆáˆ¨áŒá‹ŽáŠ• በጭራሽ አይጠይቅዎትáˆá¢" + }, + "endOfFlowMessage6": { + "message": "የዘር áˆáˆ¨áŒá‹ŽáŠ• በድጋሚ መጠባበቂያ ለመያዠከáˆáˆˆáŒ‰á£ በቅንብሮች -> áŒáˆ‹á‹ŠáŠá‰µ á‹áˆµáŒ¥ ሊያገኙት ይችላሉá¢" + }, + "endOfFlowMessage7": { + "message": "ጥያቄዎች ካሉዎት ወይሠየሆአአጠራጣሪ áŠáŒˆáˆ­ ካዩᣠእባክዎ ለ support@metamask.io ኢሜይሠይላኩá¢" + }, + "endOfFlowMessage8": { + "message": "MetaMask የዘር áˆáˆ¨áŒá‹ŽáŠ• መáˆáˆ¶ ማáŒáŠ˜á‰µ አáˆá‰»áˆˆáˆá¢ ተጨማሪ መረጃ á‹«áŒáŠ™á¢" + }, + "endOfFlowMessage9": { + "message": "ተጨማሪ ይማሩ" + }, + "endOfFlowMessage10": { + "message": "áˆáˆ‰áˆ ተጠናቅቋáˆ" + }, + "ensRegistrationError": { + "message": "በ ENS የስሠáˆá‹áŒˆá‰£ ላይ የተáˆáŒ áˆ¨ ስህተት" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "የ ENS ስሠበአáˆáŠ‘ ኔትወርክ ላይ አáˆá‰°áŒˆáŠ˜áˆá¢ ወደ ዋናዠየ Ethereum አá‹á‰³áˆ¨ መረብ ለመቀየር ይሞክሩá¢" + }, + "enterAnAlias": { + "message": "ተለዋጭ ስሠያስገቡ" + }, + "enterPassword": { + "message": "የይለá ቃሠያስገቡ" + }, + "enterPasswordContinue": { + "message": "ለመቀጠሠየይለá ቃሠያስገቡ" + }, + "ethereumPublicAddress": { + "message": "Ethereum ሕá‹á‰£á‹Š አድራሻ" + }, + "etherscanView": { + "message": "መለያá‹áŠ• በ Etherscan ላይ ይመáˆáŠ¨á‰±" + }, + "estimatedProcessingTimes": { + "message": "የሚገመት የክወና ጊዜያት" + }, + "expandView": { + "message": "እይታን ዘርጋ" + }, + "exportPrivateKey": { + "message": "የáŒáˆ á‰áˆáን ላክ" + }, + "failed": { + "message": "አáˆá‰°áˆ³áŠ«áˆ" + }, + "fast": { + "message": "áˆáŒ£áŠ•" + }, + "faster": { + "message": "በáጥáŠá‰µ" + }, + "fiat": { + "message": "áŠá‹«á‰µ", + "description": "Exchange type" + }, + "fileImportFail": { + "message": "á‹á‹­áˆ ማስመጣት እየሰራ አይደለáˆ? እዚህ ላይ ጠቅ ያድርጉ!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "ይህን መሣሪያ እርሳ" + }, + "from": { + "message": "ከ" + }, + "functionType": { + "message": "የተáŒá‰£áˆ­ á‹“á‹­áŠá‰µ" + }, + "gasLimit": { + "message": "የáŠá‹³áŒ… ገደብ" + }, + "gasLimitInfoModalContent": { + "message": "የáŠá‹³áŒ… ገደብ እርስዎ ወጪ ለማድረጠá‹áŒáŒ የሆኑት ከáተኛዠየáŠá‹³áŒ… መጠን ማለት áŠá‹á¢" + }, + "gasLimitTooLow": { + "message": "የáŠá‹³áŒ… ገደብ ቢያንስ 21000 መሆን አለበት" + }, + "gasUsed": { + "message": "ጥቅሠላይ የዋለ áŠá‹³áŒ…" + }, + "gasPrice": { + "message": "የáŠá‹³áŒ… ዋጋ (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "የáŠá‹³áŒ… ዋጋ እጅጠበጣሠá‹á‰… ያለ áŠá‹" + }, + "gasPriceInfoModalContent": { + "message": "የáŠá‹³áŒ… ዋጋ እርስዎ ለእያንዳንዱ የáŠá‹³áŒ… መጠን መክáˆáˆ የሚáˆáˆáŒ‰á‰µáŠ• የ Ether መጠን ይገáˆáŒ»áˆá¢" + }, + "gasPriceNoDenom": { + "message": "የáŠá‹³áŒ… ዋጋ" + }, + "general": { + "message": "አጠቃላይ" + }, + "generalSettingsDescription": { + "message": "የገንዘብ áˆá‹ˆáŒ£á£ ተቀዳሚ የገንዘብ á‹“á‹­áŠá‰µá£ ቋንቋᣠblockies identicon" + }, + "getEther": { + "message": "Ether á‹«áŒáŠ™" + }, + "getEtherFromFaucet": { + "message": "Ether ከቧንቧ በ$1á‹«áŒáŠ™", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "እገዛ á‹«áŒáŠ™á¢" + }, + "getStarted": { + "message": "አስጀማሪ መመሪያ" + }, + "happyToSeeYou": { + "message": "እርስዎን በማየታችን ደስተኛ áŠáŠ•á¢" + }, + "hardware": { + "message": "ሃርድዌር" + }, + "hardwareWalletConnected": { + "message": "የሃርድዌር ቋት ተገናáŠá‰·áˆ" + }, + "hardwareWallets": { + "message": "ከሃርድዌር ቋት ጋር ይገናኙ" + }, + "hardwareWalletsMsg": { + "message": "ከ MetaMask ጋር ሊጠቀሙበት የሚáˆáˆáŒ‰á‰µáŠ• የሃርድዌር ቋት á‹­áˆáˆ¨áŒ¡" + }, + "havingTroubleConnecting": { + "message": "áŒáŠ•áŠ™áŠá‰µ መáጠር ላይ ተቸáŒáˆ¨á‹‹áˆ?" + }, + "here": { + "message": "እዚህ", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hexData": { + "message": "Hex á‹áˆ‚ብ" + }, + "hide": { + "message": "ደብቅ" + }, + "hideTokenPrompt": { + "message": "ተለዋጭ ስሠይደበቅ?" + }, + "history": { + "message": "ታሪክ" + }, + "import": { + "message": "ከá‹áŒ­ አስመጣ", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "መለያ አስመጣ" + }, + "importAccountMsg": { + "message": "የመጡ መለያዎች በመጀመሪያ ከተáˆáŒ áˆ¨á‹ የእርስዎ MetaMask መለያ የዘር áˆáˆ¨áŒ ጋር አይዛመዱáˆá¢ ስለሚመጡ መለያዎቸ ተጨማሪ መረጃ á‹«áŒáŠ™" + }, + "importAccountSeedPhrase": { + "message": "መለያን በዘር áˆáˆ¨áŒ አስመጣ" + }, + "importWallet": { + "message": "ቋት አስመጣ" + }, + "importYourExisting": { + "message": "ባለ 12 ቃሠየዘር áˆáˆ¨áŒáŠ• በመጠቀሠáŠá‰£áˆ­ ቋትዎን ያስመጡ" + }, + "imported": { + "message": "ከá‹áŒ­ የመጣ", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "የመለያ የዘር áˆáˆ¨áŒ በመጠቀሠያስመጡ" + }, + "infoHelp": { + "message": "መረጃ እና እገዛ " + }, + "initialTransactionConfirmed": { + "message": "የመጀመሪያ áŒá‰¥á‹­á‰µá‹Ž በአá‹á‰³áˆ¨ መረቡ ተረጋáŒáŒ§áˆá¢ ወደ ኋላ ለመመለስ እሺ የሚለá‹áŠ• ጠቅ ያድርጉá¢" + }, + "insufficientBalance": { + "message": "በቂ á‹«áˆáˆ†áŠ á‰€áˆª ሂሳብ" + }, + "insufficientFunds": { + "message": "በቂ á‹«áˆáˆ†áŠ á‰°á‰€áˆ›áŒ­" + }, + "insufficientTokens": { + "message": "በቂ á‹«áˆáˆ†áŠ‘ ተለዋጭ ስሞችá¢" + }, + "invalidAddress": { + "message": "áˆáŠ­ á‹«áˆáˆ†áŠ áŠ á‹µáˆ«áˆ»" + }, + "invalidAddressRecipient": { + "message": "የተቀባይ አድራሻ ትክክሠአይደለáˆ" + }, + "knownAddressRecipient": { + "message": "የሚታወቅ የáŒáŠ•áŠ™áŠá‰µ አድራሻá¢" + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "ETH አá‹á‰³áˆ¨ መረብ አይደለáˆá£ ወደ ትናንሽ áŠá‹°áˆ‹á‰µ ቀይር" + }, + "invalidInput": { + "message": "áˆáŠ­ á‹«áˆáˆ†áŠ áŒá‰¤á‰µá¢" + }, + "invalidRPC": { + "message": "áˆáŠ­ á‹«áˆáˆ†áŠ RPC ዩአርኤáˆ" + }, + "invalidBlockExplorerURL": { + "message": "áˆáŠ­ á‹«áˆáˆ†áŠ Block Explorer ዩአርኤáˆ" + }, + "invalidSeedPhrase": { + "message": "የተሳሳተ የዘር áˆáˆ¨áŒ" + }, + "jsonFile": { + "message": "JSON á‹á‹­áˆ", + "description": "format for importing an account" + }, + "kovan": { + "message": "Kovan የሙከራ አá‹á‰³áˆ¨ መረብ" + }, + "max": { + "message": "ከáተኛ" + }, + "learnMore": { + "message": "የበለጠ ይወá‰" + }, + "ledgerAccountRestriction": { + "message": "አዲስ መለያ ከማከáˆá‹Ž በáŠá‰µ የመጨረሻá‹áŠ• መለያዎን መጠቀሠአለብዎትá¢" + }, + "letsGoSetUp": { + "message": "አዎᣠእናደራጅ!" + }, + "likeToAddTokens": { + "message": "እáŠá‹šáˆ…ን ተለዋጭ ስሞች ለማከሠይáˆáˆáŒ‹áˆ‰?" + }, + "links": { + "message": "ማስáˆáŠ•áŒ áˆªá‹«á‹Žá‰½" + }, + "liveGasPricePredictions": { + "message": "ቀጥታ የáŠá‹³áŒ… ዋጋ ትንበያዎች" + }, + "loading": { + "message": "በመጫን ላይ…" + }, + "loadingTokens": { + "message": "ተለዋጭ ስሞችን በመጫን ላይ..." + }, + "loadMore": { + "message": "ተጨማሪ ጫን" + }, + "lock": { + "message": "ዘáŒá‰°áˆ… á‹áŒ£" + }, + "mainnet": { + "message": "á‹‹áŠáŠ› የ Ethereum አá‹á‰³áˆ¨ መረብ " + }, + "memorizePhrase": { + "message": "ይህን áˆáˆ¨áŒ ያስታá‹áˆ±á¢" + }, + "memo": { + "message": "አጭር ማስታወሻ" + }, + "message": { + "message": "መáˆá‹•ክት" + }, + "metamaskDescription": { + "message": "ከ Ethereum እና á‹«áˆá‰°áˆ›áŠ¨áˆˆ መረብ ጋር እርስዎን ማገናኘትá¢" + }, + "metamaskVersion": { + "message": "የ MetaMask ስሪት" + }, + "mobileSyncText": { + "message": "እርስዎ መሆንዎትን ለማረጋገጥ እባከዎ የይለá ቃáˆá‹ŽáŠ• ያስገቡ!" + }, + "myAccounts": { + "message": "የእኔ መለያዎች" + }, + "myWalletAccounts": { + "message": "የቋት መለያዎቼ" + }, + "myWalletAccountsDescription": { + "message": "በ MetaMask የተáˆáŒ áˆ© መለያዎችዎ በሙሉ በራስ ሰር መንገድ ወደዚህ ክáሠይታከላሉá¢" + }, + "mustSelectOne": { + "message": "ቢያንስ 1 ተለዋጭ ስሠመáˆáˆ¨áŒ¥ አለብዎá¢" + }, + "needEtherInWallet": { + "message": "MetaMask በመጠቀሠያáˆá‰°áˆ›áŠ¨áˆ‰ መተáŒá‰ áˆªá‹«á‹Žá‰½ ጋር áŒáŠ•áŠ™áŠá‰µ ለማድረáŒá£ በቋትዎ á‹áˆµáŒ¥ Ether ያስáˆáˆáŒá‹Žá‰³áˆá¢" + }, + "needImportFile": { + "message": "የሚያስመጡትን á‹á‹­áˆ መáˆáˆ¨áŒ¥ አለብዎትá¢", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "አሉታዊ የ ETH መጠኖችን መላክ አይቻáˆáˆá¢" + }, + "networkName": { + "message": "የአá‹á‰³áˆ¨ መረብ ስáˆ" + }, + "networks": { + "message": "አá‹á‰³áˆ¨ መረቦች" + }, + "networkSettingsDescription": { + "message": "ብጠየ RPC አá‹á‰³áˆ¨ መረቦችን አክáˆáŠ“ አርትዕ" + }, + "nevermind": { + "message": "áˆáŠ•áˆ áŠ á‹­á‹°áˆ" + }, + "newAccount": { + "message": "አዲስ መለያ" + }, + "newAccountDetectedDialogMessage": { + "message": "አዲስ አድራሻ ተገáŠá‰·áˆ! ወደ አድራሻ ደብተርዎ ለማከለ እዚህ ላይ ጠቅ ያድርጉá¢" + }, + "newAccountNumberName": { + "message": "መለያ$1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "አዲስ á‹•á‹á‰‚á‹«" + }, + "newContract": { + "message": "አዲስ ኮንትራት" + }, + "newPassword": { + "message": "አዲስ የይለá ቃሠ(ቢያንስ 8 á‰áˆáŠá‹Žá‰½)" + }, + "newNetwork": { + "message": "አዲስ አá‹á‰³áˆ¨ መረብ" + }, + "newToMetaMask": { + "message": "ለ MetaMask አዲስ áŠá‹Žá‰µ?" + }, + "noAlreadyHaveSeed": { + "message": "የለáˆá£ ቀደሠሲሠጀáˆáˆ® የዘር áˆáˆ¨áŒ አለáŠ" + }, + "protectYourKeys": { + "message": "á‰áˆáŽá‰½á‹ŽáŠ• ይጠብá‰!" + }, + "protectYourKeysMessage1": { + "message": "ስለ ዘር áˆáˆ¨áŒá‹Ž ይጠንቀበ- ራሳቸá‹áŠ• ከ MetaMask ጋር ለማመሳሰሠየሚሞከሩ ድረ ገጾች እናሉ ሰáˆá‰°áŠ“áˆá¢ MetaMask በጭራሽ የዘር áˆáˆ¨áŒá‹ŽáŠ• አይጠይቅዎትáˆ!" + }, + "protectYourKeysMessage2": { + "message": "የáˆáˆ¨áŒá‹ŽáŠ• ደህንáŠá‰µ ይጠብá‰á¢ ይሠየሆአአጠራጣሪ áŠáŒˆáˆ­ ካዩ ወይሠስለ አንድ ድረ ገጽ እርáŒáŒ áŠ› ካáˆáˆ†áŠ‘á£ áŠ¥á‰£áŠ­á‹Ž ለ support@metamask.io ኢሜይሠይላኩ" + }, + "rpcUrl": { + "message": "አዲስ የ RPC URL" + }, + "optionalChainId": { + "message": "የሰንሰለት መለያ á‰áŒ¥áˆ­ (አማራጭ)" + }, + "optionalSymbol": { + "message": "áˆáˆáŠ­á‰µ (አማራጭ)" + }, + "newTotal": { + "message": "አዲስ ድáˆáˆ­" + }, + "newTransactionFee": { + "message": "አዲስ የáŒá‰¥á‹­á‰µ ክáá‹«" + }, + "next": { + "message": "ቀጣይ" + }, + "noAddressForName": { + "message": "በዚህ ስሠየተሞላ አድራሻ የለáˆá¢" + }, + "noConversionRateAvailable": { + "message": "áˆáŠ•áˆ á‹¨áˆá‹ˆáŒ£ ተመን አይገáŠáˆ" + }, + "noTransactions": { + "message": "áŒá‰¥á‹­á‰¶á‰½ የሉዎትáˆ" + }, + "notEnoughGas": { + "message": "በቂ áŠá‹³áŒ… የለáˆ" + }, + "noWebcamFoundTitle": { + "message": "Webcam አáˆá‰°áŒˆáŠ˜áˆ" + }, + "noWebcamFound": { + "message": "የኮáˆá’ዩተርዎ ካሜራ አáˆá‰°áŒˆáŠ˜áˆá¢ እባክዎ እንደገና ይሞክሩá¢" + }, + "ofTextNofM": { + "message": "ከ" + }, + "orderOneHere": { + "message": "ትሬዞር ወይሠሌጀር በማዘዠገንዘብዎን በቀá‹á‰ƒá‹› ማስቀመጫ á‹áˆµáŒ¥ ያቆዩ" + }, + "origin": { + "message": "መáŠáˆ»" + }, + "parameters": { + "message": "መለኪያዎች" + }, + "participateInMetaMetrics": { + "message": "በ MetaMetrics á‹áˆµáŒ¥ ይሳተá‰" + }, + "participateInMetaMetricsDescription": { + "message": "MetaMetrics የተሻለ እንድናደርገዠበ MetaMetrics á‹áˆµáŒ¥ በመሳተá á‹«áŒá‹™áŠ•" + }, + "password": { + "message": "የይለá ቃáˆá¦" + }, + "passwordsDontMatch": { + "message": "የይለá ቃላት ተመሳሳይ አይደሉáˆ" + }, + "passwordNotLongEnough": { + "message": "የይለá ቃሉ ርá‹áˆ˜á‰µ በቂ አይደለáˆ" + }, + "pastePrivateKey": { + "message": "የáŒáˆ á‰áˆáዎን ሕብረ á‰áˆáŠ áŠ¥á‹šáˆ… ለጥáá¡", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "በእንጥáˆáŒ¥áˆ ላይ ያለ" + }, + "personalAddressDetected": { + "message": "የáŒáˆ አድራሻ ተገáŠá‰·áˆá¢ የተለዋጭ ስሠየመገኛ አድራሻን ያስገቡá¢" + }, + "prev": { + "message": "የቀደመ" + }, + "primaryCurrencySetting": { + "message": "ተቀዳሚ የገንዘብ á‹“á‹­áŠá‰µ" + }, + "primaryCurrencySettingDescription": { + "message": "ዋጋዎች በራሳቸዠየሰንሰለት ገንዘብ á‹“á‹­áŠá‰µ (ለáˆáˆ³áˆŒ ETH) በቅድሚያ እንዲታዪ á‹­áˆáˆ¨áŒ¡á¢ ዋጋዎች በተመረጠ የáŠá‹«á‰µ ገንዘብ á‹“á‹­áŠá‰µ እንዲታዩ á‹°áŒáˆž áŠá‹«á‰µáŠ• á‹­áˆáˆ¨áŒ¡á¢" + }, + "privacyMsg": { + "message": "የáŒáˆˆáŠáŠá‰µ መጠበቂያ ህáŒ" + }, + "privateKey": { + "message": "የáŒáˆ á‰áˆá", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "ማስጠንቀቂያᡠይህን á‰áˆá በጭራሽ ለሌላ ሰዠአይáŒáˆˆáŒ¹á¢ የáŒáˆ á‰áˆáዎን የያዘ ማንኛá‹áˆ ሰዠበመለያዎ á‹áˆµáŒ¥ የሚገኙ ማናቸá‹áŠ•áˆ áˆá‰¥á‰¶á‰½ ሊሰርቅ ይችላáˆá¢" + }, + "privateNetwork": { + "message": "የáŒáˆ አá‹á‰³áˆ¨ መረብ" + }, + "queue": { + "message": "ወረá‹" + }, + "readdToken": { + "message": "በመለያ አማራጮችዎ áˆáŠ“áˆŒ á‹áˆµáŒ¥ ወደ “ተለዋጭ ስሠአክáˆâ€ በመáŒá‰£á‰µ ለወደáŠá‰± ይህን ተለዋጭ ስሠመáˆáˆ°á‹ ማከሠይችላሉá¢" + }, + "recents": { + "message": "የቅርብ ጊዜያት" + }, + "recipientAddress": { + "message": "የተቀባይ አድራሻ" + }, + "recipientAddressPlaceholder": { + "message": "áለጋᣠለሕá‹á‰¥ ክáት የሆአአድራሻ (0x), ወይሠENS" + }, + "rejectAll": { + "message": "áˆáˆ‰áŠ•áˆ áŠ á‰µá‰€á‰ áˆ" + }, + "rejectTxsN": { + "message": "$1áŒá‰¥á‹­á‰¶á‰½áŠ• አትቀበáˆ" + }, + "rejectTxsDescription": { + "message": "$1áŒá‰¥á‹­á‰¶á‰½áŠ• በጅáˆáˆ‹ á‹á‹µá‰… ሊያደርጉ áŠá‹á¢" + }, + "rejected": { + "message": "á‹á‹µá‰… የተደረገ" + }, + "reset": { + "message": "ዳáŒáˆ አስጀáˆáˆ­" + }, + "resetAccount": { + "message": "መለያን እንደገና ይሙሉ" + }, + "resetAccountDescription": { + "message": "መለያዎን እንደገና መሙላት የáŒá‰¥á‹­á‰µ ታሪዎን ያጠራáˆá¢" + }, + "deleteNetwork": { + "message": "አá‹á‰³áˆ¨ መረብ ይሰረá‹?" + }, + "deleteNetworkDescription": { + "message": "ይህን አá‹á‰³áˆ¨ መረብ ለመሰረዠእንደሚáˆáˆáŒ‰ እርáŒáŒ áŠ› áŠá‹Žá‰µ?" + }, + "remindMeLater": { + "message": "ኋላ ላይ አስታá‹áˆ°áŠ" + }, + "restoreFromSeed": { + "message": "መለያዠወደáŠá‰ áˆ¨á‰ á‰µ ይመለስ?" + }, + "restoreAccountWithSeed": { + "message": "መለያዎን በዘር áˆáˆ¨áŒ ወደáŠá‰ áˆ¨á‰ á‰µ ይመáˆáˆ±" + }, + "requestsAwaitingAcknowledgement": { + "message": "ማረጋገጫ የሚጠባበበጥያቄዎች" + }, + "required": { + "message": "የሚያስáˆáˆáŒ" + }, + "restore": { + "message": "እáŠá‰ áˆ¨á‰ á‰µ መáˆáˆµ" + }, + "revealSeedWords": { + "message": "የዘር ቃላትን á‹­áŒáˆˆáŒ¹" + }, + "revealSeedWordsTitle": { + "message": "የዘር áˆáˆ¨áŒ" + }, + "revealSeedWordsDescription": { + "message": "ማሰሺያዎችን ከቀየሩ ወይሠኮáˆá’ዩተሮቸን ከአንድ ቦታ ወደ ሌላ ቦታ ካንቀሳቀሱᣠወደ መለያዎችዎ ለመድረስ ይህ የዘር áˆáˆ¨áŒ ያስáˆáˆáŒá‹Žá‰³áˆá¢ ደህንáŠá‰±áŠ“ ሚስጥራዊáŠá‰± በተጠበቀ ቦታ ያስቀáˆáŒ§á‰¸á‹á¢" + }, + "revealSeedWordsWarningTitle": { + "message": "ይህን áˆáˆ¨áŒ ለየትኛá‹áˆ ሰዠአያጋሩ!" + }, + "revealSeedWordsWarning": { + "message": "እáŠá‹šáˆ… ቃላት áˆáˆ‰áŠ•áˆ áˆ˜áˆˆá‹«á‹Žá‰½á‹ŽáŠ• ለመስረቅ ሊá‹áˆ‰ ይችላሉá¢" + }, + "remove": { + "message": "አስወáŒá‹µ" + }, + "removeAccount": { + "message": "መለያ ያስወáŒá‹±" + }, + "removeAccountDescription": { + "message": "ይህ መለያ ከቋትዎ ይወገዳáˆá¢ እባክዎ ከመቀጠáˆá‹Ž በáŠá‰µ የዚህ የመጣ መለያ የመጀመሪያዠየዘር áˆáˆ¨áŒ ወይሠየáŒáˆ á‰áˆá እንዳለዎት ያረጋáŒáŒ¡á¢ መለያዎችን ከመለያ ተቆáˆá‰‹á‹­ ማስመጣት ወይሠመáጠር ይችላሉá¢" + }, + "readyToConnect": { + "message": "ለመገናኘት á‹áŒáŒ áŠá‹Žá‰µ?" + }, + "rinkeby": { + "message": "Rinkeby የሙከራ አá‹á‰³áˆ¨ መረብ" + }, + "ropsten": { + "message": "Ropsten የሙከራ አá‹á‰³áˆ¨ መረብ " + }, + "goerli": { + "message": "የ Goerli የሙከራ አá‹á‰³áˆ¨ መረብ" + }, + "save": { + "message": "አስቀáˆáŒ¥" + }, + "slow": { + "message": "ቀስ" + }, + "slower": { + "message": "ዘገáˆá‰°áŠ›" + }, + "saveAsCsvFile": { + "message": "እንደ CSV á‹á‹­áˆ አስቀáˆáŒ¥" + }, + "scanInstructions": { + "message": "የ QR ኮዱን ከካሜራዎ áŠá‰µ ለáŠá‰µ ያስቀáˆáŒ¡" + }, + "scanQrCode": { + "message": "የ QR ኮድ ስካን ያድርጉ" + }, + "search": { + "message": "áለጋ" + }, + "searchResults": { + "message": "á‹áŒ¤á‰¶á‰½áŠ• áˆáˆáŒ" + }, + "secretBackupPhrase": { + "message": "ሚስጥራዊ የመጠባበቂያ áˆá‹•ራá" + }, + "secretBackupPhraseDescription": { + "message": "ሚስጥራዊ የመጠባበቂያ áˆáˆ¨áŒá‹Ž መለያዎን መጠባበቂያ ለመያá‹áŠ“ ወደáŠá‰ áˆ¨á‰ á‰µ ለመመለስ ቀላሠያደርገዋáˆá¢" + }, + "secretBackupPhraseWarning": { + "message": "ማስጠንቀቂያᡠየመጠባበቂያ áˆá‹•ራáዎን በጭራሽ አይáŒáˆˆáŒ¹á¢ ይህን áˆáˆ¨áŒˆ የያዘ ማንኛá‹áˆ ሰዠየእርስዎን Ether እስከወዲያኛዠሊወስደዠይችላáˆá¢" + }, + "secretPhrase": { + "message": "ካá‹áŠ“á‹ŽáŠ• ወደáŠá‰ áˆ¨á‰ á‰µ ለመመለስ ሚስጥራዊ ባለ አስራ áˆáˆˆá‰µ ቃሠáˆáˆ¨áŒá‹ŽáŠ• ያስገቡá¢" + }, + "securityAndPrivacy": { + "message": "ደህንáŠá‰µ እና áŒáˆ‹á‹ŠáŠá‰µ" + }, + "securitySettingsDescription": { + "message": "የáŒáˆ‹á‹ŠáŠá‰µ ቅንብሮች እና የቋት ዘር áˆáˆ¨áŒ" + }, + "seedPhrasePlaceholder": { + "message": "እያንዳንዱን ቃሠበáŠáŒ áˆ‹ ክáት ቦታ ይለያዩ" + }, + "seedPhraseReq": { + "message": "የዘር áˆáˆ¨áŒ‹á‰µ የ 12 ቃላት ርá‹áˆ˜á‰µ አላቸá‹" + }, + "selectCurrency": { + "message": "የገንዘብ á‹“á‹­áŠá‰µ á‹­áˆáˆ¨áŒ¡" + }, + "selectEachPhrase": { + "message": "እባክዎ እያንዳንዱን áˆáˆ¨áŒ በመáˆáˆ¨áŒ¥ ትክክለኛáŠá‰±áŠ• ያረጋáŒáŒ¡á¢" + }, + "selectLocale": { + "message": "አካባቢ á‹­áˆáˆ¨áŒ¡" + }, + "selectType": { + "message": "á‹“á‹­áŠá‰µ á‹­áˆáˆ¨áŒ¡" + }, + "send": { + "message": "ላክ" + }, + "sendAmount": { + "message": "መጠኑን ላክ" + }, + "sendETH": { + "message": "ETH ላክ" + }, + "sendTokens": { + "message": "ተለዋጭ ስሞችን ላክ" + }, + "sentEther": { + "message": "የተላከ ether" + }, + "sentTokens": { + "message": "የተላኩ ተለዋጭ ስሞች" + }, + "separateEachWord": { + "message": "እያንዳንዱን ቃሠበáŠáŒ áˆ‹ ክáት ቦታ ይለያዩ" + }, + "searchTokens": { + "message": "ተለዋጭ ስሞችን áˆáˆáŒ" + }, + "selectAnAccount": { + "message": "መለያ á‹­áˆáˆ¨áŒ¡" + }, + "selectAnAccountHelp": { + "message": "መለያá‹áŠ• በ MetaMask ለማየት á‹­áˆáˆ¨áŒ¡" + }, + "selectAHigherGasFee": { + "message": "የáŒá‰¥á‹­á‰µá‹ŽáŠ• ክዋኔ ለማቀላጠá የበለጠ የáŠá‹³áŒ… ዋጋ á‹­áˆáˆ¨áŒ¡á¢*" + }, + "selectHdPath": { + "message": "የ HD ዱካ á‹­áˆáˆ¨áŒ¡" + }, + "selectPathHelp": { + "message": "áŠá‰£áˆ­ የሌጄር መለያዎችን ከታች ካላዩᣠዱካዎችን ወደ \"Legacy (MEW / MyCrypto)\" ለመቀየር ይሞክሩ" + }, + "settings": { + "message": "ቅንብሮች" + }, + "showAdvancedGasInline": { + "message": "የላበየáŠá‹³áŒ… á‰áŒ¥áŒ¥áˆ®á‰½" + }, + "showAdvancedGasInlineDescription": { + "message": "በላክ እና አረጋáŒáŒ¥ ማያዎች ላይ የáŠá‹³áŒ… ዋጋን ለማሳየትና á‰áŒ¥áŒ¥áˆ®á‰½áŠ• ለመገደብ ይህን á‹­áˆáˆ¨áŒ¡á¢" + }, + "showFiatConversionInTestnets": { + "message": "áˆá‹ˆáŒ£áŠ• በ Testnets ላይ አሳይ" + }, + "showFiatConversionInTestnetsDescription": { + "message": "በ Testnets ላይ ወጥ የሆአáˆá‹ˆáŒ£áŠ• ለማሳየት ይህን á‹­áˆáˆ¨áŒ¡" + }, + "showPrivateKeys": { + "message": "የáŒáˆ á‰áˆáŽá‰½áŠ• አሳይ" + }, + "showHexData": { + "message": "Hex á‹áˆ‚ብ አሳይ" + }, + "showHexDataDescription": { + "message": "በመላኪያ ማያ ላይ የ hex á‹áˆ‚ብ መስክን ለማሳየት ይህን á‹­áˆáˆ¨áŒ¡" + }, + "sign": { + "message": "áˆáˆ­áˆ" + }, + "signatureRequest": { + "message": "የáŠáˆ­áˆ› ጥያቄ" + }, + "signed": { + "message": "ተáˆáˆ­áˆŸáˆ" + }, + "signNotice": { + "message": "ይህን መáˆá‹•ክት መáˆáˆ¨áˆ አደገኛ á‹áŒ¤á‰¶á‰½ \nሊኖሩት ይችላሉᢠበሙሉ መለያዎ ሙሉ በሙሉ ከሚያáˆáŠ—á‰¸á‹\nድረ ገጾች የሚመጡ መáˆá‹•ክቶችን ብቻ á‹­áˆáˆ­áˆ™á¢\nይህ አደገኛ ዘዴ ከወደáŠá‰µ ስሪት ይወገዳáˆá¢" + }, + "sigRequest": { + "message": "የáŠáˆ­áˆ› ጥያቄ" + }, + "somethingWentWrong": { + "message": "ኤጭ! የሆአችáŒáˆ­ ተáˆáŒ¥áˆ¯áˆá¢" + }, + "speedUp": { + "message": "አá‹áŒ¥áŠ•" + }, + "speedUpCancellation": { + "message": "ይህን ስረዛ á‹«á‹áŒ¥áŠ‘" + }, + "speedUpTransaction": { + "message": "ይህን áŒá‰¥á‹­á‰µ አá‹áŒ¥áŠ•" + }, + "switchNetworks": { + "message": "አá‹á‰³áˆ¨ መረቦችን ቀያይር" + }, + "stateLogs": { + "message": "የስቴት መዛáŒá‰¥á‰µ" + }, + "stateLogsDescription": { + "message": "ስቴት መዛáŒá‰¥á‰µ á‹­á‹á‹Š የመለያ አድራሻዎትንና የተላኩ áŒá‰¥á‹­á‰¶á‰½áŠ• ይይዛሉá¢" + }, + "stateLogError": { + "message": "የስቴት መዛáŒá‰¥á‰µáŠ• መáˆáˆ¶ በማáŒáŠ˜á‰µ ሒደት የተáˆáŒ áˆ¨ ስህተትá¢" + }, + "step1HardwareWallet": { + "message": "1. ከሃርድዌር ቋት ጋር ይገናኙ" + }, + "step1HardwareWalletMsg": { + "message": "የሃርድዌር ቋትዎን በቀጥታ ከኮáˆá’ዩተርዎ ጋር ያገናኙá¢" + }, + "step2HardwareWallet": { + "message": "2. መለያ áˆáˆ¨áŒ¥" + }, + "step2HardwareWalletMsg": { + "message": "ለማየት የሚáˆáˆáŒ‰á‰µáŠ• መለያ á‹­áˆáˆ¨áŒ¡á¢ በአንድ ጊዜ መáˆáˆ¨áŒ¥ የሚችሉት አንድ ብቻ áŠá‹á¢" + }, + "step3HardwareWallet": { + "message": "3. dApps እና ሌሎችን መጠቀሠይጀáˆáˆ©!" + }, + "step3HardwareWalletMsg": { + "message": "የáˆáˆ­á‹µá‹Œáˆ­ መለያዎን ከየትኛá‹áˆ የ Ethereum መለያ ጋር በሚጠቀሙት መንገድ ይጠቀሙᢠወደ dApps በመለያ á‹­áŒá‰¡á£ Eth ይላኩᣠየ ERC20 ተለዋጭ ስሞችና እንደ CryptoKitties ያሉ የማይለወጡ ተለዋጭ ስሞችን á‹­áŒá‹™áŠ“ ያከማቹá¢" + }, + "storePhrase": { + "message": "ይህን áˆáˆ¨áŒ እንደ 1Password ባለ የይለá ቃሠአስተዳዳሪ á‹áˆµáŒ¥ ያስቀáˆáŒ¡á¢" + }, + "submitted": { + "message": "የቀረበ" + }, + "supportCenter": { + "message": "የድጋá መስጫ ማዕከላችንን ይጎብኙ" + }, + "symbol": { + "message": "áˆáˆáŠ­á‰µ" + }, + "symbolBetweenZeroTwelve": { + "message": "áˆáˆáŠ­á‰± 11 á‰áˆáŠá‹Žá‰½ ወይሠከዚያ á‹«áŠáˆ° መሆን አለበትá¢" + }, + "syncWithMobile": { + "message": "ከሞባይሠጋር አሳáˆáˆ­" + }, + "syncWithMobileTitle": { + "message": "ከሞባይሠጋር አሳáˆáˆ­" + }, + "syncWithMobileDesc": { + "message": "መለያዎችዎንና መረጃዎችዎን ከሞባይሠመሳሪያዎ ጋር ያሳáˆáˆ©á¢ የ MetaMask የሞባይሠመተáŒá‰ áˆªá‹«áŠ• ይክáˆá‰±á£ ወደ \"ቅንብሮች\" ይሂዱና \"ከማሰሺያ ቅጥያ አሳáˆáˆ­\" የሚለá‹áŠ• ይንኩ" + }, + "syncWithMobileDescNewUsers": { + "message": "የ MetaMask የሞባይሠመተáŒá‰ áˆªá‹«áŠ• ለመጀመሪያ ጊዜ ገና እየከáˆá‰± ከሆáŠá£ በስáˆáŠ­á‹Ž ላይ ያሉትን ቅደሠተከተሎች ብቻ ይከተሉá¢" + }, + "syncWithMobileScanThisCode": { + "message": "ይህን ኮድ በ MetaMask የሞባይሠመተáŒá‰ áˆªá‹«á‹Ž ስካን ያድርጉ" + }, + "syncWithMobileBeCareful": { + "message": "ይህን ኮድ ስካን ሲያደርጉ ሌላ ሰዠየእርስዎን ማያ እየተመለከተ አለመሆኑን ያረጋáŒáŒ¡" + }, + "syncWithMobileComplete": { + "message": "á‹áˆ‚ብዎ በሚገባ ተሳáˆáˆ¯áˆá¢ በ MetaMask የሞባይሠመተáŒá‰ áˆªá‹« ይደሰቱ!" + }, + "terms": { + "message": "የአጠቃቀሠደንቦች" + }, + "testFaucet": { + "message": "የሙከራ ቧንቧ" + }, + "thisWillCreate": { + "message": "ይህ አዲስ ቋትና የዘረ áˆáˆ¨áŒ á‹­áˆáŒ¥áˆ«áˆ" + }, + "tips": { + "message": "መረጃዎች" + }, + "to": { + "message": "ለ" + }, + "token": { + "message": "ተለዋጭ ስáˆ" + }, + "tokenAlreadyAdded": { + "message": "ተለዋጭ ስሠቀደሠሲሠታክáˆáˆá¢" + }, + "tokenContractAddress": { + "message": "የተለዋጭ ስሠየáŒáŠ•áŠ™áŠá‰µ አድራሻ" + }, + "tokenSymbol": { + "message": "የተለዋጭ ስሠáˆáˆáŠ­á‰µ" + }, + "total": { + "message": "ድáˆáˆ­" + }, + "transaction": { + "message": "áŒá‰¥á‹­á‰µ" + }, + "transactionConfirmed": { + "message": "áŒá‰¥á‹­á‰µ በ$2ተረጋáŒáŒ§áˆá¢" + }, + "transactionCreated": { + "message": "áŒá‰¥á‹­á‰± በ$1ዋጋ በ$2የተáˆáŒ áˆ¨ áŠá‹á¢" + }, + "transactionDropped": { + "message": "áŒá‰¥á‹­á‰µ ወደ $2á‹á‰… ብáˆáˆá¢" + }, + "transactionSubmitted": { + "message": "áŒá‰¥á‹­á‰± የቀረበዠበáŠá‹³áŒ… ዋጋ $1በ$2áŠá‹á¢" + }, + "transactionResubmitted": { + "message": "áŒá‰¥á‹­á‰± በድጋሚ ሲቀርብ የáŠá‹³áŒ… ክáá‹« ወደ $1በ$2ጨáˆáˆ¯áˆ" + }, + "transactionUpdated": { + "message": "áŒá‰¥á‹­á‰µ የዘመáŠá‹ በ $2áŠá‹á¢" + }, + "transactionErrored": { + "message": "áŒá‰¥á‹­á‰± እንከን አጋጥሞታáˆá¢" + }, + "transactionCancelAttempted": { + "message": "áŒá‰¥á‹­á‰µ የመሰረዠሙከራ በáŠá‹³áŒ… ዋጋ $1በ $2ተደርጓáˆ" + }, + "transactionCancelSuccess": { + "message": "áŒá‰¥á‹­á‰± በ$2ላይ በሚገባ ተሰርዟáˆ" + }, + "transactionError": { + "message": "የáŒá‰¥á‹­á‰µ ስህተትᢠበኮንትራት ኮድ የሚላኩ áˆá‹© áˆáŠ”á‰³á‹Žá‰½ አሉá¢" + }, + "transactionErrorNoContract": { + "message": "ከኮንትራት á‹áŒ­ ያለ አድራሻ ተáŒá‰£áˆ­ ለመደወሠመሞከርá¢" + }, + "transactionFee": { + "message": " የáŒá‰¥á‹­á‰µ ክáá‹«" + }, + "transactionTime": { + "message": "የáŒá‰¥á‹­á‰µ ጊዜ" + }, + "transfer": { + "message": "ያስተላáˆá‰" + }, + "transferBetweenAccounts": { + "message": "በመለያዎች መካከሠአስተላáˆá" + }, + "transferFrom": { + "message": "የማዛወሪያ ቅጽ" + }, + "troubleTokenBalances": { + "message": "የተለዋጭ ስሠቀሪ ሂሳብዎን ስንጭን ችáŒáˆ­ አጋጥሞናáˆá¢ ማየት ይችላሉ", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "እንደገና ሞክር" + }, + "typePassword": { + "message": "የ MetaMask የይለá ቃáˆá‹ŽáŠ• ይጻá‰" + }, + "unapproved": { + "message": "á‹«áˆá‰°áˆá‰€á‹°" + }, + "units": { + "message": "መለኪያዎች" + }, + "unknown": { + "message": "á‹«áˆá‰³á‹ˆá‰€" + }, + "unknownNetwork": { + "message": "የማይታወቅ የáŒáˆ አá‹á‰³áˆ¨ መረብ" + }, + "unknownQrCode": { + "message": "ስህተትᡠያን የ QR ኮድ መለየት አáˆá‰»áˆáŠ•áˆ" + }, + "unknownCameraErrorTitle": { + "message": "ኤጭ! የሆአችáŒáˆ­ ተáˆáŒ¥áˆ¯áˆ..." + }, + "unknownCameraError": { + "message": "ወደ ስáˆáŠ­á‹Ž ለመድረስ ሲሞከር የተáˆáŒ áˆ¨ ስህተት አለᢠእባክዎ እንደገና ይሞክሩ..." + }, + "unlock": { + "message": "ክáˆá‰µ" + }, + "unlockMessage": { + "message": "á‹«áˆá‰°áˆ›áŠ¨áˆˆ ድር ይጠባበቃáˆ" + }, + "updatedWithDate": { + "message": "የዘመአ$1" + }, + "urlErrorMsg": { + "message": "URIs አáŒá‰£á‰¥áŠá‰µ ያለዠየ HTTP/HTTPS ቅድመ ቅጥያ á‹­áˆáˆáŒ‹áˆá¢" + }, + "usedByClients": { + "message": "በተለያዩ ደንበኞች ጥቅሠላይ የዋለ áŠá‹" + }, + "userName": { + "message": "የተጣቃሚ ስáˆ" + }, + "viewAccount": { + "message": "መለያን ይመáˆáŠ¨á‰±" + }, + "viewinExplorer": { + "message": "በኤክስá•ሎረር ተመáˆáŠ¨á‰µ" + }, + "viewContact": { + "message": "á‹•á‹á‰‚ያን ይመáˆáŠ¨á‰±" + }, + "viewOnCustomBlockExplorer": { + "message": "በ $1ይመáˆáŠ¨á‰±" + }, + "viewOnEtherscan": { + "message": "በ Etherscan ላይ ይመáˆáŠ¨á‰±" + }, + "visitWebSite": { + "message": "ድረ ገጻችንን ይጎብኙ" + }, + "walletSeed": { + "message": "የቋት ዘር" + }, + "welcomeBack": { + "message": "እንኳን በደህና ተመለሱ" + }, + "welcome": { + "message": "ወደ MetaMask እንኳን ደህና መጡ" + }, + "writePhrase": { + "message": "ይህን áˆáˆ¨áŒ በá‰áˆ«áŒ­ ወረቀት ላይ ይጻá‰áŠ“ ደህንáŠá‰± በተጠበቀ ቦታ ያስቀáˆáŒ¡á‰µá¢ የበለጠ ደህንáŠá‰µ ካስáˆáˆˆáŒˆá‹Žá£ በተለያዩ á‰áˆ­áŒ¥áˆ«áŒ­ ወረቀቶች ላይ ይጻá‰á‰µáŠ“ እያንዳንዳንቸá‹áŠ• በ2-3 የተለያዩ ቦታዎች ያስቀáˆáŒ¡á‰µá¢" + }, + "yesLetsTry": { + "message": "አዎᣠእንሞክር" + }, + "youNeedToAllowCameraAccess": { + "message": "ይህን ባህርይ ለመጠቀሠየካሜራን መድረስ መáቀድ አለብዎትá¢" + }, + "yourSigRequested": { + "message": "áŠáˆ­áˆ›á‹Ž እየተጠየቀ áŠá‹" + }, + "youSign": { + "message": "እየáˆáˆ¨áˆ™ áŠá‹" + }, + "yourPrivateSeedPhrase": { + "message": "የáŒáˆ ዘር áˆáˆ¨áŒá‹Ž" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "በስá’ድ አᕠላይ ዜሮ የáŠá‹³áŒ… ዋጋ" + } +} diff --git a/app/_locales/ar/messages.json b/app/_locales/ar/messages.json new file mode 100644 index 000000000000..40815b680c34 --- /dev/null +++ b/app/_locales/ar/messages.json @@ -0,0 +1,1303 @@ +{ + "chartOnlyAvailableEth": { + "message": "الرسم البياني متاح Ùقط على شبكات إيثيريوم." + }, + "contractInteraction": { + "message": "Ø§Ù„ØªÙØ§Ø¹Ù„ على العقد" + }, + "reject": { + "message": "Ø±ÙØ¶" + }, + "about": { + "message": "حول" + }, + "aboutSettingsDescription": { + "message": "نسخة الإصدار ومركز الدعم ومعلومات الاتصال." + }, + "acceleratingATransaction": { + "message": "* تسريع المعاملات باستخدام سعر عملة جاس أعلى يزيد من ÙØ±Øµ معالجتها بواسطة الشبكة بشكل٠أسرع، لكن ذلك غير مضمون دائماً." + }, + "accessingYourCamera": { + "message": "جاري استخدام كاميرتك..." + }, + "account": { + "message": "الحساب" + }, + "accountDetails": { + "message": "ØªÙØ§ØµÙŠÙ„ الحساب" + }, + "accountName": { + "message": "اسم الحساب" + }, + "accountOptions": { + "message": "خيارات الحساب" + }, + "accountSelectionRequired": { + "message": "يجب عليك تحديد حساب!" + }, + "activityLog": { + "message": "سجل النشاط" + }, + "addNetwork": { + "message": "أض٠شبكة" + }, + "addRecipient": { + "message": "Ø¥Ø¶Ø§ÙØ© مستلم" + }, + "advanced": { + "message": "إعدادات متقدمة" + }, + "advancedSettingsDescription": { + "message": "يتاح لك استخدام ميزات تطوير البرامج وتنزيل سجلات الحالة وإعادة تعيين الحساب وإعداد شبكات الاختبارات وتخصيص استدعاء الإجراء عن بعد (RPC)." + }, + "advancedOptions": { + "message": "خيارات متقدمة" + }, + "addToAddressBook": { + "message": "Ø¥Ø¶Ø§ÙØ© إلى Ø¯ÙØªØ± العناوين" + }, + "addToAddressBookModalPlaceholder": { + "message": "مثلا جون دي" + }, + "addAlias": { + "message": "Ø¥Ø¶Ø§ÙØ© اسم مستعار" + }, + "addToken": { + "message": "Ø¥Ø¶Ø§ÙØ© عملة رمزية" + }, + "addTokens": { + "message": "Ø¥Ø¶Ø§ÙØ© عملات رمزية" + }, + "addSuggestedTokens": { + "message": "أض٠العملات الرمزية المقترحة" + }, + "addAcquiredTokens": { + "message": "أض٠العملات الرمزية التي اكتسبتها باستخدام MetaMask" + }, + "amount": { + "message": "المبلغ" + }, + "appDescription": { + "message": "Ù…Ø­ÙØ¸Ø© إيثيريوم ÙÙŠ Ù…ØªØµÙØ­Ùƒ", + "description": "The description of the application" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "approve": { + "message": "مواÙÙ‚" + }, + "approved": { + "message": "تمت المواÙقة" + }, + "asset": { + "message": "الأصل" + }, + "attemptingConnect": { + "message": "محاولة الاتصال بسلسلة الكتل." + }, + "attemptToCancel": { + "message": "هل تحاول الإلغاء؟" + }, + "attemptToCancelDescription": { + "message": "تقديم هذه المحاولة لا يضمن أنه سيتم إلغاء معاملتك الأصلية. إذا نجحت محاولة الإلغاء ØŒ ÙØ³ÙŠØªÙ… ÙØ±Ø¶ رسوم المعاملة المذكورة أعلاه." + }, + "attributions": { + "message": "Ø§Ù„ØµÙØ§Øª" + }, + "autoLockTimeLimit": { + "message": "مؤقت تسجيل الخروج التلقائي (بالدقائق)" + }, + "autoLockTimeLimitDescription": { + "message": "اضبط مهلة السكون بالدقائق التي يقوم MetaMask بتسجيل الخروج بعدها تلقائيًا" + }, + "average": { + "message": "المتوسط" + }, + "back": { + "message": "الرجوع إلى الوراء" + }, + "backToAll": { + "message": "العودة إلى الجميع" + }, + "backupApprovalNotice": { + "message": "قم بالنسخ الاحتياطي لرمز الاسترداد السري Ù„Ù„Ø­ÙØ§Ø¸ على Ù…Ø­ÙØ¸ØªÙƒ وأموالك بأمان." + }, + "backupApprovalInfo": { + "message": "هذا الرمز السري مطلوب لاسترداد Ù…Ø­ÙØ¸ØªÙƒ ÙÙŠ حالة Ùقد جهازك أو نسيان كلمة مرورك أو إعادة تثبيت MetaMask أو الرغبة ÙÙŠ الوصول إلى Ù…Ø­ÙØ¸ØªÙƒ عبر جهاز آخر." + }, + "backupNow": { + "message": "قم بالنسخ الاحتياطي الآن" + }, + "balance": { + "message": "الرصيد" + }, + "balanceOutdated": { + "message": "قد يكون الرصيد لاغياً" + }, + "basic": { + "message": "الأساسية" + }, + "blockExplorerUrl": { + "message": "Ù…ØªØµÙØ­ Block Explorer" + }, + "blockExplorerView": { + "message": "عرض الحساب ÙÙŠ $1", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "استخدم خدمة تكتلات Blockies Identicon" + }, + "browserNotSupported": { + "message": "Ù…ØªØµÙØ­Ùƒ غير مدعوم..." + }, + "builtInCalifornia": { + "message": "تم تصميم وإنشاء MetaMask ÙÙŠ ولاية كاليÙورنيا." + }, + "buyWithWyre": { + "message": "قم بشراء عملة إيثير بواسطة Wyre" + }, + "buyWithWyreDescription": { + "message": "يتيح لك Wyre استخدام بطاقة ائتمان لإيداع ETH مباشرة ÙÙŠ حساب MetaMask الخاص بك." + }, + "buyCoinSwitch": { + "message": "قم بالشراء على CoinSwitch" + }, + "buyCoinSwitchExplainer": { + "message": "CoinSwitch هي الوجهة الوحيدة لتبادل أكثر من 300 عملة Ù…Ø´ÙØ±Ø© Ø¨Ø£ÙØ¶Ù„ سعر." + }, + "bytes": { + "message": "بايتات" + }, + "off": { + "message": "مقÙÙ„" + }, + "ok": { + "message": "أواÙÙ‚" + }, + "on": { + "message": "تشغيل" + }, + "optionalBlockExplorerUrl": { + "message": "العنوان الإلكتروني لمستكش٠البلوكات (اختياري)" + }, + "cancel": { + "message": "إلغاء" + }, + "cancelAttempt": { + "message": "إلغاء المحاولة" + }, + "cancellationGasFee": { + "message": "رسوم الإلغاء بعملة جاس" + }, + "cancelled": { + "message": "تم الإلغاء" + }, + "chainId": { + "message": "معرّ٠السلسلة" + }, + "clickToRevealSeed": { + "message": "انقر هنا للكش٠عن الكلمات السرية" + }, + "close": { + "message": "إغلاق" + }, + "chromeRequiredForHardwareWallets": { + "message": "تحتاج إلى استخدام MetaMask على Google Chrome للاتصال Ø¨Ù…Ø­ÙØ¸Ø© الأجهزة الخاصة بك." + }, + "confirm": { + "message": "التأكيد" + }, + "confirmed": { + "message": "تم التأكيد" + }, + "confirmPassword": { + "message": "تأكيد كلمة المرور" + }, + "confirmSecretBackupPhrase": { + "message": "تأكيد عبارة الدعم السرية الخاصة بك" + }, + "congratulations": { + "message": "تهانينا" + }, + "connectHardwareWallet": { + "message": "ربط Ù…Ø­ÙØ¸Ø© الأجهزة" + }, + "connect": { + "message": "اتصال" + }, + "connectingTo": { + "message": "جار٠الاتصال بـ $1" + }, + "connectingToKovan": { + "message": "الاتصال بشبكة اختبار Kovan" + }, + "connectingToMainnet": { + "message": "جار٠الاتصال بشبكة إيثيريوم الرئيسية" + }, + "connectingToRopsten": { + "message": "جار٠الاتصال بشبكة اختبار Ropsten " + }, + "connectingToRinkeby": { + "message": "جار٠الاتصال بشبكة اختبار Rinkeby " + }, + "connectingToLocalhost": { + "message": "جاري الاتصال بالمضي٠المحلي 8545" + }, + "connectingToGoerli": { + "message": "الاتصال بشبكة اختبار Goerli" + }, + "continueToWyre": { + "message": "الاستمرار إلى Wyre" + }, + "continueToCoinSwitch": { + "message": "المتابعة إلى CoinSwitch" + }, + "contractDeployment": { + "message": "نشر العقد" + }, + "copiedExclamation": { + "message": "تم النسخ." + }, + "copyAddress": { + "message": "نسخ العنوان إلى Ø§Ù„Ø­Ø§ÙØ¸Ø©" + }, + "copyTransactionId": { + "message": "نسخ هوية المعاملة" + }, + "copiedTransactionId": { + "message": "تم نسخ معر٠المعاملة" + }, + "copyToClipboard": { + "message": "نسخ إلى Ø§Ù„Ø­Ø§ÙØ¸Ø©" + }, + "copyPrivateKey": { + "message": "هذا هو Ù…ÙØªØ§Ø­Ùƒ الخاص (انقر للنسخ)" + }, + "create": { + "message": "إنشاء" + }, + "createAccount": { + "message": "إنشاء حساب" + }, + "createAWallet": { + "message": "إنشاء Ù…Ø­ÙØ¸Ø©" + }, + "createPassword": { + "message": "إنشاء كلمة مرور" + }, + "currencyConversion": { + "message": "تحويل العملات" + }, + "currentLanguage": { + "message": "اللغة الحالية" + }, + "customGas": { + "message": "تخصيص الغاز" + }, + "customGasSubTitle": { + "message": "قد تؤدي زيادة الرسوم إلى تقليل أزمنة المعالجة، ولكن ذلك غير مضمون." + }, + "customToken": { + "message": "عملة رمزية مخصصة" + }, + "customRPC": { + "message": "آر بي سي مخصص" + }, + "decimalsMustZerotoTen": { + "message": "يجب أن تكون الكسور العشرية ØµÙØ±Ø§Ù‹ على الأقل، وألا تزيد عن 36 كسراً." + }, + "decimal": { + "message": "دقة بالكسور العشرية" + }, + "defaultNetwork": { + "message": "الشبكة Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ© لمعاملات الأثير هي الشبكة الرئيسية." + }, + "delete": { + "message": "حذÙ" + }, + "deleteAccount": { + "message": "حذ٠الحساب" + }, + "deposit": { + "message": "إيداع" + }, + "depositEther": { + "message": "إيداع عملة إيثير" + }, + "details": { + "message": "Ø§Ù„ØªÙØ§ØµÙŠÙ„" + }, + "directDepositEther": { + "message": "إيداع مباشرة لعملة الأثير" + }, + "directDepositEtherExplainer": { + "message": "إذا كان لديك Ø¨Ø§Ù„ÙØ¹Ù„ بعض الأثير، ÙØ¥Ù† أسرع طريقة للحصول على الأثير ÙÙŠ Ù…Ø­ÙØ¸ØªÙƒ الجديدة عن طريق الإيداع المباشر." + }, + "done": { + "message": "تم" + }, + "downloadGoogleChrome": { + "message": "تنزيل جوجل كروم" + }, + "downloadSecretBackup": { + "message": "قم بتنزيل هذه الجملة الاحتياطية السرية ÙˆØ§Ø­ØªÙØ¸ بها بتخزينها بأمان ÙÙŠ محرك أقراص ثابت أو وسيط تخزين خارجيين مشÙّرين." + }, + "downloadStateLogs": { + "message": "تنزيل سجلات الحالة" + }, + "dontHaveAHardwareWallet": { + "message": "أليس لديك Ù…Ø­ÙØ¸Ø© أجهزة؟" + }, + "dropped": { + "message": "تم الإلقاء" + }, + "edit": { + "message": "تحرير" + }, + "editContact": { + "message": "تعديل جهة الاتصال" + }, + "endOfFlowMessage1": { + "message": "لقد نجحت ÙÙŠ الاختبار - Ø§Ø­ØªÙØ¸ بعبارة الأمان الخاصة بك ÙÙŠ مكان آمن، إنها مسؤوليتك!" + }, + "endOfFlowMessage2": { + "message": "نصائح بشأن تخزينها بأمان" + }, + "endOfFlowMessage3": { + "message": "Ø§Ø­ÙØ¸ نسخة احتياطية ÙÙŠ أماكن متعددة." + }, + "endOfFlowMessage4": { + "message": "لا تشارك هذه الجملة مطلقًا مع أي شخص." + }, + "endOfFlowMessage5": { + "message": "كن حذراً من الخداع الإلكتروني! لن يسأل MetaMask من تلقاء Ù†ÙØ³Ù‡ عن عبارة الأمان الخاصة بك أبداً." + }, + "endOfFlowMessage6": { + "message": "إذا كنت بحاجة إلى عمل نسخة احتياطية من عبارة الأمان الخاصة بك مرة أخرى، يمكنك العثور عليها ÙÙŠ الإعدادات -> الأمان." + }, + "endOfFlowMessage7": { + "message": "إذا كانت لديك أسئلة أو ترى شيئاً ما مريباً، ÙØ£Ø±Ø³Ù„ بريداً إلكترونياً إلى support@metamask.io." + }, + "endOfFlowMessage8": { + "message": "لا يمكن لـ MetaMask استعادة جملتك البذرية. تعلم المزيد." + }, + "endOfFlowMessage9": { + "message": "اعر٠المزيد." + }, + "endOfFlowMessage10": { + "message": "كل شيء تم بنجاح" + }, + "ensRegistrationError": { + "message": "خطأ ÙÙŠ تسجيل اسم ENS" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "لم يتم العثور على اسم ENS على الشبكة الحالية. حاول التبديل إلى شبكة الإيثيريوم الرئيسية." + }, + "enterAnAlias": { + "message": "أدخل اسمًا مستعارًا" + }, + "enterPassword": { + "message": "أدخل كلمة مرور" + }, + "enterPasswordContinue": { + "message": "أدخل كلمة المرور للمتابعة" + }, + "ethereumPublicAddress": { + "message": "عنوان الإيثيريوم العمومي" + }, + "etherscanView": { + "message": "عرض الحساب على Etherscan" + }, + "estimatedProcessingTimes": { + "message": "أوقات المعالجة المقدرة" + }, + "expandView": { + "message": "توسيع العرض" + }, + "exportPrivateKey": { + "message": "تصدير Ø§Ù„Ù…ÙØªØ§Ø­ الخاص" + }, + "failed": { + "message": "ÙØ´Ù„" + }, + "fast": { + "message": "سريع" + }, + "faster": { + "message": "أسرع" + }, + "fileImportFail": { + "message": "استيراد المل٠لا ينجح؟ انقر هنا!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "عدم ØªØ°ÙƒÙ‘ÙØ± هذا الجهاز" + }, + "from": { + "message": "من" + }, + "functionType": { + "message": "نوع Ø§Ù„ÙˆØ¸ÙŠÙØ©" + }, + "gasLimit": { + "message": "الحد الأقصى لوحدات جاس" + }, + "gasLimitInfoModalContent": { + "message": "حد عملة جاس هو الحد الأقصى لمقدار وحدات جاس التي ترغب ÙÙŠ Ø¥Ù†ÙØ§Ù‚ها." + }, + "gasLimitTooLow": { + "message": "يجب أن يكون حد وحدات الجاس على الأقل 21000" + }, + "gasUsed": { + "message": "وحدات جاس المستخدمة" + }, + "gasPrice": { + "message": "سعر عملة جاس (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "سعر الجاس Ù…Ù†Ø®ÙØ¶ للغاية" + }, + "gasPriceInfoModalContent": { + "message": "يحدد سعر الغاز مقدار الإيثر الذي تكون على استعداد Ù„Ø¯ÙØ¹Ù‡ لكل وحدة غاز." + }, + "gasPriceNoDenom": { + "message": "سعر عملة جاس" + }, + "general": { + "message": "عام" + }, + "generalSettingsDescription": { + "message": "تحويل العملات، العملة الأساسية، اللغة ØŒ تكتلات blockies identicon" + }, + "getEther": { + "message": "احصل على إيثر" + }, + "getEtherFromFaucet": { + "message": "احصل على الأثير من صنبور مقابل $1", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "احصل على الدعم." + }, + "getStarted": { + "message": "البدء" + }, + "happyToSeeYou": { + "message": "نحن سعداء برؤيتك." + }, + "hardware": { + "message": "أجهزة" + }, + "hardwareWalletConnected": { + "message": "تم الاتصال Ø¨Ù…Ø­ÙØ¸Ø© الأجهزة" + }, + "hardwareWallets": { + "message": "الاتصال Ø¨Ù…Ø­ÙØ¸Ø© hardware wallet" + }, + "hardwareWalletsMsg": { + "message": "حدد Ù…Ø­ÙØ¸Ø© أجهزة ترغب ÙÙŠ استخدامها مع MetaMask" + }, + "havingTroubleConnecting": { + "message": "هل تواجه مشكلة ÙÙŠ الاتصال؟" + }, + "here": { + "message": "هنا", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hexData": { + "message": "بيانات سداسية" + }, + "hide": { + "message": "Ø¥Ø®ÙØ§Ø¡" + }, + "hideTokenPrompt": { + "message": "أتريد Ø¥Ø®ÙØ§Ø¡ العملة الرمزية؟" + }, + "history": { + "message": "السجل" + }, + "import": { + "message": "الاستيراد", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "استيراد الحساب" + }, + "importAccountMsg": { + "message": "لن يتم ربط الحسابات التي تم استيرادها بعبارة أمان حساب MetaMask الذي تم إنشاؤها ÙÙŠ الأصل. تعر٠على المزيد حول الحسابات المستوردة" + }, + "importAccountSeedPhrase": { + "message": "استيراد حساب باستخدام عبارة الأمان" + }, + "importWallet": { + "message": "استيراد Ø§Ù„Ù…Ø­ÙØ¸Ø©" + }, + "importYourExisting": { + "message": "قم باستيراد Ù…Ø­ÙØ¸ØªÙƒ الحالية باستخدام جملة بذرية مكونة من 12 كلمة" + }, + "imported": { + "message": "المستوردة", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "استيراد باستخدام عبارة أمان الحساب" + }, + "infoHelp": { + "message": "المعلومات والمساعدة" + }, + "initialTransactionConfirmed": { + "message": "تم تأكيد المعاملة الأولية الخاصة بك بواسطة الشبكة. انقر Ùوق مواÙÙ‚ للعودة." + }, + "insufficientBalance": { + "message": "الرصيد غير كاÙÙ" + }, + "insufficientFunds": { + "message": "رصيد غير كاÙ." + }, + "insufficientTokens": { + "message": "العملات الرمزية غير كاÙية." + }, + "invalidAddress": { + "message": "عنوان غير صالح" + }, + "invalidAddressRecipient": { + "message": "عنوان المستلم غير صحيح" + }, + "knownAddressRecipient": { + "message": "عنوان العقد المعروÙ." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "لا تجعلها شبكة ETHØŒ قم بتعيين الأحر٠صغيرة" + }, + "invalidInput": { + "message": "مدخل غير صحيح." + }, + "invalidRPC": { + "message": "رابط آر بي سي غير صحيح" + }, + "invalidBlockExplorerURL": { + "message": "غير صحيح Block Explorer رابط" + }, + "invalidSeedPhrase": { + "message": "عبارة أمان غير صحيحة" + }, + "jsonFile": { + "message": "مل٠JSON ", + "description": "format for importing an account" + }, + "kovan": { + "message": "شبكة اختبار Kovan " + }, + "learnMore": { + "message": "اكتش٠المزيد" + }, + "ledgerAccountRestriction": { + "message": "أنت بحاجة إلى استخدام حسابك الأخير قبل أن تتمكن من Ø¥Ø¶Ø§ÙØ© حساب جديد." + }, + "letsGoSetUp": { + "message": "نعم، دعنا نبدأ التثبيت!" + }, + "likeToAddTokens": { + "message": "هل ترغب ÙÙŠ Ø¥Ø¶Ø§ÙØ© هذه الرموز؟" + }, + "links": { + "message": "الروابط" + }, + "liveGasPricePredictions": { + "message": "توقعات أسعار الجاس الحية" + }, + "loading": { + "message": "جار٠التحميل..." + }, + "loadingTokens": { + "message": "جار٠تحميل العملات الرمزية ..." + }, + "loadMore": { + "message": "تحميل المزيد" + }, + "localhost": { + "message": "المضي٠المحلي 8545" + }, + "lock": { + "message": "تسجيل الخروج" + }, + "mainnet": { + "message": "شبكة الإيثيريوم الرئيسية" + }, + "memorizePhrase": { + "message": "Ø§Ø­ÙØ¸ هذه العبارة." + }, + "memo": { + "message": "مذكرة" + }, + "message": { + "message": "رسالة" + }, + "metamaskDescription": { + "message": "إيصالك بالإيثيريوم وبالشبكة اللامركزية." + }, + "metamaskVersion": { + "message": "إصدار MetaMask " + }, + "mobileSyncText": { + "message": "يرجى إدخال كلمة مرورك لتأكيد هويتك!" + }, + "myAccounts": { + "message": "حساباتي" + }, + "myWalletAccounts": { + "message": "حسابات Ù…Ø­ÙØ¸ØªÙŠ" + }, + "myWalletAccountsDescription": { + "message": "ستتم Ø¥Ø¶Ø§ÙØ© جميع حسابات MetaMask الخاصة بك والتي تم إنشاؤها تلقائياً إلى هذا القسم." + }, + "mustSelectOne": { + "message": "يجب تحديد عملة رمزية واحدة على الأقل." + }, + "needEtherInWallet": { + "message": "Ù„Ù„ØªÙØ§Ø¹Ù„ مع التطبيقات اللامركزية باستخدام MetaMaskØŒ ستحتاج إلى الإيثير ÙÙŠ Ù…Ø­ÙØ¸ØªÙƒ." + }, + "needImportFile": { + "message": "يلزم تحديد مل٠للاستيراد.", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "لا يمكن إرسال مبالغ سلبية من ETH." + }, + "networkName": { + "message": "اسم الشبكة" + }, + "networks": { + "message": "الشبكات" + }, + "networkSettingsDescription": { + "message": "Ø¥Ø¶Ø§ÙØ© وتعديل شبكات RPC المخصصة" + }, + "nevermind": { + "message": "لا يهم" + }, + "newAccount": { + "message": "حساب جديد" + }, + "newAccountDetectedDialogMessage": { + "message": "تم اكتشا٠عنوان جديد! انقر هنا Ù„Ø¥Ø¶Ø§ÙØªÙ‡ إلى Ø¯ÙØªØ± عناوينك." + }, + "newAccountNumberName": { + "message": "حساب $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "جهة اتصال جديدة" + }, + "newContract": { + "message": "عقد جديد" + }, + "newPassword": { + "message": "كلمة مرور جديدة (8 أحر٠كحد أدنى)" + }, + "newNetwork": { + "message": "شبكة جديدة" + }, + "newToMetaMask": { + "message": "هل انت جديد ÙÙŠ MetaMaskØŸ" + }, + "noAlreadyHaveSeed": { + "message": "لا، لدي جملة بذرية مسبقًا" + }, + "protectYourKeys": { + "message": "Ø§Ø­Ù…Ù Ù…ÙØ§ØªÙŠØ­Ùƒ!" + }, + "protectYourKeysMessage1": { + "message": "كن حذراً بشأن عبارة الأمان الخاصة بك - Ùهناك بلاغات عن مواقع ويب تحاول تقليد MetaMask. لن تسأل MetaMask عن عبارة الأمان الخاصة بك أبداً!" + }, + "protectYourKeysMessage2": { + "message": "أبق٠عبارة الأمان الخاصة بك بأمان. إذا رأيت شيئاً مريباً، أو كنت غير متأكد من موقع ويب ما، أرسل بريداً إلكترونياً إلى support@metamask.io" + }, + "rpcUrl": { + "message": "عنوان جديد لاستدعاء الإجراء عن بعد" + }, + "optionalChainId": { + "message": "هوية ChainID (اختياري)" + }, + "optionalSymbol": { + "message": "الرمز (اختياري)" + }, + "newTotal": { + "message": "إجمالي جديد" + }, + "newTransactionFee": { + "message": "رسوم المعاملات الجديدة" + }, + "next": { + "message": "التالي" + }, + "noAddressForName": { + "message": "لم يتم تعيين عنوان لهذا الاسم." + }, + "noConversionRateAvailable": { + "message": "لا يوجد معدل تحويل متاح" + }, + "noTransactions": { + "message": "لا توجد لديك معاملات" + }, + "notEnoughGas": { + "message": "لا توجد عملات جاس كاÙية" + }, + "noWebcamFoundTitle": { + "message": "لم يتم العثور على كاميرا متصلة بالإنترنت" + }, + "noWebcamFound": { + "message": "لم يتم العثور على كاميرا ويب للكمبيوتر الخاص بك. حاول مرة اخرى." + }, + "ofTextNofM": { + "message": "من" + }, + "orderOneHere": { + "message": "اطلب Trezor أو Ledger ÙˆØ­Ø§ÙØ¸ على أموالك ÙÙŠ مخزن حصين" + }, + "origin": { + "message": "الأصل" + }, + "parameters": { + "message": "معلّمات" + }, + "participateInMetaMetrics": { + "message": "المشاركة ÙÙŠ MetaMetrics" + }, + "participateInMetaMetricsDescription": { + "message": "شارك ÙÙŠ MetaMetrics لمساعدتنا ÙÙŠ جعل MetaMask Ø£ÙØ¶Ù„" + }, + "password": { + "message": "كلمة المرور" + }, + "passwordsDontMatch": { + "message": "كلمات المرور غير متطابقة" + }, + "passwordNotLongEnough": { + "message": "كلمة المرور أقصر مما يلزم" + }, + "pastePrivateKey": { + "message": "الصق مقطع Ù…ÙØªØ§Ø­Ùƒ الخاص هنا:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "قيد الانتظار" + }, + "personalAddressDetected": { + "message": "تم اكتشا٠عنوان شخصي. يرجى إدخال عنوان عقد الرمز." + }, + "prev": { + "message": "السابق" + }, + "primaryCurrencySetting": { + "message": "العملة الأساسية" + }, + "primaryCurrencySettingDescription": { + "message": "حدد خيار \"المحلية\" لتحديد أولويات عرض القيم بالعملة المحلية للسلسلة (مثلاً ETH). حدد Fiat لتحديد أولويات عرض القيم بعملات fiat المحددة الخاصة بك." + }, + "privacyMsg": { + "message": "سياسة الخصوصية" + }, + "privateKey": { + "message": "Ø§Ù„Ù…ÙØªØ§Ø­ الخاص", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "تنبيه: لا تكش٠عن هذا Ø§Ù„Ù…ÙØªØ§Ø­ مطلقًا. يمكن لأي شخص لديه Ù…ÙØ§ØªÙŠØ­Ùƒ الخاصة سرقة أي أصول ØªØ­ØªÙØ¸ بها ÙÙŠ حسابك." + }, + "privateNetwork": { + "message": "شبكة خاصة" + }, + "queue": { + "message": "اللائحة" + }, + "readdToken": { + "message": "يمكنك Ø¥Ø¶Ø§ÙØ© هذه العملة الرمزية مرة أخرى ÙÙŠ المستقبل من خلال الانتقال إلى \"Ø¥Ø¶Ø§ÙØ© عملة رمزية\" ÙÙŠ قائمة خيارات الحسابات الخاصة بك." + }, + "recents": { + "message": "الحديث" + }, + "recipientAddress": { + "message": "عنوان المستلم" + }, + "recipientAddressPlaceholder": { + "message": "البحث، العنوان العام (0x)ØŒ أو ENS" + }, + "rejectAll": { + "message": "Ø±ÙØ¶ الكل" + }, + "rejectTxsN": { + "message": "Ø±ÙØ¶ معاملات $1" + }, + "rejectTxsDescription": { + "message": "أنت بصدد Ø±ÙØ¶ المعاملات بقيمة $1 Ø¨Ø¯ÙØ¹Ø© واحدة." + }, + "rejected": { + "message": "مرÙوض" + }, + "reset": { + "message": "إعادة" + }, + "resetAccount": { + "message": "إعادة تعيين الحساب" + }, + "resetAccountDescription": { + "message": "ستؤدي إعادة تعيين حسابك إلى مسح سجل معاملتك." + }, + "deleteNetwork": { + "message": "هل تريد حذ٠الشبكة؟" + }, + "deleteNetworkDescription": { + "message": "هل أنت متأكد أنك تريد حذ٠هذه الشبكة؟" + }, + "remindMeLater": { + "message": "ذكرني لاحقاً" + }, + "restoreFromSeed": { + "message": "هل تريد استعادة الحساب؟" + }, + "restoreAccountWithSeed": { + "message": "قم باستعادة حسابك بواسطة عبارة الأمان" + }, + "requestsAwaitingAcknowledgement": { + "message": "طلبات ÙÙŠ انتظار الاعترا٠بها" + }, + "required": { + "message": "مطلوب" + }, + "restore": { + "message": "استعادة" + }, + "revealSeedWords": { + "message": "كش٠كلمات عبارات الأمان" + }, + "revealSeedWordsTitle": { + "message": "عبارة الأمان" + }, + "revealSeedWordsDescription": { + "message": "إذا كنت تنوي تغيير Ø§Ù„Ù…ØªØµÙØ­Ø§Øª أو نقل أجهزة الكمبيوتر ÙÙŠ أي وقت، ÙØ³ÙˆÙ تحتاج إلى عبارة الأمان هذه للوصول إلى حساباتك. Ø§Ø­ÙØ¸Ù‡Ø§ ÙÙŠ مكان آمن وسري." + }, + "revealSeedWordsWarningTitle": { + "message": "لا تشارك هذه الجملة مع أي شخص آخر!" + }, + "revealSeedWordsWarning": { + "message": "يمكن استخدام هذه الكلمات لسرقة جميع حساباتك." + }, + "remove": { + "message": "إزالة" + }, + "removeAccount": { + "message": "إزالة الحساب" + }, + "removeAccountDescription": { + "message": "ستتم إزالة هذا الحساب من Ù…Ø­ÙØ¸ØªÙƒ. يرجى التأكد من وجود عبارة الأمان الأصلية أو Ø§Ù„Ù…ÙØªØ§Ø­ الخاص لهذا الحساب الذي تم استيراده قبل المتابعة. يمكنك استيراد أو إنشاء حسابات مرة أخرى من القائمة المنسدلة للحساب." + }, + "readyToConnect": { + "message": "هل أنت جاهز للاتصال؟" + }, + "rinkeby": { + "message": "شبكة اختبارات Rinkeby" + }, + "ropsten": { + "message": "شبكة اختبار Ropsten" + }, + "goerli": { + "message": "شبكة اختبار Goerli " + }, + "save": { + "message": "Ø­ÙØ¸" + }, + "slow": { + "message": "بطيء" + }, + "slower": { + "message": "أبطأ" + }, + "saveAsCsvFile": { + "message": "Ø­ÙØ¸ كمل٠CSV" + }, + "scanInstructions": { + "message": "ضع رمز الاستجابة السريعة أمام الكاميرا" + }, + "scanQrCode": { + "message": "مسح كود الاستجابة السريعة QR" + }, + "search": { + "message": "البحث" + }, + "searchResults": { + "message": "نتائج البحث" + }, + "secretBackupPhrase": { + "message": "الجملة الاحتياطية السرية" + }, + "secretBackupPhraseDescription": { + "message": "تجعل عبارة النسخ الاحتياطي السرية الخاصة بك من السهل إجراء نسخ احتياطي واستعادة حسابك." + }, + "secretBackupPhraseWarning": { + "message": "تحذير: لا تكش٠مطلقاً عن عبارة الدعم الخاصة بك. يمكن لأي شخص بهذه العبارة أن يستحوذ على الأثير الخاص بك إلى الأبد." + }, + "secretPhrase": { + "message": "أدخل جملتك السرية المكونة من اثني عشر كلمة هنا لاستعادة خزنتك." + }, + "securityAndPrivacy": { + "message": "الأمن والخصوصية" + }, + "securitySettingsDescription": { + "message": "إعدادات الخصوصية وعبارة أمان Ø§Ù„Ù…Ø­ÙØ¸Ø©" + }, + "seedPhrasePlaceholder": { + "message": "يرجى ÙØµÙ„ كل كلمة Ø¨Ù…Ø³Ø§ÙØ© واحدة" + }, + "seedPhraseReq": { + "message": "طول الجمل البذرية 12 كلمة" + }, + "selectCurrency": { + "message": "تحديد العملة" + }, + "selectEachPhrase": { + "message": "ÙŠÙØ±Ø¬Ù‰ تحديد كل عبارة للتأكد من صحتها." + }, + "selectLocale": { + "message": "تحديد الموقع المحلي" + }, + "selectType": { + "message": "تحديد النوع" + }, + "send": { + "message": "إرسال" + }, + "sendAmount": { + "message": "إرسال المبلغ" + }, + "sendETH": { + "message": "إرسال عملة إيثيريوم" + }, + "sendTokens": { + "message": "إرسال عملات رمزية" + }, + "sentEther": { + "message": "أرسل عملة إيثير" + }, + "sentTokens": { + "message": "العملات الرمزية المرسلة" + }, + "separateEachWord": { + "message": "Ø§ÙØµÙ„ كل كلمة Ø¨Ù…Ø³Ø§ÙØ© واحدة" + }, + "searchTokens": { + "message": "البحث عن العملات الرمزية" + }, + "selectAnAccount": { + "message": "قم بتحديد حساب" + }, + "selectAnAccountHelp": { + "message": "حدد الحساب لعرضه ÙÙŠ MetaMask" + }, + "selectAHigherGasFee": { + "message": "حدد رسوم جاس أعلى لتسريع معالجة معاملتك. *" + }, + "selectHdPath": { + "message": "حدد مسار HD " + }, + "selectPathHelp": { + "message": "إذا لم تشاهد حسابات Ledger الحالية الخاصة بك أدناه، ÙØ­Ø§ÙˆÙ„ تبديل المسارات \"Legacy (MEW / MyCrypto)\"" + }, + "settings": { + "message": "الإعدادات" + }, + "showAdvancedGasInline": { + "message": "أدوات التحكم المتقدمة للغاز" + }, + "showAdvancedGasInlineDescription": { + "message": "حدد هذا لإظهار سعر عملة جاس والحد من الضوابط مباشرة على شاشات الإرسال والتأكيد." + }, + "showFiatConversionInTestnets": { + "message": "عرض التحويل على Testnets" + }, + "showFiatConversionInTestnetsDescription": { + "message": "حدد هذا لإظهار تحويل fiat على Testnets" + }, + "showPrivateKeys": { + "message": "عرض Ø§Ù„Ù…ÙØ§ØªÙŠØ­ الخاصة" + }, + "showHexData": { + "message": "إظهار بيانات Hex" + }, + "showHexDataDescription": { + "message": "حدد هذا لإظهار حقل بيانات سداسي عشرية على شاشة الإرسال" + }, + "sign": { + "message": "توقيع" + }, + "signatureRequest": { + "message": "طلب التوقيع" + }, + "signed": { + "message": "مسجل الدخول" + }, + "signNotice": { + "message": "توقيع هذه الرسالة يمكن أن يكون له\nآثار جانبية خطيرة. قم Ùقط بتوقيع الرسائل من\nالمواقع التي تثق بها تماماً ÙÙŠ التعامل مع حسابك بالكامل.\n  ستتم إزالة هذه الطريقة الخطيرة ÙÙŠ إصدار مستقبلي." + }, + "sigRequest": { + "message": "طلب التوقيع" + }, + "somethingWentWrong": { + "message": "عذراً! حدث خطأ ما." + }, + "speedUp": { + "message": "تعجيل" + }, + "speedUpCancellation": { + "message": "تسريع هذا الإلغاء" + }, + "speedUpTransaction": { + "message": "تعجيل هذه المعاملة" + }, + "switchNetworks": { + "message": "تبديل الشبكات" + }, + "stateLogs": { + "message": "سجلات الحالة" + }, + "stateLogsDescription": { + "message": "تحتوي سجلات الحالة على عناوين حسابك العامة والمعاملات المرسلة." + }, + "stateLogError": { + "message": "خطأ ÙÙŠ استرداد سجلات الحالة." + }, + "step1HardwareWallet": { + "message": "1. قم بتوصيل Ù…Ø­ÙØ¸Ø© Hardware Wallet" + }, + "step1HardwareWalletMsg": { + "message": "قم بتوصيل Ù…Ø­ÙØ¸Ø© الأجهزة الخاصة بك مباشرة إلى جهاز الكمبيوتر الخاص بك." + }, + "step2HardwareWallet": { + "message": "2. حدد حساباً" + }, + "step2HardwareWalletMsg": { + "message": "حدد الحساب الذي تريد عرضه. يمكنك اختيار حساب واحد Ùقط ÙÙŠ المرة الواحدة." + }, + "step3HardwareWallet": { + "message": "3. ابدأ ÙÙŠ استخدام dApps وأكثر!" + }, + "step3HardwareWalletMsg": { + "message": "استخدم حساب الجهاز الخاص بك كما ØªÙØ¹Ù„ مع أي حساب Ethereum. قم بتسجيل الدخول إلى dApps ØŒ إرسال Eth ØŒ قم بشراء وتخزين عملات ERC20 الرمزية والعملات الرمزية الغير قابلة للاستبدال مثل CryptoKitties." + }, + "storePhrase": { + "message": "Ø§Ø­ØªÙØ¸ بهذه الجملة ÙÙŠ مدير كلمات مرور مثل 1Password." + }, + "submitted": { + "message": "المقدمة" + }, + "supportCenter": { + "message": "ØªÙØ¶Ù„ بزيارة مركز الدعم الخاص بنا" + }, + "symbol": { + "message": "رمز" + }, + "symbolBetweenZeroTwelve": { + "message": "يجب أن يكون الرمز 11 حرÙًا أو أقل." + }, + "syncWithMobile": { + "message": "مزامنة مع الهات٠المحمول" + }, + "syncWithMobileTitle": { + "message": "المزامنة مع الجهاز المحمول" + }, + "syncWithMobileDesc": { + "message": "يمكنك مزامنة حساباتك ومعلوماتك مع جهازك المحمول. Ø§ÙØªØ­ تطبيق MetaMask على الجهاز المحمول وانتقل إلى \"الإعدادات\" ثم انقر على \"المزامنة من Ø¥Ø¶Ø§ÙØ© Ø§Ù„Ù…ØªØµÙØ­\"" + }, + "syncWithMobileDescNewUsers": { + "message": "إذا قمت للتوّ Ø¨ÙØªØ­ تطبيق MetaMask للهوات٠المحمولة لأول مرة، ÙØ§ØªØ¨Ø¹ الخطوات الموجودة ÙÙŠ هاتÙÙƒ." + }, + "syncWithMobileScanThisCode": { + "message": "امسح هذا الرمز ضوئياً باستخدام تطبيق MetaMask للهوات٠المحمولة" + }, + "syncWithMobileBeCareful": { + "message": "تأكد من عدم قيام أي شخص آخر بالنظر إلى شاشتك عند مسح هذا الرمز" + }, + "syncWithMobileComplete": { + "message": "تمت مزامنة بياناتك بنجاح. استمتع بتطبيق MetaMask للهات٠المحمول!" + }, + "terms": { + "message": "شروط الاستخدام" + }, + "testFaucet": { + "message": "اختبار Faucet" + }, + "thisWillCreate": { + "message": "هذا سينشئ Ù…Ø­ÙØ¸Ø© جديدة وعبارة أمان" + }, + "tips": { + "message": "Ø§Ù„Ù…ÙƒØ§ÙØ¢Øª" + }, + "to": { + "message": "إلى" + }, + "token": { + "message": "عملة رمزية" + }, + "tokenAlreadyAdded": { + "message": "تمت Ø¥Ø¶Ø§ÙØ© العملة الرمزية Ø¨Ø§Ù„ÙØ¹Ù„." + }, + "tokenContractAddress": { + "message": "عنوان عقد العملة الرمزية" + }, + "tokenSymbol": { + "message": "رمز العملة الرمزية" + }, + "total": { + "message": "الإجمالي" + }, + "transaction": { + "message": "المعاملة" + }, + "transactionConfirmed": { + "message": "تم تأكيد المعاملة بقيمة $2." + }, + "transactionCreated": { + "message": "تم إنشاء المعاملة بقيمة $1 عند $2." + }, + "transactionDropped": { + "message": "Ø§Ù†Ø®ÙØ¶Øª المعاملة عند $2." + }, + "transactionSubmitted": { + "message": "تم تقديم المعاملة برسوم $1 من عملة جاس ÙÙŠ $2." + }, + "transactionResubmitted": { + "message": "زادت رسوم جاس على المعاملة التي أعيد تقديمها إلى $1 عند $2" + }, + "transactionUpdated": { + "message": "تم تحديث المعاملة ÙÙŠ $2." + }, + "transactionErrored": { + "message": "لقد حدث خطأ ما أثناء معالجة المعاملة." + }, + "transactionCancelAttempted": { + "message": "تمت محاولة إلغاء المعاملة برسوم $1 من عملة جاس ÙÙŠ $2" + }, + "transactionCancelSuccess": { + "message": "تم إلغاء المعاملة بنجاح عند $2" + }, + "transactionError": { + "message": "خطأ ÙÙŠ المعاملة. استثناء تم طرحه ÙÙŠ التعليمات البرمجية للعقد." + }, + "transactionErrorNoContract": { + "message": "جاري محاولة استدعاء ÙˆØ¸ÙŠÙØ© على عنوان غير ملتزم بعقد." + }, + "transactionFee": { + "message": "رسوم التحويل" + }, + "transactionTime": { + "message": "وقت المعاملة" + }, + "transfer": { + "message": "تحويل" + }, + "transferBetweenAccounts": { + "message": "التحويل بين حساباتي" + }, + "transferFrom": { + "message": "التحويل من" + }, + "troubleTokenBalances": { + "message": "واجهتنا مشكلة ÙÙŠ تحميل أرصدتك من العملات الرمزية. يمكنك الاطلاع عليها", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "إعادة المحاولة" + }, + "typePassword": { + "message": "أدخل كلمة مرور MetaMask الخاصة بك" + }, + "unapproved": { + "message": "تم Ø§Ù„Ø±ÙØ¶" + }, + "units": { + "message": "وحدات" + }, + "unknown": { + "message": "غير معروÙ" + }, + "unknownNetwork": { + "message": "شبكة خاصة مجهولة" + }, + "unknownQrCode": { + "message": "خطأ: لم نتمكن من تحديد رمز الاستجابة السريعة هذا" + }, + "unknownCameraErrorTitle": { + "message": "عذرًا! وقع خطأٌ ما..." + }, + "unknownCameraError": { + "message": "حدث خطأ أثناء محاولة الوصول إلى الكاميرا. ÙŠÙØ±Ø¬Ù‰ إعادة المحاولة..." + }, + "unlock": { + "message": "ÙØªØ­ القÙÙ„" + }, + "unlockMessage": { + "message": "شبكة الويب اللامركزية بانتظارك" + }, + "updatedWithDate": { + "message": "تم تحديث $1" + }, + "urlErrorMsg": { + "message": "تتطلب الروابط بادئة HTTP/HTTPS مناسبة." + }, + "usedByClients": { + "message": "مستخدمة من قبل مجموعة متنوعة من العملاء Ø§Ù„Ù…Ø®ØªÙ„ÙØ©" + }, + "userName": { + "message": "اسم المستخدم" + }, + "viewAccount": { + "message": "عرض حساب" + }, + "viewinExplorer": { + "message": "عرض ÙÙŠ Ù…ØªØµÙØ­ Explorer" + }, + "viewContact": { + "message": "عرض جهة الاتصال" + }, + "viewOnCustomBlockExplorer": { + "message": "عرض ÙÙŠ $1" + }, + "viewOnEtherscan": { + "message": "عرضه على Etherscan" + }, + "visitWebSite": { + "message": "قم بزيارة موقعنا على الإنترنت" + }, + "walletSeed": { + "message": "بذرة Ø§Ù„Ù…Ø­ÙØ¸Ø©" + }, + "welcomeBack": { + "message": "نرحب بعودتك!" + }, + "welcome": { + "message": "مرحباً بك ÙÙŠ MetaMask" + }, + "writePhrase": { + "message": "اكتب هذه العبارة على قطعة من الورق ÙˆØ§Ø­ÙØ¸Ù‡Ø§ ÙÙŠ مكان آمن. إذا كنت ترغب ÙÙŠ مزيد من الأمان، ÙØ§ÙƒØªØ¨Ù‡Ø§ على عدة أجزاء من الورق ÙˆØ§Ø­ÙØ¸Ù‡Ø§ ÙÙŠ مكانين أو 3 أماكن Ù…Ø®ØªÙ„ÙØ©." + }, + "yesLetsTry": { + "message": "نعم، دعنا نجرب" + }, + "youNeedToAllowCameraAccess": { + "message": "أنت بحاجة إلى السماح بالوصول إلى الكاميرا لاستخدام هذه الميزة." + }, + "yourSigRequested": { + "message": "جاري طلب توقيعك" + }, + "youSign": { + "message": "أنت بصدد التوقيع" + }, + "yourPrivateSeedPhrase": { + "message": "عبارة الأمان الشخصية الخاصة بك" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "سعر الغاز ØµÙØ± عند التعجيل" + } +} diff --git a/app/_locales/bg/messages.json b/app/_locales/bg/messages.json new file mode 100644 index 000000000000..21b285807382 --- /dev/null +++ b/app/_locales/bg/messages.json @@ -0,0 +1,1306 @@ +{ + "chartOnlyAvailableEth": { + "message": "Диаграмата е доÑтъпна Ñамо в мрежи на Ethereum." + }, + "contractInteraction": { + "message": "ВзаимодейÑтвие Ñ Ð´Ð¾Ð³Ð¾Ð²Ð¾Ñ€" + }, + "reject": { + "message": "ОтхвърлÑне" + }, + "about": { + "message": "ИнформациÑ" + }, + "aboutSettingsDescription": { + "message": "ВерÑиÑ, център за поддръжка и Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° контакт" + }, + "acceleratingATransaction": { + "message": "* УÑкорÑването на Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ñ‡Ñ€ÐµÐ· използване на по-виÑока цена на газа увеличава шанÑовете й да Ñе обработва по-бързо от мрежата, но това не винаги е гарантирано." + }, + "accessingYourCamera": { + "message": "ДоÑтъп до вашата камера ..." + }, + "account": { + "message": "Профил" + }, + "accountDetails": { + "message": "Детайли за акаунта" + }, + "accountName": { + "message": "Име на акаунта" + }, + "accountOptions": { + "message": "Опции за акаунт" + }, + "accountSelectionRequired": { + "message": "ТрÑбва да изберете акаунт!" + }, + "activityLog": { + "message": "Дневник на дейноÑтта" + }, + "addNetwork": { + "message": "ДобавÑне на мрежа" + }, + "addRecipient": { + "message": "Добавете получател" + }, + "advanced": { + "message": "Разширени" + }, + "advancedSettingsDescription": { + "message": "ДоÑтъп до функции за разработчици, изтеглÑйте дневници, нулиране на акаунта, теÑтови мрежи за наÑтройка и перÑонализиран RPC" + }, + "advancedOptions": { + "message": "Разширени опции" + }, + "addToAddressBook": { + "message": "ДобавÑне към адреÑната книга" + }, + "addToAddressBookModalPlaceholder": { + "message": "напр. Джон Д." + }, + "addAlias": { + "message": "Добавете пÑевдоним" + }, + "addToken": { + "message": "ДобавÑне на жетон" + }, + "addTokens": { + "message": "ДобавÑне на жетони" + }, + "addSuggestedTokens": { + "message": "Добавете препоръчани жетони" + }, + "addAcquiredTokens": { + "message": "Добавете жетоните, които Ñте придобили Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰Ñ‚Ð° на MetaMask" + }, + "amount": { + "message": "Сума" + }, + "appDescription": { + "message": "\nПортфейл за етереум в браузъра Ви", + "description": "The description of the application" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "approve": { + "message": "Одобри" + }, + "approved": { + "message": "Одобрено" + }, + "asset": { + "message": "Ðктив" + }, + "attemptingConnect": { + "message": "Опит за Ñвързване Ñ blockchain." + }, + "attemptToCancel": { + "message": "Опит за отказ?" + }, + "attemptToCancelDescription": { + "message": "Подаването на този опит не гарантира, че първоначалната Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ñ‰Ðµ бъде анулирана. Ðко опитът за анулиране е уÑпешен, ще ви бъде начиÑлена такÑата за транзакциÑта по-горе." + }, + "attributions": { + "message": "Функции" + }, + "autoLockTimeLimit": { + "message": "Таймер за автоматично излизане (минути)" + }, + "autoLockTimeLimitDescription": { + "message": "Задайте времето на неактивноÑÑ‚ в минути, преди MetaMask автоматично да Ви отпише от акаунта" + }, + "average": { + "message": "Средно аритметично" + }, + "back": { + "message": "Ðазад" + }, + "backToAll": { + "message": "Ðазад към вÑички" + }, + "backupApprovalNotice": { + "message": "Раправете резервно копие на Ð²Ð°ÑˆÐ¸Ñ Secret Recovery код, за да запазите портфейла и ÑредÑтвата Ñи." + }, + "backupApprovalInfo": { + "message": "Този Ñекретен код е необходим за възÑтановÑване на портфейла ви, в Ñлучай че загубите уÑтройÑтвото Ñи, забравите паролата Ñи, трÑбва да инÑталирате отново MetaMask или иÑкате да получите доÑтъп до портфейла Ñи на друго уÑтройÑтво." + }, + "backupNow": { + "message": "Ðрхивиране Ñега" + }, + "balance": { + "message": "БаланÑ" + }, + "balanceOutdated": { + "message": "БаланÑÑŠÑ‚ може да е оÑтарÑл" + }, + "basic": { + "message": "ОÑновни" + }, + "blockExplorerUrl": { + "message": "Блокиране на Explorer" + }, + "blockExplorerView": { + "message": "Преглед на акаунт на $1", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "Използване на Blockies Identicon" + }, + "browserNotSupported": { + "message": "Браузърът ви не Ñе поддържа ..." + }, + "builtInCalifornia": { + "message": "MetaMask е проектиран и Ñъздаден в КалифорниÑ." + }, + "buyWithWyre": { + "message": "Купете ETH Ñ Wyre" + }, + "buyWithWyreDescription": { + "message": "Wyre ви позволÑва да използвате кредитна карта, за да депозирате ETH право във вашата MetaMask Ñметка." + }, + "buyCoinSwitch": { + "message": "Купете на CoinSwitch" + }, + "buyCoinSwitchExplainer": { + "message": "CoinSwitch е деÑтинациÑта за еднократна размÑна, Ñ Ñ†ÐµÐ» да Ð¾Ð±Ð¼ÐµÐ½Ñ Ð¿Ð¾Ð²ÐµÑ‡Ðµ от 300 криптовалути Ñ Ð½Ð°Ð¹-добър курÑ." + }, + "bytes": { + "message": "Байта" + }, + "off": { + "message": "Изкл" + }, + "ok": { + "message": "ОК" + }, + "on": { + "message": "Включено" + }, + "optionalBlockExplorerUrl": { + "message": "Блокиране на Explorer URL (по избор)" + }, + "cancel": { + "message": "Отказ" + }, + "cancelAttempt": { + "message": "ОтмÑна на опита" + }, + "cancellationGasFee": { + "message": "ТакÑа в газ за анулиране " + }, + "cancelled": { + "message": "Отменен" + }, + "chainId": { + "message": "Идентификатор на веригата" + }, + "clickToRevealSeed": { + "message": "Кликнете тук, за да разкриете тайните думи" + }, + "close": { + "message": "ЗатварÑне" + }, + "chromeRequiredForHardwareWallets": { + "message": "За да Ñе Ñвържете Ñ Ñ…Ð°Ñ€Ð´ÑƒÐµÑ€Ð½Ð¸Ñ Ñи портфейл, трÑбва да използвате MetaMask в Google Chrome." + }, + "confirm": { + "message": "Потвърждаване" + }, + "confirmed": { + "message": "Потвърден" + }, + "confirmPassword": { + "message": "Потвърдете паролата" + }, + "confirmSecretBackupPhrase": { + "message": "Потвърдете ÑвоÑта тайна резервна фраза" + }, + "congratulations": { + "message": "ПоздравлениÑ" + }, + "connectHardwareWallet": { + "message": "Свържете хардуерен портфейл" + }, + "connect": { + "message": "Свързване" + }, + "connectingTo": { + "message": "Свързване Ñ $1" + }, + "connectingToKovan": { + "message": "Свързване Ñ Ñ‚ÐµÑтовата мрежа на Kovan" + }, + "connectingToMainnet": { + "message": "Свързване Ñ Ð³Ð»Ð°Ð²Ð½Ð°Ñ‚Ð° мрежа Ethereum" + }, + "connectingToRopsten": { + "message": "Свързване Ñ Ñ‚ÐµÑтова мрежа Ropsten" + }, + "connectingToRinkeby": { + "message": "Свързване Ñ Ñ‚ÐµÑтова мрежа на Rinkeby" + }, + "connectingToLocalhost": { + "message": "Свързване Ñ Localhost 8545" + }, + "connectingToGoerli": { + "message": "Свързване Ñ Ñ‚ÐµÑтова мрежа на Goerli" + }, + "continueToWyre": { + "message": "Продължете към Wyre" + }, + "continueToCoinSwitch": { + "message": "Продължете към CoinSwitch" + }, + "contractDeployment": { + "message": "Разгръщане на договор" + }, + "copiedExclamation": { + "message": "Копирано!" + }, + "copyAddress": { + "message": "Копирайте адреÑа в клипборда" + }, + "copyTransactionId": { + "message": "Копирайте Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¾Ð½Ð½Ð¸Ñ Ð½Ð¾Ð¼ÐµÑ€ на транзакциÑта" + }, + "copiedTransactionId": { + "message": "Копиран идентификационен номер на транзакциÑта" + }, + "copyToClipboard": { + "message": "Копиране в буферната памет" + }, + "copyPrivateKey": { + "message": "Това е ВашиÑÑ‚ личен ключ (кликнете, за да го копирате)" + }, + "create": { + "message": "Създаване" + }, + "createAccount": { + "message": "Създай акаунт" + }, + "createAWallet": { + "message": "Създайте портфейл" + }, + "createPassword": { + "message": "Създаване на парола" + }, + "currencyConversion": { + "message": "Конвертиране на валута" + }, + "currentLanguage": { + "message": "ÐаÑтоÑщ език" + }, + "customGas": { + "message": "ПерÑонализирайте газ" + }, + "customGasSubTitle": { + "message": "Увеличаването на такÑата може да намали времето за обработка, но това не е гарантирано." + }, + "customToken": { + "message": "ПерÑонализиран маркер" + }, + "customRPC": { + "message": "RPC по избор" + }, + "decimalsMustZerotoTen": { + "message": "ДеÑетичните знаци трÑбва да бъдат най-малко 0 и не повече от 36." + }, + "decimal": { + "message": "ТочноÑÑ‚ до деÑетични знаци" + }, + "defaultNetwork": { + "message": "Мрежата по подразбиране за Ether транзакции е Main Net." + }, + "delete": { + "message": "Изтриване" + }, + "deleteAccount": { + "message": "Изтриване на акаунт" + }, + "deposit": { + "message": "Депозит" + }, + "depositEther": { + "message": "Депозирайте етер" + }, + "details": { + "message": "ПодробноÑти" + }, + "directDepositEther": { + "message": "Директно депозиране на етер" + }, + "directDepositEtherExplainer": { + "message": "Ðко вече имате нÑкакъв етер, най-бързиÑÑ‚ начин да получите етер в Ð½Ð¾Ð²Ð¸Ñ Ñи портфейл е чрез директен депозит." + }, + "done": { + "message": "Готово" + }, + "downloadGoogleChrome": { + "message": "Изтеглете Google Chrome" + }, + "downloadSecretBackup": { + "message": "Изтеглете тази Ñекретна резервна фраза и Ñ ÑъхранÑвайте безопаÑно на външен криптиран твърд диÑк или ноÑител за Ñъхранение." + }, + "downloadStateLogs": { + "message": "Изтеглете държавни дневници" + }, + "dontHaveAHardwareWallet": { + "message": "ÐÑмате хардуерен портфейл?" + }, + "dropped": { + "message": "ПуÑнат" + }, + "edit": { + "message": "Редактиране" + }, + "editContact": { + "message": "Редактиране на контакт" + }, + "endOfFlowMessage1": { + "message": "Преминахте теÑта - пазете оÑновната Ñи фраза на Ñигурно мÑÑто, това е Ваша отговорноÑÑ‚!" + }, + "endOfFlowMessage2": { + "message": "Съвети за безопаÑното му ÑъхранÑване" + }, + "endOfFlowMessage3": { + "message": "Запазете резервно копие на нÑколко меÑта." + }, + "endOfFlowMessage4": { + "message": "Ðикога не ÑподелÑйте фразата Ñ Ð½Ð¸ÐºÐ¾Ð³Ð¾." + }, + "endOfFlowMessage5": { + "message": "Внимавайте Ñ Ñ„Ð¸ÑˆÐ¸Ð½Ð³Ð°! MetaMask никога нÑма да поиÑка Ñпонтанно вашата фраза зародиш." + }, + "endOfFlowMessage6": { + "message": "Ðко отново трÑбва да архивирате оÑновната Ñи фраза, можете да Ñ Ð½Ð°Ð¼ÐµÑ€Ð¸Ñ‚Ðµ в ÐаÑтройки -> Защита." + }, + "endOfFlowMessage7": { + "message": "Ðко имате въпроÑи или забележите нещо Ñъмнително, изпратете имейл на support@metamask.io." + }, + "endOfFlowMessage8": { + "message": "MetaMask не може да възÑтанови ключовата Ви фраза. Ðаучете повече." + }, + "endOfFlowMessage9": { + "message": "Ðаучете повече." + }, + "endOfFlowMessage10": { + "message": "Ð’Ñичко е готово" + }, + "ensRegistrationError": { + "message": "Грешка при региÑтрациÑта на име на ENS" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "Името на ENS не е намерено в текущата мрежа. Опитайте да преминете към оÑновната мрежа на етереум." + }, + "enterAnAlias": { + "message": "Въведете пÑевдоним" + }, + "enterPassword": { + "message": "Въведете парола" + }, + "enterPasswordContinue": { + "message": "Въведете парола, за да продължите" + }, + "ethereumPublicAddress": { + "message": "Публичен Ð°Ð´Ñ€ÐµÑ Ð·Ð° етереум" + }, + "etherscanView": { + "message": "Преглед на акаунта в Etherscan" + }, + "estimatedProcessingTimes": { + "message": "Приблизителни времена за обработка" + }, + "expandView": { + "message": "Разгъване на изглед" + }, + "exportPrivateKey": { + "message": "ЕкÑпортиране на чаÑтен ключ" + }, + "failed": { + "message": "ÐеуÑпешно" + }, + "fast": { + "message": "Бързо" + }, + "faster": { + "message": "По-бързо" + }, + "fileImportFail": { + "message": "Импортирането на файл не работи? ÐатиÑнете тук!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "ЗабравÑне на това уÑтройÑтво" + }, + "from": { + "message": "От" + }, + "functionType": { + "message": "Тип функциÑ" + }, + "gasLimit": { + "message": "Ограничение на газ" + }, + "gasLimitInfoModalContent": { + "message": "Ограничението за газ е макÑималното количеÑтво единици газ, което Ñте готови да похарчите." + }, + "gasLimitTooLow": { + "message": "Ограничението за газ трÑбва да бъде поне 21000" + }, + "gasUsed": { + "message": "Използван газ" + }, + "gasPrice": { + "message": "Цената на газа (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "Цена на газа е изключително ниÑка" + }, + "gasPriceInfoModalContent": { + "message": "Цената на газа Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтвото етер, което Ñте готови да платите за вÑÑка единица газ." + }, + "gasPriceNoDenom": { + "message": "Цена на газа" + }, + "general": { + "message": "Общ" + }, + "generalSettingsDescription": { + "message": "Конвертиране на валута, първична валута, език, блокчейн идентичноÑÑ‚" + }, + "getEther": { + "message": "Вземете етер" + }, + "getEtherFromFaucet": { + "message": "Вземете Ether от фоÑет за $1", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "Получете помощ." + }, + "getStarted": { + "message": "Първи Ñтъпки" + }, + "happyToSeeYou": { + "message": "Радваме Ñе да Ви видим." + }, + "hardware": { + "message": "хардуер" + }, + "hardwareWalletConnected": { + "message": "Свързан е хардуерен портфейл" + }, + "hardwareWallets": { + "message": "Свържете хардуерен портфейл" + }, + "hardwareWalletsMsg": { + "message": "Изберете хардуерен портфейл, който иÑкате да използвате Ñ MetaMask" + }, + "havingTroubleConnecting": { + "message": "Имате проблеми ÑÑŠÑ Ñвързването?" + }, + "here": { + "message": "тук", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hexData": { + "message": "ШеÑтнадеÑетични данни" + }, + "hide": { + "message": "Скриване" + }, + "hideTokenPrompt": { + "message": "Скриване на жетон?" + }, + "history": { + "message": "ИÑториÑ" + }, + "import": { + "message": "Импортиране", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "Импортиране на акаунт" + }, + "importAccountMsg": { + "message": "Импортираните акаунти нÑма да бъдат Ñвързани Ñ Ð¿ÑŠÑ€Ð²Ð¾Ð½Ð°Ñ‡Ð°Ð»Ð½Ð¾ Ñъздадената ви фраза за метаМаÑк акаунт. Ðаучете повече за импортираните акаунти" + }, + "importAccountSeedPhrase": { + "message": "Импортирайте акаунт Ñ Ñ„Ñ€Ð°Ð·Ð° зародиш" + }, + "importWallet": { + "message": "Импортиране на портфейла" + }, + "importYourExisting": { + "message": "Импортирайте ÑъщеÑÑ‚Ð²ÑƒÐ²Ð°Ñ‰Ð¸Ñ Ñи портфейл Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰Ñ‚Ð° на фраза зародиш Ñ 12 думи" + }, + "imported": { + "message": "Импортирани", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "Импортиране Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰Ñ‚Ð° на фразата зародиш на профила" + }, + "infoHelp": { + "message": "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¸ помощ" + }, + "initialTransactionConfirmed": { + "message": "Първоначалната Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð±ÐµÑˆÐµ потвърдена от мрежата. Кликнете върху OK, за да Ñе върнете обратно." + }, + "insufficientBalance": { + "message": "ÐедоÑтатъчно Ñалдо." + }, + "insufficientFunds": { + "message": "ÐедоÑтатъчно ÑредÑтва." + }, + "insufficientTokens": { + "message": "ÐедоÑтатъчен брой жетони." + }, + "invalidAddress": { + "message": "Ðевалиден адреÑ" + }, + "invalidAddressRecipient": { + "message": "ÐдреÑÑŠÑ‚ на Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ Ðµ невалиден" + }, + "knownAddressRecipient": { + "message": "ИзвеÑтен Ð°Ð´Ñ€ÐµÑ Ð½Ð° договора." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "Ðе е ETH мрежа, задаване на малки букви" + }, + "invalidInput": { + "message": "Ðевалидно въвеждане." + }, + "invalidRPC": { + "message": "Ðевалиден RPC URL адреÑ" + }, + "invalidBlockExplorerURL": { + "message": "Ðевалиден Block Explorer URL адреÑ" + }, + "invalidSeedPhrase": { + "message": "Ðевалидна фраза зародиш" + }, + "jsonFile": { + "message": "JSON файл", + "description": "format for importing an account" + }, + "kovan": { + "message": "ТеÑтова мрежа на Кован" + }, + "max": { + "message": "МакÑ" + }, + "learnMore": { + "message": "Ðаучете повече" + }, + "ledgerAccountRestriction": { + "message": "ТрÑбва да използвате поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ñи акаунт, преди да можете да добавите нов." + }, + "letsGoSetUp": { + "message": "Да, нека да наÑтроим нещата!" + }, + "likeToAddTokens": { + "message": "ИÑкате ли да добавите тези жетони?" + }, + "links": { + "message": "Връзки" + }, + "liveGasPricePredictions": { + "message": "Прогнози на живо за цената на газа" + }, + "loading": { + "message": "Зарежда Ñе..." + }, + "loadingTokens": { + "message": "Зареждане на жетони..." + }, + "loadMore": { + "message": "Зареди повече" + }, + "localhost": { + "message": "Локален хоÑÑ‚ 8545" + }, + "lock": { + "message": "Излизане" + }, + "mainnet": { + "message": "ОÑновна мрежа на Етереум" + }, + "memorizePhrase": { + "message": "Запомнете тази фраза." + }, + "memo": { + "message": "бележка" + }, + "message": { + "message": "Съобщение" + }, + "metamaskDescription": { + "message": "Свързва ви Ñ Ethereum и децентрализираната мрежа." + }, + "metamaskVersion": { + "message": "ВерÑÐ¸Ñ Ð½Ð° MetaMask" + }, + "mobileSyncText": { + "message": "МолÑ, въведете вашата парола, за да потвърдите, че Ñте вие!" + }, + "myAccounts": { + "message": "Моите акаунти" + }, + "myWalletAccounts": { + "message": "Моите акаунти в портфейла" + }, + "myWalletAccountsDescription": { + "message": "Ð’Ñичките ви Ñъздадени от MetaMask акаунти ще бъдат автоматично добавени в този раздел." + }, + "mustSelectOne": { + "message": "ТрÑбва да изберете поне 1 жетон." + }, + "needEtherInWallet": { + "message": "За да взаимодейÑтвате Ñ Ð´ÐµÑ†ÐµÐ½Ñ‚Ñ€Ð°Ð»Ð¸Ð·Ð¸Ñ€Ð°Ð½Ð¸Ñ‚Ðµ приложениÑ, използвайки MetaMask, ще ви е необходим етер в портфейла ви." + }, + "needImportFile": { + "message": "ТрÑбва да изберете файл за импортиране.", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "Ðе може да изпраща отрицателни Ñуми от ETH." + }, + "networkName": { + "message": "Име на мрежата" + }, + "networks": { + "message": "Mрежи" + }, + "networkSettingsDescription": { + "message": "Добавете и редактирайте перÑонализирани RPC мрежи" + }, + "nevermind": { + "message": "ÐÑма значение" + }, + "newAccount": { + "message": "Ðов акаунт" + }, + "newAccountDetectedDialogMessage": { + "message": "Открит е нов адреÑ! Кликнете тук, за да го добавите към вашата адреÑна книга." + }, + "newAccountNumberName": { + "message": "Ðкаунт $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "Ðов контакт" + }, + "newContract": { + "message": "Ðов договор" + }, + "newPassword": { + "message": "Ðова парола (мин. 8 Ñимвола)" + }, + "newNetwork": { + "message": "Ðова мрежа" + }, + "newToMetaMask": { + "message": "Ðови ли Ñте в MetaMask?" + }, + "noAlreadyHaveSeed": { + "message": "Ðе, вече имам фраза зародиш" + }, + "protectYourKeys": { + "message": "Защитете ключовете Ñи!" + }, + "protectYourKeysMessage1": { + "message": "Внимавайте Ñ Ð²Ð°ÑˆÐ°Ñ‚Ð° фраза - има ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð·Ð° уебÑайтове, които Ñе опитват да имитират MetaMask. MetaMask никога нÑма да поиÑка вашата фраза-зародиш!" + }, + "protectYourKeysMessage2": { + "message": "Пазете фразата Ñи. Ðко забележите нещо Ñъмнително или не Ñте Ñигурни за даден уебÑайт, изпратете имейл на support@metamask.io" + }, + "rpcUrl": { + "message": "Ðов URL Ð°Ð´Ñ€ÐµÑ Ð·Ð° RPC" + }, + "optionalChainId": { + "message": "ChainID (по избор)" + }, + "optionalSymbol": { + "message": "Символ (по избор)" + }, + "newTotal": { + "message": "Ðово общо" + }, + "newTransactionFee": { + "message": "Ðова такÑа за транзакциÑ" + }, + "next": { + "message": "Ðапред" + }, + "noAddressForName": { + "message": "За това име не е зададен адреÑ." + }, + "noConversionRateAvailable": { + "message": "ÐÑма наличен процент на преобръщане" + }, + "noTransactions": { + "message": "ÐÑмате транзакции" + }, + "notEnoughGas": { + "message": "ÐÑма доÑтатъчно газ" + }, + "noWebcamFoundTitle": { + "message": "Уебкамерата не е намерена" + }, + "noWebcamFound": { + "message": "Уеб камерата на компютърa Ви не беше намерена. МолÑ, опитайте отново." + }, + "ofTextNofM": { + "message": "на" + }, + "orderOneHere": { + "message": "Поръчайте Trezor или Ledger и запазете ÑредÑтвата Ñи " + }, + "origin": { + "message": "Произход" + }, + "parameters": { + "message": "Параметри" + }, + "participateInMetaMetrics": { + "message": "УчаÑтвайте в MetaMetrics" + }, + "participateInMetaMetricsDescription": { + "message": "УчаÑтвайте в MetaMetrics, за да ни помогнете да подобрим MetaMask" + }, + "password": { + "message": "Парола" + }, + "passwordsDontMatch": { + "message": "Паролите не Ñъвпадат" + }, + "passwordNotLongEnough": { + "message": "Паролата не е доÑтатъчно дълга" + }, + "pastePrivateKey": { + "message": "ПоÑтавете низ от Ð»Ð¸Ñ‡Ð½Ð¸Ñ Ñи ключ тук:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "в изчакване" + }, + "personalAddressDetected": { + "message": "Открит е личен адреÑ. Въведете адреÑа на договора за жетони." + }, + "prev": { + "message": "Предишен" + }, + "primaryCurrencySetting": { + "message": "ОÑновна валута" + }, + "primaryCurrencySettingDescription": { + "message": "Изберете меÑтна, за да приоритизирате показването на ÑтойноÑти в оÑновната валута на веригата (например ETH). Изберете Fiat, за да поÑтавите приоритет на показването на ÑтойноÑти в избраната от Ð²Ð°Ñ fiat валута." + }, + "privacyMsg": { + "message": "Политика за поверителноÑÑ‚" + }, + "privateKey": { + "message": "ЧаÑтен ключ", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "Предупреждение: Ðикога не разкривайте този ключ. Ð’Ñеки Ñ Ð´Ð¾Ñтъп до вашите лични ключове може да открадне вÑички активи, ÑъхранÑвани във Ð²Ð°ÑˆÐ¸Ñ Ð°ÐºÐ°ÑƒÐ½Ñ‚." + }, + "privateNetwork": { + "message": "ЧаÑтна мрежа" + }, + "queue": { + "message": "Опашка" + }, + "readdToken": { + "message": "Можете да добавите този жетон в бъдеще, като отидете на „ДобавÑне на жетон“ в менюто Ñ Ð¾Ð¿Ñ†Ð¸Ð¸ на акаунти." + }, + "recents": { + "message": "Скорошни" + }, + "recipientAddress": { + "message": "ÐÐ´Ñ€ÐµÑ Ð½Ð° получателÑ" + }, + "recipientAddressPlaceholder": { + "message": "ТърÑене, публичен Ð°Ð´Ñ€ÐµÑ (0x) или ENS" + }, + "rejectAll": { + "message": "Отхвърлете вÑички" + }, + "rejectTxsN": { + "message": "Отхвърлете $1 транзакции" + }, + "rejectTxsDescription": { + "message": "Ðа път Ñте да отхвърлите партида от $1 транзакции." + }, + "rejected": { + "message": "Отказан" + }, + "reset": { + "message": "Ðулиране" + }, + "resetAccount": { + "message": "Ðулиране на акаунта" + }, + "resetAccountDescription": { + "message": "Ðулирането на Ð²Ð°ÑˆÐ¸Ñ Ð°ÐºÐ°ÑƒÐ½Ñ‚ ще изчиÑти иÑториÑта на транзакциите ви." + }, + "deleteNetwork": { + "message": "Да Ñе изтрие ли мрежата?" + }, + "deleteNetworkDescription": { + "message": "ÐаиÑтина ли иÑкате да изтриете тази мрежа?" + }, + "remindMeLater": { + "message": "Ðапомни ми по-къÑно" + }, + "restoreFromSeed": { + "message": "Да Ñе възÑтанови ли акаунта?" + }, + "restoreAccountWithSeed": { + "message": "ВъзÑтановете акаунта Ñи Ñ Ñ„Ñ€Ð°Ð·Ð° зародиш" + }, + "requestsAwaitingAcknowledgement": { + "message": "иÑканиÑ, които чакат да бъдат потвърдени" + }, + "required": { + "message": "Задължително" + }, + "restore": { + "message": "ВъзÑтановÑване" + }, + "revealSeedWords": { + "message": "Разкрий думите зародиш" + }, + "revealSeedWordsTitle": { + "message": "Фраза зародиш" + }, + "revealSeedWordsDescription": { + "message": "Ðко нÑкога Ñмените браузъра или компютъра Ñи, тази ключова фраза ще Ви трÑбва за доÑтъп до Вашите акаунти. Запазете Ñ Ð½Ñкъде на Ñигурно и тайно мÑÑто." + }, + "revealSeedWordsWarningTitle": { + "message": "ÐЕ ÑподелÑйте тази фраза Ñ Ð½Ð¸ÐºÐ¾Ð³Ð¾!" + }, + "revealSeedWordsWarning": { + "message": "Тези думи могат да бъдат използвани за кражба на вÑички ваши акаунти." + }, + "remove": { + "message": "Премахване" + }, + "removeAccount": { + "message": "Премахване на профила" + }, + "removeAccountDescription": { + "message": "Този акаунт ще бъде премахнат от портфейла ви. МолÑ, уверете Ñе, че имате оригиналната фраза или чаÑтен ключ за този импортиран акаунт, преди да продължите. Можете да импортирате или Ñъздавате отново акаунти от падащото меню." + }, + "readyToConnect": { + "message": "Готови ли Ñте да Ñе Ñвържете? " + }, + "rinkeby": { + "message": "ТеÑтова мрежа на Rinkeby" + }, + "ropsten": { + "message": "ТеÑтова мрежа Ropsten" + }, + "goerli": { + "message": "ТеÑтова мрежа на Goerli" + }, + "save": { + "message": "Запазване" + }, + "slow": { + "message": "Бавно" + }, + "slower": { + "message": "По-бавно" + }, + "saveAsCsvFile": { + "message": "Запазване като CSV файл" + }, + "scanInstructions": { + "message": "ПоÑтавете QR кода пред камерата" + }, + "scanQrCode": { + "message": "Сканиране на QR код" + }, + "search": { + "message": "ТърÑене" + }, + "searchResults": { + "message": "Резултати от търÑенето" + }, + "secretBackupPhrase": { + "message": "Тайна резервна фраза" + }, + "secretBackupPhraseDescription": { + "message": "Вашата тайна резервна фраза улеÑнÑва архивирането и възÑтановÑването на акаунта ви." + }, + "secretBackupPhraseWarning": { + "message": "Ð’ÐИМÐÐИЕ: Ðикога не разкривайте резервната Ñи фраза. Ð’Ñеки Ñ Ñ‚Ð°Ð·Ð¸ фраза може да вземе Ð²Ð°ÑˆÐ¸Ñ ÐµÑ‚ÐµÑ€ завинаги." + }, + "secretPhrase": { + "message": "Въведете ÑвоÑта тайна фраза от дванадеÑет думи тук, за да възÑтановите портфейла Ñи." + }, + "securityAndPrivacy": { + "message": "СигурноÑÑ‚ и поверителноÑÑ‚" + }, + "securitySettingsDescription": { + "message": "ÐаÑтройки за поверителноÑÑ‚ и фраза зародиш за портфейла" + }, + "seedPhrasePlaceholder": { + "message": "Отделете вÑÑка дума Ñ ÐµÐ´Ð¸Ð½ интервал" + }, + "seedPhraseReq": { + "message": "Фразите зародиш Ñе ÑÑŠÑтоÑÑ‚ от 12 думи" + }, + "selectCurrency": { + "message": "Изберете валута" + }, + "selectEachPhrase": { + "message": "МолÑ, изберете вÑÑка фраза, за да Ñе уверите, че е правилна." + }, + "selectLocale": { + "message": "Изберете меÑтоположение" + }, + "selectType": { + "message": "Изберете тип" + }, + "send": { + "message": "Изпращане" + }, + "sendAmount": { + "message": "Изпратете Ñумата" + }, + "sendETH": { + "message": "Изпрати ETH" + }, + "sendTokens": { + "message": "Изпращане на жетони" + }, + "sentEther": { + "message": "изпратен етер" + }, + "sentTokens": { + "message": "изпратени жетони" + }, + "separateEachWord": { + "message": "Отделете вÑÑка дума Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð²Ð°Ð»" + }, + "searchTokens": { + "message": "ТърÑене на маркери" + }, + "selectAnAccount": { + "message": "Изберете акаунт" + }, + "selectAnAccountHelp": { + "message": "Изберете акаунта за преглед в MetaMask" + }, + "selectAHigherGasFee": { + "message": "\nИзберете по-виÑока такÑа за газ, за ​​да уÑкорите обработката на Вашата транзакциÑ.*" + }, + "selectHdPath": { + "message": "Изберете HD Path" + }, + "selectPathHelp": { + "message": "Ðко не виждате ÑъщеÑтвуващите Ñи акаунти в Ledger по-долу, опитайте да превключите пътеки към „Legacy (MEW / MyCrypto)“" + }, + "settings": { + "message": "ÐаÑтройки" + }, + "showAdvancedGasInline": { + "message": "Разширено управление на газа" + }, + "showAdvancedGasInlineDescription": { + "message": "Изберете това, за да покажете цените на газа и ограничите контрола директно на екраните за изпращане и потвърждение." + }, + "showFiatConversionInTestnets": { + "message": "Показване на преобразуването на Testnets" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Изберете това, за да покажете фиат преобразуване на Testnets" + }, + "showPrivateKeys": { + "message": "Показване на чаÑтни ключове" + }, + "showHexData": { + "message": "Показване на шеÑтнадеÑетични данни" + }, + "showHexDataDescription": { + "message": "Изберете това, за да Ñе покаже полето Ñ ÑˆÐµÑтнадеÑетични данни на екрана за изпращане" + }, + "sign": { + "message": "ПодпиÑ" + }, + "signatureRequest": { + "message": "ЗаÑвка за подпиÑ" + }, + "signed": { + "message": "ПодпиÑан" + }, + "signNotice": { + "message": "ПодпиÑването на това Ñъобщение може да има\nопаÑни Ñтранични ефекти. ПодпиÑвайте Ñамо ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚\nÑайтове, на които имате пълно доверие Ñ Ñ†ÐµÐ»Ð¸Ñ Ñи акаунт.\nТози опаÑен метод ще бъде премахнат в бъдеща верÑиÑ." + }, + "sigRequest": { + "message": "ЗаÑвка за подпиÑ" + }, + "somethingWentWrong": { + "message": "УпÑ! Ðещо Ñе обърка." + }, + "speedUp": { + "message": "УÑкори" + }, + "speedUpCancellation": { + "message": "УÑкорете това анулиране" + }, + "speedUpTransaction": { + "message": "УÑкорете тази транзакциÑ" + }, + "switchNetworks": { + "message": "Превключване на мрежи" + }, + "stateLogs": { + "message": "Държавни дневници" + }, + "stateLogsDescription": { + "message": "Държавните дневници Ñъдържат адреÑите на публичните ви акаунти и изпратените транзакции." + }, + "stateLogError": { + "message": "Грешка при извличането на дневници на ÑÑŠÑтоÑнието." + }, + "step1HardwareWallet": { + "message": "1. Свържете Ñ…Ð°Ñ€Ð´ÑƒÐµÑ€Ð½Ð¸Ñ Ð¿Ð¾Ñ€Ñ‚Ñ„ÐµÐ¹Ð»" + }, + "step1HardwareWalletMsg": { + "message": "Свържете Ñ…Ð°Ñ€Ð´ÑƒÐµÑ€Ð½Ð¸Ñ Ñи портфейл директно към компютъра." + }, + "step2HardwareWallet": { + "message": "2. Изберете акаунт" + }, + "step2HardwareWalletMsg": { + "message": "Изберете акаунта, който иÑкате да видите. Ð’ даден момент можете да изберете Ñамо един." + }, + "step3HardwareWallet": { + "message": "3. Започнете да използвате dApps и други!" + }, + "step3HardwareWalletMsg": { + "message": "Използвайте Ñ…Ð°Ñ€Ð´ÑƒÐµÑ€Ð½Ð¸Ñ Ñи акаунт, както бихте правили Ñ Ð²Ñеки акаунт в Ethereum. Влезте в dApps, изпратете Eth, купете и ÑъхранÑвайте жетони ERC20 и незаменими жетони като CryptoKitties." + }, + "storePhrase": { + "message": "СъхранÑвайте тази фраза в мениджър на пароли като 1Password." + }, + "submitted": { + "message": "Изпратен" + }, + "supportCenter": { + "message": "ПоÑетете Ð½Ð°ÑˆÐ¸Ñ Ñ†ÐµÐ½Ñ‚ÑŠÑ€ за поддръжка" + }, + "symbol": { + "message": "Символ" + }, + "symbolBetweenZeroTwelve": { + "message": "Символът трÑбва да е 11 Ñимвола или по-малко." + }, + "syncWithMobile": { + "message": "Синхронизиране Ñ Ð¼Ð¾Ð±Ð¸Ð»Ð½Ð¸ уÑтройÑтва" + }, + "syncWithMobileTitle": { + "message": "Синхронизиране Ñ Ð¼Ð¾Ð±Ð¸Ð»Ð½Ð¸ уÑтройÑтва" + }, + "syncWithMobileDesc": { + "message": "Можете да Ñинхронизирате вашите акаунти и Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ñ Ð¼Ð¾Ð±Ð¸Ð»Ð½Ð¾Ñ‚Ð¾ Ñи уÑтройÑтво. Отворете мобилното приложение MetaMask, отидете на „ÐаÑтройки“ и докоÑнете „Синхронизиране от разширението на браузъра“" + }, + "syncWithMobileDescNewUsers": { + "message": "Ðко отворите приложението MetaMask Mobile за първи път, проÑто Ñледвайте Ñтъпките в телефона Ñи." + }, + "syncWithMobileScanThisCode": { + "message": "Сканирайте този код Ñ Ð²Ð°ÑˆÐµÑ‚Ð¾ мобилно приложение MetaMask" + }, + "syncWithMobileBeCareful": { + "message": "Уверете Ñе, че никой друг не гледа екрана ви, когато Ñканирате този код" + }, + "syncWithMobileComplete": { + "message": "Вашите данни Ñа Ñинхронизирани уÑпешно. ÐаÑладете Ñе на мобилното приложение MetaMask!" + }, + "terms": { + "message": "УÑÐ»Ð¾Ð²Ð¸Ñ Ð·Ð° ползване" + }, + "testFaucet": { + "message": "ТеÑÑ‚ Faucet" + }, + "thisWillCreate": { + "message": "Това ще Ñъздаде нова фраза за портфейл и зародиш" + }, + "tips": { + "message": "ДарениÑ" + }, + "to": { + "message": "Ðа" + }, + "token": { + "message": "Жетон" + }, + "tokenAlreadyAdded": { + "message": "Жетонът вече е добавен." + }, + "tokenContractAddress": { + "message": "ÐÐ´Ñ€ÐµÑ Ð½Ð° договор за жетони" + }, + "tokenSymbol": { + "message": "Символ на маркер" + }, + "total": { + "message": "Общо" + }, + "transaction": { + "message": "транзакциÑ" + }, + "transactionConfirmed": { + "message": "ТранзакциÑта беше потвърдена при $2." + }, + "transactionCreated": { + "message": "ТранзакциÑта е Ñъздадена ÑÑŠÑ ÑтойноÑÑ‚ от $1 при $2." + }, + "transactionDropped": { + "message": "ТранзакциÑта Ñпадна на $2." + }, + "transactionSubmitted": { + "message": "ТранзакциÑ, изпратена Ñ Ñ‚Ð°ÐºÑа за газ от $1 при $2." + }, + "transactionResubmitted": { + "message": "Повторната Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ñ Ñ‚Ð°ÐºÑа за газ Ñе увеличи до $1 при $2" + }, + "transactionUpdated": { + "message": "ТранзакциÑта е актуализирана на $2." + }, + "transactionErrored": { + "message": "Възникна грешка в транзакциÑта." + }, + "transactionCancelAttempted": { + "message": "Опит за отмÑна на транзакциÑта Ñ Ñ‚Ð°ÐºÑа за газ от $1 при $2" + }, + "transactionCancelSuccess": { + "message": "ТранзакциÑта беше уÑпешно отменена при $2" + }, + "transactionError": { + "message": "Грешка при транзакциÑта. Беше върнато изключение в кода на договора." + }, + "transactionErrorNoContract": { + "message": "Опит за извикване на Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ð° Ð¸Ð·Ð²ÑŠÐ½Ð´Ð¾Ð³Ð¾Ð²Ð¾Ñ€Ð½Ð¸Ñ Ð°Ð´Ñ€ÐµÑ." + }, + "transactionFee": { + "message": "ТакÑа за транзакциÑ" + }, + "transactionTime": { + "message": "Време на транзакциÑ" + }, + "transfer": { + "message": "ТранÑфер" + }, + "transferBetweenAccounts": { + "message": "ПрехвърлÑне между моите акаунти" + }, + "transferFrom": { + "message": "ТранÑфер от" + }, + "troubleTokenBalances": { + "message": "Имахме проблеми ÑÑŠÑ Ð·Ð°Ñ€ÐµÐ¶Ð´Ð°Ð½ÐµÑ‚Ð¾ на вашите Ñимволи. Можете да ги видите", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "Ðов опит" + }, + "typePassword": { + "message": "Въведете паролата Ñи за MetaMask" + }, + "unapproved": { + "message": "Ðеодобрено" + }, + "units": { + "message": "елементи" + }, + "unknown": { + "message": "ÐеизвеÑтно" + }, + "unknownNetwork": { + "message": "ÐеизвеÑтна чаÑтна мрежа" + }, + "unknownQrCode": { + "message": "Грешка: Ðе можахме да идентифицираме този QR код" + }, + "unknownCameraErrorTitle": { + "message": "УпÑ! Ðещо Ñе обърка...." + }, + "unknownCameraError": { + "message": "При опита за доÑтъп до камерата Ви възникна грешка. МолÑ, опитайте отново..." + }, + "unlock": { + "message": "Отключване" + }, + "unlockMessage": { + "message": "Децентрализираната мрежа очаква" + }, + "updatedWithDate": { + "message": "Ðктуализирано $1 " + }, + "urlErrorMsg": { + "message": "URI изиÑкват ÑÑŠÐ¾Ñ‚Ð²ÐµÑ‚Ð½Ð¸Ñ HTTP / HTTPS префикÑ." + }, + "usedByClients": { + "message": "Използва Ñе от различни клиенти" + }, + "userName": { + "message": "ПотребителÑко име" + }, + "viewAccount": { + "message": "Преглед на профила" + }, + "viewinExplorer": { + "message": "Преглед в Explorer" + }, + "viewContact": { + "message": "Преглед на контакта" + }, + "viewOnCustomBlockExplorer": { + "message": "Преглед на $1" + }, + "viewOnEtherscan": { + "message": "Преглед на Etherscan" + }, + "visitWebSite": { + "message": "ПоÑетете нашиÑÑ‚ уеб Ñайт" + }, + "walletSeed": { + "message": "Ðачална фраза за портфейл " + }, + "welcomeBack": { + "message": "Добре дошли отново!" + }, + "welcome": { + "message": "Добре дошли в MetaMask" + }, + "writePhrase": { + "message": "Ðапишете тази фраза на лиÑÑ‚ Ñ…Ð°Ñ€Ñ‚Ð¸Ñ Ð¸ Ñ ÑъхранÑвайте на Ñигурно мÑÑто. Ðко иÑкате още по-голÑма ÑигурноÑÑ‚, запишете Ñ Ð½Ð° нÑколко лиÑта Ñ…Ð°Ñ€Ñ‚Ð¸Ñ Ð¸ ги ÑъхранÑвайте на 2 - 3 различни меÑта." + }, + "yesLetsTry": { + "message": "Да, нека опитаме" + }, + "youNeedToAllowCameraAccess": { + "message": "ТрÑбва да разрешите доÑтъпа на камерата, за да използвате тази функциÑ." + }, + "yourSigRequested": { + "message": "ИзиÑква Ñе вашиÑÑ‚ подпиÑ" + }, + "youSign": { + "message": "Вие подпиÑвате" + }, + "yourPrivateSeedPhrase": { + "message": "Вашата лична фраза зародиш" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "Ðулева цена на газ при уÑкорÑване" + } +} diff --git a/app/_locales/bn/messages.json b/app/_locales/bn/messages.json new file mode 100644 index 000000000000..773217e6dd39 --- /dev/null +++ b/app/_locales/bn/messages.json @@ -0,0 +1,1310 @@ +{ + "chartOnlyAvailableEth": { + "message": "শà§à¦§à§à¦®à¦¾à¦¤à§à¦° Ethereum নেটওয়ারà§à¦•গà§à¦²à¦¿à¦¤à§‡ চারà§à¦Ÿ উপলভà§à¦¯à¥¤ " + }, + "contractInteraction": { + "message": "কনà§à¦Ÿà§à¦°à§à¦¯à¦¾à¦•à§à¦Ÿ বাকà§à¦¯à¦¾à¦²à¦¾à¦ª" + }, + "reject": { + "message": "পà§à¦°à¦¤à§à¦¯à¦¾à¦–à§à¦¯à¦¾à¦¨" + }, + "about": { + "message": "সমà§à¦ªà¦°à§à¦•ে" + }, + "aboutSettingsDescription": { + "message": "সংসà§à¦•রণ, সহায়তা কেনà§à¦¦à§à¦°, à¦à¦¬à¦‚ যোগাযোগের তথà§à¦¯à¥¤" + }, + "acceleratingATransaction": { + "message": "* à¦à¦•টি উচà§à¦šà¦¤à¦° গà§à¦¯à¦¾à¦¸à§‡à¦° মূলà§à¦¯ বà§à¦¯à¦¬à¦¹à¦¾à¦° করে à¦à¦•টি লেনদেনের গতি বৃদà§à¦§à¦¿ নেটওয়ারà§à¦•ের দà§à¦¬à¦¾à¦°à¦¾ সেটির পà§à¦°à¦•à§à¦°à¦¿à§Ÿà¦¾à¦•রণ দà§à¦°à§à¦¤à¦¤à¦° হওয়ার সমà§à¦­à¦¾à¦¬à¦¨à¦¾ বৃদà§à¦§à¦¿ করে, কিনà§à¦¤à§ সবসময় সেটির নিশà§à¦šà§Ÿà¦¤à¦¾ দেওয়া যায় না।" + }, + "accessingYourCamera": { + "message": "আপনার কà§à¦¯à¦¾à¦®à§‡à¦°à¦¾ অà§à¦¯à¦¾à¦•à§à¦¸à§‡à¦¸ করছে..." + }, + "account": { + "message": "অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ" + }, + "accountDetails": { + "message": "অà§à¦¯à¦¾à¦•াউনà§à¦Ÿà§‡à¦° বিশদ" + }, + "accountName": { + "message": "অà§à¦¯à¦¾à¦•াউনà§à¦Ÿà§‡à¦° নাম" + }, + "accountOptions": { + "message": "অà§à¦¯à¦¾à¦•াউনà§à¦Ÿà§‡à¦° বিকলà§à¦ªà¦—à§à¦²à¦¿" + }, + "accountSelectionRequired": { + "message": "আপনাকে à¦à¦•টি অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ নিরà§à¦¬à¦¾à¦šà¦¨ করতে হবে!" + }, + "activityLog": { + "message": "কারà§à¦¯à¦•লাপের লগ" + }, + "addNetwork": { + "message": "নেটওয়ারà§à¦• যোগ করà§à¦¨" + }, + "addRecipient": { + "message": "পà§à¦°à¦¾à¦ªà¦• যোগ করà§à¦¨" + }, + "advanced": { + "message": "উনà§à¦¨à¦¤" + }, + "advancedSettingsDescription": { + "message": "ডেভেলপারের বৈশিষà§à¦Ÿà§à¦¯à¦—à§à¦²à¦¿ অà§à¦¯à¦¾à¦•à§à¦¸à§‡à¦¸ করà§à¦¨, সà§à¦Ÿà§‡à¦Ÿ লগগà§à¦²à¦¿ ডাউনলোড করà§à¦¨, অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ রিসেট করà§à¦¨, টেসà§à¦Ÿà¦¨à§‡à¦Ÿà¦¸ à¦à¦¬à¦‚ কাসà§à¦Ÿà¦® RPC সেটআপ করà§à¦¨à¥¤" + }, + "advancedOptions": { + "message": "উনà§à¦¨à¦¤ বিকলà§à¦ªà¦¸à¦®à§‚হ" + }, + "addToAddressBook": { + "message": "অà§à¦¯à¦¾à¦¡à§à¦°à§‡à¦¸ বà§à¦•ে যোগ করà§à¦¨" + }, + "addToAddressBookModalPlaceholder": { + "message": "যেমন জন.ডি." + }, + "addAlias": { + "message": "উপনাম যোগ করà§à¦¨" + }, + "addToken": { + "message": "টোকেন যোগ করà§à¦¨" + }, + "addTokens": { + "message": "টোকেনগà§à¦²à¦¿ যোগ করà§à¦¨" + }, + "addSuggestedTokens": { + "message": "পà§à¦°à¦¸à§à¦¤à¦¾à¦¬à¦¿à¦¤ টোকেনগà§à¦²à¦¿ যোগ করà§à¦¨" + }, + "addAcquiredTokens": { + "message": "MetaMask বà§à¦¯à¦¬à¦¹à¦¾à¦° করে আপনি যে টোকেনগà§à¦²à¦¿ অরà§à¦œà¦¨ করেছেন সেগà§à¦²à¦¿ যোগ করà§à¦¨" + }, + "amount": { + "message": "পরিমান" + }, + "appDescription": { + "message": "আপনার বà§à¦°à¦¾à¦‰à¦œà¦¾à¦°à§‡ à¦à¦•টি Ethereum ওয়ালেট", + "description": "The description of the application" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "approve": { + "message": "অনà§à¦®à§‹à¦¦à¦¨ করà§à¦¨" + }, + "approved": { + "message": "অনà§à¦®à§‹à¦¦à¦¿à¦¤" + }, + "asset": { + "message": "সমà§à¦ªà¦¦" + }, + "attemptingConnect": { + "message": "বà§à¦²à¦•চেনে সংযোগ করার চেষà§à¦Ÿà¦¾ করছে।" + }, + "attemptToCancel": { + "message": "বাতিল করার চেষà§à¦Ÿà¦¾ করছেন?" + }, + "attemptToCancelDescription": { + "message": "à¦à¦‡ পà§à¦°à¦šà§‡à¦·à§à¦Ÿà¦¾à¦Ÿà¦¿ জমা দেওয়া আপনার পà§à¦°à¦•ৃত লেনদেনটি বাতিল হয়ে যাবে à¦à¦®à¦¨ নিশà§à¦šà§Ÿà¦¤à¦¾ দেয় না। বাতিল করার পà§à¦°à¦šà§‡à¦·à§à¦Ÿà¦¾à¦Ÿà¦¿ সফল হলে, আপনাকে উপরের লেনদেন ফী চারà§à¦œ করা হবে।" + }, + "attributions": { + "message": "গà§à¦£à¦¾à¦¬à¦²à§€" + }, + "autoLockTimeLimit": { + "message": "সà§à¦¬à§Ÿà¦‚কà§à¦°à¦¿à§Ÿ-লগ আউট টাইমার (মিনিট)" + }, + "autoLockTimeLimitDescription": { + "message": "MetaMask সà§à¦¬à§Ÿà¦‚কà§à¦°à¦¿à§Ÿà¦­à¦¾à¦¬à§‡ লগ আউট করার আগে নিষà§à¦•à§à¦°à¦¿à§Ÿ থাকার সময় মিনিটে সেট করà§à¦¨" + }, + "average": { + "message": "গড়" + }, + "back": { + "message": "ফিরà§à¦¨" + }, + "backToAll": { + "message": "সমসà§à¦¤à¦¤à§‡ ফিরে আসà§à¦¨" + }, + "backupApprovalNotice": { + "message": "আপনার ওয়ালেট à¦à¦¬à¦‚ তহবিল সà§à¦°à¦•à§à¦·à¦¿à¦¤ রাখতে আপনার গোপন পà§à¦¨à¦°à§à¦¦à§à¦§à¦¾à¦°à§‡à¦° কোড বà§à¦¯à¦¾à¦• আপ করà§à¦¨à¥¤" + }, + "backupApprovalInfo": { + "message": "আপনি আপনার ডিভাইস হারিয়ে ফেললে, পাসওয়ারà§à¦¡ ভà§à¦²à§‡ গেলে, MetaMask রিইনসà§à¦Ÿà¦² করতে হলে বা অনà§à¦¯ ডিভাইসে আপনার ওয়ালেট অà§à¦¯à¦¾à¦•à§à¦¸à§‡à¦¸ করার কà§à¦·à§‡à¦¤à§à¦°à§‡ আপনার ওয়ালেট পà§à¦¨à¦°à§à¦¦à§à¦§à¦¾à¦° করতে à¦à¦‡ গোপন কোডটি পà§à¦°à§Ÿà§‹à¦œà¦¨à¥¤" + }, + "backupNow": { + "message": "à¦à¦–নওই বà§à¦¯à¦¾à¦•আপ নিন " + }, + "balance": { + "message": "বà§à¦¯à¦¾à¦²à§‡à¦¨à§à¦¸" + }, + "balanceOutdated": { + "message": "বà§à¦¯à¦¾à¦²à§‡à¦¨à§à¦¸ অনেক পà§à¦°à¦¾à¦¨à§‹ হতে পারে" + }, + "basic": { + "message": "পà§à¦°à¦¾à¦¥à¦®à¦¿à¦•" + }, + "blockExplorerUrl": { + "message": "à¦à¦•à§à¦¸à¦ªà§à¦²à§‹à¦°à¦¾à¦° বà§à¦²à¦• করà§à¦¨" + }, + "blockExplorerView": { + "message": "$1 ঠঅà§à¦¯à¦¾à¦•াউনà§à¦Ÿ দেখà§à¦¨", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "বà§à¦²à¦•িজ আইডেনà§à¦Ÿà¦¿à¦•ন বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨" + }, + "browserNotSupported": { + "message": "আপনার বà§à¦°à¦¾à¦‰à¦œà¦¾à¦° সমরà§à¦¥à¦¿à¦¤ নয়..." + }, + "builtInCalifornia": { + "message": "MetaMask কà§à¦¯à¦¾à¦²à¦¿à¦«à§‹à¦°à§à¦¨à¦¿à§Ÿà¦¾à¦¤à§‡ ডিজাইন করা à¦à¦¬à¦‚ নিরà§à¦®à¦¿à¦¤à¥¤" + }, + "buyWithWyre": { + "message": "Wyre দিয়ে ETH কà§à¦°à§Ÿ করà§à¦¨" + }, + "buyWithWyreDescription": { + "message": "Wyre আপনার MetaMask অà§à¦¯à¦¾à¦•াউনà§à¦Ÿà§‡ সরাসরি ETH জমা করতে আপনাকে à¦à¦•টি কà§à¦°à§‡à¦¡à¦¿à¦Ÿ কারà§à¦¡ বà§à¦¯à¦¬à¦¹à¦¾à¦° করতে দেয়।" + }, + "buyCoinSwitch": { + "message": "CoinSwitch ঠকà§à¦°à§Ÿ করà§à¦¨" + }, + "buyCoinSwitchExplainer": { + "message": "CoinSwitch হল 300রও বেশি কà§à¦°à¦¿à¦ªà§à¦Ÿà§‹à¦•ারেনà§à¦¸à¦¿ সরà§à¦¬à§‹à¦¤à§à¦¤à¦® হারে বিনময় করার সবথেকে ভালো সà§à¦¥à¦¾à¦¨à¥¤" + }, + "bytes": { + "message": "বাইটস" + }, + "off": { + "message": "বনà§à¦§" + }, + "ok": { + "message": "ঠিক আছে" + }, + "on": { + "message": "চালà§" + }, + "optionalBlockExplorerUrl": { + "message": "à¦à¦•à§à¦¸à¦ªà§à¦²à§‹à¦°à¦¾à¦° URL বà§à¦²à¦• করà§à¦¨ (à¦à¦šà§à¦›à¦¿à¦•)" + }, + "cancel": { + "message": "বাতিল করà§à¦¨" + }, + "cancelAttempt": { + "message": "পà§à¦°à¦šà§‡à¦·à§à¦Ÿà¦¾ বাতিল করà§à¦¨" + }, + "cancellationGasFee": { + "message": "বাতিল করার গà§à¦¯à¦¾à¦¸ ফী" + }, + "cancelled": { + "message": "বাতিল করা হয়েছে" + }, + "chainId": { + "message": "চেন আইডি" + }, + "clickToRevealSeed": { + "message": "গোপন শবà§à¦¦à¦—à§à¦²à¦¿ পà§à¦°à¦•াশ করতে à¦à¦–ানে কà§à¦²à¦¿à¦• করà§à¦¨" + }, + "close": { + "message": "বনà§à¦§ করà§à¦¨" + }, + "chromeRequiredForHardwareWallets": { + "message": "আপনার হারà§à¦¡à¦“à§Ÿà§à¦¯à¦¾à¦° ওয়ালেটের সাথে সংযোগ করতে আপনাকে Google Chrome ঠMetaMask বà§à¦¯à¦¬à¦¹à¦¾à¦° করতে হবে। " + }, + "confirm": { + "message": "নিশà§à¦šà¦¿à¦¤ হন" + }, + "confirmed": { + "message": "নিশà§à¦šà¦¿à¦¤ করা হয়েছে" + }, + "confirmPassword": { + "message": "পাসওয়ারà§à¦¡ নিশà§à¦šà¦¿à¦¤ করà§à¦¨" + }, + "confirmSecretBackupPhrase": { + "message": "আপনার গোপন বà§à¦¯à¦¾à¦• আপ ফà§à¦°à§‡à¦œ নিশà§à¦šà¦¿à¦¤ করà§à¦¨" + }, + "congratulations": { + "message": "অভিননà§à¦¦à¦¨" + }, + "connectHardwareWallet": { + "message": "হারà§à¦¡à¦“à§Ÿà§à¦¯à¦¾à¦° ওয়ালেট সংযà§à¦•à§à¦¤ করà§à¦¨" + }, + "connect": { + "message": "সংযà§à¦•à§à¦¤ করà§à¦¨" + }, + "connectingTo": { + "message": " $1 à¦à¦° সাথে সংযোগ করছে" + }, + "connectingToKovan": { + "message": "কোভান টেসà§à¦Ÿ নেটওয়ারà§à¦•ের সাথে সংযোগ করছে" + }, + "connectingToMainnet": { + "message": "মà§à¦–à§à¦¯ Ethereum নেটওয়ারà§à¦•ের সাথে সংযোগ করছে" + }, + "connectingToRopsten": { + "message": "রপসà§à¦Ÿà§‡à¦¨ টেসà§à¦Ÿ নেটওয়ারà§à¦•ের সাথে সংযোগ করছে" + }, + "connectingToRinkeby": { + "message": "রিঙà§à¦•েবি টেসà§à¦Ÿ নেটওয়ারà§à¦•ের সাথে সংযোগ করছে" + }, + "connectingToLocalhost": { + "message": "লোকালহোসà§à¦Ÿ 8545 à¦à¦° সাথে সংযোগ করছে" + }, + "connectingToGoerli": { + "message": "গোয়েরলি টেসà§à¦Ÿ নেটওয়ারà§à¦•ের সাথে সংযোগ করা হচà§à¦›à§‡" + }, + "continueToWyre": { + "message": "Wyre ঠঅবিরত রাখà§à¦¨" + }, + "continueToCoinSwitch": { + "message": "CoinSwitch ঠঅবিরত থাকà§à¦¨" + }, + "contractDeployment": { + "message": "কনà§à¦Ÿà§à¦°à§à¦¯à¦¾à¦•à§à¦Ÿ নিয়োজন" + }, + "copiedExclamation": { + "message": "কপি করা হয়েছে!" + }, + "copyAddress": { + "message": "কà§à¦²à¦¿à¦ªà¦¬à§‹à¦°à§à¦¡à§‡ ঠিকানা কপি করà§à¦¨" + }, + "copyTransactionId": { + "message": "লেনদেনের আইডি কপি করà§à¦¨" + }, + "copiedTransactionId": { + "message": "কপি করা লেনদেনের আইডি" + }, + "copyToClipboard": { + "message": "কà§à¦²à¦¿à¦ªà¦¬à§‹à¦°à§à¦¡à§‡ কপি করà§à¦¨" + }, + "copyPrivateKey": { + "message": "à¦à¦Ÿà¦¿ হল আপনার গোপন কী (কপি করতে কà§à¦²à¦¿à¦• করà§à¦¨)" + }, + "create": { + "message": "তৈরি করà§à¦¨" + }, + "createAccount": { + "message": "অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ তৈরি করà§à¦¨" + }, + "createAWallet": { + "message": "à¦à¦•টি ওয়ালেট তৈরি করà§à¦¨" + }, + "createPassword": { + "message": "পাসওয়ারà§à¦¡ তৈরি করà§à¦¨" + }, + "currencyConversion": { + "message": "মà§à¦¦à§à¦°à¦¾ বিনিময়" + }, + "currentLanguage": { + "message": "বরà§à¦¤à¦®à¦¾à¦¨ ভাষা" + }, + "customGas": { + "message": "গà§à¦¯à¦¾à¦¸ কাসà§à¦Ÿà§‹à¦®à¦¾à¦‡à¦œ করà§à¦¨" + }, + "customGasSubTitle": { + "message": "ফী বৃদà§à¦§à¦¿ করা পà§à¦°à¦•à§à¦°à¦¿à§Ÿà¦¾à¦•রণের সময় কমাতে পারে, কিনà§à¦¤à§ সেটির নিশà§à¦šà§Ÿà¦¤à¦¾ দেওয়া হয় না।" + }, + "customToken": { + "message": "কাসà§à¦Ÿà¦® টোকেন" + }, + "customRPC": { + "message": "কাসà§à¦Ÿà¦® RPC" + }, + "decimalsMustZerotoTen": { + "message": "দশমিকগà§à¦²à¦¿ অবশà§à¦¯à¦‡ অনà§à¦¤à¦¤ 0 হতে হবে, à¦à¦¬à¦‚ 36 à¦à¦° উপর হবে না।" + }, + "decimal": { + "message": "নিরà§à¦­à§à¦²à¦¤à¦¾à¦° দশমিক" + }, + "defaultNetwork": { + "message": "ইথার লেনদেনগà§à¦²à¦¿à¦° জনà§à¦¯ ডিফলà§à¦Ÿ নেটওয়ারà§à¦•টি হল মেন নেট।" + }, + "delete": { + "message": "মà§à¦›à§à¦¨" + }, + "deleteAccount": { + "message": "অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ মà§à¦›à§à¦¨" + }, + "deposit": { + "message": "জমা " + }, + "depositEther": { + "message": "ইথার জমা করà§à¦¨" + }, + "details": { + "message": "বিশদ বিবরণ" + }, + "directDepositEther": { + "message": "সরাসরি ইথার জমা করà§à¦¨" + }, + "directDepositEtherExplainer": { + "message": "আপনার ইতিমধà§à¦¯à§‡ কিছৠইথার থেকে থাকলে আপনার নতà§à¦¨ ওয়ালেটে ইথার পাওয়ার দà§à¦°à§à¦¤à¦¤à¦® উপায় হল সরাসরি জমা করা।" + }, + "done": { + "message": "সমà§à¦ªà¦¨à§à¦¨ " + }, + "downloadGoogleChrome": { + "message": "Google Chrome ডাউনলোড করà§à¦¨" + }, + "downloadSecretBackup": { + "message": "à¦à¦‡ গোপন বà§à¦¯à¦¾à¦•আপ বাকà§à¦¯à¦¾à¦‚শটি ডাউনলোড করà§à¦¨ à¦à¦¬à¦‚ à¦à¦•টি বাইরের à¦à¦¨à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ করা হারà§à¦¡ ডà§à¦°à¦¾à¦‡à¦­ বা সà§à¦Ÿà§‹à¦°à§‡à¦œà§‡à¦° বনà§à¦¦à§‹à¦¬à¦¸à§à¦¤à§‡ নিরাপদে সংরকà§à¦·à¦£ করà§à¦¨à¥¤" + }, + "downloadStateLogs": { + "message": "সà§à¦Ÿà§‡à¦Ÿ লগগà§à¦²à¦¿ ডাউনলোড করà§à¦¨" + }, + "dontHaveAHardwareWallet": { + "message": "à¦à¦•টি হারà§à¦¡à¦“à§Ÿà§à¦¯à¦¾à¦° ওয়ালেট নেই?" + }, + "dropped": { + "message": "নেমে গেছে" + }, + "edit": { + "message": "সমà§à¦ªà¦¾à¦¦à¦¨à¦¾" + }, + "editContact": { + "message": "পরিচিতি সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করà§à¦¨" + }, + "endOfFlowMessage1": { + "message": "আপনি টেসà§à¦Ÿà¦Ÿà¦¿ পাস করেছেন - আপনার সীডফà§à¦°à§‡à¦œ নিরাপদে রাখà§à¦¨, à¦à¦Ÿà¦¿ আপনার দায়িতà§à¦¬!" + }, + "endOfFlowMessage2": { + "message": "সেটি নিরাপদে সংরকà§à¦·à¦£ করার পরামরà§à¦¶" + }, + "endOfFlowMessage3": { + "message": "à¦à¦•াধিক সà§à¦¥à¦¾à¦¨à§‡ à¦à¦•টি বà§à¦¯à¦¾à¦•আপ রেখে দিন।" + }, + "endOfFlowMessage4": { + "message": "ফà§à¦°à§‡à¦œà¦Ÿà¦¿ কখনও কারোর সাথে শেয়ার করবেন না।" + }, + "endOfFlowMessage5": { + "message": "ফিসিং থেকে সাবধান! MetaMask কখনই নিজের থেকে আপনার সীড ফà§à¦°à§‡à¦œ জিজà§à¦žà¦¾à¦¸à¦¾ করবে না।" + }, + "endOfFlowMessage6": { + "message": "আপনাকে আপনার সীড আবার বà§à¦¯à¦¾à¦•আপ করতে হলে, আপনি সেটি সেটিংস -> নিরাপতà§à¦¤à¦¾à§Ÿ পাবেন।" + }, + "endOfFlowMessage7": { + "message": "আপনার কখনও কোনো পà§à¦°à¦¶à§à¦¨ থাকলে বা সনà§à¦¦à§‡à¦¹à¦œà¦¨à¦• কিছৠদেখলে, support@metamask.io ঠিকানায় ইমেল করà§à¦¨à¥¤" + }, + "endOfFlowMessage8": { + "message": "MetaMask আপনার সীডফà§à¦°à§‡à¦œ পà§à¦¨à¦°à§à¦¦à§à¦§à¦¾à¦° করতে পারবে না। আরও জানà§à¦¨à¥¤" + }, + "endOfFlowMessage9": { + "message": "আরও জানà§à¦¨à¥¤" + }, + "endOfFlowMessage10": { + "message": "সব সমà§à¦ªà¦¨à§à¦¨ হয়েছে" + }, + "ensRegistrationError": { + "message": "ENS নাম নিবনà§à¦§à§€à¦•রণে তà§à¦°à§à¦Ÿà¦¿ হয়েছে" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "ENS নাম বরà§à¦¤à¦®à¦¾à¦¨ নেটওয়ারà§à¦•ে খà§à¦à¦œà§‡ পাওয়া যায় নি। মূল Ethereum নেটওয়ারà§à¦•ে বদলানোর চেষà§à¦Ÿà¦¾ করà§à¦¨à¥¤" + }, + "enterAnAlias": { + "message": "à¦à¦•টি উপনাম লিখà§à¦¨" + }, + "enterPassword": { + "message": "পাসওয়ারà§à¦¡ লিখà§à¦¨" + }, + "enterPasswordContinue": { + "message": "অবিরত রাখতে পাসওয়ারà§à¦¡ লিখà§à¦¨" + }, + "ethereumPublicAddress": { + "message": "Ethereum পাবলিক অà§à¦¯à¦¾à¦¡à§à¦°à§‡à¦¸" + }, + "etherscanView": { + "message": "Etherscan ঠঅà§à¦¯à¦¾à¦•াউনà§à¦Ÿ দেখà§à¦¨" + }, + "estimatedProcessingTimes": { + "message": "আনà§à¦®à¦¾à¦¨à¦¿à¦• পà§à¦°à¦•à§à¦°à¦¿à§Ÿà¦¾à¦•রণের সময়" + }, + "expandView": { + "message": "ভিউ সমà§à¦ªà§à¦°à¦¸à¦¾à¦°à¦¿à¦¤ করà§à¦¨" + }, + "exportPrivateKey": { + "message": "বà§à¦¯à¦•à§à¦¤à¦¿à¦—ত কী রপà§à¦¤à¦¾à¦¨à¦¿ করà§à¦¨" + }, + "failed": { + "message": "বà§à¦¯à¦°à§à¦¥ হয়েছে" + }, + "fast": { + "message": "দà§à¦°à§à¦¤" + }, + "faster": { + "message": "দà§à¦°à§à¦¤à¦¤à¦°" + }, + "fiat": { + "message": "ফিয়াট", + "description": "Exchange type" + }, + "fileImportFail": { + "message": "ফাইল আমদানি কাজ করছে না? à¦à¦–ানে কà§à¦²à¦¿à¦• করà§à¦¨!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "à¦à¦‡ ডিভাইসটি সমà§à¦ªà¦°à§à¦•ে ভà§à¦²à§‡ যান" + }, + "from": { + "message": "থেকে" + }, + "functionType": { + "message": "কারà§à¦¯à¦•ারিতার ধরণ" + }, + "gasLimit": { + "message": "গà§à¦¯à¦¾à¦¸à§‡à¦° সীমা" + }, + "gasLimitInfoModalContent": { + "message": "গà§à¦¯à¦¾à¦¸à§‡à¦° সীমা হল আপনি যে পরিমাণ গà§à¦¯à¦¾à¦¸ খরচ করতে চান তার সরà§à¦¬à§‹à¦šà§à¦š ইউনিটের পরিমাণ।" + }, + "gasLimitTooLow": { + "message": "গà§à¦¯à¦¾à¦¸à§‡à¦° সীমা অবশà§à¦¯à¦‡ অনà§à¦¤à¦¤ 21000 ঠথাকতে হবে" + }, + "gasUsed": { + "message": "গà§à¦¯à¦¾à¦¸ বà§à¦¯à¦¬à¦¹à¦¾à¦° করা হয়েছে" + }, + "gasPrice": { + "message": "গà§à¦¯à¦¾à¦¸à§‡à¦° মূলà§à¦¯ (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "গà§à¦¯à¦¾à¦¸à§‡à¦° মূলà§à¦¯ অতà§à¦¯à¦¨à§à¦¤ কম" + }, + "gasPriceInfoModalContent": { + "message": "গà§à¦¯à¦¾à¦¸à§‡à¦° মূলà§à¦¯ আপনি পà§à¦°à¦¤à¦¿ à¦à¦•ক গà§à¦¯à¦¾à¦¸à§‡à¦° জনà§à¦¯ যে পরিমাণ ইথার পà§à¦°à¦¦à¦¾à¦¨ করতে চান সেটি নিরà§à¦¦à§‡à¦¶ করে।" + }, + "gasPriceNoDenom": { + "message": "গà§à¦¯à¦¾à¦¸à§‡à¦° মূলà§à¦¯" + }, + "general": { + "message": "সাধারণ" + }, + "generalSettingsDescription": { + "message": "মà§à¦¦à§à¦°à¦¾ বিনিময়, পà§à¦°à¦¾à¦¥à¦®à¦¿à¦• মà§à¦¦à§à¦°à¦¾, ভাষা, বà§à¦²à¦•িস আইডেনà§à¦Ÿà¦¿à¦•ন" + }, + "getEther": { + "message": "ইথার পান" + }, + "getEtherFromFaucet": { + "message": "$1 à¦à¦° জনà§à¦¯ à¦à¦•টি ফসেট থেকে ইথার পান", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "সহায়তা পান।" + }, + "getStarted": { + "message": "শà§à¦°à§ করà§à¦¨" + }, + "happyToSeeYou": { + "message": "আপনাকে দেখে আমরা আননà§à¦¦à¦¿à¦¤à¥¤" + }, + "hardware": { + "message": "হারà§à¦¡à¦“à§Ÿà§à¦¯à¦¾à¦°" + }, + "hardwareWalletConnected": { + "message": "হারà§à¦¡à¦“à§Ÿà§à¦¯à¦¾à¦° ওয়ালেট সংযà§à¦•à§à¦¤ করা হয়েছে" + }, + "hardwareWallets": { + "message": "à¦à¦•টি হারà§à¦¡à¦“à§Ÿà§à¦¯à¦¾à¦° ওয়ালেট সংযà§à¦•à§à¦¤ করà§à¦¨" + }, + "hardwareWalletsMsg": { + "message": "আপনি MetaMask à¦à¦° সাথে বà§à¦¯à¦¬à¦¹à¦¾à¦° করতে চান à¦à¦®à¦¨ à¦à¦•টি হারà§à¦¡à¦“à§Ÿà§à¦¯à¦¾à¦° ওয়ালেট নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" + }, + "havingTroubleConnecting": { + "message": "সংযোগ করতে সমসà§à¦¯à¦¾ হচà§à¦›à§‡?" + }, + "here": { + "message": "à¦à¦–ানে", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hexData": { + "message": "হেকà§à¦¸ ডেটা" + }, + "hide": { + "message": "লà§à¦•ান" + }, + "hideTokenPrompt": { + "message": "টোকেন লà§à¦•াবেন?" + }, + "history": { + "message": "ইতিহাস" + }, + "import": { + "message": "আমদানি", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ আমদানি করà§à¦¨" + }, + "importAccountMsg": { + "message": "আমদানি করা অà§à¦¯à¦¾à¦•াউনà§à¦Ÿà¦—à§à¦²à¦¿ আপনার গোড়ায় তৈরি করা MetaMask অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ সীডফà§à¦°à§‡à¦œà§‡à¦° সাথে সংযà§à¦•à§à¦¤ হবে না। আমদানি করা অà§à¦¯à¦¾à¦•াউনà§à¦Ÿà¦—à§à¦²à¦¿ সমà§à¦ªà¦°à§à¦•ে আরও জানà§à¦¨ " + }, + "importAccountSeedPhrase": { + "message": "সীড ফà§à¦°à§‡à¦œ দিয়ে à¦à¦•টি অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ আমদানি করà§à¦¨" + }, + "importWallet": { + "message": "ওয়ালেট আমদানি করà§à¦¨" + }, + "importYourExisting": { + "message": "à¦à¦•টি 12 শবà§à¦¦à§‡à¦° সীড ফà§à¦°à§‡à¦œ বà§à¦¯à¦¬à¦¹à¦¾à¦° করে আপনার বিদà§à¦¯à¦®à¦¾à¦¨ ওয়ালেট আমদানি করà§à¦¨" + }, + "imported": { + "message": "আমদানিকৃত", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ সীড ফà§à¦°à§‡à¦œ বà§à¦¯à¦¬à¦¹à¦¾à¦° করে আমদানি করà§à¦¨" + }, + "infoHelp": { + "message": "তথà§à¦¯ ও সহায়তা" + }, + "initialTransactionConfirmed": { + "message": "আপনার পà§à¦°à¦¾à¦°à¦®à§à¦­à¦¿à¦• লেনদেনটি নেটওয়ারà§à¦• নিশà§à¦šà¦¿à¦¤ করেছিল। ফিরে যেতে ঠিক আছে তে কà§à¦²à¦¿à¦• করà§à¦¨à¥¤" + }, + "insufficientBalance": { + "message": "অপরà§à¦¯à¦¾à¦ªà§à¦¤ বà§à¦¯à¦¾à¦²à§‡à¦¨à§à¦¸à§·" + }, + "insufficientFunds": { + "message": "অপরà§à¦¯à¦¾à¦ªà§à¦¤ তহবিল।" + }, + "insufficientTokens": { + "message": "অপরà§à¦¯à¦¾à¦ªà§à¦¤ টোকেন।" + }, + "invalidAddress": { + "message": "অবৈধ ঠিকানা" + }, + "invalidAddressRecipient": { + "message": "পà§à¦°à¦¾à¦ªà¦•ের ঠিকানা অবৈধ" + }, + "knownAddressRecipient": { + "message": "জানা পরিচিতির ঠিকানা৷" + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "ETH নেটওয়ারà§à¦• নয়, ছোটো হরফে সেট করা হয়েছে" + }, + "invalidInput": { + "message": "অবৈধ ইনপà§à¦Ÿ" + }, + "invalidRPC": { + "message": "অবৈধ RPC URL" + }, + "invalidBlockExplorerURL": { + "message": "অবৈধ Block Explorer URL" + }, + "invalidSeedPhrase": { + "message": "অবৈধ সীড ফà§à¦°à§‡à¦œ" + }, + "jsonFile": { + "message": "JSON ফাইল", + "description": "format for importing an account" + }, + "kovan": { + "message": "কোভান টেসà§à¦Ÿ নেটওয়ারà§à¦•" + }, + "max": { + "message": "সরà§à¦¬à¦¾à¦§à¦¿à¦•" + }, + "learnMore": { + "message": "আরও জানà§à¦¨" + }, + "ledgerAccountRestriction": { + "message": "à¦à¦•টি নতà§à¦¨ অà§à¦¯à¦¾ কাউনà§à¦Ÿ যোগ করার আগে আপনাকে আপনার শেষ অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ বà§à¦¯à¦¬à¦¹à¦¾à¦° করে ফেলতে হবে।" + }, + "letsGoSetUp": { + "message": "হà§à¦¯à¦¾à¦, তাহলে সেট আপ করে নেওয়া যাক!" + }, + "likeToAddTokens": { + "message": "আপনি কি à¦à¦‡ টোকেনগà§à¦²à¦¿ যোগ করতে চান?" + }, + "links": { + "message": "লিঙà§à¦•সমূহ" + }, + "liveGasPricePredictions": { + "message": "সরাসরি গà§à¦¯à¦¾à¦¸à§‡à¦° মূলà§à¦¯à§‡à¦° অনà§à¦®à¦¾à¦¨" + }, + "loading": { + "message": "লোড হচà§à¦›à§‡..." + }, + "loadingTokens": { + "message": "টোকেনগà§à¦²à¦¿ লোড করছে..." + }, + "loadMore": { + "message": "আরও লোড করà§à¦¨" + }, + "localhost": { + "message": "লোকালহোসà§à¦Ÿ 8545" + }, + "lock": { + "message": "লগ আউট করà§à¦¨" + }, + "mainnet": { + "message": "মূল Ethereum নেটওয়ারà§à¦•" + }, + "memorizePhrase": { + "message": "à¦à¦‡ ফà§à¦°à§‡à¦œà¦Ÿà¦¿ মà§à¦–সà§à¦¥ করà§à¦¨à¥¤" + }, + "memo": { + "message": "মেমো" + }, + "message": { + "message": "বারà§à¦¤à¦¾" + }, + "metamaskDescription": { + "message": "আপনার Ethereum à¦à¦¬à¦‚ ছড়িয়ে ছিটিয়ে থাকা ওয়েবের সাথে সংযোগ করছে। " + }, + "metamaskVersion": { + "message": "MetaMask সংসà§à¦•রণ" + }, + "mobileSyncText": { + "message": "à¦à¦Ÿà¦¿ যে আপনি তা নিশà§à¦šà¦¿à¦¤ করতে অনà§à¦—à§à¦°à¦¹ করে আপনার পাসওয়ারà§à¦¡ লিখà§à¦¨!" + }, + "myAccounts": { + "message": "আমার অà§à¦¯à¦¾à¦•াউনà§à¦Ÿà¦—à§à¦²à¦¿" + }, + "myWalletAccounts": { + "message": "আমার ওয়ালেট অà§à¦¯à¦¾à¦•াউনà§à¦Ÿà¦—à§à¦²à¦¿" + }, + "myWalletAccountsDescription": { + "message": "MetaMask à¦à¦° তৈরি করা আপনার সমসà§à¦¤ অà§à¦¯à¦¾à¦•াউনà§à¦Ÿà¦—à§à¦²à¦¿ সà§à¦¬à§Ÿà¦‚কà§à¦°à¦¿à§Ÿà¦­à¦¾à¦¬à§‡ à¦à¦‡ বিভাগে যোগ হয়ে যাবে।" + }, + "mustSelectOne": { + "message": "অবশà§à¦¯à¦‡ অনà§à¦¤à¦¤ 1টি টোকেন নিরà§à¦¬à¦¾à¦šà¦¨ করতে হবে।" + }, + "needEtherInWallet": { + "message": "MetaMask বà§à¦¯à¦¬à¦¹à¦¾à¦° করে ছড়িয়ে ছিটিয়ে থাকা অà§à¦¯à¦¾à¦ªà§à¦²à¦¿à¦•েশনগà§à¦²à¦¿à¦° সাথে যোগাযোগ করতে, আপনার ওয়ালেটে ইথার লাগবে।" + }, + "needImportFile": { + "message": "আমদানি করার জনà§à¦¯ আপনাকে অবশà§à¦¯à¦‡ à¦à¦•টি ফাইল নিরà§à¦¬à¦¾à¦šà¦¨ করতে হবে।", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "ETH à¦à¦° ঋণাতà§à¦®à¦• অরà§à¦¥à¦°à¦¾à¦¶à¦¿à¦—à§à¦²à¦¿ পাঠাতে পারবে না। " + }, + "networkName": { + "message": "নেটওয়ারà§à¦•ের নাম" + }, + "networks": { + "message": "নেটওয়ারà§à¦•সমূহ" + }, + "networkSettingsDescription": { + "message": "কাসà§à¦Ÿà¦® RPC নেটওয়ারà§à¦•গà§à¦²à¦¿ যোগ ও সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করà§à¦¨" + }, + "nevermind": { + "message": "কিছৠমনে করবেন না" + }, + "newAccount": { + "message": "নতà§à¦¨ আà§à¦¯à¦¾à¦•াউনà§à¦Ÿ" + }, + "newAccountDetectedDialogMessage": { + "message": "নতà§à¦¨ ঠিকানা সনাকà§à¦¤ করা হয়েছে। আপনার অà§à¦¯à¦¾à¦¡à§à¦°à§‡à¦¸ বà§à¦•ে যোগ করতে à¦à¦–ানে কà§à¦²à¦¿à¦• করà§à¦¨à¥¤" + }, + "newAccountNumberName": { + "message": "অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "নতà§à¦¨ পরিচিতি" + }, + "newContract": { + "message": "নতà§à¦¨ কনà§à¦Ÿà§à¦°à§à¦¯à¦¾à¦•à§à¦Ÿ" + }, + "newPassword": { + "message": "নতà§à¦¨ পাসওয়ারà§à¦¡ (অনà§à¦¤à¦¤ 8 অকà§à¦·à¦°à§‡à¦°)" + }, + "newNetwork": { + "message": "নতà§à¦¨ নেটওয়ারà§à¦•" + }, + "newToMetaMask": { + "message": "MetaMask ঠনতà§à¦¨?" + }, + "noAlreadyHaveSeed": { + "message": "না, আমার আগে থেকেই à¦à¦•টি সীড ফà§à¦°à§‡à¦œ আছে" + }, + "protectYourKeys": { + "message": "আপনার কীগà§à¦²à¦¿ সà§à¦°à¦•à§à¦·à¦¿à¦¤ করà§à¦¨!" + }, + "protectYourKeysMessage1": { + "message": "আপনার সীড ফà§à¦°à§‡à¦œ বিষয়ে সাবধান থাকà§à¦¨ — à¦à¦®à¦¨ ওয়েবসাইটগà§à¦²à¦¿à¦° রিপোরà§à¦Ÿ পাওয়া গেছে যেগà§à¦²à¦¿ MetaMask কে অনà§à¦•রণ করার চেষà§à¦Ÿà¦¾ করে। MetaMask কখনও আপনার সীড ফà§à¦°à§‡à¦œ জিজà§à¦žà¦¾à¦¸à¦¾ করবে না।" + }, + "protectYourKeysMessage2": { + "message": "আপনার ফà§à¦°à§‡à¦œà¦Ÿà¦¿à¦•ে নিরাপদে রাখà§à¦¨à¥¤à¦¸à¦¨à§à¦¦à§‡à¦¹à¦œà¦¨à¦• কিছৠদেখলে, বা à¦à¦•টি ওয়েবসাইট সমà§à¦ªà¦°à§à¦•ে নিশà§à¦šà¦¿à¦¤ না হলে, support@metamask.io ঠইমেল করà§à¦¨" + }, + "rpcUrl": { + "message": "নতà§à¦¨ RPC URL" + }, + "optionalChainId": { + "message": "ChainID (à¦à¦šà§à¦›à¦¿à¦•)" + }, + "optionalSymbol": { + "message": "পà§à¦°à¦¤à§€à¦• (à¦à¦šà§à¦›à¦¿à¦•)" + }, + "newTotal": { + "message": "নতà§à¦¨ সমষà§à¦Ÿà¦¿" + }, + "newTransactionFee": { + "message": "নতà§à¦¨ লেনদেন ফী" + }, + "next": { + "message": "পরবরà§à¦¤à§€" + }, + "noAddressForName": { + "message": "à¦à¦‡ নামের জনà§à¦¯ কোনো ঠিকানা সেট করা হয় নি।" + }, + "noConversionRateAvailable": { + "message": "কোনো বিনিময় হার উপলভà§à¦¯ নয়" + }, + "noTransactions": { + "message": "আপনার কোনো লেনদেন নেই" + }, + "notEnoughGas": { + "message": "পরà§à¦¯à¦¾à¦ªà§à¦¤ গà§à¦¯à¦¾à¦¸ নেই" + }, + "noWebcamFoundTitle": { + "message": "ওয়েবকà§à¦¯à¦¾à¦® খà§à¦à¦œà§‡ পাওয়া যায় নি" + }, + "noWebcamFound": { + "message": "আপনার কমà§à¦ªà¦¿à¦‰à¦Ÿà¦¾à¦°à§‡à¦° ওয়েবকà§à¦¯à¦¾à¦® খà§à¦à¦œà§‡ পাওয়া যায়নি। অনà§à¦—à§à¦°à¦¹ করে আবার চেষà§à¦Ÿà¦¾ করà§à¦¨à¥¤" + }, + "ofTextNofM": { + "message": "à¦à¦°" + }, + "orderOneHere": { + "message": "à¦à¦•টি Trezor বা লেজার অরà§à¦¡à¦¾à¦° করà§à¦¨ à¦à¦¬à¦‚ আপনার তহবিলগà§à¦²à¦¿ হীম ঘরে রাখà§à¦¨" + }, + "origin": { + "message": "উৎস" + }, + "parameters": { + "message": "পà§à¦¯à¦¾à¦°à¦¾à¦®à¦¿à¦Ÿà¦¾à¦°à¦¸à¦®à§‚হ" + }, + "participateInMetaMetrics": { + "message": "MetaMetrics ঠঅংশগà§à¦°à¦¹à¦£ করà§à¦¨" + }, + "participateInMetaMetricsDescription": { + "message": "MetaMask কে আরও উনà§à¦¨à¦¤ করতে আমাদের সহায়তা করার জনà§à¦¯ MetaMetrics ঠঅংশগà§à¦°à¦¹à¦£ করà§à¦¨" + }, + "password": { + "message": "পাসওয়ারà§à¦¡" + }, + "passwordsDontMatch": { + "message": "পাসওয়ারà§à¦¡à¦—à§à¦²à¦¿ মেলেনি" + }, + "passwordNotLongEnough": { + "message": "পাসওয়ারà§à¦¡ যথেষà§à¦Ÿ দীরà§à¦˜ নয়" + }, + "pastePrivateKey": { + "message": "আপনার গোপনীয় কী সà§à¦Ÿà§à¦°à¦¿à¦‚ à¦à¦–ানে পেসà§à¦Ÿ করà§à¦¨:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "বাকি" + }, + "personalAddressDetected": { + "message": "বà§à¦¯à¦•à§à¦¤à¦¿à¦—ত ঠিকানা সনাকà§à¦¤à¦¿à¦•ৃত হয়েছে। টোকেন কনà§à¦Ÿà§à¦°à§à¦¯à¦¾à¦•à§à¦Ÿ অà§à¦¯à¦¾à¦¡à§à¦°à§‡à¦¸à¦Ÿà¦¿ লিখà§à¦¨à¥¤" + }, + "prev": { + "message": "পূরà§à¦¬à¦¬à¦°à§à¦¤à§€" + }, + "primaryCurrencySetting": { + "message": "পà§à¦°à¦¾à¦¥à¦®à¦¿à¦• মà§à¦¦à§à¦°à¦¾" + }, + "primaryCurrencySettingDescription": { + "message": "চেনটিতে (যেমন ETH) দেশীয় মà§à¦¦à§à¦°à¦¾à§Ÿ মানগà§à¦²à¦¿ পà§à¦°à¦¦à¦°à§à¦¶à¦¨à¦•ে অগà§à¦°à¦¾à¦§à¦¿à¦•ার দিতে দেশীয় নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨à¥¤ আপনার নিরà§à¦¦à§‡à¦¶à¦¿à¦¤ মà§à¦¦à§à¦°à¦¾à§Ÿ মানগà§à¦²à¦¿à¦° পà§à¦°à¦¦à¦°à§à¦¶à¦¨à¦•ে অগà§à¦°à¦¾à¦§à¦¿à¦•ার দিতে নিরà§à¦¦à§‡à¦¶à¦¿à¦¤ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨à¥¤" + }, + "privacyMsg": { + "message": "সমà§à¦®à¦¤ হয়েছেন" + }, + "privateKey": { + "message": "বà§à¦¯à¦•à§à¦¤à¦¿à¦—ত কী", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "সতরà§à¦•তা: কখনও à¦à¦‡ কী টি পà§à¦°à¦•াশ করবেন না। আপনার গোপন কী কারোর কাছে থাকলে তিনি যে কোনো সময় আপনার অà§à¦¯à¦¾à¦•াউনà§à¦Ÿà§‡ থাকা যে কোনো সমà§à¦ªà¦¦ চà§à¦°à¦¿ করে নিতে পারবেন।" + }, + "privateNetwork": { + "message": "বà§à¦¯à¦•à§à¦¤à¦¿à¦—ত নেটওয়ারà§à¦•" + }, + "queue": { + "message": "অপেকà§à¦·à¦®à¦¾à¦£" + }, + "readdToken": { + "message": "আপনি আপনার অà§à¦¯à¦¾à¦•াউনà§à¦Ÿà¦¸ বিকলà§à¦ªà§‡à¦° মেনà§à¦¤à§‡ \"টোকেনগà§à¦²à¦¿ যোগ করà§à¦¨\" ঠগিয়ে ভবিষà§à¦¯à¦¤à§‡ আবার à¦à¦‡ টোকেনটি যোগ করতে পারবেন। " + }, + "recents": { + "message": "সামà§à¦ªà§à¦°à¦¤à¦¿à¦•গà§à¦²à¦¿" + }, + "recipientAddress": { + "message": "পà§à¦°à¦¾à¦ªà¦•ের ঠিকানা" + }, + "recipientAddressPlaceholder": { + "message": "অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨, সারà§à¦¬à¦œà¦¨à§€à¦¨ ঠিকানা (0x), বা ENS" + }, + "rejectAll": { + "message": "সব খারিজ করà§à¦¨" + }, + "rejectTxsN": { + "message": "$1 লেনদেনগà§à¦²à¦¿ খারিজ করà§à¦¨" + }, + "rejectTxsDescription": { + "message": "আপনি $1টি লেনদেন বà§à¦¯à¦¾à¦š খারিজ করতে চলেছেন।" + }, + "rejected": { + "message": "খারিজ করা হয়েছে" + }, + "reset": { + "message": "রিসেট করà§à¦¨" + }, + "resetAccount": { + "message": "অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ রিসেট করà§à¦¨" + }, + "resetAccountDescription": { + "message": "আপনার অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ রিসেট করা আপনার লেনদেনের ইতিহাসকে মà§à¦›à§‡ পরিসà§à¦•ার করবে।" + }, + "deleteNetwork": { + "message": "নেটওয়ারà§à¦• মà§à¦›à¦¬à§‡à¦¨?" + }, + "deleteNetworkDescription": { + "message": "আপনি কি à¦à¦‡ নেটওয়ারà§à¦•টি মোছার বিষয়ে নিশà§à¦šà¦¿à¦¤?" + }, + "remindMeLater": { + "message": "পরে আমাকে মনে করাবেন" + }, + "restoreFromSeed": { + "message": "অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ রিসà§à¦Ÿà§‹à¦° করবেন?" + }, + "restoreAccountWithSeed": { + "message": "সীড ফà§à¦°à§‡à¦œ দিয়ে আপনার অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ রিসà§à¦Ÿà§‹à¦° করà§à¦¨" + }, + "requestsAwaitingAcknowledgement": { + "message": "অনà§à¦°à§‹à¦§à¦—à§à¦²à¦¿ সà§à¦¬à§€à¦•ৃতির জনà§à¦¯ অপেকà§à¦·à¦¾ করছে" + }, + "required": { + "message": "পà§à¦°à§Ÿà§‹à¦œà¦¨" + }, + "restore": { + "message": "পà§à¦¨à¦°à§à¦¦à§à¦§à¦¾à¦° করà§à¦¨" + }, + "revealSeedWords": { + "message": "সীড শবà§à¦¦à¦—à§à¦²à¦¿ পà§à¦°à¦•াশ করà§à¦¨" + }, + "revealSeedWordsTitle": { + "message": "সীড ফà§à¦°à§‡à¦œ" + }, + "revealSeedWordsDescription": { + "message": "আপনি কখনও বà§à¦°à¦¾à¦‰à¦œà¦¾à¦° পরিবরà§à¦¤à¦¨ করলে বা à¦à¦• কমà§à¦ªà¦¿à¦‰à¦Ÿà¦¾à¦° থেকে অনà§à¦¯ কমà§à¦ªà¦¿à¦‰à¦Ÿà¦¾à¦°à§‡ গেলে, আপনাকে আপনার অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ অà§à¦¯à¦¾à¦•à§à¦¸à§‡à¦¸ করার জনà§à¦¯ à¦à¦‡ সীড ফà§à¦°à§‡à¦œà¦Ÿà¦¿ লাগবে। সেগà§à¦²à¦¿ নিরাপদ ও গোপনীয় কোনো সà§à¦¥à¦¾à¦¨à§‡ সংরকà§à¦·à¦£ করà§à¦¨à¥¤ " + }, + "revealSeedWordsWarningTitle": { + "message": "à¦à¦‡ ফà§à¦°à§‡à¦œà¦Ÿà¦¿ কারোর সাথে শেয়ার করবেন না!" + }, + "revealSeedWordsWarning": { + "message": "আপনার সমসà§à¦¤ অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ চà§à¦°à¦¿ করতে à¦à¦‡ শবà§à¦¦à¦—à§à¦²à¦¿ বà§à¦¯à¦¬à¦¹à¦¾à¦° করা যাবে।" + }, + "remove": { + "message": "সরান" + }, + "removeAccount": { + "message": "অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ সরান" + }, + "removeAccountDescription": { + "message": "à¦à¦‡ অà§à¦¯à¦¾à¦•াউনà§à¦Ÿà¦Ÿà¦¿ আপনার ওয়ালেট থেকে অপসারণ করা হবে। অবিরত রাখার আগে অনà§à¦—à§à¦°à¦¹ করে নিশà§à¦šà¦¿à¦¤ করà§à¦¨ যে à¦à¦‡ আমদানি করা অà§à¦¯à¦¾à¦•াউনà§à¦Ÿà¦Ÿà¦¿à¦° জনà§à¦¯ আপনার মূল সীড ফà§à¦°à§‡à¦œ বা গোপন কী আছে। আপনি অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ ডà§à¦°à¦ª-ডাউন থেকে অà§à¦¯à¦¾à¦•াউনà§à¦Ÿà¦—à§à¦²à¦¿ আবার আমদানি বা তৈরি করতে পারবেন।" + }, + "readyToConnect": { + "message": "সংযোগ করার জনà§à¦¯ পà§à¦°à¦¸à§à¦¤à§à¦¤?" + }, + "rinkeby": { + "message": "রিঙà§à¦•েবি টেসà§à¦Ÿ নেটওয়ারà§à¦•" + }, + "ropsten": { + "message": "রোপসà§à¦Ÿà§‡à¦¨ টেসà§à¦Ÿ নেটওয়ারà§à¦•" + }, + "goerli": { + "message": "গোয়েরলি টেসà§à¦Ÿ নেটওয়ারà§à¦•" + }, + "save": { + "message": "সেভ করà§à¦¨" + }, + "slow": { + "message": "মনà§à¦¥à¦°" + }, + "slower": { + "message": "ধীর গতির" + }, + "saveAsCsvFile": { + "message": "CSV ফাইল হিসাবে সংরকà§à¦·à¦£ করà§à¦¨" + }, + "scanInstructions": { + "message": "QR কোডটি আপনার কà§à¦¯à¦¾à¦®à§‡à¦°à¦¾à¦° সামনে ধরà§à¦¨" + }, + "scanQrCode": { + "message": "QR কোড সà§à¦•à§à¦¯à¦¾à¦¨ করà§à¦¨" + }, + "search": { + "message": "সারà§à¦š করà§à¦¨" + }, + "searchResults": { + "message": "অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨à§‡à¦° ফলাফলগà§à¦²à¦¿" + }, + "secretBackupPhrase": { + "message": "গোপন বà§à¦¯à¦¾à¦•আপ ফà§à¦°à§‡à¦œ" + }, + "secretBackupPhraseDescription": { + "message": "আপনার গোপন বাকà§à¦¯à¦¾à¦‚শ আপনার অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ বà§à¦¯à¦¾à¦•আপ à¦à¦¬à¦‚ রিসà§à¦Ÿà§‹à¦° করা সহজতর করে তোলে।" + }, + "secretBackupPhraseWarning": { + "message": "সতরà§à¦•তা: কখনও আপনার বà§à¦¯à¦¾à¦•আপ ফà§à¦°à§‡à¦œ পà§à¦°à¦•াশ করবেন না। à¦à¦‡ ফà§à¦°à§‡à¦œ পেয়ে গেলে যে কেউ আপনার ইথার চিরকালের জনà§à¦¯ নিয়ে নিতে পারবেন।" + }, + "secretPhrase": { + "message": "আপনার ভলà§à¦Ÿ রিসà§à¦Ÿà§‹à¦° করতে à¦à¦–ানে আপনার গোপন বারো শবà§à¦¦à§‡à¦° ফà§à¦°à§‡à¦œ লিখà§à¦¨à¥¤" + }, + "securityAndPrivacy": { + "message": "নিরাপতà§à¦¤à¦¾ à¦à¦¬à¦‚ গোপনীয়তা" + }, + "securitySettingsDescription": { + "message": "গোপনীয়তা সেটিংস à¦à¦¬à¦‚ ওয়ালেট সীড ফà§à¦°à§‡à¦œ" + }, + "seedPhrasePlaceholder": { + "message": "পà§à¦°à¦¤à¦¿à¦Ÿà¦¿ শবà§à¦¦à¦•ে à¦à¦•টি সà§à¦ªà§‡à¦¸ দিয়ে আলাদা করà§à¦¨" + }, + "seedPhraseReq": { + "message": "সীড ফà§à¦°à§‡à¦œà¦—à§à¦²à¦¿ 12 শবà§à¦¦à§‡à¦°" + }, + "selectCurrency": { + "message": "কারেনà§à¦¸à¦¿ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" + }, + "selectEachPhrase": { + "message": "ফà§à¦°à§‡à¦œà¦—à§à¦²à¦¿ সঠিক তা নিশà§à¦šà¦¿à¦¤ করতে অনà§à¦—à§à¦°à¦¹ করে পà§à¦°à¦¤à¦¿à¦Ÿà¦¿ ফà§à¦°à§‡à¦œ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨à¥¤" + }, + "selectLocale": { + "message": "সà§à¦¥à¦¾à¦¨à§€à§Ÿ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" + }, + "selectType": { + "message": "ধরণ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" + }, + "send": { + "message": "পাঠান" + }, + "sendAmount": { + "message": "পাঠানো অরà§à¦¥à¦°à¦¾à¦¶à¦¿" + }, + "sendETH": { + "message": "ETH পাঠান" + }, + "sendTokens": { + "message": "টোকেনগà§à¦²à¦¿ পাঠান" + }, + "sentEther": { + "message": "পাঠানো ইথার " + }, + "sentTokens": { + "message": "টোকেনগà§à¦²à¦¿ পাঠান" + }, + "separateEachWord": { + "message": "পà§à¦°à¦¤à¦¿à¦Ÿà¦¿ শবà§à¦¦à¦•ে à¦à¦•টি সà§à¦ªà§‡à¦¸ দিয়ে আলাদা করà§à¦¨" + }, + "searchTokens": { + "message": "টোকেনগà§à¦²à¦¿ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করà§à¦¨" + }, + "selectAnAccount": { + "message": "à¦à¦•টি অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" + }, + "selectAnAccountHelp": { + "message": "MetaMask ঠদেখতে অà§à¦¯à¦¾à¦•াউনà§à¦Ÿà¦Ÿà¦¿ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" + }, + "selectAHigherGasFee": { + "message": "আপনার লেনদেনটি পà§à¦°à¦•à§à¦°à¦¿à§Ÿà¦¾à¦•রণ তà§à¦¬à¦°à¦¾à¦¨à§à¦¬à¦¿à¦¤ করতে à¦à¦•টি উচà§à¦šà¦¤à¦° গà§à¦¯à¦¾à¦¸ ফী নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨à¥¤*" + }, + "selectHdPath": { + "message": "HD পাথ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" + }, + "selectPathHelp": { + "message": "আপনি নিচে আপনার বিদà§à¦¯à¦®à¦¾à¦¨ লেজার বà§à¦¯à¦¾à¦²à§‡à¦¨à§à¦¸ না দেখলে, \"Legacy (MEW / MyCrypto)\" পাথগà§à¦²à¦¿à¦¤à§‡ সà§à¦‡à¦š করার চেষà§à¦Ÿà¦¾ করà§à¦¨ " + }, + "settings": { + "message": "সেটিংস" + }, + "showAdvancedGasInline": { + "message": "উনà§à¦¨à¦¤ গà§à¦¯à¦¾à¦¸ নিয়নà§à¦¤à§à¦°à¦£à¦¸à¦®à§‚হ" + }, + "showAdvancedGasInlineDescription": { + "message": "গà§à¦¯à¦¾à¦¸à§‡à¦° মূলà§à¦¯ দেখাতে à¦à¦Ÿà¦¿ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨ à¦à¦¬à¦‚ পাঠানোর à¦à¦¬à¦‚ নিশà§à¦šà¦¿à¦¤à¦•রণের সà§à¦•à§à¦°à¦¿à¦¨à¦—à§à¦²à¦¿à¦¤à§‡ নিয়নà§à¦¤à§à¦°à¦£à¦—à§à¦²à¦¿ সরাসরি সীমিত করà§à¦¨à¥¤" + }, + "showFiatConversionInTestnets": { + "message": "Testnets ঠরূপানà§à¦¤à¦° দেখান" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Testnets ঠফিয়াট বাকà§à¦¯à¦¾à¦²à¦¾à¦ªà¦—à§à¦²à¦¿ দেখাতে à¦à¦Ÿà¦¿ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" + }, + "showPrivateKeys": { + "message": "গোপনীয় কীগà§à¦²à¦¿ দেখান" + }, + "showHexData": { + "message": "হেকà§à¦¸ ডেটা দেখান" + }, + "showHexDataDescription": { + "message": "পাঠাবার সà§à¦•à§à¦°à¦¿à¦¨à§‡ হেকà§à¦¸ ডেটা ফিলà§à¦¡à¦Ÿà¦¿ দেখাবার জনà§à¦¯ à¦à¦Ÿà¦¿ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" + }, + "sign": { + "message": "সà§à¦¬à¦¾à¦•à§à¦·à¦° করà§à¦¨" + }, + "signatureRequest": { + "message": "সà§à¦¬à¦¾à¦•à§à¦·à¦°à§‡à¦° অনà§à¦°à§‹à¦§" + }, + "signed": { + "message": "সà§à¦¬à¦¾à¦•à§à¦·à¦°à¦¿à¦¤" + }, + "signNotice": { + "message": "à¦à¦‡ বারà§à¦¤à¦¾à¦Ÿà¦¿à¦¤à§‡ সাইন আইন করার \nবিপজà§à¦œà¦¨à¦• পারà§à¦¶à§à¦¬ পà§à¦°à¦¤à¦¿à¦•à§à¦°à¦¿à§Ÿà¦¾ থাকতে পারে। আপনি সমà§à¦ªà§‚রà§à¦£ বিশà§à¦¬à¦¾à¦¸ করেন শà§à¦§à§à¦®à¦¾à¦¤à§à¦° সেই \nসাইটের থেকে আসা বারà§à¦¤à¦¾à¦—à§à¦²à¦¿à¦¤à§‡à¦‡ আপনার সামগà§à¦°à¦¿à¦• অà§à¦¯à¦¾à¦•াউনà§à¦Ÿà§‡à¦° মাধà§à¦¯à¦®à§‡ সাইন করà§à¦¨à¥¤\n à¦à¦‡ বিপজà§à¦œà¦¨à¦• পদà§à¦§à¦¤à¦¿à¦Ÿà¦¿ পরবরà§à¦¤à§€ সংসà§à¦•রণে অপসারণ করা হবে। " + }, + "sigRequest": { + "message": "সà§à¦¬à¦¾à¦•à§à¦·à¦°à§‡à¦° অনà§à¦°à§‹à¦§" + }, + "somethingWentWrong": { + "message": "ওহো! কিছৠসমসà§à¦¯à¦¾ হয়েছে।" + }, + "speedUp": { + "message": "গতি বাড়ান" + }, + "speedUpCancellation": { + "message": "à¦à¦‡ বাতিলকরণটির গতি বাড়ান" + }, + "speedUpTransaction": { + "message": "à¦à¦‡ লেনদেনটি দà§à¦°à§à¦¤à¦¤à¦° করà§à¦¨ " + }, + "switchNetworks": { + "message": "নেটওয়ারà§à¦•গà§à¦²à¦¿ বদলান" + }, + "stateLogs": { + "message": "সà§à¦Ÿà§‡à¦Ÿ লগসমূহ" + }, + "stateLogsDescription": { + "message": "সà§à¦Ÿà§‡à¦Ÿ লগগà§à¦²à¦¿à¦¤à§‡ আপনার পাবলিক অà§à¦¯à¦¾à¦•াউনà§à¦Ÿà§‡à¦° ঠিকানা à¦à¦¬à¦‚ পà§à¦°à§‡à¦°à¦£ করার লেনদেনগà§à¦²à¦¿ আছে।" + }, + "stateLogError": { + "message": "সà§à¦Ÿà§‡à¦Ÿ লগগà§à¦²à¦¿ পà§à¦¨à¦°à§à¦¦à§à¦§à¦¾à¦° করার তà§à¦°à§à¦Ÿà¦¿à¥¤" + }, + "step1HardwareWallet": { + "message": "1. হারà§à¦¡à¦“à§Ÿà§à¦¯à¦¾à¦° ওয়ালেট সংযà§à¦•à§à¦¤ করà§à¦¨" + }, + "step1HardwareWalletMsg": { + "message": "আপনার হারà§à¦¡à¦“à§Ÿà§à¦¯à¦¾à¦° ওয়ালেট সরাসরি আপনার কমà§à¦ªà¦¿à¦‰à¦Ÿà¦¾à¦°à§‡à¦° সাথে সংযà§à¦•à§à¦¤ করà§à¦¨à¥¤" + }, + "step2HardwareWallet": { + "message": "2. à¦à¦•টি অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" + }, + "step2HardwareWalletMsg": { + "message": "আপনি যে অà§à¦¯à¦¾à¦•াউনà§à¦Ÿà¦Ÿà¦¿ দেখতে চান সেটি নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨à¥¤ আপনি à¦à¦•ই সময়ে শà§à¦§à§à¦®à¦¾à¦¤à§à¦° à¦à¦•টিই বেছে নিতে পারবেন। " + }, + "step3HardwareWallet": { + "message": "3. dApps à¦à¦¬à¦‚ আরও বà§à¦¯à¦¬à¦¹à¦¾à¦° করে শà§à¦°à§ করà§à¦¨!" + }, + "step3HardwareWalletMsg": { + "message": "আপনি কোনো Ethereum অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ যেমন বà§à¦¯à¦¬à¦¹à¦¾à¦° করেন সেইভাবে আপনার হারà§à¦¡à¦“à§Ÿà§à¦¯à¦¾à¦° অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨à¥¤ dApps ঠলগইন করà§à¦¨, Eth পাঠান, ERC20 টোকেন à¦à¦¬à¦‚ CryptoKitties à¦à¦° মতো পরসà§à¦ªà¦° বিনিময়যোগà§à¦¯ নয় à¦à¦®à¦¨ টোকেনগà§à¦²à¦¿ কà§à¦°à§Ÿ ও সংরকà§à¦·à¦£ করà§à¦¨à¥¤ " + }, + "storePhrase": { + "message": "à¦à¦‡ বাকà§à¦¯à¦¾à¦‚শটি 1Password à¦à¦° মতো à¦à¦•টি পাসওয়ারà§à¦¡ পরিচালকে সংরকà§à¦·à¦£ করà§à¦¨à¥¤ " + }, + "submitted": { + "message": "জমা করা হয়েছে" + }, + "supportCenter": { + "message": "আমাদের সহায়তা কেনà§à¦¦à§à¦°à§‡ যান" + }, + "symbol": { + "message": "পà§à¦°à¦¤à§€à¦•" + }, + "symbolBetweenZeroTwelve": { + "message": "পà§à¦°à¦¤à§€à¦•টি 11 টি অকà§à¦·à¦° বা তার চেয়ে কম হতে হবে।" + }, + "syncWithMobile": { + "message": "মোবাইল দিয়ে সিঙà§à¦• করà§à¦¨" + }, + "syncWithMobileTitle": { + "message": "মোবাইল দিয়ে সিঙà§à¦• করà§à¦¨" + }, + "syncWithMobileDesc": { + "message": "আপনি আপনার অà§à¦¯à¦¾à¦•াউনà§à¦Ÿ à¦à¦¬à¦‚ তথà§à¦¯ আপনার মোবাইল ডিভাইস দিয়ে সিঙà§à¦• করতে পারেন। MetaMask মোবাইল অà§à¦¯à¦¾à¦ªà¦Ÿà¦¿ খà§à¦²à§à¦¨, \"সেটিংস\" ঠযান à¦à¦¬à¦‚ \"বà§à¦°à¦¾à¦‰à¦œà¦¾à¦° à¦à¦•à§à¦¸à¦Ÿà§‡à¦¨à¦¶à¦¨ থেকে সিঙà§à¦• করà§à¦¨\" ঠটà§à¦¯à¦¾à¦ª করà§à¦¨ " + }, + "syncWithMobileDescNewUsers": { + "message": "আপনি পà§à¦°à¦¥à¦®à¦¬à¦¾à¦°à§‡à¦° জনà§à¦¯ MetaMask খোলার পরে, শà§à¦§à§ আপনার ফোনে পদকà§à¦·à§‡à¦ªà¦—à§à¦²à¦¿ অনà§à¦¸à¦°à¦£ করà§à¦¨à¥¤ " + }, + "syncWithMobileScanThisCode": { + "message": "আপনার MetaMask মোবাইল অà§à¦¯à¦¾à¦ª দিয়ে à¦à¦‡ কোডটি সà§à¦•à§à¦¯à¦¾à¦¨ করà§à¦¨" + }, + "syncWithMobileBeCareful": { + "message": "à¦à¦‡ কোডটি সà§à¦•à§à¦¯à¦¾à¦¨ করার সময় কেউ আপনার সà§à¦•à§à¦°à¦¿à¦¨à¦Ÿà¦¿ দেখছে না তা নিশà§à¦šà¦¿à¦¤ করà§à¦¨" + }, + "syncWithMobileComplete": { + "message": "আপনার ডেটা সফলভাবে সিঙà§à¦• করা হয়েছে। MetaMask মোবাইল অà§à¦¯à¦¾à¦ª উপভোগ করà§à¦¨!" + }, + "terms": { + "message": "বà§à¦¯à¦¬à¦¹à¦¾à¦°à§‡à¦° শরà§à¦¤à¦¾à¦¬à¦²à§€" + }, + "testFaucet": { + "message": "টেসà§à¦Ÿ ফসেট" + }, + "thisWillCreate": { + "message": "à¦à¦Ÿà¦¿ à¦à¦•টি নতà§à¦¨ ওয়ালেট à¦à¦¬à¦‚ সীড ফà§à¦°à§‡à¦œ তৈরি করবে" + }, + "tips": { + "message": "অরà§à¦¥à¦¸à¦¾à¦¹à¦¾à¦¯à§à¦¯ à¦à¦¬à¦‚ পরামরà§à¦¶" + }, + "to": { + "message": "পà§à¦°à¦¤à¦¿" + }, + "token": { + "message": "টোকেন" + }, + "tokenAlreadyAdded": { + "message": "টোকেন ইতিমিধà§à¦¯à§‡ যোগ করা হয়েছে।" + }, + "tokenContractAddress": { + "message": "টোকেন কনà§à¦Ÿà§à¦°à§à¦¯à¦¾à¦•à§à¦Ÿ অà§à¦¯à¦¾à¦¡à§à¦°à§‡à¦¸" + }, + "tokenSymbol": { + "message": "টোকেনের পà§à¦°à¦¤à§€à¦•" + }, + "total": { + "message": "মোট" + }, + "transaction": { + "message": "লেনদেন" + }, + "transactionConfirmed": { + "message": " $2 ঠলেনদেন নিশà§à¦šà¦¿à¦¤ হয়েছে।" + }, + "transactionCreated": { + "message": "$2 ঠ$1 à¦à¦° à¦à¦•টি মান দিয়ে লেনদেন তৈরি করা হয়েছে।" + }, + "transactionDropped": { + "message": "লেনদেন $2 ঠনেমে গেছে।" + }, + "transactionSubmitted": { + "message": "$2 ঠ$1 à¦à¦° গà§à¦¯à¦¾à¦¸ ফী সহ লেনদেন জমা করা হয়েছে।" + }, + "transactionResubmitted": { + "message": "$2 ঠগà§à¦¯à¦¾à¦¸ ফী $1 তে বাড়িয়ে লেনদেন আবার জমা করা হয়েছে" + }, + "transactionUpdated": { + "message": "লেনদেন $2 ঠআপডেট করা হয়েছে।" + }, + "transactionErrored": { + "message": "লেনদেনে à¦à¦•টি তà§à¦°à§à¦Ÿà¦¿ হয়েছে।" + }, + "transactionCancelAttempted": { + "message": "$2 ঠ$1 à¦à¦° গà§à¦¯à¦¾à¦¸ ফী দিয়ে লেনদেন বাতিল করার পà§à¦°à¦šà§‡à¦·à§à¦Ÿà¦¾ করা হয়েছে" + }, + "transactionCancelSuccess": { + "message": "$2 ঠলেনদেন সফলভাবে বাতিল হয়েছে" + }, + "transactionError": { + "message": "লেনদেনের তà§à¦°à§à¦Ÿà¦¿à¥¤ কনà§à¦Ÿà§à¦°à§à¦¯à¦¾à¦•à§à¦Ÿ কোডে বà§à¦¯à¦¤à¦¿à¦•à§à¦°à¦® দেখাচà§à¦›à§‡à¥¤" + }, + "transactionErrorNoContract": { + "message": "à¦à¦•টি অ-পরিচিতির ঠিকানায় à¦à¦•টি কল করার চেষà§à¦Ÿà¦¾ করছে।" + }, + "transactionFee": { + "message": "লেনদেন ফী" + }, + "transactionTime": { + "message": "লেনদেনের সময়" + }, + "transfer": { + "message": "টà§à¦°à¦¾à¦¨à§à¦¸à¦«à¦¾à¦° করà§à¦¨" + }, + "transferBetweenAccounts": { + "message": "আমার অà§à¦¯à¦¾à¦•াউনà§à¦Ÿà¦—à§à¦²à¦¿à¦° মধà§à¦¯à§‡ টà§à¦°à¦¾à¦¨à§à¦¸à¦«à¦¾à¦° করà§à¦¨" + }, + "transferFrom": { + "message": "থেকে টà§à¦°à¦¾à¦¨à§à¦¸à¦«à¦¾à¦° করà§à¦¨" + }, + "troubleTokenBalances": { + "message": "আপনার টোকেন বà§à¦¯à¦¾à¦²à§‡à¦¨à§à¦¸à¦—à§à¦²à¦¿ লোড করতে আমাদের সমসà§à¦¯à¦¾ হয়েছিল। আপনি সেগà§à¦²à¦¿ দেখতে পারেন", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "আবার করà§à¦¨" + }, + "typePassword": { + "message": "আপনার MetaMask পাসওয়ারà§à¦¡ টাইপ করà§à¦¨" + }, + "unapproved": { + "message": "অননà§à¦®à§‹à¦¦à¦¿à¦¤" + }, + "units": { + "message": "ইউনিটসমূহ" + }, + "unknown": { + "message": "অজানা" + }, + "unknownNetwork": { + "message": "অজানা বà§à¦¯à¦•à§à¦¤à¦¿à¦—ত নেটওয়ারà§à¦•" + }, + "unknownQrCode": { + "message": "তà§à¦°à§à¦Ÿà¦¿: আমরা ওই QR কোডটি সনাকà§à¦¤ করতে পারিনি" + }, + "unknownCameraErrorTitle": { + "message": "ওহো! কিছৠসমসà§à¦¯à¦¾ হয়েছে...." + }, + "unknownCameraError": { + "message": "আপনার কà§à¦¯à¦¾à¦®à§‡à¦°à¦¾ অà§à¦¯à¦¾à¦•à§à¦¸à§‡à¦¸ করার চেষà§à¦Ÿà¦¾ করার সময় à¦à¦•টি তà§à¦°à§à¦Ÿà¦¿ হয়েছে। অনà§à¦—à§à¦°à¦¹ করে আবার চেষà§à¦Ÿà¦¾ করà§à¦¨..." + }, + "unlock": { + "message": "আনলক" + }, + "unlockMessage": { + "message": "ছড়িয়ে ছিটিয়ে থাকা ওয়েব অপেকà§à¦·à¦¾ করছে" + }, + "updatedWithDate": { + "message": "আপডেট করা $1" + }, + "urlErrorMsg": { + "message": "URI গà§à¦²à¦¿à¦° যথাযথ HTTP/HTTPS পà§à¦°à§‡à¦«à¦¿à¦•à§à¦¸à§‡à¦° পà§à¦°à§Ÿà§‹à¦œà¦¨à¥¤" + }, + "usedByClients": { + "message": "বিভিনà§à¦¨ ধরণের গà§à¦°à¦¾à¦¹à¦•দের দà§à¦¬à¦¾à¦°à¦¾ বà§à¦¯à¦¬à¦¹à§ƒà¦¤ হয়" + }, + "userName": { + "message": "ইউজারনেম" + }, + "viewAccount": { + "message": "আà§à¦¯à¦¾à¦•াউনà§à¦Ÿ দেখà§à¦¨" + }, + "viewinExplorer": { + "message": "à¦à¦•à§à¦¸à¦ªà§à¦²à§‹à¦°à¦¾à¦°à§‡ দেখà§à¦¨" + }, + "viewContact": { + "message": "পরিচিতি দেখà§à¦¨" + }, + "viewOnCustomBlockExplorer": { + "message": "$1 ঠদেখà§à¦¨" + }, + "viewOnEtherscan": { + "message": "Etherscan দেখà§à¦¨" + }, + "visitWebSite": { + "message": "আমাদের ওয়েবসাইট দেখà§à¦¨" + }, + "walletSeed": { + "message": "ওয়ালেট সীড" + }, + "welcomeBack": { + "message": "পà§à¦¨à¦°à¦¾à§Ÿ সà§à¦¬à¦¾à¦—ত!" + }, + "welcome": { + "message": "MetaMask ঠসà§à¦¬à¦¾à¦—তম" + }, + "writePhrase": { + "message": "à¦à¦‡ বাকà§à¦¯à¦¾à¦‚শটি à¦à¦•টি কাগজের টà§à¦•রোর উপর লিখে à¦à¦•টি নিরাপদ সà§à¦¥à¦¾à¦¨à§‡ সংরকà§à¦·à¦£ করà§à¦¨à¥¤ আপনি আরও নিরাপতà§à¦¤à¦¾ চাইলে, সেটি à¦à¦•াধিক কাগজের টà§à¦•রোতে লিখে 2 - 3টি আলাদা আলাদা সà§à¦¥à¦¾à¦¨à§‡ সংরকà§à¦·à¦£ করà§à¦¨à¥¤" + }, + "yesLetsTry": { + "message": "হà§à¦¯à¦¾à¦, চেষà§à¦Ÿà¦¾ করা যাক" + }, + "youNeedToAllowCameraAccess": { + "message": "à¦à¦‡ বৈশিষà§à¦Ÿà§à¦¯à¦Ÿà¦¿ বà§à¦¯à¦¬à¦¹à¦¾à¦° করতে আপনাকে কà§à¦¯à¦¾à¦®à§‡à¦°à¦¾ অà§à¦¯à¦¾à¦•à§à¦¸à§‡à¦¸ করার অনà§à¦®à¦¤à¦¿ দিতে হবে।" + }, + "yourSigRequested": { + "message": "আপনার সà§à¦¬à¦¾à¦•à§à¦·à¦°à§‡à¦° অনà§à¦°à§‹à¦§ জানানো হয়েছে" + }, + "youSign": { + "message": "আপনি সà§à¦¬à¦¾à¦•à§à¦·à¦° করছেন" + }, + "yourPrivateSeedPhrase": { + "message": "আপনার বà§à¦¯à¦•à§à¦¤à¦¿à¦—ত সীড ফà§à¦°à§‡à¦œ" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "সà§à¦ªà§€à¦¡ আপ ঠশূণà§à¦¯ গà§à¦¯à¦¾à¦¸à§‡à¦° মূলà§à¦¯" + } +} diff --git a/app/_locales/ca/messages.json b/app/_locales/ca/messages.json new file mode 100644 index 000000000000..e948bc86e245 --- /dev/null +++ b/app/_locales/ca/messages.json @@ -0,0 +1,1279 @@ +{ + "chartOnlyAvailableEth": { + "message": "Mostra només els disponibles a les xarxes Ethereum." + }, + "contractInteraction": { + "message": "Contractar Interacció" + }, + "reject": { + "message": "Rebutja" + }, + "about": { + "message": "Informació" + }, + "aboutSettingsDescription": { + "message": "Versió, centre de suport, i informació de contacte" + }, + "acceleratingATransaction": { + "message": "* Accelerar una transacció utilitzant un preu de gas més alt augmenta les possibilitats de ser processat més ràpidament per la xarxa, però no sempre es pot garantir." + }, + "accessingYourCamera": { + "message": "Accedint a la teva càmera..." + }, + "account": { + "message": "Compte" + }, + "accountDetails": { + "message": "Detalls del Compte" + }, + "accountName": { + "message": "Nom del Compte" + }, + "accountOptions": { + "message": "Opcions del compte" + }, + "accountSelectionRequired": { + "message": "Has de seleccionar un compte!" + }, + "activityLog": { + "message": "registre d'activitat" + }, + "addNetwork": { + "message": "Afegir Xarxa" + }, + "addRecipient": { + "message": "Afegeix un recipient" + }, + "advanced": { + "message": "Configuració avançada" + }, + "advancedSettingsDescription": { + "message": "Accedeix a característiques de desenvolupador, descarrega Registres d'Estat, Reinicia el Compte, instal·la testnets i personalitza RPC" + }, + "advancedOptions": { + "message": "Opcions Avançades" + }, + "addToAddressBook": { + "message": "Afegir al llibre d'adreces" + }, + "addToAddressBookModalPlaceholder": { + "message": "p. ex. John D." + }, + "addAlias": { + "message": "Afegeix un àlies" + }, + "addToken": { + "message": "Afegir Fitxa" + }, + "addTokens": { + "message": "Afegeix tokens" + }, + "addSuggestedTokens": { + "message": "Afegir Fitxes Suggerides" + }, + "addAcquiredTokens": { + "message": "Afegeix les fitxes que has adquirit fent servir MetaMask" + }, + "amount": { + "message": "Quantitat" + }, + "appDescription": { + "message": "Un Moneder Ethereum al teu Navegador", + "description": "The description of the application" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "approve": { + "message": "Aprovar" + }, + "approved": { + "message": "Aprovat" + }, + "asset": { + "message": "Actius" + }, + "attemptingConnect": { + "message": "Intentant conectar a blockchain." + }, + "attemptToCancel": { + "message": "Estàs provant de cancel·lar?" + }, + "attemptToCancelDescription": { + "message": "Enviar aquesta temptativa no garanteix que la teva transacció original sigui cancel·lada. Si la temptativa de cancel·lació té èxit, se't carregarà la tarifa de transacció de més amunt." + }, + "attributions": { + "message": "Atribucions" + }, + "autoLockTimeLimit": { + "message": "Temporitzador de tancament de sessió automàtic (minuts)" + }, + "autoLockTimeLimitDescription": { + "message": "Configura el temps de repòs com minuts abans que MetaMask tanqui la sessió automàticament" + }, + "average": { + "message": "Mitjana" + }, + "back": { + "message": "Enrere" + }, + "backToAll": { + "message": "Torna a Tot" + }, + "backupApprovalNotice": { + "message": "Fes una còpia de seguretat del teu codi Secret de Recuperació per mantenir el teu moneder i els teus fons segurs." + }, + "backupApprovalInfo": { + "message": "Aquest codi secret es requereix per recuperar el teu moneder en cas que perdis el dispositiu, oblidis la teva contrasenya, hagis de reinstal·lar MetaMask, o vulguis accedir al teu moneder des d'un altre dispositiu." + }, + "backupNow": { + "message": "Fer còpia de seguretat ara" + }, + "balance": { + "message": "Balanç" + }, + "balanceOutdated": { + "message": "El balanç pot ser obsolet" + }, + "basic": { + "message": "Opcions bàsiques" + }, + "blockExplorerUrl": { + "message": "Bloqueja l'explorador" + }, + "blockExplorerView": { + "message": "Veure compte a $1 ", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "Fer servir els Identicon Blockies" + }, + "browserNotSupported": { + "message": "El teu navegador no és suportat..." + }, + "builtInCalifornia": { + "message": "MetaMask ha estat dissenyat i desenvolupat a Califòrnia." + }, + "buyWithWyre": { + "message": "Compra ETH amb Wyre" + }, + "buyWithWyreDescription": { + "message": "Wyre et permet utilitzar una targeta de crèdit per dipositar ETH directe al teu compte MetaMask." + }, + "buyCoinSwitch": { + "message": "Comprar a CoinSwitch" + }, + "buyCoinSwitchExplainer": { + "message": "CoinSwitch és la destinació número 1 per a canviar més de 300 criptomonedes al millor preu." + }, + "off": { + "message": "Desactivat" + }, + "ok": { + "message": "D'acord" + }, + "on": { + "message": "Activat" + }, + "optionalBlockExplorerUrl": { + "message": "Bloqueja l'URL d'Explorer (opcional)" + }, + "cancel": { + "message": "Cancel·la" + }, + "cancelAttempt": { + "message": "Cancel·la l'intent" + }, + "cancellationGasFee": { + "message": "Preu de cancel·lació del gas" + }, + "cancelled": { + "message": "Cancel·lat" + }, + "chainId": { + "message": "Cadena ID" + }, + "clickToRevealSeed": { + "message": "Fes clic aquí per a revelar les paraules secretes" + }, + "close": { + "message": "Tanca" + }, + "chromeRequiredForHardwareWallets": { + "message": "Necessites fer servir MetaMask amb Google Chrome per a connectar-te al teu Moneder Hardware." + }, + "confirm": { + "message": "Confirma" + }, + "confirmed": { + "message": "Confirmat" + }, + "confirmPassword": { + "message": "Confirma la contrasenya" + }, + "confirmSecretBackupPhrase": { + "message": "Confirma la teva frase de recuperació secreta" + }, + "congratulations": { + "message": "Felicitats" + }, + "connectHardwareWallet": { + "message": "Connectar Moneder Hardaware" + }, + "connect": { + "message": "Connecta" + }, + "connectingTo": { + "message": "Connectant a $1 " + }, + "connectingToKovan": { + "message": "Conectant a la xarxa de Kovan Test" + }, + "connectingToMainnet": { + "message": "Connectant a Xarxa Principal Ethereum" + }, + "connectingToRopsten": { + "message": "Connectant a la xarxa de test Ropsten" + }, + "connectingToRinkeby": { + "message": "Connectant a la Xarxa de Prova Rinkeby" + }, + "connectingToLocalhost": { + "message": "Connectant al host local 8545" + }, + "connectingToGoerli": { + "message": "Connectant a Xarxa de Prova Goerli" + }, + "continueToWyre": { + "message": "Continua a Wyre" + }, + "continueToCoinSwitch": { + "message": "Continua a CoinSwitch" + }, + "contractDeployment": { + "message": "Desplegament de Contracte" + }, + "copiedExclamation": { + "message": "S'ha copiat!" + }, + "copyAddress": { + "message": "Copiar adreça al porta-retalls" + }, + "copyTransactionId": { + "message": "Copia la ID de la transacció" + }, + "copiedTransactionId": { + "message": "ID de transacció copiada" + }, + "copyToClipboard": { + "message": "Copia al porta-retalls" + }, + "copyPrivateKey": { + "message": "Aquesta és la teva clau privada (fes clic per a copiar)" + }, + "create": { + "message": "Crea" + }, + "createAccount": { + "message": "Crea " + }, + "createAWallet": { + "message": "Crea un Moneder" + }, + "createPassword": { + "message": "Crear Contrasenya" + }, + "currencyConversion": { + "message": "Conversió de divisa" + }, + "currentLanguage": { + "message": "Llengua Actual" + }, + "customGas": { + "message": "Customitza el gas" + }, + "customGasSubTitle": { + "message": "Augmentar la tarifa pot disminuir els temps de processament, però això no està garantit." + }, + "customToken": { + "message": "Fitxa a Mida" + }, + "customRPC": { + "message": "RPC a mida" + }, + "decimalsMustZerotoTen": { + "message": "Els decimals han de ser al menys 0, i no més de 36." + }, + "decimal": { + "message": "Decimals de precisió" + }, + "defaultNetwork": { + "message": "La xarxa per defecte per a les transaccions Ether és Main Net." + }, + "delete": { + "message": "Suprimeix" + }, + "deleteAccount": { + "message": "Elimina el compte" + }, + "deposit": { + "message": "Depòsit" + }, + "depositEther": { + "message": "Diposita Ether" + }, + "details": { + "message": "Detalls" + }, + "directDepositEther": { + "message": "Diposita Ether directament" + }, + "directDepositEtherExplainer": { + "message": "Si ja tens una mica d'Ether, la manera més ràpida de posar Ether al teu nou moneder és per dipòsit directe." + }, + "done": { + "message": "Fet" + }, + "downloadGoogleChrome": { + "message": "Descarrega Google Chrome" + }, + "downloadSecretBackup": { + "message": "Descarrega aquesta Frase Secreta de Recuperació i guarda-la emmagatzemada de forma segura a un dispositiu d'emmagatzematge o disc dur extern encriptat." + }, + "downloadStateLogs": { + "message": "Descarregar Registres d'Estat" + }, + "dontHaveAHardwareWallet": { + "message": "No tens una cartera de hardware?" + }, + "dropped": { + "message": "Caigut" + }, + "edit": { + "message": "Edita" + }, + "editContact": { + "message": "Editar Contacte" + }, + "endOfFlowMessage1": { + "message": "Has passat el test - mantingues la teva seedphrase segura, és la teva responsabilitat!" + }, + "endOfFlowMessage2": { + "message": "Consells per a un emmagatzematge segur" + }, + "endOfFlowMessage3": { + "message": "Guardar una còpia de seguretat en múltiples llocs." + }, + "endOfFlowMessage4": { + "message": "No comparteixis mai la frase amb ningú." + }, + "endOfFlowMessage5": { + "message": "Estigues atent amb el phishing! MetaMask no et preguntarà mai espontàniament la teva frase de recuperació." + }, + "endOfFlowMessage6": { + "message": "Si necessites fer una còpia de seguretat de la teva frase de recuperació una altra vegada, la pots trobar a Configuració-> Seguretat." + }, + "endOfFlowMessage7": { + "message": "Si mai tens preguntes o veus alguna cosa sospitosa, envia un correu a support@metamask.io." + }, + "endOfFlowMessage8": { + "message": "MetaMask no pot recuperar la teva seedphrase. Descobreix per què." + }, + "endOfFlowMessage9": { + "message": "Més informació." + }, + "endOfFlowMessage10": { + "message": "Tot fet" + }, + "ensRegistrationError": { + "message": "Error al registre de nom ENS" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "El nom ENS no s'ha trovat a la xarxa actual. Prova a cambiar a la xarxa principal d'Ethereum." + }, + "enterAnAlias": { + "message": "Introdueix Àlies" + }, + "enterPassword": { + "message": "Introdueix contrasenya" + }, + "enterPasswordContinue": { + "message": "Introdueix la contrasenya per continuar" + }, + "ethereumPublicAddress": { + "message": "Adreça Pública d'Ethereum" + }, + "etherscanView": { + "message": "Veure compte a Etherscan" + }, + "estimatedProcessingTimes": { + "message": "Temps de processament estimats" + }, + "expandView": { + "message": "Eixamplar Vista" + }, + "exportPrivateKey": { + "message": "Exportar Clau Privada." + }, + "failed": { + "message": "Fallit" + }, + "fast": { + "message": "Ràpid" + }, + "faster": { + "message": "Més ràpid" + }, + "fileImportFail": { + "message": "La importació no funciona? Fes clic aquí!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "Oblida aquest dispositiu" + }, + "from": { + "message": "Des de" + }, + "functionType": { + "message": "Tipus de Funció" + }, + "gasLimit": { + "message": "Límit de gas" + }, + "gasLimitInfoModalContent": { + "message": "El límit de gas és la màxima quantitat d'unitats de gas que estàs disposat a gastar." + }, + "gasLimitTooLow": { + "message": "El límit de gas ha de ser al menys 21000" + }, + "gasUsed": { + "message": "Gas utilitzat" + }, + "gasPrice": { + "message": "Preu del Gas (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "Preu del Gas Extremadament Baix" + }, + "gasPriceInfoModalContent": { + "message": "El preu del gas especifica la quantitat d'Ether que estàs disposat a pagar per cada unitat de gas." + }, + "gasPriceNoDenom": { + "message": "Preu del Gas" + }, + "generalSettingsDescription": { + "message": "Conversió de divises, divisa principal, idioma, icones d'identificació única" + }, + "getEther": { + "message": "Aconsegueix Ether" + }, + "getEtherFromFaucet": { + "message": "Aconsegueix Ether d'una aixeta per $1", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "Aconsegueix ajuda." + }, + "getStarted": { + "message": "Comença" + }, + "happyToSeeYou": { + "message": "Ens alegrem de veure't." + }, + "hardwareWalletConnected": { + "message": "Moneder hardware connectat" + }, + "hardwareWallets": { + "message": "Connectar un moneder hardware" + }, + "hardwareWalletsMsg": { + "message": "Selecciona una cartera de hardware que t'agradaria utilizar amb MetaMask" + }, + "havingTroubleConnecting": { + "message": "Problemes per connectar?" + }, + "here": { + "message": "aquí", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hexData": { + "message": "Dades Hex" + }, + "hide": { + "message": "Amaga" + }, + "hideTokenPrompt": { + "message": "Amagar fitxa?" + }, + "history": { + "message": "Historial" + }, + "import": { + "message": "Importa", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "Importa compte" + }, + "importAccountMsg": { + "message": "Els comptes importats no s'associaran amb la teva frase de recuperació creada originalment a MetaMask. Aprèn més sobre els comptes importats" + }, + "importAccountSeedPhrase": { + "message": "Importa un Compte amb Phrase de Recuperació" + }, + "importWallet": { + "message": "Importar Moneder" + }, + "importYourExisting": { + "message": "Importa el teu moneder utilitzant la frase de recuperació de 12 paraules" + }, + "imported": { + "message": "Importats", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "Importa utilitzant la frase de seeds del compte" + }, + "infoHelp": { + "message": "Informació i Ajuda" + }, + "initialTransactionConfirmed": { + "message": "La teva transacció inicial ha sigut confirmada per la xarxa. Fes clic a OK per tornar enrere." + }, + "insufficientBalance": { + "message": "Balanç insuficient." + }, + "insufficientFunds": { + "message": "Fons insuficients." + }, + "insufficientTokens": { + "message": "Tokens insuficients." + }, + "invalidAddress": { + "message": "Adreça no vàlida" + }, + "invalidAddressRecipient": { + "message": "L'adreça del recipient no és vàlida" + }, + "knownAddressRecipient": { + "message": "Adreça de contracte coneguda" + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "No hi ha xarxa ETH, posar en minúscules" + }, + "invalidInput": { + "message": "Entrada no vàlida." + }, + "invalidRPC": { + "message": "URL de RPC" + }, + "invalidBlockExplorerURL": { + "message": "URL de Block Explorer" + }, + "invalidSeedPhrase": { + "message": "Frase de recuperació no vàlida" + }, + "jsonFile": { + "message": "Arxiu JSON", + "description": "format for importing an account" + }, + "kovan": { + "message": "Xarxa de Prova Kovan" + }, + "learnMore": { + "message": "Saber més" + }, + "ledgerAccountRestriction": { + "message": "Has de fer servir el teu últim compte abans de poder afegir-ne un altre." + }, + "letsGoSetUp": { + "message": "Sí, posem-nos en marxa!" + }, + "likeToAddTokens": { + "message": "T'agradaria afegir aquestes fitxes?" + }, + "links": { + "message": "Enllaços" + }, + "liveGasPricePredictions": { + "message": "Prediccions del preu del gas en directe" + }, + "loading": { + "message": "S'està carregant..." + }, + "loadingTokens": { + "message": "Carregant els tokens..." + }, + "loadMore": { + "message": "Carregar Més" + }, + "localhost": { + "message": "Host local 8545" + }, + "lock": { + "message": "Tanca la sessió" + }, + "mainnet": { + "message": "Xarxa Ethereum principal" + }, + "memorizePhrase": { + "message": "Memoritza aquesta frase" + }, + "memo": { + "message": "notes" + }, + "message": { + "message": "Missatge" + }, + "metamaskDescription": { + "message": "Conectant-te a Ethereum i la web descentralitzada." + }, + "metamaskVersion": { + "message": "Versió MetaMask" + }, + "mobileSyncText": { + "message": "Si us plau, introdueix la teva contrasenya per confirmar que ets tu!" + }, + "myAccounts": { + "message": "Els meus Comptes" + }, + "myWalletAccounts": { + "message": "Els meus Comptes de Moneder" + }, + "myWalletAccountsDescription": { + "message": "Tots els teus comptes creats a MetaMask s'afegiran automàticament a aquesta secció." + }, + "mustSelectOne": { + "message": "Has de seleccionar " + }, + "needEtherInWallet": { + "message": "Per a interactuar amb aplicacions descentralitzades fent servir MetaMask, necessitaràs Ether al teu moneder." + }, + "needImportFile": { + "message": "Has de seleccionar un arxiu per a importar.", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "No es poden enviar quantitats negatives de ETH." + }, + "networkName": { + "message": "Nom de la xarxa" + }, + "networks": { + "message": "Xarxes" + }, + "networkSettingsDescription": { + "message": "Afegeix i edita xarxes RPC a mida" + }, + "nevermind": { + "message": "No importa" + }, + "newAccount": { + "message": "Nou compte" + }, + "newAccountDetectedDialogMessage": { + "message": "Nova adreça detectada! Clica aquí per afegir la teva llibreta d'adreces." + }, + "newAccountNumberName": { + "message": "Compte $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "Nou Contacte" + }, + "newContract": { + "message": "Nou Contracte" + }, + "newPassword": { + "message": "Nova contrasenya (mínim 8 caràcters)" + }, + "newNetwork": { + "message": "Nova Xarxa" + }, + "newToMetaMask": { + "message": "Nou a MetaMask?" + }, + "noAlreadyHaveSeed": { + "message": "No, ja tinc una frase de recuperació." + }, + "protectYourKeys": { + "message": "Protegeix les Teves Claus!" + }, + "protectYourKeysMessage1": { + "message": "Vigila amb la teva frase de recuperació —s'han documentat casos de llocs web que intenten imitar MetaMask. MetaMask mai no et demanarà la frase de recuperació!" + }, + "protectYourKeysMessage2": { + "message": "Mantingues segura la teva frase. Si veus alguna cosa sospitosa, o no estàs segur d'un lloc web, envia un correu a support@metamask.io" + }, + "rpcUrl": { + "message": "Nova URL de RPC" + }, + "optionalChainId": { + "message": "Cadena ID (opcional)" + }, + "optionalSymbol": { + "message": "Símbol (opcional)" + }, + "newTotal": { + "message": "Nou total" + }, + "newTransactionFee": { + "message": "Nova Tarifa de Transacció" + }, + "next": { + "message": "Següent" + }, + "noAddressForName": { + "message": "No existeix cap adreça amb aquest nom." + }, + "noConversionRateAvailable": { + "message": "No hi ha cap tarifa de conversió disponible" + }, + "noTransactions": { + "message": "No tens transaccions" + }, + "notEnoughGas": { + "message": "Gas Insuficient" + }, + "noWebcamFoundTitle": { + "message": "Càmera web no trobada" + }, + "noWebcamFound": { + "message": "No s'ha trovat la webcam del teu ordinador. Si us plau prova de nou." + }, + "ofTextNofM": { + "message": "de" + }, + "orderOneHere": { + "message": "Demana un Trezor o un Ledger i congela les teves inversions" + }, + "origin": { + "message": "Origen" + }, + "parameters": { + "message": "Paràmetres" + }, + "participateInMetaMetrics": { + "message": "Participar a MetaMetrics" + }, + "participateInMetaMetricsDescription": { + "message": "Participa a MetaMetrics per ajudar-nos a fer MetaMask millor" + }, + "password": { + "message": "Contrasenya" + }, + "passwordsDontMatch": { + "message": "Les contrasenyes no coincideixen" + }, + "passwordNotLongEnough": { + "message": "La contrasenya no és prou llarga" + }, + "pastePrivateKey": { + "message": "Enganxa la teva cadena clau privada aquí:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "pendent" + }, + "personalAddressDetected": { + "message": "Adreça personal detectada. Introduir l'adreça del contracte de fitxa." + }, + "primaryCurrencySetting": { + "message": "Divisa principal" + }, + "primaryCurrencySettingDescription": { + "message": "Selecciona Natiu per a prioritzar la mostra de valors en la divisa nadiua de la cadena (p. ex. ETH). Selecciona Fiat per prioritzar la mostra de valors en la divisa fiduciària seleccionada." + }, + "privacyMsg": { + "message": "Política de privadesa" + }, + "privateKey": { + "message": "Clau privada", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "Atenció: No divulguis mai aquesta clau. Qualsevol amb les teves claus privades pot robar qualsevol actiu que tinguis al teu compte." + }, + "privateNetwork": { + "message": "Xarxa privada" + }, + "queue": { + "message": "Cua" + }, + "readdToken": { + "message": "Pots tornar a afegir aquesta fitxa en el futur anant a \"Afegir fitxa\" al menu d'opcions dels teus comptes." + }, + "recipientAddress": { + "message": "Adreça del destinatari" + }, + "recipientAddressPlaceholder": { + "message": "Cerca, adreça pública (0x), o ENS" + }, + "rejectAll": { + "message": "Rebutja-ho tot" + }, + "rejectTxsN": { + "message": "Rebutja les transaccions de $1" + }, + "rejectTxsDescription": { + "message": "Estàs a punt de refusar una tanda de $1 transaccions " + }, + "rejected": { + "message": "Rebutjat" + }, + "reset": { + "message": "Restableix" + }, + "resetAccount": { + "message": "Reiniciar Compte" + }, + "resetAccountDescription": { + "message": "Reiniciar el teu compte esborrarà el teu historial de transaccions." + }, + "deleteNetwork": { + "message": "Esborrar Xarxa?" + }, + "deleteNetworkDescription": { + "message": "Estàs segur que vols eliminar aquesta xarxa?" + }, + "remindMeLater": { + "message": "Recorda-m'ho més tard" + }, + "restoreFromSeed": { + "message": "Restaurar compte?" + }, + "restoreAccountWithSeed": { + "message": "Restaura el teu compte amb Frase de Recuperació" + }, + "requestsAwaitingAcknowledgement": { + "message": "peticions esperant ser reconegudes" + }, + "required": { + "message": "Obligatori" + }, + "restore": { + "message": "Restaura" + }, + "revealSeedWords": { + "message": "Revelar Paraules de Recuperació" + }, + "revealSeedWordsTitle": { + "message": "Frase de Recuperació" + }, + "revealSeedWordsDescription": { + "message": "Si mai canvies el navegador o l'ordinador, necessitaràs aquesta frase de recuperació per accedir als teus comptes. Guarda-la a un lloc segur i secret." + }, + "revealSeedWordsWarningTitle": { + "message": "NO comparteixis aquesta frase amb ningú!" + }, + "revealSeedWordsWarning": { + "message": "Aquestes paraules poden ser utilitzades per a robar tots els teus comptes." + }, + "remove": { + "message": "Suprimeix" + }, + "removeAccount": { + "message": "Suprimir el compte" + }, + "removeAccountDescription": { + "message": "Aquest compte serà retirat del teu moneder. Si us plau, assegura't que tens la frase de recuperació original o la clau privada per a aquest compte importat abans de continuar. Pots importar o crear comptes novament des del desplegable de comptes." + }, + "readyToConnect": { + "message": "Estàs llest per a connectar?" + }, + "rinkeby": { + "message": "Xarxa del test Rinkeby" + }, + "ropsten": { + "message": "Xarxa de Prova Ropsten" + }, + "goerli": { + "message": "Xarxa de test Goerli" + }, + "save": { + "message": "Desa" + }, + "slow": { + "message": "Lent" + }, + "slower": { + "message": "Més lent" + }, + "saveAsCsvFile": { + "message": "Guarda com a Arxiu CSV" + }, + "scanInstructions": { + "message": "Col·loca el codi QR davant la teva càmera" + }, + "scanQrCode": { + "message": "Escanejar Codi QR" + }, + "search": { + "message": "Cerca" + }, + "searchResults": { + "message": "Resultats de Cerca" + }, + "secretBackupPhrase": { + "message": "Frase de recuperació secreta" + }, + "secretBackupPhraseDescription": { + "message": "La teva frase de recuperació secreta facilita la còpia de seguretat i la recuperació del teu compte." + }, + "secretBackupPhraseWarning": { + "message": "ATENCIÓ: No divulguis mai la teva frase de recuperació. Qualsevol amb aquesta frase pot utilitzar el teu Ether per sempre." + }, + "secretPhrase": { + "message": "Introdueix aquí la teva frase secreta de dotze paraules per a recuperar la teva caixa forta." + }, + "securityAndPrivacy": { + "message": "Seguretat i privacitat" + }, + "securitySettingsDescription": { + "message": "Configuració de privacitat i frase de recuperació del moneder" + }, + "seedPhrasePlaceholder": { + "message": "Separa cada paraula amb un únic espai" + }, + "seedPhraseReq": { + "message": "Les frases de recuperació tenen 12 paraules" + }, + "selectCurrency": { + "message": "Selecciona divisa" + }, + "selectEachPhrase": { + "message": "Si us plau selecciona cada frase per a assegurar-te que és correcta." + }, + "selectLocale": { + "message": "Selecciona Configuració Regional" + }, + "selectType": { + "message": "Selecciona el tipus" + }, + "send": { + "message": "Envia" + }, + "sendAmount": { + "message": "Enviar Quantitat" + }, + "sendETH": { + "message": "Envia ETH" + }, + "sendTokens": { + "message": "Enviar Fitxes" + }, + "sentEther": { + "message": "envia ether" + }, + "sentTokens": { + "message": "fitxes enviades" + }, + "separateEachWord": { + "message": "Separa cada paraula amb un sol espai" + }, + "searchTokens": { + "message": "Tokens per cercar" + }, + "selectAnAccount": { + "message": "Selecciona un Compte" + }, + "selectAnAccountHelp": { + "message": "Selecciona el compte que vols veure a MetaMask" + }, + "selectAHigherGasFee": { + "message": "Selecciona un preu de gas més alt per a accelerar el procès de la teva transacció.*" + }, + "selectHdPath": { + "message": "Selecciona Ruta HD" + }, + "selectPathHelp": { + "message": "Si no veus els teus comptes Ledger a sota, prova canviant la ruta a \"Legacy (MEW / MyCrypto)\"" + }, + "settings": { + "message": "Configuració" + }, + "showAdvancedGasInline": { + "message": "Controls de gas avançats" + }, + "showAdvancedGasInlineDescription": { + "message": "Selecciona això per a mostrar el preu del gas i els controls de límit directament a les pantalles d'enviament i confirmació." + }, + "showFiatConversionInTestnets": { + "message": "Mostra Conversió a Testnets" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Selecciona aquest per mostrar conversió Fiat a Testnets" + }, + "showPrivateKeys": { + "message": "Mostrar Claus Privades" + }, + "showHexData": { + "message": "Mostra les dades Hex" + }, + "showHexDataDescription": { + "message": "Selecciona això per a mostrar el camp de dades Hex a la pantalla d'enviament" + }, + "sign": { + "message": "Signar" + }, + "signatureRequest": { + "message": "Sol·licitud de Signatura" + }, + "signed": { + "message": "Signat" + }, + "signNotice": { + "message": "Signar aquest missatge pot tenir efectes secundaris perillosos. Signa només els missatges de llocs en els quals confiïs plenament amb la totalitat del teu compte. Aquest mètode perillós serà retirat en versions posteriors." + }, + "sigRequest": { + "message": "Sol·licitud de Signatura" + }, + "somethingWentWrong": { + "message": "Ui! Alguna cosa ha fallat." + }, + "speedUp": { + "message": "Accelerar" + }, + "speedUpCancellation": { + "message": "Accelera aquesta cancel·lació" + }, + "speedUpTransaction": { + "message": "Accelerar aquesta transacció" + }, + "switchNetworks": { + "message": "Intercanviar Xarxes" + }, + "stateLogs": { + "message": "Registres d'estat" + }, + "stateLogsDescription": { + "message": "Els registres d'estat contenen les teves adreces de compte públiques i les transaccions enviades." + }, + "stateLogError": { + "message": "Error al recuperar els registres d'estat." + }, + "step1HardwareWallet": { + "message": "1. Connectar Moneder Hardware" + }, + "step1HardwareWalletMsg": { + "message": "Connecta la teva cartera de hardware directament al teu ordinador." + }, + "step2HardwareWallet": { + "message": "2. Selecciona un Compte" + }, + "step2HardwareWalletMsg": { + "message": "Selecciona el compte que vols veure. Només pots seleccionar 1 cada cop." + }, + "step3HardwareWallet": { + "message": "3. Comença a utilitzar dApps i altres!" + }, + "step3HardwareWalletMsg": { + "message": "Fes servir el teu compte de hardware com ho faries amb qualsevol compte Ethereum. Inicia sessió a DApps, envia Eth, compra i emmagatzema fitxes ERC20 i fitxes No Fungibles com CryptoKitties." + }, + "storePhrase": { + "message": "Guarda aquesta frase a un gestor de contrasenyes com Contrasenya 1" + }, + "submitted": { + "message": "Enviat" + }, + "supportCenter": { + "message": "Visita el nostre Centre de Suport" + }, + "symbol": { + "message": "Símbol" + }, + "symbolBetweenZeroTwelve": { + "message": "El símbol ha de tenir com a mínim 11 caràcters." + }, + "syncWithMobile": { + "message": "Sincronitza amb el mòbil" + }, + "syncWithMobileTitle": { + "message": "Sincronitzar amb mòbil" + }, + "syncWithMobileDesc": { + "message": "Pots sincronitzar els teus comptes i la teva informació amb el teu dispositiu mòbil. Obre l'app mòbil de MetaTask, ves a \"Configuració\" i \"Sincronitzar desde l" + }, + "syncWithMobileDescNewUsers": { + "message": "Si acabes d'obrir l'app mòbil MetaMask per primer cop, tan sols has de seguir els passos del teu telèfon." + }, + "syncWithMobileScanThisCode": { + "message": "Escaneja aquest codi amb la teva aplicació mòbil de MetaMask" + }, + "syncWithMobileBeCareful": { + "message": "Assegura't que no hi ha ningú mirant la teva pantalla quan escanegis aquest codi" + }, + "syncWithMobileComplete": { + "message": "Les teves dades s'han sincronitzat amb èxit. Disfruta de l'app mòbil de MetaMask!" + }, + "terms": { + "message": "Condicions d'ús" + }, + "thisWillCreate": { + "message": "Això crearà un nou moneder i frase de recuperació" + }, + "tips": { + "message": "Propines" + }, + "to": { + "message": "A" + }, + "tokenAlreadyAdded": { + "message": "El token ja s'ha afegit." + }, + "tokenContractAddress": { + "message": "Adreça del contracte del token" + }, + "tokenSymbol": { + "message": "Símbol de Fitxa" + }, + "transaction": { + "message": "transacció" + }, + "transactionConfirmed": { + "message": "Transacció confirmada per $2." + }, + "transactionCreated": { + "message": "Transacció creada amb un valor de $1 a $2." + }, + "transactionDropped": { + "message": "La transacció ha caigut a $2." + }, + "transactionSubmitted": { + "message": "Transacció enviada amb un preu del gas de $1 a $2." + }, + "transactionResubmitted": { + "message": "Transacció reenviada amb tarifa del gas incrementada d'$1 a $2" + }, + "transactionUpdated": { + "message": "Transacció actualitzada a $2." + }, + "transactionErrored": { + "message": "La transacció ha tingut un error." + }, + "transactionCancelAttempted": { + "message": "Intent de cancel·lació de transacció amb tarifa del gas d'$1 a $2 " + }, + "transactionCancelSuccess": { + "message": "Transacció cancel·lada amb èxit per $2" + }, + "transactionError": { + "message": "Error de Transacció. Excepció llançada en el codi de contracte." + }, + "transactionErrorNoContract": { + "message": "Provant d'invocar una funció o una adreça no contractada" + }, + "transactionFee": { + "message": "Preu de la transacció" + }, + "transactionTime": { + "message": "Temps de transacció" + }, + "transfer": { + "message": "Transferència" + }, + "transferBetweenAccounts": { + "message": "Transferir entre els meus comptes" + }, + "transferFrom": { + "message": "Transferir Des de" + }, + "troubleTokenBalances": { + "message": "Hem tingut problemes en carregar el teu saldo de fitxes. Els pots veure", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "Torna-ho a provar" + }, + "typePassword": { + "message": "Tecleja la teva contrasenya de MetaMask" + }, + "unapproved": { + "message": "Pendent d'aprovació" + }, + "units": { + "message": "unitats" + }, + "unknown": { + "message": "Desconegut" + }, + "unknownNetwork": { + "message": "Xarxa privada desconeguda" + }, + "unknownQrCode": { + "message": "Error: No hem pogut identificar aquest codi QR" + }, + "unknownCameraErrorTitle": { + "message": "Ups! Hi ha alguna cosa que no ha funcionat..." + }, + "unknownCameraError": { + "message": "Hi ha hagut un error mentre intentaves accedir a la teva càmera" + }, + "unlock": { + "message": "Desbloqueja" + }, + "unlockMessage": { + "message": "La web descentralitzada està esperant" + }, + "updatedWithDate": { + "message": "Actualitzat $1" + }, + "urlErrorMsg": { + "message": "Els URIs requereixen el prefix HTTP/HTTPS apropiat." + }, + "usedByClients": { + "message": "Utilitzat per tot tipus de clients" + }, + "userName": { + "message": "Nom d'usuari" + }, + "viewAccount": { + "message": "Mostra el compte" + }, + "viewinExplorer": { + "message": "Mostra a Explorer" + }, + "viewContact": { + "message": "Veure Contacte" + }, + "viewOnCustomBlockExplorer": { + "message": "Mostra a $1" + }, + "viewOnEtherscan": { + "message": "Veure a Etherscan" + }, + "visitWebSite": { + "message": "Visita el nostre lloc web" + }, + "walletSeed": { + "message": "Cartera de seeds" + }, + "welcomeBack": { + "message": "Benvingut de nou!" + }, + "welcome": { + "message": "Benvingut a MetaMask" + }, + "writePhrase": { + "message": "Escriu aquesta frase en un tros de paper i guarda'l en un lloc segur. Si vols més seguretat encara, escriu-la en diversos trossos de paper i guarda'ls cadascun a 2 - 3 llocs diferents." + }, + "yesLetsTry": { + "message": "Sí, provem" + }, + "youNeedToAllowCameraAccess": { + "message": "Has de permetre l'accés a la càmera per fer servir aquesta característica." + }, + "yourSigRequested": { + "message": "Es necessita la teva firma" + }, + "youSign": { + "message": "Estàs signant" + }, + "yourPrivateSeedPhrase": { + "message": "La teva frase privada de seeds" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "Gas a cost zero accelerant-se" + } +} diff --git a/app/_locales/cs/messages.json b/app/_locales/cs/messages.json index 187ffd95fe4b..b1f50c457369 100644 --- a/app/_locales/cs/messages.json +++ b/app/_locales/cs/messages.json @@ -1,52 +1,7 @@ { - "privacyMode": { - "message": "Režim súkromia" - }, - "privacyModeDescription": { - "message": "Webové stránky musia požiadaÅ¥ o prístup k zobrazeniu informácií o vaÅ¡om úÄte." - }, - "exposeAccounts": { - "message": "Vystavte úÄty" - }, - "exposeDescription": { - "message": "Vystavte úÄty na aktuální webové stránky. UžiteÄné pro starší dappy." - }, - "confirmExpose": { - "message": "Opravdu chcete své úÄty vystavit na stávajícím webu?" - }, - "confirmClear": { - "message": "Naozaj chcete vymazaÅ¥ schválené webové stránky?" - }, - "clearApprovalDataSuccess": { - "message": "Schválené údaje webových stránek byly úspěšnÄ› zruÅ¡eny." - }, - "approvalData": { - "message": "Údaje o schválení" - }, - "approvalDataDescription": { - "message": "Vymažte schválené údaje webových stránek, aby vÅ¡echny weby znovu požádaly o schválení." - }, - "clearApprovalData": { - "message": "Jasné údaje o schválení" - }, - "approve": { - "message": "Schválit" - }, "reject": { "message": "Odmítnout" }, - "providerAPIRequest": { - "message": "Požadavek API Ethereum" - }, - "reviewProviderRequest": { - "message": "PÅ™eÄtÄ›te si prosím tuto žádost API Ethereum." - }, - "providerRequestInfo": { - "message": "Níže uvedená doména se pokouší požádat o přístup k API Ethereum, aby mohla komunikovat s blokádou Ethereum. PÅ™ed schválením přístupu Ethereum vždy zkontrolujte, zda jste na správném místÄ›." - }, - "accept": { - "message": "PÅ™ijmout" - }, "account": { "message": "ÚÄet" }, @@ -56,12 +11,6 @@ "accountName": { "message": "Název úÄtu" }, - "address": { - "message": "Adresa" - }, - "addCustomToken": { - "message": "PÅ™idat vlastní token" - }, "addToken": { "message": "PÅ™idat token" }, @@ -71,9 +20,6 @@ "amount": { "message": "Částka" }, - "amountPlusGas": { - "message": "Částka + palivo" - }, "appDescription": { "message": "Ethereum rozšíření prohlížeÄe", "description": "The description of the application" @@ -82,6 +28,9 @@ "message": "MetaMask", "description": "The name of the application" }, + "approve": { + "message": "Schválit" + }, "approved": { "message": "Schváleno" }, @@ -91,84 +40,47 @@ "attributions": { "message": "Zásluhy" }, - "available": { - "message": "Dostupné" - }, "back": { "message": "ZpÄ›t" }, "balance": { "message": "Zůstatek:" }, - "balances": { - "message": "Zůstatek tokenu" - }, - "balanceIsInsufficientGas": { - "message": "Nedostatek prostÅ™edků pro aktuální množství paliva" - }, - "beta": { - "message": "BETA" - }, - "betweenMinAndMax": { - "message": "musí být vÄ›tší nebo roven $1 a menší nebo roven $2.", - "description": "helper for inputting hex as decimal input" - }, "blockiesIdenticon": { "message": "Použít Blockies Identicon" }, - "borrowDharma": { - "message": "PújÄit si pÅ™es Dharma (Beta)" - }, "builtInCalifornia": { "message": "MetaMask je navržen a vytvoÅ™en v Kalifornii." }, - "buy": { - "message": "Koupit" - }, - "buyCoinbase": { - "message": "Nákup na Coinbase" - }, - "buyCoinbaseExplainer": { - "message": "Coinbase je svÄ›tovÄ› nejoblíbenÄ›jší místo k nákupu a prodeji bitcoinu, etherea nebo litecoinu." - }, "buyCoinSwitch": { "message": "Nákup na CoinSwitch" }, "buyCoinSwitchExplainer": { "message": "CoinSwitch je jediným místem, kde můžete vyměňovat více než 300 kryptocurrencí za nejlepší cenu." }, - "ok": { - "message": "Ok" - }, "cancel": { "message": "ZruÅ¡it" }, - "classicInterface": { - "message": "Použít klasické rozhraní" - }, - "clickCopy": { - "message": "Kliknutím zkopírovat" - }, "confirm": { "message": "Potvrdit" }, "confirmed": { "message": "Potvrzeno" }, - "confirmContract": { - "message": "Potvrdit kontrakt" - }, "confirmPassword": { "message": "Potvrdit heslo" }, - "confirmTransaction": { - "message": "Potvrdit transakci" + "connectingToKovan": { + "message": "PÅ™ipojuji se k Kovan Test Network" }, - "continue": { - "message": "PokraÄovat" + "connectingToMainnet": { + "message": "PÅ™ipojuji se k Main Ethereum Network" + }, + "connectingToRopsten": { + "message": "PÅ™ipojuji se k Ropsten Test Network" }, - "continueToCoinbase": { - "message": "PÅ™ejít na Coinbase" + "connectingToRinkeby": { + "message": "PÅ™ipojuji se k Rinkeby Test Network" }, "continueToCoinSwitch": { "message": "PÅ™ejít na CoinSwitch" @@ -176,30 +88,12 @@ "contractDeployment": { "message": "Nasazení kontraktu" }, - "conversionProgress": { - "message": "Provádí se pÅ™evod" - }, - "copiedButton": { - "message": "Zkopírováno" - }, - "copiedClipboard": { - "message": "Zkopírováno do schránky" - }, "copiedExclamation": { "message": "Zkopírováno!" }, - "copiedSafe": { - "message": "Zkopíroval jsem to na bezpeÄné místo" - }, - "copy": { - "message": "Kopírovat" - }, "copyToClipboard": { "message": "Kopírovat do schránky" }, - "copyButton": { - "message": " Kopírovat " - }, "copyPrivateKey": { "message": "Toto je váš privátní klÃ­Ä (kliknutím zkopírujte)" }, @@ -209,28 +103,12 @@ "createAccount": { "message": "VytvoÅ™it úÄet" }, - "createDen": { - "message": "VytvoÅ™it" - }, - "crypto": { - "message": "Krypto", - "description": "Exchange type (cryptocurrencies)" - }, - "currentConversion": { - "message": "Aktuální pÅ™evod" - }, - "currentNetwork": { - "message": "Aktuální síť" - }, "customGas": { "message": "Nastavit palivo" }, "customToken": { "message": "Vlastní token" }, - "customize": { - "message": "Nastavit" - }, "customRPC": { "message": "Vlastní RPC" }, @@ -243,39 +121,15 @@ "defaultNetwork": { "message": "Výchozí síť pro Etherové transakce je Main Net." }, - "denExplainer": { - "message": "Váš DEN je heslem Å¡ifrované uložiÅ¡tÄ› v MetaMasku." - }, "deposit": { "message": "Vklad" }, - "depositBTC": { - "message": "Vložte BTC na níže uvedenou adresu:" - }, - "depositEth": { - "message": "Vložit Eth" - }, "depositEther": { "message": "Vložit Ether" }, - "depositFiat": { - "message": "Vklad s fiat mÄ›nou" - }, - "depositFromAccount": { - "message": "Vložte z jiného úÄtu" - }, - "depositShapeShift": { - "message": "Vklad pÅ™es ShapeShift" - }, - "depositShapeShiftExplainer": { - "message": "Pokud vlastníte jiné kryptomÄ›ny, můžete je smÄ›nit Ether a vložit ho přímo do peněženky MetaMask. Bez založení úÄtu." - }, "details": { "message": "Podrobnosti" }, - "directDeposit": { - "message": "Přímý vklad" - }, "directDepositEther": { "message": "Vložit Ether přímo" }, @@ -294,39 +148,15 @@ "edit": { "message": "Upravit" }, - "editAccountName": { - "message": "Upravit název úÄtu" - }, - "emailUs": { - "message": "NapiÅ¡te nám e-mail!" - }, - "encryptNewDen": { - "message": "ZaÅ¡ifrujte svůj nový DEN" - }, "enterPassword": { "message": "Zadejte heslo" }, - "enterPasswordConfirm": { - "message": "Zadejte heslo k potvrzení" - }, - "passwordNotLongEnough": { - "message": "Heslo není dost dlouhé" - }, - "passwordsDontMatch": { - "message": "Hesla nejsou stejná" - }, "etherscanView": { "message": "ProhlédnÄ›te si úÄet na Etherscan" }, - "exchangeRate": { - "message": "SmÄ›nný kurz" - }, "exportPrivateKey": { "message": "Exportovat privátní klíÄ" }, - "exportPrivateKeyWarning": { - "message": "Exportujte privátní klÃ­Ä na vlastní riziko." - }, "failed": { "message": "Neúspěšné" }, @@ -338,49 +168,18 @@ "message": "Import souboru nefunguje? KliknÄ›te sem!", "description": "Helps user import their account from a JSON file" }, - "followTwitter": { - "message": "Sledujte nás na Twitteru" - }, "from": { "message": "Od" }, - "fromToSame": { - "message": "Adresy odesílatele a příjemce nemohou být stejné" - }, - "fromShapeShift": { - "message": "Z ShapeShift" - }, - "gas": { - "message": "Palivo", - "description": "Short indication of gas cost" - }, - "gasFee": { - "message": "Poplatek za palivo" - }, "gasLimit": { "message": "Limit paliva" }, - "gasLimitCalculation": { - "message": "PoÄítáme doporuÄený limit paliva na základÄ› úspěšnosti v síti." - }, - "gasLimitRequired": { - "message": "Limit paliva je povinný" - }, "gasLimitTooLow": { "message": "Limit paliva musí být alespoň 21000" }, - "generatingSeed": { - "message": "Generuji klíÄovou frázi..." - }, "gasPrice": { "message": "Cena paliva (GWEI)" }, - "gasPriceCalculation": { - "message": "PoÄítáme doporuÄenou cenu paliva na základÄ› úspěšnosti v síti." - }, - "gasPriceRequired": { - "message": "Cena paliva je povinná" - }, "getEther": { "message": "Získejte Ether" }, @@ -388,48 +187,22 @@ "message": "Získejte Ether z faucetu za $1.", "description": "Displays network name for Ether faucet" }, - "greaterThanMin": { - "message": "musí být vÄ›tší nebo roven $1.", - "description": "helper for inputting hex as decimal input" - }, "here": { "message": "zde", "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, - "hereList": { - "message": "Tady je seznam!!!!" - }, "hide": { "message": "Skrýt" }, - "hideToken": { - "message": "Skrýt token" - }, "hideTokenPrompt": { "message": "Skrýt token?" }, - "howToDeposit": { - "message": "Jakým způsobem chcete vložit Ether?" - }, - "holdEther": { - "message": "Dovoluje vám držet ether a tokeny a slouží jako most k decentralizovaným aplikacím." - }, - "import": { - "message": "Import", - "description": "Button to import an account from a selected file" - }, "importAccount": { "message": "Import úÄtu" }, "importAccountMsg": { "message": "Importované úÄty nebudou spojeny s vaší původní MetaMaskovou klíÄovou frází. ZjistÄ›te více o importovaných úÄtech " }, - "importAnAccount": { - "message": "Import úÄtu" - }, - "importDen": { - "message": "Import existujícího DEN" - }, "imported": { "message": "Importováno", "description": "status showing that an account has been fully loaded into the keyring" @@ -449,86 +222,46 @@ "invalidAddressRecipient": { "message": "Adresa příjemce je neplatná" }, - "invalidGasParams": { - "message": "Neplatná parametry paliva" - }, "invalidInput": { "message": "Neplatný vstup." }, - "invalidRequest": { - "message": "Neplatný požadavek" - }, "invalidRPC": { "message": "Neplatné RPC URI" }, - "jsonFail": { - "message": "NÄ›co se pokazilo. Prosím, ujistÄ›te se, že váš JSON soubor má správný formát." + "invalidBlockExplorerURL": { + "message": "Neplatné Block Explorer URI" }, "jsonFile": { "message": "JSON soubor", "description": "format for importing an account" }, - "keepTrackTokens": { - "message": "Udržujte si záznamy o tokenech, které jste koupili s úÄtem v MetaMasku." - }, - "kovan": { - "message": "Kovan Test Network" - }, - "knowledgeDataBase": { - "message": "NavÅ¡tivte naÅ¡i Knowledge Base" - }, - "max": { - "message": "Max" - }, "learnMore": { "message": "ZjistÄ›te více." }, - "lessThanMax": { - "message": "musí být menší nebo roven $1.", - "description": "helper for inputting hex as decimal input" - }, "likeToAddTokens": { "message": "Chcete pÅ™idat tyto tokeny?" }, "links": { "message": "Odkazy" }, - "limit": { - "message": "Limit" - }, "loading": { "message": "NaÄítám..." }, "loadingTokens": { "message": "NaÄítám tokeny..." }, - "localhost": { - "message": "Localhost 8545" - }, - "login": { + "unlock": { "message": "PÅ™ihlásit" }, - "logout": { + "lock": { "message": "Odhlásit" }, - "loose": { - "message": "Nevázané" - }, - "loweCaseWords": { - "message": "slova klíÄové fráze mají pouze malá písmena" - }, - "mainnet": { - "message": "Main Ethereum Network" - }, "message": { "message": "Zpráva" }, "metamaskDescription": { "message": "MetaMask je bezpeÄný osobní trezor pro Ethereum." }, - "min": { - "message": "Minimum" - }, "myAccounts": { "message": "Moje úÄty" }, @@ -542,10 +275,6 @@ "message": "Musíte zvolit soubor k importu.", "description": "User is important an account and needs to add a file to continue" }, - "needImportPassword": { - "message": "Musíte zadat heslo pro zvolený soubor.", - "description": "Password and file needed to import an account" - }, "negativeETH": { "message": "Nelze odeslat zápornou Äástku ETH." }, @@ -565,67 +294,28 @@ "newPassword": { "message": "Nové heslo (min 8 znaků)" }, - "newRecipient": { - "message": "Nový příjemce" - }, - "newRPC": { - "message": "Nová RPC URL" - }, "next": { "message": "Další" }, "noAddressForName": { "message": "Pro toto jméno nebyla nastavena žádná adresa." }, - "noDeposits": { - "message": "Žádný vklad" - }, - "noTransactionHistory": { - "message": "Žádná historie transakcí." - }, "noTransactions": { "message": "Žádné transakce" }, - "notStarted": { - "message": "NezaÄalo" - }, - "oldUI": { - "message": "Staré rozhraní" - }, - "oldUIMessage": { - "message": "Vrátili jste se ke starému rozhraní. Můžete pÅ™epnout na nové rozhraní v nastavení v pravém horním menu." - }, - "or": { - "message": "nebo", - "description": "choice between creating or importing a new account" - }, - "passwordCorrect": { - "message": "UjistÄ›te se, že je vaÅ¡e heslo správnÄ›." - }, - "passwordMismatch": { - "message": "hesla nesouhlasí", - "description": "in password creation process, the two new password fields did not match" + "passwordsDontMatch": { + "message": "Hesla nejsou stejná" }, - "passwordShort": { - "message": "heslo je krátké", - "description": "in password creation process, the password is not long enough to be secure" + "passwordNotLongEnough": { + "message": "Heslo není dost dlouhé" }, "pastePrivateKey": { "message": "Vložte zde svůj privátní klíÄ:", "description": "For importing an account from a private key" }, - "pasteSeed": { - "message": "Svou klíÄovou frázi vložte zde!" - }, "personalAddressDetected": { "message": "Detekována osobní adresa. Zadejte adresu kontraktu tokenu." }, - "pleaseReviewTransaction": { - "message": "Zkontrolujte si transakci." - }, - "popularTokens": { - "message": "Oblíbené tokeny" - }, "privacyMsg": { "message": "Zásady ochrany osobních údajů" }, @@ -639,27 +329,12 @@ "privateNetwork": { "message": "Soukromá síť" }, - "qrCode": { - "message": "Ukázat QR kód" - }, "readdToken": { "message": "Tento token můžete v budoucnu pÅ™idat zpÄ›t s „PÅ™idat token“ v nastavení úÄtu." }, - "readMore": { - "message": "PÅ™eÄtÄ›te si více zde." - }, - "readMore2": { - "message": "PÅ™eÄtÄ›te si více." - }, - "receive": { - "message": "Obrdžet" - }, "recipientAddress": { "message": "Adresa příjemce" }, - "refundAddress": { - "message": "Adresa pro vrácení penÄ›z" - }, "rejected": { "message": "Odmítnuto" }, @@ -669,92 +344,30 @@ "restoreFromSeed": { "message": "Obnovit z seed fráze" }, - "restoreVault": { - "message": "Obnovit trezor" - }, "required": { "message": "Povinné" }, - "retryWithMoreGas": { - "message": "Opakujte s vyšší cenou paliva" - }, - "walletSeed": { - "message": "KlíÄová fráze peněženky" - }, "revealSeedWords": { "message": "Zobrazit slova klíÄové fráze" }, "revealSeedWordsWarning": { "message": "Nebnovujte slova klíÄové fráze na veÅ™ejnosti! Tato slova mohou být použita k odcizení veÅ¡kerých vyaÅ¡ich úÄtů." }, - "revert": { - "message": "Zvrátit" - }, - "rinkeby": { - "message": "Rinkeby Test Network" - }, - "ropsten": { - "message": "Ropsten Test Network" - }, - "currentRpc": { - "message": "SouÄasné RPC" - }, - "connectingToMainnet": { - "message": "PÅ™ipojuji se k Main Ethereum Network" - }, - "connectingToRopsten": { - "message": "PÅ™ipojuji se k Ropsten Test Network" - }, - "connectingToKovan": { - "message": "PÅ™ipojuji se k Kovan Test Network" - }, - "connectingToRinkeby": { - "message": "PÅ™ipojuji se k Rinkeby Test Network" - }, - "connectingToUnknown": { - "message": "PÅ™ipojuji se k neznámé síti" - }, - "sampleAccountName": { - "message": "NapÅ™. můj nový úÄet", - "description": "Help user understand concept of adding a human-readable name to their account" - }, "save": { "message": "Uložit" }, - "reprice_title": { - "message": "ZmÄ›nit cenu transakce" - }, - "reprice_subtitle": { - "message": "NavyÅ¡te cenu paliva ve snaze k pÅ™epsání a urychlení vyší transakce" - }, - "saveAsFile": { - "message": "Uložit do souboru", - "description": "Account export process" - }, - "saveSeedAsFile": { - "message": "Uložit slova klíÄové fráze do souboru" - }, "search": { "message": "Hledat" }, "secretPhrase": { "message": "Zadejte svých 12 slov tajné fráze k obnovení trezoru." }, - "newPassword8Chars": { - "message": "Nové heslo (min 8 znaků)" - }, "seedPhraseReq": { "message": "klíÄové fráze mají 12 slov" }, - "select": { - "message": "Vybrat" - }, "selectCurrency": { "message": "Vybrat mÄ›nu" }, - "selectService": { - "message": "Vybrat službu" - }, "selectType": { "message": "Vybrat typ" }, @@ -767,54 +380,30 @@ "sendTokens": { "message": "Odeslat tokeny" }, - "onlySendToEtherAddress": { - "message": "Posílejte jen ETH na Ethereum adresu." - }, "searchTokens": { "message": "Hledat tokeny" }, - "sendTokensAnywhere": { - "message": "Posílejte tokeny komukoli s Ethereum úÄtem" - }, "settings": { "message": "Nastavení" }, - "info": { - "message": "Informace" - }, - "shapeshiftBuy": { - "message": "Nakoupit na ShapeShift" - }, "showPrivateKeys": { "message": "Zobrazit privátní klíÄe" }, - "showQRCode": { - "message": "Zobrazit QR kód" - }, "sign": { "message": "Podepsat" }, + "signatureRequest": { + "message": "Požadavek podpisu" + }, "signed": { "message": "Podepsáno" }, - "signMessage": { - "message": "Podepsat zprávu" - }, "signNotice": { "message": "Podepsání zprávy může mít \nnebezpeÄný vedlejší uÄinek. Podepisujte zprávy pouze ze \nstránek, kterým plnÄ› důvěřujete celým svým úÄtem.\n Tato nebezpeÄná metoda bude odebrána v budoucí verzi. " }, "sigRequest": { "message": "Požadavek podpisu" }, - "sigRequested": { - "message": "Požádáno o podpis" - }, - "spaceBetween": { - "message": "mezi slovy může být pouze mezera" - }, - "status": { - "message": "Stav" - }, "stateLogs": { "message": "Stavové protokoly" }, @@ -824,9 +413,6 @@ "stateLogError": { "message": "Chyba bÄ›hem získávání stavových protokolů." }, - "submit": { - "message": "Odeslat" - }, "submitted": { "message": "Odesláno" }, @@ -834,10 +420,7 @@ "message": "NavÅ¡tivte naÅ¡e centrum podpory" }, "symbolBetweenZeroTwelve": { - "message": "Symbol musí být mezi 0 a 12 znaky." - }, - "takesTooLong": { - "message": "Trvá to dlouho?" + "message": "Symbol musí mít 11 nebo ménÄ› znaků." }, "terms": { "message": "Podmínky použití" @@ -848,111 +431,52 @@ "to": { "message": "Komu" }, - "toETHviaShapeShift": { - "message": "$1 na ETH pÅ™es ShapeShift", - "description": "system will fill in deposit type in start of message" - }, - "tokenAddress": { - "message": "Adresa tokenu" - }, "tokenAlreadyAdded": { "message": "Token byl už pÅ™idán." }, - "tokenBalance": { - "message": "Váš zůstatek tokenu je:" - }, - "tokenSelection": { - "message": "Vyhledejte token nebo je vyberte z naÅ¡eho seznamu oblíbených tokenů." - }, "tokenSymbol": { "message": "Symbol tokenu" }, - "tokenWarning1": { - "message": "MÄ›jte pÅ™ehled o tokenech, které jste koupili s úÄtem MetaMasku. Pokud jste koupili tokeny s jiným úÄtem, tyto tokeny se zde nezobrazí." - }, "total": { "message": "Celkem" }, - "transactions": { - "message": "transakce" - }, "transactionError": { "message": "Chyba transakce. Vyhozena výjimka v kódu kontraktu." }, - "transactionMemo": { - "message": "Poznámka transakce (nepovinné)" - }, - "transactionNumber": { - "message": "Číslo transakce" - }, - "transfers": { - "message": "PÅ™evody" - }, "troubleTokenBalances": { "message": "MÄ›li jsme problém s naÄtením vaÅ¡ich tokenových zůstatků. Můžete je vidÄ›t ", "description": "Followed by a link (here) to view token balances" }, - "twelveWords": { - "message": "TÄ›chto 12 slov je jedinou možností, jak obnovit MetaMask úÄet. \nUložte je na bezpeÄné a neveÅ™ejné místo." - }, "typePassword": { "message": "Zadejte své heslo" }, - "uiWelcome": { - "message": "Vítejte v novém rozhraní (Beta)" - }, - "uiWelcomeMessage": { - "message": "Používáte nyní nové rozhraní MetaMasku. RozhlédnÄ›te se kolem, vyzkouÅ¡ejte nové funkce, jako jsou zasílání tokenů, a dejte nám vÄ›dÄ›t, pokud narazíte na problém." - }, "unapproved": { "message": "Neschváleno" }, - "unavailable": { - "message": "Nedostupné" - }, "unknown": { "message": "Neznámé" }, "unknownNetwork": { "message": "Neznámá soukromá síť" }, - "unknownNetworkId": { - "message": "Neznámé ID sítÄ›" - }, - "uriErrorMsg": { + "urlErrorMsg": { "message": "URI vyžadují korektní HTTP/HTTPS prefix." }, - "usaOnly": { - "message": "jen v USA", - "description": "Using this exchange is limited to people inside the USA" - }, "usedByClients": { "message": "Používána různými klienty" }, - "useOldUI": { - "message": "Použijte staré rozhraní" - }, - "validFileImport": { - "message": "Musíte vybrat validní soubor k importu." - }, - "vaultCreated": { - "message": "Trezor vytvoÅ™en" - }, "viewAccount": { "message": "Zobrazit úÄet" }, "visitWebSite": { "message": "NavÅ¡tivte naÅ¡i stránku" }, - "warning": { - "message": "Varování" + "walletSeed": { + "message": "KlíÄová fráze peněženky" }, "welcome": { "message": "Vítejte v MetaMask" }, - "whatsThis": { - "message": "Co to je?" - }, "yourSigRequested": { "message": "Je vyžadován váš podpis" }, diff --git a/app/_locales/da/messages.json b/app/_locales/da/messages.json new file mode 100644 index 000000000000..f6f6b0559012 --- /dev/null +++ b/app/_locales/da/messages.json @@ -0,0 +1,1279 @@ +{ + "chartOnlyAvailableEth": { + "message": "Skema kun tilgængeligt pÃ¥ Ethereum-netværk." + }, + "contractInteraction": { + "message": "Kontraktinteraktion" + }, + "reject": { + "message": "Afvis" + }, + "about": { + "message": "Om" + }, + "aboutSettingsDescription": { + "message": "Version, supportcenter og kontaktinformation" + }, + "acceleratingATransaction": { + "message": "* At gøre din transaktion hurtigere ved at bruge en højere Gas-priser, øger dennes chancer for at blive behandlet af netværket hurtigere, men det er ikke altid garanteret." + }, + "accessingYourCamera": { + "message": "TilgÃ¥r din kamera..." + }, + "account": { + "message": "Konto" + }, + "accountDetails": { + "message": "Kontooplysninger" + }, + "accountName": { + "message": "Kontonavn" + }, + "accountOptions": { + "message": "Kontoindstillinger" + }, + "accountSelectionRequired": { + "message": "Du skal vælge en konto!" + }, + "activityLog": { + "message": "aktivitetslog" + }, + "addNetwork": { + "message": "Tilføj netværk" + }, + "addRecipient": { + "message": "Tilføj modtager" + }, + "advanced": { + "message": "Avanceret" + }, + "advancedSettingsDescription": { + "message": "FÃ¥ adgang til udviklerfunktioner, hent tilstandslogs, nulstil konto, opsæt testnetværk og brugerdefineret RPC" + }, + "advancedOptions": { + "message": "Avancerede Valgmuligheder" + }, + "addToAddressBook": { + "message": "Føj til adressebogen" + }, + "addToAddressBookModalPlaceholder": { + "message": "f.eks. John D." + }, + "addAlias": { + "message": "Tilføj alias" + }, + "addToken": { + "message": "Tilføj Polet" + }, + "addTokens": { + "message": "Tilføj tokens" + }, + "addSuggestedTokens": { + "message": "Tilføj foreslÃ¥ede tokens" + }, + "addAcquiredTokens": { + "message": "Tilføj de tokens du har erhvervet ved hjælp af MetaMask" + }, + "amount": { + "message": "Beløb" + }, + "appDescription": { + "message": "En Ethereum-pung i din browser", + "description": "The description of the application" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "approve": { + "message": "Godkend" + }, + "approved": { + "message": "Godkendt" + }, + "asset": { + "message": "Aktiv" + }, + "attemptingConnect": { + "message": "Forsøger at oprette forbindelse til blokkæden." + }, + "attemptToCancel": { + "message": "Forsøg pÃ¥ Annullering?" + }, + "attemptToCancelDescription": { + "message": "Indsendelse af dette forsøg garanterer ikke, at din originale transaktion annulleres. Hvis annulleringsforsøget lykkes, vil du blive opkrævet ovenstÃ¥ende transaktionsgebyr." + }, + "attributions": { + "message": "Tilskrivninger" + }, + "autoLockTimeLimit": { + "message": "Timer for automatisk udlogning (minutter)" + }, + "autoLockTimeLimitDescription": { + "message": "Indstil den passive tid i minutter, før MetaMask automatisk logger dig ud" + }, + "average": { + "message": "Gennemsnit" + }, + "back": { + "message": "Tilbage" + }, + "backToAll": { + "message": "Tilbage til Alle" + }, + "backupApprovalNotice": { + "message": "Sikkerhedskopiér din Hemmelige Gendannelseskode for at holde din tegnebog og dine penge sikre." + }, + "backupApprovalInfo": { + "message": "Den hemmelige kode er pÃ¥krævet for at gendanne din pung, hvis du mister din enhed, glemmer dit kodeord, er nødt til at geninstallere MetaMask eller ønsker adgang til din pung fra en anden enhed." + }, + "backupNow": { + "message": "Backup nu" + }, + "balance": { + "message": "Saldo" + }, + "balanceOutdated": { + "message": "Saldoen kan være forældet" + }, + "basic": { + "message": "Grundlæggende oplysninger" + }, + "blockExplorerUrl": { + "message": "Block-udforsker" + }, + "blockExplorerView": { + "message": "Se konto pÃ¥ $1", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "Brug Blockies Identicon" + }, + "browserNotSupported": { + "message": "Din browser er ikke understøttet..." + }, + "builtInCalifornia": { + "message": "MetaMask er designet og bygget i Californien." + }, + "buyWithWyre": { + "message": "Køb ETH med Wyre" + }, + "buyWithWyreDescription": { + "message": "Wyre lader dig bruge et kreditkort til at indbetale ETH pÃ¥ din MetaMask-konto." + }, + "buyCoinSwitch": { + "message": "Køb pÃ¥ CoinSwitch" + }, + "buyCoinSwitchExplainer": { + "message": "CoinSwitch er den direkte destination for veksling af mere end 300 kryptovalutaer til den bedste sats." + }, + "bytes": { + "message": "Byte" + }, + "off": { + "message": "Fra " + }, + "ok": { + "message": "Okay" + }, + "on": { + "message": "Til" + }, + "optionalBlockExplorerUrl": { + "message": "Blok-stifinder-URL (valgfrit)" + }, + "cancel": { + "message": "Afbryd" + }, + "cancelAttempt": { + "message": "Annullér forsøg" + }, + "cancellationGasFee": { + "message": "Gebyr for brændstofannullering" + }, + "cancelled": { + "message": "Annulleret" + }, + "chainId": { + "message": "Kæde-ID" + }, + "clickToRevealSeed": { + "message": "Klik her for at se hemmelige ord" + }, + "close": { + "message": "Luk" + }, + "chromeRequiredForHardwareWallets": { + "message": "Du skal bruge MetaMask i Google Chrome for at forbinde med din Hardware Wallet." + }, + "confirm": { + "message": "Bekræft" + }, + "confirmed": { + "message": "Bekræftet" + }, + "confirmPassword": { + "message": "Bekræft adgangskode" + }, + "confirmSecretBackupPhrase": { + "message": "Bekræft din hemmelige backup-sætning" + }, + "congratulations": { + "message": "Tillykke" + }, + "connectHardwareWallet": { + "message": "Forbind Hardwarepung" + }, + "connect": { + "message": "FÃ¥ forbindelse" + }, + "connectingTo": { + "message": "Forbinder til $1" + }, + "connectingToKovan": { + "message": "Forbinder til Kovan Testnetværk" + }, + "connectingToMainnet": { + "message": "Forbinder til dit Primære Ethereum Netværk" + }, + "connectingToRopsten": { + "message": "Forbinder til Ropsten-testnetværk" + }, + "connectingToRinkeby": { + "message": "Forbinder til Rinkeby-testnetværk" + }, + "connectingToLocalhost": { + "message": "Opretter forbindelse til Localhost 8545" + }, + "connectingToGoerli": { + "message": "Opretter forbindelse til Goerli Testnetværk" + }, + "continueToWyre": { + "message": "Fortsæt til Wyre" + }, + "continueToCoinSwitch": { + "message": "Fortsæt til CoinSwitch" + }, + "contractDeployment": { + "message": "Kontraktanvendelse" + }, + "copiedExclamation": { + "message": "Kopieret!" + }, + "copyAddress": { + "message": "Kopier adresse til udklipsholder" + }, + "copyTransactionId": { + "message": "Kopier transaktions-id" + }, + "copiedTransactionId": { + "message": "Kopieret transaktions-id" + }, + "copyToClipboard": { + "message": "Kopiér til udklipsholderen" + }, + "copyPrivateKey": { + "message": "Dette er din private nøgle (klik for at kopiere)" + }, + "create": { + "message": "Opret" + }, + "createAccount": { + "message": "Opret konto" + }, + "createAWallet": { + "message": "Opret en tegnebog" + }, + "createPassword": { + "message": "Opret adgangskode" + }, + "currencyConversion": { + "message": "Valutakonvertering" + }, + "currentLanguage": { + "message": "Nuværende sprog" + }, + "customGas": { + "message": "Tilpas brændstof" + }, + "customGasSubTitle": { + "message": "Forøgelse af gebyr kan mindske bearbejdningstiden, men det er ikke en garanti." + }, + "customToken": { + "message": "Brugerdefineret Token" + }, + "customRPC": { + "message": "Tilpasset RPC" + }, + "decimalsMustZerotoTen": { + "message": "Decimaler skal være mindst 0 og højst 36." + }, + "decimal": { + "message": "Decimalpræcision" + }, + "defaultNetwork": { + "message": "Standardnetværket for Ether-transaktioner er Main Net." + }, + "delete": { + "message": "Slet" + }, + "deleteAccount": { + "message": "Slet konto" + }, + "deposit": { + "message": "Indbetal" + }, + "depositEther": { + "message": "Indbetal Ether" + }, + "details": { + "message": "Detaljer" + }, + "directDepositEther": { + "message": "Indskyd Ether direkte" + }, + "directDepositEtherExplainer": { + "message": "Hvis du allerede har Ether, er den hurtigste mÃ¥de at fÃ¥ Ether i din nye tegnebog ved direkte indbetaling." + }, + "done": { + "message": "Færdig" + }, + "downloadGoogleChrome": { + "message": "Hent Google Chrome" + }, + "downloadSecretBackup": { + "message": "Download denne Hemmelige Backupfrase og opbevar den sikkert pÃ¥ et ekstern, krypteret harddisk eller lagringsenhed." + }, + "downloadStateLogs": { + "message": "Download tilstandslogs" + }, + "dontHaveAHardwareWallet": { + "message": "Har du ikke en hardware-pung?" + }, + "dropped": { + "message": "Droppet" + }, + "edit": { + "message": "Rediger" + }, + "editContact": { + "message": "Redigér Kontakt" + }, + "endOfFlowMessage1": { + "message": "Du bestod testen - pas godt pÃ¥ din seed-sætning, det er dit ansvar!" + }, + "endOfFlowMessage2": { + "message": "Tip til sikker opbevaring " + }, + "endOfFlowMessage3": { + "message": "Gem en sikkerhedskopi flere steder." + }, + "endOfFlowMessage4": { + "message": "Del aldrig frasen med nogen." + }, + "endOfFlowMessage5": { + "message": "Vær varsom med phishing! MetaMask vil aldrig spontant bede om din seedfrase." + }, + "endOfFlowMessage6": { + "message": "Hvis du fÃ¥r brug for at lave en backup af din seedfrase igen, kan du finde det under Indstillinger -> Sikkerhed." + }, + "endOfFlowMessage7": { + "message": "Hvis du har spørgsmÃ¥l eller bemærker noget mistænkeligt, send en mail til support@metamask.io." + }, + "endOfFlowMessage8": { + "message": "MetaMask kan ikke gendanne din seed-sætning. FÃ¥ mere at vide." + }, + "endOfFlowMessage9": { + "message": "Lær mere. " + }, + "endOfFlowMessage10": { + "message": "Helt klar" + }, + "ensRegistrationError": { + "message": "Fejl i ENS-navneregistrering" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "ENS-navn ikke fundet for det nuværende netværk. Prøv at skifte til Ethereums hovednetværk." + }, + "enterAnAlias": { + "message": "Indtast et alias" + }, + "enterPassword": { + "message": "Indtast kodeord" + }, + "enterPasswordContinue": { + "message": "Indtast adgangskode for at fortsætte" + }, + "ethereumPublicAddress": { + "message": "Offentlig Ethereum-adresse" + }, + "etherscanView": { + "message": "Se konto pÃ¥ Etherscan" + }, + "estimatedProcessingTimes": { + "message": "Estimerede behandlingstider" + }, + "expandView": { + "message": "Udvis Visning" + }, + "exportPrivateKey": { + "message": "Eksporter privat nøgle" + }, + "failed": { + "message": "Mislykkedes" + }, + "fast": { + "message": "Hurtig" + }, + "faster": { + "message": "Hurtigere" + }, + "fileImportFail": { + "message": "Virker filimportering ikke? Klik her!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "Glem denne enhed" + }, + "from": { + "message": "Fra" + }, + "functionType": { + "message": "Funktionstype" + }, + "gasLimit": { + "message": "Gas-grænse" + }, + "gasLimitInfoModalContent": { + "message": "Gasgrænse er den maksimale mængde gasenheder, du er villig til at bruge." + }, + "gasLimitTooLow": { + "message": "Brændstofgrænsen skal være mindst 21000" + }, + "gasUsed": { + "message": "Gas brugt" + }, + "gasPrice": { + "message": "Brændstofpris (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "Ekstremt Lav Brændstofspris" + }, + "gasPriceInfoModalContent": { + "message": "Brændstofpris specificerer den mængde Ether, du er villig til at betale for hver brændstofenhed." + }, + "gasPriceNoDenom": { + "message": "Brændstofpris" + }, + "general": { + "message": "Generelt" + }, + "generalSettingsDescription": { + "message": "Valutakonvertering, primær valuta, sprog, blockies-identicon" + }, + "getEther": { + "message": "Hent Ether" + }, + "getEtherFromFaucet": { + "message": "Hent Ether fra en hane til $1", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "FÃ¥ hjælp" + }, + "getStarted": { + "message": "Kom godt i gang" + }, + "happyToSeeYou": { + "message": "Vi er glade for at se dig." + }, + "hardwareWalletConnected": { + "message": "Hardware-tegnebog tilsluttet" + }, + "hardwareWallets": { + "message": "Tilslut en hardware-tegnebog" + }, + "hardwareWalletsMsg": { + "message": "Vælg en hardware-pung du vil bruge med MetaMask" + }, + "havingTroubleConnecting": { + "message": "Har du problemer med at oprette forbindelse?" + }, + "here": { + "message": "her", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hexData": { + "message": "Hex-data" + }, + "hide": { + "message": "Skjul" + }, + "hideTokenPrompt": { + "message": "Skjul Token?" + }, + "history": { + "message": "Historik" + }, + "import": { + "message": "Importer", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "Importer konto" + }, + "importAccountMsg": { + "message": "Importerede konti vil ikke blive forbundet med din oprindeligt oprettede seed-sætning for din MetaMask-konto. FÃ¥ mere at vide om importerede konti" + }, + "importAccountSeedPhrase": { + "message": "Importér en Konto med Seedfrase" + }, + "importWallet": { + "message": "Importér pung" + }, + "importYourExisting": { + "message": "Importér din eksisterende pung med en 12-ords seedfrase" + }, + "imported": { + "message": "Importeret", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "Importér ved brug af kontoens seed-sætning" + }, + "infoHelp": { + "message": "Info & hjælp" + }, + "initialTransactionConfirmed": { + "message": "Din indledende transaktion blev bekræftet af netværket. Klik OK for at gÃ¥ tilbage." + }, + "insufficientBalance": { + "message": "Utilstrækkelig balance." + }, + "insufficientFunds": { + "message": "Ikke tilstrækkelige midler." + }, + "insufficientTokens": { + "message": "Utilstrækkelige tokens." + }, + "invalidAddress": { + "message": "Ugyldig adresse" + }, + "invalidAddressRecipient": { + "message": "Modtageradressen er ugyldig" + }, + "knownAddressRecipient": { + "message": "Kendte kontaktadresser." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "Ikke ETH-netværk, sat til smÃ¥ bogstaver" + }, + "invalidInput": { + "message": "Ugyldigt input." + }, + "invalidRPC": { + "message": "Ugyldig RPC-webadresse" + }, + "invalidBlockExplorerURL": { + "message": "Ugyldig Block Explorer-webadresse" + }, + "invalidSeedPhrase": { + "message": "Ugyldig backupsætning" + }, + "jsonFile": { + "message": "JSON-fil", + "description": "format for importing an account" + }, + "kovan": { + "message": "Kovan Test-Netværk" + }, + "max": { + "message": "Maks" + }, + "learnMore": { + "message": "Lær mere" + }, + "ledgerAccountRestriction": { + "message": "Du skal benytte din tidligere konto, før du kan tilføje en ny." + }, + "letsGoSetUp": { + "message": "Ja, lad os komme i gang!" + }, + "likeToAddTokens": { + "message": "Ønsker du at tilføje disse tokens?" + }, + "liveGasPricePredictions": { + "message": "Live forudsigelser af brændstofpriser" + }, + "loading": { + "message": "Indlæser..." + }, + "loadingTokens": { + "message": "Indlæser tokens..." + }, + "loadMore": { + "message": "Indlæs Mere" + }, + "lock": { + "message": "Log ud" + }, + "mainnet": { + "message": "Hovednetværk for Ethereum" + }, + "memorizePhrase": { + "message": "Husk denne sætning." + }, + "memo": { + "message": "notat" + }, + "message": { + "message": "Besked" + }, + "metamaskDescription": { + "message": "Som forbinder dig til Ethereum og de decentraliserede internet." + }, + "mobileSyncText": { + "message": "Indtast din adgangskode for at bekræfte, at det er dig!" + }, + "myAccounts": { + "message": "Mine Konti" + }, + "myWalletAccounts": { + "message": "Mine Pungkonti" + }, + "myWalletAccountsDescription": { + "message": "Alle dine MetaMask-oprettede konti føjes automatisk til dette afsnit." + }, + "mustSelectOne": { + "message": "Skal vælge mindst 1 token." + }, + "needEtherInWallet": { + "message": "Du skal have Ether i din tegnebog for at interagere med decentraliserede applikationer, der bruger MetaMask." + }, + "needImportFile": { + "message": "Du skal vælge en fil, der skal importeres.", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "Kan ikke sende en negativ mængde ETH." + }, + "networkName": { + "message": "Netværksnavn" + }, + "networks": { + "message": "Netværk" + }, + "networkSettingsDescription": { + "message": "Tilføj og redigér brugerdefinerede RPC-netværk" + }, + "nevermind": { + "message": "Lige meget" + }, + "newAccount": { + "message": "Ny konto" + }, + "newAccountDetectedDialogMessage": { + "message": "Ny adresse fundet! Klik her for at tilføje til din adressebog." + }, + "newAccountNumberName": { + "message": "Konto $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "Ny kontakt" + }, + "newContract": { + "message": "Ny Kontrakt" + }, + "newPassword": { + "message": "Ny adgangskode (min. 8 tegn)" + }, + "newNetwork": { + "message": "Nyt Netværk" + }, + "newToMetaMask": { + "message": "Ny pÃ¥ MetaMask?" + }, + "noAlreadyHaveSeed": { + "message": "Nej, jeg har allerede en seedfrase" + }, + "protectYourKeys": { + "message": "Beskyt dine nøgler!" + }, + "protectYourKeysMessage1": { + "message": "Vær forsigtig med din backupsætning - der har været rapporter om websteder, der forsøger at efterligne MetaMask. MetaMask vil aldrig bede om din backupsætning!" + }, + "protectYourKeysMessage2": { + "message": "Opbevar din frase et sikkert sted. Hvis du ser noget mistænkeligt, eller du er usikker pÃ¥ hjemmesiden, skriv en email til support@metamask.io" + }, + "rpcUrl": { + "message": "Ny RPC-URL" + }, + "optionalChainId": { + "message": "KædeID (valgfrit)" + }, + "optionalSymbol": { + "message": "Symbol (valgfrit)" + }, + "newTotal": { + "message": "Ny Sum" + }, + "newTransactionFee": { + "message": "Nyt Transaktionsgebyr" + }, + "next": { + "message": "Næste" + }, + "noAddressForName": { + "message": "Ingen adresse indstillet for dette navn." + }, + "noConversionRateAvailable": { + "message": "Ingen tilgængelig omregningskurs" + }, + "noTransactions": { + "message": "Du har ingen transaktioner" + }, + "notEnoughGas": { + "message": "Ikke nok gas" + }, + "noWebcamFoundTitle": { + "message": "Webcam ikke fundet" + }, + "noWebcamFound": { + "message": "Din computers webkamera blev ikke fundet. Prøv venligst igen." + }, + "ofTextNofM": { + "message": "af" + }, + "orderOneHere": { + "message": "Bestil en Trezor eller Ledger og frys dine midler ned" + }, + "parameters": { + "message": "Parametre" + }, + "participateInMetaMetrics": { + "message": "Deltag i MetaMetrics" + }, + "participateInMetaMetricsDescription": { + "message": "Deltag i MetaMetrics for at hjælpe os med at gøre MetaMask bedre" + }, + "password": { + "message": "Adgangskode" + }, + "passwordsDontMatch": { + "message": "Adgangskoder stemmer ikke ovenens" + }, + "passwordNotLongEnough": { + "message": "Adgangskode ikke lang nok" + }, + "pastePrivateKey": { + "message": "Indsæt din private nøglestreng her:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "afventer" + }, + "personalAddressDetected": { + "message": "Personlig adresse opdaget. Indtast polet kontrakt adressen." + }, + "prev": { + "message": "Forrige" + }, + "primaryCurrencySetting": { + "message": "Primær Valuta" + }, + "primaryCurrencySettingDescription": { + "message": "Vælg lokal for fortrinsvis at vise værdier i kædens (f.eks. ETH) lokale valuta. Vælg Fiat for fortrinsvis at vise værdier i din valgte fiat valuta." + }, + "privacyMsg": { + "message": "Privatlivspolitik" + }, + "privateKey": { + "message": "Privat nøgle", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "Advarsel: afslør aldrig denne nøgle. Enhver med dine private nøgler kan stjæle alle aktiver i din konto." + }, + "privateNetwork": { + "message": "Privat netværk" + }, + "queue": { + "message": "Kø" + }, + "readdToken": { + "message": "Du kan tilføje denne token i fremtiden, ved at gÃ¥ til \"Tilføj token\" under dine valgmenuen for dine konti." + }, + "recents": { + "message": "Seneste" + }, + "recipientAddress": { + "message": "Modtagerens adresse" + }, + "recipientAddressPlaceholder": { + "message": "Søg, offentlig adresse (0x) eller ENS" + }, + "rejectAll": { + "message": "Afvis Alle" + }, + "rejectTxsN": { + "message": "Afvis $1 transaktioner" + }, + "rejectTxsDescription": { + "message": "Du er ved at batchafvise $1-transaktioner." + }, + "rejected": { + "message": "Afvist" + }, + "reset": { + "message": "Nulstil" + }, + "resetAccount": { + "message": "Nulstil Konto" + }, + "resetAccountDescription": { + "message": "Nulstilling af din konto vil rydde din transaktionshistorik." + }, + "deleteNetwork": { + "message": "Slet Netværk?" + }, + "deleteNetworkDescription": { + "message": "Er du sikker pÃ¥, at du vil slette dette netværk?" + }, + "remindMeLater": { + "message": "PÃ¥minde mig senere" + }, + "restoreFromSeed": { + "message": "Genopret konto?" + }, + "restoreAccountWithSeed": { + "message": "Gendan din konto med Seed-sætning" + }, + "requestsAwaitingAcknowledgement": { + "message": "forespørgsler der afventer anerkendelse" + }, + "required": { + "message": "Nødvendig" + }, + "restore": { + "message": "Gendan" + }, + "revealSeedWords": { + "message": "Vis Seedord" + }, + "revealSeedWordsTitle": { + "message": "Backupsætning" + }, + "revealSeedWordsDescription": { + "message": "Hvis du nogensinde skifter browsere eller flytter computere, har du brug for denne backupsætning for at fÃ¥ adgang til dine konti. Gem den et sted sikkert og hemmeligt." + }, + "revealSeedWordsWarningTitle": { + "message": "DEL IKKE denne sætning med nogen!" + }, + "revealSeedWordsWarning": { + "message": "Disse ord kan bruges til at stjæle alle dine konti." + }, + "remove": { + "message": "Fjern" + }, + "removeAccount": { + "message": "Fjern konto" + }, + "removeAccountDescription": { + "message": "Denne konto fjernes fra din pung. Sikr dig venligst, at du har den originale seedfrase eller private nøgle til denne importerede konto, inden du fortsætter. Du kan importere eller skabe konti igen via kontomenuen." + }, + "readyToConnect": { + "message": "Klar til at oprette forbindelse?" + }, + "rinkeby": { + "message": "Rinkeby-testnetværk" + }, + "ropsten": { + "message": "Ropsten Test-netværk" + }, + "goerli": { + "message": "Goerli-testnetværk" + }, + "save": { + "message": "Gem" + }, + "slow": { + "message": "Langsom" + }, + "slower": { + "message": "Langsommere" + }, + "saveAsCsvFile": { + "message": "Gem som CSV-fil" + }, + "scanInstructions": { + "message": "Placer QR-koden foran dit kamera" + }, + "scanQrCode": { + "message": "Scan QR-kode" + }, + "search": { + "message": "Søg" + }, + "searchResults": { + "message": "Søg Resultater" + }, + "secretBackupPhrase": { + "message": "Hemmelig backup-sætning" + }, + "secretBackupPhraseDescription": { + "message": "Din hemmelige backup-sætning gør det nemt at lave backup og gendanne din konto." + }, + "secretBackupPhraseWarning": { + "message": "ADVARSEL: Afslør aldrig din backup-frase. Enhver med denne frase kan tage din Ether for altid." + }, + "secretPhrase": { + "message": "Indtast din hemmelige tolv ord lange sætning for at gendanne din vault." + }, + "securityAndPrivacy": { + "message": "Sikkerhed & Privatliv" + }, + "securitySettingsDescription": { + "message": "Indstillinger for beskyttelse af personlige oplysninger og backupsætning til tegnebog" + }, + "seedPhrasePlaceholder": { + "message": "Adskil hvert ord med et enkelt mellemrum" + }, + "seedPhraseReq": { + "message": "Backupsætninger er 12 ord lange" + }, + "selectCurrency": { + "message": "Vælg valuta" + }, + "selectEachPhrase": { + "message": "Vælg venligst hver sætning, for at sikre at de er korrekte." + }, + "selectLocale": { + "message": "Vælg Lokalitet" + }, + "selectType": { + "message": "Vælg type" + }, + "sendAmount": { + "message": "Send Beløb" + }, + "sendETH": { + "message": "Vælg ETH" + }, + "sendTokens": { + "message": "Send tokens" + }, + "sentEther": { + "message": "sendte ether" + }, + "sentTokens": { + "message": "afsendte tokens" + }, + "separateEachWord": { + "message": "Separer hvert ord med et enkelt mellemrum" + }, + "searchTokens": { + "message": "Søg efter tokens" + }, + "selectAnAccount": { + "message": "Vælg en Konto" + }, + "selectAnAccountHelp": { + "message": "Vælg kontoen der skal vises i MetaMask" + }, + "selectAHigherGasFee": { + "message": "Vælg et højere Gas-gebyr, for at gøre behandlingen af din transaktion hurtigere.*" + }, + "selectHdPath": { + "message": "Vælg HD-Sti" + }, + "selectPathHelp": { + "message": "Hvis du ikke ser dine eksisterende Ledger-konti nedenfor, kan du prøve at skifte til \"Legacy (MEW / MyCrypto)\"" + }, + "settings": { + "message": "Indstillinger " + }, + "showAdvancedGasInline": { + "message": "Avanceret Gas-styring" + }, + "showAdvancedGasInlineDescription": { + "message": "Vælg dette for at vise brændstofprisen og begræns styringen direkte pÃ¥ afsendelses- og bekræftelseskærmene." + }, + "showFiatConversionInTestnets": { + "message": "Vis konvertering pÃ¥ testnet" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Vælg dette for at vise fiat-konvertering pÃ¥ Testnets" + }, + "showPrivateKeys": { + "message": "Vis private nøgler" + }, + "showHexData": { + "message": "Vis hex-data" + }, + "showHexDataDescription": { + "message": "Vælg dette for at vise hex-datafeltet pÃ¥ send-skærmen" + }, + "sign": { + "message": "Underskriv" + }, + "signatureRequest": { + "message": "Signaturforespørgsel" + }, + "signed": { + "message": "Underskrevet" + }, + "signNotice": { + "message": "Underskrivning af denne besked kan have farlige sideeffekter. Skriv kun under pÃ¥ beskeder fra sider, du har fuld tillid til med hele din konto.\nDenne farlige metode bliver fjernet i en fremtidig version." + }, + "sigRequest": { + "message": "Signaturforespørgsel" + }, + "somethingWentWrong": { + "message": "Ups! Noget gik galt." + }, + "speedUp": { + "message": "Fremskynd" + }, + "speedUpCancellation": { + "message": "Gør denne annullering hurtigere" + }, + "speedUpTransaction": { + "message": "Gør denne transaktion hurtigere" + }, + "switchNetworks": { + "message": "Skift Netværk" + }, + "stateLogs": { + "message": "Tilstandslogs" + }, + "stateLogsDescription": { + "message": "Status-logføringer indeholder dine offentlige kontoadresser og afsendte transaktioner." + }, + "stateLogError": { + "message": "Fejl ved hentning af tilstandslogfiler." + }, + "step1HardwareWallet": { + "message": "1. Tilslut hardware-tegnebog" + }, + "step1HardwareWalletMsg": { + "message": "Forbind din hardware-tegnebog direkte med din computer." + }, + "step2HardwareWallet": { + "message": "2. Vælg en konto" + }, + "step2HardwareWalletMsg": { + "message": "Vælg den konto du ønsker at se. Du kan kun vælge én ad gangen." + }, + "step3HardwareWallet": { + "message": "3. Begynd at bruge dApps og mere!" + }, + "step3HardwareWalletMsg": { + "message": "Brug din hardwarekonto som du ville gøre med enhver Ethereum-konto. Log ind pÃ¥ dApps, send Eth, køb og opbevar ERC20-tokens og ikke-ombyttelige tokens som CryptoKitties." + }, + "storePhrase": { + "message": "Gem denne sætning i en adgangskodeadministrator som 1Password." + }, + "submitted": { + "message": "Indsendt" + }, + "supportCenter": { + "message": "Besøg vores supportcenter" + }, + "symbolBetweenZeroTwelve": { + "message": "Symbolet skal være mindst 11 tegn." + }, + "syncWithMobile": { + "message": "Synkronisér med mobil" + }, + "syncWithMobileTitle": { + "message": "Synkroniser med mobil" + }, + "syncWithMobileDesc": { + "message": "Du kan synkronisere dine konti og informationer med din mobilenhed. Ã…bn MetaMask-mobilappen, gÃ¥ til \"Indstillinger\" og tryk pÃ¥ \"Synkroniser fra browserudvidelse\"" + }, + "syncWithMobileDescNewUsers": { + "message": "Hvis du netop har Ã¥bnet MetaMask-mobilappen for første gang, skal du blot følge trinnene pÃ¥ din telefon." + }, + "syncWithMobileScanThisCode": { + "message": "Scan denne kode med din MetaMask-mobilapp" + }, + "syncWithMobileBeCareful": { + "message": "Sørg for at der ikke er nogen der kigger pÃ¥ din skærm, nÃ¥r du scanner denne kode" + }, + "syncWithMobileComplete": { + "message": "Dine data er blevet synkroniseret korrekt. Nyd MetaMask-mobilappen!" + }, + "terms": { + "message": "Brugsbetingelser" + }, + "testFaucet": { + "message": "Testhane" + }, + "thisWillCreate": { + "message": "Dette vil skabe en ny pung og seedfrase" + }, + "tips": { + "message": "Donationer" + }, + "to": { + "message": "Til" + }, + "tokenAlreadyAdded": { + "message": "Token er allerede blevet tilføjet." + }, + "tokenContractAddress": { + "message": "Polet Kontrakt Adresse" + }, + "tokenSymbol": { + "message": "Token-symbol" + }, + "transaction": { + "message": "transaktion" + }, + "transactionConfirmed": { + "message": "Transaktion pÃ¥ $2 bekræftet." + }, + "transactionCreated": { + "message": "Transaktion oprettet med en værdi pÃ¥ $1 til $2." + }, + "transactionDropped": { + "message": "Transaktionen droppet til $2." + }, + "transactionSubmitted": { + "message": "Transaktion indsendt med brændstofgebyr pÃ¥ $1 til $2." + }, + "transactionResubmitted": { + "message": "Transaktion genindsendt med brændstofgebyr forøget til $1 pÃ¥ $2" + }, + "transactionUpdated": { + "message": "Transaktion opdateret til $2." + }, + "transactionErrored": { + "message": "Transaktionen stødte pÃ¥ en fejl." + }, + "transactionCancelAttempted": { + "message": "Forsøgt annullering af transaktion med brændstofgebyr $1 pÃ¥ $2" + }, + "transactionCancelSuccess": { + "message": "Transaktionen blev annulleret ved $2" + }, + "transactionError": { + "message": "Transaktionsfejl. Undtagelse smidt i kontraktskode." + }, + "transactionErrorNoContract": { + "message": "Forsøger at hidkalde en funktion pÃ¥ en ikke-kontrakt adresse." + }, + "transactionFee": { + "message": "Transaktionsgebyr" + }, + "transactionTime": { + "message": "Transaktionstid" + }, + "transfer": { + "message": "Overfør" + }, + "transferBetweenAccounts": { + "message": "Overfør mellem konti" + }, + "transferFrom": { + "message": "Overfør fra" + }, + "troubleTokenBalances": { + "message": "Vi havde problemer med at indlæse dine tokenbalancer. Du kan se dem", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "Prøv igen" + }, + "typePassword": { + "message": "Skriv din MetaMask-adgangskode" + }, + "unapproved": { + "message": "Ikke godkendt" + }, + "units": { + "message": "enheder" + }, + "unknown": { + "message": "ukendt" + }, + "unknownNetwork": { + "message": "Ukendt privat netværk" + }, + "unknownQrCode": { + "message": "Fejl: Vi kunne ikke identificere QR-koden" + }, + "unknownCameraErrorTitle": { + "message": "Hovsa! Noget gik galt..." + }, + "unknownCameraError": { + "message": "Der opstod en fejl da vi prøvede at tilgÃ¥ dit kamera. Prøv venligst igen..." + }, + "unlock": { + "message": "LÃ¥s op" + }, + "unlockMessage": { + "message": "Det decentraliserede internet venter" + }, + "updatedWithDate": { + "message": "Opdaterede $1" + }, + "urlErrorMsg": { + "message": "Links kræver det rette HTTP/HTTPS-præfix." + }, + "usedByClients": { + "message": "Brugt af forskellige kunder" + }, + "userName": { + "message": "Brugernavn" + }, + "viewAccount": { + "message": "Vis konto" + }, + "viewinExplorer": { + "message": "Vis i stifinder" + }, + "viewContact": { + "message": "Vis kontakt" + }, + "viewOnCustomBlockExplorer": { + "message": "Se pÃ¥ $1" + }, + "viewOnEtherscan": { + "message": "Se pÃ¥ Etherscan" + }, + "visitWebSite": { + "message": "Besøg vores webside" + }, + "walletSeed": { + "message": "Tegnebogs-seed" + }, + "welcomeBack": { + "message": "Velkommen tilbage!" + }, + "welcome": { + "message": "Velkommen til MetaMask" + }, + "writePhrase": { + "message": "Skriv denne sætning pÃ¥ et stykke papir, og opbevar den et sikkert sted. Hvis du vil have endnu mere sikkerhed, skal du skrive den ned pÃ¥ flere papirstykker og opbevare hver pÃ¥ 2 - 3 forskellige placeringer." + }, + "yesLetsTry": { + "message": "Ja, lad os prøve" + }, + "youNeedToAllowCameraAccess": { + "message": "Du skal tillade kameraadgang for at bruge denne funktion." + }, + "yourSigRequested": { + "message": "Din signatur er ønsket" + }, + "youSign": { + "message": "Du skriver under" + }, + "yourPrivateSeedPhrase": { + "message": "Din private seed-sætning" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "Nul brændstofpris pÃ¥ fremskynding" + } +} diff --git a/app/_locales/de/messages.json b/app/_locales/de/messages.json index 98a8bf972341..cf8596b32935 100644 --- a/app/_locales/de/messages.json +++ b/app/_locales/de/messages.json @@ -1,66 +1,63 @@ { - "privacyMode": { - "message": "Datenschutzmodus" + "chartOnlyAvailableEth": { + "message": "Die Grafik ist nur in Ethereum-Netzwerken verfügbar." }, - "privacyModeDescription": { - "message": "Websites müssen Zugriff anfordern, um Ihre Kontoinformationen anzuzeigen." + "contractInteraction": { + "message": "Vertragsinteraktion" }, - "exposeAccounts": { - "message": "Expose Konten" + "reject": { + "message": "Ablehnen" }, - "exposeDescription": { - "message": "Expose Konten auf der aktuellen Website. Nützlich für ältere Dapps." + "about": { + "message": "Über" }, - "confirmExpose": { - "message": "Möchten Sie Ihre Konten wirklich der aktuellen Website zugänglich machen?" + "aboutSettingsDescription": { + "message": "Version, Supportcenter und Kontaktinformationen" }, - "confirmClear": { - "message": "Möchten Sie die genehmigten Websites wirklich löschen?" + "acceleratingATransaction": { + "message": "* Die Beschleunigung einer Transaktion durch die Verwendung eines höheren Gaspreises erhöht die Chancen einer schnelleren Verarbeitung durch das Netz, wofür es allerdings keine Garantie gibt." }, - "clearApprovalDataSuccess": { - "message": "Genehmigte Website-Daten wurden erfolgreich gelöscht." + "accessingYourCamera": { + "message": "Zugriff auf Ihre Kamera …" }, - "approvalData": { - "message": "Genehmigungsdaten" + "accountDetails": { + "message": "Accountdetails" }, - "approvalDataDescription": { - "message": "Löschen Sie die genehmigten Website-Daten, damit alle Websites erneut eine Genehmigung anfordern müssen." + "accountName": { + "message": "Accountname" }, - "clearApprovalData": { - "message": "Genehmigungsdaten löschen" + "accountOptions": { + "message": "Kontooptionen" }, - "approve": { - "message": "Genehmigen" + "accountSelectionRequired": { + "message": "Sie müssen ein Konto auswählen!" }, - "reject": { - "message": "Ablehnen" - }, - "providerAPIRequest": { - "message": "Web3-API-Anfrage" + "activityLog": { + "message": "Aktivitätsprotokoll" }, - "reviewProviderRequest": { - "message": "Bitte lesen Sie diese Ethereum-API-Anfrage." + "addNetwork": { + "message": "Netzwerk hinzufügen" }, - "providerRequestInfo": { - "message": "Die unten aufgeführte Domäne versucht, Zugriff auf die Ethereum-API anzufordern, damit sie mit der Ethereum-Blockchain interagieren kann. Überprüfen Sie immer, dass Sie sich auf der richtigen Website befinden, bevor Sie den Web3-Zugriff genehmigen." + "addRecipient": { + "message": "Empfänger hinzufügen" }, - "accept": { - "message": "Annehmen" + "advanced": { + "message": "Erweitert" }, - "account": { - "message": "Account" + "advancedSettingsDescription": { + "message": "Zugriff auf Entwicklerfunktionen, Download von Statusprotokollen, Zurücksetzen des Kontos, Einrichten von Testnetzen und benutzerdefinierten RPCs" }, - "accountDetails": { - "message": "Accountdetails" + "advancedOptions": { + "message": "Erweiterte Optionen" }, - "accountName": { - "message": "Accountname" + "addToAddressBook": { + "message": "Zum Adressbuch hinzufügen" }, - "address": { - "message": "Adresse" + "addToAddressBookModalPlaceholder": { + "message": "z.B. Max M." }, - "addCustomToken": { - "message": "Eigenen Token hinzufügen" + "addAlias": { + "message": "Alias hinzufügen" }, "addToken": { "message": "Token hinzufügen" @@ -68,68 +65,98 @@ "addTokens": { "message": "Token hinzufügen" }, + "addSuggestedTokens": { + "message": "Vorgeschlagene Token hinzufügen" + }, + "addAcquiredTokens": { + "message": "Fügen Sie die Token hinzu, die Sie mittels MetaMask erlangt haben" + }, "amount": { "message": "Betrag" }, - "amountPlusGas": { - "message": "Betrag + Gas" - }, "appDescription": { "message": "Ethereum Browsererweiterung", - "description": "Die Beschreibung der Erweiterung" + "description": "The description of the application" }, "appName": { "message": "MetaMask", - "description": "Der Name der Erweiterung" + "description": "The name of the application" + }, + "approve": { + "message": "Genehmigen" }, "approved": { "message": "Genehmigt" }, + "asset": { + "message": "Vermögenswert" + }, "attemptingConnect": { "message": "Versuch mit der Blockchain zu verbinden." }, + "attemptToCancel": { + "message": "Stornierung versuchen?" + }, + "attemptToCancelDescription": { + "message": "Dieser Versuch garantiert nicht, dass Ihre ursprüngliche Transaktion storniert wird. Bei Erfolg des Stornierungsversuchs wird Ihnen die oben genannte Transaktionsgebühr in Rechnung gestellt." + }, "attributions": { "message": "Was wir verwenden" }, - "available": { - "message": "Verfügbar" + "autoLockTimeLimit": { + "message": "Auto-Logout-Timer (Minuten)" + }, + "autoLockTimeLimitDescription": { + "message": "Stellen Sie die Ruhezeit in Minuten ein, nach der sich MetaMask automatisch ausloggen soll" + }, + "average": { + "message": "Durchschnitt" }, "back": { "message": "Zurück" }, + "backToAll": { + "message": "Zurück zur Übersicht" + }, + "backupApprovalNotice": { + "message": "Sichern Sie Ihren geheimen Wiederherstellungscode, um Ihr Wallet und Ihr Geld geschützt zu halten." + }, + "backupApprovalInfo": { + "message": "Dieser geheime Code ist zum Wiedererlangen Ihres Wallets erforderlich, falls Sie Ihr Gerät verlieren, Ihr Passwort vergessen, MetaMask neu installieren müssen oder auf einem anderen Gerät auf Ihr Wallet zugreifen möchten." + }, + "backupNow": { + "message": "Jetzt sichern" + }, "balance": { "message": "Guthaben:" }, - "balances": { - "message": "Deine Guthaben" + "balanceOutdated": { + "message": "Kontostand könnte überholt sein" }, - "balanceIsInsufficientGas": { - "message": "Guthaben unzureichend für den aktuellen gesamten Gasbetrag" + "basic": { + "message": "Grundlegend" }, - "beta": { - "message": "BETA" + "blockExplorerUrl": { + "message": "Block-Explorer" }, - "betweenMinAndMax": { - "message": "Muss größer oder gleich $1 und kleiner oder gleich $2 sein.", - "description": "Helfer für die Eingabe von hex als dezimal" + "blockExplorerView": { + "message": "Konto bei $1 anzeigen", + "description": "$1 replaced by URL for custom block explorer" }, "blockiesIdenticon": { "message": "Blockies Identicon verwenden" }, - "borrowDharma": { - "message": "Mit Dharma ausleihen (Beta)" + "browserNotSupported": { + "message": "Ihr Browser wird nicht unterstützt …" }, "builtInCalifornia": { "message": "MetaMask wurde in Kalifornien entwickelt und gebaut." }, - "buy": { - "message": "Kaufen" - }, - "buyCoinbase": { - "message": "Auf Coinbase kaufen" + "buyWithWyre": { + "message": "ETH mit Wyre kaufen" }, - "buyCoinbaseExplainer": { - "message": "Coinbase ist die weltweit bekannteste Art und Weise um Bitcoin, Ethereum und Litecoin zu kaufen und verkaufen." + "buyWithWyreDescription": { + "message": "Wyre ermöglicht Ihnen die Verwendung einer Kreditkarte zum direkten Einzahlen von ETH auf Ihr MetaMask-Konto." }, "buyCoinSwitch": { "message": "Auf CoinSwitch kaufen" @@ -137,17 +164,35 @@ "buyCoinSwitchExplainer": { "message": "CoinSwitch ist die One-Stop-Destination, um mehr als 300 Kryptowährungen zum besten Preis zu tauschen." }, - "ok": { - "message": "Ok" + "off": { + "message": "Aus" + }, + "on": { + "message": "An" + }, + "optionalBlockExplorerUrl": { + "message": "Block-Explorer-URL (optional)" }, "cancel": { "message": "Abbrechen" }, - "classicInterface": { - "message": "Klassische Oberfläche verwenden" + "cancelAttempt": { + "message": "Versuch abbrechen" + }, + "cancellationGasFee": { + "message": "Stornierungs-Gasgebühr" + }, + "cancelled": { + "message": "Abgebrochen" + }, + "clickToRevealSeed": { + "message": "Hier klicken, um Geheimwörter zu enthüllen" }, - "clickCopy": { - "message": "Klicken um zu kopieren" + "close": { + "message": "Schließen" + }, + "chromeRequiredForHardwareWallets": { + "message": "Sie müssen MetaMask unter Google Chrome nutzen, um sich mit Ihrem Hardware-Wallet zu verbinden." }, "confirm": { "message": "Bestätigen" @@ -155,20 +200,44 @@ "confirmed": { "message": "Bestätigt" }, - "confirmContract": { - "message": "Smart Contract bestätigen" - }, "confirmPassword": { "message": "Passwort bestätigen" }, - "confirmTransaction": { - "message": "Transaktion bestätigen" + "confirmSecretBackupPhrase": { + "message": "Bestätigen Sie Ihre geheime Sicherungsphrase" }, - "continue": { - "message": "Weiter" + "congratulations": { + "message": "Glückwunsch" + }, + "connectHardwareWallet": { + "message": "Hardware-Wallet verknüpfen" + }, + "connect": { + "message": "Verbinden" + }, + "connectingTo": { + "message": "Verbindung mit $1 wird hergestellt" + }, + "connectingToKovan": { + "message": " Verbinde zum Kovan Testnetzwerk" + }, + "connectingToMainnet": { + "message": "Verbinde zum Ethereum Main Net" }, - "continueToCoinbase": { - "message": "Zu Coinbase fortfahren" + "connectingToRopsten": { + "message": " Verbinde zum Ropsten Testnetzwerk" + }, + "connectingToRinkeby": { + "message": " Verbinde zum Rinkeby Testnetzwerk" + }, + "connectingToLocalhost": { + "message": "Verbindung mit Localhost 8545 herstellen" + }, + "connectingToGoerli": { + "message": "Verbindung mit Goerli Test Network wird hergestellt" + }, + "continueToWyre": { + "message": "Weiter zu Wyre" }, "continueToCoinSwitch": { "message": "Zu CoinSwitch fortfahren" @@ -176,30 +245,21 @@ "contractDeployment": { "message": "Smart Contract Ausführung" }, - "conversionProgress": { - "message": "Umtausch in Arbeit" - }, - "copiedButton": { - "message": "Kopiert" - }, - "copiedClipboard": { - "message": "In die Zwischenablage kopiert" - }, "copiedExclamation": { "message": "Kopiert!" }, - "copiedSafe": { - "message": "Ich habe es an einen sicheren Ort kopiert" + "copyAddress": { + "message": "Adresse in die Zwischenablage kopieren" + }, + "copyTransactionId": { + "message": "Transaktions-ID kopieren" }, - "copy": { - "message": "Kopieren" + "copiedTransactionId": { + "message": "Transaktions-ID kopiert" }, "copyToClipboard": { "message": "In die Zwischenablage kopieren" }, - "copyButton": { - "message": " Kopieren " - }, "copyPrivateKey": { "message": "Das ist Ihr Private Key (klicken um zu kopieren)" }, @@ -209,24 +269,26 @@ "createAccount": { "message": "Account erstellen" }, - "createDen": { - "message": "Erstellen" + "createAWallet": { + "message": "Eine Wallet erstellen" }, - "crypto": { - "message": "Krypto", - "description": "Börsentyp (Kryptowährungen)" + "createPassword": { + "message": "Passwort erstellen" }, - "currentConversion": { - "message": "Aktuelle Tauschwährung" + "currencyConversion": { + "message": "Währungsumrechnung" }, - "currentNetwork": { - "message": "Aktuelles Netzwerk" + "currentLanguage": { + "message": "Aktuelle Sprache" }, "customGas": { "message": "Gas anpassen" }, - "customize": { - "message": "Anpassen" + "customGasSubTitle": { + "message": "Höhere Gebühren können Bearbeitungszeiten verkürzen, wofür es allerdings keine Garantie gibt." + }, + "customToken": { + "message": "Custom-Token" }, "customRPC": { "message": "Spezieller RPC" @@ -240,39 +302,18 @@ "defaultNetwork": { "message": "Das Standardnetzwerk für Ether Transaktionen ist das Main Net." }, - "denExplainer": { - "message": "Dein DEN ist dein passwortverschlüsselter Speicher innerhalb von MetaMask." + "delete": { + "message": "Löschen" + }, + "deleteAccount": { + "message": "Konto löschen" }, "deposit": { "message": "Einzahlen" }, - "depositBTC": { - "message": "Zahle dein BTC in die unten stehende Adresse ein:" - }, - "depositEth": { - "message": "Eth kaufen" - }, "depositEther": { "message": "Ether einzahlen" }, - "depositFiat": { - "message": "Fiat einzahlen" - }, - "depositFromAccount": { - "message": "Von einem anderen Account einzahlen" - }, - "depositShapeShift": { - "message": "Mit ShapeShift einzahlen" - }, - "depositShapeShiftExplainer": { - "message": "Wenn du andere Kryptowährungen besitzt, kannst du diese direkt mit Hilfe deiner MetaMask Wallet handeln und einzahlen. Du benötigst keinen Account." - }, - "details": { - "message": "Details" - }, - "directDeposit": { - "message": "Sofortige Einzahlung" - }, "directDepositEther": { "message": "Sofort Ether einzahlen" }, @@ -282,158 +323,225 @@ "done": { "message": "Fertig" }, + "downloadGoogleChrome": { + "message": "Google Chrome herunterladen" + }, + "downloadSecretBackup": { + "message": "Laden Sie diesen geheimen Backup-Schlüssel herunter und bewahren Sie ihn sicher auf einer verschlüsselten externen Festplatte oder einem Speichermedium auf." + }, "downloadStateLogs": { "message": "Statelogs herunterladen" }, + "dontHaveAHardwareWallet": { + "message": "Sie haben kein Hardware-Wallet?" + }, "dropped": { "message": "Abgewählt" }, "edit": { "message": "Editieren" }, - "editAccountName": { - "message": "Namen des Accounts editieren" + "editContact": { + "message": "Kontakt bearbeiten" + }, + "endOfFlowMessage1": { + "message": "Sie haben den Test bestanden - bewahren Sie Ihre mnemonische Phrase sicher auf, Sie sind dafür verantwortlich! " + }, + "endOfFlowMessage2": { + "message": "Tipps zur sicheren Aufbewahrung" + }, + "endOfFlowMessage3": { + "message": "Speichern Sie ein Backup an mehreren Orten." + }, + "endOfFlowMessage4": { + "message": "Zeigen Sie diesen Schlüssel niemals einer anderen Person." + }, + "endOfFlowMessage5": { + "message": "Vorsicht vor Phishing! MetaMask fragt Sie niemals spontan nach Ihrer mnemonischen Phrase." + }, + "endOfFlowMessage6": { + "message": "Wenn Sie Ihre mnemonische Phrase erneut sicherstellen müssen, finden Sie sie unter Einstellungen -> Sicherheit." }, - "emailUs": { - "message": "Schreib uns eine Mail!" + "endOfFlowMessage7": { + "message": "Wenn Sie Fragen haben sollten oder etwas Suspektes bemerken, schreiben Sie eine E-Mail an support@metamask.io." }, - "encryptNewDen": { - "message": "Verschlüssele deine neue DEN" + "endOfFlowMessage8": { + "message": "MetaMask kann Ihren Seedschlüssel nicht wiederherstellen. Erfahren Sie mehr." + }, + "endOfFlowMessage9": { + "message": "Mehr hierzu." + }, + "endOfFlowMessage10": { + "message": "Alles erledigt" + }, + "ensRegistrationError": { + "message": "Fehler bei der ENS-Namensregistrierung" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "ENS-Name wurde im aktuellen Netzwerk nicht gefunden. Versuchen Sie, zum Main Ethereum Network zu wechseln." + }, + "enterAnAlias": { + "message": "Ein Alias eingeben" }, "enterPassword": { "message": "Passwort eingeben" }, - "enterPasswordConfirm": { - "message": "Gib dein neues Passwort zur Bestätigung ein" - }, - "passwordNotLongEnough": { - "message": "Passwort ist nicht lang genug" + "enterPasswordContinue": { + "message": "Zum Fortfahren Passwort eingeben" }, - "passwordsDontMatch": { - "message": "Passwörter stimmen nicht überein" + "ethereumPublicAddress": { + "message": "Öffentliche Ethereum-Adresse" }, "etherscanView": { "message": "Account auf Etherscan anschauen" }, - "exchangeRate": { - "message": "Wechselrate" + "estimatedProcessingTimes": { + "message": "Geschätzte Bearbeitungszeiten" + }, + "expandView": { + "message": "Ansicht erweitern" }, "exportPrivateKey": { "message": "Private Key exportieren" }, - "exportPrivateKeyWarning": { - "message": "Der Export von Private Keys verläuft auf eigene Verantwortung." - }, "failed": { "message": "Fehlgeschlagen" }, + "fast": { + "message": "Schnell" + }, + "faster": { + "message": "Schneller" + }, "fiat": { "message": "FIAT", - "description": "Börsentyp" + "description": "Exchange type" }, "fileImportFail": { "message": "Dateiimport fehlgeschlagen? Bitte hier klicken!", - "description": "Hilft dem Benutzer sein Benutzerkonto durch eine JSON Datei zu importieren" + "description": "Helps user import their account from a JSON file" }, - "followTwitter": { - "message": "Folge uns auf Twitter" + "forgetDevice": { + "message": "Dieses Gerät entfernen" }, "from": { "message": "Von" }, - "fromToSame": { - "message": "Ziel- und Ursprungsadresse dürfen nicht identisch sein" - }, - "fromShapeShift": { - "message": "Von ShapeShift" - }, - "gas": { - "message": "Gas", - "description": "Kleiner Hinweis bzgl. der Gaskosten" - }, - "gasFee": { - "message": "Gasgebühren" + "functionType": { + "message": "Funktionstyp" }, "gasLimit": { "message": "Gaslimit" }, - "gasLimitCalculation": { - "message": "Wir berechnen das empfohlene Gaslimit basierend auf der Erfolgsrate des Netzwerks." - }, - "gasLimitRequired": { - "message": "Gaslimit benötigt" + "gasLimitInfoModalContent": { + "message": "Die Gasgrenze ist die Höchstmenge an Gaseinheiten, die Sie auszugeben bereit sind." }, "gasLimitTooLow": { "message": "Gaslimit muss mindestens 21000 betragen" }, - "generatingSeed": { - "message": "Seed generieren..." + "gasUsed": { + "message": "Verwendetes Gas" }, "gasPrice": { "message": "Gaspreis (GWEI)" }, - "gasPriceCalculation": { - "message": "Wir berechnen den empfohlenen Gaspreis basierend auf der Erfolgsrate des Netzwerks." + "gasPriceExtremelyLow": { + "message": "Gaspreis extrem niedrig" + }, + "gasPriceInfoModalContent": { + "message": "Der Gaspreis gibt die Menge Ether an, die Sie für jede Einheit Gas zu zahlen bereit sind." + }, + "gasPriceNoDenom": { + "message": "Gaspreis" }, - "gasPriceRequired": { - "message": "Gaspreis benötigt" + "general": { + "message": "Allgemein" + }, + "generalSettingsDescription": { + "message": "Währungsumrechnung, Primärwährung, Sprache, Blockies-Identicon" }, "getEther": { "message": "Ether holen" }, "getEtherFromFaucet": { "message": "Ether für $1 vom Faucet holen", - "description": "Zeigt den Netzwerknamen für den Ether Faucet an" + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "Erhalten Sie Hilfe." + }, + "getStarted": { + "message": "Erste Schritte" + }, + "happyToSeeYou": { + "message": "Wir freuen uns, Sie zu sehen." }, - "greaterThanMin": { - "message": "Muss größer oder gleich $1 sein.", - "description": "Helfer für die Eingabe von hex als dezimal" + "hardware": { + "message": "Hardware" + }, + "hardwareWalletConnected": { + "message": "Hardware-Wallet verknüpft" + }, + "hardwareWallets": { + "message": "Ein Hardware-Wallet verknüpfen" + }, + "hardwareWalletsMsg": { + "message": "Wählen Sie ein Hardware-Wallet aus, das Sie mit MetaMask verwenden möchten" + }, + "havingTroubleConnecting": { + "message": "Verbindungsprobleme?" }, "here": { "message": "hier", - "description": "z.B. für klick hier für mehr Informationen (in Zusammenhang mit troubleTokenBalances)" + "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, - "hereList": { - "message": "Hier ist eine Liste!!!!" + "hexData": { + "message": "Hexdaten" }, "hide": { "message": "Ausblenden" }, - "hideToken": { - "message": "Token ausblenden" - }, "hideTokenPrompt": { "message": "Token ausblenden?" }, - "howToDeposit": { - "message": "Wie möchtest du Ether einzahlen?" - }, - "holdEther": { - "message": "Es erlaubt dir ether & Token zu halten und dient dir als Verbindung zu dezentralisierten Applikationen." + "history": { + "message": "Verlauf" }, "import": { "message": "Importieren", - "description": "Button um den Account aus einer ausgewählten Datei zu importieren" + "description": "Button to import an account from a selected file" }, "importAccount": { "message": "Account importieren" }, "importAccountMsg": { - "message": " Importierte Accounts werden nicht mit der Seed-Wörterfolge deines ursprünglichen MetaMask Accounts verknüpft. Erfahre mehr über importierte Accounts." + "message": " Importierte Accounts werden nicht mit der Seed-Wörterfolge deines ursprünglichen MetaMask Accounts verknüpft. Erfahre mehr über importierte Accounts." }, - "importAnAccount": { - "message": "Einen Account importieren" + "importAccountSeedPhrase": { + "message": "Ein Konto mit einem Seed-Schlüssel importieren" }, - "importDen": { - "message": "Vorhandenes DEN importieren" + "importWallet": { + "message": "Wallet importieren" + }, + "importYourExisting": { + "message": "Importieren Sie Ihre bestehende Wallet mit einem 12-Wort-Seed-Schlüssel" }, "imported": { "message": "Importiert", - "description": "Status der angezeigt wird wenn ein Benutzerkonto vollständig in das Schlüsselbund geladen wurde." + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "Mittels mnemonischer Phrase des Kontos importieren" }, "infoHelp": { "message": "Info & Hilfe" }, + "initialTransactionConfirmed": { + "message": "Ihre erste Transaktion wurde vom Netzwerk bestätigt. Klicken Sie auf Okay, um zurückzukehren." + }, + "insufficientBalance": { + "message": "Guthaben reicht nicht aus." + }, "insufficientFunds": { "message": "Nicht genügend Guthaben." }, @@ -446,46 +554,45 @@ "invalidAddressRecipient": { "message": "Empfängeradresse ist unzulässig" }, - "invalidGasParams": { - "message": "Ungültige Gasparameter" + "knownAddressRecipient": { + "message": "Bekannte Vertragsadresse." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "Kein ETH-Netzwerk, auf Kleinschreibung gesetzt" }, "invalidInput": { "message": "Ungültige Eingabe." }, - "invalidRequest": { - "message": "Ungültige Abfrage" - }, "invalidRPC": { "message": "Ungültige RPC URI" }, - "jsonFail": { - "message": "Irgendetwas ist schief gelaufen. Bitte überprüfe ob deine JSON Datei korrekt formatiert ist." + "invalidBlockExplorerURL": { + "message": "Ungültige Block Explorer URI" + }, + "invalidSeedPhrase": { + "message": "Ungültiger Seedschlüssel" }, "jsonFile": { "message": "JSON Datei", - "description": "Dateiformat für das Importieren eines Accounts" + "description": "format for importing an account" }, "kovan": { "message": "Kovan Testnetzwerk" }, - "knowledgeDataBase": { - "message": "Schau in unsere Wissensdatenbank" + "learnMore": { + "message": "Mehr erfahren" }, - "max": { - "message": "Max" + "ledgerAccountRestriction": { + "message": "Sie müssen Ihr letztes Konto verwenden, ehe Sie ein neues hinzufügen können." }, - "lessThanMax": { - "message": "Muss kleiner oder gleich $1 sein.", - "description": "Helfer für die Eingabe von hex als dezimal" + "letsGoSetUp": { + "message": "Ja, legen wir los!" }, "likeToAddTokens": { "message": "Möchtest du diese Token hinzufügen?" }, - "links": { - "message": "Links" - }, - "limit": { - "message": "Limit" + "liveGasPricePredictions": { + "message": "Live-Gaspreisprognosen" }, "loading": { "message": "Laden..." @@ -493,36 +600,42 @@ "loadingTokens": { "message": "Token laden..." }, - "localhost": { - "message": "Localhost 8545" + "loadMore": { + "message": "Mehr laden" }, - "login": { - "message": "Login" - }, - "logout": { + "lock": { "message": "Ausloggen" }, - "loose": { - "message": "Frei" - }, - "loweCaseWords": { - "message": "Die Wörter der Seed-Wörterfolgen sind alle kleingeschrieben" - }, "mainnet": { "message": "Ethereum Main Net" }, + "memorizePhrase": { + "message": "Prägen Sie sich diese Phrase ein." + }, + "memo": { + "message": " Memo" + }, "message": { "message": "Nachricht" }, "metamaskDescription": { "message": "MetaMask ist ein sicherer Identitätssafe für Ethereum." }, - "min": { - "message": "Minimum" + "metamaskVersion": { + "message": "MetaMask-Version" + }, + "mobileSyncText": { + "message": "Bitte geben Sie Ihr Passwort ein, um Ihre Identität zu verifizieren!" }, "myAccounts": { "message": "Meine Accounts" }, + "myWalletAccounts": { + "message": "Meine Wallet-Konten" + }, + "myWalletAccountsDescription": { + "message": "Jedes Ihrer von MetaMask erstellten Konten wird automatisch zu diesem Abschnitt hinzugefügt." + }, "mustSelectOne": { "message": "Du musst mindestens 1 Token auswählen." }, @@ -531,24 +644,35 @@ }, "needImportFile": { "message": "Für den Import musst du eine Datei auswählen.", - "description": "Benutzer importiert ein Benutzerkonto und muss eine Datei hinzufügen um fortzufahren" - }, - "needImportPassword": { - "message": "Für die ausgewählte Datei muss ein Passwort eingegeben werden.", - "description": "Passwort und Datei sind notwendig um einen Account zu importieren" + "description": "User is important an account and needs to add a file to continue" }, "negativeETH": { "message": "Negative ETH Beträge können nicht versendet werden." }, + "networkName": { + "message": "Netzwerkname" + }, "networks": { "message": "Netzwerke" }, + "networkSettingsDescription": { + "message": "Individuelle RPC-Netzwerke hinzufügen und bearbeiten" + }, + "nevermind": { + "message": "Schon gut" + }, "newAccount": { "message": "Neuer Account" }, + "newAccountDetectedDialogMessage": { + "message": "Neue Adresse erkannt! Klicken Sie hier, um sie zu Ihrem Adressbuch hinzuzufügen." + }, "newAccountNumberName": { - "message": "Account $1", - "description": "Standardname für einen weiteren Account der angelegt wird, wenn create account screen geklickt wird" + "message": "Account $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "Neuer Kontakt" }, "newContract": { "message": "Neuer Smart Contract" @@ -556,11 +680,32 @@ "newPassword": { "message": "Neues Passwort (min. 8 Zeichen)" }, - "newRecipient": { - "message": "Neuer Empfänger" + "newNetwork": { + "message": "Neues Netzwerk" + }, + "newToMetaMask": { + "message": "Neu bei MetaMask?" + }, + "noAlreadyHaveSeed": { + "message": "Nein, ich habe bereits einen Seed-Schlüssel" + }, + "protectYourKeys": { + "message": "Schützen Sie Ihre Schlüssel!" + }, + "protectYourKeysMessage1": { + "message": "Seien Sie mit Ihrer mnemonischen Phrase vorsichtig - es gab Berichte über Websites, die MetaMask zu imitieren versuchen. MetaMask fragt nie nach Ihrer mnemonischen Phrase!" + }, + "protectYourKeysMessage2": { + "message": "Bewahren Sie Ihren Schlüssel sicher auf. Wenn etwas faul zu sein scheint oder Sie Zweifel wegen einer Website haben, schicken Sie eine E-Mail an support@metamask.io" }, - "newRPC": { - "message": "Neue RPC URL" + "rpcUrl": { + "message": "Neue RPC-URL" + }, + "newTotal": { + "message": "Neue Summe" + }, + "newTransactionFee": { + "message": "Neue Transaktionsgebühr" }, "next": { "message": "Weiter" @@ -568,115 +713,162 @@ "noAddressForName": { "message": "Für den angegebene Namen wurde keine Adresse eingegeben." }, - "noDeposits": { - "message": "Keine Einzahlung erhalten" - }, - "noTransactionHistory": { - "message": "Keine Transaktionshistorie." + "noConversionRateAvailable": { + "message": "Kein Umrechnungskurs verfügbar" }, "noTransactions": { "message": "Keine Transaktionen" }, - "notStarted": { - "message": "Nicht gestartet" + "notEnoughGas": { + "message": "Nicht genügend Gas" + }, + "noWebcamFoundTitle": { + "message": "Webcam nicht gefunden" }, - "oldUI": { - "message": "Alte Oberfläche" + "noWebcamFound": { + "message": "Die Webcam Ihres Computers wurde nicht gefunden. Bitte versuchen Sie es erneut." }, - "oldUIMessage": { - "message": "Du bist zur alten Oberfläche zurückgewechselt. Du kannst mit Hilfe der Option im oberen rechten Dropdown Menü zur neuen Oberfläche zurückwechseln." + "ofTextNofM": { + "message": "von" }, - "or": { - "message": "oder", - "description": "Wahl zwischen erstellen oder importieren eines Accounts." + "orderOneHere": { + "message": "Bestellen Sie ein Trezor oder Ledger und legen Sie Ihr Geld auf Eis" }, - "passwordCorrect": { - "message": "Bitte überzeuge dich davon, dass dein Passwort korrekt ist." + "origin": { + "message": "Ursprung" }, - "passwordMismatch": { - "message": "Passwörter stimmen nicht überein", - "description": "Im Passwort erstellen Prozess stimmen beide Passwörter nicht miteinander überein" + "parameters": { + "message": "Parameter" }, - "passwordShort": { - "message": "Passwort ist nicht lang genug", - "description": "Im Passwort erstellen Prozess ist das eingegebene Passwort nicht lang genug um sicher zu sein" + "participateInMetaMetrics": { + "message": "Bei MetaMetrics teilnehmen" + }, + "participateInMetaMetricsDescription": { + "message": "Nehmen Sie an MetaMetrics teil, um uns bei der Verbesserung von MetaMask zu helfen" + }, + "password": { + "message": "Passwort" + }, + "passwordsDontMatch": { + "message": "Passwörter stimmen nicht überein" + }, + "passwordNotLongEnough": { + "message": "Passwort ist nicht lang genug" }, "pastePrivateKey": { "message": "Füge deine Private Key Zeichenfolge hier ein:", - "description": "Für den Import eine Accounts mit Hilfe eines Private Keys" + "description": "For importing an account from a private key" }, - "pasteSeed": { - "message": "Füge deine Seed-Wörterfolge hier ein!" + "pending": { + "message": "ausstehend" }, "personalAddressDetected": { "message": "Personalisierte Adresse identifiziert. Bitte füge die Token Contract Adresse ein." }, - "pleaseReviewTransaction": { - "message": "Bitte überprüfe deine Transaktion." + "prev": { + "message": "Zurück" + }, + "primaryCurrencySetting": { + "message": "Hauptwährung" + }, + "primaryCurrencySettingDescription": { + "message": "Wählen Sie 'Nativ', um dem Anzeigen von Werten in der nativen Währung der Kette (z. B. ETH) Vorrang zu geben. Wählen Sie 'Fiat', um dem Anzeigen von Werten in Ihrer gewählten Fiat-Währung Vorrang zu geben." }, "privacyMsg": { "message": "Datenschutzrichtlinie" }, - "privateKey": { - "message": "Private Key", - "description": "Wähle diesen Dateityp um damit einen Account zu importieren" - }, "privateKeyWarning": { "message": "Warnung: Niemals jemanden deinen Private Key mitteilen. Jeder der im Besitz deines Private Keys ist, kann jegliches Guthaben deines Accounts stehlen." }, "privateNetwork": { "message": "Privates Netzwerk" }, - "qrCode": { - "message": "QR Code anzeigen" + "queue": { + "message": "Warteschlange" }, "readdToken": { "message": "Du kannst diesen Token immer erneut hinzufügen, indem du in den Menüpunkt \"Token hinzufügen\" in den Einstellungen deines Accounts gehst." }, - "readMore": { - "message": "Hier mehr erfahren." - }, - "readMore2": { - "message": "Mehr erfahren." - }, - "receive": { - "message": "Erhalten" + "recents": { + "message": "Letzte" }, "recipientAddress": { "message": "Empfängeradresse" }, - "refundAddress": { - "message": "Rückerstattungsadresse" + "recipientAddressPlaceholder": { + "message": "Suchen, öffentliche Adresse (0x) oder ENS" + }, + "rejectAll": { + "message": "Alle verwerfen" + }, + "rejectTxsN": { + "message": "$1 Transaktionen ablehnen" + }, + "rejectTxsDescription": { + "message": "Sie sind im Begriff, $1 Transaktionen geschlossen abzulehnen." }, "rejected": { "message": "Abgelehnt" }, + "reset": { + "message": "Zurücksetzen" + }, "resetAccount": { "message": "Account zurücksetzten" }, + "resetAccountDescription": { + "message": "Durch das Zurücksetzen Ihres Kontos wird Ihr Transaktionsverlauf gelöscht." + }, + "deleteNetwork": { + "message": "Netzwerk löschen?" + }, + "deleteNetworkDescription": { + "message": "Sind Sie sicher, dass Sie dieses Netzwerk löschen möchten?" + }, + "remindMeLater": { + "message": "Später erneut erinnern" + }, "restoreFromSeed": { "message": "Mit Hilfe der Seed-Wörterfolge wiederherstellen." }, - "restoreVault": { - "message": "Vault wiederherstellen" + "restoreAccountWithSeed": { + "message": "Ihr Konto mit mnemonischer Phrase wiederherstellen" + }, + "requestsAwaitingAcknowledgement": { + "message": "Anfragen warten auf Bestätigung" }, "required": { "message": "Benötigt" }, - "retryWithMoreGas": { - "message": "Versuche es hier mit einem höheren Gaspreis noch einmal" - }, - "walletSeed": { - "message": "Wallet Seed" + "restore": { + "message": "Wiederherstellen" }, "revealSeedWords": { "message": "Seed-Wörterfolge anzeigen" }, + "revealSeedWordsTitle": { + "message": "Mnemonische Phrase" + }, + "revealSeedWordsDescription": { + "message": "Wenn Sie einmal Ihren Browser oder Computer wechseln, benötigen Sie diesen Seed-Schlüssel, um auf Ihre Konten zuzugreifen. Bewahren Sie ihn an einem sicheren und geheimen Ort auf." + }, + "revealSeedWordsWarningTitle": { + "message": "Zeigen Sie diesen Schlüssel KEINER ANDEREN PERSON!" + }, "revealSeedWordsWarning": { "message": "Bitte niemals deine Seed-Wörterfolge an einem öffentlichen Ort kenntlich machen. Mit diesen Wörtern können alle deine Accounts gestohlen werden." }, - "revert": { - "message": "Rückgängig machen" + "remove": { + "message": "Entfernen" + }, + "removeAccount": { + "message": "Konto entfernen" + }, + "removeAccountDescription": { + "message": "Dieses Konto wird aus Ihrer Wallet entfernt. Bitte stellen Sie sicher, dass Sie den ursprünglichen Seedschlüssel oder den privaten Schlüssel für dieses importierte Konto haben, bevor Sie fortfahren. Über die Dropdown-Liste des Kontos können Sie Konten importieren oder neu anlegen." + }, + "readyToConnect": { + "message": "Bereit für die Verbindung?" }, "rinkeby": { "message": "Rinkeby Testnetzwerk" @@ -684,58 +876,65 @@ "ropsten": { "message": "Ropsten Testnetzwerk" }, - "currentRpc": { - "message": "Aktueller RPC" + "goerli": { + "message": "Goerli Testnetzwerk" }, - "connectingToMainnet": { - "message": "Verbinde zum Ethereum Main Net" + "save": { + "message": "Speichern" }, - "connectingToRopsten": { - "message": " Verbinde zum Ropsten Testnetzwerk" + "slow": { + "message": "Langsam" }, - "connectingToKovan": { - "message": " Verbinde zum Kovan Testnetzwerk" + "slower": { + "message": "Langsamer" }, - "connectingToRinkeby": { - "message": " Verbinde zum Rinkeby Testnetzwerk" + "saveAsCsvFile": { + "message": "Als CSV-Datei speichern" }, - "connectingToUnknown": { - "message": "Verbinde zu einem unbekanntem Netzwerk" + "scanInstructions": { + "message": "Platzieren Sie den QR-Code vor Ihrer Kamera." }, - "sampleAccountName": { - "message": "Z.B. mein neuer Account", - "description": "Dem Benutzer helfen das Konzept des Hinzufügens eines menschlich lesbaren Namen für den Account hinzuzufügen" + "scanQrCode": { + "message": "QR-Code scannen" }, - "save": { - "message": "Speichern" + "search": { + "message": "Suche" }, - "saveAsFile": { - "message": "Als Datei speichern", - "description": "Prozess des Exportieren eines Accounts" + "searchResults": { + "message": "Suchergebnisse" }, - "saveSeedAsFile": { - "message": "Seed-Wörterfolge als Datei speichern" + "secretBackupPhrase": { + "message": "Geheimer Backup-Schlüssel" }, - "search": { - "message": "Suche" + "secretBackupPhraseDescription": { + "message": "Mit Ihrem geheimen Backup-Schlüssel können Sie Ihr Konto ganz einfach sichern und wiederherstellen." + }, + "secretBackupPhraseWarning": { + "message": "WARNUNG: Legen Sie niemals Ihre Sicherungsphrase offen. Mit dieser Phrase kann sich jeder Ihr Ether für immer aneignen." }, "secretPhrase": { "message": "Gib die 12 Wörter deiner geheimem Wörterfolge ein um deinen Vault wiederherzustellen." }, - "newPassword8Chars": { - "message": "Neues Passwort (min. 8 Zeichen)" + "securityAndPrivacy": { + "message": "Sicherheit & Datenschutz" + }, + "securitySettingsDescription": { + "message": "Datenschutzeinstellungen und mnemonische Phrase des Wallets" + }, + "seedPhrasePlaceholder": { + "message": "Trennen Sie jedes Wort durch ein einzelnes Leerzeichen." }, "seedPhraseReq": { "message": "Seed-Wörterfolgen bestehen aus 12 Wörtern" }, - "select": { - "message": "Auswählen" - }, "selectCurrency": { "message": "Währung auswählen" }, - "selectService": { - "message": "Service auswählen" + "selectEachPhrase": { + "message": "Bitte wählen Sie jede Phrase aus, um sicherzustellen, dass sie korrekt ist." + }, + "selectLocale": { + "message": "Gebietsschema auswählen" }, "selectType": { "message": "Typ auswählen" @@ -743,56 +942,95 @@ "send": { "message": "Senden" }, + "sendAmount": { + "message": "Betrag senden" + }, "sendETH": { "message": "ETH senden" }, "sendTokens": { "message": "Token senden" }, - "onlySendToEtherAddress": { - "message": "ETH unbedingt nur zu einer Ethereum Adresse senden." + "sentEther": { + "message": "Ether senden" + }, + "sentTokens": { + "message": "gesendete Token" + }, + "separateEachWord": { + "message": "Trennen Sie die Wörter mit einem einzelnen Leerzeichen voneinander" + }, + "searchTokens": { + "message": "Token suchen" + }, + "selectAnAccount": { + "message": "Ein Konto auswählen" + }, + "selectAnAccountHelp": { + "message": "Wählen Sie das Konto aus, das in MetaMask angezeigt werden soll." + }, + "selectAHigherGasFee": { + "message": "Wählen Sie eine höhere Gasgebühr, um die Abwicklung Ihrer Transaktion zu beschleunigen.*" + }, + "selectHdPath": { + "message": "HD-Pfad auswählen" }, - "sendTokensAnywhere": { - "message": "Token zu einer beliebigen Person mit einem Ethereumaccount senden" + "selectPathHelp": { + "message": "Wenn Sie Ihre bestehenden Ledger-Konten nachfolgend nicht sehen, versuchen Sie, die Pfade zu \"Legacy (MEW / MyCrypto)\" zu ändern" }, "settings": { "message": "Einstellungen" }, - "info": { - "message": "Info" + "showAdvancedGasInline": { + "message": "Erweiterte Gaskontrollen" }, - "shapeshiftBuy": { - "message": "Mit Shapeshift kaufen" + "showAdvancedGasInlineDescription": { + "message": "Wählen Sie dies aus, um den Gaspreis und die Limitkontrollen direkt auf den Senden- und Bestätigen-Bildschirmen anzuzeigen." + }, + "showFiatConversionInTestnets": { + "message": "Umwandlung auf Testnets anzeigen" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Wählen Sie dies aus, um die Fiat-Konversion auf Testnets anzuzeigen" }, "showPrivateKeys": { "message": "Private Keys anzeigen" }, - "showQRCode": { - "message": "QR Code anzeigen" + "showHexData": { + "message": "Hexdaten anzeigen" + }, + "showHexDataDescription": { + "message": "Wählen Sie dies aus, um das Hexdatenfeld auf dem Senden-Bildschirm anzuzeigen" }, "sign": { "message": "Unterschreiben" }, + "signatureRequest": { + "message": "Unterschriftsanfrage" + }, "signed": { "message": "Unterschrieben" }, - "signMessage": { - "message": "Nachricht unterschreiben" - }, "signNotice": { "message": "Das Unterschreiben dieser Nachricht kann gefährliche Nebeneffekte haben. Bitte nur Nachrichten von Webseiten unterschreiben denen du deinen vollständigen Account anvertrauen würdest. Diese gefährliche Variante wird in zukünftigen Versionen entfernt werden." }, "sigRequest": { "message": "Unterschriftsanfrage" }, - "sigRequested": { - "message": "Unterschrift angefragt" + "somethingWentWrong": { + "message": "Hoppla! Da hat etwas nicht geklappt." + }, + "speedUp": { + "message": "Beschleunigen" + }, + "speedUpCancellation": { + "message": "Diese Stornierung beschleunigen" }, - "spaceBetween": { - "message": "Es darf nur ein Leerzeichen zwischen den Wörtern sein" + "speedUpTransaction": { + "message": "Diese Transaktion beschleunigen" }, - "status": { - "message": "Status" + "switchNetworks": { + "message": "Netzwerk wechseln" }, "stateLogs": { "message": "Statelogs" @@ -803,8 +1041,26 @@ "stateLogError": { "message": "Fehler beim Abfragen der Statelogs." }, - "submit": { - "message": "Einreichen" + "step1HardwareWallet": { + "message": "1. Hardware-Wallet verknüpfen" + }, + "step1HardwareWalletMsg": { + "message": "Verknüpfen Sie Ihr Hardware-Wallet direkt mit Ihrem Computer." + }, + "step2HardwareWallet": { + "message": "2. Ein Konto auswählen" + }, + "step2HardwareWalletMsg": { + "message": "Wählen Sie das Konto aus, das Sie anzeigen wollen. Sie können nur eines zur Zeit wählen." + }, + "step3HardwareWallet": { + "message": "3. Erste Schritte mit dApps und mehr!" + }, + "step3HardwareWalletMsg": { + "message": "Verwenden Sie Ihr Hardware-Konto so wie jedes Ethereum-Konto. Loggen Sie sich bei dApps ein, senden Sie Eth, kaufen und speichern Sie ERC20-Token und Nicht-Fungible-Token wie CryptoKitties." + }, + "storePhrase": { + "message": "Speichern Sie diesen Schlüssel in einem Passwortmanager wie 1Password." }, "submitted": { "message": "Abgeschickt" @@ -813,10 +1069,28 @@ "message": "Gehe zu unserem Support Center" }, "symbolBetweenZeroTwelve": { - "message": "Das Symbol muss zwischen 0 und 12 Zeichen haben." + "message": "Das Symbol darf maximal 11 Zeichen lang sein." + }, + "syncWithMobile": { + "message": "Mit Mobilgerät synchronisieren" + }, + "syncWithMobileTitle": { + "message": "Mit Mobilgerät synchronisieren" }, - "takesTooLong": { - "message": "Dauert es zu lang?" + "syncWithMobileDesc": { + "message": "Sie können Ihre Konten und Informationen mit Ihrem Mobilgerät synchronisieren. Öffnen Sie die MetaMask-Mobilapp, gehen Sie zu \"Einstellungen\" und tippen Sie auf \"Von Browsererweiterung aus synchronisieren\"" + }, + "syncWithMobileDescNewUsers": { + "message": "Wenn Sie die MetaMask-Mobilapp gerade zum ersten Mal öffnen, folgen Sie einfach den Schritten auf Ihrem Telefon." + }, + "syncWithMobileScanThisCode": { + "message": "Scannen Sie diesen Code mit Ihrer MetaMask-Mobilapp" + }, + "syncWithMobileBeCareful": { + "message": "Stellen Sie sicher, dass niemand sonst auf Ihren Bildschirm blickt, wenn Sie diesen Code scannen" + }, + "syncWithMobileComplete": { + "message": "Ihre Daten wurden erfolgreich synchronisiert. Viel Spaß mit der MetaMask-Handy-App!" }, "terms": { "message": "Nutzungsbedingungen" @@ -824,67 +1098,90 @@ "testFaucet": { "message": "Testfaucet" }, - "to": { - "message": "An" + "thisWillCreate": { + "message": "Hierdurch werden ein neues Wallet und eine mnemonische Phrase erzeugt" }, - "toETHviaShapeShift": { - "message": "$1 an ETH via ShapeShift", - "description": "Das System wird den Einzahlungstyp im Beginn der Nachricht eintragen" + "tips": { + "message": "Trinkgelder" }, - "tokenAddress": { - "message": "Tokenadresse" + "to": { + "message": "An" }, "tokenAlreadyAdded": { "message": "Der Token wurde bereits hinzugefügt." }, - "tokenBalance": { - "message": "Dein Tokenguthaben beträgt:" - }, - "tokenSelection": { - "message": "Suche nach Token oder wähle aus einer Liste der beliebtesten Token aus." + "tokenContractAddress": { + "message": "Token-Vertragsadresse" }, "tokenSymbol": { "message": "Tokensymbol" }, - "tokenWarning1": { - "message": "Behalte die Token die du mit deinem MetaMask Account gekauft hast im Blick. Wenn du Token mit einem anderen Account gekauft hast, werden diese hier nicht angezeigt." - }, "total": { "message": "Gesamt" }, - "transactions": { - "message": "Transaktionen" + "transaction": { + "message": "Transaktion" + }, + "transactionConfirmed": { + "message": "Transaktion bei $2 bestätigt." + }, + "transactionCreated": { + "message": "Transaktion mit einem Wert von $1 bei $2 erstellt." + }, + "transactionDropped": { + "message": "Transaktion bei $2 eingestellt." + }, + "transactionSubmitted": { + "message": "Transaktion mit einer Gasgebühr von $1 bei $2 übermittelt." + }, + "transactionResubmitted": { + "message": "Transaktion an $1 bei $2 mit erhöhter Gasgebühr erneut übermittelt" + }, + "transactionUpdated": { + "message": "Transaktion für $2 aktualisiert." }, - "transactionMemo": { - "message": "Transaktionsmemo (optional)" + "transactionErrored": { + "message": "Bei der Transaktion ist ein Fehler aufgetreten." }, - "transactionNumber": { - "message": "Transaktionsnummer" + "transactionCancelAttempted": { + "message": "Transaktionsstornierung versucht mit Gasgebühr von $1 bei $2" }, - "transfers": { - "message": "Transfers" + "transactionCancelSuccess": { + "message": "Transaktion bei $2 erfolgreich storniert" + }, + "transactionError": { + "message": "Transaktionsfehler. Fehler in Vertragscode eingefügt." + }, + "transactionErrorNoContract": { + "message": "Das Abrufen einer Funktion bei einer Nicht-Vertragsadresse wird versucht." + }, + "transactionFee": { + "message": "Transaktionsgebühr" + }, + "transactionTime": { + "message": "Transaktionszeit" + }, + "transferBetweenAccounts": { + "message": "Zwischen meinen Konten transferieren" + }, + "transferFrom": { + "message": "Transferieren von" }, "troubleTokenBalances": { "message": "Wir haben Schwierigkeiten dein Tokenguthaben zu laden. Du kannst es hier anzeigen lassen", - "description": "Gefolgt von einem Link (hier) um die Tokenguthaben anzuzeigen" + "description": "Followed by a link (here) to view token balances" }, - "twelveWords": { - "message": "Diese 12 Wörter stellen die einzige Möglichkeit dar deinen MetaMask Account wiederherzustellen. Speichere sie daher an einem sicheren und geheimen Ort." + "tryAgain": { + "message": "Erneut versuchen" }, "typePassword": { "message": "Passwort eingeben" }, - "uiWelcome": { - "message": "Willkommen zur neuen Oberfläche (Beta)" - }, - "uiWelcomeMessage": { - "message": "Du verwendest nun die neue MetaMask Oberfläche. Schau dich um, teste die neuen Features wie z.B. das Senden von Token und lass es uns wissen falls du irgendwelche Probleme hast." - }, "unapproved": { "message": "Nicht genehmigt" }, - "unavailable": { - "message": "Nicht verfügbar" + "units": { + "message": "Einheiten" }, "unknown": { "message": "Unbekannt" @@ -892,47 +1189,76 @@ "unknownNetwork": { "message": "Unbekanntes privates Netzwerk" }, - "uriErrorMsg": { - "message": "URIs benötigen die korrekten HTTP/HTTPS Präfixe." + "unknownQrCode": { + "message": "Fehler: Wir konnten diesen QR-Code nicht identifizieren." }, - "unknownNetworkId": { - "message": "Unbekannte Netzwerk ID" + "unknownCameraErrorTitle": { + "message": "Hoppla! Etwas ist schiefgegangen ..." }, - "usaOnly": { - "message": "Nur USA ", - "description": "Diese Börse ist nur für Einwohner der USA verfügbar" + "unknownCameraError": { + "message": "Beim Versuch, auf Ihre Kamera zuzugreifen, ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut …" }, - "usedByClients": { - "message": "Verwendet von einer Reihe verschiedenen Kunden" + "unlock": { + "message": "Entsperren" + }, + "unlockMessage": { + "message": "Das dezentrale Web erwartet Sie" }, - "useOldUI": { - "message": "Alte Oberfläche verwenden" + "updatedWithDate": { + "message": "$1 aktualisiert" }, - "validFileImport": { - "message": "Du musst eine gültige Datei für den Import auswählen." + "urlErrorMsg": { + "message": "URIs benötigen die korrekten HTTP/HTTPS Präfixe." + }, + "usedByClients": { + "message": "Verwendet von einer Reihe verschiedenen Kunden" }, - "vaultCreated": { - "message": "Vault erstellt" + "userName": { + "message": "Nutzername" }, "viewAccount": { "message": " Account einsehen" }, + "viewinExplorer": { + "message": "Im Explorer anzeigen" + }, + "viewContact": { + "message": "Kontakt anzeigen" + }, + "viewOnCustomBlockExplorer": { + "message": "Für $1 ansehen" + }, + "viewOnEtherscan": { + "message": "Auf Etherscan ansehen" + }, "visitWebSite": { "message": "Gehe zu unserer Webseite" }, - "warning": { - "message": "Warnung" + "welcomeBack": { + "message": "Willkommen zurück!" }, "welcome": { "message": "Willkommen zu MetaMask" }, - "whatsThis": { - "message": "Was ist das?" + "writePhrase": { + "message": "Schreiben Sie diese Phrase auf ein Stück Papier und bewahren Sie es an einem sicheren Ort auf. Wenn Sie noch mehr Sicherheit wollen, schreiben Sie sie auf mehrere Papierstücke und bewahren jedes an 2-3 verschiedenen Orten auf." + }, + "yesLetsTry": { + "message": "Ja, versuchen wir es" + }, + "youNeedToAllowCameraAccess": { + "message": "Sie müssen Zugriff auf die Kamera erlauben, um diese Funktion nutzen zu können." }, "yourSigRequested": { "message": "Deine Unterschrift wird angefordert" }, "youSign": { "message": "Du unterschreibst" + }, + "yourPrivateSeedPhrase": { + "message": "Ihr privater Seed-Schlüssel" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "Keine Gaskosten bei Beschleunigung" } } diff --git a/app/_locales/el/messages.json b/app/_locales/el/messages.json new file mode 100644 index 000000000000..ca3af0a616da --- /dev/null +++ b/app/_locales/el/messages.json @@ -0,0 +1,1304 @@ +{ + "chartOnlyAvailableEth": { + "message": "Το διάγÏαμμα είναι διαθέσιμο μόνο σε δίκτυα Ethereum." + }, + "contractInteraction": { + "message": "ΑλληλεπίδÏαση ΣÏμβασης" + }, + "reject": { + "message": "ΑπόÏÏιψη" + }, + "about": { + "message": "Σχετικά με" + }, + "aboutSettingsDescription": { + "message": "Έκδοση, κέντÏο υποστήÏιξης και πληÏοφοÏίες επικοινωνίας" + }, + "acceleratingATransaction": { + "message": "* Η επιτάχυνση μιας συναλλαγής με τη χÏήση υψηλότεÏης τιμής καυσίμου αυξάνει τις πιθανότητές της για ταχÏτεÏη επεξεÏγασία από το δίκτυο, αλλά δεν είναι πάντοτε εγγυημένη." + }, + "accessingYourCamera": { + "message": "ΠÏόσβαση στην κάμεÏά σας..." + }, + "account": { + "message": "ΛογαÏιασμός" + }, + "accountDetails": { + "message": "ΛεπτομέÏειες ΛογαÏιασμοÏ" + }, + "accountName": { + "message": "Όνομα ΛογαÏιασμοÏ" + }, + "accountOptions": { + "message": "Επιλογές ΛογαÏιασμοÏ" + }, + "accountSelectionRequired": { + "message": "ΠÏέπει να επιλέξετε έναν λογαÏιασμό!" + }, + "activityLog": { + "message": "αÏχείο καταγÏαφής δÏαστηÏιότητας" + }, + "addNetwork": { + "message": "ΠÏοσθήκη ΔικτÏου" + }, + "addRecipient": { + "message": "ΠÏοσθήκη ΠαÏαλήπτη" + }, + "advanced": { + "message": "ΣÏνθετες" + }, + "advancedSettingsDescription": { + "message": "Αποκτήστε Ï€Ïόσβαση στις λειτουÏγίες του Ï€ÏογÏαμματιστή, κατεβάστε ΑÏχεία ΚαταγÏαφών Καταστάσεων, ΕπαναφέÏετε τον ΛογαÏιασμό, εγκαταστήστε δοκιμαστικά δίκτυα και Ï€ÏοσαÏμοσμένα RPC" + }, + "advancedOptions": { + "message": "ΣÏνθετες Επιλογές" + }, + "addToAddressBook": { + "message": "ΠÏοσθήκη στο βιβλίο διευθÏνσεων" + }, + "addToAddressBookModalPlaceholder": { + "message": "Ï€.χ. John D." + }, + "addAlias": { + "message": "ΠÏοσθήκη ψευδωνÏμου" + }, + "addToken": { + "message": "ΠÏοσθήκη Token" + }, + "addTokens": { + "message": "ΠÏοσθήκη Token" + }, + "addSuggestedTokens": { + "message": "ΠÏοσθέστε τα ΠÏοτεινόμενα Tokens" + }, + "addAcquiredTokens": { + "message": "ΠÏοσθέστε τα token που αποκτήσατε χÏησιμοποιώντας το MetaMask" + }, + "amount": { + "message": "Ποσό" + }, + "appDescription": { + "message": "Ένα ΠοÏτοφόλι Ethereum στο ΠÏόγÏαμμα ΠεÏιήγησής σας", + "description": "The description of the application" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "approve": { + "message": "ΈγκÏιση" + }, + "approved": { + "message": "ΕγκÏίθηκε" + }, + "asset": { + "message": "Στοιχείο ενεÏγητικοÏ" + }, + "attemptingConnect": { + "message": "ΠÏοσπάθεια σÏνδεσης στην αλυσίδα μπλοκ." + }, + "attemptToCancel": { + "message": "ΠÏοσπάθεια ΑκÏÏωσης;" + }, + "attemptToCancelDescription": { + "message": "Η υποβολή αυτής της Ï€Ïοσπάθειας δεν εγγυάται ότι η αÏχική σας συναλλαγή θα ακυÏωθεί. Αν η Ï€Ïοσπάθεια ακÏÏωσης είναι επιτυχής, θα χÏεωθείτε με το παÏαπάνω τέλος συναλλαγής." + }, + "attributions": { + "message": "Αποδόσεις" + }, + "autoLockTimeLimit": { + "message": "ΧÏονόμετÏο Αυτόματης ΑποσÏνδεσης (λεπτά)" + }, + "autoLockTimeLimitDescription": { + "message": "Ρυθμίστε τον χÏόνο αδÏάνειας σε λεπτά Ï€Ïιν αποσυνδεθεί αυτόματα το MetaMask" + }, + "average": { + "message": "Μέσος ÎŒÏος" + }, + "back": { + "message": "Πίσω" + }, + "backToAll": { + "message": "Πίσω σε Όλα" + }, + "backupApprovalNotice": { + "message": "ΔημιουÏγήστε αντίγÏαφο ασφαλείας του κώδικα Μυστικής Αποκατάστασης για να διατηÏήσετε ασφαλή το ποÏτοφόλι και τα χÏήματά σας." + }, + "backupApprovalInfo": { + "message": "Αυτός ο μυστικός κωδικός απαιτείται για ανάκτηση του ποÏÏ„Î¿Ï†Î¿Î»Î¹Î¿Ï ÏƒÎ±Ï‚ σε πεÏίπτωση που χάσετε τη συσκευή σας, ξεχάσετε τον κωδικό Ï€Ïόσβασης, Ï€Ïέπει να κάνετε επανεγκατάσταση του MetaMask, ή θέλετε να έχετε Ï€Ïόσβαση στο ποÏτοφόλι σας από μια άλλη συσκευή." + }, + "backupNow": { + "message": "ΔημιουÏγήστε αντίγÏαφο ασφαλείας τώÏα" + }, + "balance": { + "message": "Υπόλοιπο" + }, + "balanceOutdated": { + "message": "Το υπόλοιπο μποÏεί να μην είναι ενημεÏωμένο" + }, + "basic": { + "message": "Βασικά" + }, + "blockExplorerUrl": { + "message": "ΕξεÏευνητής Μπλοκ" + }, + "blockExplorerView": { + "message": "ΠÏοβολή λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï Î¼Îµ $1", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "ΧÏήση ΑναπαÏάστασης Μπλοκ" + }, + "browserNotSupported": { + "message": "Το ΠÏόγÏαμμα ΠεÏιήγησής σας δεν υποστηÏίζεται..." + }, + "builtInCalifornia": { + "message": "Το MetaMask έχει σχεδιαστεί και αναπτυχθεί στην ΚαλιφόÏνια." + }, + "buyWithWyre": { + "message": "ΑγοÏάστε ETH με το Wyre" + }, + "buyWithWyreDescription": { + "message": "Το Wyre σας επιτÏέπει να χÏησιμοποιήσετε μια πιστωτική κάÏτα για να καταθέσετε ETH απευθείας στον λογαÏιασμό σας MetaTask." + }, + "buyCoinSwitch": { + "message": "ΑγοÏάστε στο CoinSwitch" + }, + "buyCoinSwitchExplainer": { + "message": "Το CoinSwitch είναι ο Ï€ÏοοÏισμός μιας στάσης για ανταλλαγή σε πεÏισσότεÏα από 300 κÏυπτονομίσματα στην καλÏτεÏη ισοτιμία." + }, + "off": { + "message": "ΑνενεÏγό" + }, + "ok": { + "message": "Εντάξει" + }, + "on": { + "message": "ΕνεÏγό" + }, + "optionalBlockExplorerUrl": { + "message": "ΔιεÏθυνση URL ΕξεÏευνητή Μπλοκ (Ï€ÏοαιÏετικό)" + }, + "cancel": { + "message": "ΑκÏÏωση" + }, + "cancelAttempt": { + "message": "ΑκÏÏωση ΠÏοσπάθειας" + }, + "cancellationGasFee": { + "message": "ΑκÏÏωση ΧÏέωσης ΑεÏίου" + }, + "cancelled": { + "message": "ΑκυÏώθηκε" + }, + "chainId": { + "message": "ΑναγνωÏιστικό Αλυσίδας" + }, + "clickToRevealSeed": { + "message": "Κάντε κλικ εδώ για να αποκαλÏψετε μυστικές λέξεις" + }, + "close": { + "message": "Κλείσιμο" + }, + "chromeRequiredForHardwareWallets": { + "message": "Θα Ï€Ïέπει να χÏησιμοποιήσετε το MetaMask στο Google Chrome για να συνδεθείτε στο ΠοÏτοφόλι ΥλικοÏ." + }, + "confirm": { + "message": "Επιβεβαίωση" + }, + "confirmed": { + "message": "Επιβεβαιωμένο" + }, + "confirmPassword": { + "message": "Επιβεβαίωση ÎšÏ‰Î´Î¹ÎºÎ¿Ï Î Ïόσβασης" + }, + "confirmSecretBackupPhrase": { + "message": "Επιβεβαιώστε τη Μυστική ΦÏάση ΑντιγÏάφου Ασφαλείας" + }, + "congratulations": { + "message": "ΣυγχαÏητήÏια" + }, + "connectHardwareWallet": { + "message": "ΣÏνδεση ΠοÏÏ„Î¿Ï†Î¿Î»Î¹Î¿Ï Î¥Î»Î¹ÎºÎ¿Ï" + }, + "connect": { + "message": "ΣÏνδεση" + }, + "connectingTo": { + "message": "ΣÏνδεση με $1" + }, + "connectingToKovan": { + "message": "ΣÏνδεση στο Δοκιμαστικό Δίκτυο Kovan" + }, + "connectingToMainnet": { + "message": "ΣÏνδεση στο ΚÏÏιο Δίκτυο Ethereum" + }, + "connectingToRopsten": { + "message": "ΣÏνδεση με το Δίκτυο Δοκιμών Ropsten" + }, + "connectingToRinkeby": { + "message": "ΣÏνδεση στο Δίκτυο Δοκιμών Rinkeby" + }, + "connectingToLocalhost": { + "message": "ΣÏνδεση στον Τοπικό Υπολογιστή 8545" + }, + "connectingToGoerli": { + "message": "ΣÏνδεση στο Δίκτυο Δοκιμής Goerli " + }, + "continueToWyre": { + "message": "Συνεχίστε στο Wyre" + }, + "continueToCoinSwitch": { + "message": "Συνέχεια με CoinSwitch" + }, + "contractDeployment": { + "message": "Ανάπτυξη Συμβολαίου" + }, + "copiedExclamation": { + "message": "Έγινε αντιγÏαφή!" + }, + "copyAddress": { + "message": "ΑντιγÏάψτε τη διεÏθυνση στο Ï€ÏόχειÏο" + }, + "copyTransactionId": { + "message": "ΑντιγÏαφή Ταυτότητας Συναλλαγής" + }, + "copiedTransactionId": { + "message": "ΑντιγÏάφηκε το ΑναγνωÏιστικό Συναλλαγής" + }, + "copyToClipboard": { + "message": "ΑντιγÏαφή στο Ï€ÏόχειÏο" + }, + "copyPrivateKey": { + "message": "Αυτό είναι το ιδιωτικό σας κλειδί (κάντε κλικ για αντιγÏαφή)" + }, + "create": { + "message": "ΔημιουÏγία" + }, + "createAccount": { + "message": "ΔημιουÏγία ΛογαÏιασμοÏ" + }, + "createAWallet": { + "message": "ΔημιουÏγήστε ένα ΠοÏτοφόλι" + }, + "createPassword": { + "message": "ΔημιουÏγία ÎšÏ‰Î´Î¹ÎºÎ¿Ï Î Ïόσβασης" + }, + "currencyConversion": { + "message": "ΜετατÏοπή Îομίσματος" + }, + "currentLanguage": { + "message": "ΤÏέχουσα Γλώσσα" + }, + "customGas": { + "message": "ΠÏοσαÏμογή Gas" + }, + "customGasSubTitle": { + "message": "Η αÏξηση των τελών μποÏεί να μειώσει τους χÏόνους επεξεÏγασίας, αλλά αυτό δεν είναι εγγυημένο." + }, + "customToken": { + "message": "ΠÏοσαÏμοσμένο Token" + }, + "customRPC": { + "message": "ΠÏοσαÏμοσμένο RPC" + }, + "decimalsMustZerotoTen": { + "message": "Τα δεκαδικά Ï€Ïέπει να είναι τουλάχιστον 0 και όχι πάνω από 36." + }, + "decimal": { + "message": "Δεκαδικά Ψηφία ΑκÏιβείας" + }, + "defaultNetwork": { + "message": "Το Ï€Ïοεπιλεγμένο δίκτυο για συναλλαγές Ether είναι το Main Net." + }, + "delete": { + "message": "ΔιαγÏαφή" + }, + "deleteAccount": { + "message": "ΔιαγÏαφή ΛογαÏιασμοÏ" + }, + "deposit": { + "message": "Κατάθεση" + }, + "depositEther": { + "message": "Κατάθεση Ether" + }, + "details": { + "message": "ΛεπτομέÏειες" + }, + "directDepositEther": { + "message": "Απευθείας Κατάθεση Ether" + }, + "directDepositEtherExplainer": { + "message": "Αν έχετε ήδη κάποια Ether, ο πιο γÏήγοÏος Ï„Ïόπος για να πάÏετε τα Ether στο νέο σας ποÏτοφόλι με άμεση κατάθεση." + }, + "done": { + "message": "Τέλος" + }, + "downloadGoogleChrome": { + "message": "Κατεβάστε το Google Chrome" + }, + "downloadSecretBackup": { + "message": "Κατεβάστε αυτήν τη Μυστική ΦÏάση ΑντιγÏάφου Ασφαλείας και κÏατήστε την αποθηκευμένη με ασφάλεια σε έναν εξωτεÏικό κÏυπτογÏαφημένο σκληÏÏŒ δίσκο ή μέσο αποθήκευσης." + }, + "downloadStateLogs": { + "message": "Λήψη ΑÏχείων ΚαταγÏαφής Κατάστασης" + }, + "dontHaveAHardwareWallet": { + "message": "Δεν έχετε ποÏτοφόλι υλικοÏ;" + }, + "dropped": { + "message": "ΑποÏÏίφθηκε" + }, + "edit": { + "message": "ΕπεξεÏγασία" + }, + "editContact": { + "message": "ΕπεξεÏγασία Επαφής" + }, + "endOfFlowMessage1": { + "message": "ΠεÏάσατε τη δοκιμή - κÏατήστε τη φÏάση φÏÏ„Ïου σας ασφαλή, είναι δική σας ευθÏνη!" + }, + "endOfFlowMessage2": { + "message": "Συμβουλές για την ασφαλή αποθήκευσή του" + }, + "endOfFlowMessage3": { + "message": "ΑποθηκεÏστε ένα αντίγÏαφο ασφαλείας σε πολλαπλές τοποθεσίες." + }, + "endOfFlowMessage4": { + "message": "Μην μοιÏάζεστε ποτέ τη φÏάση με κανέναν." + }, + "endOfFlowMessage5": { + "message": "ΠÏοσέξτε το ηλεκτÏονικό \"ψάÏεμα\"! Το MetaMask δεν θα ζητήσει ποτέ αυθόÏμητα τη φÏάση φÏÏ„Ïου σας." + }, + "endOfFlowMessage6": { + "message": "Αν χÏειάζεται να δημιουÏγήσετε ξανά αντίγÏαφο της φÏάσης επαναφοÏάς σας, μποÏείτε να την βÏείτε στη Ρυθμίσεις -> Ασφάλεια." + }, + "endOfFlowMessage7": { + "message": "Εάν έχετε οποιαδήποτε εÏώτηση ή αντιληφθείτε κάτι Ïποπτο στείλτε μας email στο support@metamask.io." + }, + "endOfFlowMessage8": { + "message": "Το MetaMask δεν μποÏεί να ανακτήσει τη φÏάση φÏÏ„Ïου σας. Μάθετε πεÏισσότεÏα." + }, + "endOfFlowMessage9": { + "message": "Μάθετε πεÏισσότεÏα." + }, + "endOfFlowMessage10": { + "message": "Όλα Έτοιμα" + }, + "ensRegistrationError": { + "message": "Σφάλμα στην καταχώÏιση ονόματος ENS" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "Το όνομα ENS δεν βÏέθηκε στο Ï„Ïέχον δίκτυο. Δοκιμάστε να μεταβείτε στο ΚÏÏιο Δίκτυο Ethereum." + }, + "enterAnAlias": { + "message": "Δώστε ένα ψευδώνυμο" + }, + "enterPassword": { + "message": "Εισάγετε τον κωδικό Ï€Ïόσβασης" + }, + "enterPasswordContinue": { + "message": "ΠληκτÏολογήστε τον κωδικό Ï€Ïόσβασης για να συνεχίσετε" + }, + "ethereumPublicAddress": { + "message": "Δημόσια ΔιεÏθυνση Ethereum" + }, + "etherscanView": { + "message": "ΠÏοβολή λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï ÏƒÏ„Î¿ Etherscan" + }, + "estimatedProcessingTimes": { + "message": "Εκτιμώμενοι ΧÏόνοι ΕπεξεÏγασίας" + }, + "expandView": { + "message": "Ανάπτυξη ΠÏοβολής" + }, + "exportPrivateKey": { + "message": "Εξαγωγή Î™Î´Î¹Ï‰Ï„Î¹ÎºÎ¿Ï ÎšÎ»ÎµÎ¹Î´Î¹Î¿Ï" + }, + "failed": { + "message": "Απέτυχε" + }, + "fast": { + "message": "ΓÏήγοÏα" + }, + "faster": { + "message": "Πιο γÏήγοÏα" + }, + "fiat": { + "message": "Εντολή", + "description": "Exchange type" + }, + "fileImportFail": { + "message": "Η εισαγωγή αÏχείων δεν λειτουÏγεί; Κάντε κλικ εδώ!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "ΔιαγÏαφή αυτής της συσκευής" + }, + "from": { + "message": "Από " + }, + "functionType": { + "message": "ΤÏπος ΛειτουÏγίας" + }, + "gasLimit": { + "message": "ÎŒÏιο Καυσίμου" + }, + "gasLimitInfoModalContent": { + "message": "Το ÏŒÏιο αεÏίου είναι το μέγιστο ποσό μονάδων αεÏίου τι οποίες είστε διατεθειμένοι να δαπανήσετε." + }, + "gasLimitTooLow": { + "message": "Το ÏŒÏιο αεÏίου Ï€Ïέπει να είναι τουλάχιστον 21000" + }, + "gasUsed": { + "message": "ΚαÏσιμο που ΧÏησιμοποιήθηκε" + }, + "gasPrice": { + "message": "Τιμή ΑεÏίου (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "Τιμή Καυσίμου ΕξαιÏετικά Χαμηλή" + }, + "gasPriceInfoModalContent": { + "message": "Η τιμή καυσίμου καθοÏίζει το ποσό των Ether που είστε διατεθειμένοι να πληÏώσετε για κάθε μονάδα καυσίμου." + }, + "gasPriceNoDenom": { + "message": "Τιμή Gas" + }, + "general": { + "message": "Γενικά" + }, + "generalSettingsDescription": { + "message": "ΜετατÏοπή νομίσματος, Ï€Ïωτογενές νόμισμα, γλώσσα, αναπαÏάσταση μπλοκ" + }, + "getEther": { + "message": "Λάβετε Ether" + }, + "getEtherFromFaucet": { + "message": "ΠάÏτε Ether από μια πηγή για το $1", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "ΠάÏτε Βοήθεια." + }, + "getStarted": { + "message": "ΈναÏξη" + }, + "happyToSeeYou": { + "message": "ΧαιÏόμαστε που σας βλέπουμε." + }, + "hardware": { + "message": "υλικό" + }, + "hardwareWalletConnected": { + "message": "Συνδέθηκε το ποÏτοφόλι υλικοÏ" + }, + "hardwareWallets": { + "message": "Συνδέστε ένα ποÏτοφόλι εξοπλισμοÏ" + }, + "hardwareWalletsMsg": { + "message": "Επιλέξτε ένα ποÏτοφόλι ÎµÎ¾Î¿Ï€Î»Î¹ÏƒÎ¼Î¿Ï Ï„Î¿ οποίο θέλετε να χÏησιμοποιήσετε με το MetaMask" + }, + "havingTroubleConnecting": { + "message": "ΔυσκολεÏεστε να συνδεθείτε;" + }, + "here": { + "message": "εδώ", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hexData": { + "message": "Δεκαεξαδικά Δεδομένα" + }, + "hide": { + "message": "ΑπόκÏυψη" + }, + "hideTokenPrompt": { + "message": "ΑπόκÏυψη του Token;" + }, + "history": { + "message": "ΙστοÏικό" + }, + "import": { + "message": "Εισαγωγή", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "Εισαγωγή ΛογαÏιασμοÏ" + }, + "importAccountMsg": { + "message": "Οι λογαÏιασμοί που εισάγονται δεν θα συσχετιστοÏν με τη φάση σπόÏου του λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï ÏƒÎ±Ï‚ MetaTask που δημιουÏγήθηκε αÏχικά. Μάθετε πεÏισσότεÏα για τους εισηγμένους λογαÏιασμοÏÏ‚" + }, + "importAccountSeedPhrase": { + "message": "Εισαγωγή λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï Î¼Îµ ΦÏάση ΦÏÏ„Ïου" + }, + "importWallet": { + "message": "Εισαγωγή ΠοÏτοφολιοÏ" + }, + "importYourExisting": { + "message": "Εισαγάγετε το υπάÏχον ποÏτοφόλι σας χÏησιμοποιώντας μια φÏάση φÏÏ„Ïου 12 λέξεων" + }, + "imported": { + "message": "Έγινε εισαγωγή", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "Εισαγωγή με χÏήση φάσης σπόÏου λογαÏιασμοÏ" + }, + "infoHelp": { + "message": "ΠληÏοφοÏίες & Βοήθεια" + }, + "initialTransactionConfirmed": { + "message": "Η αÏχική σας συναλλαγή επιβεβαιώθηκε από το δίκτυο. Πατήστε ΕÎΤΑΞΕΙ για επιστÏοφή." + }, + "insufficientBalance": { + "message": "ΑνεπαÏκές υπόλοιπο." + }, + "insufficientFunds": { + "message": "ΑνεπαÏκείς πόÏοι." + }, + "insufficientTokens": { + "message": "ΑνεπαÏκή tokens." + }, + "invalidAddress": { + "message": "Μη έγκυÏη διεÏθυνση" + }, + "invalidAddressRecipient": { + "message": "Η διεÏθυνση παÏαλήπτη δεν είναι έγκυÏη" + }, + "knownAddressRecipient": { + "message": "Γνωστή διεÏθυνση συμβολαίου." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "Δίκτυο μη ETH, Ïυθμίστε σε μικÏοÏÏ‚ χαÏακτήÏες" + }, + "invalidInput": { + "message": "Μη έγκυÏη είσοδος." + }, + "invalidRPC": { + "message": "Μη έγκυÏο RPC URL" + }, + "invalidBlockExplorerURL": { + "message": "Μη έγκυÏο Block Explorer URL" + }, + "invalidSeedPhrase": { + "message": "Μη έγκυÏη φÏάση φÏÏ„Ïου" + }, + "jsonFile": { + "message": "ΑÏχείο JSON", + "description": "format for importing an account" + }, + "kovan": { + "message": "Δίκτυο Δοκιμής Kovan" + }, + "max": { + "message": "Μέγ." + }, + "learnMore": { + "message": "Μάθε πεÏισσότεÏα" + }, + "ledgerAccountRestriction": { + "message": "ΠÏέπει να χÏησιμοποιήσετε τον τελευταίο σας λογαÏιασμό Ï€Ïιν Ï€Ïοσθέσετε έναν νέο." + }, + "letsGoSetUp": { + "message": "Îαι, ας το εγκαταστήσουμε!" + }, + "likeToAddTokens": { + "message": "Θέλετε να Ï€Ïοσθέσετε αυτά τα token;" + }, + "links": { + "message": "ΣÏνδεσμοι" + }, + "liveGasPricePredictions": { + "message": "Ζωντανές ΠÏοβλέψεις Τιμής Καυσίμου" + }, + "loading": { + "message": "ΦόÏτωση..." + }, + "loadingTokens": { + "message": "ΦόÏτωση Tokens..." + }, + "loadMore": { + "message": "ΦόÏτωση ΠεÏισσότεÏων" + }, + "localhost": { + "message": "Τοπικός Υπολογιστής 8545" + }, + "lock": { + "message": "ΑποσÏνδεση" + }, + "mainnet": { + "message": "ΚÏÏιο Δίκτυο Ethereum" + }, + "memorizePhrase": { + "message": "ΑπομνημονεÏστε αυτή τη φÏάση." + }, + "memo": { + "message": "σημείωμα" + }, + "message": { + "message": "Μήνυμα" + }, + "metamaskDescription": { + "message": "ΣÏνδεση με το Ethereum και τον ΑποκεντÏωμένο Ιστό." + }, + "metamaskVersion": { + "message": "Έκδοση MetaMask " + }, + "mobileSyncText": { + "message": "ΠαÏακαλοÏμε δώστε τον κωδικό Ï€Ïόσβασής σας για να επιβεβαιώσετε ότι είστε εσείς!" + }, + "myAccounts": { + "message": "Οι ΛογαÏιασμοί μου" + }, + "myWalletAccounts": { + "message": "ΛογαÏιασμοί ΠοÏτοφολιοÏ" + }, + "myWalletAccountsDescription": { + "message": "Όλοι οι λογαÏιασμοί σας που έχετε δημιουÏγήσει στο MetaMask θα Ï€ÏοστεθοÏν αυτόματα σε αυτήν την ενότητα." + }, + "mustSelectOne": { + "message": "ΠÏέπει να επιλέξετε 1 τουλάχιστον διακÏιτικό." + }, + "needEtherInWallet": { + "message": "Για να αλληλεπιδÏάσετε με αποκεντÏωμένες εφαÏμογές χÏησιμοποιώντας το MetaMask, θα χÏειαστείτε Ether στο ποÏτοφόλι σας." + }, + "needImportFile": { + "message": "ΠÏέπει να επιλέξετε ένα αÏχείο για εισαγωγή.", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "Δεν μποÏεί να γίνει αποστολή αÏνητικών ποσών ETH." + }, + "networkName": { + "message": "Ονομασία ΔικτÏου" + }, + "networks": { + "message": "Δίκτυα" + }, + "networkSettingsDescription": { + "message": "ΠÏοσθήκη και επεξεÏγασία Ï€ÏοσαÏμοσμένων δικτÏων RPC" + }, + "nevermind": { + "message": "Δεν πειÏάζει" + }, + "newAccount": { + "message": "Îέος ΛογαÏιασμός" + }, + "newAccountDetectedDialogMessage": { + "message": "Εντοπίστηκε νέα διεÏθυνση! Κάντε κλικ εδώ για να την Ï€Ïοσθέσετε στο βιβλίο διευθÏνσεών σας." + }, + "newAccountNumberName": { + "message": "ΛογαÏιασμός $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "Îέα Επαφή" + }, + "newContract": { + "message": "Îέα ΣÏμβαση" + }, + "newPassword": { + "message": "Îέος Κωδικός ΠÏόσβασης (ελάχιστο 8 χαÏακτήÏες)" + }, + "newNetwork": { + "message": "Îέο Δίκτυο" + }, + "newToMetaMask": { + "message": "ΚαινοÏÏιος στο MetaMask;" + }, + "noAlreadyHaveSeed": { + "message": "Όχι, έχω ήδη μια φÏάση φÏÏ„Ïου" + }, + "protectYourKeys": { + "message": "ΠÏοστατεÏστε τα Κλειδιά Σας!" + }, + "protectYourKeysMessage1": { + "message": "Îα Ï€Ïοσέχετε με τη φάση σπόÏου. ΥπάÏχουν αναφοÏές για ιστότοπους που Ï€ÏοσπαθοÏν να Ï€ÏοσποιηθοÏν ότι είναι το MetaTask. Το MetaTask δεν θα σας Ïωτήσει ποτέ για τη φάση σπόÏου!" + }, + "protectYourKeysMessage2": { + "message": "ΚÏατήστε τη φÏάση σας ασφαλή. Αν δείτε κάτι Ïποπτο ή δεν είστε βέβαιοι για έναν ιστότοπο, στείλτε ένα email στο support@metamask.io" + }, + "rpcUrl": { + "message": "Îέο RPC URL" + }, + "optionalChainId": { + "message": "Ταυτότητα Αλυσίδας (Ï€ÏοαιÏετικό)" + }, + "optionalSymbol": { + "message": "ΣÏμβολο (Ï€ÏοαιÏετικό)" + }, + "newTotal": { + "message": "Îέο ΣÏνολο" + }, + "newTransactionFee": { + "message": "Τέλος Îέας Συναλλαγής" + }, + "next": { + "message": "Επόμενο" + }, + "noAddressForName": { + "message": "Δεν έχει οÏισθεί καμιά διεÏθυνση γ' αυτό το όνομα." + }, + "noConversionRateAvailable": { + "message": "Δεν ΥπάÏχει Διαθέσιμη Ισοτιμία ΜετατÏοπής" + }, + "noTransactions": { + "message": "Δεν έχετε καμιά συναλλαγή" + }, + "notEnoughGas": { + "message": "Δεν ΥπάÏχει ΑÏκετό ΑέÏιο" + }, + "noWebcamFoundTitle": { + "message": "Η διαδικτυακή κάμεÏα δεν βÏέθηκε" + }, + "noWebcamFound": { + "message": "Η κάμεÏα του υπολογιστή σας δεν βÏέθηκε. ΠαÏακαλοÏμε Ï€Ïοσπαθήστε ξανά." + }, + "ofTextNofM": { + "message": "από" + }, + "orderOneHere": { + "message": "ΠαÏαγγείλετε ένα Trezor ή Ledger και κÏατήστε τα χÏήματά σας σε παγωμένη αποθήκευση" + }, + "origin": { + "message": "ΠÏοέλευση" + }, + "parameters": { + "message": "ΠαÏάμετÏοι" + }, + "participateInMetaMetrics": { + "message": "Συμμετάσχετε στο MetaMetrics" + }, + "participateInMetaMetricsDescription": { + "message": "Συμμετέχετε στο MetaMetrics για να μας βοηθήσετε να βελτιώσουμε το MetaMask" + }, + "password": { + "message": "Κωδικός Ï€Ïόσβασης" + }, + "passwordsDontMatch": { + "message": "Οι κωδικοί Ï€Ïόσβασης δεν ταιÏιάζουν" + }, + "passwordNotLongEnough": { + "message": "Ο Κωδικός ΠÏόσβασης δεν είναι αÏκετά μεγάλος" + }, + "pastePrivateKey": { + "message": "Επικολλήστε τη συμβολοσειÏά Î¹Î´Î¹Ï‰Ï„Î¹ÎºÎ¿Ï ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï ÎµÎ´ÏŽ:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "σε εκκÏεμότητα" + }, + "personalAddressDetected": { + "message": "Η Ï€Ïοσωπική διεÏθυνση εντοπίστηκε. ΚαταχωÏίστε τη διεÏθυνση συμβολαίου διακÏιτικοÏ." + }, + "prev": { + "message": "ΠÏοηγοÏμενο" + }, + "primaryCurrencySetting": { + "message": "ΚÏÏιο Îόμισμα" + }, + "primaryCurrencySettingDescription": { + "message": "Επιλέξτε ενδογενές για να δώσετε Ï€ÏοτεÏαιότητα στην Ï€Ïοβολή τιμών στο φυσικό νόμισμα της αλυσίδας (Ï€.χ. ETH). Επιλέξτε ΠαÏαστατικό για να δώσετε Ï€ÏοτεÏαιότητα στην Ï€Ïοβολή τιμών στο επιλεγμένο παÏαστατικό νόμισμα." + }, + "privacyMsg": { + "message": "Πολιτική ΑποÏÏήτου" + }, + "privateKey": { + "message": "Ιδιωτικό Κλειδί", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "ΠÏοειδοποίηση: Μην αποκαλÏπτετε ποτέ αυτό το κλειδί. Οποιοσδήποτε έχει τα ιδιωτικά κλειδιά σας μποÏεί να κλέψει όλα τα πεÏιουσιακά στοιχεία του λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï ÏƒÎ±Ï‚." + }, + "privateNetwork": { + "message": "Ιδιωτικό Δίκτυο" + }, + "queue": { + "message": "ΟυÏά" + }, + "readdToken": { + "message": "ΜποÏείτε να Ï€Ïοσθέσετε ξανά αυτό το διακÏιτικό στο μέλλον μεταβαίνοντας στο \"ΠÏόσθεση διακÏιτικοÏ\" στο Î¼ÎµÎ½Î¿Ï ÎµÏ€Î¹Î»Î¿Î³ÏŽÎ½ των λογαÏιασμών σας." + }, + "recents": { + "message": "ΠÏόσφατα" + }, + "recipientAddress": { + "message": "ΔιεÏθυνση ΠαÏαλήπτη" + }, + "recipientAddressPlaceholder": { + "message": "Αναζήτηση, δημόσια διεÏθυνση (0x) ή ENS" + }, + "rejectAll": { + "message": "ΑπόÏÏιψη Όλων" + }, + "rejectTxsN": { + "message": "ΑποÏÏίψτε τις συναλλαγές του $1" + }, + "rejectTxsDescription": { + "message": "ΠÏόκειται να αποÏÏίψετε μαζικά $1 συναλλαγές." + }, + "rejected": { + "message": "ΑποÏÏίφθηκε" + }, + "reset": { + "message": "ΕπαναφοÏά" + }, + "resetAccount": { + "message": "ΕπαναφοÏά ΛογαÏιασμοÏ" + }, + "resetAccountDescription": { + "message": "Με την επαναφοÏά του λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï ÏƒÎ±Ï‚ εκκαθαÏίζεται το ιστοÏικό των συναλλαγών σας." + }, + "deleteNetwork": { + "message": "ΔιαγÏαφή ΔικτÏου;" + }, + "deleteNetworkDescription": { + "message": "Θέλετε σίγουÏα να διαγÏάψετε αυτό το δίκτυο;" + }, + "remindMeLater": { + "message": "Θυμίστε μου αÏγότεÏα" + }, + "restoreFromSeed": { + "message": "ΕπαναφοÏά λογαÏιασμοÏ;" + }, + "restoreAccountWithSeed": { + "message": "ΕπαναφέÏετε τον ΛογαÏιασμό σας με ΦÏάση ΕπαναφοÏάς" + }, + "requestsAwaitingAcknowledgement": { + "message": "αιτήματα τα οποία αναμένουν να αναγνωÏιστοÏν" + }, + "required": { + "message": "Απαιτείται" + }, + "restore": { + "message": "ΕπαναφοÏά" + }, + "revealSeedWords": { + "message": "Αποκάλυψη Λέξεων ΦÏÏ„Ïου" + }, + "revealSeedWordsTitle": { + "message": "ΦÏάση ΕπαναφοÏάς " + }, + "revealSeedWordsDescription": { + "message": "Εάν αλλάξετε ποτέ Ï€ÏογÏάμματα πεÏιήγησης ή μετακινήσετε υπολογιστές, θα χÏειαστείτε αυτήν τη φÏάση φÏÏ„Ïου για να αποκτήσετε Ï€Ïόσβαση στους λογαÏιασμοÏÏ‚ σας. ΑποθηκεÏστε την κάπου με ασφάλεια και μυστικότητα." + }, + "revealSeedWordsWarningTitle": { + "message": "ΜΗΠΜΟΙΡΑΣΤΕΙΤΕ αυτήν τη φÏάση με κανέναν!" + }, + "revealSeedWordsWarning": { + "message": "Αυτές οι λέξεις μποÏοÏν να χÏησιμοποιηθοÏν για να κλαποÏν όλοι οι λογαÏιασμοί σας." + }, + "remove": { + "message": "ΚατάÏγηση" + }, + "removeAccount": { + "message": "ΚατάÏγηση λογαÏιασμοÏ" + }, + "removeAccountDescription": { + "message": "Αυτός ο λογαÏιασμός θα καταÏγηθεί από το ποÏτοφόλι σας. ΠαÏακαλοÏμε βεβαιωθείτε ότι έχετε την αÏχική φÏάση επαναφοÏάς ή ιδιωτικό κλειδί για αυτόν τον εισαγόμενο λογαÏιασμό Ï€Ïιν συνεχίσετε. ΜποÏείτε να εισαγάγετε ή να δημιουÏγήσετε ξανά λογαÏιασμοÏÏ‚ από το αναπτυσσόμενο Î¼ÎµÎ½Î¿Ï Ï„Î¿Ï… λογαÏιασμοÏ." + }, + "readyToConnect": { + "message": "Έτοιμοι να Συνδεθείτε;" + }, + "rinkeby": { + "message": "Δοκιμαστικό Δίκτυο Rinkeby" + }, + "ropsten": { + "message": "Δίκτυο Δοκιμών Ropsten" + }, + "goerli": { + "message": "Δοκιμαστικό Δίκτυο Goerli" + }, + "save": { + "message": "Αποθήκευση" + }, + "slow": { + "message": "ΑÏγά" + }, + "slower": { + "message": "Πιο αÏγά" + }, + "saveAsCsvFile": { + "message": "ΑποθηκεÏστε ως ΑÏχείο CSV" + }, + "scanInstructions": { + "message": "Τοποθετήστε τον κώδικα QR μπÏοστά από την κάμεÏά σας" + }, + "scanQrCode": { + "message": "ΣάÏωση ÎšÏ‰Î´Î¹ÎºÎ¿Ï QR" + }, + "search": { + "message": "Αναζήτηση" + }, + "searchResults": { + "message": "Αποτελέσματα Αναζήτησης" + }, + "secretBackupPhrase": { + "message": "Μυστική ΦÏάση ΑντιγÏάφου Ασφαλείας" + }, + "secretBackupPhraseDescription": { + "message": "Η μυστική φÏάση δημιουÏγίας αντιγÏάφων ασφαλείας σας διευκολÏνει να δημιουÏγήσετε αντίγÏαφα ασφαλείας και να επαναφέÏετε τον λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï ÏƒÎ±Ï‚." + }, + "secretBackupPhraseWarning": { + "message": "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Ποτέ μην αποκαλÏπτετε την εφεδÏική φÏάση. Όποιος έχει αυτή τη φÏάση μποÏεί να πάÏει τα Ether σας για πάντα." + }, + "secretPhrase": { + "message": "Εισαγάγετε εδώ τη μυστική φÏάση δώδεκα λέξεων για να επαναφέÏετε το χÏηματοκιβώτιό σας." + }, + "securityAndPrivacy": { + "message": "Ασφάλεια και ΑπόÏÏητο" + }, + "securitySettingsDescription": { + "message": "Φάση Ïυθμίσεων αποÏÏήτου και σπόÏου ποÏτοφολιοÏ" + }, + "seedPhrasePlaceholder": { + "message": "ΔιαχωÏίστε κάθε λέξη μ' ένα κενό" + }, + "seedPhraseReq": { + "message": "Οι φÏάσεις φÏÏ„Ïου έχουν μήκος 12 λέξεων" + }, + "selectCurrency": { + "message": "Επιλέξτε Îόμισμα" + }, + "selectEachPhrase": { + "message": "ΠαÏακαλοÏμε επιλέξτε κάθε φÏάση, για να βεβαιωθείτε ότι είναι σωστή." + }, + "selectLocale": { + "message": "Επιλέξτε Τοπικές Ρυθμίσεις" + }, + "selectType": { + "message": "Επιλέξτε ΤÏπο" + }, + "send": { + "message": "Αποστολή" + }, + "sendAmount": { + "message": "Αποστολή ΠοσοÏ" + }, + "sendETH": { + "message": "Στείλτε ETH" + }, + "sendTokens": { + "message": "Στείλτε Tokens" + }, + "sentEther": { + "message": "απεσταλμένα ether" + }, + "sentTokens": { + "message": "αποστολή token" + }, + "separateEachWord": { + "message": "ΔιαχωÏίστε κάθε λέξη με ένα μόνο κενό" + }, + "searchTokens": { + "message": "Αναζήτηση Tokens" + }, + "selectAnAccount": { + "message": "Επιλέξτε ΛογαÏιασμό" + }, + "selectAnAccountHelp": { + "message": "Επιλέξτε τον λογαÏιασμό για Ï€Ïοβολή στο MetaMask" + }, + "selectAHigherGasFee": { + "message": "Επιλέξτε ένα μεγαλÏτεÏο τέλος gas για να επιταχÏνετε την επεξεÏγασία της συναλλαγής σας.*" + }, + "selectHdPath": { + "message": "Επιλέξτε ΔιαδÏομή HD" + }, + "selectPathHelp": { + "message": "Εάν δεν βλέπετε τους υπάÏχοντες λογαÏιασμοÏÏ‚ σας ÎšÎ±Î¸Î¿Î»Î¹ÎºÎ¿Ï Ï€Î±Ïακάτω, Ï€Ïοσπαθήστε να αλλάξετε τις διαδÏομές σε \"Legacy (MEW / MyCrypto)\"" + }, + "settings": { + "message": "Ρυθμίσεις" + }, + "showAdvancedGasInline": { + "message": "ΠÏοωθημένος έλεγχος gas" + }, + "showAdvancedGasInlineDescription": { + "message": "Επιλέξτε αυτό για να εμφανίσετε τις τιμές αεÏίου και να πεÏιοÏίσετε τα στοιχεία ελέγχου απευθείας στις οθόνες αποστολής και επιβεβαίωσης." + }, + "showFiatConversionInTestnets": { + "message": "Εμφάνιση ΜετατÏοπής σε Δοκιμαστικά Δίκτυα" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Επιλέξτε αυτό για εμφάνιση της μετατÏοπής παÏÎ±ÏƒÏ„Î±Ï„Î¹ÎºÎ¿Ï Ï‡Ïήματος στο Testnets" + }, + "showPrivateKeys": { + "message": "Εμφάνιση Ιδιωτικών Κλειδιών" + }, + "showHexData": { + "message": "Εμφάνιση Δεκαεξαδικών Δεδομένων" + }, + "showHexDataDescription": { + "message": "Επιλέξτε αυτό για να εμφανίσετε το πεδίο hex δεδομένων στην οθόνη αποστολής" + }, + "sign": { + "message": "ΥπογÏαφή" + }, + "signatureRequest": { + "message": "Αίτημα ΥπογÏαφής" + }, + "signed": { + "message": "Συνδεδεμένος" + }, + "signNotice": { + "message": "Η υπογÏαφή Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… μηνÏματος μποÏεί να έχει\nεπικίνδυνες παÏενέÏγειες. ΥπογÏάφετε μηνÏματα μόνο από\nτοποθεσίες που εμπιστεÏεστε πλήÏως με ολόκληÏο τον λογαÏιασμό σας.\n  Αυτή η επικίνδυνη μέθοδος θα καταÏγηθεί σε μια μελλοντική έκδοση." + }, + "sigRequest": { + "message": "Αίτημα ΥπογÏαφής" + }, + "somethingWentWrong": { + "message": "Ουπς! Κάτι πήγε στÏαβά." + }, + "speedUp": { + "message": "Επιτάχυνση" + }, + "speedUpCancellation": { + "message": "Επιτάχυνση αυτής της ακÏÏωσης" + }, + "speedUpTransaction": { + "message": "Επιτάχυνση αυτής της συναλλαγής" + }, + "switchNetworks": { + "message": "Αλλαγή ΔικτÏων" + }, + "stateLogs": { + "message": "ΑÏχεία ΚαταγÏαφής Κατάστασης" + }, + "stateLogsDescription": { + "message": "Τα αÏχεία καταγÏαφής κατάστασης πεÏιέχουν τις διευθÏνσεις του δημόσιου λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï ÏƒÎ±Ï‚ και τις συναλλαγές οι οποίες έχουν αποσταλεί." + }, + "stateLogError": { + "message": "Σφάλμα κατά την ανάκτηση αÏχείων καταγÏαφής κατάστασης." + }, + "step1HardwareWallet": { + "message": "1. Συνδέστε το ΠοÏτοφόλι ΕξοπλισμοÏ" + }, + "step1HardwareWalletMsg": { + "message": "Συνδέστε το ποÏτοφόλι Ï…Î»Î¹ÎºÎ¿Ï Î±Ï€ÎµÏ…Î¸ÎµÎ¯Î±Ï‚ στον υπολογιστή σας." + }, + "step2HardwareWallet": { + "message": "2. Επιλέξτε ένα ΛογαÏιασμό" + }, + "step2HardwareWalletMsg": { + "message": "Επιλέξτε τον λογαÏιασμό που θέλετε να δείτε. ΜποÏείτε να επιλέξετε έναν μόνο κάθε φοÏά." + }, + "step3HardwareWallet": { + "message": "3. Ξεκινήστε να χÏησιμοποιείτε το dApps και άλλα!" + }, + "step3HardwareWalletMsg": { + "message": "ΧÏησιμοποιήστε τον λογαÏιασμό ÎµÎ¾Î¿Ï€Î»Î¹ÏƒÎ¼Î¿Ï ÏƒÎ±Ï‚ όπως θα κάνατε με οποιονδήποτε λογαÏιασμό του Ethereum. Συνδεθείτε στο dApps, στείλτε το Eth, αγοÏάστε και αποθηκεÏστε ERC20 tokens και Non-Fungible tokens όπως το CryptoKitties." + }, + "storePhrase": { + "message": "ΑποθηκεÏστε αυτήν τη φÏάση σε έναν διαχειÏιστή κωδικών Ï€Ïόσβασης όπως το 1Password." + }, + "submitted": { + "message": "Υποβλήθηκε" + }, + "supportCenter": { + "message": "Επισκεφθείτε το ΚέντÏο ΥποστήÏιξής μας" + }, + "symbol": { + "message": "ΣÏμβολο" + }, + "symbolBetweenZeroTwelve": { + "message": "Το σÏμβολο Ï€Ïέπει να είναι τουλάχιστον 11 χαÏακτήÏες." + }, + "syncWithMobile": { + "message": "ΣυγχÏονισμός με κινητό" + }, + "syncWithMobileTitle": { + "message": "ΣυγχÏονισμός με κινητό" + }, + "syncWithMobileDesc": { + "message": "ΜποÏείτε να συγχÏονίσετε τους λογαÏιασμοÏÏ‚ και τις πληÏοφοÏίες σας με την κινητή συσκευή σας. Ανοίξτε την εφαÏμογή MetaMask για κινητά, μεταβείτε στην ενότητα \"Ρυθμίσεις\" και πατήστε \"ΣυγχÏονισμός από Επέκταση ΠÏογÏάμματος ΠεÏιήγησης\"" + }, + "syncWithMobileDescNewUsers": { + "message": "Εάν απλά ανοίξετε την εφαÏμογή MetaMask Mobile για Ï€Ïώτη φοÏά, απλώς ακολουθήστε τα βήματα στο τηλέφωνό σας." + }, + "syncWithMobileScanThisCode": { + "message": "ΣαÏώστε αυτόν τον κώδικα με την εφαÏμογή MetaMask για κινητά" + }, + "syncWithMobileBeCareful": { + "message": "ΣιγουÏευτείτε ότι κανένας δεν κοιτάζει στην οθόνη σας όταν κάνετε σάÏωση Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… κωδικοÏ" + }, + "syncWithMobileComplete": { + "message": "Τα δεδομένα σας έχουν συγχÏονιστεί με επιτυχία. ΑπολαÏστε την εφαÏμογή MetaMask για κινητά!" + }, + "terms": { + "message": "ÎŒÏοι ΧÏήσης" + }, + "testFaucet": { + "message": "Έλεγχος Βαλβίδας" + }, + "thisWillCreate": { + "message": "Αυτό θα δημιουÏγήσει ένα νέο ποÏτοφόλι και φÏάση φÏÏ„Ïου" + }, + "to": { + "message": "ΠÏος" + }, + "token": { + "message": "ΔιακÏιτικό" + }, + "tokenAlreadyAdded": { + "message": "Το διακÏιτικό έχει ήδη Ï€Ïοστεθεί." + }, + "tokenContractAddress": { + "message": "ΔιεÏθυνση Συμβολαίου Token" + }, + "tokenSymbol": { + "message": "ΣÏμβολο ΔιακÏιτικοÏ" + }, + "total": { + "message": "ΣÏνολο" + }, + "transaction": { + "message": "συναλλαγή" + }, + "transactionConfirmed": { + "message": "Η συναλλαγή επιβεβαιώθηκε στο $2." + }, + "transactionCreated": { + "message": "Η συναλλαγή δημιουÏγήθηκε με τιμή $1 στο $2." + }, + "transactionDropped": { + "message": "Η συναλλαγή υποχώÏησε στα $2." + }, + "transactionSubmitted": { + "message": "Η συναλλαγή στάλθηκε με τέλος gas του $1 σε $2." + }, + "transactionResubmitted": { + "message": "Η συναλλαγή υποβλήθηκε ξανά με το τέλος gas να έχει αυξηθεί για $1 σε $2" + }, + "transactionUpdated": { + "message": "Η συναλλαγή ενημεÏώθηκε σε $2." + }, + "transactionErrored": { + "message": "Η συναλλαγή αντιμετώπισε ένα σφάλμα." + }, + "transactionCancelAttempted": { + "message": "Έγινε Ï€Ïοσπάθεια ακÏÏωσης συναλλαγής με τέλος gas του $1 σε $2" + }, + "transactionCancelSuccess": { + "message": "Η συναλλαγή ακυÏώθηκε με επιτυχία στα $2" + }, + "transactionError": { + "message": "Σφάλμα συναλλαγής. Î’Ïέθηκε εξαίÏεση στον κωδικό της σÏμβασης." + }, + "transactionErrorNoContract": { + "message": "ΠÏοσπάθεια κλήσης λειτουÏγίας σε διεÏθυνση μη συμβολαίου." + }, + "transactionFee": { + "message": "ΧÏέωση Συναλλαγής" + }, + "transactionTime": { + "message": "ΧÏόνος Συναλλαγής" + }, + "transfer": { + "message": "ΜεταφοÏά" + }, + "transferBetweenAccounts": { + "message": "ΜεταφοÏά Î¼ÎµÏ„Î±Î¾Ï Î»Î¿Î³Î±Ïιασμών μου" + }, + "transferFrom": { + "message": "ΜεταφοÏά Από" + }, + "troubleTokenBalances": { + "message": "Είχαμε Ï€Ïόβλημα να φοÏτώσουμε τα υπόλοιπα του διακÏÎ¹Ï„Î¹ÎºÎ¿Ï ÏƒÎ±Ï‚. ΜποÏείτε να τα δείτε", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "Δοκιμάστε ξανά" + }, + "typePassword": { + "message": "ΠληκτÏολογήστε τον κωδικό Ï€Ïόσβασής σας MetaMask" + }, + "unapproved": { + "message": "Μη εγκεκÏιμένο" + }, + "units": { + "message": "μονάδες" + }, + "unknown": { + "message": "Άγνωστη" + }, + "unknownNetwork": { + "message": "Άγνωστο Ιδιωτικό Δίκτυο" + }, + "unknownQrCode": { + "message": "Σφάλμα: Δεν μποÏέσαμε να Ï€ÏοσδιοÏίσουμε αυτόν τον κώδικα QR" + }, + "unknownCameraErrorTitle": { + "message": "Ουπς! Κάτι πήγε στÏαβά..." + }, + "unknownCameraError": { + "message": "ΠαÏουσιάστηκε σφάλμα κατά την Ï€Ïοσπάθεια Ï€Ïόσβασης στην κάμεÏά σας. ΠαÏακαλοÏμε Ï€Ïοσπαθήστε πάλι..." + }, + "unlock": { + "message": "Ξεκλείδωμα" + }, + "unlockMessage": { + "message": "Ο αποκεντÏωμένος ιστός πεÏιμένει" + }, + "updatedWithDate": { + "message": "ΕνημεÏώθηκε το $1" + }, + "urlErrorMsg": { + "message": "Τα URI απαιτοÏν το κατάλληλο Ï€Ïόθεμα HTTP/HTTPS." + }, + "usedByClients": { + "message": "ΧÏησιμοποιείται από μια ποικιλία διαφοÏετικών πελατών" + }, + "userName": { + "message": "Όνομα χÏήστη" + }, + "viewAccount": { + "message": "ΠÏοβολή λογαÏιασμοÏ" + }, + "viewinExplorer": { + "message": "ΠÏοβολή στον ΕξεÏευνητή" + }, + "viewContact": { + "message": "Εμφάνιση Επαφής" + }, + "viewOnCustomBlockExplorer": { + "message": "ΠÏοβολή σε $1" + }, + "viewOnEtherscan": { + "message": "ΠÏοβολή στο Etherscan" + }, + "visitWebSite": { + "message": "Επισκεφθείτε τον ιστότοπό μας" + }, + "walletSeed": { + "message": "ΣπόÏος ΠοÏτοφολιοÏ" + }, + "welcomeBack": { + "message": "Καλώς Ήλθατε και Πάλι!" + }, + "welcome": { + "message": "Καλώς ήλθατε στο MetaMask" + }, + "writePhrase": { + "message": "ΓÏάψτε αυτήν τη φάση σε ένα κομμάτι χαÏτί και αποθηκεÏστε την σε μια ασφαλή τοποθεσία. Εάν θέλετε ακόμη πεÏισσότεÏη ασφάλεια, γÏάψτε την σε πεÏισσότεÏα κομμάτια χαÏτί και αποθηκεÏστε καθένα από αυτά σε 2-3 διαφοÏετικές τοποθεσίες." + }, + "yesLetsTry": { + "message": "Îαι, ας δοκιμάσουμε" + }, + "youNeedToAllowCameraAccess": { + "message": "ΠÏέπει να επιτÏέψετε Ï€Ïόσβαση στην κάμεÏα για να χÏησιμοποιήσετε αυτήν τη λειτουÏγία." + }, + "yourSigRequested": { + "message": "Ζητείται η υπογÏαφή σας" + }, + "youSign": { + "message": "ΥπογÏάφετε" + }, + "yourPrivateSeedPhrase": { + "message": "Η Ï€Ïοσωπική σας φÏάση φÏÏ„Ïου" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "Μηδενική τιμή καυσίμου κατά την επιτάχυνση" + } +} diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index cc087867aa04..797c8e709f52 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -1,64 +1,123 @@ { - "privacyMode": { - "message": "Privacy Mode" + "acceptTermsOfUse": { + "message": "I have read and agree to the $1", + "description": "$1 is the `terms` message" }, - "privacyModeDescription": { - "message": "Websites must request access to view your account information." + "eth_accounts": { + "message": "View the addresses of your permitted accounts (required)", + "description": "The description for the `eth_accounts` permission" }, - "exposeAccounts": { - "message": "Expose Accounts" + "connectedSites": { + "message": "Connected sites" }, - "exposeDescription": { - "message": "Expose accounts to the current website. Useful for legacy dapps." + "connectedSitesDescription": { + "message": "$1 is connected to these sites. They can view your account address.", + "description": "$1 is the account name" + }, + "connectedSitesEmptyDescription": { + "message": "$1 is not connected to any sites.", + "description": "$1 is the account name" + }, + "connectedAccountsDescriptionSingular": { + "message": "You have 1 account connected to this site." + }, + "connectedAccountsDescriptionPlural": { + "message": "You have $1 accounts connected to this site.", + "description": "$1 is the number of accounts" + }, + "connectedAccountsEmptyDescription": { + "message": "MetaMask is not connected this site. To connect to a web3 site, find the connect button on their site." + }, + "currentAccountNotConnected": { + "message": "Your current account is not connected" + }, + "switchToThisAccount": { + "message": "Switch to this account" + }, + "disconnectThisAccount": { + "message": "Disconnect this account" + }, + "permissions": { + "message": "Permissions" + }, + "showPermissions": { + "message": "Show permissions" + }, + "authorizedPermissions": { + "message": "You have authorized the following permissions" + }, + "connectManually": { + "message": "Manually connect to current site" + }, + "disconnect": { + "message": "Disconnect" + }, + "disconnectAllAccounts": { + "message": "Disconnect all accounts" + }, + "disconnectPrompt": { + "message": "Disconnect $1" + }, + "disconnectAllAccountsConfirmationDescription": { + "message": "Are you sure you want to disconnect? You may lose site functionality." + }, + "dismiss": { + "message": "Dismiss" + }, + "showIncomingTransactions": { + "message": "Show Incoming Transactions" + }, + "showIncomingTransactionsDescription": { + "message": "Select this to use Etherscan to show incoming transactions in the transactions list" }, "chartOnlyAvailableEth": { "message": "Chart only available on Ethereum networks." }, - "confirmExpose": { - "message": "Are you sure you want to expose your accounts to the current website?" + "connecting": { + "message": "Connecting..." }, - "confirmClear": { - "message": "Are you sure you want to clear approved websites?" + "connectWithMetaMask": { + "message": "Connect With MetaMask" }, - "contractInteraction": { - "message": "Contract Interaction" + "connectTo": { + "message": "Connect to $1", + "description": "$1 is the name/origin of a web3 site/application that the user can connect to metamask" }, - "clearApprovalDataSuccess": { - "message": "Approved website data cleared successfully." + "connectToAll": { + "message": "Connect to all your $1", + "description": "$1 will be replaced by the translation of connectToAllAccounts" }, - "approvalData": { - "message": "Privacy Data" + "connectToAllAccounts": { + "message": "accounts", + "description": "will replace $1 in connectToAll, completing the sentence 'connect to all of your accounts', will be text that shows list of accounts on hover" }, - "approvalDataDescription": { - "message": "Clear privacy data so all websites must request access to view account information again." + "connectToMultiple": { + "message": "Connect to $1", + "description": "$1 will be replaced by the translation of connectToMultipleNumberOfAccounts" }, - "clearApprovalData": { - "message": "Clear Privacy Data" + "connectToMultipleNumberOfAccounts": { + "message": "$1 accounts", + "description": "$1 is the number of accounts to which the web3 site/application is asking to connect; this will substitute $1 in connectToMultiple" + }, + "contractInteraction": { + "message": "Contract Interaction" }, "reject": { "message": "Reject" }, - "providerRequest": { - "message": "$1 would like to connect to your account" - }, - "providerRequestInfo": { - "message": "This site is requesting access to view your current account address. Always make sure you trust the sites you interact with." - }, "about": { "message": "About" }, "aboutSettingsDescription": { - "message": "Version, support center, and contact info." - }, - "aboutUs": { - "message": "About Us" - }, - "accept": { - "message": "Accept" + "message": "Version, support center, and contact info" }, "acceleratingATransaction": { "message": "* Accelerating a transaction by using a higher gas price increases its chances of getting processed by the network faster, but it is not always guaranteed." }, + "accessAndSpendNotice": { + "message": "$1 may access and spend up to this max amount", + "description": "$1 is the url of the site requesting ability to spend" + }, "accessingYourCamera": { "message": "Accessing your camera..." }, @@ -66,7 +125,7 @@ "message": "Account" }, "accountDetails": { - "message": "Account Details" + "message": "Account details" }, "accountName": { "message": "Account Name" @@ -77,26 +136,38 @@ "accountSelectionRequired": { "message": "You need to select an account!" }, + "active": { + "message": "Active" + }, + "activity": { + "message": "Activity" + }, "activityLog": { "message": "activity log" }, - "address": { - "message": "Address" - }, "addNetwork": { "message": "Add Network" }, + "addRecipient": { + "message": "Add Recipient" + }, "advanced": { "message": "Advanced" }, "advancedSettingsDescription": { - "message": "Access developer features, download State Logs, Reset Account, setup testnets and custom RPC." + "message": "Access developer features, download State Logs, Reset Account, setup testnets and custom RPC" }, "advancedOptions": { "message": "Advanced Options" }, - "addCustomToken": { - "message": "Add custom token" + "addToAddressBook": { + "message": "Add to address book" + }, + "addToAddressBookModalPlaceholder": { + "message": "e.g. John D." + }, + "addAlias": { + "message": "Add alias" }, "addToken": { "message": "Add Token" @@ -110,23 +181,37 @@ "addAcquiredTokens": { "message": "Add the tokens you've acquired using MetaMask" }, - "agreeTermsOfService": { - "message": "I agree to the Terms of Service" + "alerts": { + "message": "Alerts" }, - "allDone": { - "message": "All Done" + "alertsSettingsDescription": { + "message": "Enable or disable each alert" }, - "alreadyHaveSeedPhrase": { - "message": "No, I already have a seed phrase" + "alertSettingsUnconnectedAccount": { + "message": "Browsing a website with an unconnected account selected" + }, + "alertSettingsUnconnectedAccountDescription": { + "message": "This alert is shown in the popup when you are browsing a connected Web3 site, but the currently selected account is not connected." + }, + "allowOriginSpendToken": { + "message": "Allow $1 to spend your $2?", + "description": "$1 is the url of the site and $2 is the symbol of the token they are requesting to spend" + }, + "allowThisSiteTo": { + "message": "Allow this site to:" + }, + "allowExternalExtensionTo": { + "message": "Allow this external extension to:" + }, + "allowWithdrawAndSpend": { + "message": "Allow $1 to withdraw and spend up to the following amount:", + "description": "The url of the site that requested permission to 'withdraw and spend'" }, "amount": { "message": "Amount" }, - "amountPlusGas": { - "message": "Amount + Gas" - }, - "amountPlusTxFee": { - "message": "Amount + TX Fee" + "amountWithColon": { + "message": "Amount:" }, "appDescription": { "message": "An Ethereum Wallet in your Browser", @@ -137,7 +222,11 @@ "description": "The name of the application" }, "approve": { - "message": "Approve" + "message": "Approve spend limit" + }, + "approveSpendLimit": { + "message": "Approve $1 spend limit", + "description": "The token symbol that is being approved" }, "approved": { "message": "Approved" @@ -145,6 +234,9 @@ "asset": { "message": "Asset" }, + "assets": { + "message": "Assets" + }, "attemptingConnect": { "message": "Attempting to connect to blockchain." }, @@ -157,14 +249,11 @@ "attributions": { "message": "Attributions" }, - "autoLogoutTimeLimit": { - "message": "Auto-Logout Timer (minutes)" - }, - "autoLogoutTimeLimitDescription": { - "message": "Set the idle time in minutes before MetaMask will automatically log out" + "autoLockTimeLimit": { + "message": "Auto-Lock Timer (minutes)" }, - "available": { - "message": "Available" + "autoLockTimeLimitDescription": { + "message": "Set the idle time in minutes before MetaMask will become locked." }, "average": { "message": "Average" @@ -172,28 +261,27 @@ "back": { "message": "Back" }, + "backToAll": { + "message": "Back to All" + }, + "backupApprovalNotice": { + "message": "Backup your Secret Recovery code to keep your wallet and funds secure." + }, + "backupApprovalInfo": { + "message": "This secret code is required to recover your wallet in case you lose your device, forget your password, have to re-install MetaMask, or want to access your wallet on another device." + }, + "backupNow": { + "message": "Backup now" + }, "balance": { "message": "Balance" }, "balanceOutdated": { "message": "Balance may be outdated" }, - "balances": { - "message": "Token balance(s)" - }, - "balanceIsInsufficientGas": { - "message": "Insufficient balance for current gas total" - }, "basic": { "message": "Basic" }, - "beta": { - "message": "BETA" - }, - "betweenMinAndMax": { - "message": "must be greater than or equal to $1 and less than or equal to $2.", - "description": "helper for inputting hex as decimal input" - }, "blockExplorerUrl": { "message": "Block Explorer" }, @@ -204,8 +292,14 @@ "blockiesIdenticon": { "message": "Use Blockies Identicon" }, - "borrowDharma": { - "message": "Borrow With Dharma (Beta)" + "nonceField": { + "message": "Customize transaction nonce" + }, + "nonceFieldHeading": { + "message": "Custom Nonce" + }, + "nonceFieldDescription": { + "message": "Turn this on to change the nonce (transaction number) on confirmation screens. This is an advanced feature, use cautiously." }, "browserNotSupported": { "message": "Your Browser is not supported..." @@ -213,20 +307,11 @@ "builtInCalifornia": { "message": "MetaMask is designed and built in California." }, - "buy": { - "message": "Buy" - }, - "buyCoinbase": { - "message": "Buy on Coinbase" - }, - "buyCoinbaseExplainer": { - "message": "Coinbase is the world’s most popular way to buy and sell Bitcoin, Ethereum, and Litecoin." - }, "buyWithWyre": { "message": "Buy ETH with Wyre" }, "buyWithWyreDescription": { - "message": "Wyre lets you use a credit card to deposit ETH right in to your MetaMask account." + "message": "Wyre lets you use a debit card to deposit ETH right in to your MetaMask account." }, "buyCoinSwitch": { "message": "Buy on CoinSwitch" @@ -237,9 +322,15 @@ "bytes": { "message": "Bytes" }, + "off": { + "message": "Off" + }, "ok": { "message": "Ok" }, + "on": { + "message": "On" + }, "optionalBlockExplorerUrl": { "message": "Block Explorer URL (optional)" }, @@ -255,21 +346,9 @@ "cancelled": { "message": "Cancelled" }, - "cancelN": { - "message": "Cancel all $1 transactions" - }, "chainId": { "message": "Chain ID" }, - "classicInterface": { - "message": "Use classic interface" - }, - "clickCopy": { - "message": "Click to Copy" - }, - "clickToAdd": { - "message": "Click on $1 to add them to your account" - }, "clickToRevealSeed": { "message": "Click here to reveal secret words" }, @@ -279,45 +358,30 @@ "chromeRequiredForHardwareWallets": { "message": "You need to use MetaMask on Google Chrome in order to connect to your Hardware Wallet." }, - "company": { - "message": "Company" - }, "confirm": { "message": "Confirm" }, - "confirmationTime": { - "message": "Confirmation time (sec)" - }, "confirmed": { "message": "Confirmed" }, - "confirmContract": { - "message": "Confirm Contract" - }, "confirmPassword": { - "message": "Confirm Password" + "message": "Confirm password" }, "confirmSecretBackupPhrase": { "message": "Confirm your Secret Backup Phrase" }, - "confirmTransaction": { - "message": "Confirm Transaction" - }, "congratulations": { "message": "Congratulations" }, + "connectAccountOrCreate": { + "message": "Connect account or create new" + }, "connectHardwareWallet": { "message": "Connect Hardware Wallet" }, "connect": { "message": "Connect" }, - "connectRequest": { - "message": "Connect Request" - }, - "connecting": { - "message": "Connecting..." - }, "connectingTo": { "message": "Connecting to $1" }, @@ -339,20 +403,14 @@ "connectingToGoerli": { "message": "Connecting to Goerli Test Network" }, - "connectingToUnknown": { - "message": "Connecting to Unknown Network" + "contacts": { + "message": "Contacts" }, - "connectToLedger": { - "message": "Connect to Ledger" + "contactsSettingsDescription": { + "message": "Add, edit, remove, and manage your contacts" }, - "connectToTrezor": { - "message": "Connect to Trezor" - }, - "continue": { - "message": "Continue" - }, - "continueToCoinbase": { - "message": "Continue to Coinbase" + "contactUs": { + "message": "Contact us!" }, "continueToWyre": { "message": "Continue to Wyre" @@ -363,24 +421,9 @@ "contractDeployment": { "message": "Contract Deployment" }, - "conversionProgress": { - "message": "Conversion in progress" - }, - "copiedButton": { - "message": "Copied" - }, - "copiedClipboard": { - "message": "Copied to Clipboard" - }, "copiedExclamation": { "message": "Copied!" }, - "copiedSafe": { - "message": "I've copied it somewhere safe" - }, - "copy": { - "message": "Copy" - }, "copyAddress": { "message": "Copy address to clipboard" }, @@ -393,9 +436,6 @@ "copyToClipboard": { "message": "Copy to clipboard" }, - "copyButton": { - "message": " Copy " - }, "copyPrivateKey": { "message": "This is your private key (click to copy)" }, @@ -408,28 +448,18 @@ "createAWallet": { "message": "Create a Wallet" }, - "createDen": { - "message": "Create" - }, "createPassword": { "message": "Create Password" }, - "crypto": { - "message": "Crypto", - "description": "Exchange type (cryptocurrencies)" - }, "currencyConversion": { "message": "Currency Conversion" }, + "currentExtension": { + "message": "Current extension page" + }, "currentLanguage": { "message": "Current Language" }, - "currentNetwork": { - "message": "Current Network" - }, - "currentRpc": { - "message": "Current RPC" - }, "customGas": { "message": "Customize Gas" }, @@ -439,12 +469,15 @@ "customToken": { "message": "Custom Token" }, - "customize": { - "message": "Customize" - }, "customRPC": { "message": "Custom RPC" }, + "customSpendLimit": { + "message": "Custom Spend Limit" + }, + "dataBackupFoundInfo": { + "message": "Some of your account data was backed up during a previous installation of MetaMask. This could include your settings, contacts, and tokens. Would you like to restore this data now?" + }, "decimalsMustZerotoTen": { "message": "Decimals must be at least 0, and not over 36." }, @@ -457,39 +490,18 @@ "delete": { "message": "Delete" }, - "denExplainer": { - "message": "Your DEN is your password-encrypted storage within MetaMask." + "deleteAccount": { + "message": "Delete Account" }, "deposit": { "message": "Deposit" }, - "depositBTC": { - "message": "Deposit your BTC to the address below:" - }, - "depositEth": { - "message": "Deposit Eth" - }, "depositEther": { "message": "Deposit Ether" }, - "depositFiat": { - "message": "Deposit with Fiat" - }, - "depositFromAccount": { - "message": "Deposit from another account" - }, - "depositShapeShift": { - "message": "Deposit with ShapeShift" - }, - "depositShapeShiftExplainer": { - "message": "If you own other cryptocurrencies, you can trade and deposit Ether directly into your MetaMask wallet. No Account Needed." - }, "details": { "message": "Details" }, - "directDeposit": { - "message": "Direct Deposit" - }, "directDepositEther": { "message": "Directly Deposit Ether" }, @@ -499,6 +511,9 @@ "done": { "message": "Done" }, + "dontShowThisAgain": { + "message": "Don't show this again" + }, "downloadGoogleChrome": { "message": "Download Google Chrome" }, @@ -517,20 +532,11 @@ "edit": { "message": "Edit" }, - "editNetwork": { - "message": "Edit Network" + "editContact": { + "message": "Edit Contact" }, - "editAccountName": { - "message": "Edit Account Name" - }, - "editingTransaction": { - "message": "Make changes to your transaction" - }, - "emailUs": { - "message": "Email us!" - }, - "encryptNewDen": { - "message": "Encrypt your new DEN" + "editPermission": { + "message": "Edit Permission" }, "endOfFlowMessage1": { "message": "You passed the test - keep your seedphrase safe, it's your responsibility!" @@ -554,22 +560,73 @@ "message": "If you ever have questions or see something fishy, email support@metamask.io." }, "endOfFlowMessage8": { - "message": "MetaMask cannot recover your seedphrase. Learn more." + "message": "MetaMask cannot recover your seedphrase." + }, + "endOfFlowMessage9": { + "message": "Learn more." + }, + "endOfFlowMessage10": { + "message": "All Done" + }, + "externalExtension": { + "message": "External Extension" + }, + "onboardingReturnNotice": { + "message": "\"$1\" will close this tab and direct back to $2", + "description": "Return the user to the site that initiated onboarding" + }, + "ensRegistrationError": { + "message": "Error in ENS name registration" }, - "ensNameNotFound": { - "message": "ENS name not found" + "ensNotFoundOnCurrentNetwork": { + "message": "ENS name not found on the current network. Try switching to Main Ethereum Network." + }, + "enterAnAlias": { + "message": "Enter an alias" + }, + "enterMaxSpendLimit": { + "message": "Enter Max Spend Limit" }, "enterPassword": { "message": "Enter password" }, - "enterPasswordConfirm": { - "message": "Enter your password to confirm" - }, "enterPasswordContinue": { "message": "Enter password to continue" }, - "eth": { - "message": "ETH" + "errorCode": { + "message": "Code: $1", + "description": "Displayed error code for debugging purposes. $1 is the error code" + }, + "errorDetails": { + "message": "Error Details", + "description": "Title for collapsible section that displays error details for debugging purposes" + }, + "errorMessage": { + "message": "Message: $1", + "description": "Displayed error message for debugging purposes. $1 is the error message" + }, + "errorName": { + "message": "Code: $1", + "description": "Displayed error name for debugging purposes. $1 is the error name" + }, + "errorPageTitle": { + "message": "MetaMask encountered an error", + "description": "Title of generic error page" + }, + "errorPageMessage": { + "message": "Try again by reloading the page, or contact support at support@metamask.io", + "description": "Message displayed on generic error page in the fullscreen or notification UI" + }, + "errorPagePopupMessage": { + "message": "Try again by closing and reopening the popup, or contact support at support@metamask.io", + "description": "Message displayed on generic error page in the popup UI" + }, + "errorStack": { + "message": "Stack:", + "description": "Title for error stack, which is displayed for debugging purposes" + }, + "ethereumPublicAddress": { + "message": "Ethereum Public Address" }, "etherscanView": { "message": "View account on Etherscan" @@ -577,32 +634,26 @@ "estimatedProcessingTimes": { "message": "Estimated Processing Times" }, - "exchangeRate": { - "message": "Exchange Rate" - }, "expandView": { - "message": "Expand View" + "message": "Expand view" }, "exportPrivateKey": { "message": "Export Private Key" }, - "exportPrivateKeyWarning": { - "message": "Export private keys at your own risk." - }, "failed": { "message": "Failed" }, + "failureMessage": { + "message": "Something went wrong, and we were unable to complete the action" + }, "fast": { "message": "Fast" }, "faster": { "message": "Faster" }, - "fastest": { - "message": "Fastest" - }, - "feeChartTitle": { - "message": "Live Transaction Fee Predictions" + "feeAssociatedRequest": { + "message": "A fee is associated with this request." }, "fiat": { "message": "Fiat", @@ -612,52 +663,34 @@ "message": "File import not working? Click here!", "description": "Helps user import their account from a JSON file" }, - "followTwitter": { - "message": "Follow us on Twitter" - }, "forgetDevice": { "message": "Forget this device" }, "from": { "message": "From" }, - "fromToSame": { - "message": "From and To address cannot be the same" + "fromAddress": { + "message": "From: $1", + "description": "$1 is the address to include in the From label. It is typically shortened first using shortenAddress" }, - "fromShapeShift": { - "message": "From ShapeShift" + "functionApprove": { + "message": "Function: Approve" }, "functionType": { "message": "Function Type" }, - "gas": { - "message": "Gas", - "description": "Short indication of gas cost" - }, - "gasFee": { - "message": "Gas Fee" - }, "gasLimit": { "message": "Gas Limit" }, - "gasLimitCalculation": { - "message": "We calculate the suggested gas limit based on network success rates." - }, "gasLimitInfoModalContent": { "message": "Gas limit is the maximum amount of units of gas you are willing to spend." }, - "gasLimitRequired": { - "message": "Gas Limit Required" - }, "gasLimitTooLow": { "message": "Gas limit must be at least 21000" }, "gasUsed": { "message": "Gas Used" }, - "generatingSeed": { - "message": "Generating Seed..." - }, "gasPrice": { "message": "Gas Price (GWEI)" }, @@ -670,11 +703,13 @@ "gasPriceNoDenom": { "message": "Gas Price" }, - "gasPriceCalculation": { - "message": "We calculate the suggested gas prices based on network success rates." + "gdprMessage": { + "message": "This data is aggregated and is therefore anonymous for the purposes of General Data Protection Regulation (EU) 2016/679. For more information in relation to our privacy practices, please see our $1.", + "description": "$1 refers to the gdprMessagePrivacyPolicy message, the translation of which is meant to be used exclusively in the context of gdprMessage" }, - "gasPriceRequired": { - "message": "Gas Price Required" + "gdprMessagePrivacyPolicy": { + "message": "Privacy Policy here", + "description": "this translation is intended to be exclusively used as the replacement for the $1 in the gdprMessage translation" }, "general": { "message": "General" @@ -682,9 +717,6 @@ "generalSettingsDescription": { "message": "Currency conversion, primary currency, language, blockies identicon" }, - "generatingTransaction": { - "message": "Generating transaction" - }, "getEther": { "message": "Get Ether" }, @@ -698,15 +730,11 @@ "getStarted": { "message": "Get Started" }, - "greaterThanMin": { - "message": "must be greater than or equal to $1.", - "description": "helper for inputting hex as decimal input" - }, "happyToSeeYou": { "message": "We’re happy to see you." }, "hardware": { - "message": "hardware" + "message": "Hardware" }, "hardwareWalletConnected": { "message": "Hardware wallet connected" @@ -724,17 +752,15 @@ "message": "here", "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, - "hereList": { - "message": "Here's a list!!!!" - }, "hexData": { "message": "Hex Data" }, "hide": { "message": "Hide" }, - "hideToken": { - "message": "Hide Token" + "hideTokenSymbol": { + "message": "Hide $1", + "description": "$1 is the symbol for a token (e.g. 'DAI')" }, "hideTokenPrompt": { "message": "Hide Token?" @@ -742,12 +768,6 @@ "history": { "message": "History" }, - "howToDeposit": { - "message": "How would you like to deposit Ether?" - }, - "holdEther": { - "message": "It allows you to hold ether & tokens, and serves as your bridge to decentralized applications." - }, "import": { "message": "Import", "description": "Button to import an account from a selected file" @@ -759,16 +779,10 @@ "message": " Imported accounts will not be associated with your originally created MetaMask account seedphrase. Learn more about imported accounts " }, "importAccountSeedPhrase": { - "message": "Import an Account with Seed Phrase" - }, - "importAnAccount": { - "message": "Import an account" - }, - "importDen": { - "message": "Import Existing DEN" + "message": "Import an account with seed phrase" }, "importWallet": { - "message": "Import Wallet" + "message": "Import wallet" }, "importYourExisting": { "message": "Import your existing wallet using a 12 word seed phrase" @@ -780,12 +794,6 @@ "importUsingSeed": { "message": "Import using account seed phrase" }, - "importWithSeedPhrase": { - "message": "Import with seed phrase" - }, - "info": { - "message": "Info" - }, "infoHelp": { "message": "Info & Help" }, @@ -810,56 +818,58 @@ "knownAddressRecipient": { "message": "Known contract address." }, + "knownTokenWarning": { + "message": "This action will edit tokens that are already listed in your wallet, which can be used to phish you. Only approve if you are certain that you mean to change what these tokens represent." + }, + "reusedTokenNameWarning": { + "message": "A token here reuses a symbol from another token you watch, this can be confusing or deceptive." + }, "invalidAddressRecipientNotEthNetwork": { "message": "Not ETH network, set to lowercase" }, - "invalidGasParams": { - "message": "Invalid Gas Parameters" - }, "invalidInput": { "message": "Invalid input." }, - "invalidRequest": { - "message": "Invalid Request" - }, "invalidRPC": { "message": "Invalid RPC URL" }, + "invalidBlockExplorerURL": { + "message": "Invalid Block Explorer URL" + }, "invalidSeedPhrase": { "message": "Invalid seed phrase" }, - "jsonFail": { - "message": "Something went wrong. Please make sure your JSON file is properly formatted." + "ipfsGateway": { + "message": "IPFS Gateway" + }, + "ipfsGatewayDescription": { + "message": "Enter the URL of the IPFS CID gateway to use for ENS content resolution." + }, + "invalidIpfsGateway": { + "message": "Invalid IPFS Gateway: The value must be a valid URL" + }, + "forbiddenIpfsGateway": { + "message": "Forbidden IPFS Gateway: Please specify a CID gateway" }, "jsonFile": { "message": "JSON File", "description": "format for importing an account" }, - "keepTrackTokens": { - "message": "Keep track of the tokens you’ve bought with your MetaMask account." - }, "kovan": { "message": "Kovan Test Network" }, - "knowledgeDataBase": { - "message": "Visit our Knowledge Base" - }, "max": { "message": "Max" }, + "lastConnected": { + "message": "Last Connected" + }, "learnMore": { "message": "Learn more" }, "ledgerAccountRestriction": { "message": "You need to make use your last account before you can add a new one." }, - "legal": { - "message": "Legal" - }, - "lessThanMax": { - "message": "must be less than or equal to $1.", - "description": "helper for inputting hex as decimal input" - }, "letsGoSetUp": { "message": "Yes, let’s get set up!" }, @@ -869,9 +879,6 @@ "links": { "message": "Links" }, - "limit": { - "message": "Limit" - }, "liveGasPricePredictions": { "message": "Live Gas Price Predictions" }, @@ -881,20 +888,17 @@ "loadingTokens": { "message": "Loading Tokens..." }, + "loadMore": { + "message": "Load More" + }, "localhost": { "message": "Localhost 8545" }, - "login": { - "message": "Log In" - }, - "logout": { - "message": "Log out" - }, - "loose": { - "message": "Loose" + "lock": { + "message": "Lock" }, - "loweCaseWords": { - "message": "seed words only have lowercase characters" + "lockTimeTooGreat": { + "message": "Lock time is too great" }, "mainnet": { "message": "Main Ethereum Network" @@ -902,39 +906,39 @@ "memorizePhrase": { "message": "Memorize this phrase." }, - "menu": { - "message": "Menu" + "memo": { + "message": "memo" }, "message": { "message": "Message" }, + "metaMaskConnectStatusParagraphOne": { + "message": "You now have more control over your account connections in MetaMask." + }, + "metaMaskConnectStatusParagraphTwo": { + "message": "The connection status button shows if the website you’re visiting is connected to your currently selected account." + }, + "metaMaskConnectStatusParagraphThree": { + "message": "Click it to manage your connected accounts." + }, "metamaskDescription": { "message": "Connecting you to Ethereum and the Decentralized Web." }, - "metamaskSeedWords": { - "message": "MetaMask Seed Words" - }, "metamaskVersion": { "message": "MetaMask Version" }, - "min": { - "message": "Minimum" - }, - "missingYourTokens": { - "message": "Don't see your tokens?" - }, - "minutesShorthand": { - "message": "Min" - }, - "mobileSyncTitle": { - "message": "Sync accounts with mobile" - }, "mobileSyncText": { "message": "Please enter your password to confirm it's you!" }, "myAccounts": { "message": "My Accounts" }, + "myWalletAccounts": { + "message": "My Wallet Accounts" + }, + "myWalletAccountsDescription": { + "message": "All of your MetaMask created accounts will automatically be added to this section." + }, "mustSelectOne": { "message": "Must select at least 1 token." }, @@ -945,10 +949,6 @@ "message": "You must select a file to import.", "description": "User is important an account and needs to add a file to continue" }, - "needImportPassword": { - "message": "You must enter a password for the selected file.", - "description": "Password and file needed to import an account" - }, "negativeETH": { "message": "Can not send negative amounts of ETH." }, @@ -967,21 +967,21 @@ "newAccount": { "message": "New Account" }, + "newAccountDetectedDialogMessage": { + "message": "New address detected! Click here to add to your address book." + }, "newAccountNumberName": { "message": "Account $1", "description": "Default name of next account to be created on create account screen" }, + "newContact": { + "message": "New Contact" + }, "newContract": { "message": "New Contract" }, "newPassword": { - "message": "New Password (min 8 chars)" - }, - "newPassword8Chars": { - "message": "New Password (min 8 chars)" - }, - "newRecipient": { - "message": "New Recipient" + "message": "New password (min 8 chars)" }, "newNetwork": { "message": "New Network" @@ -1004,11 +1004,11 @@ "rpcUrl": { "message": "New RPC URL" }, - "showAdvancedOptions": { - "message": "Show Advanced Options" + "onlyConnectTrust": { + "message": "Only connect with sites you trust." }, - "hideAdvancedOptions": { - "message": "Hide Advanced Options" + "onlyAddTrustedNetworks": { + "message": "A malicious Ethereum network provider can lie about the state of the blockchain and record your network activity. Only add custom networks you trust." }, "optionalChainId": { "message": "ChainID (optional)" @@ -1016,9 +1016,6 @@ "optionalSymbol": { "message": "Symbol (optional)" }, - "optionalNickname": { - "message": "Nickname (optional)" - }, "newTotal": { "message": "New Total" }, @@ -1028,29 +1025,27 @@ "next": { "message": "Next" }, + "nextNonceWarning": { + "message": "Nonce is higher than suggested nonce of $1", + "description": "The next nonce according to MetaMask's internal logic" + }, "noAddressForName": { "message": "No address has been set for this name." }, - "noDeposits": { - "message": "No deposits received" - }, "noConversionRateAvailable": { "message": "No Conversion Rate Available" }, - "noTransactionHistory": { - "message": "No transaction history." - }, "noTransactions": { "message": "You have no transactions" }, - "notEnoughGas": { - "message": "Not Enough Gas" + "noThanks": { + "message": "No Thanks" }, - "notFound": { - "message": "Not Found" + "notCurrentAccount": { + "message": "Is this the correct account? It's different from the currently selected account in your wallet" }, - "notStarted": { - "message": "Not Started" + "notEnoughGas": { + "message": "Not Enough Gas" }, "noWebcamFoundTitle": { "message": "Webcam not found" @@ -1061,41 +1056,15 @@ "ofTextNofM": { "message": "of" }, - "oldUI": { - "message": "Old UI" - }, - "oldUIMessage": { - "message": "You have returned to the old UI. You can switch back to the New UI through the option in the top right dropdown menu." - }, - "onlySendToEtherAddress": { - "message": "Only send ETH to an Ethereum address." - }, - "onlySendTokensToAccountAddress": { - "message": "Only send $1 to an Ethereum account address.", - "description": "displays token symbol" - }, - "openInTab": { - "message": "Open in tab" - }, - "or": { - "message": "or", - "description": "choice between creating or importing a new account" - }, "orderOneHere": { "message": "Order a Trezor or Ledger and keep your funds in cold storage" }, "origin": { "message": "Origin" }, - "outgoing": { - "message": "Outgoing" - }, "parameters": { "message": "Parameters" }, - "originalTotal": { - "message": "Original Total" - }, "participateInMetaMetrics": { "message": "Participate in MetaMetrics" }, @@ -1105,41 +1074,31 @@ "password": { "message": "Password" }, - "passwordCorrect": { - "message": "Please make sure your password is correct." - }, "passwordsDontMatch": { "message": "Passwords Don't Match" }, - "passwordMismatch": { - "message": "passwords don't match", - "description": "in password creation process, the two new password fields did not match" - }, "passwordNotLongEnough": { "message": "Password not long enough" }, - "passwordShort": { - "message": "password not long enough", - "description": "in password creation process, the password is not long enough to be secure" - }, "pastePrivateKey": { "message": "Paste your private key string here:", "description": "For importing an account from a private key" }, - "pasteSeed": { - "message": "Paste your seed phrase here!" - }, "pending": { - "message": "pending" + "message": "Pending" + }, + "permissionCheckedIconDescription": { + "message": "You have approved this permission" + }, + "permissionUncheckedIconDescription": { + "message": "You have not approved this permission" }, "personalAddressDetected": { "message": "Personal address detected. Input the token contract address." }, - "pleaseReviewTransaction": { - "message": "Please review your transaction." - }, - "popularTokens": { - "message": "Popular Tokens" + "plusXMore": { + "message": "+ $1 more", + "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, "prev": { "message": "Prev" @@ -1163,20 +1122,20 @@ "privateNetwork": { "message": "Private Network" }, - "qrCode": { - "message": "Show QR Code" + "proposedApprovalLimit": { + "message": "Proposed Approval Limit" }, "queue": { "message": "Queue" }, - "readdToken": { - "message": "You can add this token back in the future by going go to “Add token†in your accounts options menu." + "queued": { + "message": "Queued" }, - "readMore": { - "message": "Read more here." + "readdToken": { + "message": "You can add this token back in the future by going to “Add token†in your accounts options menu." }, - "readMore2": { - "message": "Read more." + "recents": { + "message": "Recents" }, "receive": { "message": "Receive" @@ -1184,8 +1143,8 @@ "recipientAddress": { "message": "Recipient Address" }, - "refundAddress": { - "message": "Your Refund Address" + "recipientAddressPlaceholder": { + "message": "Search, public address (0x), or ENS" }, "rejectAll": { "message": "Reject All" @@ -1206,31 +1165,38 @@ "message": "Reset Account" }, "resetAccountDescription": { - "message": "Resetting your account will clear your transaction history." + "message": "Resetting your account will clear your transaction history. This will not change the balances in your accounts or require you to re-enter your seed phrase." + }, + "deleteNetwork": { + "message": "Delete Network?" + }, + "deleteNetworkDescription": { + "message": "Are you sure you want to delete this network?" + }, + "remindMeLater": { + "message": "Remind me later" }, "restoreFromSeed": { "message": "Restore account?" }, - "restoreVault": { - "message": "Restore Vault" - }, "restoreAccountWithSeed": { "message": "Restore your Account with Seed Phrase" }, + "restoreWalletPreferences": { + "message": "A backup of your data from $1 has been found. Would you like to restore your wallet preferences?", + "description": "$1 is the date at which the data was backed up" + }, "requestsAwaitingAcknowledgement": { "message": "requests waiting to be acknowledged" }, "required": { "message": "Required" }, - "retryWithMoreGas": { - "message": "Retry with a higher gas price here" - }, "restore": { "message": "Restore" }, "revealSeedWords": { - "message": "Reveal Seed Words" + "message": "Reveal Seed Phrase" }, "revealSeedWordsTitle": { "message": "Seed Phrase" @@ -1244,9 +1210,6 @@ "revealSeedWordsWarning": { "message": "These words can be used to steal all your accounts." }, - "revert": { - "message": "Revert" - }, "remove": { "message": "Remove" }, @@ -1268,13 +1231,6 @@ "goerli": { "message": "Goerli Test Network" }, - "rpc": { - "message": "Custom RPC" - }, - "sampleAccountName": { - "message": "E.g. My new account", - "description": "Help user understand concept of adding a human-readable name to their account" - }, "save": { "message": "Save" }, @@ -1287,13 +1243,6 @@ "saveAsCsvFile": { "message": "Save as CSV File" }, - "saveAsFile": { - "message": "Save as File", - "description": "Account export process" - }, - "saveSeedAsFile": { - "message": "Save Seed Words As File" - }, "scanInstructions": { "message": "Place the QR code in front of your camera" }, @@ -1324,17 +1273,26 @@ "securitySettingsDescription": { "message": "Privacy settings and wallet seed phrase" }, - "secondsShorthand": { - "message": "Sec" - }, "seedPhrasePlaceholder": { "message": "Separate each word with a single space" }, + "seedPhrasePlaceholderPaste": { + "message": "Paste seed phrase from clipboard" + }, + "showSeedPhrase": { + "message": "Show seed phrase" + }, "seedPhraseReq": { - "message": "Seed phrases are 12 words long" + "message": "Seed phrases contain 12, 15, 18, 21, or 24 words" }, - "select": { - "message": "Select" + "selectingAllWillAllow": { + "message": "Selecting all will allow this site to view all of your current accounts. Make sure you trust this site." + }, + "selectAccounts": { + "message": "Select account(s)" + }, + "selectAll": { + "message": "Select all" }, "selectCurrency": { "message": "Select Currency" @@ -1345,12 +1303,12 @@ "selectLocale": { "message": "Select Locale" }, - "selectService": { - "message": "Select Service" - }, "selectType": { "message": "Select Type" }, + "buy": { + "message": "Buy" + }, "send": { "message": "Send" }, @@ -1369,14 +1327,21 @@ "sentTokens": { "message": "sent tokens" }, + "sendSpecifiedTokens": { + "message": "Send $1", + "description": "Symbol of the specified token" + }, "separateEachWord": { "message": "Separate each word with a single space" }, "searchTokens": { "message": "Search Tokens" }, - "selectAnAddress": { - "message": "Select an Address" + "searchAccounts": { + "message": "Search Accounts" + }, + "noAccountsFound": { + "message": "No accounts found for the given search query" }, "selectAnAccount": { "message": "Select an Account" @@ -1384,9 +1349,6 @@ "selectAnAccountHelp": { "message": "Select the account to view in MetaMask" }, - "selectAnAsset": { - "message": "Select an Asset" - }, "selectAHigherGasFee": { "message": "Select a higher gas fee to accelerate the processing of your transaction.*" }, @@ -1396,15 +1358,9 @@ "selectPathHelp": { "message": "If you don't see your existing Ledger accounts below, try switching paths to \"Legacy (MEW / MyCrypto)\"" }, - "sendTokensAnywhere": { - "message": "Send Tokens to anyone with an Ethereum account" - }, "settings": { "message": "Settings" }, - "shapeshiftBuy": { - "message": "Buy with Shapeshift" - }, "showAdvancedGasInline": { "message": "Advanced gas controls" }, @@ -1420,9 +1376,6 @@ "showPrivateKeys": { "message": "Show Private Keys" }, - "showQRCode": { - "message": "Show QR Code" - }, "showHexData": { "message": "Show Hex Data" }, @@ -1435,35 +1388,23 @@ "signatureRequest": { "message": "Signature Request" }, + "signatureRequest1": { + "message": "Message" + }, "signed": { "message": "Signed" }, - "signMessage": { - "message": "Sign Message" - }, "signNotice": { "message": "Signing this message can have \ndangerous side effects. Only sign messages from \nsites you fully trust with your entire account.\n This dangerous method will be removed in a future version. " }, "sigRequest": { "message": "Signature Request" }, - "sigRequested": { - "message": "Signature Requested" - }, "somethingWentWrong": { "message": "Oops! Something went wrong." }, - "spaceBetween": { - "message": "there can only be a space between words" - }, "speedUp": { - "message": "speed up" - }, - "speedUpTitle": { - "message": "Speed Up Transaction" - }, - "speedUpSubtitle": { - "message": "Increase your gas price to attempt to overwrite and speed up your transaction" + "message": "Speed Up" }, "speedUpCancellation": { "message": "Speed up this cancellation" @@ -1471,11 +1412,24 @@ "speedUpTransaction": { "message": "Speed up this transaction" }, + "spendLimitPermission": { + "message": "Spend limit permission" + }, + "spendLimitRequestedBy": { + "message": "Spend limit requested by $1", + "description": "Origin of the site requesting the spend limit" + }, + "spendLimitTooLarge": { + "message": "Spend limit too large" + }, + "spendLimitInvalid": { + "message": "Spend limit invalid; must be a positive number" + }, "switchNetworks": { "message": "Switch Networks" }, - "status": { - "message": "Status" + "stateLogFileName": { + "message": "MetaMask State Logs" }, "stateLogs": { "message": "State Logs" @@ -1486,6 +1440,12 @@ "stateLogError": { "message": "Error in retrieving state logs." }, + "statusConnected": { + "message": "Connected" + }, + "statusNotConnected": { + "message": "Not connected" + }, "step1HardwareWallet": { "message": "1. Connect Hardware Wallet" }, @@ -1499,10 +1459,10 @@ "message": "Select the account you want to view. You can only choose one at a time." }, "step3HardwareWallet": { - "message": "3. Start using dApps and more!" + "message": "3. Start using web3 sites and more!" }, "step3HardwareWalletMsg": { - "message": "Use your hardware account like you would with any Ethereum account. Log in to dApps, send Eth, buy and store ERC20 tokens and Non-Fungible tokens like CryptoKitties." + "message": "Use your hardware account like you would with any Ethereum account. Connect to web3 sites, send ETH, buy and store ERC20 tokens and non-fungible tokens like CryptoKitties." }, "storePhrase": { "message": "Store this phrase in a password manager like 1Password." @@ -1520,7 +1480,16 @@ "message": "Symbol" }, "symbolBetweenZeroTwelve": { - "message": "Symbol must be between 0 and 12 characters." + "message": "Symbol must be 11 characters or fewer." + }, + "syncWithThreeBox": { + "message": "Sync data with 3Box (experimental)" + }, + "syncWithThreeBoxDescription": { + "message": "Turn on to have your settings backed up with 3Box. This feature is currently experimental; use at your own risk." + }, + "syncWithThreeBoxDisabled": { + "message": "3Box has been disabled due to an error during the initial sync" }, "syncWithMobile": { "message": "Sync with mobile" @@ -1541,10 +1510,7 @@ "message": "Make sure nobody else is looking at your screen when you scan this code" }, "syncWithMobileComplete": { - "message": "Your data has been synced succesfully. Enjoy the MetaMask mobile app!" - }, - "takesTooLong": { - "message": "Taking too long?" + "message": "Your data has been synced successfully. Enjoy the MetaMask mobile app!" }, "terms": { "message": "Terms of Use" @@ -1561,34 +1527,28 @@ "to": { "message": "To" }, - "toETHviaShapeShift": { - "message": "$1 to ETH via ShapeShift", - "description": "system will fill in deposit type in start of message" + "toAddress": { + "message": "To: $1", + "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" + }, + "toWithColon": { + "message": "To:" }, "token": { "message": "Token" }, - "tokenAddress": { - "message": "Token Address" - }, "tokenAlreadyAdded": { "message": "Token has already been added." }, - "tokenBalance": { - "message": "Your Token Balance is:" - }, "tokenContractAddress": { "message": "Token Contract Address" }, - "tokenSelection": { - "message": "Search for tokens or select from our list of popular tokens." + "tokenOptions": { + "message": "Token options" }, "tokenSymbol": { "message": "Token Symbol" }, - "tokenWarning1": { - "message": "Keep track of the tokens you’ve bought with your MetaMask account. If you bought tokens using a different account, those tokens will not appear here." - }, "total": { "message": "Total" }, @@ -1601,9 +1561,6 @@ "transactionCreated": { "message": "Transaction created with a value of $1 at $2." }, - "transactionWithNonce": { - "message": "Transaction $1" - }, "transactionDropped": { "message": "Transaction dropped at $2." }, @@ -1616,9 +1573,6 @@ "transactionUpdated": { "message": "Transaction updated at $2." }, - "transactionUpdatedGas": { - "message": "Transaction updated with a gas fee of $1 at $2." - }, "transactionErrored": { "message": "Transaction encountered an error." }, @@ -1628,9 +1582,6 @@ "transactionCancelSuccess": { "message": "Transaction successfully cancelled at $2" }, - "transactions": { - "message": "transactions" - }, "transactionError": { "message": "Transaction Error. Exception thrown in contract code." }, @@ -1640,54 +1591,40 @@ "transactionFee": { "message": "Transaction Fee" }, - "transactionMemo": { - "message": "Transaction memo (optional)" - }, - "transactionNumber": { - "message": "Transaction Number" - }, "transactionTime": { "message": "Transaction Time" }, + "showTransactionTimeDescription": { + "message": "Select this to display pending transaction time estimates in the activity tab while on the Main Ethereum Network. Note: estimates are approximations based on network conditions." + }, "transfer": { "message": "Transfer" }, + "transferBetweenAccounts": { + "message": "Transfer between my accounts" + }, "transferFrom": { "message": "Transfer From" }, - "transfers": { - "message": "Transfers" - }, - "trezorHardwareWallet": { - "message": "TREZOR Hardware Wallet" - }, "troubleTokenBalances": { "message": "We had trouble loading your token balances. You can view them ", "description": "Followed by a link (here) to view token balances" }, + "trustSiteApprovePermission": { + "message": "Do you trust this site? By granting this permission, you’re allowing $1 to withdraw your $2 and automate transactions for you.", + "description": "$1 is the url requesting permission and $2 is the symbol of the currency that the request is for" + }, "tryAgain": { "message": "Try again" }, - "twelveWords": { - "message": "These 12 words are the only way to restore your MetaMask accounts.\nSave them somewhere safe and secret." - }, "typePassword": { "message": "Type your MetaMask password" }, - "uiMigrationAnnouncement": { - "message": "Welcome to the new MetaMask UI. If you have feedback about the UI or feature requests, please reach out to our support team or on GitHub." - }, - "uiWelcome": { - "message": "Welcome to the New UI (Beta)" - }, - "uiWelcomeMessage": { - "message": "You are now using the new MetaMask UI." - }, "unapproved": { "message": "Unapproved" }, - "unavailable": { - "message": "Unavailable" + "alertDisableTooltip": { + "message": "This can be changed in \"Settings > Alerts\"" }, "units": { "message": "units" @@ -1698,9 +1635,6 @@ "unknownNetwork": { "message": "Unknown Private Network" }, - "unknownNetworkId": { - "message": "Unknown network ID" - }, "unknownQrCode": { "message": "Error: We couldn't identify that QR code" }, @@ -1710,6 +1644,9 @@ "unknownCameraError": { "message": "There was an error while trying to access your camera. Please try again..." }, + "unlimited": { + "message": "Unlimited" + }, "unlock": { "message": "Unlock" }, @@ -1719,24 +1656,23 @@ "updatedWithDate": { "message": "Updated $1" }, - "uriErrorMsg": { - "message": "URIs require the appropriate HTTP/HTTPS prefix." + "urlErrorMsg": { + "message": "URLs require the appropriate HTTP/HTTPS prefix." }, - "usaOnly": { - "message": "USA only", - "description": "Using this exchange is limited to people inside the USA" + "urlExistsErrorMsg": { + "message": "URL is already present in existing list of networks" }, "usedByClients": { "message": "Used by a variety of different clients" }, - "useOldUI": { - "message": "Use old UI" + "usePhishingDetection": { + "message": "Use Phishing Detection" }, - "validFileImport": { - "message": "You must select a valid file to import." + "usePhishingDetectionDescription": { + "message": "Display a warning for phishing domains targeting Ethereum users" }, - "vaultCreated": { - "message": "Vault Created" + "userName": { + "message": "Username" }, "viewAccount": { "message": "View Account" @@ -1744,23 +1680,23 @@ "viewinExplorer": { "message": "View in Explorer" }, + "viewContact": { + "message": "View Contact" + }, "viewOnCustomBlockExplorer": { "message": "View at $1" }, "viewOnEtherscan": { "message": "View on Etherscan" }, - "viewNetworkInfo": { - "message": "View Network Info" + "retryTransaction": { + "message": "Retry Transaction" }, "visitWebSite": { "message": "Visit our web site" }, "walletSeed": { - "message": "Wallet Seed" - }, - "warning": { - "message": "Warning" + "message": "Seed phrase" }, "welcomeBack": { "message": "Welcome Back!" @@ -1774,6 +1710,10 @@ "writePhrase": { "message": "Write this phrase on a piece of paper and store in a secure location. If you want even more security, write it down on multiple pieces of paper and store each in 2 - 3 different locations." }, + "xOfY": { + "message": "$1 of $2", + "description": "$1 and $2 are intended to be two numbers, where $2 is a total, and $1 is a count towards that total" + }, "yesLetsTry": { "message": "Yes, let's try" }, @@ -1789,19 +1729,37 @@ "yourPrivateSeedPhrase": { "message": "Your private seed phrase" }, - "yourUniqueAccountImage": { - "message": "Your unique account image" + "zeroGasPriceOnSpeedUpError": { + "message": "Zero gas price on speed up" + }, + "decryptRequest": { + "message": "Decrypt request" }, - "yourUniqueAccountImageDescription1": { - "message": "This image was programmatically generated for you by your new account number." + "decrypt": { + "message": "Decrypt" }, - "yourUniqueAccountImageDescription2": { - "message": "You’ll see this image everytime you need to confirm a transaction." + "decryptMessageNotice": { + "message": "$1 would like to read this message to complete your action", + "description": "$1 is the web3 site name" }, - "yourUniqueAccountImageDescription3": { - "message": "MetaMask will never ask for your seed phrase!" + "decryptMetamask": { + "message": "Decrypt message" }, - "zeroGasPriceOnSpeedUpError": { - "message":"Zero gas price on speed up" + "decryptCopy": { + "message": "Copy encrypted message" + }, + "decryptInlineError": { + "message": "This message cannot be decrypted due to error: $1", + "description": "$1 is error message" + }, + "provide": { + "message": "Provide" + }, + "encryptionPublicKeyRequest": { + "message": "Request encryption public key" + }, + "encryptionPublicKeyNotice": { + "message": "$1 would like your public encryption key. By consenting, this site will be able to compose encrypted messages to you.", + "description": "$1 is the web3 site name" } } diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json index 06531b1dcb29..97576dba7323 100644 --- a/app/_locales/es/messages.json +++ b/app/_locales/es/messages.json @@ -1,63 +1,63 @@ { - "privacyMode": { - "message": "Modo privado" + "chartOnlyAvailableEth": { + "message": "Tabla solo disponible en redes Ethereum." }, - "privacyModeDescription": { - "message": "Los sitios web deben solicitar acceso para ver la información de su cuenta." + "contractInteraction": { + "message": "Interacción con contrato" }, - "exposeAccounts": { - "message": "Exponer cuentas" + "reject": { + "message": "Rechazar" }, - "exposeDescription": { - "message": "Exponer cuentas al sitio web actual. Útil para dapps heredados." + "about": { + "message": "Acerca" }, - "confirmExpose": { - "message": "¿Seguro que quieres exponer tus cuentas al sitio web actual?" + "aboutSettingsDescription": { + "message": "Versión, centro de soporte e información de contacto" }, - "confirmClear": { - "message": "¿Seguro que quieres borrar los sitios web aprobados?" + "acceleratingATransaction": { + "message": "* Agilizar a una transacción al usar un precio de gas más alto aumenta las probabilidades que que la red lo procese más rápidamente, pero eso no siempre está garantizado." }, - "clearApprovalDataSuccess": { - "message": "Los datos aprobados del sitio web se borraron con éxito." + "accessingYourCamera": { + "message": "Accediendo a tu cámara..." }, - "approvalData": { - "message": "Datos de aprobación" + "account": { + "message": "Cuenta" }, - "approvalDataDescription": { - "message": "Borrar la información privada de modo que todos los sitios deban volver a requerir acceso para acceder a los datos de la cuenta." + "accountDetails": { + "message": "Detalles de la cuenta" }, - "clearApprovalData": { - "message": "Borrar datos de aprobación" + "accountName": { + "message": "Nombre de la cuenta" }, - "approve": { - "message": "Aprobar" + "accountOptions": { + "message": "Opciones de la cuenta" }, - "reject": { - "message": "Rechazar" + "accountSelectionRequired": { + "message": "¡Necesitas elegir una cuenta!" }, - "providerAPIRequest": { - "message": "Solicitud de API Web3" + "activityLog": { + "message": "registro de actividades" }, - "reviewProviderRequest": { - "message": "Por favor, revise esta solicitud API Ethereum." + "addNetwork": { + "message": "Añadir Red" }, - "providerRequestInfo": { - "message": "El dominio que se muestra a continuación intenta solicitar acceso a la API Ethereum para que pueda interactuar con la blockchain de Ethereum. Siempre verifique que esté en el sitio correcto antes de aprobar el acceso Ethereum." + "addRecipient": { + "message": "Añadir destinatario" }, - "accept": { - "message": "Aceptar" + "advanced": { + "message": "Avanzado" }, - "account": { - "message": "Cuenta" + "advancedOptions": { + "message": "Opciones Avanzadas" }, - "accountDetails": { - "message": "Detalles de la cuenta" + "addToAddressBook": { + "message": "Añadir al libro de direcciones" }, - "accountName": { - "message": "Nombre de la cuenta" + "addToAddressBookModalPlaceholder": { + "message": "p. ej. John D." }, - "addCustomToken": { - "message": "Agregar token personalizados" + "addAlias": { + "message": "Añadir alias" }, "addToken": { "message": "Agregar token" @@ -65,72 +65,77 @@ "addTokens": { "message": "Agregar tokens" }, - "address": { - "message": "Dirección" + "addSuggestedTokens": { + "message": "Agregar tokens propuestos" + }, + "addAcquiredTokens": { + "message": "Agregar los tokens que has adquirido usando MetaMask" }, "amount": { "message": "Cantidad" }, - "amountPlusGas": { - "message": "Cantidad + Gas" - }, "appDescription": { "message": "Extensión del navegador para Ethereum", - "description": "La descripción de la aplicación" + "description": "The description of the application" }, "appName": { "message": "MetaMask", - "description": "El nombre de la aplicación" + "description": "The name of the application" + }, + "approve": { + "message": "Aprobar" }, "approved": { "message": "Aprobado" }, + "asset": { + "message": "Activo" + }, "attemptingConnect": { "message": "Intentando conectar a la Blockchain" }, + "attemptToCancel": { + "message": "¿Intentar cancelar?" + }, + "attemptToCancelDescription": { + "message": "El intentar cancelar la transacción no garantiza la cancelación de la misma. Si el intento de cancelación tiene éxito, se le cobrará la comisión de transacción indicada arriba." + }, "attributions": { "message": "Atribuciones" }, - "available": { - "message": "Disponible" + "autoLockTimeLimit": { + "message": "Temporizador Auto-Cierre (minutos)" + }, + "autoLockTimeLimitDescription": { + "message": "Establece el tiempo de inactividad en minutos antes de que MetaMask cierre la sesión automáticamente." + }, + "average": { + "message": "Promedio" }, "back": { "message": "Atrás" }, - "balance": { - "message": "Saldo" - }, - "balanceIsInsufficientGas": { - "message": "Saldo de gas insuficiente" + "backToAll": { + "message": "Volver a Todo" }, - "balances": { - "message": "Tus saldos" + "backupApprovalNotice": { + "message": "Haz un respaldo de tu código de Recuperación Secreta para mantener tu Wallet y tus fondos seguros." }, - "beta": { - "message": "BETA" + "balance": { + "message": "Saldo" }, - "betweenMinAndMax": { - "message": "Debe ser mayor o igual a $1 y menor o igual a $2", - "description": "Helper para ingresar hex como un ingreso decimal" + "basic": { + "message": "Básico" }, "blockiesIdenticon": { "message": "Usar Blockies Identicon (Iconos)" }, - "borrowDharma": { - "message": "Pedir prestado con Dharma (Beta)" + "browserNotSupported": { + "message": "Tu navegador no está admitido..." }, "builtInCalifornia": { "message": "MetaMask fue diseñado y construido en California" }, - "buy": { - "message": "Comprar" - }, - "buyCoinbase": { - "message": "Comprar en Coinbase" - }, - "buyCoinbaseExplainer": { - "message": "Coinbase es la plataforma global más popular para comprar y vender Bitcoin, Ethereum y Litecoin" - }, "buyCoinSwitch": { "message": "Comprar en CoinSwitch" }, @@ -140,26 +145,50 @@ "cancel": { "message": "Cancelar" }, - "classicInterface": { - "message": "Usar interfaz clásica" + "cancelAttempt": { + "message": "Intentar cancelar" + }, + "cancellationGasFee": { + "message": "Comisión de Gas por cancelación" + }, + "cancelled": { + "message": "Cancelado" + }, + "chainId": { + "message": "ID Cadena" + }, + "clickToRevealSeed": { + "message": "Haga clic aquí para revelar palabras secretas" }, - "clickCopy": { - "message": "Click para copiar" + "close": { + "message": "Cerrar" + }, + "chromeRequiredForHardwareWallets": { + "message": "Hay que usar MetaMask en Google Chrome para poder conectarse con tu Monedero Físico." }, "confirm": { "message": "Confirmar" }, - "confirmContract": { - "message": "Confirmar contrato" - }, "confirmed": { "message": "Confirmado" }, "confirmPassword": { "message": "Confirmar contraseña" }, - "confirmTransaction": { - "message": "Confirmar transacción" + "congratulations": { + "message": "Enhorabuena" + }, + "connectHardwareWallet": { + "message": "Conectar Monedero Físico" + }, + "connect": { + "message": "Conectar" + }, + "connectingTo": { + "message": "Conectánodse a $1" + }, + "connectingToKovan": { + "message": "Conectando a la red de test Kovan" }, "connectingToMainnet": { "message": "Conectando a la red principal de Ethereum (Main Net)" @@ -167,20 +196,17 @@ "connectingToRopsten": { "message": "Conectando a la red de test Ropsten" }, - "connectingToKovan": { - "message": "Conectando a la red de test Kovan" - }, "connectingToRinkeby": { "message": "Conectando a la red de test Rinkeby" }, - "connectingToUnknown": { - "message": "Conectando a una red desconocida" + "connectingToLocalhost": { + "message": "Conectando to Localhost 8545" }, - "continue": { - "message": "Continuar" + "connectingToGoerli": { + "message": "Conectando al Test de Red Goerli" }, - "continueToCoinbase": { - "message": "Continuar a Coinbase" + "continueToWyre": { + "message": "Continuar a Wyre" }, "continueToCoinSwitch": { "message": "Continuar a CoinSwitch" @@ -188,106 +214,78 @@ "contractDeployment": { "message": "Desplegar (Deploy) contrato" }, - "conversionProgress": { - "message": "Conversión en progreso" - }, - "copiedButton": { - "message": "Copiado" - }, - "copiedClipboard": { - "message": "Copiado al portapapeles" - }, "copiedExclamation": { "message": "¡Copiado!" }, - "copiedSafe": { - "message": "Ya lo guardé en un lugar seguro" - }, - "copy": { - "message": "Copiar" + "copyAddress": { + "message": "Copiar la dirección al portapapeles" }, - "copyButton": { - "message": " Copiar " + "copyTransactionId": { + "message": "Copiar ID Transacción" }, - "copyPrivateKey": { - "message": "Ésta es tu clave privada (haz click para copiar)" + "copiedTransactionId": { + "message": "ID Transacción copiado" }, "copyToClipboard": { "message": "Copiar al portapapeles" }, + "copyPrivateKey": { + "message": "Ésta es tu clave privada (haz click para copiar)" + }, "create": { "message": "Crear" }, "createAccount": { "message": "Crear cuenta" }, - "createDen": { - "message": "Crear" - }, - "crypto": { - "message": "Crypto", - "description": "Tipo de cambio (criptomonedas)" + "createAWallet": { + "message": "Crear Wallet" }, - "currentConversion": { - "message": "Conversión actual" + "createPassword": { + "message": "Crear Contraseña" }, - "currentNetwork": { - "message": "Red actual" + "currencyConversion": { + "message": "Cambio de Monedas" }, - "currentRpc": { - "message": "RPC actual" + "currentLanguage": { + "message": "Idioma Actual" }, "customGas": { "message": "Personalizar gas" }, + "customGasSubTitle": { + "message": "Aumentar la comisión puede hacer que el tiempo de procesamiento se disminuya, pero no lo garantiza." + }, + "customToken": { + "message": "Token Personalizado" + }, "customRPC": { "message": "RPC personalizado" }, - "customize": { - "message": "Personalizar" + "decimalsMustZerotoTen": { + "message": "Los decimales deben ser al menos 0 y no más de 36" }, "decimal": { "message": "Decimales de precisión" }, - "decimalsMustZerotoTen": { - "message": "Los decimales deben ser al menos 0 y no más de 36" - }, "defaultNetwork": { "message": "La red por defecto para las transacciones de Ether es MainNet (red principal)" }, - "denExplainer": { - "message": "El DEN es tu contraseña encriptada almacenada dentro de MetaMask" + "delete": { + "message": "Eliminar" + }, + "deleteAccount": { + "message": "Eliminar Cuenta" }, "deposit": { "message": "Depositar" }, - "depositBTC": { - "message": "Deposita tus BTC a la dirección de abajo:" - }, - "depositEth": { - "message": "Depositar Ether" - }, "depositEther": { "message": "Depositar Ether" }, - "depositFiat": { - "message": "Depositar con fiat (divisa nacional)" - }, - "depositFromAccount": { - "message": "Depositar con otra cuenta" - }, - "depositShapeShift": { - "message": "Depositar con ShapeShift" - }, - "depositShapeShiftExplainer": { - "message": "Si posees otras criptomonedas, puedes intercambiar y depositar Ether directamente en tu billetera de MetaMask. No necesitas tener una cuenta." - }, "details": { "message": "Detalles" }, - "directDeposit": { - "message": "Depósito directo" - }, "directDepositEther": { "message": "Depositar Ether directamente" }, @@ -297,155 +295,162 @@ "done": { "message": "Completo" }, + "downloadGoogleChrome": { + "message": "Descargar Google Chrome" + }, "downloadStateLogs": { "message": "Descargar logs de estado" }, + "dontHaveAHardwareWallet": { + "message": "¿No tienes un monedero físico?" + }, "dropped": { "message": "Caído" }, "edit": { "message": "Editar" }, - "editAccountName": { - "message": "Editar el nombre de la cuenta" + "editContact": { + "message": "Editar Contacto" }, - "emailUs": { - "message": "¡Envíanos un correo!" + "endOfFlowMessage8": { + "message": "MetaMask no puede recuperar tu seedphrase. Saber más." }, - "encryptNewDen": { - "message": "Encriptar tu nuevo DEN" + "endOfFlowMessage9": { + "message": "Saber más." }, "enterPassword": { "message": "Ingresa contraseña" }, - "enterPasswordConfirm": { - "message": "Ingresa tu contraseña para confirmar" + "enterPasswordContinue": { + "message": "Introducir contraseña para seguir" }, "etherscanView": { "message": "Ver la cuenta en Etherscan" }, - "exchangeRate": { - "message": "Tipo de cambio" + "estimatedProcessingTimes": { + "message": "Tiempo Previsto de procesamiento" + }, + "expandView": { + "message": "Ampliar Vista" }, "exportPrivateKey": { "message": "Exportar clave privada" }, - "exportPrivateKeyWarning": { - "message": "Exportar claves privadas bajo TU PROPIO riesgo" - }, "failed": { "message": "Fallo" }, + "fast": { + "message": "Rápido" + }, + "faster": { + "message": "Más Rápido" + }, "fiat": { "message": "FIAT", - "description": "Tipo de cambio" + "description": "Exchange type" }, "fileImportFail": { "message": "¿La importación no funcionó? ¡Haz click aquí!", - "description": "Ayuda al usuario a importar su cuenta desde un archivo JSON" + "description": "Helps user import their account from a JSON file" }, - "followTwitter": { - "message": "Síguenos en Twitter" + "forgetDevice": { + "message": "Olvidar a este dispositivo" }, "from": { "message": "De:" }, - "fromShapeShift": { - "message": "De ShapeShift" - }, - "fromToSame": { - "message": "La dirección de origen y destino no pueden ser la misma" - }, - "gas": { - "message": "Gas", - "description": "Indicación pequeña del costo de gas" - }, - "gasFee": { - "message": "Comisión de gas" + "functionType": { + "message": "Tipo de función" }, "gasLimit": { "message": "Límite de gas" }, - "gasLimitCalculation": { - "message": "Calculamos el límite de gas sugerido en función de las tasas de éxito de la red" - }, - "gasLimitRequired": { - "message": "Límite de gas requerido" - }, "gasLimitTooLow": { "message": "El límite de gas debe ser de al menos 21000" }, + "gasUsed": { + "message": "Gas usado" + }, "gasPrice": { "message": "Precio del Gas (GWEI)" }, - "gasPriceCalculation": { - "message": "Calculamos los precios sugeridos del gas en función de las tasas de éxito de la red" + "gasPriceExtremelyLow": { + "message": "Precio de Gas excesivamente bajo" }, - "gasPriceRequired": { - "message": "Precio del gas requerido" + "gasPriceNoDenom": { + "message": "Precio de Gas" }, - "generatingSeed": { - "message": "Generando semilla..." + "generalSettingsDescription": { + "message": "Conversión de divisas, divisa principal, idioma, blockies identicon" }, "getEther": { "message": "Conseguir Ether" }, "getEtherFromFaucet": { "message": "Obtenga Ether de un faucet (grifo) por $1", - "description": "Muestra el nombre de la red para el faucet (grifo) de Ether" + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "Pedir ayuda." + }, + "hardwareWalletConnected": { + "message": "Se ha conectado el monedero físico" }, - "greaterThanMin": { - "message": "Debe ser mayor o igual a $1", - "description": "helper para ingresar hex como entrada decimal" + "hardwareWallets": { + "message": "Conectarle un monedero físico" + }, + "hardwareWalletsMsg": { + "message": "Seleccionar un monedero físico que quieres usar con MetaMask" + }, + "havingTroubleConnecting": { + "message": "¿Tienes problemas para hacer la conexión?" }, "here": { "message": "Aquí", - "description": "como en -haz click aquí- para más información" + "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, - "hereList": { - "message": "¡¡¡Aquí está una lista!!!" + "hexData": { + "message": "Datos de formato Hex" }, "hide": { "message": "Ocultar" }, - "hideToken": { - "message": "Ocultar token" - }, "hideTokenPrompt": { "message": "¿Ocultar token?" }, - "holdEther": { - "message": "Te permite mantener tus ether y tokens, así como puente para aplicaciones descentralizadas" - }, - "howToDeposit": { - "message": "¿Cómo te gustaria depositar Ether?" + "history": { + "message": "Historial" }, "import": { "message": "Importar", - "description": "Botón para importar una cuenta desde un archivo seleccionado" + "description": "Button to import an account from a selected file" }, "importAccount": { "message": "Importar cuenta" }, - "importAnAccount": { - "message": "Importar una cuenta" + "importAccountMsg": { + "message": "Las cuentas importadas no serán asociadas con tu cuenta original creada con tu MetaMask. Aprende más acerca de importar cuentas." }, - "importDen": { - "message": "Importar DEN existente" + "importWallet": { + "message": "Importar Wallet" }, "imported": { "message": "Importado", - "description": "Estado que muestra que una cuenta ha sido completamente cargada en el llavero" + "description": "status showing that an account has been fully loaded into the keyring" }, - "importAccountMsg": { - "message": "Las cuentas importadas no serán asociadas con tu cuenta original creada con tu MetaMask. Aprende más acerca de importar cuentas." - }, - "info": { - "message": "Información" + "importUsingSeed": { + "message": "Importar usando la frase semilla de la cuenta" }, "infoHelp": { "message": "Informacion y ayuda" }, + "initialTransactionConfirmed": { + "message": "La red confirmó tu transacción inicial. Hazle clic en OK para volver." + }, + "insufficientBalance": { + "message": "Saldo insuficiente." + }, "insufficientFunds": { "message": "Fondos insuficientes" }, @@ -461,96 +466,76 @@ "invalidAddressRecipientNotEthNetwork": { "message": "No es una red ETH, convertirlo a minúscula" }, - "invalidGasParams": { - "message": "Parametros de gas inválidos" - }, "invalidInput": { "message": "Entrada inválida" }, "invalidRPC": { "message": "Invalida URL del RPC" }, - "invalidRequest": { - "message": "Petición inválida" + "invalidBlockExplorerURL": { + "message": "Invalida URL del Block Explorer" }, - "jsonFail": { - "message": "Algo falló. Asegúrate que tu JSON tiene el formato correcto" + "invalidSeedPhrase": { + "message": "Frase semilla no válida." }, "jsonFile": { "message": "Archivo JSON", - "description": "Formato para importar una cuenta" - }, - "knowledgeDataBase": { - "message": "Visita nuestra base de conocimiento" + "description": "format for importing an account" }, "kovan": { "message": "Red de pruebas Kovan" }, - "lessThanMax": { - "message": "Debe ser menor o igual a $1", - "description": "Helper para ingresar hex como decimal" + "learnMore": { + "message": "Más información" + }, + "ledgerAccountRestriction": { + "message": "Hay que hacer uso de tu última cuenta antes de agregarle una nueva." }, "likeToAddTokens": { "message": "¿Te gustaría agregar estos tokens?" }, - "limit": { - "message": "Límite" - }, "links": { "message": "Enlaces" }, + "liveGasPricePredictions": { + "message": "Previsiones en vivo del precio de Gas" + }, "loading": { "message": "Cargando..." }, "loadingTokens": { "message": "Cargando tokens..." }, - "localhost": { - "message": "Localhost 8545" + "loadMore": { + "message": "Cargar Más" }, - "login": { - "message": "Ingresar" - }, - "logout": { + "lock": { "message": "Cerrar sesión" }, - "loose": { - "message": "Suelto" - }, - "loweCaseWords": { - "message": "las frases semilla sólo pueden tener minúsculas" - }, "mainnet": { "message": "Red principal de Ethereum (Main Net)" }, - "max": { - "message": "Max" - }, "message": { "message": "Mensaje" }, "metamaskDescription": { "message": "MetaMask es una identidad segura en Ethereum" }, - "min": { - "message": "Mínimo" - }, - "mustSelectOne": { - "message": "Debe seleccionar al menos un (1) token" + "metamaskVersion": { + "message": "Versión de MetaMask" }, "myAccounts": { "message": "Mis cuentas" }, + "mustSelectOne": { + "message": "Debe seleccionar al menos un (1) token" + }, "needEtherInWallet": { "message": "Para interactuar con una aplicación descentralizada usando MetaMask, necesitas tener Ether en tu billetera" }, "needImportFile": { "message": "Debes seleccionar un archivo para importar", - "description": "El usuario está importando una cuenta y necesita agregar un archivo para continuar" - }, - "needImportPassword": { - "message": "Debes ingresar una contraseña para el archivo seleccionado", - "description": "Contraseña y archivo necesarios para importar una cuenta" + "description": "User is important an account and needs to add a file to continue" }, "negativeETH": { "message": "No se pueden mandar cantidades negativas de ETH" @@ -558,12 +543,18 @@ "networks": { "message": "Redes" }, + "nevermind": { + "message": "Olvídatelo" + }, "newAccount": { "message": "Nueva cuenta" }, "newAccountNumberName": { "message": "Cuenta $1", - "description": "Nombre por defecto de la próxima cuenta a ser creada o pantalla de creación de cuenta" + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "Nuevo Contacto" }, "newContract": { "message": "Nuevo contrato" @@ -571,14 +562,20 @@ "newPassword": { "message": "Nueva contraseña (mínimo [8] caracteres)" }, - "newPassword8Chars": { - "message": "Nueva contraseña (mínimo [8] caracteres)" + "newNetwork": { + "message": "Red Nueva" + }, + "optionalChainId": { + "message": "ChainID (opcional)" + }, + "optionalSymbol": { + "message": "Símbolo (opcional)" }, - "newRPC": { - "message": "Nueva URL del RPC" + "newTotal": { + "message": "Nuevo total" }, - "newRecipient": { - "message": "Nuevo destinatario" + "newTransactionFee": { + "message": "Nueva Comisión por transacción" }, "next": { "message": "Siguiente" @@ -586,634 +583,20 @@ "noAddressForName": { "message": "No se ha establecido ninguna dirección para este nombre" }, - "noDeposits": { - "message": "No hay depósitos recibidos" - }, - "noTransactionHistory": { - "message": "Sin historial de transacciones" + "noConversionRateAvailable": { + "message": "No hay tasa de conversión" }, "noTransactions": { "message": "Sin transacciones" }, - "notStarted": { - "message": "Sin iniciar" - }, - "ok": { - "message": "Ok" + "noWebcamFoundTitle": { + "message": "No se encontró a la webcam" }, - "oldUI": { - "message": "Antigua UI (Interfaz de Usuario)" + "noWebcamFound": { + "message": "No se encontró a la webcam de tu ordenador. Favor de volver a intentar." }, - "oldUIMessage": { - "message": "Regresaste a la antigua UI (Interfaz de Usuario). Puedes regresar a la nueva UI mediante la opcion en la barra desplegable del menu de arriba a la derecha." - }, - "onlySendToEtherAddress": { - "message": "Sólo envía a una dirección de Ethereum" - }, - "or": { - "message": "o", - "description": "opción entre crear o importar una cuenta" - }, - "passwordCorrect": { - "message": "Asegurate que tu contraseña es correcta" - }, - "passwordMismatch": { - "message": "La contraseña no coincide", - "description": "En el proceso de creación de contraseña, los dos campos de contraseña no coincidieron" - }, - "passwordNotLongEnough": { - "message": "La contraseña no es lo suficientemente larga" - }, - "passwordsDontMatch": { - "message": "Las contraseñas no coinciden" - }, - "passwordShort": { - "message": "La contraseña no es lo suficientemente larga", - "description": "En el proceso de creación de contraseña, esta no es lo suficientemente larga para ser segura" - }, - "pastePrivateKey": { - "message": "Pega tu clave privada aqui", - "description": "Para importar una cuenta desde una clave privada" - }, - "pasteSeed": { - "message": "¡Pega tu frase semilla aquí!" - }, - "personalAddressDetected": { - "message": "Dirección personal detectada. Ingresa la dirección del contrato del token" - }, - "pleaseReviewTransaction": { - "message": "Por favor, revisa tu transaccion" - }, - "privacyMsg": { - "message": "Política de privacidad" - }, - "privateKey": { - "message": "Clave privada", - "description": "Selecciona este tupo de archivo para importar una cuenta" - }, - "privateKeyWarning": { - "message": "Advertencia: NUNCA reveles esta clave. Cualquier persona con tus claves privadas puede robar los activos retenidos en tu cuenta" - }, - "privateNetwork": { - "message": "Red privada" - }, - "qrCode": { - "message": "Mostrar codigo QR" - }, - "readMore": { - "message": "Leer más aquí" - }, - "readMore2": { - "message": "Leer más" - }, - "readdToken": { - "message": "Puedes volver a agregar este token en el futuro pinchando sobre 'Agregar token' en el menú de opciones de tu cuenta" - }, - "receive": { - "message": "Recibir" - }, - "recipientAddress": { - "message": "Dirección del receptor" - }, - "refundAddress": { - "message": "Tu dirección de reembolso" - }, - "rejected": { - "message": "Rechazado" - }, - "required": { - "message": "Requerido" - }, - "resetAccount": { - "message": "Reiniciar cuenta" - }, - "restoreFromSeed": { - "message": "Restaurar desde semilla" - }, - "restoreVault": { - "message": "Restaurar bóveda" - }, - "retryWithMoreGas": { - "message": "Vuelva a intentar con un precio de gas más alto aquí" - }, - "revealSeedWords": { - "message": "Revelar palabras de semilla" - }, - "revealSeedWordsWarning": { - "message": "¡No recuperes tu semilla en un lugar pública! Esas palabras pueden ser usadas para robarte todas tus cuentas" - }, - "revert": { - "message": "Revertir" - }, - "rinkeby": { - "message": "Red privada Rinkeby" - }, - "ropsten": { - "message": "Red privada Ropsten" - }, - "sampleAccountName": { - "message": "P.ej. Mi nueva cuenta", - "description": "Ayuda al usuario a entender el concepto de agregar un nombre, leíble por humanos, a su cuenta" - }, - "save": { - "message": "Guardar" - }, - "saveAsFile": { - "message": "Guardar como archivo", - "description": "Proceso de exportación de cuenta" - }, - "saveSeedAsFile": { - "message": "Guardar la semilla como archivo" - }, - "search": { - "message": "Buscar" - }, - "secretPhrase": { - "message": "Ingresa tu frase de doce (12) palabras para restaurar tu bóveda" - }, - "seedPhraseReq": { - "message": "las frases semilla tienen doce (12) palabras de largo" - }, - "select": { - "message": "Seleccionar" - }, - "selectCurrency": { - "message": "Seleccionar moneda" - }, - "selectService": { - "message": "Seleccionar servicio" - }, - "selectType": { - "message": "Seleccionar tipo" - }, - "send": { - "message": "Enviar" - }, - "sendETH": { - "message": "Enviar Ether" - }, - "sendTokens": { - "message": "Enviar tokens" - }, - "sendTokensAnywhere": { - "message": "Enviar tokens a cualquiera con una cuenta de Ethereum" - }, - "settings": { - "message": "Configuración" - }, - "shapeshiftBuy": { - "message": "Comprar con ShapeShift" - }, - "showPrivateKeys": { - "message": "Mostrar claves privadas" - }, - "showQRCode": { - "message": "Mostrar codigo QR" - }, - "sigRequest": { - "message": "Solicitud de firma" - }, - "sigRequested": { - "message": "Firma solicitada" - }, - "sign": { - "message": "Firmar" - }, - "signed": { - "message": "Firmado" - }, - "signMessage": { - "message": "Firmar mensaje" - }, - "signNotice": { - "message": "Firmar este mensaje puede tener\n efectos secundarios peligrosos. Firma sólo\nmensajes desde sitios a los que estés plenamente dispuesto a confiar tu cuenta.\nEste método peligroso va a ser \neliminado en una version futura." - }, - "spaceBetween": { - "message": "Sólo puede haber un espacio entre las palabras" - }, - "stateLogs": { - "message": "Logs de estado" - }, - "stateLogsDescription": { - "message": "Los logs de estado contienen tus direcciones de cuentas públicas y transacciones envíadas" - }, - "stateLogError": { - "message": "Error en la recogida de logs de estado" - }, - "status": { - "message": "Estado" - }, - "submit": { - "message": "Enviar" - }, - "submitted": { - "message": "Enviado" - }, - "supportCenter": { - "message": "Visita nuestro centro de atención" - }, - "symbolBetweenZeroTwelve": { - "message": "Símbolo debe ser entre 0 y 12 caracteres" - }, - "takesTooLong": { - "message": "¿Está tardando demasiado?" - }, - "terms": { - "message": "Términos de uso" - }, - "testFaucet": { - "message": "Probar Faucet" - }, - "to": { - "message": "Para" - }, - "toETHviaShapeShift": { - "message": "$1 a ETH via ShapeShift", - "description": "el sistema llenará el tipo de depósito al principio del mensaje" - }, - "tokenAddress": { - "message": "Dirección del token" - }, - "tokenAlreadyAdded": { - "message": "El token está actualmente agregado" - }, - "tokenBalance": { - "message": "Tu balance de tokens es:" - }, - "tokenSelection": { - "message": "Busca tokens o selecciónalo de nuestra lista de tokens populares" - }, - "tokenSymbol": { - "message": "Símbolo del token" - }, - "tokenWarning1": { - "message": "Mantén un registro de los tokens que has comprado con tu cuenta de MetaMask. Si compraste tokens usando una cuenta diferente, esos tokens no aparecerán aquí." - }, - "total": { - "message": "Total" - }, - "transactionMemo": { - "message": "Memo de transacción (opcional)" - }, - "transactionNumber": { - "message": "Número de transacción" - }, - "transactions": { - "message": "Transacciones" - }, - "transfers": { - "message": "Transferencias" - }, - "troubleTokenBalances": { - "message": "Tuvimos problemas para cargar tus saldos de tokens. Puedes verlos ", - "description": "Seguidos por un enlace (aquí) para ver los saldos de token" - }, - "twelveWords": { - "message": "Estas 12 palabras son la única forma de restablecer tus cuentas de MetaMask. \nGuárdalas en un lugar seguro y secreto." - }, - "typePassword": { - "message": "Escribe tu contraseña" - }, - "uiWelcome": { - "message": "Bienvenido a la nueva UI (Beta)" - }, - "uiWelcomeMessage": { - "message": "Estás usando la nueva UI de MetaMask. Echa un vistazo alrededor, prueba las nuevas características, tales como mandar tokens, y háznos saber si tienes algún problema" - }, - "unavailable": { - "message": "No disponible" - }, - "unapproved": { - "message": "No aprobado" - }, - "unknown": { - "message": "Desconocido (a)" - }, - "unknownNetwork": { - "message": "Red privada desconocida" - }, - "unknownNetworkId": { - "message": "ID (identidad) de red desconocida" - }, - "uriErrorMsg": { - "message": "URI necesita el prefijo HTTP/HTTPS apropiado" - }, - "usaOnly": { - "message": "Sólo USA (Estados Unidos)", - "description": "El uso de este exchange (casa de cambio) está limitado a las personas dentro de los Estados Unidos de América" - }, - "useOldUI": { - "message": "Usar UI antigua" - }, - "usedByClients": { - "message": "Utilizado por una variedad de clientes diferentes" - }, - "validFileImport": { - "message": "Debes selecionar un archivo valido para importar" - }, - "vaultCreated": { - "message": "Bóveda creada" - }, - "viewAccount": { - "message": "Mirar cuenta" - }, - "visitWebSite": { - "message": "Visita nuestro sitio web" - }, - "walletSeed": { - "message": "Semilla de la billetera" - }, - "warning": { - "message": "Advertencia" - }, - "welcome": { - "message": "Bienvenido a MetaMask" - }, - "whatsThis": { - "message": "¿Qué es esto?" - }, - "youSign": { - "message": "Usted está firmando" - }, - "yourSigRequested": { - "message": "Tu firma ya fue solicitada" - }, - "contractInteraction": { - "message": "Interacción con contrato" - }, - "providerRequest": { - "message": "$1 quisiera conectar con tu cuenta" - }, - "acceleratingATransaction": { - "message": "* Agilizar a una transacción al usar un precio de gas más alto aumenta las probabilidades que que la red lo procese más rápidamente, pero eso no siempre está garantizado." - }, - "accessingYourCamera": { - "message": "Accediendo a tu cámara..." - }, - "accountOptions": { - "message": "Opciones de la cuenta" - }, - "accountSelectionRequired": { - "message": "¡Necesitas elegir una cuenta!" - }, - "activityLog": { - "message": "registro de actividades" - }, - "advancedOptions": { - "message": "Opciones Avanzadas" - }, - "addSuggestedTokens": { - "message": "Agregar tokens propuestos" - }, - "addAcquiredTokens": { - "message": "Agregar los tokens que has adquirido usando MetaMask" - }, - "advanced": { - "message": "Avanzado" - }, - "amountPlusTxFee": { - "message": "Cantidad + Comisión por transacción" - }, - "attemptToCancel": { - "message": "¿Intentar cancelar?" - }, - "attemptToCancelDescription": { - "message": "El intentar cancelar la transacción no garantiza la cancelación de la misma. Si el intento de cancelación tiene éxito, se le cobrará la comisión de transacción indicada arriba." - }, - "average": { - "message": "Promedio" - }, - "basic": { - "message": "Básico" - }, - "browserNotSupported": { - "message": "Tu navegador no está admitido..." - }, - "bytes": { - "message": "Bytes" - }, - "cancelAttempt": { - "message": "Intentar cancelar" - }, - "cancellationGasFee": { - "message": "Comisión de Gas por cancelación" - }, - "cancelled": { - "message": "Cancelado" - }, - "cancelN": { - "message": "Cancelar a todas transacciones de $1" - }, - "clickToAdd": { - "message": "Hazle clic en $1 para agregarles a su cuenta" - }, - "close": { - "message": "Cerrar" - }, - "chromeRequiredForHardwareWallets": { - "message": "Hay que usar MetaMask en Google Chrome para poder conectarse con tu Monedero Físico." - }, - "confirmationTime": { - "message": "Tiempo de confirmación (seg)" - }, - "connectHardwareWallet": { - "message": "Conectar Monedero Físico" - }, - "connect": { - "message": "Conectar" - }, - "connectRequest": { - "message": "Petición para conectar" - }, - "connecting": { - "message": "Conectándose..." - }, - "connectingTo": { - "message": "Conectánodse a $1" - }, - "connectToLedger": { - "message": "Conectarse al Ledger" - }, - "connectToTrezor": { - "message": "Conectarse al Trezor" - }, - "copyAddress": { - "message": "Copiar la dirección al portapapeles" - }, - "currentLanguage": { - "message": "Idioma Actual" - }, - "customGasSubTitle": { - "message": "Aumentar la comisión puede hacer que el tiempo de procesamiento se disminuya, pero no lo garantiza." - }, - "customToken": { - "message": "Token Personalizado" - }, - "downloadGoogleChrome": { - "message": "Descargar Google Chrome" - }, - "dontHaveAHardwareWallet": { - "message": "¿No tienes un monedero físico?" - }, - "ensNameNotFound": { - "message": "No se encontró el nombre ENS" - }, - "enterPasswordContinue": { - "message": "Introducir contraseña para seguir" - }, - "eth": { - "message": "ETH" - }, - "estimatedProcessingTimes": { - "message": "Tiempo Previsto de procesamiento" - }, - "expandView": { - "message": "Ampliar Vista" - }, - "fast": { - "message": "Rápido" - }, - "faster": { - "message": "Más Rápido" - }, - "fastest": { - "message": "Lo Mas Rápido" - }, - "feeChartTitle": { - "message": "Previsiones en vivo de las comisiones por transacciones" - }, - "forgetDevice": { - "message": "Olvidar a este dispositivo" - }, - "functionType": { - "message": "Tipo de función" - }, - "gasUsed": { - "message": "Gas usado" - }, - "gasPriceExtremelyLow": { - "message": "Precio de Gas excesivamente bajo" - }, - "gasPriceNoDenom": { - "message": "Precio de Gas" - }, - "generatingTransaction": { - "message": "Generando la transacción" - }, - "getHelp": { - "message": "Pedir ayuda." - }, - "hardware": { - "message": "hardware" - }, - "hardwareWalletConnected": { - "message": "Se ha conectado el monedero físico" - }, - "hardwareWallets": { - "message": "Conectarle un monedero físico" - }, - "hardwareWalletsMsg": { - "message": "Seleccionar un monedero físico que quieres usar con MetaMask" - }, - "havingTroubleConnecting": { - "message": "¿Tienes problemas para hacer la conexión?" - }, - "hexData": { - "message": "Datos de formato Hex" - }, - "history": { - "message": "Historial" - }, - "importUsingSeed": { - "message": "Importar usando la frase semilla de la cuenta" - }, - "initialTransactionConfirmed": { - "message": "La red confirmó tu transacción inicial. Hazle clic en OK para volver." - }, - "insufficientBalance": { - "message": "Saldo insuficiente." - }, - "invalidSeedPhrase": { - "message": "Frase semilla no válida." - }, - "keepTrackTokens": { - "message": "Estar al tanto con los tokens que has comprado a través de tu cuenta de MetaMask." - }, - "learnMore": { - "message": "Más información" - }, - "ledgerAccountRestriction": { - "message": "Hay que hacer uso de tu última cuenta antes de agregarle una nueva." - }, - "liveGasPricePredictions": { - "message": "Previsiones en vivo del precio de Gas" - }, - "menu": { - "message": "Menú" - }, - "metamaskSeedWords": { - "message": "Palabras semilla de MetaMask" - }, - "metamaskVersion": { - "message": "Versión de MetaMask" - }, - "missingYourTokens": { - "message": "¿No ves tus tokens?" - }, - "minutesShorthand": { - "message": "Min" - }, - "nevermind": { - "message": "Olvídatelo" - }, - "newNetwork": { - "message": "Red Nueva" - }, - "rpcURL": { - "message": "Nuevo URL de RPC" - }, - "showAdvancedOptions": { - "message": "Mostrar opciones avanzadas" - }, - "hideAdvancedOptions": { - "message": "Ocultar opciones avanzadas" - }, - "optionalChainId": { - "message": "ChainID (opcional)" - }, - "optionalSymbol": { - "message": "Símbolo (opcional)" - }, - "optionalNickname": { - "message": "Apodo (opcional)" - }, - "newTotal": { - "message": "Nuevo total" - }, - "newTransactionFee": { - "message": "Nueva Comisión por transacción" - }, - "noConversionRateAvailable": { - "message": "No hay tasa de conversión" - }, - "notFound": { - "message": "No se encontró" - }, - "noWebcamFoundTitle": { - "message": "No se encontró a la webcam" - }, - "noWebcamFound": { - "message": "No se encontró a la webcam de tu ordenador. Favor de volver a intentar." - }, - "ofTextNofM": { - "message": "de" - }, - "onlySendTokensToAccountAddress": { - "message": "Mandar solamente $1 a la dirección de una cuenta de Ethereum.", - "description": "muestra el símbolo del token" - }, - "openInTab": { - "message": "Abrir en una pestaña" + "ofTextNofM": { + "message": "de" }, "orderOneHere": { "message": "Comprate un Trezor o Ledger y guarda tus fondos en almacenamiento frío" @@ -1221,26 +604,27 @@ "origin": { "message": "Orígen" }, - "outgoing": { - "message": "De salida" - }, "parameters": { "message": "Parámetros" }, - "originalTotal": { - "message": "Total Original" - }, "password": { "message": "Contraseña" }, + "passwordsDontMatch": { + "message": "Las contraseñas no coinciden" + }, + "passwordNotLongEnough": { + "message": "La contraseña no es lo suficientemente larga" + }, + "pastePrivateKey": { + "message": "Pega tu clave privada aqui", + "description": "For importing an account from a private key" + }, "pending": { "message": "pendiente" - }, - "popularTokens": { - "message": "Tokens Corrientes" }, - "prev": { - "message": "Prev" + "personalAddressDetected": { + "message": "Dirección personal detectada. Ingresa la dirección del contrato del token" }, "primaryCurrencySetting": { "message": "Moneda principal" @@ -1248,9 +632,31 @@ "primaryCurrencySettingDescription": { "message": "Seleccionar nativa para prioritizar el que se muestren los valores en la moneda nativa de la cadena (p.ej. ETH). Seleccionar Fíat para prioritzar el que se muestren los valores en la moneda fíat seleccionada." }, + "privacyMsg": { + "message": "Política de privacidad" + }, + "privateKey": { + "message": "Clave privada", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "Advertencia: NUNCA reveles esta clave. Cualquier persona con tus claves privadas puede robar los activos retenidos en tu cuenta" + }, + "privateNetwork": { + "message": "Red privada" + }, "queue": { "message": "Cola" }, + "readdToken": { + "message": "Puedes volver a agregar este token en el futuro pinchando sobre 'Agregar token' en el menú de opciones de tu cuenta" + }, + "recents": { + "message": "Recientes" + }, + "recipientAddress": { + "message": "Dirección del receptor" + }, "rejectAll": { "message": "Rechazar todas" }, @@ -1260,21 +666,36 @@ "rejectTxsDescription": { "message": "Está al punto de rechazar transacciones de $1 en lote." }, + "rejected": { + "message": "Rechazado" + }, "reset": { "message": "Reiniciar" }, + "resetAccount": { + "message": "Reiniciar cuenta" + }, "resetAccountDescription": { "message": "Reiniciar tu cuenta borrará tu historial de transacciones." }, + "restoreFromSeed": { + "message": "Restaurar desde semilla" + }, "restoreAccountWithSeed": { "message": "Restaurar tu Cuenta con Frase Semilla" }, "requestsAwaitingAcknowledgement": { "message": "peticiones pendientes de reconocimiento" }, + "required": { + "message": "Requerido" + }, "restore": { "message": "Restaurar" }, + "revealSeedWords": { + "message": "Revelar palabras de semilla" + }, "revealSeedWordsTitle": { "message": "Frase semilla" }, @@ -1284,6 +705,9 @@ "revealSeedWordsWarningTitle": { "message": "NO compartas esta frase con nadie!" }, + "revealSeedWordsWarning": { + "message": "¡No recuperes tu semilla en un lugar pública! Esas palabras pueden ser usadas para robarte todas tus cuentas" + }, "remove": { "message": "borrar" }, @@ -1296,8 +720,14 @@ "readyToConnect": { "message": "¿Listo/a para conectar?" }, - "rpc": { - "message": "RPC Personalizado" + "rinkeby": { + "message": "Red privada Rinkeby" + }, + "ropsten": { + "message": "Red privada Ropsten" + }, + "save": { + "message": "Guardar" }, "slow": { "message": "Lento" @@ -1314,18 +744,42 @@ "scanQrCode": { "message": "Escanear código QR" }, + "search": { + "message": "Buscar" + }, "searchResults": { "message": "Resultados de la Búsqueda" }, - "secondsShorthand": { - "message": "Seg" + "secretPhrase": { + "message": "Ingresa tu frase de doce (12) palabras para restaurar tu bóveda" + }, + "seedPhrasePlaceholder": { + "message": "Separar a cada palabra con un sólo espacio" + }, + "seedPhraseReq": { + "message": "las frases semilla tienen doce (12) palabras de largo" + }, + "selectCurrency": { + "message": "Seleccionar moneda" }, "selectLocale": { "message": "Seleccionar local" }, + "selectType": { + "message": "Seleccionar tipo" + }, + "send": { + "message": "Enviar" + }, "sendAmount": { "message": "Mandar cantidad" }, + "sendETH": { + "message": "Enviar Ether" + }, + "sendTokens": { + "message": "Enviar tokens" + }, "sentEther": { "message": "se mandó ether" }, @@ -1338,9 +792,6 @@ "searchTokens": { "message": "Buscar Tokens" }, - "selectAnAddress": { - "message": "Seleccionar una Dirección" - }, "selectAnAccount": { "message": "Seleccionar una Cuenta" }, @@ -1356,27 +807,39 @@ "selectPathHelp": { "message": "Si no ves tus cuentas actuales de Ledger abajo, prueba cambiando la ruta a \"Legacy (MEW / MyCrypto)\"" }, + "settings": { + "message": "Configuración" + }, + "showPrivateKeys": { + "message": "Mostrar claves privadas" + }, "showHexData": { "message": "Mostrar Datos en formato Hex" }, "showHexDataDescription": { "message": "Seleccionar esto para mostrar el campo de los datos en formato hex en la pantalla de mandar" }, + "sign": { + "message": "Firmar" + }, "signatureRequest": { "message": "Petición de Firma" }, + "signed": { + "message": "Firmado" + }, + "signNotice": { + "message": "Firmar este mensaje puede tener\n efectos secundarios peligrosos. Firma sólo\nmensajes desde sitios a los que estés plenamente dispuesto a confiar tu cuenta.\nEste método peligroso va a ser \neliminado en una version futura." + }, + "sigRequest": { + "message": "Solicitud de firma" + }, "somethingWentWrong": { "message": "¡Ups! Algo funcionó mal." }, "speedUp": { "message": "Agilizar" }, - "speedUpTitle": { - "message": "Agilizar la Transacción" - }, - "speedUpSubtitle": { - "message": "Aumenta el precio de gas para intentar sobrescribir y así agilizar a la transacción" - }, "speedUpCancellation": { "message": "Agilizar esta cancelación" }, @@ -1386,6 +849,15 @@ "switchNetworks": { "message": "Cambiar de Red" }, + "stateLogs": { + "message": "Logs de estado" + }, + "stateLogsDescription": { + "message": "Los logs de estado contienen tus direcciones de cuentas públicas y transacciones envíadas" + }, + "stateLogError": { + "message": "Error en la recogida de logs de estado" + }, "step1HardwareWallet": { "message": "1. Conectar monedero físico." }, @@ -1404,8 +876,35 @@ "step3HardwareWalletMsg": { "message": "Usa tu cuenta física igual que harías con cualquier cuenta de Ethereum. Regístrate con dApps, manda Eth, compra y almacena tokens de ERC20 y otros tokens no-fungibles, como CryptoKitties." }, - "token": { - "message": "Token" + "submitted": { + "message": "Enviado" + }, + "supportCenter": { + "message": "Visita nuestro centro de atención" + }, + "symbolBetweenZeroTwelve": { + "message": "El símbolo debe tener 11 caracteres o menos." + }, + "syncWithMobile": { + "message": "Sincronizar con el móvil" + }, + "syncWithMobileTitle": { + "message": "Sincronizar con el móvil" + }, + "terms": { + "message": "Términos de uso" + }, + "testFaucet": { + "message": "Probar Faucet" + }, + "to": { + "message": "Para" + }, + "tokenAlreadyAdded": { + "message": "El token está actualmente agregado" + }, + "tokenSymbol": { + "message": "Símbolo del token" }, "transaction": { "message": "transacción" @@ -1416,9 +915,6 @@ "transactionCreated": { "message": "Se creó una transacción con un valor de $1, a $2." }, - "transactionWithNonce": { - "message": "Transacción $1" - }, "transactionDropped": { "message": "Transacción se cayó en $2." }, @@ -1431,9 +927,6 @@ "transactionUpdated": { "message": "Se actualizó la transacción en $2." }, - "transactionUpdatedGas": { - "message": "Se actualizó la transacción, con una comisión de gas de $1 en $2." - }, "transactionErrored": { "message": "La transacción tuvo un error." }, @@ -1461,15 +954,28 @@ "transferFrom": { "message": "Traspasar de" }, - "trezorHardwareWallet": { - "message": "Monedero físico TREZOR" + "troubleTokenBalances": { + "message": "Tuvimos problemas para cargar tus saldos de tokens. Puedes verlos ", + "description": "Followed by a link (here) to view token balances" }, "tryAgain": { "message": "Vuelve a intentar" }, + "typePassword": { + "message": "Escribe tu contraseña" + }, + "unapproved": { + "message": "No aprobado" + }, "units": { "message": "unidades" }, + "unknown": { + "message": "Desconocido (a)" + }, + "unknownNetwork": { + "message": "Red privada desconocida" + }, "unknownQrCode": { "message": "Error: No pudimos identificar ese código QR" }, @@ -1488,28 +994,46 @@ "updatedWithDate": { "message": "Actualizado $1" }, + "urlErrorMsg": { + "message": "URI necesita el prefijo HTTP/HTTPS apropiado" + }, + "usedByClients": { + "message": "Utilizado por una variedad de clientes diferentes" + }, + "viewAccount": { + "message": "Mirar cuenta" + }, "viewOnEtherscan": { "message": "Ver en Etherscan" }, + "visitWebSite": { + "message": "Visita nuestro sitio web" + }, + "walletSeed": { + "message": "Semilla de la billetera" + }, "welcomeBack": { "message": "¡Bienvenido de nuevo!" }, + "welcome": { + "message": "Bienvenido a MetaMask" + }, "yesLetsTry": { "message": "Sí, probemos" }, "youNeedToAllowCameraAccess": { "message": "Tienes que permitir acceso a la cámara para usar esta función." }, + "yourSigRequested": { + "message": "Tu firma ya fue solicitada" + }, + "youSign": { + "message": "Usted está firmando" + }, "yourPrivateSeedPhrase": { "message": "Tu frase semilla privada" }, "zeroGasPriceOnSpeedUpError": { - "message":"No hubo precio de gas al agilizar" - }, - "currencyConversion": { - "message": "Cambio de Monedas" - }, - "editingTransaction": { - "message": "Hacer cambios a tu transacción" + "message": "No hubo precio de gas al agilizar" } } diff --git a/app/_locales/es_419/messages.json b/app/_locales/es_419/messages.json new file mode 100644 index 000000000000..a856b7e8826b --- /dev/null +++ b/app/_locales/es_419/messages.json @@ -0,0 +1,1289 @@ +{ + "chartOnlyAvailableEth": { + "message": "Chart está disponible únicamente en las redes de Ethereum." + }, + "contractInteraction": { + "message": "Interacción contractual" + }, + "reject": { + "message": "Rechazar" + }, + "about": { + "message": "Acerca de" + }, + "aboutSettingsDescription": { + "message": "Versión, centro de soporte técnico e información de contacto" + }, + "acceleratingATransaction": { + "message": "* Aumentar una transacción utilizando un precio de gas más alto aumenta sus posibilidades de ser procesada más rápido por la red, pero esto no siempre está garantizado." + }, + "accessingYourCamera": { + "message": "Accediendo a la cámara…" + }, + "account": { + "message": "Cuenta" + }, + "accountDetails": { + "message": "Detalles de la cuenta" + }, + "accountName": { + "message": "Nombre de la cuenta" + }, + "accountOptions": { + "message": "Opciones de cuenta" + }, + "accountSelectionRequired": { + "message": "¡Tienes que seleccionar una cuenta!" + }, + "activityLog": { + "message": "registro de actividad" + }, + "addNetwork": { + "message": "Añadir red" + }, + "addRecipient": { + "message": "Agregar destinatario" + }, + "advanced": { + "message": "Avanzada" + }, + "advancedSettingsDescription": { + "message": "Accede a las funciones de desarrollador, descarga los registros de estado, restablece la cuenta, y configura las redes Testnet y el RPC personalizado" + }, + "advancedOptions": { + "message": "Opciones avanzadas" + }, + "addToAddressBook": { + "message": "Agregar a la libreta de direcciones" + }, + "addToAddressBookModalPlaceholder": { + "message": "P. ej.: Juan García" + }, + "addAlias": { + "message": "Agregar alias" + }, + "addToken": { + "message": "Agregar token" + }, + "addTokens": { + "message": "Agregar tokens" + }, + "addSuggestedTokens": { + "message": "Agregar los tokens sugeridos" + }, + "addAcquiredTokens": { + "message": "Agrega los tokens adquiridos con MetaMask" + }, + "amount": { + "message": "Monto" + }, + "appDescription": { + "message": "Una billetera de Ethereum en tu navegador", + "description": "The description of the application" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "approve": { + "message": "Aprobar" + }, + "approved": { + "message": "Aprobados" + }, + "asset": { + "message": "Activo" + }, + "attemptingConnect": { + "message": "Tratar de conectarse a blockchain." + }, + "attemptToCancel": { + "message": "¿Intentas cancelar?" + }, + "attemptToCancelDescription": { + "message": "Este intento no garantiza que se cancele tu transacción original. Si el intento de cancelación es exitoso, se te cobrará la tasa de transacción que se muestra arriba." + }, + "attributions": { + "message": "Atribuciones" + }, + "autoLockTimeLimit": { + "message": "Temporizador de cierre de sesión automático (minutos)" + }, + "autoLockTimeLimitDescription": { + "message": "Configura tu tiempo de inactividad en minutos para controlar cuándo MetaMask cerrará tu sesión de forma automática" + }, + "average": { + "message": "Promedio" + }, + "back": { + "message": "Atrás" + }, + "backToAll": { + "message": "Volver a Todos" + }, + "backupApprovalNotice": { + "message": "Haz una copia de seguridad de tu código de recuperación secreto para mantener la seguridad de la billetera y los fondos." + }, + "backupApprovalInfo": { + "message": "Este código secreto es necesario para recuperar tu billetera en caso de que pierdas tu dispositivo, olvides la contraseña, tengas que reinstalar MetaMask o quieras acceder a tu billetera desde otro dispositivo." + }, + "backupNow": { + "message": "Hacer copia de seguridad ahora" + }, + "balance": { + "message": "Saldo" + }, + "balanceOutdated": { + "message": "El saldo puede estar anticuado" + }, + "basic": { + "message": "Básicas" + }, + "blockExplorerUrl": { + "message": "Bloquear Explorer" + }, + "blockExplorerView": { + "message": "Ver cuenta en $1", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "Utilizar blockies identicon" + }, + "browserNotSupported": { + "message": "Tu navegador no es compatible…" + }, + "builtInCalifornia": { + "message": "MetaMask se diseñó y creó en California." + }, + "buyWithWyre": { + "message": "Comprar ETH con Wyre" + }, + "buyWithWyreDescription": { + "message": "Wyre te permite utilizar una tarjeta de crédito para depositar ETH directamente en su cuenta de MetaMask." + }, + "buyCoinSwitch": { + "message": "Comprar en CoinSwitch" + }, + "buyCoinSwitchExplainer": { + "message": "CoinSwitch es un destino integral para intercambiar más de 300 tipos de criptomonedas con la mejor tasa." + }, + "off": { + "message": "Desactivado" + }, + "ok": { + "message": "Aceptar" + }, + "on": { + "message": "Activada" + }, + "optionalBlockExplorerUrl": { + "message": "Bloquear la URL de Explorer (opcional)" + }, + "cancel": { + "message": "Cancelar" + }, + "cancelAttempt": { + "message": "Cancelar intento" + }, + "cancellationGasFee": { + "message": "Tasa de cancelación de gas" + }, + "cancelled": { + "message": "Cancelado" + }, + "chainId": { + "message": "ID de cadena" + }, + "clickToRevealSeed": { + "message": "Haz clic aquí para mostrar las palabras secretas" + }, + "close": { + "message": "Cerrar" + }, + "chromeRequiredForHardwareWallets": { + "message": "Debes utilizar MetaMask en Google Chrome para poder conectarte a tu billetera de hardware." + }, + "confirm": { + "message": "Confirmar" + }, + "confirmed": { + "message": "Confirmado" + }, + "confirmPassword": { + "message": "Confirmar contraseña" + }, + "confirmSecretBackupPhrase": { + "message": "Confirma tu frase de copia de seguridad secreta" + }, + "congratulations": { + "message": "Felicitaciones" + }, + "connectHardwareWallet": { + "message": "Conectar billetera de hardware" + }, + "connect": { + "message": "Conectar" + }, + "connectingTo": { + "message": "Conexión con $1" + }, + "connectingToKovan": { + "message": "Conexión con la red de prueba Kovan" + }, + "connectingToMainnet": { + "message": "Conexión con la red principal de Ethereum" + }, + "connectingToRopsten": { + "message": "Conexión con la red de prueba Ropsten" + }, + "connectingToRinkeby": { + "message": "Conexión con la red de prueba Rinkeby" + }, + "connectingToLocalhost": { + "message": "Conexión con Localhost 8545" + }, + "connectingToGoerli": { + "message": "Conexión con la red de prueba Goerli" + }, + "continueToWyre": { + "message": "Continuar a Wyre" + }, + "continueToCoinSwitch": { + "message": "Continuar a CoinSwitch" + }, + "contractDeployment": { + "message": "Despliegue de contratos" + }, + "copiedExclamation": { + "message": "Copiado" + }, + "copyAddress": { + "message": "Copiar la dirección al portapapeles" + }, + "copyTransactionId": { + "message": "Copiar ID de transacción" + }, + "copiedTransactionId": { + "message": "Se ha copiado la ID de transacción" + }, + "copyToClipboard": { + "message": "Copiar al portapapeles" + }, + "copyPrivateKey": { + "message": "Esta es tu clave privada (haz clic para copiar)" + }, + "create": { + "message": "Crear" + }, + "createAccount": { + "message": "Crear cuenta" + }, + "createAWallet": { + "message": "Crear una billetera" + }, + "createPassword": { + "message": "Crear contraseña" + }, + "currencyConversion": { + "message": "Conversión de moneda" + }, + "currentLanguage": { + "message": "Idioma actual" + }, + "customGas": { + "message": "Personalizar gas" + }, + "customGasSubTitle": { + "message": "El aumento de la tasa puede disminuir los tiempos de procesamiento, pero no está garantizado." + }, + "customToken": { + "message": "Token personalizado" + }, + "customRPC": { + "message": "RPC personalizado" + }, + "decimalsMustZerotoTen": { + "message": "Los decimales deben ser mayores a 0 y menores a 36." + }, + "decimal": { + "message": "Decimales de precisión" + }, + "defaultNetwork": { + "message": "La red predeterminada para las transacciones de Ethers es Main Net." + }, + "delete": { + "message": "Borrar" + }, + "deleteAccount": { + "message": "Borrar cuenta" + }, + "deposit": { + "message": "Depósito" + }, + "depositEther": { + "message": "Depositar Ethers" + }, + "details": { + "message": "Detalles" + }, + "directDepositEther": { + "message": "Depósito directo de Ethers" + }, + "directDepositEtherExplainer": { + "message": "Si ya tienes algunos Ethers, la forma más rápida de ingresarlos en tu nueva billetera es a través de un depósito directo." + }, + "done": { + "message": "Listo" + }, + "downloadGoogleChrome": { + "message": "Descargar Google Chrome" + }, + "downloadSecretBackup": { + "message": "Descarga esta frase de copia de seguridad secreta y guárdala de forma segura en un disco duro externo cifrado o en algún medio de almacenamiento." + }, + "downloadStateLogs": { + "message": "Descargar registros de estado" + }, + "dontHaveAHardwareWallet": { + "message": "¿No tienes una billetera de hardware?" + }, + "dropped": { + "message": "Descartado" + }, + "edit": { + "message": "Editar" + }, + "editContact": { + "message": "Editar contacto" + }, + "endOfFlowMessage1": { + "message": "Pasaste la prueba. Es responsabilidad tuya mantener la frase de inicialización segura." + }, + "endOfFlowMessage2": { + "message": "Consejos para almacenar de forma segura" + }, + "endOfFlowMessage3": { + "message": "Guarda una copia de seguridad en varios lugares." + }, + "endOfFlowMessage4": { + "message": "Nunca compartas tu frase con nadie." + }, + "endOfFlowMessage5": { + "message": "¡Cuidado con las suplantaciones de identidad! MetaMask no te pedirá nunca tu frase de inicialización de forma espontánea." + }, + "endOfFlowMessage6": { + "message": "Si necesitas otra copia de seguridad de tu frase de inicialización, puedes encontrarla en Configuración -> Seguridad." + }, + "endOfFlowMessage7": { + "message": "Si tienes preguntas o ves algo sospechoso, envía un correo electrónico a support@metamask.io." + }, + "endOfFlowMessage8": { + "message": "MetaMask no puede recuperar tu frase de inicialización. Obtén más información." + }, + "endOfFlowMessage9": { + "message": "Más información." + }, + "endOfFlowMessage10": { + "message": "Todo listo" + }, + "ensRegistrationError": { + "message": "Error en el registro de nombres de ENS" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "No se pudo encontrar el nombre de ENS en la red actual. Intenta cambiar a la red principal de Ethereum." + }, + "enterAnAlias": { + "message": "Ingresa un alias" + }, + "enterPassword": { + "message": "Ingresa la contraseña" + }, + "enterPasswordContinue": { + "message": "Ingresa tu contraseña para continuar" + }, + "ethereumPublicAddress": { + "message": "Dirección pública de Ethereum" + }, + "etherscanView": { + "message": "Ver cuenta en Etherscan" + }, + "estimatedProcessingTimes": { + "message": "Tiempo estimado de procesamiento" + }, + "expandView": { + "message": "Expandir vista" + }, + "exportPrivateKey": { + "message": "Exportar clave privada" + }, + "failed": { + "message": "Error" + }, + "fast": { + "message": "Rápido" + }, + "faster": { + "message": "Más rápido" + }, + "fiat": { + "message": "Dinero fiduciario", + "description": "Exchange type" + }, + "fileImportFail": { + "message": "¿No puedes importar archivos? ¡Haz clic aquí!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "Olvidar este dispositivo" + }, + "from": { + "message": "De" + }, + "functionType": { + "message": "Tipo de función" + }, + "gasLimit": { + "message": "Limite de gas" + }, + "gasLimitInfoModalContent": { + "message": "El límite de gas es la cantidad máxima de unidades de gas que estás dispuesto a gastar." + }, + "gasLimitTooLow": { + "message": "El límite de gas debe ser de al menos 21 000" + }, + "gasUsed": { + "message": "Gas usado" + }, + "gasPrice": { + "message": "Precio del gas (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "El precio del gas es extremadamente bajo" + }, + "gasPriceInfoModalContent": { + "message": "El precio del gas especifica la cantidad de Ethers que estás dispuesto a pagar por cada unidad de gas." + }, + "gasPriceNoDenom": { + "message": "Precio del gas" + }, + "generalSettingsDescription": { + "message": "Conversión de moneda, moneda principal, idioma, blockies identicon" + }, + "getEther": { + "message": "Obtener Ethers" + }, + "getEtherFromFaucet": { + "message": "Obtener Ethers a partir de un grifo para $1", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "Obtén ayuda." + }, + "getStarted": { + "message": "Comenzar" + }, + "happyToSeeYou": { + "message": "Estamos encantados de verte." + }, + "hardwareWalletConnected": { + "message": "Billetera de hardware conectada" + }, + "hardwareWallets": { + "message": "Conectar una billetera de hardware" + }, + "hardwareWalletsMsg": { + "message": "Selecciona la billetera de hardware que te gustaría utilizar con MetaMask" + }, + "havingTroubleConnecting": { + "message": "¿Problemas de conexión?" + }, + "here": { + "message": "aquí", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hexData": { + "message": "Datos hexadecimales" + }, + "hide": { + "message": "Ocultar" + }, + "hideTokenPrompt": { + "message": "¿Ocultar token?" + }, + "history": { + "message": "Historial" + }, + "import": { + "message": "Importar", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "Importar cuenta" + }, + "importAccountMsg": { + "message": "Las cuentas importadas no estarán asociadas a la frase de inicialización que se creó en un principio para tu cuenta de MetaMask. Obtén más información sobre las cuentas importadas" + }, + "importAccountSeedPhrase": { + "message": "Importar una cuenta con frase de inicialización" + }, + "importWallet": { + "message": "Importar billetera" + }, + "importYourExisting": { + "message": "Importa tu billetera existente con una frase de inicialización de 12 palabras" + }, + "imported": { + "message": "Importado", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "Importar usando la frase de inicialización de la cuenta" + }, + "infoHelp": { + "message": "Información y ayuda" + }, + "initialTransactionConfirmed": { + "message": "La red ha confirmado tu transacción inicial. Haz clic en Aceptar para volver." + }, + "insufficientBalance": { + "message": "Saldo insuficiente." + }, + "insufficientFunds": { + "message": "Fondos insuficientes." + }, + "insufficientTokens": { + "message": "Tokens insuficientes." + }, + "invalidAddress": { + "message": "Dirección no válida" + }, + "invalidAddressRecipient": { + "message": "La dirección del destinatario no es válida" + }, + "knownAddressRecipient": { + "message": "Dirección de contrato conocida." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "No existe la red ETH, utilice minúsculas" + }, + "invalidInput": { + "message": "Ingreso no válido." + }, + "invalidRPC": { + "message": "RPC de URL no válido" + }, + "invalidBlockExplorerURL": { + "message": "Block Explorer de URL no válido" + }, + "invalidSeedPhrase": { + "message": "Frase de inicialización no válida" + }, + "jsonFile": { + "message": "Archivo JSON", + "description": "format for importing an account" + }, + "kovan": { + "message": "Red de prueba Kovan" + }, + "max": { + "message": "Máx." + }, + "learnMore": { + "message": "Más información" + }, + "ledgerAccountRestriction": { + "message": "Necesitas utilizar tu cuenta anterior para agregar una nueva." + }, + "letsGoSetUp": { + "message": "¡Eso, pongámonos en marcha!" + }, + "likeToAddTokens": { + "message": "¿Te gustaría agregar estos tokens?" + }, + "links": { + "message": "Enlaces" + }, + "liveGasPricePredictions": { + "message": "Predicciones del precio del gas en vivo" + }, + "loading": { + "message": "Cargando..." + }, + "loadingTokens": { + "message": "Cargando tokens…" + }, + "loadMore": { + "message": "Cargar más" + }, + "lock": { + "message": "Cerrar sesión" + }, + "mainnet": { + "message": "Red principal de Ethereum" + }, + "memorizePhrase": { + "message": "Memoriza esta frase." + }, + "message": { + "message": "Mensaje" + }, + "metamaskDescription": { + "message": "Te estamos conectando a Ethereum y a la web descentralizada." + }, + "metamaskVersion": { + "message": "Versión de MetaMask" + }, + "mobileSyncText": { + "message": "Ingresa tu contraseña para confirmar que eres tú." + }, + "myAccounts": { + "message": "Mis cuentas" + }, + "myWalletAccounts": { + "message": "Las cuentas de mi billetera" + }, + "myWalletAccountsDescription": { + "message": "Todas tus cuentas creadas en MetaMask se agregarán automáticamente a esta sección." + }, + "mustSelectOne": { + "message": "Se debe seleccionar al menos 1 token." + }, + "needEtherInWallet": { + "message": "Necesitarás tener Ethers en tu billetera para poder interactuar con aplicaciones descentralizadas a través de MetaMask." + }, + "needImportFile": { + "message": "Selecciona un archivo para importar.", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "No se pueden enviar montos negativos de ETH." + }, + "networkName": { + "message": "Nombre de la red" + }, + "networks": { + "message": "Redes" + }, + "networkSettingsDescription": { + "message": "Agregar y editar redes RPC personalizadas" + }, + "nevermind": { + "message": "No importa" + }, + "newAccount": { + "message": "Nueva cuenta" + }, + "newAccountDetectedDialogMessage": { + "message": "¡Se detectó una nueva dirección! Haz clic aquí para agregarla a tu libreta de direcciones." + }, + "newAccountNumberName": { + "message": "Cuenta $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "Nuevo contacto" + }, + "newContract": { + "message": "Nuevo contrato" + }, + "newPassword": { + "message": "Nueva contraseña (mín. 8 caracteres)" + }, + "newNetwork": { + "message": "Nueva red" + }, + "newToMetaMask": { + "message": "¿Nuevo en MetaMask?" + }, + "noAlreadyHaveSeed": { + "message": "No, ya tengo una frase de inicialización" + }, + "protectYourKeys": { + "message": "¡Protege tus claves!" + }, + "protectYourKeysMessage1": { + "message": "Ten cuidado con tu frase de inicialización: hay informes sobre sitios web que intentan hacerse pasar por MetaMask. ¡MetaMask no te pedirá nunca tu frase de inicialización!" + }, + "protectYourKeysMessage2": { + "message": "Mantén tu frase segura. Si notas algo raro o si no está seguro sobre si usar algún sitio web en específico, envíanos un correo electrónico a support@metamask.io" + }, + "rpcUrl": { + "message": "Nueva URL de RPC" + }, + "optionalChainId": { + "message": "ID de cadena (opcional)" + }, + "optionalSymbol": { + "message": "Símbolo (opcional)" + }, + "newTotal": { + "message": "Nuevo total" + }, + "newTransactionFee": { + "message": "Nueva tasa de transacción" + }, + "next": { + "message": "Siguiente" + }, + "noAddressForName": { + "message": "No se ha establecido ninguna dirección para este nombre." + }, + "noConversionRateAvailable": { + "message": "No hay ninguna tasa de conversión disponible" + }, + "noTransactions": { + "message": "No tienes transacciones" + }, + "notEnoughGas": { + "message": "No tienes suficiente gas" + }, + "noWebcamFoundTitle": { + "message": "No se encuentra la cámara web" + }, + "noWebcamFound": { + "message": "No se encontró la cámara web de tu computadora. Vuelve a intentarlo." + }, + "ofTextNofM": { + "message": "de" + }, + "orderOneHere": { + "message": "Pida una billetera Trezor o Ledger y mantenga sus fondos en un almacenamiento en frío" + }, + "origin": { + "message": "Origen" + }, + "parameters": { + "message": "Parámetros" + }, + "participateInMetaMetrics": { + "message": "Participar en MetaMetrics" + }, + "participateInMetaMetricsDescription": { + "message": "Participa en MetaMetrics para ayudarnos a mejorar MetaMask" + }, + "password": { + "message": "Contraseña" + }, + "passwordsDontMatch": { + "message": "Las contraseñas no coinciden" + }, + "passwordNotLongEnough": { + "message": "La contraseña no es lo suficientemente larga" + }, + "pastePrivateKey": { + "message": "Copia y pega tu cadena de claves privada aquí:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "pendiente" + }, + "personalAddressDetected": { + "message": "Dirección personal detectada. Ingresa la dirección de contrato del token." + }, + "prev": { + "message": "Ant" + }, + "primaryCurrencySetting": { + "message": "Moneda principal" + }, + "primaryCurrencySettingDescription": { + "message": "Selecciona \"moneda nativa\" para que se muestren primero los valores en la moneda nativa de la cadena (p. ej., ETH). Selecciona \"dinero fiduciario\" para que se muestren primero los valores en la moneda fiduciaria que seleccionaste." + }, + "privacyMsg": { + "message": "Política de privacidad" + }, + "privateKey": { + "message": "Clave privada", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "Advertencia: Nunca reveles esta clave. Cualquier persona con acceso a tus claves privadas puede robar cualquier activo que se encuentre en tu cuenta." + }, + "privateNetwork": { + "message": "Red privada" + }, + "queue": { + "message": "Cola" + }, + "readdToken": { + "message": "Puedes volver a agregar este token a través de la opción \"Agregar token\" en el menú de opciones de tus cuentas." + }, + "recents": { + "message": "Recientes" + }, + "recipientAddress": { + "message": "Dirección del destinatario" + }, + "recipientAddressPlaceholder": { + "message": "Buscar, dirección pública (0x) o ENS" + }, + "rejectAll": { + "message": "Rechazar todo" + }, + "rejectTxsN": { + "message": "Rechazar las transacciones de $1" + }, + "rejectTxsDescription": { + "message": "Estás a punto de rechazar todas las transacciones de $1." + }, + "rejected": { + "message": "Rechazada" + }, + "reset": { + "message": "Restablecer" + }, + "resetAccount": { + "message": "Restablecer cuenta" + }, + "resetAccountDescription": { + "message": "Si restableces tu cuenta, se eliminará el historial de transacciones." + }, + "deleteNetwork": { + "message": "¿Eliminar red?" + }, + "deleteNetworkDescription": { + "message": "¿Estás seguro de que deseas borrar esta red?" + }, + "remindMeLater": { + "message": "Recordármelo más tarde" + }, + "restoreFromSeed": { + "message": "¿Restaurar cuenta?" + }, + "restoreAccountWithSeed": { + "message": "Restaura tu cuenta con la frase de inicialización" + }, + "requestsAwaitingAcknowledgement": { + "message": "solicitudes pendientes de reconocimiento" + }, + "required": { + "message": "Obligatorio" + }, + "restore": { + "message": "Restaurar" + }, + "revealSeedWords": { + "message": "Mostrar las palabras de inicialización" + }, + "revealSeedWordsTitle": { + "message": "Frase de inicialización" + }, + "revealSeedWordsDescription": { + "message": "Si cambias de navegador o computadora, necesitarás esta frase de inicialización para acceder a tus cuentas. Guárdalas en un lugar seguro y secreto." + }, + "revealSeedWordsWarningTitle": { + "message": "¡No comparta esta frase con nadie!" + }, + "revealSeedWordsWarning": { + "message": "Alguien podría utilizar estas palabras para robar todas tus cuentas." + }, + "remove": { + "message": "Quitar" + }, + "removeAccount": { + "message": "Eliminar cuenta" + }, + "removeAccountDescription": { + "message": "Esta cuenta se eliminará de tu billetera. Asegúrate de tener la frase de inicialización original o clave privada de esta cuenta importada para poder continuar. Puedes volver a importar o crear cuentas desde el menú desplegable de la cuenta." + }, + "readyToConnect": { + "message": "¿Listo para conectarte?" + }, + "rinkeby": { + "message": "Red de prueba Rinkeby" + }, + "ropsten": { + "message": "Red de prueba Ropsten" + }, + "goerli": { + "message": "Red de prueba Goerli" + }, + "save": { + "message": "Guardar" + }, + "slow": { + "message": "Lento" + }, + "slower": { + "message": "Más lento" + }, + "saveAsCsvFile": { + "message": "Guardar como archivo CSV" + }, + "scanInstructions": { + "message": "Coloca el código QR delante de la cámara" + }, + "scanQrCode": { + "message": "Escanear el código QR" + }, + "search": { + "message": "Buscar" + }, + "searchResults": { + "message": "Resultados de la búsqueda" + }, + "secretBackupPhrase": { + "message": "Frase de copia de seguridad secreta" + }, + "secretBackupPhraseDescription": { + "message": "Tu frase de copia de seguridad secreta facilita que se pueda respaldar y restaurar tu cuenta." + }, + "secretBackupPhraseWarning": { + "message": "ADVERTENCIA: Nunca reveles tu frase de copia de seguridad. Cualquier persona que tenga acceso a esta frase puede llevarse tus Ethers permanentemente." + }, + "secretPhrase": { + "message": "Ingresa tu frase secreta de doce palabras para restaurar tu almacén." + }, + "securityAndPrivacy": { + "message": "Seguridad y privacidad" + }, + "securitySettingsDescription": { + "message": "Configuración de privacidad y frase de inicialización de la billetera" + }, + "seedPhrasePlaceholder": { + "message": "Separa cada palabra con un solo espacio" + }, + "seedPhraseReq": { + "message": "Las frases de inicialización tienen una longitud de 12 palabras" + }, + "selectCurrency": { + "message": "Seleccionar moneda" + }, + "selectEachPhrase": { + "message": "Selecciona todas las frases para asegurarte de que son correctas." + }, + "selectLocale": { + "message": "Selecciona la configuración regional" + }, + "selectType": { + "message": "Seleccionar tipo" + }, + "send": { + "message": "Enviar" + }, + "sendAmount": { + "message": "Enviar monto" + }, + "sendETH": { + "message": "Enviar ETH" + }, + "sendTokens": { + "message": "Enviar tokens" + }, + "sentEther": { + "message": "Ethers enviados" + }, + "sentTokens": { + "message": "tokens enviados" + }, + "separateEachWord": { + "message": "Separa cada palabra con un solo espacio" + }, + "searchTokens": { + "message": "Buscar tokens" + }, + "selectAnAccount": { + "message": "Selecciona una cuenta" + }, + "selectAnAccountHelp": { + "message": "Selecciona la cuenta que deseas ver en MetaMask" + }, + "selectAHigherGasFee": { + "message": "Selecciona una tasa de gas más alta para acelerar el procesamiento de tu transacción.*" + }, + "selectHdPath": { + "message": "Selecciona la ruta HD" + }, + "selectPathHelp": { + "message": "Si no ves tus cuentas existentes de Ledger más abajo, intenta cambiar la ruta a \"Legacy (MEW / MyCrypto)\"" + }, + "settings": { + "message": "Configuración" + }, + "showAdvancedGasInline": { + "message": "Controles de gas avanzados" + }, + "showAdvancedGasInlineDescription": { + "message": "Selecciona esto para mostrar el precio del gas y limitar los controles directamente en las pantallas de envío y confirmación." + }, + "showFiatConversionInTestnets": { + "message": "Mostrar conversión en redes Testnet" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Selecciona esto para mostrar la conversión de dinero fiduciario en redes Testnet" + }, + "showPrivateKeys": { + "message": "Mostrar claves privadas" + }, + "showHexData": { + "message": "Mostrar datos hexadecimales" + }, + "showHexDataDescription": { + "message": "Selecciona esto para mostrar el campo de datos hexadecimales en la pantalla de envío" + }, + "sign": { + "message": "Firmar" + }, + "signatureRequest": { + "message": "Solicitud de firma" + }, + "signed": { + "message": "Firmado" + }, + "signNotice": { + "message": "Firmar este mensaje puede tener \nefectos secundarios peligrosos. Solo firma mensajes de \nsitios web en los que confíes plenamente con toda su cuenta.\n Este método es riesgoso y se eliminará en una versión futura." + }, + "sigRequest": { + "message": "Solicitud de firma" + }, + "somethingWentWrong": { + "message": "¡Vaya! Se produjo un error." + }, + "speedUp": { + "message": "Acelerar" + }, + "speedUpCancellation": { + "message": "Acelerar esta cancelación" + }, + "speedUpTransaction": { + "message": "Acelerar esta transacción" + }, + "switchNetworks": { + "message": "Cambiar redes" + }, + "stateLogs": { + "message": "Registros de estado" + }, + "stateLogsDescription": { + "message": "Los registros de estado contienen las direcciones de sus cuentas públicas y transacciones enviadas." + }, + "stateLogError": { + "message": "Error al recuperar los registros de estado." + }, + "step1HardwareWallet": { + "message": "1. Conecta la billetera de hardware" + }, + "step1HardwareWalletMsg": { + "message": "Conecta tu billetera de hardware directamente a tu computadora." + }, + "step2HardwareWallet": { + "message": "2. Selecciona una cuenta" + }, + "step2HardwareWalletMsg": { + "message": "Selecciona la cuenta que deseas ver. Solo puedes seleccionar una a la vez." + }, + "step3HardwareWallet": { + "message": "3. ¡Comienza a utilizar dApps y más!" + }, + "step3HardwareWalletMsg": { + "message": "Utiliza tu cuenta de hardware como si fuera una cuenta de Ethereum. Inicia sesión en dApps, envía ETH, compra y almacena tokens ERC20 y tokens no fungibles como CryptoKitties." + }, + "storePhrase": { + "message": "Almacena esta frase en un administrador de contraseñas como 1Password." + }, + "submitted": { + "message": "Enviado" + }, + "supportCenter": { + "message": "Visita nuestro Centro de soporte técnico" + }, + "symbol": { + "message": "Símbolo" + }, + "symbolBetweenZeroTwelve": { + "message": "El símbolo debe tener 11 caracteres o menos." + }, + "syncWithMobile": { + "message": "Sincronizar con un dispositivo móvil" + }, + "syncWithMobileTitle": { + "message": "Sincronizar con un dispositivo móvil" + }, + "syncWithMobileDesc": { + "message": "Puedes sincronizar tus cuentas e información con tu dispositivo móvil. Abre la aplicación de MetaMask para dispositivos móviles, dirígete a \"Configuración\" y selecciona \"Sincronizar desde una extensión del navegador\"" + }, + "syncWithMobileDescNewUsers": { + "message": "Si estás abriendo la aplicación de MetaMask para dispositivos móviles por primera vez, sigue los pasos indicados en tu teléfono." + }, + "syncWithMobileScanThisCode": { + "message": "Escanea este código con la aplicación móvil de MetaMask" + }, + "syncWithMobileBeCareful": { + "message": "Asegúrate de que nadie esté mirando tu pantalla cuando escanees este código" + }, + "syncWithMobileComplete": { + "message": "Tus datos se han sincronizado con éxito. ¡Disfruta de la aplicación móvil de MetaMask!" + }, + "terms": { + "message": "Condiciones de uso" + }, + "testFaucet": { + "message": "Grifo de prueba" + }, + "thisWillCreate": { + "message": "Esto creará una billetera y una frase de inicialización nuevas" + }, + "tips": { + "message": "Consejos" + }, + "to": { + "message": "A" + }, + "tokenAlreadyAdded": { + "message": "El token ya se ha agregado." + }, + "tokenContractAddress": { + "message": "Dirección de contrato del token" + }, + "tokenSymbol": { + "message": "Símbolo del token" + }, + "transaction": { + "message": "transacción" + }, + "transactionConfirmed": { + "message": "Se confirmó la transacción en $2." + }, + "transactionCreated": { + "message": "Se creó la transacción con un valor de $1 en $2." + }, + "transactionDropped": { + "message": "La transacción se redujo en $2." + }, + "transactionSubmitted": { + "message": "Se envió la transacción con una tasa de gas de $1 en $2." + }, + "transactionResubmitted": { + "message": "Se reenvió la transacción con una tasa de gas que aumentó a $1 en $2" + }, + "transactionUpdated": { + "message": "La transacción se actualizó en $2." + }, + "transactionErrored": { + "message": "Error en la transacción." + }, + "transactionCancelAttempted": { + "message": "Se intentó cancelar la transacción con una tasa de gas de $1 en $2" + }, + "transactionCancelSuccess": { + "message": "La transacción se canceló con éxito en $2" + }, + "transactionError": { + "message": "Error de transacción. Se dio una excepción en el código de contrato." + }, + "transactionErrorNoContract": { + "message": "Se está intentando llamar una función en una dirección no contractual." + }, + "transactionFee": { + "message": "Tasa de transacción" + }, + "transactionTime": { + "message": "Tiempo de transacción" + }, + "transfer": { + "message": "Transferir" + }, + "transferBetweenAccounts": { + "message": "Transferir entre mis cuentas" + }, + "transferFrom": { + "message": "Transferir desde" + }, + "troubleTokenBalances": { + "message": "Hubo un problema al cargar tus saldos de tokens. Puedes verlos", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "Reintentar" + }, + "typePassword": { + "message": "Ingresa tu contraseña de MetaMask" + }, + "unapproved": { + "message": "Sin autorización" + }, + "units": { + "message": "unidades" + }, + "unknown": { + "message": "Desconocido" + }, + "unknownNetwork": { + "message": "Red privada desconocida" + }, + "unknownQrCode": { + "message": "Error: No se pudo identificar el código QR" + }, + "unknownCameraErrorTitle": { + "message": "¡Vaya! Se produjo un error…" + }, + "unknownCameraError": { + "message": "Hubo un error al intentar acceder a tu cámara. Vuelve a intentarlo…" + }, + "unlock": { + "message": "Desbloquear" + }, + "unlockMessage": { + "message": "La web descentralizada está a la espera" + }, + "updatedWithDate": { + "message": "Actualización: $1" + }, + "urlErrorMsg": { + "message": "Los URI deben tener el prefijo HTTP/HTTPS apropiado." + }, + "usedByClients": { + "message": "Utilizado por una gran variedad de clientes distintos" + }, + "userName": { + "message": "Nombre de usuario" + }, + "viewAccount": { + "message": "Ver cuenta" + }, + "viewinExplorer": { + "message": "Ver en Explorer" + }, + "viewContact": { + "message": "Ver contacto" + }, + "viewOnCustomBlockExplorer": { + "message": "Ver en $1" + }, + "viewOnEtherscan": { + "message": "Ver en Etherscan" + }, + "visitWebSite": { + "message": "Visita nuestro sitio web" + }, + "walletSeed": { + "message": "Inicialización de la billetera" + }, + "welcomeBack": { + "message": "¡Hola de nuevo!" + }, + "welcome": { + "message": "Bienvenido a MetaMask" + }, + "writePhrase": { + "message": "Escribe esta frase en un papel y guárdalo en un lugar seguro. Si deseas una seguridad incluso mejor, escríbela en varios trozos de papel y guárdalos en dos o tres lugares distintos." + }, + "yesLetsTry": { + "message": "Sí, intentémoslo" + }, + "youNeedToAllowCameraAccess": { + "message": "Debes permitir el acceso a la cámara para utilizar esta función." + }, + "yourSigRequested": { + "message": "Su firma se está procesando" + }, + "youSign": { + "message": "Estás firmando" + }, + "yourPrivateSeedPhrase": { + "message": "Tu frase de inicialización privada" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "El precio del gas es cero en aceleración" + } +} diff --git a/app/_locales/et/messages.json b/app/_locales/et/messages.json new file mode 100644 index 000000000000..28c7cb3b7889 --- /dev/null +++ b/app/_locales/et/messages.json @@ -0,0 +1,1300 @@ +{ + "chartOnlyAvailableEth": { + "message": "Tabel on saadaval vaid Ethereumi võrkudes." + }, + "contractInteraction": { + "message": "Lepingu suhtlus" + }, + "reject": { + "message": "Lükka tagasi" + }, + "about": { + "message": "Teave" + }, + "aboutSettingsDescription": { + "message": "Versioon, tugikeskus ja kontaktteave" + }, + "acceleratingATransaction": { + "message": "* Tehingu kiirendamine kõrgemate gaasihindadega suurendab võimalust kiiremaks võrgus töötlemiseks, kuid see ei ole alati tagatud." + }, + "accessingYourCamera": { + "message": "Kaamerale ligipääs..." + }, + "account": { + "message": "Konto" + }, + "accountDetails": { + "message": "Konto üksikasjad" + }, + "accountName": { + "message": "Konto nimi" + }, + "accountOptions": { + "message": "Konto valikud" + }, + "accountSelectionRequired": { + "message": "Peate valima konto!" + }, + "activityLog": { + "message": "tegevuste logi" + }, + "addNetwork": { + "message": "Lisage võrk" + }, + "addRecipient": { + "message": "Lisa saaja" + }, + "advanced": { + "message": "Täpsemad" + }, + "advancedSettingsDescription": { + "message": "Juurdepääs arendaja funktsioonidele, olekulogide allalaadimine, konto lähtestamine, testvõrkude ja kohandatud RPC-de seadistamine" + }, + "advancedOptions": { + "message": "Täpsemad suvandid" + }, + "addToAddressBook": { + "message": "Lisage aadressiraamatusse" + }, + "addToAddressBookModalPlaceholder": { + "message": "nt John D." + }, + "addAlias": { + "message": "Lisage alias" + }, + "addToken": { + "message": "Lisage luba" + }, + "addTokens": { + "message": "Lisa lube" + }, + "addSuggestedTokens": { + "message": "Lisa soovitatud lube" + }, + "addAcquiredTokens": { + "message": "Lisage load, mis olete MetaMaskiga saanud" + }, + "amount": { + "message": "Summa" + }, + "appDescription": { + "message": "Ethereumi rahakott teie lehitsejas", + "description": "The description of the application" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "approve": { + "message": "Kinnita" + }, + "approved": { + "message": "Kinnitatud" + }, + "asset": { + "message": "Vara" + }, + "attemptingConnect": { + "message": "Plokiahelaga ühenduse loomise katse." + }, + "attemptToCancel": { + "message": "Tühistamiskatse?" + }, + "attemptToCancelDescription": { + "message": "Selle katse esitamine ei taga teie originaaltehingu tühistamist. Kui tühistamiskatse on edukas, võetakse teilt ülaltoodud tehingutasu." + }, + "attributions": { + "message": "Omistamised" + }, + "autoLockTimeLimit": { + "message": "Automaatse väljalogimise taimer (minutites)" + }, + "autoLockTimeLimitDescription": { + "message": "Seadistage jõudeolek minutites, enne kui MetaMask automaatselt välja logib" + }, + "average": { + "message": "Keskmine" + }, + "back": { + "message": "Tagasi" + }, + "backToAll": { + "message": "Tagasi kõigile" + }, + "backupApprovalNotice": { + "message": "Varundage oma salajane taastamisvõti, et oma rahakott ja vahendid turvalisena hoida." + }, + "backupApprovalInfo": { + "message": "See salakood on vajalik teie rahakoti taastamiseks, kui kaotate oma seadme, unustate parooli, peate MetaMaski uuesti alla laadima, või kui soovite avada oma rahakoti mõnel teisel seadmel." + }, + "backupNow": { + "message": "Varunda kohe" + }, + "balance": { + "message": "Saldo" + }, + "balanceOutdated": { + "message": "Saldo võib olla aegunud" + }, + "basic": { + "message": "Põhiseaded" + }, + "blockExplorerUrl": { + "message": "Blokeeri Explorer" + }, + "blockExplorerView": { + "message": "Vaata kontot $1", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "Kasuta Blockies Identiconi" + }, + "browserNotSupported": { + "message": "Teie lehitsejat ei toetata..." + }, + "builtInCalifornia": { + "message": "MetaMask on projekteeritud ja loodud Californias." + }, + "buyWithWyre": { + "message": "Ostke ETH-d Wyre'iga" + }, + "buyWithWyreDescription": { + "message": "Wyre võimaldab kasutada krediitkaarti, et teha ETH sissemakse otse MetaMaski kontole." + }, + "buyCoinSwitch": { + "message": "Osta CoinSwitchil" + }, + "buyCoinSwitchExplainer": { + "message": "CoinSwitch on ühe akna sihtpunkt enama kui 300 krüptoraha vahetamiseks parima hinnaga." + }, + "bytes": { + "message": "Baidid" + }, + "off": { + "message": "Väljas" + }, + "ok": { + "message": "OK" + }, + "on": { + "message": "Sees" + }, + "optionalBlockExplorerUrl": { + "message": "Blokeeri Exploreri URL (valikuline)" + }, + "cancel": { + "message": "Tühista" + }, + "cancelAttempt": { + "message": "Tühista katse" + }, + "cancellationGasFee": { + "message": "Tühistamise gaasitasu" + }, + "cancelled": { + "message": "Tühistatud" + }, + "chainId": { + "message": "Ahela ID" + }, + "clickToRevealSeed": { + "message": "Klõpsake salasõnade kuvamiseks" + }, + "close": { + "message": "Sule" + }, + "chromeRequiredForHardwareWallets": { + "message": "Riistvararahakoti ühendamiseks peate kasutama MetaMaski Google Chrome'is." + }, + "confirm": { + "message": "Kinnita" + }, + "confirmed": { + "message": "Kinnitatud" + }, + "confirmPassword": { + "message": "Kinnitage parool" + }, + "confirmSecretBackupPhrase": { + "message": "Kinnitage oma salajane varundamisfraas" + }, + "congratulations": { + "message": "Palju õnne!" + }, + "connectHardwareWallet": { + "message": "Ühendage riistvara rahakott" + }, + "connect": { + "message": "Ühendamine" + }, + "connectingTo": { + "message": "Ühenduse loomine $1" + }, + "connectingToKovan": { + "message": "Ühendamine Kovani testvõrguga" + }, + "connectingToMainnet": { + "message": "Ühenduse loomine peamise Etherumi võrguga" + }, + "connectingToRopsten": { + "message": "Ühendamine Ropsteni testvõrguga" + }, + "connectingToRinkeby": { + "message": "Ühendamine Rinkeby testvõrguga" + }, + "connectingToLocalhost": { + "message": "Ühenduse loomine Localhost 8545" + }, + "connectingToGoerli": { + "message": "Ühendamine Goerli testvõrguga" + }, + "continueToWyre": { + "message": "Ava Wyre" + }, + "continueToCoinSwitch": { + "message": "Avage ConSwitch" + }, + "contractDeployment": { + "message": "Lepingu juurutamine" + }, + "copiedExclamation": { + "message": "Kopeeritud!" + }, + "copyAddress": { + "message": "Kopeeri aadress lõikelauale" + }, + "copyTransactionId": { + "message": "Kopeeri tehingu ID" + }, + "copiedTransactionId": { + "message": "Kopeeritud tehingu ID" + }, + "copyToClipboard": { + "message": "Kopeeri lõikelauale" + }, + "copyPrivateKey": { + "message": "See on teie privaatne võti (klõpsake kopeerimiseks)" + }, + "create": { + "message": "Loo" + }, + "createAccount": { + "message": "Loo konto" + }, + "createAWallet": { + "message": "Loo rahakott" + }, + "createPassword": { + "message": "Loo parool" + }, + "currencyConversion": { + "message": "Valuuta teisendamine" + }, + "currentLanguage": { + "message": "Praegune keel" + }, + "customGas": { + "message": "Gaasi kohandamine" + }, + "customGasSubTitle": { + "message": "Tasu suurendamine võib töötlemisaegu vähendada, kuid see ei ole tagatud." + }, + "customToken": { + "message": "Kohandatud luba" + }, + "customRPC": { + "message": "Kohandatud RPC" + }, + "decimalsMustZerotoTen": { + "message": "Kümnendkohad peavad olema vähemalt 0 ja mitte üle 36." + }, + "decimal": { + "message": "Täpsuse kümnendkohad" + }, + "defaultNetwork": { + "message": "Etheri tehingute vaikevõrk on peavõrk." + }, + "delete": { + "message": "Kustuta" + }, + "deleteAccount": { + "message": "Kustuta konto" + }, + "deposit": { + "message": "Sissemakse" + }, + "depositEther": { + "message": "Eetri sissemakse" + }, + "details": { + "message": "Üksikasjad" + }, + "directDepositEther": { + "message": "Eetri otsene sissemakse" + }, + "directDepositEtherExplainer": { + "message": "Kui teil on juba veidi eetrit, on kiirem viis eetri rahakotti saamiseks otsene sissemakse." + }, + "done": { + "message": "Valmis" + }, + "downloadGoogleChrome": { + "message": "Laadige alla Google Chrome" + }, + "downloadSecretBackup": { + "message": "Laadige see salajane varundusfraas alla ja hoidke seda turvaliselt välisel krüpteeritud kõvakettal või andmekandjal." + }, + "downloadStateLogs": { + "message": "Olekulogide allalaadimine" + }, + "dontHaveAHardwareWallet": { + "message": "Teil ei ole riistvara rahakotti?" + }, + "dropped": { + "message": "Vabastatud" + }, + "edit": { + "message": "Muuda" + }, + "editContact": { + "message": "Muuda kontakti" + }, + "endOfFlowMessage1": { + "message": "Läbisite kontrolli – hoidke seemnefraasi turvaliselt, see on teie vastutusel!" + }, + "endOfFlowMessage2": { + "message": "Nõuandeid selle turvaliseks hoiustamiseks" + }, + "endOfFlowMessage3": { + "message": "Salvestage varukoopia erinevatesse kohtadesse." + }, + "endOfFlowMessage4": { + "message": "Ärge jagage fraasi mitte kellegagi." + }, + "endOfFlowMessage5": { + "message": "Olge ettevaatlik andmepüügi osas! MetaMask ei küsi kunagi spontaanselt teie seemnefraasi." + }, + "endOfFlowMessage6": { + "message": "Kui peate oma seemnefraasi uuesti varundama, leiate selle valikust Settings (Seaded) -> Security (Turvalisus)." + }, + "endOfFlowMessage7": { + "message": "Kui teil on küsimusi või näete midagi kahtlast, kirjutage meile support@metamask.io." + }, + "endOfFlowMessage8": { + "message": "MetaMask ei saa teie seemnefraasi taastada. Lisateave." + }, + "endOfFlowMessage9": { + "message": "Lisateave." + }, + "endOfFlowMessage10": { + "message": "Valmis" + }, + "ensRegistrationError": { + "message": "Tõrge ENS-i nime registreerimisel" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "ENS-i nime ei leitud praegusest võrgust. Proovige lülituda peamisele Ethereumi võrgule." + }, + "enterAnAlias": { + "message": "Sisestage alias" + }, + "enterPassword": { + "message": "Sisestage parool" + }, + "enterPasswordContinue": { + "message": "Jätkamiseks sisestage parool" + }, + "ethereumPublicAddress": { + "message": "Ethereumi avalik aadress" + }, + "etherscanView": { + "message": "Vaadake kontot Etherscanil" + }, + "estimatedProcessingTimes": { + "message": "Eeldatavad töötlemisajad" + }, + "expandView": { + "message": "Laienda vaadet" + }, + "exportPrivateKey": { + "message": "Ekspordi privaatvõti" + }, + "failed": { + "message": "Nurjus" + }, + "fast": { + "message": "Kiire" + }, + "faster": { + "message": "Kiiremini" + }, + "fileImportFail": { + "message": "Faili importimine ei toimi? Klõpsake siia!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "Unusta see seade" + }, + "from": { + "message": "Saatja" + }, + "functionType": { + "message": "Funktsiooni tüüp" + }, + "gasLimit": { + "message": "Gaasi ülemmäär" + }, + "gasLimitInfoModalContent": { + "message": "Gaasi ülemmäär on maksimaalne gaasiühikute hulk, mida olete nõus kulutama." + }, + "gasLimitTooLow": { + "message": "Gaasi ülemmäär peab olema vähemalt 21 000" + }, + "gasUsed": { + "message": "Kasutatud gaasihulk" + }, + "gasPrice": { + "message": "Gaasi hind (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "Gaasi hind on äärmiselt madal" + }, + "gasPriceInfoModalContent": { + "message": "Gaasi hind näitab eetri hulka, mida olete nõus iga gaasiühiku eest tasuma." + }, + "gasPriceNoDenom": { + "message": "Gaasi hind" + }, + "general": { + "message": "Üldine teave" + }, + "generalSettingsDescription": { + "message": "Valuutavahetus, põhivaluuta, keel, plokkidest identicon" + }, + "getEther": { + "message": "Hankige eetrit" + }, + "getEtherFromFaucet": { + "message": "Hankige kraanist eetrit $1eest", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "Küsige abi." + }, + "getStarted": { + "message": "Alustamine" + }, + "happyToSeeYou": { + "message": "Meil on hea meel teid näha." + }, + "hardware": { + "message": "riistvara" + }, + "hardwareWalletConnected": { + "message": "Riistvara rahakott on ühendatud" + }, + "hardwareWallets": { + "message": "Ühendage riistvara rahakott" + }, + "hardwareWalletsMsg": { + "message": "Valige riistvara rahakott, mida soovite MetaMaskis kasutada" + }, + "havingTroubleConnecting": { + "message": "Kas ühendamisel esineb probleeme?" + }, + "here": { + "message": "siin", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hexData": { + "message": "Hex-andmed" + }, + "hide": { + "message": "Peida" + }, + "hideTokenPrompt": { + "message": "Peida luba?" + }, + "history": { + "message": "Ajalugu" + }, + "import": { + "message": "Impordi", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "Impordi konto" + }, + "importAccountMsg": { + "message": "Imporditud kontosid ei seostata teie ainulaadse MetaMaski konto seemnefraasiga. Lugege imporditud kontode kohta lähemalt" + }, + "importAccountSeedPhrase": { + "message": "Impordi seemnefraasiga konto" + }, + "importWallet": { + "message": "Importige rahakott" + }, + "importYourExisting": { + "message": "Importige 12-sõnalise seemnefraasi abil olemasolev rahakott" + }, + "imported": { + "message": "Imporditud", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "Impordi konto seemnefraasi abil" + }, + "infoHelp": { + "message": "Teave ja abi" + }, + "initialTransactionConfirmed": { + "message": "Võrk kinnitas teie algse tehingu. Tagasi minemiseks klõpsake OK-nuppu." + }, + "insufficientBalance": { + "message": "Ebapiisav kontojääk." + }, + "insufficientFunds": { + "message": "Ebapiisavad vahendid." + }, + "insufficientTokens": { + "message": "Ebapiisavad load." + }, + "invalidAddress": { + "message": "Kehtetu aadress" + }, + "invalidAddressRecipient": { + "message": "Saaja aadress on vale" + }, + "knownAddressRecipient": { + "message": "Teadaolev lepinguaadress." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "Kehtetu ETH-võrk, kasutage väiketähti" + }, + "invalidInput": { + "message": "Vigane sisend." + }, + "invalidRPC": { + "message": "Vale RPC URL" + }, + "invalidBlockExplorerURL": { + "message": "Vale Block Explorer URL" + }, + "invalidSeedPhrase": { + "message": "Vigane seemnefraas" + }, + "jsonFile": { + "message": "JSON-laiendiga fail", + "description": "format for importing an account" + }, + "kovan": { + "message": "Kovani testvõrk" + }, + "learnMore": { + "message": "Lisateave" + }, + "ledgerAccountRestriction": { + "message": "Enne uue konto loomist peate kasutama eelmist kontot." + }, + "letsGoSetUp": { + "message": "Jah, hakkame pihta!" + }, + "likeToAddTokens": { + "message": "Kas soovite need load lisada?" + }, + "links": { + "message": "Lingid" + }, + "liveGasPricePredictions": { + "message": "Gaasihinna prognoosid reaalajas" + }, + "loading": { + "message": "Laadimine..." + }, + "loadingTokens": { + "message": "Lubade laadimine..." + }, + "loadMore": { + "message": "Laadi rohkem" + }, + "lock": { + "message": "Logi välja" + }, + "mainnet": { + "message": "Ethereumi põhivõrk" + }, + "memorizePhrase": { + "message": "Jätke fraas meelde." + }, + "memo": { + "message": "teatis" + }, + "message": { + "message": "Sõnum" + }, + "metamaskDescription": { + "message": "Teid ühendatakse Ethereumi ja detsentraliseeritud võrguga." + }, + "metamaskVersion": { + "message": "MetaMaski versioon" + }, + "mobileSyncText": { + "message": "Sisestage parool, et saaksime teid tuvastada!" + }, + "myAccounts": { + "message": "Minu kontod" + }, + "myWalletAccounts": { + "message": "Minu rahakotikontod" + }, + "myWalletAccountsDescription": { + "message": "Sellesse jaotisesse lisatakse automaatselt kõik teie MetaMaski kontod." + }, + "mustSelectOne": { + "message": "Peate valima vähemalt 1 loa." + }, + "needEtherInWallet": { + "message": "Selleks, et suhelda MetaMaski abil detsentraliseeritud rakendustega, peab teil rahakotis eetrit olema." + }, + "needImportFile": { + "message": "Peate importimiseks faili valima.", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "Negatiivset ETHi summat ei saa saata." + }, + "networkName": { + "message": "Võrgu nimi" + }, + "networks": { + "message": "Võrgud" + }, + "networkSettingsDescription": { + "message": "Kohandatud RPC-võrkude lisamine ja muutmine" + }, + "nevermind": { + "message": "Unusta" + }, + "newAccount": { + "message": "Uus konto" + }, + "newAccountDetectedDialogMessage": { + "message": "Leiti uus aadress! Klõpsake siia, et see oma aadressiraamatusse lisada." + }, + "newAccountNumberName": { + "message": "Konto $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "Uus kontakt" + }, + "newContract": { + "message": "Uus kontakt" + }, + "newPassword": { + "message": "Uus parool (vähemalt 8 tähemärki)" + }, + "newNetwork": { + "message": "Uus võrk" + }, + "newToMetaMask": { + "message": "Pole MetaMaski varem kasutanud?" + }, + "noAlreadyHaveSeed": { + "message": "Ei, mul on juba seemnefraas" + }, + "protectYourKeys": { + "message": "Kaitske oma võtmeid!" + }, + "protectYourKeysMessage1": { + "message": "Kaitske oma seemnefraasi. Meid on teavitatud veebilehtedest, mis püüavad MetaMaski jäljendada. MetaMask ei küsi teilt kunagi teie seemnefraasi!" + }, + "protectYourKeysMessage2": { + "message": "Kaitske oma seemnefraasi. Kui näete midagi kahtlast või pole veebilehe ehtsuses kindel, saatke e-kiri aadressile support@metamask.io" + }, + "rpcUrl": { + "message": "Uus RPC URL" + }, + "optionalChainId": { + "message": "ChainID (valikuline)" + }, + "optionalSymbol": { + "message": "Sümbol (valikuline)" + }, + "newTotal": { + "message": "Uus kogusumma" + }, + "newTransactionFee": { + "message": "Uus vahendustasu" + }, + "next": { + "message": "Edasi" + }, + "noAddressForName": { + "message": "Sellele nimele pole registreeritud ühtegi aadressi." + }, + "noConversionRateAvailable": { + "message": "Ühtegi vahetuskurssi pole saadaval" + }, + "noTransactions": { + "message": "Teil ei ole tehinguid" + }, + "notEnoughGas": { + "message": "Ei ole piisavalt gaasi" + }, + "noWebcamFoundTitle": { + "message": "Veebikaamerat ei leitud" + }, + "noWebcamFound": { + "message": "Teie arvuti veebikaamerat ei leitud. Proovige uuesti." + }, + "ofTextNofM": { + "message": "/" + }, + "orderOneHere": { + "message": "Tellige Trezor või Ledger ja hoidke oma varasid külmruumis" + }, + "origin": { + "message": "Päritolu" + }, + "parameters": { + "message": "Parameetrid" + }, + "participateInMetaMetrics": { + "message": "Osalege MetaMetricsis" + }, + "participateInMetaMetricsDescription": { + "message": "Osalege MetaMetricsis, et aidata meil MetaMaski paremaks teha" + }, + "password": { + "message": "Parool" + }, + "passwordsDontMatch": { + "message": "Paroolid ei ühti" + }, + "passwordNotLongEnough": { + "message": "Parool pole piisavalt pikk" + }, + "pastePrivateKey": { + "message": "Kleepige oma privaatne võtmestring siia:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "ootel" + }, + "personalAddressDetected": { + "message": "Leiti isiklik aadress. Sisestage loa kontaktaadress." + }, + "prev": { + "message": "Eelm" + }, + "primaryCurrencySetting": { + "message": "Põhivaluuta" + }, + "primaryCurrencySettingDescription": { + "message": "Valige omavääring, et prioriseerida vääringu kuvamist ahela omavääringus (nt ETH). Valige Fiat, et prioriseerida vääringu kuvamist valitud fiat-vääringus." + }, + "privacyMsg": { + "message": "privaatsuspoliitika" + }, + "privateKey": { + "message": "Privaatvõti", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "Hoiatus: ärge seda võtit kellelegi avaldage. Suvaline isik, kes teab teie privaatvõtmeid, võib teie kontolt varasid varastada." + }, + "privateNetwork": { + "message": "Privaatvõrk" + }, + "queue": { + "message": "Järjekord" + }, + "readdToken": { + "message": "Saate selle loa tulevikus tagasi lisada, kui lähete oma kontovalikute menüüs vahelehele „Lisa luba“." + }, + "recents": { + "message": "Hiljutised" + }, + "recipientAddress": { + "message": "Saaja aadress" + }, + "recipientAddressPlaceholder": { + "message": "Otsing, avalik aadress (0x) või ENS" + }, + "rejectAll": { + "message": "Lükka kõik tagasi" + }, + "rejectTxsN": { + "message": "Lükake $1tehingud tagasi" + }, + "rejectTxsDescription": { + "message": "Olete korraga tagasi lükkamas $1tehingut." + }, + "rejected": { + "message": "Tagasi lükatud" + }, + "reset": { + "message": "Lähtesta" + }, + "resetAccount": { + "message": "Lähtesta konto" + }, + "resetAccountDescription": { + "message": "Konto lähtestamine tühjendab tehingute ajaloo." + }, + "deleteNetwork": { + "message": "Võrk kustutada?" + }, + "deleteNetworkDescription": { + "message": "Olete kindel, et soovite selle võrgu kustutada?" + }, + "remindMeLater": { + "message": "Tuleta hiljem meelde" + }, + "restoreFromSeed": { + "message": "Taastada konto?" + }, + "restoreAccountWithSeed": { + "message": "Taastage konto seemnefraasi abil" + }, + "requestsAwaitingAcknowledgement": { + "message": "kinnitust ootavad taotlused" + }, + "required": { + "message": "Nõutav" + }, + "restore": { + "message": "Taasta" + }, + "revealSeedWords": { + "message": "Kuva seemnesõnu" + }, + "revealSeedWordsTitle": { + "message": "Seemnefraas" + }, + "revealSeedWordsDescription": { + "message": "Kui vahetate veebilehitsejat või arvutit, vajate oma kontodele ligipääsemiseks seemnefraasi. Hoidke seda turvalises ja salajases kohas." + }, + "revealSeedWordsWarningTitle": { + "message": "ÄRGE jagage seda fraasi mitte kellegagi!" + }, + "revealSeedWordsWarning": { + "message": "Neid sõnu saab kasutada kõigi teie kontode tühjendamiseks." + }, + "remove": { + "message": "Eemalda" + }, + "removeAccount": { + "message": "Konto eemaldamine" + }, + "removeAccountDescription": { + "message": "See konto eemaldatakse teie rahakotist. Veenduge enne jätkamist, et teil on imporditud konto algne seemnefraas või privaatvõti olemas. Saate kontode rippmenüü kaudu importida või luua uued kontod." + }, + "readyToConnect": { + "message": "Kas olete ühenduseks valmis?" + }, + "rinkeby": { + "message": "Rinkeby katsevõrk" + }, + "ropsten": { + "message": "Ropsteni testvõrk" + }, + "goerli": { + "message": "Goerli testvõrk" + }, + "save": { + "message": "Salvesta" + }, + "slow": { + "message": "Aeglane" + }, + "slower": { + "message": "Aeglasem" + }, + "saveAsCsvFile": { + "message": "Salvesta CSV-failina" + }, + "scanInstructions": { + "message": "Asetage QR-kood kaamera ette" + }, + "scanQrCode": { + "message": "Skannige QR-koos" + }, + "search": { + "message": "Otsi" + }, + "searchResults": { + "message": "Otsingutulemused" + }, + "secretBackupPhrase": { + "message": "Salajane varundusfraas" + }, + "secretBackupPhraseDescription": { + "message": "Teie salajane varundusfraas hõlbustab konto varundamist ja taastamist." + }, + "secretBackupPhraseWarning": { + "message": "HOIATUS! Ärge avaldage kunagi oma varundusfraasi. Selle fraasiga on võimalik teie eeter igaveseks ära võtta." + }, + "secretPhrase": { + "message": "Sisestage hoidla taastamiseks oma salajane 12-sõnaline fraas." + }, + "securityAndPrivacy": { + "message": "Turvalisus ja privaatsus" + }, + "securitySettingsDescription": { + "message": "Privaatsusseaded ja rahakoti seemnefraas" + }, + "seedPhrasePlaceholder": { + "message": "Eraldage iga sõna ühe tühikuga" + }, + "seedPhraseReq": { + "message": "Seemnefraasid on 12 sõna pikad" + }, + "selectCurrency": { + "message": "Valitud valuuta" + }, + "selectEachPhrase": { + "message": "Valige iga fraas, veendumaks, et see on õige." + }, + "selectLocale": { + "message": "Valige Lokaat" + }, + "selectType": { + "message": "Valige tüüp" + }, + "send": { + "message": "Saada" + }, + "sendAmount": { + "message": "Saatke kogus" + }, + "sendETH": { + "message": "Saada ETH" + }, + "sendTokens": { + "message": "Saada lube" + }, + "sentEther": { + "message": "saadetud eeter" + }, + "sentTokens": { + "message": "saadetud load" + }, + "separateEachWord": { + "message": "Eraldage iga sõna ühe tühikuga" + }, + "searchTokens": { + "message": "Lubade otsimine" + }, + "selectAnAccount": { + "message": "Valige konto" + }, + "selectAnAccountHelp": { + "message": "Valige konto, mida MetaMaskis vaadata" + }, + "selectAHigherGasFee": { + "message": "Valige suurem gaasihind, et kiirendada tehingu töötlemist.*" + }, + "selectHdPath": { + "message": "Valige HD-teekond" + }, + "selectPathHelp": { + "message": "Kui te ei näe allpool oma olemasolevaid pearaamatu kontosid, vahetage tee kohta \"Legacy (MEW/MyCrypto)\"" + }, + "settings": { + "message": "Seaded" + }, + "showAdvancedGasInline": { + "message": "Täiustatud gaasijuhikud" + }, + "showAdvancedGasInlineDescription": { + "message": "Valige see, et kuvada gaasi hinda ja piirangut otse saatmise ning kinnitamise kuval." + }, + "showFiatConversionInTestnets": { + "message": "Kuva teisendus Testnetsis" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Valige see, et kuvada Testnetsis fiati teisendus" + }, + "showPrivateKeys": { + "message": "Kuva privaatvõtmed" + }, + "showHexData": { + "message": "Kuva Hex-andmed" + }, + "showHexDataDescription": { + "message": "Valige see, et kuvada saatmisekraanil hex-andmete väli" + }, + "sign": { + "message": "Allkirjasta" + }, + "signatureRequest": { + "message": "Allkirja taotlus" + }, + "signed": { + "message": "Allkirjastatud" + }, + "signNotice": { + "message": "Selle sõnumi allkirjastamisel \nvõib olla ohtlikke kõrvaltoimeid. Allkirjastage sõnumeid vaid \nsaitidelt, mida te kogu kontoga usaldate.\n See ohtlik meetod eemaldatakse uues versioonis." + }, + "sigRequest": { + "message": "Allkirja taotlus" + }, + "somethingWentWrong": { + "message": "Oih! Midagi läks valesti." + }, + "speedUp": { + "message": "Kiirendamine" + }, + "speedUpCancellation": { + "message": "Kiirendage seda tühistamist" + }, + "speedUpTransaction": { + "message": "Kiirenda seda tehingut" + }, + "switchNetworks": { + "message": "Vaheta võrku" + }, + "stateLogs": { + "message": "Olekulogid" + }, + "stateLogsDescription": { + "message": "Olekulogid sisaldavad teie avalikke konto aadresse ja saadetud tehinguid." + }, + "stateLogError": { + "message": "Olekulogide saamisel ilmnes tõrge." + }, + "step1HardwareWallet": { + "message": "1. Ühendage riistvara rahakott" + }, + "step1HardwareWalletMsg": { + "message": "Ühendage oma riistvara rahakott otse oma arvutiga." + }, + "step2HardwareWallet": { + "message": "2. Valige konto" + }, + "step2HardwareWalletMsg": { + "message": "Valige konto, mida soovite vaadata. Korraga saab valida ühe." + }, + "step3HardwareWallet": { + "message": "3. Hakake kasutama dAppse ja muud!" + }, + "step3HardwareWalletMsg": { + "message": "Kasutage oma riistvarakontot nagu mis tahes teist Ethereumi kontot. Logige dAppsi, saatke Eth-d, ostke ja hoiustage ERC20 lube ning asendamatuid lube nagu CryptoKitties." + }, + "storePhrase": { + "message": "Salvestage see fraas paroolihaldurisse, nagu 1Password." + }, + "submitted": { + "message": "Edastatud" + }, + "supportCenter": { + "message": "Külastage meie tugikeskust" + }, + "symbol": { + "message": "Sümbol" + }, + "symbolBetweenZeroTwelve": { + "message": "Sümbol peab olema 11 tähemärki või vähem." + }, + "syncWithMobile": { + "message": "Mobiiliga sünkroonimine" + }, + "syncWithMobileTitle": { + "message": "Mobiiliga sünkroonimine" + }, + "syncWithMobileDesc": { + "message": "Saate sünkroonida oma kontod ja teabe oma mobiiliseadmega. Avage MetaMaski mobiilirakendus, avage \"Settings\" (Seaded) ja puudutage valikut \"Sync from Browser Extension\" (Sünkroonimine lehitseja laiendusest)" + }, + "syncWithMobileDescNewUsers": { + "message": "Järgige MetaMaski mobiilirakenduse esmakordsel avamisel telefonis esitatud samme." + }, + "syncWithMobileScanThisCode": { + "message": "Skanneerige see kood MetaMaski mobiilirakendusega" + }, + "syncWithMobileBeCareful": { + "message": "Veenduge, et keegi teine ei vaata selle koodi skannimisel teie ekraani" + }, + "syncWithMobileComplete": { + "message": "Teie andmed on edukalt sünkroonitud. Nautige MetaMaski mobiilirakendust!" + }, + "terms": { + "message": "Teenusetingimused" + }, + "testFaucet": { + "message": "Testkraan" + }, + "thisWillCreate": { + "message": "See loob uue rahakoti ja seemnefraasi" + }, + "tips": { + "message": "Preemiad" + }, + "to": { + "message": "Saaja" + }, + "token": { + "message": "Luba" + }, + "tokenAlreadyAdded": { + "message": "Luba on juba lisatud." + }, + "tokenContractAddress": { + "message": "Loa lepinguaadress" + }, + "tokenSymbol": { + "message": "Tokeni sümbol" + }, + "total": { + "message": "Kokku" + }, + "transaction": { + "message": "tehing" + }, + "transactionConfirmed": { + "message": "Tehing kinnitatud $2." + }, + "transactionCreated": { + "message": "Tehing loodud väärtusega $1 asukohas $2." + }, + "transactionDropped": { + "message": "Tehing vabastatud $2." + }, + "transactionSubmitted": { + "message": "Tehing edastatud gaasihinnaga $1 asukohas $2." + }, + "transactionResubmitted": { + "message": "Tehing uuesti edastatud, suurendatud gaasihinnaga $1 asukohas $2" + }, + "transactionUpdated": { + "message": "Tehing on uuendatud $2." + }, + "transactionErrored": { + "message": "Tehingul ilmnes tõrge." + }, + "transactionCancelAttempted": { + "message": "Tehingu tühistamise katse gaasitasuga $1 asukohas $2" + }, + "transactionCancelSuccess": { + "message": "Tehing edukalt tühistatud $2" + }, + "transactionError": { + "message": "Tehingu tõrge. Lepingukoodis ilmnes erand." + }, + "transactionErrorNoContract": { + "message": "Mittelepingulisel aadressil asuva funktsiooni kutsumine." + }, + "transactionFee": { + "message": "Tehingutasu" + }, + "transactionTime": { + "message": "Tehingu aeg" + }, + "transfer": { + "message": "Ülekandmine" + }, + "transferBetweenAccounts": { + "message": "Ülekandmine minu kontode vahel" + }, + "transferFrom": { + "message": "Ülekandmine asukohast" + }, + "troubleTokenBalances": { + "message": "Teie loasaldode laadimisega oli probleem. Saate neid vaadata", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "Proovi uuesti" + }, + "typePassword": { + "message": "Sisestage oma MetaMaski parool" + }, + "unapproved": { + "message": "Kinnitamata" + }, + "units": { + "message": "ühikud" + }, + "unknown": { + "message": "Teadmata" + }, + "unknownNetwork": { + "message": "Tundmatu privaatvõrk" + }, + "unknownQrCode": { + "message": "Tõrge: seda QR-koodi ei saanud tuvastada" + }, + "unknownCameraErrorTitle": { + "message": "Oih! Midagi läks valesti...." + }, + "unknownCameraError": { + "message": "Kaamerale ligipääsemisel ilmnes tõrge. Proovige uuesti..." + }, + "unlock": { + "message": "Ava lukk" + }, + "unlockMessage": { + "message": "Detsentraliseeritud veeb ootab" + }, + "updatedWithDate": { + "message": "Värskendatud $1" + }, + "urlErrorMsg": { + "message": "URI-d nõuavad sobivat HTTP/HTTPS-i prefiksit." + }, + "usedByClients": { + "message": "Kasutavad erinevad kliendid" + }, + "userName": { + "message": "Kasutajanimi" + }, + "viewAccount": { + "message": "Kuva konto" + }, + "viewinExplorer": { + "message": "Kuva Exploreris" + }, + "viewContact": { + "message": "Kuva kontakt" + }, + "viewOnCustomBlockExplorer": { + "message": "Vaata $1" + }, + "viewOnEtherscan": { + "message": "Kuva Etherscanil" + }, + "visitWebSite": { + "message": "Külastage meie veebilehte" + }, + "walletSeed": { + "message": "Rahakoti seeme" + }, + "welcomeBack": { + "message": "Tere tulemast tagasi!" + }, + "welcome": { + "message": "Tere tulemast MetaMaski" + }, + "writePhrase": { + "message": "Kirjutage see fraas paberile ja hoidke seda turvalises kohas. Veel suurema turvalisuse tagamiseks kirjutage see mitmele paberile ja hoidke neid 2–3 erinevas kohas." + }, + "yesLetsTry": { + "message": "Jah, proovime" + }, + "youNeedToAllowCameraAccess": { + "message": "Selle funktsiooni kasutamiseks peate lubaga kaamera ligipääsu." + }, + "yourSigRequested": { + "message": "Taotletakse teie allkirja" + }, + "youSign": { + "message": "Allkirjastate" + }, + "yourPrivateSeedPhrase": { + "message": "Teie privaatne seemnefraas" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "Null gaasihind kiirendamisel" + } +} diff --git a/app/_locales/fa/messages.json b/app/_locales/fa/messages.json new file mode 100644 index 000000000000..30bb2e2a46e3 --- /dev/null +++ b/app/_locales/fa/messages.json @@ -0,0 +1,1310 @@ +{ + "chartOnlyAvailableEth": { + "message": "تنها قابل دسترس را در شبکه های ایتریوم جدول بندی نمایید" + }, + "contractInteraction": { + "message": "تعامل قرارداد" + }, + "reject": { + "message": "عدم پذیرش" + }, + "about": { + "message": "درباره" + }, + "aboutSettingsDescription": { + "message": "نسخه، مرکز پشتیبانی Ùˆ معلومات تماس." + }, + "acceleratingATransaction": { + "message": "* تسریع یک معامله با Ø§Ø³ØªÙØ§Ø¯Ù‡ از قیمت بالاتر گاز، ÙØ±ØµØª تسریع پروسس آنرا توسط شبکه Ø§ÙØ²Ø§ÛŒØ´ میدهد اما همیشه این تضمین نمیشود." + }, + "accessingYourCamera": { + "message": "در حال دسترسی به کمره شما..." + }, + "account": { + "message": "حساب" + }, + "accountDetails": { + "message": "جزئیات حساب" + }, + "accountName": { + "message": "نام حساب" + }, + "accountOptions": { + "message": "گزینه های حساب" + }, + "accountSelectionRequired": { + "message": "نیاز به انتخاب یک حساب دارید!" + }, + "activityLog": { + "message": "Ø¯ÙØªØ±Ú†Ù‡ ÙØ¹Ø§Ù„یت" + }, + "addNetwork": { + "message": "اضاÙÙ‡ شبکه" + }, + "addRecipient": { + "message": "اضاÙÙ‡ کردن Ø¯Ø±ÛŒØ§ÙØª کننده" + }, + "advanced": { + "message": "Ù¾ÛŒØ´Ø±ÙØªÙ‡" + }, + "advancedSettingsDescription": { + "message": "مشخصات توسعه دهنده دسترسی، Ø¯ÙØªØ±Ú†Ù‡ ثبت وضعیت دانلود، دوباره سازی حساب، شبکه های آزمایشی تنظیمات Ùˆ RPC معمول." + }, + "advancedOptions": { + "message": "گزینه های Ù¾ÛŒØ´Ø±ÙØªÙ‡" + }, + "addToAddressBook": { + "message": "به کتاب آدرسها اضاÙÙ‡ کنید" + }, + "addToAddressBookModalPlaceholder": { + "message": "مثلًا. John D." + }, + "addAlias": { + "message": "نام مستعار اضاÙÙ‡ کنید" + }, + "addToken": { + "message": "یک رمز یاب اضاÙÙ‡ کنید" + }, + "addTokens": { + "message": "اضاÙÙ‡ رمزیاب ها" + }, + "addSuggestedTokens": { + "message": "اضاÙÙ‡ رمزیاب های پیشنهاد شده" + }, + "addAcquiredTokens": { + "message": "رمزیاب های را Ú©Ù‡ با Ø§Ø³ØªÙØ§Ø¯Ù‡ از MetaMask بدست آورده اید، اضاÙÙ‡ کنید" + }, + "amount": { + "message": "مبلغ" + }, + "appDescription": { + "message": "یک کی٠ایتریوم در براوزر شما", + "description": "The description of the application" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "approve": { + "message": "تصدیق" + }, + "approved": { + "message": "تصدیق شد" + }, + "asset": { + "message": "سرمایه" + }, + "attemptingConnect": { + "message": "در حال تلاش برای اتصال با زنجیره بلوکی" + }, + "attemptToCancel": { + "message": "تلاش یا لغو؟" + }, + "attemptToCancelDescription": { + "message": "تسلیم این تلاش لغو معامله اصلی تان را تضمین نمیکند. در صورتیکه تلاش لغو موÙÙ‚ باشد، بر شما Ùیس معامله Ùوق الذکر چارج خواهد شد." + }, + "attributions": { + "message": "Ù…ÙˆØ§ØµÙØ§Øª" + }, + "autoLockTimeLimit": { + "message": "زمان سنج خروج-خودکار (دقایق)" + }, + "autoLockTimeLimitDescription": { + "message": "زمان های بیکار را به Ø´Ú©Ù„ دقیقه قبل از خروج MetaMask تنظیم کنید" + }, + "average": { + "message": "اوسط" + }, + "back": { + "message": "بازگشت" + }, + "backToAll": { + "message": "برگشت به همه" + }, + "backupApprovalNotice": { + "message": "کود مخÙÛŒ بازیابی تان را بخاطر امنیت کی٠و پول های تان، پشتیبانی بگیرید." + }, + "backupApprovalInfo": { + "message": "در صورت Ù…Ùقود شدن دستگاه، ÙØ±Ø§Ù…وش شدن رمز عبور، لزوم نصب-دوباره MetaMaskØŒ یا اقدام دسترسی به کی٠تان از دستگاه دیگر، کود مخÙÛŒ جهت بازیابی کی٠تان، لازم خواهد بود." + }, + "backupNow": { + "message": "حالا پشتیبان بگیرید" + }, + "balance": { + "message": "صورت حساب" + }, + "balanceOutdated": { + "message": "صورت حساب ممکن انقضاء شده باشد" + }, + "basic": { + "message": "پایه" + }, + "blockExplorerUrl": { + "message": "بلاک کردن براوزر" + }, + "blockExplorerView": { + "message": "مشاهده حساب در 1$1", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "Ø§Ø³ØªÙØ§Ø¯Ù‡ شناسا بلوک ها" + }, + "browserNotSupported": { + "message": "مرورگر شما پشتیبانی نمیشود" + }, + "builtInCalifornia": { + "message": "MetaMask در کالیÙورنیا طراحی Ùˆ ساخته شده است." + }, + "buyWithWyre": { + "message": "ETH را توسط Wyre خریداری نمایید" + }, + "buyWithWyreDescription": { + "message": "Wyre به شما اجازه میدهد تا یک کردیت کارت را جهت پرداخت ETH مستقیمًا به حساب MetaMask تان Ø§Ø³ØªÙØ§Ø¯Ù‡ نمایید." + }, + "buyCoinSwitch": { + "message": "خرید بر اساس CoinSwitch " + }, + "buyCoinSwitchExplainer": { + "message": "CoinSwitch یک مقصد یک-ایستگاه است تا بیش از 300 رمز ارز را در بهترین نرخ مبادله نماید." + }, + "bytes": { + "message": "بایت ها" + }, + "off": { + "message": "خاموش" + }, + "ok": { + "message": "تأیید" + }, + "on": { + "message": "روشن" + }, + "optionalBlockExplorerUrl": { + "message": "بلاک کردن مرورگر URL (انتخابی)" + }, + "cancel": { + "message": "لغو" + }, + "cancelAttempt": { + "message": "لغو تلاش" + }, + "cancellationGasFee": { + "message": "لغو Ùیس گاز" + }, + "cancelled": { + "message": "لغو شد" + }, + "chainId": { + "message": "Ø¢ÛŒ دی زنجیره" + }, + "clickToRevealSeed": { + "message": "برای آشکار سازی کلمات مخÙÛŒ اینجا کلیک نمایید" + }, + "close": { + "message": "بستن" + }, + "chromeRequiredForHardwareWallets": { + "message": "برای وصل شدن به کی٠سخت Ø§ÙØ²Ø§Ø± شما باید MetaMask را در Ú¯ÙˆÚ¯Ù„ کروم Ø§Ø³ØªÙØ§Ø¯Ù‡ نمایید." + }, + "confirm": { + "message": "تأیید" + }, + "confirmed": { + "message": "تأیید شد" + }, + "confirmPassword": { + "message": "تأیید رمز" + }, + "confirmSecretBackupPhrase": { + "message": "تأیید عبارت پشتیبان مخÙÛŒ تان" + }, + "congratulations": { + "message": "تبریک" + }, + "connectHardwareWallet": { + "message": "اتصال کی٠سخت Ø§ÙØ²Ø§Ø±" + }, + "connect": { + "message": "اتصال" + }, + "connectingTo": { + "message": "در حال اتصال به 1$1" + }, + "connectingToKovan": { + "message": "در حال اتصال به شبکه آزمایشی Kovan" + }, + "connectingToMainnet": { + "message": "در حال اتصال به شبکه اصلی ایتریم" + }, + "connectingToRopsten": { + "message": "در حال اتصال به شبکه آزمایشی Ropsten" + }, + "connectingToRinkeby": { + "message": "در حال اتصال به شبکه آزمایشی Rinkeby" + }, + "connectingToLocalhost": { + "message": "در حال اتصال با Localhost 8545" + }, + "connectingToGoerli": { + "message": "در حال اتصال به شبکه آزمایشی Goerli " + }, + "continueToWyre": { + "message": "ادامه به Wyre" + }, + "continueToCoinSwitch": { + "message": "ادامه به CoinSwitch" + }, + "contractDeployment": { + "message": "تطبیق قرارداد" + }, + "copiedExclamation": { + "message": "Ú©Ù¾ÛŒ شد!" + }, + "copyAddress": { + "message": "کاپی آدرس به کلیپ بورد" + }, + "copyTransactionId": { + "message": "کاپی Ø¢ÛŒ دی معامله" + }, + "copiedTransactionId": { + "message": "Ø¢ÛŒ دی معامله کاپی شده" + }, + "copyToClipboard": { + "message": "Ú©Ù¾ÛŒ در بریده‌دان" + }, + "copyPrivateKey": { + "message": "این کلید خصوصی شما است (برای کاپی نمودن کلیک کنید)" + }, + "create": { + "message": "ایجاد" + }, + "createAccount": { + "message": "ایجاد حساب" + }, + "createAWallet": { + "message": "یک کی٠ایجاد کنید" + }, + "createPassword": { + "message": "ایجاد رمز عبور" + }, + "currencyConversion": { + "message": "تبادل واحد پول" + }, + "currentLanguage": { + "message": "زبان ÙØ¹Ù„ÛŒ" + }, + "customGas": { + "message": "گاز دلخواه" + }, + "customGasSubTitle": { + "message": "اضاÙÙ‡ نمودن Ùیس ممکن زمان پروسس را کاهش دهد، اما تضمین نمیشود." + }, + "customToken": { + "message": "رمزیاب دلخواه" + }, + "customRPC": { + "message": "RPC رایج" + }, + "decimalsMustZerotoTen": { + "message": "اعشاریه ها باید حد اقل 0ØŒ Ùˆ بیشتر از 36 نباشند." + }, + "decimal": { + "message": "اعشاریه های دقت" + }, + "defaultNetwork": { + "message": "شبکه خودکار برای معاملات Ether عبارت است از Main Net." + }, + "delete": { + "message": "حذÙ" + }, + "deleteAccount": { + "message": "حذ٠حساب" + }, + "deposit": { + "message": "سپرده" + }, + "depositEther": { + "message": "پرداخت ایتر" + }, + "details": { + "message": "جزئیات" + }, + "directDepositEther": { + "message": "پرداخت مستقیم ایتر" + }, + "directDepositEtherExplainer": { + "message": "در صورتیکه شما کدام ایتر داشته باشید، سریعترین روش برای Ú¯Ø±ÙØªÙ† ایتر در کی٠جدید تان توسط پرداخت مستقیم." + }, + "done": { + "message": "تمام" + }, + "downloadGoogleChrome": { + "message": "دانلود Ú¯ÙˆÚ¯Ù„ کروم" + }, + "downloadSecretBackup": { + "message": "این عبارت مخÙÛŒ پشتیبان را دانلود نموده Ùˆ بصورت مصؤن در هارد دیسک خارجی یا وسیله ذخیره دیگر رمز گذاری شده، ذخیره نمایید." + }, + "downloadStateLogs": { + "message": "دانلود Ø¯ÙØªØ±Ú†Ù‡ وضعیت" + }, + "dontHaveAHardwareWallet": { + "message": "آیا کی٠سخت Ø§ÙØ²Ø§Ø± ندارید؟" + }, + "dropped": { + "message": "نزول کرد" + }, + "edit": { + "message": "ویرایش" + }, + "editContact": { + "message": "ویرایش تماس" + }, + "endOfFlowMessage1": { + "message": "شما در امتحان موÙÙ‚ شدید - عبارت بازیابی را مصؤن نگهدارید، این مسؤلیت شماست!" + }, + "endOfFlowMessage2": { + "message": "هدایات برای ذخیره سازی آن به Ø´Ú©Ù„ مصؤون" + }, + "endOfFlowMessage3": { + "message": "نسخه پشتیبان را در جاهای مختل٠ثبت کنید" + }, + "endOfFlowMessage4": { + "message": "هرگز عبارت را با هیچکس در میان نگذارید." + }, + "endOfFlowMessage5": { + "message": "مراقب Ùیشینگ باشید! MetaMask هرگز در یک زمان عبارت بازیاب را نمی پرسد." + }, + "endOfFlowMessage6": { + "message": "در صورتیکه شما نیاز به Ú¯Ø±ÙØªÙ† دوباره پشتیبان عبارت بازیاب داشته باشید، میتوانید آنرا در Settings -> Security Ø¯Ø±ÛŒØ§ÙØª نمایید." + }, + "endOfFlowMessage7": { + "message": "در صورتیکه پرسشی داشته یا چیزی مشکوک را میبینید، به support@metamask.io ایمیل کنید." + }, + "endOfFlowMessage8": { + "message": "MetaMask نمیتواند عبارت بازیاب تان را دوباره Ø¯Ø±ÛŒØ§ÙØª نماید.\nبیشتر بدانید." + }, + "endOfFlowMessage9": { + "message": "بیشتر بدانید." + }, + "endOfFlowMessage10": { + "message": "همه انجام شد" + }, + "ensRegistrationError": { + "message": "خطا در ثبت نام ENS" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "نام ENS در شبکه کنونی Ø¯Ø±ÛŒØ§ÙØª نشد. به تبدیل آن به شبکه اصلی ایتریم تلاش نمایید." + }, + "enterAnAlias": { + "message": "یک نام مستعار را وارد کنید" + }, + "enterPassword": { + "message": "رمز عبور را وارد کنید" + }, + "enterPasswordContinue": { + "message": "برای ادامه رمز عبور را وارد کنید" + }, + "ethereumPublicAddress": { + "message": "آدرس عمومی ایتریم" + }, + "etherscanView": { + "message": "حساب را در Etherscan ببینید" + }, + "estimatedProcessingTimes": { + "message": "زمان های تخمینی پروسس" + }, + "expandView": { + "message": "توسعه ساحه دید" + }, + "exportPrivateKey": { + "message": "صدور کلید شخصی" + }, + "failed": { + "message": "ناموÙÙ‚ شد" + }, + "fast": { + "message": "سریع" + }, + "faster": { + "message": "سریع تر" + }, + "fiat": { + "message": "Ø­Ú©Ù… قانونی", + "description": "Exchange type" + }, + "fileImportFail": { + "message": "وارد کردن ÙØ§ÛŒÙ„ کار نمیکند؟ اینجا کلیک نمایید!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "ÙØ±Ø§Ù…وش کردن این دستگاه" + }, + "from": { + "message": "از" + }, + "functionType": { + "message": "نوعیت عملکرد" + }, + "gasLimit": { + "message": "محدوده گاز" + }, + "gasLimitInfoModalContent": { + "message": "محدوده گاز حد اکثر تعداد واحدات گاز است Ú©Ù‡ میخواهید مصر٠نمایید." + }, + "gasLimitTooLow": { + "message": "حدود گاز باید حد اقل 21000 باشد" + }, + "gasUsed": { + "message": "گاز Ø§Ø³ØªÙØ§Ø¯Ù‡ شد" + }, + "gasPrice": { + "message": "قیمت گاز (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "قیمت گاز خیلی Ú©Ù… است" + }, + "gasPriceInfoModalContent": { + "message": "قیمت گاز مبلغ ایتر را Ú©Ù‡ تصمیم پرداخت برای هر واحد گاز را داشته باشید، مشخص میکند." + }, + "gasPriceNoDenom": { + "message": "قیمت گاز" + }, + "general": { + "message": "عمومی" + }, + "generalSettingsDescription": { + "message": "تبادل واحد پول، واحد پول اصلی، زبان، شناسا های بلوکی" + }, + "getEther": { + "message": "اتر را بگیرید" + }, + "getEtherFromFaucet": { + "message": "اخذ ایتر از یک ÙØ§Ø³Øª برای 1$1", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "Ø¯Ø±ÛŒØ§ÙØª Ú©Ù…Ú©" + }, + "getStarted": { + "message": "شروع به کار" + }, + "happyToSeeYou": { + "message": "از دیدن شما خوشحال هستیم." + }, + "hardware": { + "message": "سخت Ø§ÙØ²Ø§Ø±" + }, + "hardwareWalletConnected": { + "message": "کی٠سخت Ø§ÙØ²Ø§Ø± وصل شد" + }, + "hardwareWallets": { + "message": "به کی٠سخت Ø§ÙØ²Ø§Ø± وصل کنید" + }, + "hardwareWalletsMsg": { + "message": "یک کی٠سخت Ø§ÙØ²Ø§Ø± را Ú©Ù‡ میخواهید با MetaMast Ø§Ø³ØªÙØ§Ø¯Ù‡ نمایید، انتخاب کنید" + }, + "havingTroubleConnecting": { + "message": "آیا در اتصال مشکلی دارید؟" + }, + "here": { + "message": "اینجا", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hexData": { + "message": "اطلاعات Hex" + }, + "hide": { + "message": "عدم نمایش" + }, + "hideTokenPrompt": { + "message": "آیا رمزیاب مخÙÛŒ شود؟" + }, + "history": { + "message": "سابقه" + }, + "import": { + "message": "وارد کردن", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "وارد سازی حساب" + }, + "importAccountMsg": { + "message": "حساب های وارد شده با عبارت بازیاب حساب MetaMask ایجاد شده اصلی تان یکجا نمیباشد. در مورد حساب های وارد شده بیشتر بدانید" + }, + "importAccountSeedPhrase": { + "message": "یک حساب با عبارت بازیاب را وارد کنید" + }, + "importWallet": { + "message": "وارد سازی Ú©ÛŒÙ" + }, + "importYourExisting": { + "message": "کی٠موجود تان را با Ø§Ø³ØªÙØ§Ø¯Ù‡ از عبارت رمزیاب 12 کلمه یی وارد کنید" + }, + "imported": { + "message": "وارد شده", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "وارد کردن با Ø§Ø³ØªÙØ§Ø¯Ù‡ از عبارت بازیاب حساب" + }, + "infoHelp": { + "message": "معلومات Ùˆ Ú©Ù…Ú©" + }, + "initialTransactionConfirmed": { + "message": "معامله آغازین تان توسط شبکه تأیید شد. برای Ø±ÙØªÙ† به عقب بالای OK کلیک کنید." + }, + "insufficientBalance": { + "message": "بیلانس ناکاÙÛŒ." + }, + "insufficientFunds": { + "message": "بودجه ناکاÙÛŒ." + }, + "insufficientTokens": { + "message": "رمزیاب های ناکاÙÛŒ." + }, + "invalidAddress": { + "message": "آدرس نامعتبر" + }, + "invalidAddressRecipient": { + "message": "آدرس Ø¯Ø±ÛŒØ§ÙØª کننده نامعتبر است" + }, + "knownAddressRecipient": { + "message": "آدرس شناخته شده قرارداد" + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "شبکه ETH نه، به حرو٠کوچک تنظیم کنید" + }, + "invalidInput": { + "message": "ورودی نامعتبر." + }, + "invalidRPC": { + "message": "RPC URL نا معتبر" + }, + "invalidBlockExplorerURL": { + "message": "Block Explorer URL نا معتبر" + }, + "invalidSeedPhrase": { + "message": "عبارت بازیابی نا معتبر" + }, + "jsonFile": { + "message": "ÙØ§ÛŒÙ„ JSON", + "description": "format for importing an account" + }, + "kovan": { + "message": "شبکه آزمایشی Kovan" + }, + "max": { + "message": "حداکثر" + }, + "learnMore": { + "message": "بیشتر بدانید" + }, + "ledgerAccountRestriction": { + "message": "لازم است تا حساب قبلی تان را قبل از اینکه جدید اضاÙÙ‡ کنید، مورد Ø§Ø³ØªÙØ§Ø¯Ù‡ قرار دهید." + }, + "letsGoSetUp": { + "message": "بلی، درست شد!" + }, + "likeToAddTokens": { + "message": "آیا میخواهید این رمزیاب ها را اضاÙÙ‡ نمایید؟" + }, + "links": { + "message": "لینک ها" + }, + "liveGasPricePredictions": { + "message": "پیش بینی های قیمت گاز" + }, + "loading": { + "message": "در حال بارکردن…" + }, + "loadingTokens": { + "message": "در حال بارگیری رمزیاب ها..." + }, + "loadMore": { + "message": "بارگیری بیشتر" + }, + "localhost": { + "message": "Localhost 8545 " + }, + "lock": { + "message": "خروج" + }, + "mainnet": { + "message": "شبکه اصلی ایتریم" + }, + "memorizePhrase": { + "message": "این عبارت را Ø­ÙØ¸ کنید." + }, + "memo": { + "message": "یادداشت" + }, + "message": { + "message": "پیام" + }, + "metamaskDescription": { + "message": "در حال اتصال شما با ایترم Ùˆ وب غیر متمرکز شده." + }, + "metamaskVersion": { + "message": "نسخه MetaMask" + }, + "mobileSyncText": { + "message": "لطÙًا رمز عبور را وارد نمایید تا تأیید شود Ú©Ù‡ خود شما هستید!" + }, + "myAccounts": { + "message": "حساب های من" + }, + "myWalletAccounts": { + "message": "حساب های کی٠من" + }, + "myWalletAccountsDescription": { + "message": "همه حساب های ایجاد شده MetaMask شما بصورت خودکار در این بخش اضاÙÙ‡ خواهد شد." + }, + "mustSelectOne": { + "message": "باید حداقل 1 رمزیاب را انتخاب کنید." + }, + "needEtherInWallet": { + "message": "برای تعامل با اپلیکیشن های غیر متمرکز شده با Ø§Ø³ØªÙØ§Ø¯Ù‡ از MetaMaskØŒ شما نیاز به ایتر در کی٠تان خواهید داشت." + }, + "needImportFile": { + "message": "شما باید یک ÙØ§ÛŒÙ„ برای وارد کردن را انتخاب کنید.", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "نمیتوان مبالغ منÙÛŒ ETH را ارسال کرد." + }, + "networkName": { + "message": "نام شبکه" + }, + "networks": { + "message": "شبکه ها" + }, + "networkSettingsDescription": { + "message": "اضاÙÙ‡ سازی Ùˆ ویرایش شبکه های دلخواه PRC" + }, + "nevermind": { + "message": "توجه نکنید" + }, + "newAccount": { + "message": "حساب جدید" + }, + "newAccountDetectedDialogMessage": { + "message": "آدرس جدید شناسایی شد! اینجا کلیک کنید تا به کتابچه آدرسهای شما اضاÙÙ‡ شود." + }, + "newAccountNumberName": { + "message": "حساب 1$1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "تماس جدید" + }, + "newContract": { + "message": "قرارداد جدید" + }, + "newPassword": { + "message": "رمز عبور جدید (حداقل 8 حرÙ)" + }, + "newNetwork": { + "message": "شبکه جدید" + }, + "newToMetaMask": { + "message": "آیا به MetaMask جدید هستید؟" + }, + "noAlreadyHaveSeed": { + "message": "نه خیر، من از قبل یک عبارت بازیاب داشتم" + }, + "protectYourKeys": { + "message": "کلید های خود را Ø­ÙØ¸ کنید!" + }, + "protectYourKeysMessage1": { + "message": "مراقب عبارت بازیاب تان باشید - Ú¯ÙØªÙ‡ هایی وجود دارد Ú©Ù‡ وبسایت ها تلاش میکنند تا از MetaMask نسخه برداری کنند. MetaMask هرگز از شما عبارت بازیاب را نمیپرسد!" + }, + "protectYourKeysMessage2": { + "message": "عبارت تان را مصؤن نگهدارید. در صورت مشاهده چیز مشکوک، یا در صورتیکه در مورد یک وبسایت مطمئن نیستید، به support@metamask.io ایمیل کنید" + }, + "rpcUrl": { + "message": "RPC URL جدید" + }, + "optionalChainId": { + "message": "Ø¢ÛŒ دی زنجیره (انتخابی)" + }, + "optionalSymbol": { + "message": "سمبول (انتخابی)" + }, + "newTotal": { + "message": "مجموع جدید" + }, + "newTransactionFee": { + "message": "Ùیس جدید معامله" + }, + "next": { + "message": "بعدی" + }, + "noAddressForName": { + "message": "هیچ آدرسی برای این نام تنظیم نشده است." + }, + "noConversionRateAvailable": { + "message": "هیچ نرخ تغییر موجود نمیباشد" + }, + "noTransactions": { + "message": "شما هیچ معامله ندارید" + }, + "notEnoughGas": { + "message": "گاز ناکاÙÛŒ است" + }, + "noWebcamFoundTitle": { + "message": "وب کام پیدا نشد" + }, + "noWebcamFound": { + "message": "وب Ú©Ù… کمپیوتر تان پیدا نشد. لطÙًا دوباره کوشش کنید." + }, + "ofTextNofM": { + "message": "به" + }, + "orderOneHere": { + "message": "یک Trezor یا Ledger را Ø³ÙØ§Ø±Ø´ داده Ùˆ پول های تان را در ذخیره سرد نگهدارید" + }, + "origin": { + "message": "مبدأ" + }, + "parameters": { + "message": "پارامتر ها" + }, + "participateInMetaMetrics": { + "message": "اشتراک در MetaMetrics" + }, + "participateInMetaMetricsDescription": { + "message": "در MetaMetrics اشتراک نمایید تا به ما Ú©Ù…Ú© شود MetaMask را بهتر بسازیم" + }, + "password": { + "message": "گذرواژه" + }, + "passwordsDontMatch": { + "message": "رمز های عبور مطابقت نمیکنند" + }, + "passwordNotLongEnough": { + "message": "رمز عبور کاÙÛŒ نیست" + }, + "pastePrivateKey": { + "message": "زنجیره کلید شخصی را در اینجا کاپی کنید:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "در حال تعلیق" + }, + "personalAddressDetected": { + "message": "آدرس شخصی تشخیص شد. آدرس قرارداد رمزیاب را وارد کنید." + }, + "prev": { + "message": "قبلی" + }, + "primaryCurrencySetting": { + "message": "واحد پول اصلی" + }, + "primaryCurrencySettingDescription": { + "message": "برای اولویت دهی نمایش قیمت ها در واحد پولی اصلی زنجیره (مثلًا ETH)ØŒ اصلی را انتخاب کنید. برای اولویت دهی نمایش قیمت ها در Ùیات واحد پولی شما، Ùیات را انتخاب کنید." + }, + "privacyMsg": { + "message": "خط‌مشی رازداری" + }, + "privateKey": { + "message": "کلید شخصی", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "هشدار: هرگز این کلید را ÙØ§Ø´ نسازید. هر کسیکه کلید های شخصی تان را داشته باشد میتواند هرگونه سرمایه موجود در حساب تان را سرقت نماید." + }, + "privateNetwork": { + "message": "شبکه شخصی" + }, + "queue": { + "message": "صÙ" + }, + "readdToken": { + "message": "شما میتوانید این رمزیاب را دوباره برای آینده با Ø±ÙØªÙ† به گزینه \"Add token\" در مینوی تنظیمات حساب ها، اضاÙÙ‡ نمایید." + }, + "recents": { + "message": "واپسین" + }, + "recipientAddress": { + "message": "آدرس Ø¯Ø±ÛŒØ§ÙØª کننده" + }, + "recipientAddressPlaceholder": { + "message": "جستجو، آدرس عمومی (0x)ØŒ یا ENS" + }, + "rejectAll": { + "message": "رد همه" + }, + "rejectTxsN": { + "message": "رد معاملات 1$1" + }, + "rejectTxsDescription": { + "message": "شما در حال رد دسته از معاملات 1$1 هستید." + }, + "rejected": { + "message": "رد شد" + }, + "reset": { + "message": "بازنشانی" + }, + "resetAccount": { + "message": "تنظیم مجدد حساب" + }, + "resetAccountDescription": { + "message": "دوباره سازی حساب تاریخچه معامله تان را پاک میکند." + }, + "deleteNetwork": { + "message": "شبکه حذ٠شود؟" + }, + "deleteNetworkDescription": { + "message": "آیا مطمئن هستید Ú©Ù‡ این شبکه حذ٠شود؟" + }, + "remindMeLater": { + "message": "بعدًا یادآوری کنید" + }, + "restoreFromSeed": { + "message": "بازگرداندن حساب؟" + }, + "restoreAccountWithSeed": { + "message": "حساب تان را با عبارت بازیاب، بازیابی کنید" + }, + "requestsAwaitingAcknowledgement": { + "message": "درخواست های Ú©Ù‡ منتظر رسیدگی اند" + }, + "required": { + "message": "لازم است" + }, + "restore": { + "message": "بازیابی" + }, + "revealSeedWords": { + "message": "کلمات بازیاب را آشکار کنید" + }, + "revealSeedWordsTitle": { + "message": "عبارت بازیاب" + }, + "revealSeedWordsDescription": { + "message": "در صورتیکه شما معمولًا براوزر ها را تغییر داده یا کمپیوتر ها را انتقال میدهید، شما این عبارت آغازین را نیاز خواهید داشت تا به حساب های تان دسترسی داشته باشید. آنها را در یکجای مصؤن Ùˆ مخÙÛŒ نگهدارید." + }, + "revealSeedWordsWarningTitle": { + "message": "این عبارت را با هیچکس شریک نسازید!" + }, + "revealSeedWordsWarning": { + "message": "این کلمات را میتوان جهت سرقت همه حساب های تان Ø§Ø³ØªÙØ§Ø¯Ù‡ نمود." + }, + "remove": { + "message": "پاک کردن" + }, + "removeAccount": { + "message": "حذ٠حساب" + }, + "removeAccountDescription": { + "message": "این حساب از کی٠تان حذ٠خواهد شد. لطÙًا مطمئن شوید Ú©Ù‡ عبارت اصلی بازیاب Ùˆ کلید شخصی را برای این حساب وارد شده قبل از ادامه با خود دارید. شما میتوانید حساب ها را دوباره از پایین حساب وارد یا ایجاد نمایید." + }, + "readyToConnect": { + "message": "آماده برای اتصال هستید؟" + }, + "rinkeby": { + "message": "شبکه آزمایشی Rinkeby" + }, + "ropsten": { + "message": "شبکه آزمایشی Ropsten" + }, + "goerli": { + "message": "شبکه آزمایشی Goerli" + }, + "save": { + "message": "ذخیره" + }, + "slow": { + "message": "آهسته" + }, + "slower": { + "message": "آهسته تر" + }, + "saveAsCsvFile": { + "message": "ذخیره منحیث ÙØ§ÛŒÙ„ CSV" + }, + "scanInstructions": { + "message": "رمز QR را در مقابل کمره تان قرار دهید" + }, + "scanQrCode": { + "message": "سکن کود QR" + }, + "search": { + "message": "جستجو" + }, + "searchResults": { + "message": "نتایج جستجو" + }, + "secretBackupPhrase": { + "message": "عبارت مخÙÛŒ پشتیبان" + }, + "secretBackupPhraseDescription": { + "message": "عبارت مخÙÛŒ پشتیبان تان نسخه پشتیبان Ùˆ دوباره سازی حساب را تسهیل میسازد." + }, + "secretBackupPhraseWarning": { + "message": "هشدار: هرگز عبارت پشتیبان تان را به کسی ÙØ§Ø´ نسازید. هرکسیکه این عبارت را داشته باشد ایتر شما را برای همیشه خواهد Ú¯Ø±ÙØª." + }, + "secretPhrase": { + "message": "جهت بازیابی خزانه تان عبارت دوازده کلمه یی تان را اینجا وارد کنید." + }, + "securityAndPrivacy": { + "message": "امنیت Ùˆ حریم خصوصی" + }, + "securitySettingsDescription": { + "message": "تنظیمات حریم خصوصی Ùˆ عبارت بازیاب Ú©ÛŒÙ" + }, + "seedPhrasePlaceholder": { + "message": "هر کلمه را با یک ÙØ§ØµÙ„Ù‡ واحد جدا سازید" + }, + "seedPhraseReq": { + "message": "عبارات بازیاب 12 کلمه اند" + }, + "selectCurrency": { + "message": "واحد پول را انتخاب کنید" + }, + "selectEachPhrase": { + "message": "لطÙًا جهت اطمینان از درستی، هر عبارت را انتخاب کنید." + }, + "selectLocale": { + "message": "محل را انتخاب کنید" + }, + "selectType": { + "message": "نوعیت را انتخاب کنید" + }, + "send": { + "message": "ارسال" + }, + "sendAmount": { + "message": "ارسال مبلغ" + }, + "sendETH": { + "message": "ارسال ETH" + }, + "sendTokens": { + "message": "رمزیاب ها را ارسال کنید" + }, + "sentEther": { + "message": "ایتر ارسال شد" + }, + "sentTokens": { + "message": "رمزیاب های ÙØ±Ø³ØªØ§Ø¯Ù‡ شده" + }, + "separateEachWord": { + "message": "هر کلمه را با یک ÙØ§ØµÙ„Ù‡ واحد جدا سازید" + }, + "searchTokens": { + "message": "رمزیاب های جستجو" + }, + "selectAnAccount": { + "message": "یک حساب را انتخاب کنید" + }, + "selectAnAccountHelp": { + "message": "برای مشاهده MetaMask حساب را انتخاب نمایید" + }, + "selectAHigherGasFee": { + "message": "یک Ùیس بالاتر گاز را انتخاب نمایید تا پروسس معامله تان تسریع یابد.*" + }, + "selectHdPath": { + "message": "انتخاب مسیر HD" + }, + "selectPathHelp": { + "message": "در صورتیکه شما حساب های موجود Ø¯ÙØªØ± حساب را در ذیل نمیبینید، مسیر ها به \"Legacy (MEW / MyCrypto)\"  تغییر دهید" + }, + "settings": { + "message": "تنظیمات" + }, + "showAdvancedGasInline": { + "message": "کنترول های Ù¾ÛŒØ´Ø±ÙØªÙ‡ گاز" + }, + "showAdvancedGasInlineDescription": { + "message": "این را انتخاب نمایید تا قیمت گاز را نشان داده Ùˆ کنترول ها را بصورت مستقیم در ØµÙØ­Ø§Øª ارسال Ùˆ تأیید محدود نماید." + }, + "showFiatConversionInTestnets": { + "message": "نمایش تغییرات Testnets" + }, + "showFiatConversionInTestnetsDescription": { + "message": "این را جهت تبادل Ùیات بر تیست نیت ها انتخاب نمایید" + }, + "showPrivateKeys": { + "message": "نمایش کلید های شخصی" + }, + "showHexData": { + "message": "نمایش اطلاعات Hex" + }, + "showHexDataDescription": { + "message": "برای نمایش بخش اطلاعات hex در ØµÙØ­Ù‡ ارسال این را انتخاب نمایید" + }, + "sign": { + "message": "علامت" + }, + "signatureRequest": { + "message": "درخواست امضاء" + }, + "signed": { + "message": "وارد شد" + }, + "signNotice": { + "message": "علامت کردن این پیام میتواند\nعوارض جانبی داشته باشد. تنها پیام های را Ú©Ù‡\nاز سایت های Ú©Ù‡ کاملًا اعتماد داشته باشید با حساب خود علامت بزنید.\nاین روش خطرناک در نسخه آینده از بین برده خواهد شد." + }, + "sigRequest": { + "message": "درخواست امضاء" + }, + "somethingWentWrong": { + "message": "اوه! مشکلی پیش آمده." + }, + "speedUp": { + "message": "تسریع" + }, + "speedUpCancellation": { + "message": "این لغو را تسریع بخشید" + }, + "speedUpTransaction": { + "message": "تسریع این معامله" + }, + "switchNetworks": { + "message": "تغییر شبکه ها" + }, + "stateLogs": { + "message": "Ø¯ÙØªØ±Ú†Ù‡ وضعیت" + }, + "stateLogsDescription": { + "message": "Ø¯ÙØªØ±Ú†Ù‡ وضعیت شامل آدرس های حساب عمومی Ùˆ معاملات ÙØ±Ø³ØªØ§Ø¯Ù‡ شده تان میباشد." + }, + "stateLogError": { + "message": "خطا در بازیابی Ø¯ÙØªØ±Ú†Ù‡ وضعیت" + }, + "step1HardwareWallet": { + "message": "1. اتصال کی٠سخت Ø§ÙØ²Ø§Ø±" + }, + "step1HardwareWalletMsg": { + "message": "کی٠سخت Ø§ÙØ²Ø§Ø± تان را مستقیمًا به کمپیوتر وصل نمایید." + }, + "step2HardwareWallet": { + "message": "2. انتخاب یک حساب" + }, + "step2HardwareWalletMsg": { + "message": "حسابی را Ú©Ù‡ میخواهید مشاهده نمایید انتخاب کنید. شما میتوانید یک حساب را در یک زمان انتخاب نمایید." + }, + "step3HardwareWallet": { + "message": "3. آغاز Ø§Ø³ØªÙØ§Ø¯Ù‡ از dApps Ùˆ بیشتر!" + }, + "step3HardwareWalletMsg": { + "message": "حساب سخت Ø§ÙØ²Ø§Ø± تان را همچنانکه در حساب ایتریم Ø§Ø³ØªÙØ§Ø¯Ù‡ میکنید، Ø§Ø³ØªÙØ§Ø¯Ù‡ نمایید. وارد dApps شده، Eth را ارسال نموده، رمزیاب های ERC20 Ùˆ غیر-قابل تبدیل به پول مانند CryptoKitties را خریداری Ùˆ ذخیره نمایید." + }, + "storePhrase": { + "message": "این عبارت را در یک نرم Ø§ÙØ²Ø§Ø± مدیریت رمز عبور مانند 1Password ذخیره نمایید." + }, + "submitted": { + "message": "ارائه شد" + }, + "supportCenter": { + "message": "از مرکز حمایت ما دیدن نمایید" + }, + "symbol": { + "message": "سمبول" + }, + "symbolBetweenZeroTwelve": { + "message": "نماد باید 11 کاراکتر یا کمتر باشد." + }, + "syncWithMobile": { + "message": "همگام سازی با موبایل" + }, + "syncWithMobileTitle": { + "message": "همگام سازی با موبایل" + }, + "syncWithMobileDesc": { + "message": "شما میتوانید حساب ها Ùˆ معلومات خویش را با دستگاه موبایل تان همگام بسازید. اپلیکیشن MetaMask را باز نموده به \"Settings\" Ø±ÙØªÙ‡ Ùˆ بالای \"Sync from Browser Extension\" کلیک کنید" + }, + "syncWithMobileDescNewUsers": { + "message": "در صورتیکه شما اپلیکیشن موبایل MetaMask را برای بار اول باز کرده اید، Ùقط گام ها را در موبایل تان دنبال نمایید." + }, + "syncWithMobileScanThisCode": { + "message": "این کود را با اپلیکیشن موبایل MetaMask سکن نمایید" + }, + "syncWithMobileBeCareful": { + "message": "مطمئن شوید Ú©Ù‡ هیچکس هنگامیکه این کود را سکن میکنید، به ØµÙØ­Ù‡ شما نمیبیند" + }, + "syncWithMobileComplete": { + "message": "دیتای شما موÙقانه همگام سازی شد. از اپلیکیشن موبایل MetaMask لذت ببرید!" + }, + "terms": { + "message": "شرایط Ø§Ø³ØªÙØ§Ø¯Ù‡" + }, + "testFaucet": { + "message": " آزمایش ÙØ§Ø³ÛŒØª یا Test Faucet " + }, + "thisWillCreate": { + "message": "این یک کی٠جدید Ùˆ عبارت بازیاب را ایجاد خواهد کرد" + }, + "tips": { + "message": "انعام" + }, + "to": { + "message": "به" + }, + "token": { + "message": "رمزیاب" + }, + "tokenAlreadyAdded": { + "message": "رمزیاب از قبل اضاÙÙ‡ شده است." + }, + "tokenContractAddress": { + "message": "آدرس قرارداد رمزیاب" + }, + "tokenSymbol": { + "message": "سمبول رمزیاب" + }, + "total": { + "message": "مجموع" + }, + "transaction": { + "message": "معامله" + }, + "transactionConfirmed": { + "message": "معامله به 1$2 تأیید شد." + }, + "transactionCreated": { + "message": "معامله با ارزش 1$1 در 2$2 ایجاد شد." + }, + "transactionDropped": { + "message": "معامله به 1$2 نزول کرد." + }, + "transactionSubmitted": { + "message": "معامله با Ùیس گاز 1$1 در 2$2 ارائه شد." + }, + "transactionResubmitted": { + "message": "معامله دوباره با Ùیس Ø§ÙØ²Ø§ÛŒØ´ ÛŒØ§ÙØªÙ‡ گاز به 1$1 در 2$2 تسلیم داده شد" + }, + "transactionUpdated": { + "message": "معامله به 1$2 بروزرسانی شد." + }, + "transactionErrored": { + "message": "معامله با خطا مواجه شد." + }, + "transactionCancelAttempted": { + "message": "برای لغو معامله با Ùیس گاز 1$1 در 2$2 تلاش شده" + }, + "transactionCancelSuccess": { + "message": "معامله به 1$2 موÙقانه لغو شد" + }, + "transactionError": { + "message": "خطا معامله. استثناء در کود قرارداد گذاشته شده است." + }, + "transactionErrorNoContract": { + "message": "در حال تلاش برای درخواست یک عملکرد مرتبط به آدرس غیر-قرارداد" + }, + "transactionFee": { + "message": "Ùیس معامله" + }, + "transactionTime": { + "message": "زمان معامله" + }, + "transfer": { + "message": "انتقال" + }, + "transferBetweenAccounts": { + "message": "انتقال میان حساب های من" + }, + "transferFrom": { + "message": "انتقال از" + }, + "troubleTokenBalances": { + "message": "ما در بارگیری صورت حساب های رمزیاب تان دچار مشکل شدیم. شما میتوانید آنها را مشاهده کنید", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "امتحان مجدد" + }, + "typePassword": { + "message": "رمز عبور MetaMask تان را تایپ نمایید" + }, + "unapproved": { + "message": "تصدیق ناشده" + }, + "units": { + "message": "واحد ها" + }, + "unknown": { + "message": "ناشناس" + }, + "unknownNetwork": { + "message": "شبکه خصوصی ناشناخته" + }, + "unknownQrCode": { + "message": "خطا: ما نتوانستیم کود QR را شناسایی نماییم" + }, + "unknownCameraErrorTitle": { + "message": "اوه! مشکلی ایجاد شد" + }, + "unknownCameraError": { + "message": "هنگام تلاش برای دسترسی به کمره شما خطایی به وجود آمد. لطÙًا دوباره تلاش کنید..." + }, + "unlock": { + "message": "باز کردن Ù‚ÙÙ„" + }, + "unlockMessage": { + "message": "وب غیر متمرکز شده انتظار میکشد" + }, + "updatedWithDate": { + "message": "بروزرسانی شد 1$1" + }, + "urlErrorMsg": { + "message": "URl ها نیازمند پیشوند مناسب HTTP/HTTPS اند." + }, + "usedByClients": { + "message": "Ø§Ø³ØªÙØ§Ø¯Ù‡ شده توسط گروهی از مشتریان مختلÙ" + }, + "userName": { + "message": "نام کاربری" + }, + "viewAccount": { + "message": "مشاهده حساب" + }, + "viewinExplorer": { + "message": "مشاهده در براوزر" + }, + "viewContact": { + "message": "مشاهده تماس" + }, + "viewOnCustomBlockExplorer": { + "message": "مشاهده در 1$1" + }, + "viewOnEtherscan": { + "message": "مشاهده در ایترسکن" + }, + "visitWebSite": { + "message": "از وب سایت ما دیدن نمایید" + }, + "walletSeed": { + "message": "بازیاب Ú©ÛŒÙ" + }, + "welcomeBack": { + "message": "بازگشت شما را خوش‌آمد می‌گوییم!" + }, + "welcome": { + "message": "به MetaMask خوش آمدید" + }, + "writePhrase": { + "message": "این عبارت را در یک ØµÙØ­Ù‡ کاغذ نوشته Ùˆ در یک موقعیت مصؤن نگهدارید. در صورتیکه شما امنیت بیشتر از این میخواهید، آنرا در ØµÙØ­Ø§Øª متعدد کاغذ نوشته Ùˆ در 2 - 3 موقعیت مختل٠نگهدارید." + }, + "yesLetsTry": { + "message": "بلی، بیایید امتحان کنیم" + }, + "youNeedToAllowCameraAccess": { + "message": "لازم است تا شما جهت Ø§Ø³ØªÙØ§Ø¯Ù‡ از این مشخصه، به کمره اجازه دسترسی بدهید." + }, + "yourSigRequested": { + "message": "امضاء شما درخواست میشود" + }, + "youSign": { + "message": "شما در حال ورود هستید" + }, + "yourPrivateSeedPhrase": { + "message": "عبارت بازیاب شخصی شما" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "قیمت ØµÙØ± گاز بسوی سرعت" + } +} diff --git a/app/_locales/fi/messages.json b/app/_locales/fi/messages.json new file mode 100644 index 000000000000..62ac9fd9e88a --- /dev/null +++ b/app/_locales/fi/messages.json @@ -0,0 +1,1307 @@ +{ + "chartOnlyAvailableEth": { + "message": "Kaavio saatavilla vain Ethereum-verkoissa." + }, + "contractInteraction": { + "message": "Sopimustoiminta" + }, + "reject": { + "message": "Hylkää" + }, + "about": { + "message": "Tietoja asetuksista" + }, + "aboutSettingsDescription": { + "message": "Versio, tukikeskus ja yhteystiedot" + }, + "acceleratingATransaction": { + "message": "* Tapahtuman nopeuttaminen käyttämällä korkeampaa gas-hintaa parantaa mahdollisuutta, että verkko käsittelee sen nopeammin, mutta tämä ei ole aina taattua." + }, + "accessingYourCamera": { + "message": "Muodostamme yhteyttä kameraasi..." + }, + "account": { + "message": "Tili" + }, + "accountDetails": { + "message": "Tilin tiedot" + }, + "accountName": { + "message": "Tilin nimi" + }, + "accountOptions": { + "message": "Tilivaihtoehdot" + }, + "accountSelectionRequired": { + "message": "Sinun on valittava tili!" + }, + "activityLog": { + "message": "toimintaloki" + }, + "addNetwork": { + "message": "Lisää verkko" + }, + "addRecipient": { + "message": "Lisää vastaanottaja" + }, + "advanced": { + "message": "Lisäasetukset" + }, + "advancedSettingsDescription": { + "message": "Käytä kehittäjän ominaisuuksia, lataa tilalokeja, palauta tilit, asenna testiverkostoja ja muokattavia RPC:itä" + }, + "advancedOptions": { + "message": "Tarkemmat vaihtoehdot" + }, + "addToAddressBook": { + "message": "Lisää osoitekirjaan" + }, + "addToAddressBookModalPlaceholder": { + "message": "esim. Jukka E." + }, + "addAlias": { + "message": "Lisää alias" + }, + "addToken": { + "message": "Lisää tietue" + }, + "addTokens": { + "message": "Lisää poletteja" + }, + "addSuggestedTokens": { + "message": "Lisää ehdotetut käyttötunnukset" + }, + "addAcquiredTokens": { + "message": "Lisää MetaMaskia käyttämällä hankkimasi tietueet" + }, + "amount": { + "message": "Summa" + }, + "appDescription": { + "message": "Ethereum-kukkaro selaimessasi", + "description": "The description of the application" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "approve": { + "message": "Hyväksy" + }, + "approved": { + "message": "Hyväksytty" + }, + "asset": { + "message": "Omaisuuserä" + }, + "attemptingConnect": { + "message": "Yritetään yhdistää lohkoketjuun." + }, + "attemptToCancel": { + "message": "Yritetäänkö peruuttaa?" + }, + "attemptToCancelDescription": { + "message": "Tämän yrityksen lähettäminen ei takaa, että alkuperäinen tapahtuma peruutettaisiin. Mikäli peruutusyritys onnistuu, sinulta veloitetaan yllä mainittu tapahtumamaksu." + }, + "attributions": { + "message": "Attribuutiot" + }, + "autoLockTimeLimit": { + "message": "Automaattisen uloskirjautumisen ajastin (minuuttia)" + }, + "autoLockTimeLimitDescription": { + "message": "Määritä, montako minuuttia MetaMask on ollut joutilaana ennen kuin sinut kirjataan automaattisesti ulos" + }, + "average": { + "message": "Keskiverto" + }, + "back": { + "message": "Edellinen" + }, + "backToAll": { + "message": "Takaisin kaikkiin" + }, + "backupApprovalNotice": { + "message": "Varmuuskopioi salainen palautuskoodisi pitääksesi kukkarosi ja varasi turvassa." + }, + "backupApprovalInfo": { + "message": "Tämä salainen koodi vaaditaan kukkarosi palauttamiseen siinä tapauksessa, että kadotat laitteesi, unohdat salasanasi, joudut asentamaan MetaMaskin uudestaan tai haluat käyttää lompakkoasi jollakin toisella laitteella." + }, + "backupNow": { + "message": "Tee varmuuskopio nyt" + }, + "balance": { + "message": "Saldo" + }, + "balanceOutdated": { + "message": "Saldo saattaa olla vanhentunut" + }, + "basic": { + "message": "Perusvaihtoehdot" + }, + "blockExplorerUrl": { + "message": "Lohkonhallinta" + }, + "blockExplorerView": { + "message": "Näytä tili kohteessa $1", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "Käytä Blockies Identiconia" + }, + "browserNotSupported": { + "message": "Selaintasi ei tueta..." + }, + "builtInCalifornia": { + "message": "MetaMask on suunniteltu ja koottu Kaliforniassa." + }, + "buyWithWyre": { + "message": "Osta ETH:ta Wyrella" + }, + "buyWithWyreDescription": { + "message": "Wyre antaa sinun käyttää luottokorttia, jotta voit tallettaa ETH:ta suoraan MetaMask-tilillesi." + }, + "buyCoinSwitch": { + "message": "Osta CoinSwitchissa" + }, + "buyCoinSwitchExplainer": { + "message": "CoinSwitch on yhden pysähdyksen kohde yli 300 kryptovaluutan vaihtoon parhailla kursseilla." + }, + "bytes": { + "message": "Tavua" + }, + "off": { + "message": "Päältä" + }, + "on": { + "message": "Käytössä" + }, + "optionalBlockExplorerUrl": { + "message": "Estä Explorerin URL-osoite (valinnainen)" + }, + "cancel": { + "message": "Peruuta" + }, + "cancelAttempt": { + "message": "Peruuta yritys" + }, + "cancellationGasFee": { + "message": "Peruutuksen gas-maksu" + }, + "cancelled": { + "message": "Peruttu" + }, + "chainId": { + "message": "Ketjun tunnus" + }, + "clickToRevealSeed": { + "message": "Paljasta salaiset sanat napsauttamalla tästä" + }, + "close": { + "message": "Sulje" + }, + "chromeRequiredForHardwareWallets": { + "message": "Sinun tarvitsee käyttää MetaMaskia Google Chromessa voidaksesi yhdistää laitteistokukkaroosi." + }, + "confirm": { + "message": "Vahvista" + }, + "confirmed": { + "message": "Vahvistettu" + }, + "confirmPassword": { + "message": "Vahvista salasana" + }, + "confirmSecretBackupPhrase": { + "message": "Vahvista salainen varmistuslauseesi" + }, + "congratulations": { + "message": "Onneksi olkoon" + }, + "connectHardwareWallet": { + "message": "Yhdistä laitteistokukkaro" + }, + "connect": { + "message": "Muodosta yhteys" + }, + "connectingTo": { + "message": "Yhdistetään summaan $1 " + }, + "connectingToKovan": { + "message": "Yhdistetään Kovanin koeverkkoon" + }, + "connectingToMainnet": { + "message": "Yhdistetään Ethereumin pääverkkoon" + }, + "connectingToRopsten": { + "message": "Yhdistetään Ropstenin koeverkkoon" + }, + "connectingToRinkeby": { + "message": "Yhdistetään Rinkebyn koeverkkoon" + }, + "connectingToLocalhost": { + "message": "Yhdistetään kohteeseen Localhost 8545" + }, + "connectingToGoerli": { + "message": "Yhdistetään Goerlin testiverkostoon" + }, + "continueToWyre": { + "message": "Jatka Wyreen" + }, + "continueToCoinSwitch": { + "message": "Jatka CoinSwitchiin" + }, + "contractDeployment": { + "message": "Sopimuksen käyttö" + }, + "copiedExclamation": { + "message": "Kopioitu" + }, + "copyAddress": { + "message": "Kopioi osoite leikepöydälle" + }, + "copyTransactionId": { + "message": "Kopioi tapahtuman tunnus" + }, + "copiedTransactionId": { + "message": "Kopioitu tapahtuman tunnus" + }, + "copyToClipboard": { + "message": "Kopioi leikepöydälle" + }, + "copyPrivateKey": { + "message": "Tämä on yksityinen avaimesi (kopioi napsauttamalla)" + }, + "create": { + "message": "Luo" + }, + "createAccount": { + "message": "Luo tili" + }, + "createAWallet": { + "message": "Luo kukkaro" + }, + "createPassword": { + "message": "Luo salasana" + }, + "currencyConversion": { + "message": "Valuuttamuunnin" + }, + "currentLanguage": { + "message": "Nykyinen kieli" + }, + "customGas": { + "message": "Mukauta bensa" + }, + "customGasSubTitle": { + "message": "Taksan korottaminen saattaa vähentää käsittelyaikaa, mutta siitä ei anneta takeita." + }, + "customToken": { + "message": "Mukautettu tietue" + }, + "customRPC": { + "message": "Mukautettu RPC" + }, + "decimalsMustZerotoTen": { + "message": "Desimaalien on oltava vähintään 0 ja korkeintaan 36." + }, + "decimal": { + "message": "Tarkkuusdesimaalit" + }, + "defaultNetwork": { + "message": "Oletusverkko Ether-tapahtumille on Main Net." + }, + "delete": { + "message": "Poista" + }, + "deleteAccount": { + "message": "Poista tili" + }, + "deposit": { + "message": "Talleta" + }, + "depositEther": { + "message": "Talleta Etheriä" + }, + "details": { + "message": "Tiedot" + }, + "directDepositEther": { + "message": "Talleta etheriä suoraan" + }, + "directDepositEtherExplainer": { + "message": "Jos sinulla on jo etheriä, nopein tapa hankkia etheriä uuteen lompakkoosi on suoratalletus." + }, + "done": { + "message": "Valmis" + }, + "downloadGoogleChrome": { + "message": "Lataa Google Chrome" + }, + "downloadSecretBackup": { + "message": "Lataa tämä salainen varmuuskopio lause ja pidä se turvassa ulkoisella, salatulla kovalevyllä tai muussa tallennustilassa." + }, + "downloadStateLogs": { + "message": "Lataa tilalokit" + }, + "dontHaveAHardwareWallet": { + "message": "Eikö sinulla ole laitteistokukkaroa?" + }, + "dropped": { + "message": "Luovutettu" + }, + "edit": { + "message": "Muokkaa" + }, + "editContact": { + "message": "Muokkaa yhteystietoa" + }, + "endOfFlowMessage1": { + "message": "Läpäisit kokeen – pidä salaustekstisi turvassa. Se on sinun vastuullasi!" + }, + "endOfFlowMessage2": { + "message": "Vihjeitä sen turvallisesta säilyttämisestä" + }, + "endOfFlowMessage3": { + "message": "Tallenna varmuuskopio useihin eri paikkoihin" + }, + "endOfFlowMessage4": { + "message": "Älä koskaan luovuta lausetta kenellekään." + }, + "endOfFlowMessage5": { + "message": "Varo tietojenkalastelua! MetaMask ei koskaan pyydä spontaanisti siemenlausettasi." + }, + "endOfFlowMessage6": { + "message": "Jos tarvitse uuden varmuuskopion juurilauseestasi, niin se löytyy osiosta Asetukset -> Turvallisuus." + }, + "endOfFlowMessage7": { + "message": "Jos sinulla on joskus jotakin kysyttävää tai jos näet jotakin epäilyttävää, lähetä sähköpostia osoitteeseen support@metamask.io." + }, + "endOfFlowMessage8": { + "message": "MetaMask ei pysty palauttamaan salaustekstiäsi. Lue lisää." + }, + "endOfFlowMessage9": { + "message": "Lue lisää." + }, + "endOfFlowMessage10": { + "message": "Valmista" + }, + "ensRegistrationError": { + "message": "Virhe ENS-nimen rekisteröinnissä" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "ENS-nimeä ei löytynyt nykyisestä verkosta. Koeta vaihtaa Ethereumin pääverkkoon." + }, + "enterAnAlias": { + "message": "Anna peitenimi" + }, + "enterPassword": { + "message": "Kirjoita salasana" + }, + "enterPasswordContinue": { + "message": "Syötä salasana voidaksesi jatkaa" + }, + "ethereumPublicAddress": { + "message": "Ethereumin julkinen osoite" + }, + "etherscanView": { + "message": "Tarkastele tiliä Etherscanissa" + }, + "estimatedProcessingTimes": { + "message": "Arvioidut käsittelyajat" + }, + "expandView": { + "message": "Laajenna näkymää" + }, + "exportPrivateKey": { + "message": "Vie yksityinen avain" + }, + "failed": { + "message": "Epäonnistui" + }, + "fast": { + "message": "Nopea" + }, + "faster": { + "message": "Nopeammin" + }, + "fiat": { + "message": "Kiinteä", + "description": "Exchange type" + }, + "fileImportFail": { + "message": "Eikö tiedoston tuominen onnistu? Klikkaa tästä!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "Unohda tämä laite" + }, + "from": { + "message": "Alkaen" + }, + "functionType": { + "message": "Funktion tyyppi" + }, + "gasLimit": { + "message": "Gas-raja" + }, + "gasLimitInfoModalContent": { + "message": "Polttoaineraja tarkoittaa suurinta mahdollista polttoainemäärää, jonka olet valmis kuluttamaan." + }, + "gasLimitTooLow": { + "message": "Gas-rajan tulee olla vähintään 21 000" + }, + "gasUsed": { + "message": "Käytetty bensaa" + }, + "gasPrice": { + "message": "Gas-hinta (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "Gas-hinta erittäin alhainen" + }, + "gasPriceInfoModalContent": { + "message": "Polttoaineen hinta määrittää Ether-määrän, jonka olet valmis maksamaan jokaisesta polttoaineyksiköstä." + }, + "gasPriceNoDenom": { + "message": "Bensan hinta" + }, + "general": { + "message": "Yleistä" + }, + "generalSettingsDescription": { + "message": "Valuuttamuunnin, päävaluutta, kieli, blockies identicon" + }, + "getEther": { + "message": "Hanki Etheriä" + }, + "getEtherFromFaucet": { + "message": "Hanki etheriä faucetista kohteelle $1", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "Pyydä apua." + }, + "getStarted": { + "message": "Aloitusopas" + }, + "happyToSeeYou": { + "message": "Meistä on mukava nähdä sinut." + }, + "hardware": { + "message": "laitteisto" + }, + "hardwareWalletConnected": { + "message": "Laitteistokukkaro yhdistetty" + }, + "hardwareWallets": { + "message": "Yhdistä kiinteän laitteiston lompakko" + }, + "hardwareWalletsMsg": { + "message": "Valitse laitteistokukkaro, jota haluaisit käyttää MetaMaskilla" + }, + "havingTroubleConnecting": { + "message": "Onko sinulla yhdistämisvaikeuksia?" + }, + "here": { + "message": "tässä", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hexData": { + "message": "Hex-tiedot" + }, + "hide": { + "message": "Piilota" + }, + "hideTokenPrompt": { + "message": "Piilotetaanko tietue?" + }, + "history": { + "message": "Historia" + }, + "import": { + "message": "Tuo", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "Tuo tili" + }, + "importAccountMsg": { + "message": "Tuotuja tilejä ei liitetä alkuperäisen MetaMask-tilisi siemenlauseeseen. Lue lisää tuoduista tileistä" + }, + "importAccountSeedPhrase": { + "message": "Tuo tili siemenlauseella" + }, + "importWallet": { + "message": "Tuo kukkaro" + }, + "importYourExisting": { + "message": "Tuo nykyinen lompakkosi käyttäen 12 sanan \n siemenlausetta" + }, + "imported": { + "message": "Tuotu", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "Tuo käyttäen tilin siemenlausetta" + }, + "infoHelp": { + "message": "Tietoja ja ohje" + }, + "initialTransactionConfirmed": { + "message": "Verkko hyväksyi alkuperäisen tapahtumasi. Siirry takaisin napsauttamalla OK-painiketta." + }, + "insufficientBalance": { + "message": "Liian pieni saldo." + }, + "insufficientFunds": { + "message": "Ei tarpeeksi varoja." + }, + "insufficientTokens": { + "message": "Liian vähän tietueita." + }, + "invalidAddress": { + "message": "Virheellinen osoite" + }, + "invalidAddressRecipient": { + "message": "Vastaanottajan osoite on virheellinen" + }, + "knownAddressRecipient": { + "message": "Tunnettu sopimusosoite." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "Ei ole ETH-verkosto; vaihda pieniin kirjaimiin" + }, + "invalidInput": { + "message": "Virheellinen syötetty arvo." + }, + "invalidRPC": { + "message": "Virheellinen RPC:n URL-osoite" + }, + "invalidBlockExplorerURL": { + "message": "Virheellinen Block Explorer URL-osoite" + }, + "invalidSeedPhrase": { + "message": "Virheellinen salausteksti" + }, + "jsonFile": { + "message": "JSON-tiedosto", + "description": "format for importing an account" + }, + "kovan": { + "message": "Kovanin koeverkko" + }, + "max": { + "message": "Maks" + }, + "learnMore": { + "message": "Lisätietoa" + }, + "ledgerAccountRestriction": { + "message": "Sinun tarvitsee käyttää edellistä tiliäsi ennen kuin voit lisätä uuden." + }, + "letsGoSetUp": { + "message": "Kyllä, valmistaudutaan!" + }, + "likeToAddTokens": { + "message": "Haluaisitko lisätä nämä poletit?" + }, + "links": { + "message": "Linkit" + }, + "liveGasPricePredictions": { + "message": "Polttoaineen hintojen live-ennusteet" + }, + "loading": { + "message": "Ladataan..." + }, + "loadingTokens": { + "message": "Käyttötunnuksia ladataan..." + }, + "loadMore": { + "message": "Lataa lisää" + }, + "localhost": { + "message": "Paikallisjoukko 8545" + }, + "lock": { + "message": "Kirjaudu ulos" + }, + "mainnet": { + "message": "Ethereumin pääverkko" + }, + "memorizePhrase": { + "message": "Opettele tämä teksti ulkoa." + }, + "memo": { + "message": "muistio" + }, + "message": { + "message": "Viesti" + }, + "metamaskDescription": { + "message": "Sinua yhdistetään Ethereumiin ja hajautettuun verkkoon." + }, + "metamaskVersion": { + "message": "MetaMask-versio" + }, + "mobileSyncText": { + "message": "Vahvista henkilöllisyytesi antamalla salasanasi!" + }, + "myAccounts": { + "message": "Omat tilit" + }, + "myWalletAccounts": { + "message": "Omat kukkarotilini" + }, + "myWalletAccountsDescription": { + "message": "Kaikki MetaMaskilla luodut tilisi lisätään automaattisesti tähän osastoon." + }, + "mustSelectOne": { + "message": "Valittava vähintään 1 poletti." + }, + "needEtherInWallet": { + "message": "Ollaksesi vuorovaikutuksessa hajautettujen sovellusten kanssa sinulla on oltava lompakossasi Ether." + }, + "needImportFile": { + "message": "Sinun tarvitsee valita tuotava tiedosto.", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "ETH:ta ei voi lähettää negatiivista määrää." + }, + "networkName": { + "message": "Verkon nimi" + }, + "networks": { + "message": "Verkot" + }, + "networkSettingsDescription": { + "message": "Lisää ja muokkaa omia RPC-verkostojasi" + }, + "nevermind": { + "message": "Antaa olla" + }, + "newAccount": { + "message": "Uusi tili" + }, + "newAccountDetectedDialogMessage": { + "message": "Uusi osoitettu tunnistettu! Lisää se osoitekirjaasi napsauttamalla tästä." + }, + "newAccountNumberName": { + "message": "Tili $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "Uusi yhteys" + }, + "newContract": { + "message": "Uusi sopimus" + }, + "newPassword": { + "message": "Uusi salasana (väh. 8 merkkiä)" + }, + "newNetwork": { + "message": "Uusi verkko" + }, + "newToMetaMask": { + "message": "Onko MetaMask ennestään outo?" + }, + "noAlreadyHaveSeed": { + "message": "Ei, minulla on jo siemenlause." + }, + "protectYourKeys": { + "message": "Suojele avaimiasi!" + }, + "protectYourKeysMessage1": { + "message": "Ole varovainen salausavaimesi kanssa – joidenkin verkkosivustojen kerrotaan yrittäneen matkia MetaMaskia. MetaMask ei koskaan kysy salausavaintasi!" + }, + "protectYourKeysMessage2": { + "message": "Pidä lauseesi tallessa. Jos näet jotain epäilyttävää tai et ole varma jostain sivustosta, lähetä sähköpostia osoitteeseen support@metamask.io" + }, + "rpcUrl": { + "message": "Uusi RPC:n URL" + }, + "optionalChainId": { + "message": "Ketjun tunnus (valinnainen)" + }, + "optionalSymbol": { + "message": "Symboli (valinnainen)" + }, + "newTotal": { + "message": "Uusi kokonaissumma" + }, + "newTransactionFee": { + "message": "Uusi tapahtumamaksu" + }, + "next": { + "message": "Seuraava" + }, + "noAddressForName": { + "message": "Tälle nimelle ei ole määritetty osoitetta." + }, + "noConversionRateAvailable": { + "message": "Vaihtokurssi ei saatavilla" + }, + "noTransactions": { + "message": "Sinulla ei ole tapahtumia" + }, + "notEnoughGas": { + "message": "Liian vähän gasia" + }, + "noWebcamFoundTitle": { + "message": "Verkkokameraa ei löytynyt" + }, + "noWebcamFound": { + "message": "Tietokoneesi verkkokameraa ei löytynyt. Ole hyvä ja yritä uudestaan." + }, + "ofTextNofM": { + "message": "/" + }, + "orderOneHere": { + "message": "Tilaa Trezor tai Ledger ja pidä varasi vakaassa tallennustilassa" + }, + "origin": { + "message": "Alkuperä" + }, + "parameters": { + "message": "Parametrit" + }, + "participateInMetaMetrics": { + "message": "Osallistu MetaMetricsiin" + }, + "participateInMetaMetricsDescription": { + "message": "Osallistu MetaMetricsiin auttaaksesi meitä tekemään MetaMaskista paremman" + }, + "password": { + "message": "Salasana" + }, + "passwordsDontMatch": { + "message": "Salasanat eivät täsmää" + }, + "passwordNotLongEnough": { + "message": "Salasana ei kyllin pitkä" + }, + "pastePrivateKey": { + "message": "Liitä yksityisen avaimesi merkkijono tähän:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "odottaa" + }, + "personalAddressDetected": { + "message": "Henkilökohtainen osoite havaittu. Anna käyttötunnuksen yhteysosoite." + }, + "prev": { + "message": "Aiemp." + }, + "primaryCurrencySetting": { + "message": "Ensisijainen valuutta" + }, + "primaryCurrencySettingDescription": { + "message": "Valitse natiivivaihtoehto näyttääksesi arvot ensisijaisesti ketjun natiivivaluutalla (esim. ETH). Valitse oletusmääräys asettaaksesi valitsemasi oletusvaluutan ensisijaiseksi." + }, + "privacyMsg": { + "message": "Tietosuojakäytäntö" + }, + "privateKey": { + "message": "Yksityinen avain", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "Varoitus: Älä koskaan paljasta tätä avainta. Kuka tahansa, jolla on yksityisavaimesi, voi varastaa tililläsi olevaa varallisuutta." + }, + "privateNetwork": { + "message": "Yksityinen verkko" + }, + "queue": { + "message": "Jono" + }, + "readdToken": { + "message": "Voit lisätä tämän tietueen myöhemmin takaisin siirtymällä tilisi vaihtoehtovalikon kohtaan â€Lisää tietueâ€." + }, + "recents": { + "message": "Viimeaikaiset" + }, + "recipientAddress": { + "message": "Vastaanottajan osoite" + }, + "recipientAddressPlaceholder": { + "message": "Haku, julkinen osoite (0x) tai ENS" + }, + "rejectAll": { + "message": "Hylkää kaikki" + }, + "rejectTxsN": { + "message": "Hylkää $1 maksusiirtoa" + }, + "rejectTxsDescription": { + "message": "Olet kieltäytymässä yhteensä $1 maksusiirrosta samalla kertaa." + }, + "rejected": { + "message": "Hylätty" + }, + "reset": { + "message": "Tyhjennä" + }, + "resetAccount": { + "message": "Nollaa tili" + }, + "resetAccountDescription": { + "message": "Tilisi nollaaminen tyhjentää tapahtumahistoriasi." + }, + "deleteNetwork": { + "message": "Poistetaanko verkko?" + }, + "deleteNetworkDescription": { + "message": "Haluatko varmasti poistaa tämän verkon?" + }, + "remindMeLater": { + "message": "Muistuta myöhemmin" + }, + "restoreFromSeed": { + "message": "Palautetaanko tili?" + }, + "restoreAccountWithSeed": { + "message": "Palauta tilisi käyttäen salaustekstiä (seed phrase)" + }, + "requestsAwaitingAcknowledgement": { + "message": "vahvistusta odottavaa pyyntöä" + }, + "required": { + "message": "Pakollinen" + }, + "restore": { + "message": "Palauta" + }, + "revealSeedWords": { + "message": "Paljasta salaussanat" + }, + "revealSeedWordsTitle": { + "message": "Juurilause" + }, + "revealSeedWordsDescription": { + "message": "Mikäli vaihdat jossakin vaiheessa selainta tai tietokonetta, tarvitset tämän salaustekstin tiliesi käyttämiseen. Tallenna se johonkin turvalliseen ja salaiseen paikkaan." + }, + "revealSeedWordsWarningTitle": { + "message": "ÄLÄ jaa tätä tekstiä kenellekään!" + }, + "revealSeedWordsWarning": { + "message": "Näitä sanoja voidaan käyttää kaikkien tiliesi ryöstämiseen." + }, + "remove": { + "message": "Poista" + }, + "removeAccount": { + "message": "Poista tili" + }, + "removeAccountDescription": { + "message": "Tämä tili poistetaan kukkarostasi. Varmistathan ennen kuin jatkat, että sinulla on alkuperäinen salausteksti tai yksityinen avain tätä tuotua tiliä varten. Voit tuoda tai luoda tilejä uudestaan tilin pudotusvalikosta." + }, + "readyToConnect": { + "message": "Valmiina yhdistämään?" + }, + "rinkeby": { + "message": "Rinkebyn koeverkko" + }, + "ropsten": { + "message": "Ropstenin koeverkko" + }, + "goerli": { + "message": "Goerli-testiverkko" + }, + "save": { + "message": "Tallenna" + }, + "slow": { + "message": "Hidas" + }, + "slower": { + "message": "Hitaammin" + }, + "saveAsCsvFile": { + "message": "Tallenna CSV-tiedostona" + }, + "scanInstructions": { + "message": "Aseta QR-koodi kamerasi eteen" + }, + "scanQrCode": { + "message": "Lue QR-koodi" + }, + "search": { + "message": "Haku" + }, + "searchResults": { + "message": "Hakutulokset" + }, + "secretBackupPhrase": { + "message": "Salainen varmuuskopiolause" + }, + "secretBackupPhraseDescription": { + "message": "Salainen varmistuslauseesi tekee varmuuskopioinnista ja tilisi palauttamisesta helppoa." + }, + "secretBackupPhraseWarning": { + "message": "VAROITUS: älä koskaan kerro varmuuskopiolausettasi kenellekään. Kuka tahansa tämän lauseen omaava voi napata Etherisi pysyvästi." + }, + "secretPhrase": { + "message": "Palauta holvisi syöttämällä tähän salainen kahdentoista sanan tekstisi." + }, + "securityAndPrivacy": { + "message": "Turva & yksityisyys" + }, + "securitySettingsDescription": { + "message": "Yksityisyysasetukset ja kukkaron salausteksti" + }, + "seedPhrasePlaceholder": { + "message": "Erota kukin sana yhdellä välilyönnillä" + }, + "seedPhraseReq": { + "message": "Juurilauseet ovat 12 sanan pituisia" + }, + "selectCurrency": { + "message": "Valitse valuutta" + }, + "selectEachPhrase": { + "message": "Ole hyvä ja valitse jokainen teksti järjestyksessä varmistaaksesi, että se on oikein." + }, + "selectLocale": { + "message": "Valitse kielialue" + }, + "selectType": { + "message": "Valitse tyyppi" + }, + "send": { + "message": "Lähetä" + }, + "sendAmount": { + "message": "Lähetä summa" + }, + "sendETH": { + "message": "Lähetä ETH:iä" + }, + "sendTokens": { + "message": "Lähetä tietueita" + }, + "sentEther": { + "message": "lähetä etheriä" + }, + "sentTokens": { + "message": "lähetetyt poletit" + }, + "separateEachWord": { + "message": "Erottele sanat toisistaan yhdellä välilyönnillä" + }, + "searchTokens": { + "message": "Hae tietueita" + }, + "selectAnAccount": { + "message": "Valitse tili" + }, + "selectAnAccountHelp": { + "message": "Valitse MetaMaskissa näytettävä tili" + }, + "selectAHigherGasFee": { + "message": "Valitse korkeampi bensataksa vauhdittaaksesi tapahtumasi käsittelyä.*" + }, + "selectHdPath": { + "message": "Valitse HD-polku" + }, + "selectPathHelp": { + "message": "Jos et näe nykyisiä Ledger-tilejäsi tämän alla, koeta vaihtaa poluksi â€Vanha (MEW / MyCrypto)â€" + }, + "settings": { + "message": "Asetukset" + }, + "showAdvancedGasInline": { + "message": "Bensan lisävalvonta" + }, + "showAdvancedGasInlineDescription": { + "message": "Valitse tämä näyttääksesi gas-hinta ja rajoittaaksesi säätimiä suoraan lähetä- ja vahvista-ruuduissa." + }, + "showFiatConversionInTestnets": { + "message": "Näytä vaihtokurssi koeverkoissa" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Valitse tämä näyttääksesi fiat-vaihtokurssin koeverkoissa" + }, + "showPrivateKeys": { + "message": "Näytä yksityiset avaimet" + }, + "showHexData": { + "message": "Näytä Hex-tiedot" + }, + "showHexDataDescription": { + "message": "Näytä hex-tietokenttä lähetysnäytössä valitsemalla tämän" + }, + "sign": { + "message": "Allekirjoita" + }, + "signatureRequest": { + "message": "Allekirjoitus pyydetään" + }, + "signed": { + "message": "Allekirjoitettu" + }, + "signNotice": { + "message": "Tämän viestin allekirjoittamisella voi olla\nvaarallisia sivuvaikutuksia. Allekirjoita viestejä ainoastaan\nsivustoilta, joihin luotat täysin koko tililläsi.\n Tällainen vaarallinen menetelmä poistetaan tulevista versioista." + }, + "sigRequest": { + "message": "Allekirjoitus pyydetään" + }, + "somethingWentWrong": { + "message": "Hupsis! Jotakin meni pieleen." + }, + "speedUp": { + "message": "Nopeuta" + }, + "speedUpCancellation": { + "message": "Nopeuta tätä peruutusta" + }, + "speedUpTransaction": { + "message": "Nopeuta tätä maksusiirtoa" + }, + "switchNetworks": { + "message": "Vaihda verkostoa" + }, + "stateLogs": { + "message": "Tilaloki" + }, + "stateLogsDescription": { + "message": "Tilalokeista löydät julkiset tiliosoitteesi sekä lähetetyt maksusiirtosi." + }, + "stateLogError": { + "message": "Virhe tilalokien noutamisessa." + }, + "step1HardwareWallet": { + "message": "1. Yhdistä laitteistokukkaro" + }, + "step1HardwareWalletMsg": { + "message": "Yhdistä hardware-lompakkosi suoraan tietokoneeseesi." + }, + "step2HardwareWallet": { + "message": "2. Valitse tili" + }, + "step2HardwareWalletMsg": { + "message": "Valitse tarkasteltava tili. Voit valita vain yhden kerrallaan." + }, + "step3HardwareWallet": { + "message": "3. Ota käyttöön dApps ja paljon muuta!" + }, + "step3HardwareWalletMsg": { + "message": "Käytä laitteistosi tiliä minkä tahansa Ethereum-tilin tavoin. Kirjaudu dAppsiin, lähettää ethereumeja, ostaa ja tallentaa ERC20-tunnuksia sekä CryptoKittiesin kaltaisia ei-korvattavia tunnuksia." + }, + "storePhrase": { + "message": "Tallenna tämä teksti johonkin salasanojen hallintaohjelmaan (esim. 1Password)." + }, + "submitted": { + "message": "Lähetetty" + }, + "supportCenter": { + "message": "Käy tukikeskuksessamme" + }, + "symbol": { + "message": "Symboli" + }, + "symbolBetweenZeroTwelve": { + "message": "Symbolin on oltava 11 merkkiä tai vähemmän." + }, + "syncWithMobile": { + "message": "Synkronoi mobiililaitteelle" + }, + "syncWithMobileTitle": { + "message": "Synkronoi mobiililaitteen kanssa" + }, + "syncWithMobileDesc": { + "message": "Voit synkronoida tilisi ja tietosi mobiililaitteidesi kesken. Avaa MetaMaskin mobiilisovellus, siirry \"Asetukset\"-osioon ja napauta \"Synkronoi selainlaajennuksesta\" -vaihtoehtoa" + }, + "syncWithMobileDescNewUsers": { + "message": "Jos avaat MetaMaskin mobiilisovelluksen vasta ensimmäistä kertaa, noudata vain puhelimesi ilmoittamia vaiheita." + }, + "syncWithMobileScanThisCode": { + "message": "Lue tämä koodi MetaMask-mobiilisovelluksellasi" + }, + "syncWithMobileBeCareful": { + "message": "Varmista, ettei kukaan muu katsele näyttöäsi, kun skannaat koodin" + }, + "syncWithMobileComplete": { + "message": "Tietojesi synkronoiminen onnistui. Nauti MetaMask-mobiilisovelluksesta!" + }, + "terms": { + "message": "Käyttöehdot" + }, + "testFaucet": { + "message": "Koe-faucet" + }, + "thisWillCreate": { + "message": "Tämä luo uuden kukkaron ja salaustekstin" + }, + "tips": { + "message": "Tipit" + }, + "to": { + "message": "Kohde" + }, + "token": { + "message": "Poletti" + }, + "tokenAlreadyAdded": { + "message": "Poletti on jo lisätty." + }, + "tokenContractAddress": { + "message": "Käyttötunnuksen yhteysosoite" + }, + "tokenSymbol": { + "message": "Tietuesymboli" + }, + "total": { + "message": "Yhteensä" + }, + "transaction": { + "message": "maksusiirto" + }, + "transactionConfirmed": { + "message": "Tapahtuma vahvistettu kohdassa $2." + }, + "transactionCreated": { + "message": "Tapahtuma luotu $1 arvolla kohdassa $2." + }, + "transactionDropped": { + "message": "Tapahtumasta luovuttu kohdassa $2." + }, + "transactionSubmitted": { + "message": "Tapahtuma toimitettu $1 bensataksalla kohdassa $2." + }, + "transactionResubmitted": { + "message": "Tapahtuma toimitettiin uudelleen bensataksan noustessa summaan $1 kohdassa $2." + }, + "transactionUpdated": { + "message": "Tapahtuma päivitetty – $2." + }, + "transactionErrored": { + "message": "Tapahtumissa tapahtui virhe." + }, + "transactionCancelAttempted": { + "message": "Tapahtuman peruutusta yritetty $1 bensataksalla kohdassa $2" + }, + "transactionCancelSuccess": { + "message": "Tapahtuman peruutus onnistui – $2" + }, + "transactionError": { + "message": "Tapahtumavirhe. Poikkeus havaittu sopimuskoodissa." + }, + "transactionErrorNoContract": { + "message": "Yritetään kutsua funktiota ei-sopimusosoitteesta." + }, + "transactionFee": { + "message": "Siirtomaksu" + }, + "transactionTime": { + "message": "Tapahtuman aika" + }, + "transfer": { + "message": "Siirrä" + }, + "transferBetweenAccounts": { + "message": "Siirrä tilieni välillä" + }, + "transferFrom": { + "message": "Siirto kohteesta" + }, + "troubleTokenBalances": { + "message": "Kohtasimme ongelmia ladatessamme tietuesaldojasi. Voit katsella niitä kohteessa", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "Yritä uudelleen" + }, + "typePassword": { + "message": "Kirjoita MetaMask-salasanasi" + }, + "unapproved": { + "message": "Ei hyväksytty" + }, + "units": { + "message": "yksikköä" + }, + "unknown": { + "message": "Tuntematon" + }, + "unknownNetwork": { + "message": "Tuntematon yksityinen verkko" + }, + "unknownQrCode": { + "message": "Virhe: Emme onnistuneet tunnistamaan kyseistä QR-koodia" + }, + "unknownCameraErrorTitle": { + "message": "Oho! Jokin meni vikaan..." + }, + "unknownCameraError": { + "message": "Tapahtui virhe yritettäessä käyttää kameraasi. Ole hyvä ja yritä uudestaan..." + }, + "unlock": { + "message": "Poista lukitus" + }, + "unlockMessage": { + "message": "Hajautettu verkko odottaa" + }, + "updatedWithDate": { + "message": "$1 päivitetty" + }, + "urlErrorMsg": { + "message": "URI:t vaativat asianmukaisen HTTP/HTTPS-etuliitteen." + }, + "usedByClients": { + "message": "Lukuisien eri asiakkaiden käyttämä" + }, + "userName": { + "message": "Käyttäjätunnus" + }, + "viewAccount": { + "message": "Näytä tili" + }, + "viewinExplorer": { + "message": "Tarkastele Explorerissa" + }, + "viewContact": { + "message": "Näytä yhteyshenkilö" + }, + "viewOnCustomBlockExplorer": { + "message": "Tarkastele kohdassa $1" + }, + "viewOnEtherscan": { + "message": "Näytä Etherscanissa" + }, + "visitWebSite": { + "message": "Vieraile verkkosivustollamme" + }, + "walletSeed": { + "message": "Lompakon siemen" + }, + "welcomeBack": { + "message": "Tervetuloa takaisin!" + }, + "welcome": { + "message": "Tervetuloa MetaMaskiin" + }, + "writePhrase": { + "message": "Kirjoita tämä teksti paperille ja säilytä sitä turvallisessa paikassa. Jos haluat olla vielä paremmassa turvassa, kirjoita se ylös useille eri papereille ja talleta ne kahteen tai kolmeen eri paikkaan." + }, + "yesLetsTry": { + "message": "Kyllä, kokeillaan" + }, + "youNeedToAllowCameraAccess": { + "message": "Käyttääksesi tätä ominaisuutta sinun tarvitsee antaa kameralle käyttöoikeudet." + }, + "yourSigRequested": { + "message": "Allekirjoitustasi pyydetään" + }, + "youSign": { + "message": "Olet allekirjoittamassa" + }, + "yourPrivateSeedPhrase": { + "message": "Sinun yksityinen siemenlauseesi" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "Polttoaine ei maksa kiihdytyksen yhteydessä" + } +} diff --git a/app/_locales/fil/messages.json b/app/_locales/fil/messages.json new file mode 100644 index 000000000000..60ff2e03fa18 --- /dev/null +++ b/app/_locales/fil/messages.json @@ -0,0 +1,1201 @@ +{ + "chartOnlyAvailableEth": { + "message": "Available lang ang chart sa mga Ethereum network." + }, + "contractInteraction": { + "message": "Paggamit sa Contract" + }, + "reject": { + "message": "Tanggihan" + }, + "about": { + "message": "Tungkol sa" + }, + "aboutSettingsDescription": { + "message": "Bersyon, support center, at impormasyon sa pakikipag-ugnayan" + }, + "acceleratingATransaction": { + "message": "* Ang pagpapabilis sa isang transaksyon sa pamamagitan ng paggamit ng mas mataas na presyo ng gas ay makakadagdag sa tsansa nitong maproseso ng network nang mas mabilis, pero hindi ito palaging garantisado." + }, + "accessingYourCamera": { + "message": "Ina-access ang iyong camera..." + }, + "accountDetails": { + "message": "Mga Detalye ng Account" + }, + "accountName": { + "message": "Pangalan ng Account" + }, + "accountOptions": { + "message": "Mga Opsyon sa Account" + }, + "accountSelectionRequired": { + "message": "Kailangan mong pumili ng account!" + }, + "activityLog": { + "message": "log ng aktibidad" + }, + "addNetwork": { + "message": "Magdagdag ng Network" + }, + "addRecipient": { + "message": "Magdagdag ng Recipient" + }, + "advancedSettingsDescription": { + "message": "I-access ang mga feature para sa mga developer, mag-download ng mga State Log, I-reset ang Account, mag-set up ng mga testnet at custom RPC" + }, + "advancedOptions": { + "message": "Mga Advanced na Opsyon" + }, + "addToAddressBook": { + "message": "Idagdag sa address book" + }, + "addToAddressBookModalPlaceholder": { + "message": "hal. Juan D." + }, + "addAlias": { + "message": "Magdagdag ng alias" + }, + "addToken": { + "message": "Magdagdag ng Token" + }, + "addTokens": { + "message": "Magdagdag ng Mga Token" + }, + "addSuggestedTokens": { + "message": "Magdagdag ng Mga Iminungkahing Token" + }, + "addAcquiredTokens": { + "message": "Idagdag ang mga token na nakuha mo gamit ang MetaMask" + }, + "amount": { + "message": "Halaga" + }, + "appDescription": { + "message": "Isang Ethereum Wallet sa iyong Browser", + "description": "The description of the application" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "approve": { + "message": "Aprubahan" + }, + "approved": { + "message": "Inaprubahan" + }, + "attemptingConnect": { + "message": "Sinusubukang kumonekta sa blockchain." + }, + "attemptToCancel": { + "message": "Subukang Kanselahin?" + }, + "attemptToCancelDescription": { + "message": "Ang pagsusumite sa pagtangkang ito ay hindi makakagarantiya na nakansela ang iyong orihinal na transaksyon. Kung matagumpay ang pagtangkang magkansela, sisingilin sa iyo ang bayarin sa transaksyon sa itaas." + }, + "attributions": { + "message": "Mga Attribution" + }, + "autoLockTimeLimit": { + "message": "Auto-Logout Timer (minuto)" + }, + "autoLockTimeLimitDescription": { + "message": "I-set ang idle time na minuto bago awtomatikong mag-log out ang MetaMask" + }, + "back": { + "message": "Bumalik" + }, + "backToAll": { + "message": "Bumalik sa Lahat" + }, + "backupApprovalNotice": { + "message": "I-back up ang iyong Secret Recovery code para panatilihing secure ang iyong wallet at pondo." + }, + "backupApprovalInfo": { + "message": "Ang secret code na ito ay kinakailangan para ma-recover ang iyong wallet kung sakaling mawawala mo ang iyong device, nakalimutan mo ang iyong password, kailangan mong i-install ulit ang MetaMask, o gusto mong i-access ang iyong wallet sa ibang device." + }, + "backupNow": { + "message": "I-back up ngayon" + }, + "balance": { + "message": "Balanse" + }, + "balanceOutdated": { + "message": "Maaaring outdated na ang balanse" + }, + "basic": { + "message": "Pangunahin" + }, + "blockExplorerView": { + "message": "Tingnan ang account sa $1", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "Gumamit ng Blockies Identicon" + }, + "browserNotSupported": { + "message": "Hindi sinusuportahan ang iyong Browser..." + }, + "builtInCalifornia": { + "message": "Ang MetaMask ay dinisenyo at binuo sa California." + }, + "buyWithWyre": { + "message": "Bumili ng ETH gamit ang Wyre" + }, + "buyWithWyreDescription": { + "message": "Binibigyang-daan ka ng Wyre na gumamit ng credit card para magdeposito ng ETH nang direkta sa iyong MetaMask account." + }, + "buyCoinSwitch": { + "message": "Bilhin sa CoinSwitch" + }, + "buyCoinSwitchExplainer": { + "message": "Ang CoinSwitch ay ang one-stop na destinasyon para magpapalit ng mahigit sa 300 cryptocurrency sa pinakamababang halaga." + }, + "off": { + "message": "Naka-off" + }, + "on": { + "message": "Naka-on" + }, + "optionalBlockExplorerUrl": { + "message": "Block Explorer URL (opsyonal)" + }, + "cancel": { + "message": "Kanselahin" + }, + "cancelAttempt": { + "message": "Kanselahin ang Pagtangka" + }, + "cancellationGasFee": { + "message": "Gas Fee sa Pagkansela" + }, + "cancelled": { + "message": "Nakansela" + }, + "clickToRevealSeed": { + "message": "Mag-click dito para ipakita ang iyong secret words" + }, + "close": { + "message": "Isara" + }, + "chromeRequiredForHardwareWallets": { + "message": "Kailangan mong gamitin ang MetaMask sa Google Chrome upang makakonekta sa iyong Hardware Wallet." + }, + "confirm": { + "message": "Kumpirmahin" + }, + "confirmed": { + "message": "Nakumpirma" + }, + "confirmPassword": { + "message": "Kumpirmahin ang Password" + }, + "confirmSecretBackupPhrase": { + "message": "Kumpirmahin ang iyong Secret Backup Phrase" + }, + "congratulations": { + "message": "Binabati kita" + }, + "connectHardwareWallet": { + "message": "Magkonekta ng Hardware Wallet" + }, + "connect": { + "message": "Kumonekta" + }, + "connectingTo": { + "message": "Kumokonekta sa $1" + }, + "connectingToKovan": { + "message": "Kumokonekta sa Kovan Test Network" + }, + "connectingToMainnet": { + "message": "Kumokonekta sa Main Ethereum Network" + }, + "connectingToRopsten": { + "message": "Kumokonekta sa Ropsten Test Network" + }, + "connectingToRinkeby": { + "message": "Kumokonekta sa Rinkeby Test Network" + }, + "connectingToLocalhost": { + "message": "Kumokonekta sa Localhost 8545" + }, + "connectingToGoerli": { + "message": "Kumokonekta sa Goerli Test Network" + }, + "continueToWyre": { + "message": "Magpatuloy sa Wyre" + }, + "continueToCoinSwitch": { + "message": "Magpatuloy sa CoinSwitch" + }, + "contractDeployment": { + "message": "Deployment ng Contract" + }, + "copiedExclamation": { + "message": "Nakopya!" + }, + "copyAddress": { + "message": "Kopyahin ang address sa clipboard" + }, + "copyTransactionId": { + "message": "Kopyahin ang Transaction ID" + }, + "copiedTransactionId": { + "message": "Nakopya ang Transaction ID" + }, + "copyToClipboard": { + "message": "Kopyahin sa clipboard" + }, + "copyPrivateKey": { + "message": "Ito ang iyong pribadong private key (i-click para kopyahin)" + }, + "create": { + "message": "Gumawa" + }, + "createAccount": { + "message": "Gumawa ng Account" + }, + "createAWallet": { + "message": "Gumawa ng Wallet" + }, + "createPassword": { + "message": "Gumawa ng Password" + }, + "currencyConversion": { + "message": "Pagpapapalit ng Currency " + }, + "currentLanguage": { + "message": "Kasalukuyang Wika" + }, + "customGas": { + "message": "I-customize ang Gas" + }, + "customGasSubTitle": { + "message": "Maaaring mas bumilis ang pagpoproseso kapag dinagdagan ang fee, pero hindi ito garantisado." + }, + "customToken": { + "message": "Custom na Token" + }, + "decimalsMustZerotoTen": { + "message": "Ang mga decimal ay hindi dapat bumaba sa 0, at hindi lumampas sa 36." + }, + "decimal": { + "message": "Bilang ng Decimal" + }, + "defaultNetwork": { + "message": "Ang default na network para sa mga transaksyon ng Ether ay Main Net." + }, + "delete": { + "message": "I-delete" + }, + "deleteAccount": { + "message": "I-delete ang Account" + }, + "deposit": { + "message": "Deposito" + }, + "depositEther": { + "message": "Magdeposito ng Ether" + }, + "details": { + "message": "Mga Detalye" + }, + "directDepositEther": { + "message": "Direktang Magdeposito ng Ether" + }, + "directDepositEtherExplainer": { + "message": "Kung mayroon ka nang Ether, ang pinakamabilis na paraan para magkaroon ng Ether sa iyong bagong wallet ay sa pamamagitan ng direkang deposito." + }, + "done": { + "message": "Tapos na" + }, + "downloadGoogleChrome": { + "message": "I-download ang Google Chrome" + }, + "downloadSecretBackup": { + "message": "I-download ang Secret Backup Phrase na ito at panatilhing itong nakatago nang ligtas sa isang external na encrypted hard drive o storage medium." + }, + "downloadStateLogs": { + "message": "I-download ang mga State Log" + }, + "dontHaveAHardwareWallet": { + "message": "Wala ka bang hardware wallet?" + }, + "dropped": { + "message": "Na-drop" + }, + "edit": { + "message": "I-edit" + }, + "editContact": { + "message": "I-edit ang Contact" + }, + "endOfFlowMessage1": { + "message": "Pumasa ka sa test - panatilihing ligtas ang iyong seedphrase, responsibilidad mo ito!" + }, + "endOfFlowMessage2": { + "message": "Mga tip sa pag-store dito ng ligtas" + }, + "endOfFlowMessage3": { + "message": "Mag-save ng backup sa maraming lugar." + }, + "endOfFlowMessage4": { + "message": "Huwag ibahagi ang parirala sa kahit sino." + }, + "endOfFlowMessage5": { + "message": "Mag-ingat sa phishing! Hindi ka basta-basta hihilingin ng MetaMask ang iyong seed phrase." + }, + "endOfFlowMessage6": { + "message": "Kung kailangan mong i-back up ulit ang iyong seed phrase, makikita mo ito sa Mga Setting -> Seguridad." + }, + "endOfFlowMessage7": { + "message": "Kung may mga tanong ka o nakakita ka ng kahina-hinalang bagay, i-email ang support@metamask.io." + }, + "endOfFlowMessage8": { + "message": "Hindi ma-recover ng MetaMask ang iyong seedphrase. Alamin pa." + }, + "endOfFlowMessage9": { + "message": "Matuto pa." + }, + "endOfFlowMessage10": { + "message": "Tapos na Lahat" + }, + "ensRegistrationError": { + "message": "May error sa pagrerehistro ng ENS name" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "Hindi nakita ang ENS name sa kasalukuyang network. Subukang lumipat sa Main Ethereum Network." + }, + "enterAnAlias": { + "message": "Maglagay ng alias" + }, + "enterPassword": { + "message": "Ilagay ang password" + }, + "enterPasswordContinue": { + "message": "Ilagay ang password para magpatuloy" + }, + "etherscanView": { + "message": "Tingnan ang account sa Etherscan" + }, + "estimatedProcessingTimes": { + "message": "Tinatantiyang Tagal ng Pagproseso" + }, + "expandView": { + "message": "I-expand ang View" + }, + "exportPrivateKey": { + "message": "I-export ang Private Key" + }, + "failed": { + "message": "Nabigo" + }, + "fast": { + "message": "Mabilis" + }, + "faster": { + "message": "Mas Mabilis" + }, + "fileImportFail": { + "message": "Hindi gumagana ang pag-import ng file? Mag-click dito!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "Kalimutan ang device na ito" + }, + "from": { + "message": "Mula sa" + }, + "functionType": { + "message": "Uri ng Function" + }, + "gasLimit": { + "message": "Limitasyon sa Gas" + }, + "gasLimitInfoModalContent": { + "message": "Ang limitasyon sa gas ay ang maximum na dami ng mga unit ng gas na handa kang gastusin." + }, + "gasLimitTooLow": { + "message": "Ang limitasyon sa gas ay dapat na hindi bababa sa 21000" + }, + "gasUsed": { + "message": "Gas na Ginamit" + }, + "gasPrice": { + "message": "Presyo ng Gas (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "Napakababa ng Presyo ng Gas" + }, + "gasPriceInfoModalContent": { + "message": "Tinutukoy ng presyo ng gas ang halaga ng Ether na handa kang ibayad para sa bawat unit ng gas." + }, + "gasPriceNoDenom": { + "message": "Presyo ng Gas" + }, + "general": { + "message": "Pangkalahatan" + }, + "generalSettingsDescription": { + "message": "Pagpapapalit ng currency, pangunahing currency, wika, blockies identicon" + }, + "getEther": { + "message": "Kumuha ng Ether" + }, + "getEtherFromFaucet": { + "message": "Kumuha ng Ether mula sa isang faucet para sa $1", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "Humingi ng Tulong." + }, + "getStarted": { + "message": "Magsimula" + }, + "happyToSeeYou": { + "message": "Masaya kaming makita ka." + }, + "hardwareWalletConnected": { + "message": "Nakakonekta ang hardware wallet" + }, + "hardwareWallets": { + "message": "Magkonekta ng hardware wallet" + }, + "hardwareWalletsMsg": { + "message": "Pumili ng hardware wallet na gusto mong gamitin sa MetaMask" + }, + "havingTroubleConnecting": { + "message": "May problema ka ba sa pagkonekta?" + }, + "here": { + "message": "dito", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hide": { + "message": "Itago" + }, + "hideTokenPrompt": { + "message": "Itago ang Token?" + }, + "import": { + "message": "I-import", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "Mag-import ng Account" + }, + "importAccountMsg": { + "message": " Ang mga na-import na account ay hindi iuugnay sa orihinal na seedphrase na ginawa ng iyong MetaMask account. Matuto pa tungkol sa mga na-import na account " + }, + "importAccountSeedPhrase": { + "message": "Mag-import ng Account gamit ang Seed Phrase" + }, + "importWallet": { + "message": "Mag-import ng Wallet" + }, + "importYourExisting": { + "message": "I-import ang kasalukuyan mong wallet gamit ang isang seed phrase na may 12 salita" + }, + "imported": { + "message": "Na-import", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "Mag-import gamit ang seed phrase ng account" + }, + "infoHelp": { + "message": "Impormasyon at Tulong" + }, + "initialTransactionConfirmed": { + "message": "Nakumpirma ng network ang iyong unang transaksyon. I-click ang OK para bumalik." + }, + "insufficientBalance": { + "message": "Hindi sapat ang balanse." + }, + "insufficientFunds": { + "message": "Hindi sapat ang pondo." + }, + "insufficientTokens": { + "message": "Hindi sapat ang mga token." + }, + "invalidAddress": { + "message": "Hindi valid ang address" + }, + "invalidAddressRecipient": { + "message": "Hindi valid ang address ng recipient" + }, + "knownAddressRecipient": { + "message": "Kilalang address ng contract." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "Hindi ito isang ETH network, i-set sa lowercase" + }, + "invalidInput": { + "message": "Hindi valid ang input." + }, + "invalidRPC": { + "message": "Hindi valid ang RPC URL" + }, + "invalidBlockExplorerURL": { + "message": "Hindi valid ang Block Explorer URL" + }, + "invalidSeedPhrase": { + "message": "Hindi valid ang seed phrase" + }, + "learnMore": { + "message": "Matuto pa" + }, + "ledgerAccountRestriction": { + "message": "Kailangan mong gamitin ang iyong dating account bago ka makapagdagdag ng bago." + }, + "letsGoSetUp": { + "message": "Oo, i-set up natin ito!" + }, + "likeToAddTokens": { + "message": "Gusto mo bang idagdag ang mga token na ito?" + }, + "links": { + "message": "Mga Link" + }, + "liveGasPricePredictions": { + "message": "Mga Live na Prediksyon sa Presyo ng Gas" + }, + "loading": { + "message": "Naglo-load..." + }, + "loadingTokens": { + "message": "Naglo-load ng Mga Token..." + }, + "loadMore": { + "message": "Mag-load Pa" + }, + "lock": { + "message": "Mag-log out" + }, + "memorizePhrase": { + "message": "Tandaan ang pariralang ito." + }, + "message": { + "message": "Mensahe" + }, + "metamaskDescription": { + "message": "Kinokonekta ka sa Ethereum at sa Decentralized Web." + }, + "metamaskVersion": { + "message": "Bersyon ng MetaMask" + }, + "mobileSyncText": { + "message": "Pakilagay ang iyong password para kumpirmahing ikaw ito!" + }, + "myAccounts": { + "message": "Mga Account Ko" + }, + "myWalletAccounts": { + "message": "Mga Wallet Account Ko" + }, + "myWalletAccountsDescription": { + "message": "Ang lahat ng iyong account na ginawa sa MetaMask ay awtomatikong idadagdag sa seksyong ito." + }, + "mustSelectOne": { + "message": "Dapat pumili ng kahit 1 token." + }, + "needEtherInWallet": { + "message": "Para gumamit ng mga decentralized na application gamit ang MetaMask, mangangailangan ka ng Ether sa iyong wallet." + }, + "needImportFile": { + "message": "Dapat kang pumili ng file na ii-import.", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "Hindi makakapagpadala ng mga negative na halaga ng ETH." + }, + "networkName": { + "message": "Pangalan ng Network" + }, + "networks": { + "message": "Mga Network" + }, + "networkSettingsDescription": { + "message": "Magdagdag at mag-edit ng mga custom na RPC network" + }, + "nevermind": { + "message": "Huwag na lang" + }, + "newAccount": { + "message": "Bagong Account" + }, + "newAccountDetectedDialogMessage": { + "message": "Naka-detect ng bagong address! Mag-click dito para idagdag ang iyong address book." + }, + "newContact": { + "message": "Bagong Contact" + }, + "newContract": { + "message": "Bagong Contract" + }, + "newPassword": { + "message": "Bagong Password (min 8 char)" + }, + "newNetwork": { + "message": "Bagong Network" + }, + "newToMetaMask": { + "message": "Bago ka ba sa MetaMask?" + }, + "noAlreadyHaveSeed": { + "message": "Hindi, may seed phrase na ako" + }, + "protectYourKeys": { + "message": "Protektahan Ang Iyong Mga Key!" + }, + "protectYourKeysMessage1": { + "message": "Mag-ingat sa iyong seed phrase — may mga ulat na may mga website na nagpapanggap bilang MetaMask. Hindi kailanman hihilingin ng MetaMask ang iyong seed phrase!" + }, + "protectYourKeysMessage2": { + "message": "Panatilihing ligtas ang iyong parirala. Kung may makikita kang kahina-hinala, o hindi ka sigurado tungkol sa isang website, mag-email sa support@metamask.io" + }, + "rpcUrl": { + "message": "Bagong RPC URL" + }, + "optionalChainId": { + "message": "ChainID (opsyonal)" + }, + "optionalSymbol": { + "message": "Simbolo (opsyonal)" + }, + "newTotal": { + "message": "Bagong Total" + }, + "newTransactionFee": { + "message": "Bagong Transaction Fee" + }, + "next": { + "message": "Susunod" + }, + "noAddressForName": { + "message": "Walang address na na-set para sa pangalang ito." + }, + "noConversionRateAvailable": { + "message": "Walang Presyo ng Palitan na Available" + }, + "noTransactions": { + "message": "Wala kang mga transaksyon" + }, + "notEnoughGas": { + "message": "Hindi Sapat Ang Gas" + }, + "noWebcamFoundTitle": { + "message": "Hindi nakita ang webcam" + }, + "noWebcamFound": { + "message": "Hindi nakita ang webcam ng iyong computer. Pakisubukang muli." + }, + "ofTextNofM": { + "message": "sa" + }, + "orderOneHere": { + "message": "Mag-order ng Trezor o Ledger para itago sa cold storage ang iyong pondo" + }, + "origin": { + "message": "Pinanggalingan" + }, + "parameters": { + "message": "Mga Parameter" + }, + "participateInMetaMetrics": { + "message": "Makilahok sa MetaMetrics" + }, + "participateInMetaMetricsDescription": { + "message": "Makilahok sa MetaMetrics para tulungan kaming mas pagandahin ang MetaMask" + }, + "passwordsDontMatch": { + "message": "Hindi Nagtutugma Ang Mga Password" + }, + "passwordNotLongEnough": { + "message": "Hindi sapat ang haba ng password" + }, + "pastePrivateKey": { + "message": "I-paste ang iyong private key string dito:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "nakabinbin" + }, + "personalAddressDetected": { + "message": "Naka-detect ng personal na address. I-input ang token contract address." + }, + "prev": { + "message": "Nakaraan" + }, + "primaryCurrencySetting": { + "message": "Pangunahing Currency" + }, + "primaryCurrencySettingDescription": { + "message": "Piliin ang native para bigyang priyoridad ang pagpapakita ng mga halaga sa native currency ng chain (hal. ETH). Piliin ang Fiat para bigyang priyoridad ang pagpapakita ng mga halaga sa napili mong fiat currency." + }, + "privacyMsg": { + "message": "Patakaran sa Privacy" + }, + "privateKeyWarning": { + "message": "Babala: Huwag ibunyag ang key na ito. Ang kahit sinong may mga private key mo ay maaaring magnakaw ng anumang asset na nasa iyong account." + }, + "privateNetwork": { + "message": "Pribadong Network" + }, + "queue": { + "message": "I-queue" + }, + "readdToken": { + "message": "Puwede mong idagdag ulit ang token na ito sa hinaharap sa pamamagitan ng pagpunta sa “Magdagdag ng token†sa menu ng mga opsyon ng iyong mga accounts." + }, + "recents": { + "message": "Kamakailan" + }, + "recipientAddress": { + "message": "Address ng Recipient" + }, + "recipientAddressPlaceholder": { + "message": "Maghanap, pampublikong address (0x), o ENS" + }, + "rejectAll": { + "message": "Tanggihan Lahat" + }, + "rejectTxsN": { + "message": "Tanggihan ang $1 (na) transaksyon" + }, + "rejectTxsDescription": { + "message": "Sabay-sabay mong tatanggihan ang $1 (na) transaksyon." + }, + "rejected": { + "message": "Tinanggihan" + }, + "reset": { + "message": "I-reset" + }, + "resetAccount": { + "message": "I-reset ang Account" + }, + "resetAccountDescription": { + "message": "Kapag na-reset ang iyong account, maki-clear ang iyong kasaysayan ng transaksyon." + }, + "deleteNetwork": { + "message": "I-delete ang Network?" + }, + "deleteNetworkDescription": { + "message": "Sigurado ka bang gusto mong i-delete ang network na ito?" + }, + "remindMeLater": { + "message": "Paalalahanan ako sa ibang pagkakataon" + }, + "restoreFromSeed": { + "message": "I-restore ang account?" + }, + "restoreAccountWithSeed": { + "message": "I-restore ang iyong Account gamit ang Seed Phrase" + }, + "requestsAwaitingAcknowledgement": { + "message": "naghihintay na matugunan ang mga request" + }, + "required": { + "message": "Kailangan" + }, + "restore": { + "message": "Ipanumbalik" + }, + "revealSeedWords": { + "message": "Ipakita ang Seed Words" + }, + "revealSeedWordsDescription": { + "message": "Kung lilipat ka ng browser o magpapalit ka ng computer, kakailanganin mo ang seed phrase na ito para ma-access ang iyong mga account. I-save ang mga iyon sa isang lugar na ligtas at lihim." + }, + "revealSeedWordsWarningTitle": { + "message": "HUWAG ibahagi ang pariralang ito sa kahit sino!" + }, + "revealSeedWordsWarning": { + "message": "Maaaring gamitin ang mga salitang ito para nakawin ang lahat ng iyong account." + }, + "remove": { + "message": "Alisin" + }, + "removeAccount": { + "message": "Alisin ang account" + }, + "removeAccountDescription": { + "message": "Tatanggalin ang account na ito sa iyong wallet. Pakitiyak na nasa iyo ang orihinal na seed phrase o private key para sa naka-import na account na ito bago magpatuloy. Maaari kang mag-import o gumawa ulit ng mga account mual sa drop-down ng account. " + }, + "readyToConnect": { + "message": "Handa ka nang Kumonekta?" + }, + "save": { + "message": "I-save" + }, + "slow": { + "message": "Mabagal" + }, + "slower": { + "message": "Mas Mabagal" + }, + "saveAsCsvFile": { + "message": "I-save bilang CSV File" + }, + "scanInstructions": { + "message": "Ilagay ang QR code sa harap ng iyong camera" + }, + "scanQrCode": { + "message": "I-scan ang QR Code" + }, + "search": { + "message": "Hanapin" + }, + "searchResults": { + "message": "Mga Resulta ng Paghahanap" + }, + "secretBackupPhraseDescription": { + "message": "Pinapadali ng iyong secret backup phrase na i-back up at i-restore ang iyong account." + }, + "secretBackupPhraseWarning": { + "message": "BABALA: Huwag ibunyag ang iyong backup phrase. Mananakaw ng kahit sinong may ganitong parirala ang iyong Ether at hindi na ito maibabalik." + }, + "secretPhrase": { + "message": "Ilagay ang iyong lihim na pariralang may labindalawang salita para ma-restore ang iyong vault." + }, + "securityAndPrivacy": { + "message": "Seguridad at Privacy" + }, + "securitySettingsDescription": { + "message": "Mga setting ng privacy at seed phrase ng wallet" + }, + "seedPhrasePlaceholder": { + "message": "Paghiwa-hiwalayin ang bawat salita gamit ang isang space" + }, + "seedPhraseReq": { + "message": "Ang mga seed phrase ay may habang 12 salita" + }, + "selectCurrency": { + "message": "Pumili ng Currency" + }, + "selectEachPhrase": { + "message": "Pakipili ang bawat parirala para tiyaking tama ito." + }, + "selectLocale": { + "message": "Pumili ng Locale" + }, + "selectType": { + "message": "Piliin ang Uri" + }, + "send": { + "message": "Ipadala" + }, + "sendAmount": { + "message": "Magpadala ng Halaga" + }, + "sendETH": { + "message": "Magpadala ng ETH" + }, + "sendTokens": { + "message": "Magpadala ng Mga Token" + }, + "sentEther": { + "message": "nagpadala ng ether" + }, + "sentTokens": { + "message": "mga ipinadalang token" + }, + "separateEachWord": { + "message": "Paghiwa-hiwalayin ang bawat salita gamit ang isang space" + }, + "searchTokens": { + "message": "Maghanap ng Mga Token" + }, + "selectAnAccount": { + "message": "Pumili ng Account" + }, + "selectAnAccountHelp": { + "message": "Piliin ang account na titingnan sa MetaMask" + }, + "selectAHigherGasFee": { + "message": "Pumili ng mas mataas na gas fee para pabilisin ang pagproseso ng iyong transaksyon.*" + }, + "selectHdPath": { + "message": "Piliin ang HD Path" + }, + "selectPathHelp": { + "message": "Kung hindi mo makita ang kasalukuyan mong mga Ledger account sa ibaba, subukang ilipat ang mga path sa \"Legacy (MEW / MyCrypto)\"" + }, + "settings": { + "message": "Mga Setting" + }, + "showAdvancedGasInline": { + "message": "Mga advanced na kontrol sa gas" + }, + "showAdvancedGasInlineDescription": { + "message": "Piliin ito para ipakita ang presyo ng gas at limitahan ang mga kontrol nang direkta sa screen ng pagpapadala at pagkumpirma." + }, + "showFiatConversionInTestnets": { + "message": "Ipakita ang Conversion sa mga Testnet" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Piliin ito para magpakita ng fiat conversion sa mga Testnet" + }, + "showPrivateKeys": { + "message": "Ipakita ang mga Private Key" + }, + "showHexData": { + "message": "Ipakita ang Hex Data" + }, + "showHexDataDescription": { + "message": "Piliin ito para ipakita ang hex data field sa screen ng pagpapadala" + }, + "sign": { + "message": "I-sign" + }, + "signed": { + "message": "Na-sign" + }, + "signNotice": { + "message": "Kapag na-sign ang mensaheng ito, maaaring magkaroon \nng mapapanganib na side effect. Mag-sign lang ng mga mensaheng mula \nsa mga site na ganap mong pinagkakatiwalaang gumamit sa iyong account.\n Isa itong mapanganib na method na aalisin sa isang bersyon sa hinaharap. " + }, + "somethingWentWrong": { + "message": "Oops! Nagkaroon ng problema." + }, + "speedUp": { + "message": "Pabilisin" + }, + "speedUpCancellation": { + "message": "Pabilisin ang pagkanselang ito" + }, + "speedUpTransaction": { + "message": "Pabilisin ang transaksyong ito" + }, + "switchNetworks": { + "message": "Lumipat ng Network" + }, + "stateLogs": { + "message": "Mga State Log" + }, + "stateLogsDescription": { + "message": "Ang mga state log ay naglalaman ng iyong mga pampublikong account address at mga ipinadalang transaksyon." + }, + "stateLogError": { + "message": "May error sa pagkuha sa mga state log." + }, + "step1HardwareWallet": { + "message": "1. Magkonekta ng Hardware Wallet" + }, + "step1HardwareWalletMsg": { + "message": "Ikonekta ang iyong hardware wallet nang direkta sa computer." + }, + "step2HardwareWallet": { + "message": "2. Pumili ng Account" + }, + "step2HardwareWalletMsg": { + "message": "Piliin ang halagang gusto mong tingnan. Maaari ka lang pumili nang paisa-isa." + }, + "step3HardwareWallet": { + "message": "3. Magsimula gamit ang dApps at higit pa!" + }, + "step3HardwareWalletMsg": { + "message": "Gamitin ang iyong hardware account tulad ng anumang Ethereum account. Mag-log in sa dApps, magpadala ng Eth, bumili at mag-store ng mga ERC20 token at mga Non-Fungible token tulad ng CryptoKitties." + }, + "storePhrase": { + "message": "I-store ang pariralang ito sa isang password manager tulad ng 1Password." + }, + "submitted": { + "message": "Isinumite" + }, + "supportCenter": { + "message": "Bisitahin ang aming Support Center" + }, + "symbol": { + "message": "Simbolo" + }, + "symbolBetweenZeroTwelve": { + "message": "Ang simbolo ay dapat na 11 character o mas kaunti." + }, + "syncWithMobile": { + "message": "I-sync sa mobile" + }, + "syncWithMobileTitle": { + "message": "I-sync sa mobile" + }, + "syncWithMobileDesc": { + "message": "Maaari mong i-sync ang iyong mga account at impormasyon sa iyong mobile device. Buksan ang MetaMask mobile app, pumunta sa \"Settings\" at mag-tap sa \"Sync from Browser Extension\"" + }, + "syncWithMobileDescNewUsers": { + "message": "Kung bubuksan mo ang MetaMask Mobile app sa unang pagkakataon, sundin lang ang mga hakbang sa iyong telepono." + }, + "syncWithMobileScanThisCode": { + "message": "I-scan ang code na ito sa iyong MetaMask mobile app" + }, + "syncWithMobileBeCareful": { + "message": "Tiyaking walang ibang taong tumitingin sa iyong screen kapag sina-scan mo ang code na ito" + }, + "syncWithMobileComplete": { + "message": "Matagumpay na na-sync ang iyong data. I-enjoy ang MetaMask mobile app!" + }, + "terms": { + "message": "Mga Tuntunin ng Paggamit" + }, + "thisWillCreate": { + "message": "Gagawa ito ng bagong wallet at seed phrase" + }, + "tips": { + "message": "Mga Tip" + }, + "to": { + "message": "Para sa" + }, + "tokenAlreadyAdded": { + "message": "Naidagdag na ang token." + }, + "tokenSymbol": { + "message": "Simbolo ng Token" + }, + "total": { + "message": "Kabuuan" + }, + "transaction": { + "message": "transaksyon" + }, + "transactionConfirmed": { + "message": "Nakumpirma ang transaksyon sa ganap na $2." + }, + "transactionCreated": { + "message": "Nagawa ang transaksyon nang may halagang $1 sa ganap na $2." + }, + "transactionDropped": { + "message": "Na-drop ang transaksyon sa $2." + }, + "transactionSubmitted": { + "message": "Nasumite ang transaksyon nang may gas fee na $1 sa $2." + }, + "transactionResubmitted": { + "message": "Nasumite ulit ang transaksyon nang may gas fee na ginawang $1 sa ganap na $2" + }, + "transactionUpdated": { + "message": "Na-update ang transaksyon sa $2." + }, + "transactionErrored": { + "message": "Nagkaroon ng error ang transaksyon." + }, + "transactionCancelAttempted": { + "message": "Sinubukan ang pagkansela sa transaksyon nang may gas fee na $1 sa ganap na $2" + }, + "transactionCancelSuccess": { + "message": "Nakansela ang transaksyon sa ganap na $2" + }, + "transactionError": { + "message": "May Error sa Transaksyon. May exception sa contract code." + }, + "transactionErrorNoContract": { + "message": "Subukang mag-call ng function sa isang non-contract na address." + }, + "transactionFee": { + "message": "Fee sa Transaksyon" + }, + "transactionTime": { + "message": "Oras ng Transaksyon" + }, + "transfer": { + "message": "Mag-transfer" + }, + "transferBetweenAccounts": { + "message": "Mag-transfer sa pagitan ng aking mga account" + }, + "transferFrom": { + "message": "I-transfer Mula Sa" + }, + "troubleTokenBalances": { + "message": "Nagkaroon kami ng problema sa pag-loading sa iyong mga token balance. Makikita mo ang mga iyon ", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "Subukang muli" + }, + "typePassword": { + "message": "I-type ang iyong password sa MetaMask" + }, + "unapproved": { + "message": "Hindi inaprubahan" + }, + "units": { + "message": "(na) unit" + }, + "unknown": { + "message": "Hindi Alam" + }, + "unknownNetwork": { + "message": "Hindi Kilalang Pribadong Network" + }, + "unknownQrCode": { + "message": "Error: Hindi namin nakilala ang QR code na iyan" + }, + "unknownCameraErrorTitle": { + "message": "Ooops! Nagkaroon ng problema...." + }, + "unknownCameraError": { + "message": "Nagkaroon ng error habang sinusubukang i-access ang iyong camera. Pakisubukang muli..." + }, + "unlock": { + "message": "I-unlock" + }, + "unlockMessage": { + "message": "Naghihintay ang decentralized web" + }, + "updatedWithDate": { + "message": "Na-update ang $1" + }, + "urlErrorMsg": { + "message": "Kinakailangan ng mga URI ang naaangkop na HTTP/HTTPS prefix." + }, + "usedByClients": { + "message": "Ginagamit ng iba't ibang client" + }, + "viewAccount": { + "message": "Tingnan ang Account" + }, + "viewinExplorer": { + "message": "Tingnan sa Explorer" + }, + "viewContact": { + "message": "Tingnan ang Contact" + }, + "viewOnCustomBlockExplorer": { + "message": "Tingnan sa $1" + }, + "viewOnEtherscan": { + "message": "Tingnan sa Etherscan" + }, + "visitWebSite": { + "message": "Bisitahin ang aming web site" + }, + "welcomeBack": { + "message": "Welcome Ulit!" + }, + "welcome": { + "message": "Welcome sa MetaMask" + }, + "writePhrase": { + "message": "Isulat ang pariralang ito sa isang piraso ng papel at itago ito sa isang secure na lokasyon. Kung gusto mo ng higit pang seguridad, isulat ito sa maraming piraso ng papel at itago ang bawat isa sa 2 - 3 iba't ibang lokasyon." + }, + "yesLetsTry": { + "message": "Oo, subukan natin" + }, + "youNeedToAllowCameraAccess": { + "message": "Kailangan mong payagan ang access sa camera para magamit ang feature na ito." + }, + "yourSigRequested": { + "message": "Hinihiling ang iyong signature" + }, + "youSign": { + "message": "Sina-sign mo ang" + }, + "yourPrivateSeedPhrase": { + "message": "Ang iyong pribadong seed phrase" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "Zero ang presyo ng gas sa speed up" + } +} diff --git a/app/_locales/fr/messages.json b/app/_locales/fr/messages.json index 70effb3eaaa5..3b5e665cdaeb 100644 --- a/app/_locales/fr/messages.json +++ b/app/_locales/fr/messages.json @@ -1,45 +1,21 @@ { - "privacyMode": { - "message": "Les sites Web doivent demander un accès pour afficher les informations de votre compte." + "chartOnlyAvailableEth": { + "message": "Tableau disponible uniquement sur les réseaux Ethereum." }, - "privacyModeDescription": { - "message": "Les sites Web doivent demander un accès pour afficher les informations de votre compte." + "contractInteraction": { + "message": "Interaction avec un contrat" }, - "exposeAccounts": { - "message": "Exposer les comptes" - }, - "exposeDescription": { - "message": "Exposer des comptes sur le site Web actuel. Utile pour les dapps hérités." - }, - "confirmExpose": { - "message": "Êtes-vous sûr de vouloir exposer vos comptes au site Web actuel?" - }, - "confirmClear": { - "message": "Êtes-vous sûr de vouloir supprimer les sites Web approuvés?" - }, - "clearApprovalDataSuccess": { - "message": "Les données de site Web approuvées ont été supprimées." - }, - "approvalData": { - "message": "Données d'approbation" - }, - "approvalDataDescription": { - "message": "Effacer les données de site Web approuvées afin que tous les sites doivent à nouveau demander l'approbation." - }, - "clearApprovalData": { - "message": "Effacer les données d'approbation" - }, - "providerAPIRequest": { - "message": "Demande d'API Web3" + "reject": { + "message": "Rejeter" }, - "reviewProviderRequest": { - "message": "Veuillez consulter cette demande d'API Ethereum." + "about": { + "message": "À propos" }, - "providerRequestInfo": { - "message": "Le domaine répertorié ci-dessous tente de demander l'accès à l'API Ethereum pour pouvoir interagir avec la chaîne de blocs Ethereum. Vérifiez toujours que vous êtes sur le bon site avant d'autoriser l'accès à Ethereum." + "aboutSettingsDescription": { + "message": "Version, centre d'assistance et coordonnées" }, - "accept": { - "message": "Accepter" + "acceleratingATransaction": { + "message": "* Accélérer une transaction en utilisant un prix de l'essence plus élevé augmente ses chances d'être traitée plus rapidement par le réseau, mais ce n'est pas toujours garanti." }, "accessingYourCamera": { "message": "Accès à votre appareil photo..." @@ -53,17 +29,38 @@ "accountName": { "message": "Nom du compte" }, + "accountOptions": { + "message": "Options du compte" + }, "accountSelectionRequired": { "message": "Vous devez selectionner un compte !" }, "activityLog": { "message": "Log d'activité" }, - "address": { - "message": "Adresse" + "addNetwork": { + "message": "Ajouter un réseau" + }, + "addRecipient": { + "message": "Ajouter destinataire" + }, + "advanced": { + "message": "Paramètres avancés" + }, + "advancedSettingsDescription": { + "message": "Accédez aux fonctionnalités pour les développeurs, téléchargez State Logs, réinitialisez votre compte, configurez testnets et personnalisez RPC" }, - "addCustomToken": { - "message": "Ajouter un jeton personnalisé" + "advancedOptions": { + "message": "Options avancées" + }, + "addToAddressBook": { + "message": "Ajouter au carnet d'adresses" + }, + "addToAddressBookModalPlaceholder": { + "message": "p. ex. John D." + }, + "addAlias": { + "message": "Ajouter un alias" }, "addToken": { "message": "Ajouter un jeton" @@ -80,16 +77,13 @@ "amount": { "message": "Montant" }, - "amountPlusGas": { - "message": "Montant + Gaz" - }, "appDescription": { "message": "Extension Ethereum pour navigateur", - "description": "La description de l'application" + "description": "The description of the application" }, "appName": { "message": "MetaMask", - "description": "Le nom de l'application" + "description": "The name of the application" }, "approve": { "message": "Approuver" @@ -97,6 +91,9 @@ "approved": { "message": "Approuvé" }, + "asset": { + "message": "Actif" + }, "attemptingConnect": { "message": "Tentative de connexion au réseau" }, @@ -106,51 +103,57 @@ "attemptToCancelDescription": { "message": "Faire une demande d'annulation ne garantit pas que votre transaction originale sera bien annulée. Dans le cas où l'annulation réussit, vous payerez les frais de transaction indiqués ci-dessus." }, - "attributions": { - "message": "Attributions" + "autoLockTimeLimit": { + "message": "Minuterie de déconnexion automatique (minutes)" + }, + "autoLockTimeLimitDescription": { + "message": "Réglez le temps d'inactivité en minutes avant que MetaMask ne se déconnecte automatiquement." }, - "available": { - "message": "Disponible" + "average": { + "message": "Moyen" }, "back": { "message": "Retour" }, + "backToAll": { + "message": "Retour à Tous" + }, + "backupApprovalNotice": { + "message": "Sauvegardez votre code de récupération secret pour garder votre portefeuille et vos fonds en sécurité." + }, + "backupApprovalInfo": { + "message": "Ce code secret est requis pour récupérer votre portefeuille si jamais vous perdez votre appareil, oubliez votre mot de passe, devez réinstaller MetaMask ou souhaitez accéder à votre portefeuille depuis un autre appareil." + }, + "backupNow": { + "message": "Sauvegarder maintenant" + }, "balance": { "message": "Balance:" }, - "balances": { - "message": "Balance(s) de(s) jeton(s)" - }, - "balanceIsInsufficientGas": { - "message": "Solde insuffisant pour le total actuel de gaz" + "balanceOutdated": { + "message": "Le solde peut ne pas être à jour" }, - "beta": { - "message": "BETA" + "basic": { + "message": "Général" }, - "betweenMinAndMax": { - "message": "doit être supérieur ou égal à $1 et inférieur ou égal à $2", - "description": "helper pour la saisie hexadécimale en entrée décimale" + "blockExplorerView": { + "message": "Afficher le compte à $1", + "description": "$1 replaced by URL for custom block explorer" }, "blockiesIdenticon": { "message": "Utiliser les Identicon Blockies" }, - "borrowDharma": { - "message": "Emprunter avec Dharma (Bêta)" - }, "browserNotSupported": { "message": "Votre navigateur internet n'est pas supporté..." }, "builtInCalifornia": { "message": "MetaMask est designé et developpé en Californie." }, - "buy": { - "message": "Acheter" - }, - "buyCoinbase": { - "message": "Acheter sur Coinbase" + "buyWithWyre": { + "message": "Acheter ETH avec Wyre" }, - "buyCoinbaseExplainer": { - "message": "Coinbase est le moyen le plus populaire d'acheter et de vendre des Ethers." + "buyWithWyreDescription": { + "message": "Wyre vous permet d'utiliser une carte de crédit pour déposer ETH directement sur votre compte MetaMask." }, "buyCoinSwitch": { "message": "Acheter sur CoinSwitch" @@ -158,11 +161,14 @@ "buyCoinSwitchExplainer": { "message": "CoinSwitch est la destination unique pour échanger plus de 300 crypto-devises au meilleur taux." }, - "bytes": { - "message": "Bytes" + "off": { + "message": "Déconnecté" }, - "ok": { - "message": "Ok" + "on": { + "message": "Activé" + }, + "optionalBlockExplorerUrl": { + "message": "Bloquer l'URL de l'explorateur (facultatif)" }, "cancel": { "message": "Annuler" @@ -173,14 +179,14 @@ "cancellationGasFee": { "message": "Frais en gas de l'annulation" }, - "cancelN": { - "message": "Annuler toutes les transactions $1" + "cancelled": { + "message": "Annulé" }, - "classicInterface": { - "message": "Utiliser l'interface classique" + "chainId": { + "message": "ID de chaîne" }, - "clickCopy": { - "message": "Cliquer pour copier" + "clickToRevealSeed": { + "message": "Cliquez ici pour révéler des mots secrets" }, "close": { "message": "Fermer" @@ -194,14 +200,14 @@ "confirmed": { "message": "Confirmé" }, - "confirmContract": { - "message": "Confirmer le contrat" - }, "confirmPassword": { "message": "Confirmer le mot de passe" }, - "confirmTransaction": { - "message": "Confirmer la transaction" + "confirmSecretBackupPhrase": { + "message": "Confirmez votre phrase mnémotechnique " + }, + "congratulations": { + "message": "Félicitations" }, "connectHardwareWallet": { "message": "Connecter un portefeuille hardware" @@ -209,8 +215,8 @@ "connect": { "message": "Connecter" }, - "connecting": { - "message": "Connexion..." + "connectingTo": { + "message": "Connexion à $1" }, "connectingToKovan": { "message": "Connexion au réseau de test Kovan" @@ -224,20 +230,14 @@ "connectingToRinkeby": { "message": "Connexion au réseau de test Rinkeby" }, - "connectingToUnknown": { - "message": "Connexion à un réseau inconnu" - }, - "connectToLedger": { - "message": "Connecter un Ledger" + "connectingToLocalhost": { + "message": "Connexion à Localhost 8545" }, - "connectToTrezor": { - "message": "Connecter un Trezor" + "connectingToGoerli": { + "message": "Connexion au réseau de test Goerli" }, - "continue": { - "message": "Continuer" - }, - "continueToCoinbase": { - "message": "Continuer vers Coinbase" + "continueToWyre": { + "message": "Continuer vers Wyre" }, "continueToCoinSwitch": { "message": "Continuer vers CoinSwitch" @@ -245,33 +245,21 @@ "contractDeployment": { "message": "Déploiement de contrat" }, - "conversionProgress": { - "message": "Conversion en cours" - }, - "copiedButton": { - "message": "Copié" - }, - "copiedClipboard": { - "message": "Copié dans le Presse-papiers" - }, "copiedExclamation": { "message": "Copié!" }, - "copiedSafe": { - "message": "Copié de manière sécurisé" - }, - "copy": { - "message": "Copier" - }, "copyAddress": { "message": "Copier l'addresse dans le presse-papier" }, + "copyTransactionId": { + "message": "Copier l'ID de transaction" + }, + "copiedTransactionId": { + "message": "ID de transaction copié" + }, "copyToClipboard": { "message": "Copier dans le presse-papier" }, - "copyButton": { - "message": " Copier " - }, "copyPrivateKey": { "message": "Ceci est votre clé privée (cliquez pour copier)" }, @@ -281,34 +269,27 @@ "createAccount": { "message": "Créer un compte" }, - "createDen": { - "message": "Créer un antre" + "createAWallet": { + "message": "Créer un portefeuille" }, - "crypto": { - "message": "Crypto", - "description": "Type d'échange (cryptocurrencies)" + "createPassword": { + "message": "Créer un mot de passe" }, - "currentConversion": { - "message": "Conversion actuelle" + "currencyConversion": { + "message": "Conversion des devises" }, "currentLanguage": { "message": "Langue actuelle" }, - "currentNetwork": { - "message": "Réseau actuel" - }, - "currentRpc": { - "message": "RPC Actuel" - }, "customGas": { "message": "Personnaliser le gaz" }, + "customGasSubTitle": { + "message": "Augmenter le tarif peut faire baisser le temps de traitement, mais cela n'est pas garanti." + }, "customToken": { "message": "Jeton personnalisé" }, - "customize": { - "message": "Personnaliser" - }, "customRPC": { "message": "RPC personnalisé" }, @@ -321,39 +302,21 @@ "defaultNetwork": { "message": "Le réseau par défaut pour les transactions Ether est le \"Réseau principal Ethereum\"." }, - "denExplainer": { - "message": "Votre DEN est votre stockage crypté par mot de passe dans MetaMask." + "delete": { + "message": "Supprimer" + }, + "deleteAccount": { + "message": "Supprimer le compte" }, "deposit": { "message": "Déposer" }, - "depositBTC": { - "message": "Déposez vos BTC à l'adresse ci-dessous:" - }, - "depositEth": { - "message": "Déposer Eth" - }, "depositEther": { "message": "Déposer de l'Ether" }, - "depositFiat": { - "message": "Déposer de la monnaie-fiat" - }, - "depositFromAccount": { - "message": "Déposer depuis un autre compte" - }, - "depositShapeShift": { - "message": "Déposer avec ShapeShift" - }, - "depositShapeShiftExplainer": { - "message": "Si vous possédez d'autres crypto-monnaies, vous pouvez échanger et déposer de l'Ether directement dans votre portefeuille MetaMask via Shapeshift. Aucun compte n'est requis." - }, "details": { "message": "Détails" }, - "directDeposit": { - "message": "Dépôt direct" - }, "directDepositEther": { "message": "Dépôt direct d'Ether" }, @@ -366,6 +329,9 @@ "downloadGoogleChrome": { "message": "Télécharger Google Chrome" }, + "downloadSecretBackup": { + "message": "Téléchargez cette phrase de sauvegarde secrète et conservez-la en lieu sûr sur un disque dur ou un support de stockage externe chiffré." + }, "downloadStateLogs": { "message": "Télécharger les Logs d'état" }, @@ -378,55 +344,85 @@ "edit": { "message": "Modifier" }, - "editAccountName": { - "message": "Modifier le nom du compte" + "editContact": { + "message": "Modifier le contact" }, - "editingTransaction": { - "message": "Modifier votre transaction" + "endOfFlowMessage1": { + "message": "Vous avez réussi l'essai : gardez votre phrase de départ en sécurité, c'est de votre responsabilité !" }, - "emailUs": { - "message": "Envoyez-nous un email !" + "endOfFlowMessage2": { + "message": "Conseils pour le ranger en toute sécurité" }, - "encryptNewDen": { - "message": "Chiffrer votre nouveau DEN" + "endOfFlowMessage3": { + "message": "Sauvegardez une sauvegarde à plusieurs endroits." }, - "ensNameNotFound": { - "message": "Nom ENS inconnu" + "endOfFlowMessage4": { + "message": "Ne partagez jamais cette phrase avec qui que ce soit." + }, + "endOfFlowMessage5": { + "message": "Attention à l'hameçonnage ! MetaMask ne vous demandera jamais spontanément votre phrase de départ." + }, + "endOfFlowMessage6": { + "message": "Si vous avez besoin de sauvegarder à nouveau votre phrase de départ, vous pouvez la trouver dans Paramètres -> Sécurité." + }, + "endOfFlowMessage7": { + "message": "Si vous avez des questions ou remarquez quelque chose de suspect, envoyez un e-mail à : support@metamask.io." + }, + "endOfFlowMessage8": { + "message": "MetaMask ne peut pas récupérer votre phrase de départ. Renseignez-vous davantage." + }, + "endOfFlowMessage9": { + "message": "En savoir plus." + }, + "endOfFlowMessage10": { + "message": "Tout est terminé" + }, + "ensRegistrationError": { + "message": "Erreur dans l'enregistrement du nom ENS" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "Nom ENS non trouvé sur le réseau actuel. Essayez de passer au réseau Ethereum principal." + }, + "enterAnAlias": { + "message": "Saisissez un pseudonyme" }, "enterPassword": { "message": "Entrez votre mot de passe" }, - "enterPasswordConfirm": { - "message": "Entrez votre mot de passe pour confirmer" - }, "enterPasswordContinue": { "message": "Entrez votre mot de passe pour continuer" }, + "ethereumPublicAddress": { + "message": "Adresse publique d'Ethereum" + }, "etherscanView": { "message": "Afficher le compte sur Etherscan" }, - "exchangeRate": { - "message": "Taux de change" + "estimatedProcessingTimes": { + "message": "Délais de traitement estimés" + }, + "expandView": { + "message": "Agrandir la vue" }, "exportPrivateKey": { "message": "Exporter la clé privée" }, - "exportPrivateKeyWarning": { - "message": "Exporter les clés privées à vos risques et périls." - }, "failed": { "message": "Échec" }, + "fast": { + "message": "Rapide" + }, + "faster": { + "message": "Plus rapide" + }, "fiat": { "message": "FIAT", - "description": "Type d'échange" + "description": "Exchange type" }, "fileImportFail": { "message": "L'importation de fichier ne fonctionne pas? Cliquez ici!", - "description": "Aide l'utilisateur à importer son compte à partir d'un fichier JSON" - }, - "followTwitter": { - "message": "Suivez-nous sur Twitter" + "description": "Helps user import their account from a JSON file" }, "forgetDevice": { "message": "Oublier cet appareil" @@ -434,65 +430,54 @@ "from": { "message": "de" }, - "fromToSame": { - "message": "Les addresses d'origine et de destination doivent être différentes" - }, - "fromShapeShift": { - "message": "de ShapeShift" - }, "functionType": { "message": "Type de fonction" }, - "gas": { - "message": "Gas", - "description": "Indication brève du coût du gaz" - }, - "gasFee": { - "message": "Coût en gaz" - }, "gasLimit": { "message": "Quantité max. de gaz" }, - "gasLimitCalculation": { - "message": "Nous calculons la quantité max. de gaz suggérée en fonction du code exécuté." - }, - "gasLimitRequired": { - "message": "Quantité max. de gaz requise" + "gasLimitInfoModalContent": { + "message": "La limite d'essence est la quantité maximale d'unités d'essence que vous êtes prêt à dépenser." }, "gasLimitTooLow": { "message": "La quantité max. de gaz doit être d'au moins 21000" }, - "generatingSeed": { - "message": "Generation de la Seed..." + "gasUsed": { + "message": "Essence utilisée" }, "gasPrice": { "message": "Prix du gaz (GWEI)" }, - "gasPriceCalculation": { - "message": "Nous calculons les prix du gaz proposés en fonction des taux de réussite du réseau." + "gasPriceExtremelyLow": { + "message": "Prix de l'essence extrêmement bas" + }, + "gasPriceInfoModalContent": { + "message": "Le prix du gaz spécifie la quantité d'Ethers que vous acceptez de payer pour chaque unité de gaz." }, - "gasPriceRequired": { - "message": "Prix du gaz requis" + "gasPriceNoDenom": { + "message": "Prix du gaz" }, - "generatingTransaction": { - "message": "Préparation de la transaction" + "general": { + "message": "Général" + }, + "generalSettingsDescription": { + "message": "Conversion de devise, devise principale, langue, blockies identicon" }, "getEther": { "message": "Obtenir des Ether" }, "getEtherFromFaucet": { "message": "Obtenir de l'Ether d'une faucet pour $1", - "description": "Affiche le nom du réseau pour la faucet d'Ether" + "description": "Displays network name for Ether faucet" }, "getHelp": { "message": "Obtenir de l'aide." }, - "greaterThanMin": { - "message": "doit être supérieur ou égal à $1.", - "description": "helper pour la saisie hexadécimale en entrée décimale" + "getStarted": { + "message": "Démarrer" }, - "hardware": { - "message": "hardware" + "happyToSeeYou": { + "message": "Nous sommes ravis de vous voir." }, "hardwareWalletConnected": { "message": "Portefeuille hardware connecté" @@ -508,10 +493,7 @@ }, "here": { "message": "ici", - "description": "comme dans -cliquer ici- pour plus d'informations (en rapport avec troubleTokenBalances)" - }, - "hereList": { - "message": "Voici une liste !!!!" + "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, "hexData": { "message": "Data Hex" @@ -519,24 +501,15 @@ "hide": { "message": "Cacher" }, - "hideToken": { - "message": "Masquer le jeton" - }, "hideTokenPrompt": { "message": "Masquer le jeton?" }, "history": { "message": "Historique" }, - "howToDeposit": { - "message": "Comment voulez-vous déposer de l'Ether?" - }, - "holdEther": { - "message": "Cela vous permet de conserver vos Ethers et vos jetons afin d'utiliser directement des applications décentralisées." - }, "import": { "message": "Importer", - "description": "Bouton pour importer un compte à partir d'un fichier sélectionné" + "description": "Button to import an account from a selected file" }, "importAccount": { "message": "Importer un compte" @@ -544,33 +517,30 @@ "importAccountMsg": { "message": " Les comptes importés ne seront pas associés avec votre phrase Seed que vous avez créé au départ dans MetaMask. Obtenir plus d'information sur les comptes importés" }, - "importAnAccount": { - "message": "Importer un compte" + "importAccountSeedPhrase": { + "message": "Importez un compte avec une phrase mnémotechnique" + }, + "importWallet": { + "message": "Importer le portefeuille" }, - "importDen": { - "message": "Importer DEN existant" + "importYourExisting": { + "message": "Importez votre portefeuille existant à l'aide d'une phrase mnémotechnique de 12 mots" }, "imported": { "message": "Importé", - "description": "statut indiquant qu'un compte a été entièrement chargé dans le trousseau de clés" + "description": "status showing that an account has been fully loaded into the keyring" }, "importUsingSeed": { "message": "Importer à partir de la phrase Seed du compte" }, - "info": { - "message": "Info" - }, "infoHelp": { "message": "Info & Aide" }, "initialTransactionConfirmed": { "message": "Votre transaction initiale a été confirmée par le réseau. Cliquez sur OK pour retourner à l'écran précédent." }, - "insufficientFunds": { - "message": "Insufficient funds." - }, - "insufficientTokens": { - "message": "Insufficient tokens." + "insufficientBalance": { + "message": "Solde insuffisant." }, "invalidAddress": { "message": "Adresse invalide" @@ -578,49 +548,51 @@ "invalidAddressRecipient": { "message": "L'adresse du destinataire n'est pas valide" }, - "invalidGasParams": { - "message": "Paramètres de gaz invalides" + "knownAddressRecipient": { + "message": "Adresse contractuelle connue." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "Pas de réseau ETH, régler en minuscules" }, "invalidInput": { "message": "Saisie non valide." }, - "invalidRequest": { - "message": "Requête invalide" - }, "invalidRPC": { "message": "URL RPC invalide" }, + "invalidBlockExplorerURL": { + "message": "URL Block Explorer invalide" + }, "invalidSeedPhrase": { "message": "Phrase Seed invalide" }, - "jsonFail": { - "message": "Il y a eu un problème. Veuillez vérifier que votre fichier json a le bon format." + "ipfsGateway": { + "message": "IPFS Gateway" + }, + "ipfsGatewayDescription": { + "message": "Entrez l'URL de la gateway CID IPFS à utiliser pour résoudre les contenus ENS." + }, + "invalidIpfsGateway": { + "message": "IPFS Gateway Invalide: la valeur doit être une URL valide" + }, + "forbiddenIpfsGateway": { + "message": "IPFS Gateway Interdite: veuillez spécifier une gateway CID" }, "jsonFile": { "message": "Fichier JSON", - "description": "format d'importation d'un compte" - }, - "keepTrackTokens": { - "message": "Garder la trace des jetons que vous avez acheté avec votre compte MetaMask." + "description": "format for importing an account" }, "kovan": { "message": "Réseau de test Kovan" }, - "knowledgeDataBase": { - "message": "Visitez notre base de connaissances" - }, - "max": { - "message": "Max" - }, "learnMore": { "message": "En savoir plus" }, "ledgerAccountRestriction": { "message": "Vous devez d'abord utiliser le dernier compte que vous avez créé avant de pouvoir en créer un autre." }, - "lessThanMax": { - "message": "doit être inférieur ou égal à $1.", - "description": "helper pour la saisie hexadécimale en entrée décimale" + "letsGoSetUp": { + "message": "Oui, passons à la configuration !" }, "likeToAddTokens": { "message": "Souhaitez-vous ajouter ces jetons ?" @@ -628,8 +600,8 @@ "links": { "message": "Liens" }, - "limit": { - "message": "Limite" + "liveGasPricePredictions": { + "message": "Prévisions des prix de l'essence en direct" }, "loading": { "message": "Chargement..." @@ -637,45 +609,39 @@ "loadingTokens": { "message": "Chargement des jetons..." }, - "localhost": { - "message": "Localhost 8545" - }, - "login": { - "message": "Connexion" + "loadMore": { + "message": "Charger plus" }, - "logout": { + "lock": { "message": "Déconnexion" }, - "loose": { - "message": "Vacant" - }, - "loweCaseWords": { - "message": "Les mots seed n'ont que des caractères en minuscules" - }, "mainnet": { "message": "Réseau principal Ethereum" }, - "menu": { - "message": "Menu" + "memorizePhrase": { + "message": "Mémorisez cette phrase." }, - "message": { - "message": "Message" + "memo": { + "message": "note" }, "metamaskDescription": { "message": "MetaMask est un coffre sécurisé pour votre identité sur Ethereum." }, - "metamaskSeedWords": { - "message": "Mots Seed pour MetaMask" - }, "metamaskVersion": { "message": "Version de MetaMask" }, - "min": { - "message": "Minimum" + "mobileSyncText": { + "message": "Veuillez entrer votre mot de passe pour confirmer que c'est bien vous !" }, "myAccounts": { "message": "Mes comptes" }, + "myWalletAccounts": { + "message": "Mes comptes de portefeuille" + }, + "myWalletAccountsDescription": { + "message": "Tous vos comptes MetaMask créés seront automatiquement ajoutés à cette section." + }, "mustSelectOne": { "message": "Vous devez selectionner au moins 1 jeton." }, @@ -684,27 +650,35 @@ }, "needImportFile": { "message": "Vous devez sélectionner un fichier à importer.", - "description": "L'utilisateur doit ajouter un fichier pour continuer" - }, - "needImportPassword": { - "message": "Vous devez entrer un mot de passe pour le fichier sélectionné.", - "description": "Mot de passe et fichier requis pour importer un compte" + "description": "User is important an account and needs to add a file to continue" }, "negativeETH": { "message": "Vous ne pouvez envoyer des montants négatifs d'ETH." }, + "networkName": { + "message": "Nom du réseau" + }, "networks": { "message": "Réseaux" }, + "networkSettingsDescription": { + "message": "Ajoutez et modifiez des réseaux RPC personnalisés" + }, "nevermind": { "message": "Abandonner" }, "newAccount": { "message": "Nouveau compte" }, + "newAccountDetectedDialogMessage": { + "message": "Nouvelle adresse détectée ! Cliquez ici pour ajouter à votre carnet d'adresses." + }, "newAccountNumberName": { "message": "Compte $1", - "description": "Nom par défaut du compte suivant à créer sur l'écran de création de compte" + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "Nouveau contact" }, "newContract": { "message": "Nouveau contrat" @@ -712,14 +686,38 @@ "newPassword": { "message": "Nouveau mot de passe (min 8 caractères)" }, - "newPassword8Chars": { - "message": "Nouveau mot de passe (min 8 caractères)" + "newNetwork": { + "message": "Nouveau réseau" + }, + "newToMetaMask": { + "message": "Nouveau sur MetaMask ?" + }, + "noAlreadyHaveSeed": { + "message": "Non, j'ai déjà une phrase mnémotechnique" }, - "newRecipient": { - "message": "Nouveau destinataire" + "protectYourKeys": { + "message": "Protégez vos clés !" }, - "newRPC": { - "message": "Nouvelle URL RPC" + "protectYourKeysMessage1": { + "message": "Soyez prudent avec votre phrase mnémotechnique — on nous a signalé des sites web qui tentaient d'imiter MetaMask. MetaMask ne vous demandera jamais votre phrase mnémotechnique !" + }, + "protectYourKeysMessage2": { + "message": "Ne dévoilez pas votre phrase. Si vous remarquez quelque chose de suspect ou que vous avez un doute à propos d'un site web, envoyez un e-mail à : support@metamask.io" + }, + "rpcUrl": { + "message": "Nouvelle URL de RPC" + }, + "optionalChainId": { + "message": "ChainID (facultatif)" + }, + "optionalSymbol": { + "message": "Symbole (facultatif)" + }, + "newTotal": { + "message": "Nouveau total" + }, + "newTransactionFee": { + "message": "Coût de la nouvelle transaction" }, "next": { "message": "Suivant" @@ -727,23 +725,14 @@ "noAddressForName": { "message": "Aucune adresse n'a été définie pour ce nom." }, - "noDeposits": { - "message": "Aucun dépôt reçu" - }, "noConversionRateAvailable": { "message": "Aucun taux de conversion disponible" }, - "noTransactionHistory": { - "message": "Aucun historique de transaction." - }, "noTransactions": { "message": "Aucune transaction" }, - "notFound": { - "message": "Non trouvé" - }, - "notStarted": { - "message": "Pas démarré" + "notEnoughGas": { + "message": "Pas assez d'essence" }, "noWebcamFoundTitle": { "message": "Webcam introuvable" @@ -751,25 +740,8 @@ "noWebcamFound": { "message": "La caméra de votre ordinateur n'a pas été trouvée. Veuillez réessayer." }, - "oldUI": { - "message": "Ancienne interface utilisateur" - }, - "oldUIMessage": { - "message": "Vous êtes revenu à l'ancienne interface utilisateur. Vous pouvez revenir à la nouvelle interface via l'option dans le menu déroulant en haut à droite." - }, - "onlySendToEtherAddress": { - "message": "N'envoyez de l'Ether que sur une adresse Ethereum." - }, - "onlySendTokensToAccountAddress": { - "message": "N'envoyez des $1 que sur une adresse Ethereum.", - "description": "displays token symbol" - }, - "openInTab": { - "message": "Ouvrir dans un onglet" - }, - "or": { - "message": "ou", - "description": "choix entre la création ou l'importation d'un nouveau compte" + "ofTextNofM": { + "message": "de" }, "orderOneHere": { "message": "Commander un Trezor ou un Ledger et conserver vos fonds en \"cold storage\"" @@ -777,38 +749,27 @@ "origin": { "message": "Origine" }, - "outgoing": { - "message": "Sortie" - }, "parameters": { "message": "Paramètres" }, - "passwordNotLongEnough": { - "message": "Mot de passe trop court" + "participateInMetaMetrics": { + "message": "Participer à MetaMetrics" }, - "passwordsDontMatch": { - "message": "Les mots de passe ne correspondent pas" + "participateInMetaMetricsDescription": { + "message": "Participez à MetaMetrics pour nous aider à améliorer MetaMask" }, "password": { "message": "Mot de passe" }, - "passwordCorrect": { - "message": "Veuillez vérifier votre mot de passe." - }, - "passwordMismatch": { - "message": "les mots de passe ne correspondent pas", - "description": "dans le processus de création de mot de passe, les deux mot de passe saisis ne sont pas identiques." + "passwordsDontMatch": { + "message": "Les mots de passe ne correspondent pas" }, - "passwordShort": { - "message": "Mot de passe trop court", - "description": "dans le processus de création de mot de passe, le mot de passe n'est pas assez long pour être sécurisé" + "passwordNotLongEnough": { + "message": "Mot de passe trop court" }, "pastePrivateKey": { "message": "Collez votre clé privée ici:", - "description": "Pour l'importation d'un compte à partir d'une clé privée" - }, - "pasteSeed": { - "message": "Collez votre seed phrase ici!" + "description": "For importing an account from a private key" }, "pending": { "message": "En attente" @@ -816,21 +777,21 @@ "personalAddressDetected": { "message": "Votre adresse personnelle a été détectée. Veuillez saisir à la place l'adresse du contrat du jeton." }, - "pleaseReviewTransaction": { - "message": "Veuillez vérifier votre transaction." - }, - "popularTokens": { - "message": "Jetons populaires" - }, "prev": { "message": "Préc." }, + "primaryCurrencySetting": { + "message": "Devise principale" + }, + "primaryCurrencySettingDescription": { + "message": "Sélectionnez « natif » pour donner la priorité à l'affichage des valeurs dans la devise native de la chaîne (par ex. ETH). Sélectionnez « fiduciaire » pour donner la priorité à l'affichage des valeurs dans la devise de votre choix." + }, "privacyMsg": { "message": "Politique de Confidentialité" }, "privateKey": { "message": "Clé privée", - "description": "sélectionnez ce type de fichier à utiliser pour importer un compte" + "description": "select this type of file to use to import an account" }, "privateKeyWarning": { "message": "Avertissement: Ne divulguez jamais cette clé, quiconque avec vos clés privées peut voler tous les actifs de votre compte." @@ -838,32 +799,20 @@ "privateNetwork": { "message": "Réseau privé" }, - "qrCode": { - "message": "Afficher le QR Code" - }, "queue": { "message": "File d'attente" }, "readdToken": { "message": "Vous pourrez ajouter à nouveau ce jeton en allant sur “Ajouter un jeton†dans le menu des options de votre compte." }, - "readMore": { - "message": "En savoir plus ici." - }, - "readMore2": { - "message": "En savoir plus." - }, - "receive": { - "message": "Recevoir" + "recents": { + "message": "Récents" }, "recipientAddress": { "message": "Adresse du destinataire" }, - "refundAddress": { - "message": "Votre adresse de remboursement" - }, - "reject": { - "message": "Rejeter" + "recipientAddressPlaceholder": { + "message": "Recherche, adresse publique (0x) ou ENS" }, "rejectAll": { "message": "Tout rejeter" @@ -886,24 +835,27 @@ "resetAccountDescription": { "message": "Reinitialiser votre compte va effacer votre historique de transactions." }, + "deleteNetwork": { + "message": "Supprimer le réseau ?" + }, + "deleteNetworkDescription": { + "message": "Êtes-vous sûr de vouloir supprimer ce réseau ?" + }, + "remindMeLater": { + "message": "Rappelez-moi plus tard" + }, "restoreFromSeed": { "message": "Restaurer le compte ?" }, - "restoreVault": { - "message": "Restaurer le Coffre" - }, "restoreAccountWithSeed": { "message": "Restaurer votre compte avec une phrase Seed." }, + "requestsAwaitingAcknowledgement": { + "message": "demandes en attente d'un accusé de réception" + }, "required": { "message": "Obligatoire" }, - "retryWithMoreGas": { - "message": "Réessayer avec un prix de gaz plus élevé" - }, - "walletSeed": { - "message": "Seed du portefeuille" - }, "restore": { "message": "Restaurer" }, @@ -922,9 +874,6 @@ "revealSeedWordsWarning": { "message": "Ces mots peuvent être utilisés pour voler tous vos comptes." }, - "revert": { - "message": "Rétablir" - }, "remove": { "message": "Supprimer" }, @@ -943,25 +892,20 @@ "ropsten": { "message": "Réseau de test Ropsten" }, - "rpc": { - "message": "RPC Personnalisé" - }, - "sampleAccountName": { - "message": "Par exemple: \"mon nouveau compte\" ", - "description": "Aidez l'utilisateur à comprendre le concept d'ajout d'un nom lisible par un humain à son compte" + "goerli": { + "message": "Réseau de test Goerli" }, "save": { "message": "Enregistrer" }, - "saveAsCsvFile": { - "message": "Enregistrer comme fichier CSV" + "slow": { + "message": "Lente" }, - "saveAsFile": { - "message": "Enregistrer dans un fichier", - "description": "Processus d'exportation de compte" + "slower": { + "message": "Plus lent" }, - "saveSeedAsFile": { - "message": "Enregistrer la phrase Seed dans un fichier" + "saveAsCsvFile": { + "message": "Enregistrer comme fichier CSV" }, "scanInstructions": { "message": "Placez le QR code devant votre appareil photo" @@ -975,30 +919,48 @@ "searchResults": { "message": "Resultats de la recherche" }, + "secretBackupPhrase": { + "message": "Phrase de sauvegarde secrète" + }, + "secretBackupPhraseDescription": { + "message": "Votre phrase de sauvegarde secrète facilite la sauvegarde et la restauration de votre compte." + }, + "secretBackupPhraseWarning": { + "message": "AVERTISSEMENT : ne révélez jamais votre phrase de sauvegarde. N'importe qui avec cette phrase peut voler votre Ether pour toujours." + }, "secretPhrase": { "message": "Entrez vos 12 mots secrets de votre phrase Seed pour restaurer votre coffre." }, + "securityAndPrivacy": { + "message": "Sécurité et confidentialité" + }, + "securitySettingsDescription": { + "message": "Paramètres de confidentialité et phrase de départ du portefeuille" + }, + "seedPhrasePlaceholder": { + "message": "Separez chaque mot avec un espace simple" + }, "seedPhraseReq": { "message": "Les phrases Seed sont composées de 12 mots" }, - "select": { - "message": "Selectionner" - }, "selectCurrency": { "message": "Selectionner Devise" }, + "selectEachPhrase": { + "message": "Veuillez sélectionner chaque phrase afin de vous assurer qu'elle est correcte." + }, "selectLocale": { "message": "Selectionner la localisation" }, - "selectService": { - "message": "Sélectionner un service" - }, "selectType": { "message": "Selectionner le type" }, "send": { "message": "Envoyer" }, + "sendAmount": { + "message": "Envoyer le montant" + }, "sendETH": { "message": "Envoyer des ETH" }, @@ -1017,36 +979,39 @@ "searchTokens": { "message": "Rechercher des jetons" }, - "selectAnAddress": { - "message": "Selectionner une adresse" - }, "selectAnAccount": { "message": "Selectionner un compte" }, "selectAnAccountHelp": { "message": "Selectionner le compte à afficher dans MetaMask" }, + "selectAHigherGasFee": { + "message": "Choisissez des frais d'essence plus élevés pour accélérer le traitement de votre transaction*." + }, "selectHdPath": { "message": "Selectioner le \"Path HD\"" }, "selectPathHelp": { "message": "Si vos comptes Ledger n'apparaissent pas ci-dessous, essayez de selectionner le path \"Legacy (MEW / MyCrypto)\"" }, - "sendTokensAnywhere": { - "message": "Envoyer des jetons à toute personne possédant un compte Ethereum" - }, "settings": { "message": "Paramètres" }, - "shapeshiftBuy": { - "message": "Acheter avec Shapeshift" + "showAdvancedGasInline": { + "message": "Contrôles d'essence avancés" + }, + "showAdvancedGasInlineDescription": { + "message": "Sélectionnez cette option pour afficher le prix de l'essence et les contrôles des limites directement sur les écrans d'envoi et de confirmation." + }, + "showFiatConversionInTestnets": { + "message": "Afficher la conversion sur Testnets" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Sélectionnez cette option pour afficher la conversion des monnaies fiduciaires sur Testnets." }, "showPrivateKeys": { "message": "Afficher les clés privées" }, - "showQRCode": { - "message": "Afficher le QR Code" - }, "showHexData": { "message": "Afficher les données Hex" }, @@ -1062,32 +1027,26 @@ "signed": { "message": "Signé" }, - "signMessage": { - "message": "Signer le message" - }, "signNotice": { "message": "La signature de ce message peut avoir des effets secondaires \ndangereux. Signer uniquement les messages de \nsites auxquels vous faites entièrement confiance avec votre compte.\n Cette méthode dangereuse sera supprimée dans une future version." }, "sigRequest": { "message": "Demande de signature" }, - "sigRequested": { - "message": "Signature demandée" - }, - "spaceBetween": { - "message": "il ne peut y avoir qu'un seul espace entre les mots" + "somethingWentWrong": { + "message": "Oups ! Quelque chose a mal tourné. " }, "speedUp": { "message": "accélérer" }, - "speedUpTitle": { - "message": "Accélérer la Transaction" + "speedUpCancellation": { + "message": "Accélérer cette annulation" }, - "speedUpSubtitle": { - "message": "Augmenter le prix du gas pour tenter de remplacer et d'accélérer votre transaction" + "speedUpTransaction": { + "message": "Accélérez cette transaction" }, - "status": { - "message": "Statut" + "switchNetworks": { + "message": "Changer de réseau" }, "stateLogs": { "message": "Logs d'Etat" @@ -1116,8 +1075,8 @@ "step3HardwareWalletMsg": { "message": "Utilisez ce compte de votre portefeuille hardware comme n'importe quel compte Ethereum. Connectez vous à des dApps, envoyez de l'Eth, achetez et conservez des jetons ERC20 et Non-Fungible comme CryptoKitties." }, - "submit": { - "message": "Soumettre" + "storePhrase": { + "message": "Stockez cette phrase dans un gestionnaire de mots de passe comme 1Password." }, "submitted": { "message": "Envoyé" @@ -1125,11 +1084,32 @@ "supportCenter": { "message": "Visitez notre centre d'aide" }, + "symbol": { + "message": "Symbole" + }, "symbolBetweenZeroTwelve": { - "message": "Le symbol doit avoir entre 0 et 12 caractères." + "message": "Le symbole doit comporter 11 caractères ou moins." + }, + "syncWithMobile": { + "message": "Synchroniser avec le mobile" + }, + "syncWithMobileTitle": { + "message": "Synchroniser avec le mobile" + }, + "syncWithMobileDesc": { + "message": "Vous pouvez synchroniser vos comptes et vos informations avec votre appareil mobile. Ouvrez l'application mobile MetaMask, allez dans « Paramètres » et appuyez sur « Synchroniser depuis l'extension de navigateur »" }, - "takesTooLong": { - "message": "Cela prend trop de temps ?" + "syncWithMobileDescNewUsers": { + "message": "Si vous ouvrez l'application MetaMask Mobile pour la première fois, suivez simplement les étapes dans votre téléphone." + }, + "syncWithMobileScanThisCode": { + "message": "Scannez ce code avec votre application mobile MetaMask" + }, + "syncWithMobileBeCareful": { + "message": "Assurez-vous que personne d'autre ne regarde votre écran lorsque vous scannez ce code." + }, + "syncWithMobileComplete": { + "message": "Vos données ont été synchronisées avec succès. Profitez de l'application mobile MetaMask !" }, "terms": { "message": "Conditions d'Utilisation" @@ -1137,125 +1117,97 @@ "testFaucet": { "message": "Faucet Testnet" }, + "thisWillCreate": { + "message": "Cela créera un nouveau portefeuille et une nouvelle phrase mnémotechnique" + }, + "tips": { + "message": "Dons" + }, "to": { "message": "Destinataire" }, - "toETHviaShapeShift": { - "message": "$1 à ETH via ShapeShift", - "description": "le système remplira le type de dépôt au début du message" - }, "token": { "message": "Jeton" }, - "tokenAddress": { - "message": "Addresse du Jeton" - }, "tokenAlreadyAdded": { "message": "Ce Jeton a déjà été ajouté." }, - "tokenBalance": { - "message": "Votre solde de jeton est :" - }, - "tokenSelection": { - "message": "Recherchez des tokens or sélectionnez en parmi notre liste de jetons populaires." + "tokenContractAddress": { + "message": "Adresse du contrat de jeton" }, "tokenSymbol": { "message": "Symbole du Jeton" }, - "tokenWarning1": { - "message": "Garder la trace des jetons achetésvia MetaMask. Si vous en avez acheté avec un autre compte, ces jetons n'apparaîtront pas ici." - }, - "total": { - "message": "Total" - }, - "transaction": { - "message": "transaction" - }, "transactionConfirmed": { "message": "Transaction confirmée sur $2." }, "transactionCreated": { "message": "Transaction crée avec une valeur de $1 sur $2." }, - "transactionWithNonce": { - "message": "Transaction $1" - }, "transactionDropped": { "message": "Transaction abandonnée sur $2." }, "transactionSubmitted": { "message": "Transaction envoyée sur $2." }, + "transactionResubmitted": { + "message": "La transaction a été soumise à nouveau avec une augmentation du prix du gaz, désormais de $1 à $2" + }, "transactionUpdated": { "message": "Transaction mise à jour sur $2." }, - "transactionUpdatedGas": { - "message": "Transaction mise à jour avec un prix de gaz de $1 sur $2." + "transactionErrored": { + "message": "La transaction a rencontré une erreur." }, - "transactions": { - "message": "transactions" + "transactionCancelAttempted": { + "message": "Tentative d'annulation de la transaction avec un prix du gaz de $1 à $2" + }, + "transactionCancelSuccess": { + "message": "Transaction annulée avec succès à $2" }, "transactionError": { "message": "Erreur de Transaction. Une Exception a été rencontrée dans l'exécution du code du contrat." }, - "transactionMemo": { - "message": "Mémo de transaction (optionnel)" + "transactionErrorNoContract": { + "message": "Essayer d'appeler une fonction sur une adresse qui n'apparaît pas dans le contrat." + }, + "transactionFee": { + "message": "Frais de transaction" }, - "transactionNumber": { - "message": "Numéro de transaction" + "transactionTime": { + "message": "Heure de la transaction" }, "transfer": { "message": "Transfert" }, + "transferBetweenAccounts": { + "message": "Transfert entre mes comptes" + }, "transferFrom": { "message": "Transfert Depuis" }, - "transfers": { - "message": "Transferts" - }, - "trezorHardwareWallet": { - "message": "Portefeuille hardware TREZOR" - }, "troubleTokenBalances": { "message": "Nous avons eu du mal à charger votre balance de jetons, vous pouvez la consulter ici :", - "description": "Suivi par un lien (ici) pour voir les soldes des jetons" + "description": "Followed by a link (here) to view token balances" }, "tryAgain": { "message": "Essayez à nouveau" }, - "twelveWords": { - "message": "Ces 12 mots sont la seule manière de restaurer vos comptes MetaMask.\nEnregistrez les quelquepart de sûr et secret." - }, "typePassword": { "message": "Entrez votre mot de passe" }, - "uiWelcome": { - "message": "Bienvenue dans la nouvelle interface utilisateur (Beta)" - }, - "uiWelcomeMessage": { - "message": "Vous utilisez maintenant la nouvelle interface utilisateur MetaMask. Jetez un coup d'oeil, essayez de nouvelles fonctionnalités comme l'envoi de jetons, et faites-nous savoir si vous avez des problèmes." - }, "unapproved": { "message": "Non autorisé" }, - "unavailable": { - "message": "Indisponible" - }, "units": { "message": "unités" }, "unknown": { "message": "Inconnu" }, - "unknownFunction": { - "message": "Fonction inconnue" - }, "unknownNetwork": { "message": "Réseau privé inconnu" }, - "unknownNetworkId": { - "message": "ID réseau inconnu" - }, "unknownQrCode": { "message": "Erreur: Nous n'avons pas pu identifier le QR code" }, @@ -1274,36 +1226,35 @@ "updatedWithDate": { "message": "Mis à jour $1" }, - "uriErrorMsg": { + "urlErrorMsg": { "message": "Les URLs requièrent un préfixe HTTP/HTTPS approprié." }, - "usaOnly": { - "message": "Etats-Unis seulement", - "description": "Utiliser cet échange est limité aux personnes à l'intérieur des Etats-Unis" - }, "usedByClients": { "message": "Utilisé par une variété de clients différents" }, - "useOldUI": { - "message": "Utiliser l'ancienne interface." - }, - "validFileImport": { - "message": "Vous devez selectionner un fichier valide à importer." - }, - "vaultCreated": { - "message": "Coffre créé" + "userName": { + "message": "Nom d'utilisateur" }, "viewAccount": { "message": "Afficher le compte" }, + "viewinExplorer": { + "message": "Afficher dans Explorer" + }, + "viewContact": { + "message": "Voir contact" + }, + "viewOnCustomBlockExplorer": { + "message": "Afficher à $1" + }, "viewOnEtherscan": { "message": "Voir sur Etherscan" }, "visitWebSite": { "message": "Visitez notre site web" }, - "warning": { - "message": "Avertissement" + "walletSeed": { + "message": "Seed du portefeuille" }, "welcomeBack": { "message": "Bienvenue à nouveau !" @@ -1311,8 +1262,8 @@ "welcome": { "message": "Bienvenue dans la Beta de MetaMask" }, - "whatsThis": { - "message": "Qu'est-ce que c'est?" + "writePhrase": { + "message": "Écrivez cette phrase sur une feuille de papier et rangez-la dans un endroit sûr. Si vous voulez encore plus de sécurité, notez-la sur plusieurs feuilles de papier et rangez-les dans deux ou trois endroits différents." }, "yesLetsTry": { "message": "Oui, essayons" @@ -1328,5 +1279,8 @@ }, "yourPrivateSeedPhrase": { "message": "Votre phrase Seed privée" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "Prix de l'essence zéro sur l'accélération" } } diff --git a/app/_locales/gu/messages.json b/app/_locales/gu/messages.json new file mode 100644 index 000000000000..d04514fd90c9 --- /dev/null +++ b/app/_locales/gu/messages.json @@ -0,0 +1,143 @@ +{ + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "reject": { + "message": "નકારો" + }, + "about": { + "message": "વિશે" + }, + "account": { + "message": "àªàª•ાઉનà«àªŸ" + }, + "advanced": { + "message": "વિગતવાર" + }, + "back": { + "message": "પાછળ" + }, + "basic": { + "message": "મૂળભૂત" + }, + "off": { + "message": "બંધ" + }, + "ok": { + "message": "બરાબર, સમજાઇ ગયà«àª‚" + }, + "on": { + "message": "ચાલà«" + }, + "cancel": { + "message": "રદ કરો" + }, + "close": { + "message": "બંધ કરો" + }, + "confirm": { + "message": "પà«àª·à«àªŸàª¿ કરો" + }, + "connect": { + "message": "કનેકà«àªŸ કરો" + }, + "copyToClipboard": { + "message": "કà«àª²àª¿àªªàª¬à«‹àª°à«àª¡ પર કૉપિ કરો" + }, + "create": { + "message": "બનાવો" + }, + "delete": { + "message": "કાઢી નાખો" + }, + "details": { + "message": "વિગતો" + }, + "done": { + "message": "થઈ ગયà«àª‚" + }, + "edit": { + "message": "સંપાદન" + }, + "fast": { + "message": "àªàª¡àªªà«€" + }, + "forgetDevice": { + "message": "આ ઉપકરણને ભૂલી જાઓ" + }, + "getStarted": { + "message": "પà«àª°àª¾àª°àª‚ભ કરો" + }, + "hide": { + "message": "છà«àªªàª¾àªµà«‹" + }, + "history": { + "message": "ઇતિહાસ" + }, + "import": { + "message": "આયાત કરો", + "description": "Button to import an account from a selected file" + }, + "imported": { + "message": "આયાત કરેલા", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "loading": { + "message": "લોડ કરી રહà«àª¯à«àª‚ છે..." + }, + "next": { + "message": "આગલà«àª‚" + }, + "origin": { + "message": "મૂળ" + }, + "password": { + "message": "પાસવરà«àª¡" + }, + "queue": { + "message": "કતારમાં" + }, + "reset": { + "message": "રીસેટ કરો" + }, + "restore": { + "message": "પà«àª¨àªƒàª¸à«àª¥àª¾àªªàª¿àª¤ કરો" + }, + "remove": { + "message": "દૂર કરો" + }, + "removeAccount": { + "message": "àªàª•ાઉનà«àªŸ દૂર કરો" + }, + "save": { + "message": "સાચવો" + }, + "slow": { + "message": "ધીમà«àª‚" + }, + "search": { + "message": "શોધો" + }, + "send": { + "message": "મોકલો" + }, + "settings": { + "message": "સેટિંગà«àª¸" + }, + "tryAgain": { + "message": "ફરી પà«àª°àª¯àª¾àª¸ કરો" + }, + "unknown": { + "message": "અજાણ" + }, + "unlock": { + "message": "અનલોક કરો" + }, + "userName": { + "message": "વપરાશકરà«àª¤àª¾àª¨àª¾àª®" + }, + "viewAccount": { + "message": "àªàª•ાઉનà«àªŸ જà«àª“" + } +} diff --git a/app/_locales/he/messages.json b/app/_locales/he/messages.json new file mode 100644 index 000000000000..02c7a496c47a --- /dev/null +++ b/app/_locales/he/messages.json @@ -0,0 +1,1304 @@ +{ + "chartOnlyAvailableEth": { + "message": "טבלה זמינה רק ברשתות ×תריו×." + }, + "contractInteraction": { + "message": "×ינטר×קציית חוזה" + }, + "reject": { + "message": "דחה" + }, + "about": { + "message": "מידע כללי" + }, + "aboutSettingsDescription": { + "message": "גרסה, מרכז תמיכה ופרטי יצירת קשר." + }, + "acceleratingATransaction": { + "message": "* ×”×צת עסקה על ידי שימוש במחיר דלק גבוה יותר מגדילה ×ת סיכוייה לעבור עיבוד מהיר יותר ×¢\"×™ הרשת, ×ך ×–×” ×œ× ×ª×ž×™×“ מובטח." + }, + "accessingYourCamera": { + "message": "ניגש למצלמה שלך ..." + }, + "account": { + "message": "חשבון" + }, + "accountDetails": { + "message": "פרטי חשבון" + }, + "accountName": { + "message": "×©× ×”×—×©×‘×•×Ÿ" + }, + "accountOptions": { + "message": "×פשרויות חשבון" + }, + "accountSelectionRequired": { + "message": "עליך לבחור חשבון!" + }, + "activityLog": { + "message": "יומן פעילות" + }, + "addNetwork": { + "message": "הוסף/×™ רשת" + }, + "addRecipient": { + "message": "הוסף נמען" + }, + "advanced": { + "message": "מתקד×" + }, + "advancedSettingsDescription": { + "message": "קבלת גישה לפיצ'×¨×™× ×œ×ž×¤×ª×—×™×, הורדת יומני מצב, ×יפוס חשבון, הגדרת testnets ו-RPC מות×× ×ישית." + }, + "advancedOptions": { + "message": "×פשרויות מתקדמות" + }, + "addToAddressBook": { + "message": "הוסף לפנקס הכתובות" + }, + "addToAddressBookModalPlaceholder": { + "message": "למשל ×’'ון ד'" + }, + "addAlias": { + "message": "הוסף כינוי" + }, + "addToken": { + "message": "הוסף/×™ ×סימון" + }, + "addTokens": { + "message": "הוסף סמלי×" + }, + "addSuggestedTokens": { + "message": "הוסף/×™ ××¡×™×ž×•× ×™× ×ž×•×¦×¢×™×" + }, + "addAcquiredTokens": { + "message": "הוספת ×”×˜×•×§× ×™× ×©×”×©×’×ª ב×מצעות MetaMask" + }, + "amount": { + "message": "כמות" + }, + "appDescription": { + "message": "×רנק ××ª×¨×™×•× ×‘×“×¤×“×¤×Ÿ שלך", + "description": "The description of the application" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "approve": { + "message": "×ישור" + }, + "approved": { + "message": "×ושר" + }, + "asset": { + "message": "נכס" + }, + "attemptingConnect": { + "message": "מנסה להתחבר לבלוקצ'יין." + }, + "attemptToCancel": { + "message": "לנסות לבטל?" + }, + "attemptToCancelDescription": { + "message": "הגשת ניסיון ×–×” ××™× ×” מבטיחה ×›×™ העסקה המקורית שלך תבוטל. ×× × ×™×¡×™×•×Ÿ הביטול יצליח, תחויב/×™ בעמלת העסקה המופיעה מעלה." + }, + "attributions": { + "message": "תכונות" + }, + "autoLockTimeLimit": { + "message": "טיימר התנתקות ×וטומטית (דקות)" + }, + "autoLockTimeLimitDescription": { + "message": "הגדר/×™ ×ת זמן היעדר הפעילות בדקות לפני ש-MetaMask יתנתק ×וטומטית." + }, + "average": { + "message": "ממוצע" + }, + "back": { + "message": "חזור" + }, + "backToAll": { + "message": "חזרה ×ל 'הכל'" + }, + "backupApprovalNotice": { + "message": "גבה/×™ ×ת קוד השחזור הסודי שלך כדי לשמור ×ת בטיחות ×”×רנק ×•×”×›×¡×¤×™× ×©×œ×š." + }, + "backupApprovalInfo": { + "message": "קוד סודי ×–×” נדרש כדי לשחזר ×ת ×”×רנק שלך במקרה שת×בד/×™ ×ת מכשירך, תשכח/×™ ×ת הססמה, תצטרכ/×™ להתקין מחדש ×ת MetaMask ×ו שתרצה/×™ לגשת ל×רנק שלך במכשיר ×חר." + }, + "backupNow": { + "message": "צור גיבוי כעת" + }, + "balance": { + "message": "יתרה" + }, + "balanceOutdated": { + "message": "ייתכן ×›×™ היתרה ××™× ×” מעודכנת" + }, + "basic": { + "message": "בסיסי" + }, + "blockExplorerUrl": { + "message": "סייר בלוקי×" + }, + "blockExplorerView": { + "message": "הצג חשבון ב- $1", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "השתמש ב- Blockies Identicon" + }, + "browserNotSupported": { + "message": "הדפדפן שלך ×ינו נתמך..." + }, + "builtInCalifornia": { + "message": "MetaMask תוכנן ונבנה בקליפורניה." + }, + "buyWithWyre": { + "message": "רכישת ×ת'ר ×¢× Wyre" + }, + "buyWithWyreDescription": { + "message": "Wyre מ×פשרת לך להשתמש בכרטיס ×שר××™ כדי להפקיד ETH ישירות בחשבון ×”-MetaMask שלך." + }, + "buyCoinSwitch": { + "message": "רכישה ב-CoinSwitch" + }, + "buyCoinSwitchExplainer": { + "message": "CoinSwitch ×”×•× ×”×™×¢×“ ×¢× ×›×œ×œ ×”×פשרויות להחלפת יותר מ-300 מטבעות קריפטו בשער הטוב ביותר." + }, + "bytes": { + "message": "בייטי×" + }, + "off": { + "message": "כבוי" + }, + "ok": { + "message": "×ישור" + }, + "on": { + "message": "פועל" + }, + "optionalBlockExplorerUrl": { + "message": "×—×¡×•× ×›×ª×•×‘×ª URL של ×קספלורר (×ופציונלי)" + }, + "cancel": { + "message": "ביטול" + }, + "cancelAttempt": { + "message": "בטל ניסיון" + }, + "cancellationGasFee": { + "message": "עמלת דלק עבור ביטול" + }, + "cancelled": { + "message": "מבוטל" + }, + "chainId": { + "message": "מזהה שרשרת" + }, + "clickToRevealSeed": { + "message": "לחצ/×™ ×›×ן לחשיפת ×ž×™×œ×™× ×¡×•×“×™×•×ª" + }, + "close": { + "message": "סגירה" + }, + "chromeRequiredForHardwareWallets": { + "message": "עליך להשתמש ב-MetaMask בגוגל ×›×¨×•× ×›×“×™ להתחבר ל×רנק החומרה שלך." + }, + "confirm": { + "message": "×ישור" + }, + "confirmed": { + "message": "×ושר" + }, + "confirmPassword": { + "message": "× × ×œ×שר סיסמה" + }, + "confirmSecretBackupPhrase": { + "message": "×שר/×™ ×ת צירוף הגיבוי הסודי שלך" + }, + "congratulations": { + "message": "מזל טוב" + }, + "connectHardwareWallet": { + "message": "חבר ×רנק חומרה" + }, + "connect": { + "message": "התחברות" + }, + "connectingTo": { + "message": "מתחבר ל- $1 " + }, + "connectingToKovan": { + "message": "מתחבר ל-Kovan Test Network" + }, + "connectingToMainnet": { + "message": "מתחבר לרשת ××ª×¨×™×•× ×”×¨×שית" + }, + "connectingToRopsten": { + "message": "מתחבר ×ל רשת בדיקה Ropsten " + }, + "connectingToRinkeby": { + "message": "מתחבר ל- Rinkeby Test Network " + }, + "connectingToLocalhost": { + "message": "מתחבר ×ל Localhost 8545" + }, + "connectingToGoerli": { + "message": "מתחבר ל-Goerli Test Network" + }, + "continueToWyre": { + "message": "המשך ל-Wyre" + }, + "continueToCoinSwitch": { + "message": "המשך ×ל CoinSwitch" + }, + "contractDeployment": { + "message": "שליחת חוזה (Contract Deployment)" + }, + "copiedExclamation": { + "message": "הועתק!" + }, + "copyAddress": { + "message": "העתק כתובת ללוח" + }, + "copyTransactionId": { + "message": "העתק מזהה עסקה" + }, + "copiedTransactionId": { + "message": "מזהה עסקה הועתק" + }, + "copyToClipboard": { + "message": "העתק ללוח" + }, + "copyPrivateKey": { + "message": "×–×” המפתח הפרטי שלך (× × ×œ×”×§×™×© כדי להעתיק)" + }, + "create": { + "message": "צור" + }, + "createAccount": { + "message": "פתיחת חשבון" + }, + "createAWallet": { + "message": "צור ×רנק" + }, + "createPassword": { + "message": "יצירת ססמה" + }, + "currencyConversion": { + "message": "המרת מטבע" + }, + "currentLanguage": { + "message": "שפה נוכחית" + }, + "customGas": { + "message": "הת×מה ×ישית של דלק" + }, + "customGasSubTitle": { + "message": "הגדלת ×”×ª×©×œ×•× ×¢×©×•×™×” ×œ×¦×ž×¦× ×ת זמני העיבוד, ×בל ×ין ערובה לכך." + }, + "customToken": { + "message": "×סימון מות×× ×ישית" + }, + "customRPC": { + "message": "RPC מות×× ×ישית" + }, + "decimalsMustZerotoTen": { + "message": "×ž×¡×¤×¨×™× ×¢×©×¨×•× ×™×™× ×—×™×™×‘×™× ×œ×”×™×•×ª לפחות 0 ×•×œ× ×ž×¢×œ 36." + }, + "decimal": { + "message": "רמת דיוק עשרוני" + }, + "defaultNetwork": { + "message": "רשת ברירת המחדל לעסק×ות Ether ×”×™× Main Net." + }, + "delete": { + "message": "מחיקה" + }, + "deleteAccount": { + "message": "מחק חשבון" + }, + "deposit": { + "message": "הפקדה" + }, + "depositEther": { + "message": "הפקדת ×ת'ר" + }, + "details": { + "message": "פרטי×" + }, + "directDepositEther": { + "message": "הפקד ×ת'ר ישירות" + }, + "directDepositEtherExplainer": { + "message": "×× ×›×‘×¨ יש ברשותך ×ת'ר (Ether) , הדרך המהירה ביותר להכניס ×ת'ר ל×רנק החדש שלך ×”×™× ×‘×מצעות הפקדה ישירה." + }, + "done": { + "message": "סיו×" + }, + "downloadGoogleChrome": { + "message": "הורד/×™ ×ת גוגל כרו×" + }, + "downloadSecretBackup": { + "message": "הורד/×™ ×ת צירוף הגיבוי הסודי ×”×–×” ו×חסנ/×™ ×ותו בצורה מ×ובטחת בכונן קשיח ×ו ×ž×“×™×•× ×חסון חיצוני מוצפן." + }, + "downloadStateLogs": { + "message": "הורדת יומני מצב" + }, + "dontHaveAHardwareWallet": { + "message": "×ין לך ×רנק חומרה?" + }, + "dropped": { + "message": "נשמט" + }, + "edit": { + "message": "ערוך" + }, + "editContact": { + "message": "ערוך ×יש קשר" + }, + "endOfFlowMessage1": { + "message": "עברת ×ת הבחינה - יש לשמור ×ת ×”-seedphrase שלך ×‘×ž×§×•× ×‘×˜×•×—, ×–×” ב×חריותך!" + }, + "endOfFlowMessage2": { + "message": "×˜×™×¤×™× ×œ×חסון בטיחותי" + }, + "endOfFlowMessage3": { + "message": "שמור גיבוי במספר מקומות." + }, + "endOfFlowMessage4": { + "message": "×œ×¢×•×œ× ×ל תשתפ/×™ ×ת הצירוף ×¢× ××£ ×חד." + }, + "endOfFlowMessage5": { + "message": "היזהר/×™ מהתחזות! MetaMask ×œ×¢×•×œ× ×œ× ×™×‘×§×© ב×ופן ספונטני ×ת צירוף הגרעין שלך." + }, + "endOfFlowMessage6": { + "message": "×× ×¢×œ×™×š לגבות ×ת צירוף הגרעין שלך שוב, תוכל/×™ ×œ×ž×¦×•× ×–×ת בהגדרות -> ×בטחה." + }, + "endOfFlowMessage7": { + "message": "×× ×™×© לך ש×לות ×ו שנתקלת במשהו חשוד, שלח/×™ מייל ל- support@metamask.io." + }, + "endOfFlowMessage8": { + "message": "MetaMask ×œ× ×”×¦×œ×™×— לשחזר ×ת ×”-seedphrase שלך. למד/×™ עוד." + }, + "endOfFlowMessage9": { + "message": "למד עוד." + }, + "endOfFlowMessage10": { + "message": "הכל בוצע" + }, + "ensRegistrationError": { + "message": "שגי××” ×‘×¨×™×©×•× ×©× ENS" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "×©× ENS ×œ× × ×ž×¦× ×‘×¨×©×ª הנוכחית. נסה/×™ לעבור לרשת ××ª×¨×™×•× ×”×¨×שית." + }, + "enterAnAlias": { + "message": "יש להזין כינוי" + }, + "enterPassword": { + "message": "יש להזין ססמה" + }, + "enterPasswordContinue": { + "message": "יש להזין ססמה כדי להמשיך" + }, + "ethereumPublicAddress": { + "message": "כתובת ××ª×¨×™×•× ×¦×™×‘×•×¨×™×ª" + }, + "etherscanView": { + "message": "הצג חשבון ב- Etherscan" + }, + "estimatedProcessingTimes": { + "message": "זמני עיבוד משוערי×" + }, + "expandView": { + "message": "הרחב תצוגה" + }, + "exportPrivateKey": { + "message": "יצ×/×™ מפתח פרטי" + }, + "failed": { + "message": "נכשל" + }, + "fast": { + "message": "מהיר" + }, + "faster": { + "message": "מהר יותר" + }, + "fiat": { + "message": "פי×ט", + "description": "Exchange type" + }, + "fileImportFail": { + "message": "×™×™×‘×•× ×”×§×•×‘×¥ ×œ× ×¢×•×‘×“? לחצ/×™ ×›×ן!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "מחיקת המכשיר ×”×–×”" + }, + "from": { + "message": "מ×ת" + }, + "functionType": { + "message": "סוג פונקציה" + }, + "gasLimit": { + "message": "הגבלת דלק" + }, + "gasLimitInfoModalContent": { + "message": "הגבלת דלק ×”×™× ×”×ž×¡×¤×¨ המרבי של יחידות דלק שהנך מוכנ/×” להוצי×." + }, + "gasLimitTooLow": { + "message": "הגבלת הדלק חייבת להיות לפחות 21000" + }, + "gasUsed": { + "message": "דלק שנעשה בו שימוש" + }, + "gasPrice": { + "message": "מחיר ×’×– (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "מחיר הדלק נמוך במיוחד" + }, + "gasPriceInfoModalContent": { + "message": "מחיר הדלק מציין ×ת כמות ×”×ת'ר שהנך מוכנ/×” ×œ×©×œ× ×¢×‘×•×¨ כל יחידת דלק." + }, + "gasPriceNoDenom": { + "message": "מחיר הדלק" + }, + "general": { + "message": "כללי" + }, + "generalSettingsDescription": { + "message": "המרת מטבע, מטבע עיקרי, שפה, blockies identicon" + }, + "getEther": { + "message": "השג/×™ ×ת'ר" + }, + "getEtherFromFaucet": { + "message": "השג/×™ ×ת'ר מברז (faucet) עבור ×”-$1", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "בקש/×™ עזרה." + }, + "getStarted": { + "message": "תחילת העבודה" + }, + "happyToSeeYou": { + "message": "×נו ×©×ž×—×™× ×œ×¨×ותך." + }, + "hardware": { + "message": "חומרה" + }, + "hardwareWalletConnected": { + "message": "×רנק חומרה מחובר" + }, + "hardwareWallets": { + "message": "חבר ×רנק חומרה" + }, + "hardwareWalletsMsg": { + "message": "בחר/×™ ×רנק חומרה שבו תרצה להשתמש ×¢× MetaMask" + }, + "havingTroubleConnecting": { + "message": "חווה ×§×©×™×™× ×‘×”×ª×—×‘×¨×•×ª?" + }, + "here": { + "message": "×›×ן", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hexData": { + "message": "מידע הקסדצימלי (Hex)" + }, + "hide": { + "message": "הסתר" + }, + "hideTokenPrompt": { + "message": "להסתיר טוקן?" + }, + "history": { + "message": "היסטוריה" + }, + "import": { + "message": "ייבו×", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "×™×‘× ×—×©×‘×•×Ÿ" + }, + "importAccountMsg": { + "message": "חשבונות מיוב××™× ×œ× ×™×©×•×™×›×• לצירוף הגרעין (seed) שנוצר במקור עבור חשבון ×”-MetaMask שלך. למד/×™ עוד על חשבונות מיוב××™×" + }, + "importAccountSeedPhrase": { + "message": "×™×‘× ×—×©×‘×•×Ÿ ב×מצעות Seed Phrase" + }, + "importWallet": { + "message": "×™×™×‘× ×רנק" + }, + "importYourExisting": { + "message": "יב×/×™ ×ת ×”×רנק ×”×§×™×™× ×©×œ×š ב×מצעות seed phrase בן 12 מילי×" + }, + "imported": { + "message": "מיוב×ות", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "×™×™×‘× ×‘×מצעות צירוף הגרעין של החשבון" + }, + "infoHelp": { + "message": "מידע ועזרה" + }, + "initialTransactionConfirmed": { + "message": "העסקה הר×שונית שלך ×ושרה על ידי הרשת. לחצ/×™ על ×ישור כדי לחזור." + }, + "insufficientBalance": { + "message": "יתרה ×œ× ×ž×¡×¤×™×§×”." + }, + "insufficientFunds": { + "message": "×ין מספיק כספי×." + }, + "insufficientTokens": { + "message": "×ין מספיק טוקני×." + }, + "invalidAddress": { + "message": "כתובת ×œ× ×—×•×§×™×ª" + }, + "invalidAddressRecipient": { + "message": "כתובת הנמען ××™× ×” חוקית" + }, + "knownAddressRecipient": { + "message": "כתובת חוזה ידועה." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "×œ× ×¨×©×ª ETH, מוגדר במצב ×ותיות קטנות" + }, + "invalidInput": { + "message": "קלט ×œ× ×ª×§×™×Ÿ." + }, + "invalidRPC": { + "message": "כתובת URL ×œ× ×—×•×§×™×ª של RPC" + }, + "invalidBlockExplorerURL": { + "message": "כתובת URL ×œ× ×—×•×§×™×ª של Block Explorer" + }, + "invalidSeedPhrase": { + "message": "seed phrase ×œ× ×—×•×§×™" + }, + "jsonFile": { + "message": "קובץ JSON", + "description": "format for importing an account" + }, + "kovan": { + "message": "רשת בדיקה Kovan " + }, + "max": { + "message": "מקסימו×" + }, + "learnMore": { + "message": "למדו עוד" + }, + "ledgerAccountRestriction": { + "message": "עליך להשתמש בחשבון ×”×חרון שלך לפני שתוכל/×™ להוסיף חשבון חדש." + }, + "letsGoSetUp": { + "message": "כן, ×‘×•× × ×ª×§×™×Ÿ!" + }, + "likeToAddTokens": { + "message": "×”×× ×‘×¨×¦×•× ×š להוסיף ×˜×•×§× ×™× ×לה?" + }, + "links": { + "message": "קישורי×" + }, + "liveGasPricePredictions": { + "message": "תחזיות מחירי ×’×– בשידור ×—×™" + }, + "loading": { + "message": "טוען..." + }, + "loadingTokens": { + "message": "טוען טוקני×..." + }, + "loadMore": { + "message": "טען עוד" + }, + "lock": { + "message": "התנתקות" + }, + "mainnet": { + "message": "רשת ××ª×¨×™×•× ×¨×שית" + }, + "memorizePhrase": { + "message": "יש לשנן צירוף ×–×”." + }, + "memo": { + "message": "תזכיר" + }, + "message": { + "message": "הודעה" + }, + "metamaskDescription": { + "message": "מחבר ×ותך ל××ª×¨×™×•× ×•×œ×¨×©×ª המבוזרת." + }, + "metamaskVersion": { + "message": "גרסת MetaMask" + }, + "mobileSyncText": { + "message": "× × ×œ×”×–×™×Ÿ ×ת הססמה שלך כדי ל×שר שזה/זו ×כן ×ת/×”!" + }, + "myAccounts": { + "message": "החשבונות שלי" + }, + "myWalletAccounts": { + "message": "חשבונות ×”×רנק שלי" + }, + "myWalletAccountsDescription": { + "message": "כל חשבונותיך שנוצרו ב-MetaMask יתווספו ×וטומטית לחלק ×–×”." + }, + "mustSelectOne": { + "message": "חובה לבחור לפחות ×סימון ×חד." + }, + "needEtherInWallet": { + "message": "כדי לתקשר ×¢× ×פליקציות מבוזרות ב×מצעות MetaMask, צריך להיות לך ×ת'ר ב×רנק." + }, + "needImportFile": { + "message": "יש לבחור קובץ לייצו×.", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "×œ× × ×™×ª×Ÿ לשלוח ×¡×›×•×ž×™× ×©×œ×™×œ×™×™× ×©×œ ETH." + }, + "networkName": { + "message": "×©× ×¨×©×ª" + }, + "networks": { + "message": "רשתות" + }, + "networkSettingsDescription": { + "message": "הוסף וערוך רשתות RPC מות×מות ×ישית" + }, + "nevermind": { + "message": "×œ× ×ž×©× ×”" + }, + "newAccount": { + "message": "חשבון חדש" + }, + "newAccountDetectedDialogMessage": { + "message": "זוהתה כתובת חדש! × × ×œ×”×§×™×© ×›×ן כדי להוסיף לפנקס הכתובות שלך." + }, + "newAccountNumberName": { + "message": "חשבון $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "×יש קשר חדש" + }, + "newContract": { + "message": "חוזה חדש" + }, + "newPassword": { + "message": "ססמה חדשה (לפחות 8 תווי×)" + }, + "newNetwork": { + "message": "רשת חדשה" + }, + "newToMetaMask": { + "message": "חדש/×” ב- MetaMask?" + }, + "noAlreadyHaveSeed": { + "message": "ל×, כבר יש לי צירוף גרעין" + }, + "protectYourKeys": { + "message": "×”×’× /×™ על המפתחות שלך!" + }, + "protectYourKeysMessage1": { + "message": "יש לנקוט זהירות בנוגע לצירוף הגרעין שלך - היו ×“×™×•×•×—×™× ×¢×œ ××ª×¨×™× ×©×ž× ×¡×™× ×œ×”×ª×—×–×•×ª ל-MetaMask .MetaMask ×œ×¢×•×œ× ×œ× ×ª×‘×§×© ×ת צירוף הגרעין שלך!" + }, + "protectYourKeysMessage2": { + "message": "יש לשמור ×ת ×”-seedphrase שלך ×‘×ž×§×•× ×‘×˜×•×—. ×× ×ת/×” רו××” משהו חשוד, ×ו ש×ינך בטוח/×” בנוע ל×תר, שלח/×™ ×ימייל לכתובת support@metamask.io" + }, + "rpcUrl": { + "message": "כתובת URL חדשה של RPC" + }, + "optionalChainId": { + "message": "ChainID (×ופציונלי)" + }, + "optionalSymbol": { + "message": "סמל (×ופציונלי)" + }, + "newTotal": { + "message": "×¡×›×•× ×›×•×œ×œ חדש" + }, + "newTransactionFee": { + "message": "עמלת עסקה חדשה" + }, + "next": { + "message": "הב×" + }, + "noAddressForName": { + "message": "×œ× ×”×•×’×“×¨×” כתובת עבור ×©× ×–×”." + }, + "noConversionRateAvailable": { + "message": "×ין שער המרה זמין" + }, + "noTransactions": { + "message": "×ין לך עסק×ות" + }, + "notEnoughGas": { + "message": "×ין מספיק דלק" + }, + "noWebcamFoundTitle": { + "message": "מצלמת הרשת ×œ× × ×ž×¦××”" + }, + "noWebcamFound": { + "message": "מצלמת הרשת של מחשבך ×œ× × ×ž×¦××”. × × ×œ× ×¡×•×ª שוב." + }, + "ofTextNofM": { + "message": "של" + }, + "orderOneHere": { + "message": "הזמנ/×™ Trezor ×ו Ledger ושמר/×™ ×ת ×”×›×¡×¤×™× ×©×œ×š ב×חסון קר" + }, + "origin": { + "message": "מקור" + }, + "parameters": { + "message": "פרמטרי×" + }, + "participateInMetaMetrics": { + "message": "×§×—/×™ חלק ב- MetaMetrics" + }, + "participateInMetaMetricsDescription": { + "message": "×§×—/×™ חלק ב-MetaMetrics כדי לעזור לנו לשפר ×ת MetaMask" + }, + "password": { + "message": "סיסמה" + }, + "passwordsDontMatch": { + "message": "ססמ×ות ×ינן תו×מות" + }, + "passwordNotLongEnough": { + "message": "הססמה ××™× ×” ×רוכה מספיק" + }, + "pastePrivateKey": { + "message": "הדבק/×™ ×ת מחרוזת המפתח הפרטי שלך ×›×ן:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "בהמתנה" + }, + "personalAddressDetected": { + "message": "זוהתה כתובת ×ישית. יש להזין ×ת כתובת חוזה הטוקן." + }, + "prev": { + "message": "הקוד×" + }, + "primaryCurrencySetting": { + "message": "מטבע ר×שי" + }, + "primaryCurrencySettingDescription": { + "message": "בחר/×™ 'מקומי' כדי לתעדף הצגת ×¢×¨×›×™× ×‘×ž×˜×‘×¢ המקומי של הצ'יין (למשל ETH). בחר/×™ פי×ט כדי לתעדף הצגת ×¢×¨×›×™× ×‘×ž×˜×‘×¢ הפי×ט שבחרת." + }, + "privacyMsg": { + "message": "מדיניות הפרטיות" + }, + "privateKey": { + "message": "מפתח פרטי", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "×זהרה: ×œ×¢×•×œ× ×ין למסור מפתח ×–×”. מי שיקבל ×ת המפתחות ×”×¤×¨×˜×™×™× ×©×œ×š יוכל לגנוב ×ת כל ×”× ×›×¡×™× ×”×©×ž×•×¨×™× ×‘×—×©×‘×•×Ÿ שלך." + }, + "privateNetwork": { + "message": "רשת פרטית" + }, + "queue": { + "message": "תור" + }, + "readdToken": { + "message": "ב×פשרותך להוסיף טוקן ×–×” בחזרה בעתיד על ידי מעבר ×ל \"הוסף טוקן\" בתפריט ×פשרויות החשבונות שלך." + }, + "recents": { + "message": "×חרוני×" + }, + "recipientAddress": { + "message": "כתובת הנמען" + }, + "recipientAddressPlaceholder": { + "message": "חיפוש, כתובת ציבורית (0x), ×ו ENS" + }, + "rejectAll": { + "message": "דחה הכל" + }, + "rejectTxsN": { + "message": "דחה $1 עסק×ות " + }, + "rejectTxsDescription": { + "message": "הנך עומד/ת לדחות קבוצת עסק×ות $1." + }, + "rejected": { + "message": "נדחה" + }, + "reset": { + "message": "×פס" + }, + "resetAccount": { + "message": "×פס חשבון" + }, + "resetAccountDescription": { + "message": "×יפוס חשבונך ×™× ×§×” ×ת היסטוריית העסק×ות שלך." + }, + "deleteNetwork": { + "message": "למחוק ×ת הרשת?" + }, + "deleteNetworkDescription": { + "message": "הנך בטוח/×” שברצונך למחוק רשת זו?" + }, + "remindMeLater": { + "message": "הזכר לי מ×וחר יותר" + }, + "restoreFromSeed": { + "message": "לשחזר ×ת החשבון?" + }, + "restoreAccountWithSeed": { + "message": "שחזר ×ת חשבונך ב×מצעות צירוף הגרעין" + }, + "requestsAwaitingAcknowledgement": { + "message": "בקשות הממתינות ל×ישור" + }, + "required": { + "message": "נדרש" + }, + "restore": { + "message": "שחזר" + }, + "revealSeedWords": { + "message": "גלה מילות Seed" + }, + "revealSeedWordsTitle": { + "message": "צירוף גרעין (Seed Phrase)" + }, + "revealSeedWordsDescription": { + "message": "×× ×‘×¢×ª×™×“ תחליף/×™ ×“×¤×“×¤× ×™× ×ו תעביר/×™ מחשבי×, תצטרך/×™ seed phrase ×–×” כדי לקבל גישה לחשבונות שלך. יש לשמור ××•×ª× ×‘×ž×§×•× ×‘×˜×•×— וסודי." + }, + "revealSeedWordsWarningTitle": { + "message": "×ין לשתף צירוף ×ž×™×œ×™× ×–×” ×¢× ××£ ×חד!" + }, + "revealSeedWordsWarning": { + "message": "×‘×ž×™×œ×™× ×לה עלול להיעשות שימוש כדי לגנוב ×ת כל חשבונותיך." + }, + "remove": { + "message": "הסר" + }, + "removeAccount": { + "message": "הסר חשבון" + }, + "removeAccountDescription": { + "message": "חשבון ×–×” יוסר מ×רנקך. יש ×œ×•×•×“× ×©×™×© לך ×ת ×”-seed phrase המקורי ×ו המפתח ×”×ישי לחשבון ×ž×™×•×‘× ×–×” לפני שתמשיך/×™. ב×פשרותך ×œ×™×‘×•× ×ו לפתוח חשבונות שוב מהתפריט הנפתח של החשבון." + }, + "readyToConnect": { + "message": "מוכנ/×” להתחבר?" + }, + "rinkeby": { + "message": "רשת בדיקה Rinkeby " + }, + "goerli": { + "message": "רשת בדיקה Goerli " + }, + "save": { + "message": "שמור" + }, + "slow": { + "message": "×טי" + }, + "slower": { + "message": "ל×ט יותר" + }, + "saveAsCsvFile": { + "message": "שמירה כקובץ CSV" + }, + "scanInstructions": { + "message": "הצב/×™ ×ת קוד ×”-QR שלך מול המצלמה" + }, + "scanQrCode": { + "message": "סריקת קוד QR" + }, + "search": { + "message": "חפש" + }, + "searchResults": { + "message": "תוצ×ות חיפוש" + }, + "secretBackupPhrase": { + "message": "צירוף ×ž×™×œ×™× ×¡×•×“×™ לגיבוי" + }, + "secretBackupPhraseDescription": { + "message": "×¢× ×¦×™×¨×•×£ ×ž×™×œ×™× ×¡×•×“×™ לגיבוי קל יותר לגבות ולשחזר ×ת החשבון שלך." + }, + "secretBackupPhraseWarning": { + "message": "×זהרה: ×œ×¢×•×œ× ×ין לחשוף ×ת צירוף הגיבוי שלך. כל מי שברשותו צירוף ×–×” יכול לקחת ×ת ×”×ת'ר שלך לצמיתות." + }, + "secretPhrase": { + "message": "×”×–× /×™ ×ת הצירוף הסודי שלך של שתי×-עשרה ×”×ž×™×œ×™× ×›×ן כדי לשחזר ×ת הכספת שלך." + }, + "securityAndPrivacy": { + "message": "×בטחה ופרטיות" + }, + "securitySettingsDescription": { + "message": "הגדרות פרטיות וצירוף הגרעין של ×”×רנק" + }, + "seedPhrasePlaceholder": { + "message": "הפרד/×™ בין ×”×ž×™×œ×™× ×‘×¨×•×•×— ×חד" + }, + "seedPhraseReq": { + "message": "צירופי גרעין ×ž×•×¨×›×‘×™× ×ž-12 מילי×" + }, + "selectCurrency": { + "message": "בחר מטבע" + }, + "selectEachPhrase": { + "message": "× × ×œ×‘×—×•×¨ כל צירוף ×ž×™×œ×™× ×›×“×™ להבטיח ×©×”×•× × ×›×•×Ÿ." + }, + "selectLocale": { + "message": "בחר/×™ מיקו×" + }, + "selectType": { + "message": "בחר/×™ סוג" + }, + "send": { + "message": "שלח" + }, + "sendAmount": { + "message": "שלח סכו×" + }, + "sendETH": { + "message": "שלח/×™ ETH" + }, + "sendTokens": { + "message": "שלח טוקני×" + }, + "sentEther": { + "message": "×ת'ר שנשלח" + }, + "sentTokens": { + "message": "×˜×•×§× ×™× ×©× ×©×œ×—×•" + }, + "separateEachWord": { + "message": "יש להפריד כל מילה ×¢× ×¨×•×•×— יחיד" + }, + "searchTokens": { + "message": "חיפוש טוקני×" + }, + "selectAnAccount": { + "message": "בחר חשבון" + }, + "selectAnAccountHelp": { + "message": "בחר ×ת החשבון לצפייה ב- MetaMask" + }, + "selectAHigherGasFee": { + "message": "בחר/×™ בעמלת דלק גבוהה יותר כדי לה××™×¥ ×ת עיבוד העסקה שלך. *" + }, + "selectHdPath": { + "message": "בחר/×™ נתיב HD" + }, + "selectPathHelp": { + "message": "×× ×ינך רו××” ×ת חשבונות ×”-Ledger ×”×§×™×™×ž×™× ×©×œ×š בהמשך, נסה/×™ להחליף נתיב ל-Legacy (MEW / MyCrypto)" + }, + "settings": { + "message": "הגדרות" + }, + "showAdvancedGasInline": { + "message": "×מצעי שליטה ×ž×ª×§×“×ž×™× ×‘×“×œ×§" + }, + "showAdvancedGasInlineDescription": { + "message": "בחר/×™ ב×פשרות זו כדי להציג ×מצעי שליטה במחיר הדלק וההגבלה (limit) ישירות במסכי השליחה וה×ישור." + }, + "showFiatConversionInTestnets": { + "message": "הצג המרה -Testnets" + }, + "showFiatConversionInTestnetsDescription": { + "message": "בחר/×™ ב×פשרות זו כדי להציג המרת פי×ט ב- Testnets" + }, + "showPrivateKeys": { + "message": "הצג מפתחות פרטיי×" + }, + "showHexData": { + "message": "הצג מידע הקסדצימלי (Hex)" + }, + "showHexDataDescription": { + "message": "בחר/×™ בזה כדי להציג ×ת שדה ×”× ×ª×•× ×™× ×”×”×§×¡×“×¦×™×ž××œ×™× ×¢×œ מסך השליחה" + }, + "sign": { + "message": "חתימה" + }, + "signatureRequest": { + "message": "בקשת חתימה" + }, + "signed": { + "message": "חתו×" + }, + "signNotice": { + "message": "לחתימה על הודעה זו יכולות להיות תוצ×ות לוו××™ מסוכנות. מומלץ ×œ×—×ª×•× ×¨×§ הודעות מ××ª×¨×™× ×©×™×© לך ×מון ×ž×œ× ×‘×”× ×•×”×¤×§×“×ª ×ת כל החשבון שלך בידיה×. השיטה המסוכנת תוסר בגרסה עתידית." + }, + "sigRequest": { + "message": "בקשת חתימה" + }, + "somethingWentWrong": { + "message": "×ופס! משהו השתבש." + }, + "speedUp": { + "message": "×”×צה" + }, + "speedUpCancellation": { + "message": "×”×צת ביטול ×–×”" + }, + "speedUpTransaction": { + "message": "×”××¥ עסקה זו" + }, + "switchNetworks": { + "message": "החלף רשתות" + }, + "stateLogs": { + "message": "יומני מצב" + }, + "stateLogsDescription": { + "message": "יומני המצב ×ž×›×™×œ×™× ×ת כתובות החשבון הציבוריות שלך ועסק×ות שנשלחו." + }, + "stateLogError": { + "message": "שגי××” ב×חזור יומני המצב." + }, + "step1HardwareWallet": { + "message": "1. חבר/×™ ×רנק חומרה" + }, + "step1HardwareWalletMsg": { + "message": "חבר/×™ ×ת ×רנק החומרה שלך ישירות למחשב שלך." + }, + "step2HardwareWallet": { + "message": "2. בחר/×™ חשבון" + }, + "step2HardwareWalletMsg": { + "message": "בחר/×™ ×ת החשבון שברצונך להציג. ב×פשרותך לבחור רק ×חד בכל פע×." + }, + "step3HardwareWallet": { + "message": "3. התחל/×™ להשתמש ב- dApps ועוד!" + }, + "step3HardwareWalletMsg": { + "message": "השתמש/×™ בחשבון החומרה שלך ×›×™ שהיית משתמש/ת בכל חשבון ×תריו×" + }, + "storePhrase": { + "message": "×חסנ/×™ צירוף ×–×” במנהל ססמ×ות כמו 1Password." + }, + "submitted": { + "message": "הוגש" + }, + "supportCenter": { + "message": "בקר/×™ במרכז התמיכה שלנו" + }, + "symbol": { + "message": "סמל" + }, + "symbolBetweenZeroTwelve": { + "message": "הסמל חייב להיות 11 ×ª×•×•×™× ×ו פחות." + }, + "syncWithMobile": { + "message": "סנכרן ×¢× ×”× ×™×™×“" + }, + "syncWithMobileTitle": { + "message": "סנכרן ×¢× ×”× ×™×™×“" + }, + "syncWithMobileDesc": { + "message": "ב×פשרותך לסנכרן ×ת החשבונות והמידע שלך ×¢× ×”×ž×›×©×™×¨ הנייד שלך. יש לפתוח ×ת ×”×פליקציה לנייד של MetaMask, לעבור ×ל \"הגדרות\" וללחוץ על \"סנכרון מהרחבה לדפדפן\"" + }, + "syncWithMobileDescNewUsers": { + "message": "×× ×ת/×” פותח/ת ×ת ×פליקציית MetaMask Mobile ×‘×¤×¢× ×”×¨×שונה, פשוט בצע/×™ ×ת ×”×©×œ×‘×™× ×‘×˜×œ×¤×•×Ÿ שלך." + }, + "syncWithMobileScanThisCode": { + "message": "יש לסרוק קוד QR ×–×” ב×מצעות ×פליקציית MetaMask לטלפון נייד" + }, + "syncWithMobileBeCareful": { + "message": "וד×/×™ ×›×™ ×יש ×ינו מסתכל על המסך שלך בזמן סריקת קוד ×–×”" + }, + "syncWithMobileComplete": { + "message": "×”× ×ª×•× ×™× ×©×œ×š סונכרנו בהצלחה. תיהנה/×™ מ×פליקציית MetaMask ×œ×˜×œ×¤×•× ×™× × ×™×™×“×™×! " + }, + "terms": { + "message": "תנ××™ שימוש" + }, + "testFaucet": { + "message": "בדיקת ברז (Faucet)" + }, + "thisWillCreate": { + "message": "×–×” ייצור ×רנק חדש וצירוף גרעין (seed phrase)" + }, + "tips": { + "message": "טיפי×" + }, + "to": { + "message": "×ל" + }, + "token": { + "message": "טוקן" + }, + "tokenAlreadyAdded": { + "message": "הוסף כבר ×סימון." + }, + "tokenContractAddress": { + "message": "כתובת חוזה טוקן" + }, + "tokenSymbol": { + "message": "סמל טוקן" + }, + "total": { + "message": "סך הכל" + }, + "transaction": { + "message": "עסקה" + }, + "transactionConfirmed": { + "message": "עסקה מ×ושרת ב-$2." + }, + "transactionCreated": { + "message": "עסקה נוצרה ×¢× ×¢×¨×š של $1 ב-$2." + }, + "transactionDropped": { + "message": "העסקה ירדה ב-$2." + }, + "transactionSubmitted": { + "message": "עסקה הוגשה ×¢× ×¢×ž×œ×ª דלק של $1 ב-$2." + }, + "transactionResubmitted": { + "message": "העסקה הוגשה מחדש ×¢× ×¢×ž×œ×ª דלק שעלתה ל-$1 ב-$2" + }, + "transactionUpdated": { + "message": "העסקה עודכנה ב- $2." + }, + "transactionErrored": { + "message": "העסקה נתקלה בשגי××”." + }, + "transactionCancelAttempted": { + "message": "ניסיון לביטול העסקה נעשה ×¢× ×¢×ž×œ×ª דלק של $1 ב-$2" + }, + "transactionCancelSuccess": { + "message": "העסקה בוטלה בהצלחה ב-$2" + }, + "transactionError": { + "message": "תקלה בעסקה. שגי××” ×ירעה בקוד החוזה." + }, + "transactionErrorNoContract": { + "message": "מנסה ×œ×§×¨×•× ×œ×¤×•× ×§×¦×™×” בכתובת ×œ×œ× ×—×•×–×”." + }, + "transactionFee": { + "message": "עמלת עסקה" + }, + "transactionTime": { + "message": "זמן העסקה" + }, + "transfer": { + "message": "העברה" + }, + "transferBetweenAccounts": { + "message": "בצע העברה בין חשבונותיי" + }, + "transferFrom": { + "message": "העברה מ-" + }, + "troubleTokenBalances": { + "message": "×œ× ×”×¦×œ×—× ×• לטעון ×ת יתרות ×”×˜×•×§× ×™× ×©×œ×š. ב×פשרותך להציג ×ותן", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "ניסיון חוזר" + }, + "typePassword": { + "message": "× × ×œ×”×§×œ×™×“ ×ת סיסמת MetaMask שלך" + }, + "unapproved": { + "message": "×œ× ×ושר" + }, + "units": { + "message": "יחידות" + }, + "unknown": { + "message": "×œ× ×™×“×•×¢" + }, + "unknownNetwork": { + "message": "רשת פרטית ×œ× ×™×“×•×¢×”" + }, + "unknownQrCode": { + "message": "שגי××”: ×œ× ×”×¦×œ×—× ×• לזהות ×ת קוד ×”- QR ×”×–×”" + }, + "unknownCameraErrorTitle": { + "message": "×ופס! משהו השתבש...." + }, + "unknownCameraError": { + "message": "×ירעה שגי××” במהלך הניסיון לקבל גישה למצלמה שלך. × × ×œ× ×¡×•×ª שוב..." + }, + "unlock": { + "message": "בטל נעילה" + }, + "unlockMessage": { + "message": "הרשת המבוזרת מחכה" + }, + "updatedWithDate": { + "message": "עודכן $1" + }, + "urlErrorMsg": { + "message": "כתובות URI דורשות ×ת קידומת HTTP/HTTPS המת×ימה." + }, + "usedByClients": { + "message": "בשימוש על ידי מגוון לקוחות שוני×" + }, + "userName": { + "message": "×©× ×ž×©×ª×ž×©" + }, + "viewAccount": { + "message": "הצג חשבון" + }, + "viewinExplorer": { + "message": "הצג ב×קספלורר" + }, + "viewContact": { + "message": "הצג ×יש קשר" + }, + "viewOnCustomBlockExplorer": { + "message": "הצג ב- $1" + }, + "viewOnEtherscan": { + "message": "הצג ב-Etherscan" + }, + "visitWebSite": { + "message": "בקר/×™ ב×תר שלנו" + }, + "walletSeed": { + "message": "גרעין (Seed) ×רנק" + }, + "welcomeBack": { + "message": "ברוך שובך!" + }, + "welcome": { + "message": "×‘×¨×•×›×™× ×”×‘××™× ×œ- MetaMask" + }, + "writePhrase": { + "message": "יש לכתוב צירוף ×–×” על פיסת נייר ולשמור ×‘×ž×§×•× ×ž×ובטח. ×× ×”× ×š מעוניינ/ת ביותר ×בטחה, רשמ/×™ ×ותו על גבי מספר פיסות נייר ו×חסני כל ×חת מהן ב- 2-3 מקומות שוני×." + }, + "yesLetsTry": { + "message": "כן, ×‘×•× × × ×¡×”" + }, + "youNeedToAllowCameraAccess": { + "message": "עליך ל×פשר גישה למצלמה כדי להשתמש בתכונה זו." + }, + "yourSigRequested": { + "message": "נדרשת חתימתך" + }, + "youSign": { + "message": "הנך חותמ/ת" + }, + "yourPrivateSeedPhrase": { + "message": "×”-seed phrase הפרטי שלך" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "מחיר ×’×– ×פס על ×”×צה" + } +} diff --git a/app/_locales/hi/messages.json b/app/_locales/hi/messages.json new file mode 100644 index 000000000000..aad074d700fd --- /dev/null +++ b/app/_locales/hi/messages.json @@ -0,0 +1,1304 @@ +{ + "chartOnlyAvailableEth": { + "message": "केवल ईथरअम नेटवरà¥à¤• पर उपलबà¥à¤§ चारà¥à¤Ÿà¥¤" + }, + "contractInteraction": { + "message": "कॉनà¥à¤Ÿà¥à¤°à¥ˆà¤•à¥à¤Ÿ की बातचीत" + }, + "reject": { + "message": "असà¥â€à¤µà¥€à¤•ार करें" + }, + "about": { + "message": "इसके बारे में" + }, + "aboutSettingsDescription": { + "message": "संसà¥à¤•रण, सहायता केंदà¥à¤° और संपरà¥à¤• जानकारी।" + }, + "acceleratingATransaction": { + "message": "* à¤à¤• उचà¥à¤š गैस की कीमत का उपयोग करके अंतरण में तेजी लाने से नेटवरà¥à¤• दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¥‹à¤¸à¥‡à¤¸ होने की संभावना तेजी से बढ़ जाती है, लेकिन इसकी हमेशा गारंटी नहीं होती है।" + }, + "accessingYourCamera": { + "message": "आपके कैमरे तक पहà¥à¤à¤š रहा है ..." + }, + "account": { + "message": "खाता" + }, + "accountDetails": { + "message": "खाते की जानकारी" + }, + "accountName": { + "message": "खाते का नाम" + }, + "accountOptions": { + "message": "खाते के विकलà¥à¤ª" + }, + "accountSelectionRequired": { + "message": "आपको à¤à¤• खाता चà¥à¤¨à¤¨à¤¾ होगा!" + }, + "activityLog": { + "message": "गतिविधि लॉग" + }, + "addNetwork": { + "message": "नेटवरà¥à¤• जोड़ें" + }, + "addRecipient": { + "message": "पà¥à¤°à¤¾à¤ªà¥à¤¤à¤•रà¥à¤¤à¤¾ को जोड़ें" + }, + "advanced": { + "message": "उनà¥à¤¨à¤¤" + }, + "advancedSettingsDescription": { + "message": "डेवलपर की सà¥à¤µà¤¿à¤§à¤¾à¤“ं को à¤à¤•à¥à¤¸à¥‡à¤¸ करें, सà¥à¤Ÿà¥‡à¤Ÿ लॉग डाउनलोड करें,अकाउंट रीसेट करें,टेसà¥à¤Ÿà¤¨à¥‡à¤Ÿ सेटअप करें और कसà¥à¤Ÿà¤® RPC।" + }, + "advancedOptions": { + "message": "उनà¥à¤¨à¤¤ विकलà¥à¤ª" + }, + "addToAddressBook": { + "message": "à¤à¤¡à¥à¤°à¥‡à¤¸ बà¥à¤• में जोड़ें" + }, + "addToAddressBookModalPlaceholder": { + "message": "जैसे जॉन डी।" + }, + "addAlias": { + "message": "उपनाम जोड़ें" + }, + "addToken": { + "message": "टोकन जोड़ें" + }, + "addTokens": { + "message": "टोकन जोड़ें" + }, + "addSuggestedTokens": { + "message": "सà¥à¤à¤¾à¤ गठटोकन जोड़ें" + }, + "addAcquiredTokens": { + "message": "MetaMask का उपयोग करके आपके दà¥à¤µà¤¾à¤°à¤¾ अरà¥à¤œà¤¿à¤¤ किठगठटोकन जोड़ें" + }, + "amount": { + "message": "राशि " + }, + "appDescription": { + "message": "आपके बà¥à¤°à¤¾à¤‰à¥›à¤° में à¤à¤• Ethereum वॉलेट", + "description": "The description of the application" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "approve": { + "message": "सà¥à¤µà¥€à¤•ृत " + }, + "approved": { + "message": "सà¥à¤µà¥€à¤•ृत" + }, + "asset": { + "message": "परिसंपतà¥à¤¤à¤¿" + }, + "attemptingConnect": { + "message": "blockchain से कनेकà¥à¤Ÿ करने का पà¥à¤°à¤¯à¤¾à¤¸ कर रहे हैं।" + }, + "attemptToCancel": { + "message": "रदà¥à¤¦ करने का पà¥à¤°à¤¯à¤¾à¤¸?" + }, + "attemptToCancelDescription": { + "message": "इस पà¥à¤°à¤¯à¤¾à¤¸ को सबमिट करना, आपके मूल अंतरण को रदà¥à¤¦ किठजाने की गारंटी नहीं होगी।यदि रदà¥à¤¦à¤•रण का पà¥à¤°à¤¯à¤¾à¤¸ सफल होता है, तो आपसे उपरà¥à¤¯à¥à¤•à¥à¤¤ अंतरण शà¥à¤²à¥à¤• लिया जाà¤à¤—ा।" + }, + "attributions": { + "message": "विशेषताà¤à¤‚" + }, + "autoLockTimeLimit": { + "message": "ऑटो-लॉगआउट टाइमर (मिनट)" + }, + "autoLockTimeLimitDescription": { + "message": "मेटामासà¥à¤• से सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूप से लॉग आउट होने से पहले निषà¥à¤•à¥à¤°à¤¿à¤¯ समय को मिनटों में सेट करें" + }, + "average": { + "message": "औसत" + }, + "back": { + "message": "वापस" + }, + "backToAll": { + "message": "सभी पर वापस जाà¤à¤" + }, + "backupApprovalNotice": { + "message": "अपने वॉलेट और धनराशि को सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ रखने के लिठअपने सीकà¥à¤°à¥‡à¤Ÿ रिकवरी कोड का बैकअप लें।" + }, + "backupApprovalInfo": { + "message": "यदि आप अपना उपकरण खो देते हैं, अपना पासवरà¥à¤¡ भूल जाते हैं, तो मेटामासà¥à¤• को फिर से सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ करना होगा, या किसी अनà¥à¤¯ डिवाइस पर अपने वॉलेट को à¤à¤•à¥à¤¸à¥‡à¤¸ करना चाहते हैं, इस आपके वॉलेट को पà¥à¤¨à¤°à¥à¤ªà¥à¤°à¤¾à¤ªà¥à¤¤ करने के लिठगà¥à¤ªà¥à¤¤ कोड को आवशà¥à¤¯à¤•ता है।" + }, + "backupNow": { + "message": "अभी बैकअप करें" + }, + "balance": { + "message": "शेष" + }, + "balanceOutdated": { + "message": "शेष पà¥à¤°à¤¾à¤¨à¤¾ हो सकता है" + }, + "basic": { + "message": "मूलभूत" + }, + "blockExplorerUrl": { + "message": "à¤à¤•à¥à¤¸à¤ªà¥à¤²à¥‹à¤°à¤° को बà¥à¤²à¥‰à¤• करें" + }, + "blockExplorerView": { + "message": "$1 पर खाता देखें", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "बà¥à¤²à¥‰à¤•िज़ आईडिनà¥à¤Ÿà¥€à¤•ॉन का पà¥à¤°à¤¯à¥‹à¤— करें।" + }, + "browserNotSupported": { + "message": "आपका बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° समरà¥à¤¥à¤¿à¤¤ नहीं है..." + }, + "builtInCalifornia": { + "message": "मेटामासà¥à¤• का डिजाइन और निरà¥à¤®à¤¾à¤£ कैलिफोरà¥à¤¨à¤¿à¤¯à¤¾ में किया गया है।" + }, + "buyWithWyre": { + "message": "Wyre से ETH खरीदें" + }, + "buyWithWyreDescription": { + "message": "Wyre आपको कà¥à¤°à¥‡à¤¡à¤¿à¤Ÿ कारà¥à¤¡ का उपयोग करके ETH को सीधे आपके MetaMask खाते में जमा करने देता है।" + }, + "buyCoinSwitch": { + "message": "CoinSwitch पर खरीदें" + }, + "buyCoinSwitchExplainer": { + "message": "300 से अधिक कà¥à¤°à¤¿à¤ªà¥à¤Ÿà¥‹à¤•रेंसी को सबसे अचà¥à¤›à¥€ दर पर à¤à¤•à¥à¤¸à¤šà¥‡à¤‚ज करने के लिठCoinSwitch सरà¥à¤µà¥‹à¤¤à¥à¤¤à¤® सà¥à¤¥à¤² है।" + }, + "bytes": { + "message": "बाइट" + }, + "off": { + "message": "बंद" + }, + "ok": { + "message": "ठीक" + }, + "on": { + "message": "चालू" + }, + "optionalBlockExplorerUrl": { + "message": "à¤à¤•à¥à¤¸à¤ªà¥à¤²à¥‹à¤°à¤° यूआरà¤à¤² बà¥à¤²à¥‰à¤• (वैकलà¥à¤ªà¤¿à¤•)" + }, + "cancel": { + "message": "रदà¥à¤¦ करें" + }, + "cancelAttempt": { + "message": "पà¥à¤°à¤¯à¤¾à¤¸ रदà¥à¤¦ करें" + }, + "cancellationGasFee": { + "message": "रदà¥à¤¦à¥€à¤•रण गैस शà¥à¤²à¥à¤•" + }, + "cancelled": { + "message": "रदà¥à¤¦" + }, + "chainId": { + "message": "चेन आई.डी." + }, + "clickToRevealSeed": { + "message": "सीकà¥à¤°à¥‡à¤Ÿ शबà¥à¤¦à¥‹à¤‚ को जानने के लिठयहाठकà¥à¤²à¤¿à¤• करें" + }, + "close": { + "message": "बंद करें" + }, + "chromeRequiredForHardwareWallets": { + "message": "अपने हारà¥à¤¡à¤µà¥‡à¤¯à¤° वॉलेट से कनेकà¥à¤Ÿ करने के लिठआपको Google Chrome में MetaMask का उपयोग करना ज़रूरी है।" + }, + "confirm": { + "message": "दà¥à¤¬à¤¾à¤°à¤¾ पूछें" + }, + "confirmed": { + "message": "पà¥à¤·à¥à¤Ÿà¤¿ की गई" + }, + "confirmPassword": { + "message": "पासवरà¥à¤¡ की पà¥à¤·à¥à¤Ÿà¤¿ करें" + }, + "confirmSecretBackupPhrase": { + "message": "अपने सीकà¥à¤°à¥‡à¤Ÿ बैकअप फ़à¥à¤°à¥‡à¥› की पà¥à¤·à¥à¤Ÿà¤¿ करें" + }, + "congratulations": { + "message": "बधाई हो" + }, + "connectHardwareWallet": { + "message": "हारà¥à¤¡à¤µà¥‡à¤¯à¤° वॉलेट कनेकà¥à¤Ÿ करें" + }, + "connect": { + "message": "कनेकà¥à¤Ÿ करें" + }, + "connectingTo": { + "message": "$1 से कनेकà¥à¤Ÿ हो रहा है" + }, + "connectingToKovan": { + "message": "कोवन टेसà¥à¤Ÿ नेटवरà¥à¤• से जोड़ रहा है\n" + }, + "connectingToMainnet": { + "message": "मà¥à¤–à¥à¤¯ Ethereum नेटवरà¥à¤• से कनेकà¥à¤Ÿ हो रहा है" + }, + "connectingToRopsten": { + "message": "रोपसà¥à¤Ÿà¥‡à¤¨ टेसà¥à¤Ÿ नेटवरà¥à¤• से कनेकà¥à¤Ÿ करना" + }, + "connectingToRinkeby": { + "message": "Rinkeby टेसà¥à¤Ÿ नेटवरà¥à¤• से कनेकà¥à¤Ÿ हो रहा है" + }, + "connectingToLocalhost": { + "message": "लोकलहोसà¥à¤Ÿ 8545 से जà¥à¤¡à¤¼à¤¨à¤¾ " + }, + "connectingToGoerli": { + "message": "गोरà¥à¤²à¥€ टेसà¥à¤Ÿ नेटवरà¥à¤• से जोड़ रहा है" + }, + "continueToWyre": { + "message": "Wyre को जारी रखें" + }, + "continueToCoinSwitch": { + "message": "कॉइनसà¥à¤µà¤¿à¤š पर जारी रखें " + }, + "contractDeployment": { + "message": "कॉनà¥à¤Ÿà¥à¤°à¥ˆà¤•à¥à¤Ÿ का परिनियोजन" + }, + "copiedExclamation": { + "message": "कॉपी की गई!" + }, + "copyAddress": { + "message": "कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ पर पता कॉपी करें" + }, + "copyTransactionId": { + "message": "अंतरण आईडी को कॉपी करें" + }, + "copiedTransactionId": { + "message": "अंतरण आईडी कॉपी की गई" + }, + "copyToClipboard": { + "message": "कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ में कॉपी करें" + }, + "copyPrivateKey": { + "message": "यह आपकी निजी कà¥à¤‚जी है (कॉपी करने के लिठकà¥à¤²à¤¿à¤• करें)" + }, + "create": { + "message": "बनाà¤à¤‚" + }, + "createAccount": { + "message": "खाता बनाà¤à¤‚" + }, + "createAWallet": { + "message": "à¤à¤• वॉलेट बनाà¤à¤‚" + }, + "createPassword": { + "message": "पासवरà¥à¤¡ बनाà¤à¤" + }, + "currencyConversion": { + "message": "मà¥à¤¦à¥à¤°à¤¾ रूपांतरण" + }, + "currentLanguage": { + "message": "वरà¥à¤¤à¤®à¤¾à¤¨ भाषा" + }, + "customGas": { + "message": "कसà¥à¤Ÿà¤®à¤¾à¤‡à¤œà¤¼ गैस" + }, + "customGasSubTitle": { + "message": "बढ़ती फीस पà¥à¤°à¤¾à¤¸à¥‡à¤¸à¤¿à¤‚ग समय में कमी कर सकती है, परंतॠइसकी गारंटी नहीं है।" + }, + "customToken": { + "message": "कसà¥à¤Ÿà¤® टोकन" + }, + "customRPC": { + "message": "कसà¥à¤Ÿà¤® RPC" + }, + "decimalsMustZerotoTen": { + "message": "दशमलव कम से कम 0 और 36 से अधिक नहीं होना चाहिà¤à¥¤" + }, + "decimal": { + "message": "डेसीमल ऑफ़ पà¥à¤°à¤¿à¤¸à¤¿à¤¶à¤¨" + }, + "defaultNetwork": { + "message": "Ether टà¥à¤°à¤¾à¤‚ज़ैकà¥à¤¶à¤¨ के लिठडिफ़ॉलà¥à¤Ÿ नेटवरà¥à¤• Main Net है।" + }, + "delete": { + "message": "हटाà¤à¤‚" + }, + "deleteAccount": { + "message": "खाता हटाà¤à¤\n" + }, + "deposit": { + "message": "जमा " + }, + "depositEther": { + "message": "Ether जमा करें" + }, + "details": { + "message": "विवरण" + }, + "directDepositEther": { + "message": "Ether को सीधे जमा करें" + }, + "directDepositEtherExplainer": { + "message": "यदि आपके पास पहले से ही कà¥à¤› Ether हैं, तो अपने नठवॉलेट में Ether पाने का सबसे तेज़ तरीका सीधे जमा करना है।" + }, + "done": { + "message": "पूरà¥à¤£" + }, + "downloadGoogleChrome": { + "message": "गूगल कà¥à¤°à¥‹à¤® डाउनलोड करें" + }, + "downloadSecretBackup": { + "message": "इस गà¥à¤ªà¥à¤¤ बैकअप वाकà¥à¤¯à¤¾à¤‚श को डाउनलोड करें और इसे बाहरी à¤à¤¨à¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿà¥‡à¤¡ हारà¥à¤¡ डà¥à¤°à¤¾à¤‡à¤µ या सà¥à¤Ÿà¥‹à¤°à¥‡à¤œ माधà¥à¤¯à¤® पर सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ रूप से संगà¥à¤°à¤¹à¥€à¤¤ रखें।" + }, + "downloadStateLogs": { + "message": "सà¥à¤Ÿà¥‡à¤Ÿ लॉग को डाउनलोड करें" + }, + "dontHaveAHardwareWallet": { + "message": "हारà¥à¤¡à¤µà¥‡à¤¯à¤° वॉलेट नहीं है?" + }, + "dropped": { + "message": "गिर गया" + }, + "edit": { + "message": "संपादित करें" + }, + "editContact": { + "message": "संपरà¥à¤• संपादित करें" + }, + "endOfFlowMessage1": { + "message": "आपने परीकà¥à¤·à¤¾ उतà¥à¤¤à¥€à¤°à¥à¤£ कर ली - अपने बीज वाकà¥à¤¯à¤¾à¤‚श को सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ रखें, यह आपकी जिमà¥à¤®à¥‡à¤¦à¤¾à¤°à¥€ है!" + }, + "endOfFlowMessage2": { + "message": "इसे सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ रूप से संगà¥à¤°à¤¹à¥€à¤¤ करने के सà¥à¤à¤¾à¤µ" + }, + "endOfFlowMessage3": { + "message": "कई सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ पर बैकअप सहेजें।" + }, + "endOfFlowMessage4": { + "message": "वाकà¥à¤¯à¤¾à¤‚श को कभी भी किसी के साथ साà¤à¤¾ न करें।" + }, + "endOfFlowMessage5": { + "message": "फ़िशिंग से सावधान रहें! मेटामासà¥à¤• कभी भी अनायास आपके बीज वाकà¥à¤¯à¤¾à¤‚श के लिठनहीं पूछेगा।" + }, + "endOfFlowMessage6": { + "message": "यदि आपको अपने सीड फ़à¥à¤°à¥‡à¥› का बैक अप लेने की आवशà¥à¤¯à¤•ता है तो आप इसे सेटिंगà¥à¤¸ -> सà¥à¤°à¤•à¥à¤·à¤¾ में पा सकते हैं।" + }, + "endOfFlowMessage7": { + "message": "यदि आपका कोई भी पà¥à¤°à¤¶à¥à¤¨ है या कोई गड़बड़ पाते हैं तो support@metamask.io पर ईमेल करें।" + }, + "endOfFlowMessage8": { + "message": "मेटामासà¥à¤• आपके बीज वाकà¥à¤¯à¤¾à¤‚श को पà¥à¤¨à¤°à¥à¤ªà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं कर सकता है। और अधिक जानें।" + }, + "endOfFlowMessage9": { + "message": "और जानें।" + }, + "endOfFlowMessage10": { + "message": "सब हो गया" + }, + "ensRegistrationError": { + "message": "ईà¤à¤¨à¤à¤¸ नाम पंजीकरण में तà¥à¤°à¥à¤Ÿà¤¿" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "वरà¥à¤¤à¤®à¤¾à¤¨ नेटवरà¥à¤• पर ENS नाम नहीं मिला। मà¥à¤–à¥à¤¯ Ethereum नेटवरà¥à¤• पर सà¥à¤µà¤¿à¤š करने का पà¥à¤°à¤¯à¤¾à¤¸ करें।" + }, + "enterAnAlias": { + "message": "à¤à¤• उपनाम दरà¥à¤œ करें" + }, + "enterPassword": { + "message": "पासवरà¥à¤¡ दरà¥à¤œ करें" + }, + "enterPasswordContinue": { + "message": "जारी रखने के लिठपासवरà¥à¤¡ दरà¥à¤œ करें" + }, + "ethereumPublicAddress": { + "message": "ईथरअम पबà¥à¤²à¤¿à¤• à¤à¤¡à¥à¤°à¥‡à¤¸" + }, + "etherscanView": { + "message": "Etherscan पर खाता दिखाà¤à¤" + }, + "estimatedProcessingTimes": { + "message": "पà¥à¤°à¥‹à¤¸à¥‡à¤¸ करने के अनà¥à¤®à¤¾à¤¨à¤¿à¤¤ समय" + }, + "expandView": { + "message": "विसà¥à¤¤à¤¾à¤° से देखें" + }, + "exportPrivateKey": { + "message": "निजी कà¥à¤‚जी निरà¥à¤¯à¤¾à¤¤ करें " + }, + "failed": { + "message": "असफल हà¥à¤†" + }, + "fast": { + "message": "तेज़" + }, + "faster": { + "message": "तीवà¥à¤°" + }, + "fiat": { + "message": "फ़à¥à¤²à¥ˆà¤Ÿ", + "description": "Exchange type" + }, + "fileImportFail": { + "message": "फ़ाइल आयात काम नहीं कर रहा है? यहां कà¥à¤²à¤¿à¤• करे!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "इस डिवाइस को भूल जाà¤à¤‚" + }, + "from": { + "message": "से\n" + }, + "functionType": { + "message": "कारà¥à¤¯à¤ªà¥à¤°à¤£à¤¾à¤²à¥€ पà¥à¤°à¤•ार" + }, + "gasLimit": { + "message": "गैस की सीमा" + }, + "gasLimitInfoModalContent": { + "message": "गैस की सीमा गैस के यूनिट की अधिकतम राशि है जिसे आप खरà¥à¤š करना चाहते हैं।" + }, + "gasLimitTooLow": { + "message": "गैस की सीमा कम से कम 21000 होनी चाहिà¤" + }, + "gasUsed": { + "message": "उपयोग किठगठगैस" + }, + "gasPrice": { + "message": "गैस की कीमत (जीडबà¥à¤²à¥à¤¯à¥‚ईआई)" + }, + "gasPriceExtremelyLow": { + "message": "गैस मूलà¥à¤¯ बहà¥à¤¤ कम है" + }, + "gasPriceInfoModalContent": { + "message": "गैस की कीमत, उस ईथर की मातà¥à¤°à¤¾ को निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ करती है जिसे आप गैस की पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• इकाई के लिठभà¥à¤—तान करने के इचà¥à¤›à¥à¤• हैं।" + }, + "gasPriceNoDenom": { + "message": "गैस का मूलà¥à¤¯" + }, + "general": { + "message": "सामानà¥à¤¯" + }, + "generalSettingsDescription": { + "message": "मà¥à¤¦à¥à¤°à¤¾ रूपांतरण, पà¥à¤°à¤¾à¤¥à¤®à¤¿à¤• मà¥à¤¦à¥à¤°à¤¾, भाषा, बà¥à¤²à¥‰à¤•ीज़ पहचान" + }, + "getEther": { + "message": "Ether पाà¤à¤" + }, + "getEtherFromFaucet": { + "message": "$1 में फॉसेट से Ether पà¥à¤°à¤¾à¤ªà¥à¤¤ करें", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "सहायता पà¥à¤°à¤¾à¤ªà¥à¤¤ करें।" + }, + "getStarted": { + "message": "आरंभ करें" + }, + "happyToSeeYou": { + "message": "आपको देखकर हमें बहà¥à¤¤ ख़à¥à¤¶à¥€ हà¥à¤ˆà¥¤" + }, + "hardware": { + "message": "हारà¥à¤¡à¤µà¥‡à¤¯à¤°" + }, + "hardwareWalletConnected": { + "message": "हारà¥à¤¡à¤µà¥‡à¤¯à¤° वॉलेट कनेकà¥à¤Ÿ हो गया" + }, + "hardwareWallets": { + "message": "हारà¥à¤¡à¤µà¥‡à¤¯à¤° वॉलेट जोड़े" + }, + "hardwareWalletsMsg": { + "message": "à¤à¤• हारà¥à¤¡à¤µà¥‡à¤¯à¤° वॉलेट चà¥à¤¨à¥‡à¤‚ जिसका उपयोग आप MetaMask के साथ करना चाहते हैं" + }, + "havingTroubleConnecting": { + "message": "कनेकà¥à¤Ÿ करने में परेशानी हो रही है?" + }, + "here": { + "message": "यहाठ", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hexData": { + "message": "हेकà¥à¤¸ डेटा" + }, + "hide": { + "message": "छà¥à¤ªà¤¾à¤à¤‚" + }, + "hideTokenPrompt": { + "message": "टोकन छिपाà¤à¤?" + }, + "history": { + "message": "इतिहास" + }, + "import": { + "message": "आयात करें", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "खाता आयात करें" + }, + "importAccountMsg": { + "message": "आयात किठगठखाते आपके मà¥à¤–à¥à¤¯ रूप से बनाठगठMetaMask खाते के सीडफ़à¥à¤°à¥‡à¥› से संबंधित नहीं होंगे। आयात किठगठखातों के बारे में अधिक जानें" + }, + "importAccountSeedPhrase": { + "message": "बीज वाकà¥à¤¯à¤¾à¤‚श के साथ à¤à¤• खाता आयात करें" + }, + "importWallet": { + "message": "वॉलेट आयात करें" + }, + "importYourExisting": { + "message": "12 शबà¥à¤¦ बीज वाकà¥à¤¯à¤¾à¤‚श का उपयोग करके अपने मौजूदा वॉयलेट को आयात करें" + }, + "imported": { + "message": "आयातित", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "खाता बीज वाकà¥à¤¯à¤¾à¤‚श का उपयोग कर आयात करें" + }, + "infoHelp": { + "message": "जानकारी और सहायता" + }, + "initialTransactionConfirmed": { + "message": "आपके पà¥à¤°à¤¾à¤°à¤‚भिक टà¥à¤°à¤¾à¤‚ज़ैकà¥à¤¶à¤¨ की पà¥à¤·à¥à¤Ÿà¤¿ नेटवरà¥à¤• दà¥à¤µà¤¾à¤°à¤¾ की गई थी। वापस जाने के लिठOK पर कà¥à¤²à¤¿à¤• करें।" + }, + "insufficientBalance": { + "message": "अपरà¥à¤¯à¤¾à¤ªà¥à¤¤ शेष।" + }, + "insufficientFunds": { + "message": "अपरà¥à¤¯à¤¾à¤ªà¥à¤¤ धनराशि" + }, + "insufficientTokens": { + "message": "अपरà¥à¤¯à¤¾à¤ªà¥à¤¤ टोकन" + }, + "invalidAddress": { + "message": "अमानà¥à¤¯ पता" + }, + "invalidAddressRecipient": { + "message": "पà¥à¤°à¤¾à¤ªà¥à¤¤à¤•रà¥à¤¤à¤¾ का पता अमानà¥à¤¯ है" + }, + "knownAddressRecipient": { + "message": "जà¥à¤žà¤¾à¤¤ अनà¥à¤¬à¤‚ध पता।" + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "ईटीà¤à¤š नेटवरà¥à¤• नहीं, लोअरकेस में सेट करें" + }, + "invalidInput": { + "message": "अमानà¥à¤¯ इनपà¥à¤Ÿà¥¤" + }, + "invalidRPC": { + "message": "अमानà¥à¤¯ RPC URL" + }, + "invalidBlockExplorerURL": { + "message": "अमानà¥à¤¯ Block Explorer URL" + }, + "invalidSeedPhrase": { + "message": "अमानà¥à¤¯ बीज वाकà¥à¤¯à¤¾à¤‚श" + }, + "jsonFile": { + "message": "JSON फ़ाइल", + "description": "format for importing an account" + }, + "kovan": { + "message": "कोवन टेसà¥à¤Ÿ नेटवरà¥à¤•" + }, + "max": { + "message": "अधिकतम" + }, + "learnMore": { + "message": "अधिक जानें " + }, + "ledgerAccountRestriction": { + "message": "नया खाता जोड़ने से पहले आपको अपने पिछले खाते का उपयोग करना होगा।" + }, + "letsGoSetUp": { + "message": "जी हां, सेट होने दें!" + }, + "likeToAddTokens": { + "message": "कà¥à¤¯à¤¾ आप इन टोकन को जोड़ना चाहेंगे?" + }, + "liveGasPricePredictions": { + "message": "लाइव गैस की कीमत की भविषà¥à¤¯à¤µà¤¾à¤£à¥€" + }, + "loading": { + "message": "लोड हो रही हैं..." + }, + "loadingTokens": { + "message": "टोकन लोड हो रहे हैं..." + }, + "loadMore": { + "message": "और लोड करें" + }, + "localhost": { + "message": "लोकलहोसà¥à¤Ÿ 8545" + }, + "lock": { + "message": "लॉग आउट" + }, + "mainnet": { + "message": "मà¥à¤–à¥à¤¯ Ethereum नेटवरà¥à¤•" + }, + "memorizePhrase": { + "message": "इस फ़à¥à¤°à¥‡à¥› को याद कर लें।" + }, + "memo": { + "message": "जà¥à¤žà¤¾à¤ªà¤¨" + }, + "message": { + "message": "संदेश" + }, + "metamaskDescription": { + "message": "आपको Ethereum और विकेंदà¥à¤°à¥€à¤•ृत वेब से कनेकà¥à¤Ÿ कर रहे हैं।" + }, + "metamaskVersion": { + "message": "MetaMask का संसà¥à¤•रण" + }, + "mobileSyncText": { + "message": "यह आप ही हैं इसकी पà¥à¤·à¥à¤Ÿà¤¿ करने के लिठकृपया अपना पासवरà¥à¤¡ दरà¥à¤œ करें!" + }, + "myAccounts": { + "message": "मेरा खाता" + }, + "myWalletAccounts": { + "message": "माई वॉलेट खाते" + }, + "myWalletAccountsDescription": { + "message": "आपके सभी मेटामासà¥à¤• निरà¥à¤®à¤¿à¤¤ खाते सà¥à¤µà¤¤à¤ƒ ही इस खंड में जà¥à¤¡à¤¼ जाà¤à¤‚गे।" + }, + "mustSelectOne": { + "message": "कम से कम 1 टोकन का चयन करना होगा।" + }, + "needEtherInWallet": { + "message": "मेटामासà¥à¤• का उपयोग करके विकेंदà¥à¤°à¥€à¤•ृत अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ों के साथ संवाद करने के लिà¤, आपको अपने वॉयलेट में ईथर की आवशà¥à¤¯à¤•ता होगी।" + }, + "needImportFile": { + "message": "आयात करने के लिठआपको à¤à¤• फ़ाइल का चयन करना होगा।", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "ETH की नकारातà¥à¤®à¤• धनराशि को नहीं भेज सकते।" + }, + "networkName": { + "message": "नेटवरà¥à¤• का नाम" + }, + "networks": { + "message": "नेटवरà¥à¤•" + }, + "networkSettingsDescription": { + "message": "कसà¥à¤Ÿà¤® RPC नेटवरà¥à¤• को जोड़ें और समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करें" + }, + "nevermind": { + "message": "कोई बात नहीं" + }, + "newAccount": { + "message": "नया खाता" + }, + "newAccountDetectedDialogMessage": { + "message": "नठपते का पता लगा! अपनी पता पà¥à¤¸à¥à¤¤à¤¿à¤•ा में जोड़ने के लिठयहां कà¥à¤²à¤¿à¤• करें।" + }, + "newAccountNumberName": { + "message": "खाता $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "नया संपरà¥à¤•" + }, + "newContract": { + "message": "नया कॉनà¥à¤Ÿà¥à¤°à¥ˆà¤•à¥à¤Ÿ" + }, + "newPassword": { + "message": "नया पासवरà¥à¤¡ (कम से कम 8 अकà¥à¤·à¤°)" + }, + "newNetwork": { + "message": "नया नेटवरà¥à¤•" + }, + "newToMetaMask": { + "message": "MetaMask में नठहै?" + }, + "noAlreadyHaveSeed": { + "message": "जी नहीं, मेरे पास पहले से ही à¤à¤• बीज वाकà¥à¤¯à¤¾à¤‚श है" + }, + "protectYourKeys": { + "message": "अपनी कà¥à¤‚जी को सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ रखें!" + }, + "protectYourKeysMessage1": { + "message": "अपने सीड फ़à¥à¤°à¥‡à¥› के बारे में सावधान रहें — à¤à¤¸à¥€ वेबसाइटों की रिपोरà¥à¤Ÿà¥‡à¤‚ आई हैं जो MetaMask की नकल करने का पà¥à¤°à¤¯à¤¾à¤¸ करती हैं। MetaMask आपके सीड फ़à¥à¤°à¥‡à¥› के बारे में कभी नहीं पूछेगा!" + }, + "protectYourKeysMessage2": { + "message": "अपने वाकà¥à¤¯à¤¾à¤‚श को सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ रखें। यदि आपको कà¥à¤› गड़बड़ दिखती है, या आप किसी वेबसाइट के बारे में अनिशà¥à¤šà¤¿à¤¤ हैं तो support@metamask.io को ई मेल करें\n" + }, + "rpcUrl": { + "message": "नया RPC URL" + }, + "optionalChainId": { + "message": "चैनआईडी (वैकलà¥à¤ªà¤¿à¤•)" + }, + "optionalSymbol": { + "message": "सिमà¥à¤¬à¤² (वैकलà¥à¤ªà¤¿à¤•)" + }, + "newTotal": { + "message": "नया कà¥à¤²" + }, + "newTransactionFee": { + "message": "नया अंतरण शà¥à¤²à¥à¤•" + }, + "next": { + "message": "अगला" + }, + "noAddressForName": { + "message": "इस नाम के लिठकोई पता सेट नहीं किया गया है" + }, + "noConversionRateAvailable": { + "message": "कोई रूपांतरण दर उपलबà¥à¤§ नहीं है" + }, + "noTransactions": { + "message": "आपका कोई अंतरण नहीं है" + }, + "notEnoughGas": { + "message": "परà¥à¤¯à¤¾à¤ªà¥à¤¤ गैस नहीं है" + }, + "noWebcamFoundTitle": { + "message": "वेब कैमरा नहीं मिला" + }, + "noWebcamFound": { + "message": "आपके कंपà¥à¤¯à¥‚टर का वेबकैम नहीं मिला। कृपया फ़िर से पà¥à¤°à¤¯à¤¾à¤¸ करें।" + }, + "ofTextNofM": { + "message": "का" + }, + "orderOneHere": { + "message": "Trezor या Ledger ऑरà¥à¤¡à¤° करें और अपने फंड को सà¥à¤¥à¤—ित करें" + }, + "origin": { + "message": "मूल" + }, + "parameters": { + "message": "पैरामीटर" + }, + "participateInMetaMetrics": { + "message": "मेटामेटà¥à¤°à¤¿à¤•à¥à¤¸ में भाग लें" + }, + "participateInMetaMetricsDescription": { + "message": "MetaMask को बेहतर बनाने में हमारी मदद के लिठMetaMetrics में भाग लें" + }, + "password": { + "message": "पासवरà¥à¤¡" + }, + "passwordsDontMatch": { + "message": "पासवरà¥à¤¡ समान नहीं हैं" + }, + "passwordNotLongEnough": { + "message": "पासवरà¥à¤¡ परà¥à¤¯à¤¾à¤ªà¥à¤¤ रूप से लमà¥à¤¬à¤¾ नहीं हैं" + }, + "pastePrivateKey": { + "message": "अपनी निजी कà¥à¤‚जी सà¥à¤Ÿà¥à¤°à¤¿à¤‚ग यहां पेसà¥à¤Ÿ करें:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "विलंबित" + }, + "personalAddressDetected": { + "message": "वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त पते का पता लगाया गया। टोकन अनà¥à¤¬à¤‚ध पता डालें।" + }, + "prev": { + "message": "पिछला" + }, + "primaryCurrencySetting": { + "message": "मà¥à¤–à¥à¤¯ मà¥à¤¦à¥à¤°à¤¾" + }, + "primaryCurrencySettingDescription": { + "message": "शà¥à¤°à¥ƒà¤‚खला की नेटिव मà¥à¤¦à¥à¤°à¤¾ (जैसे ETH) में पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤ मूलà¥à¤¯à¥‹à¤‚ को पà¥à¤°à¤¾à¤¥à¤®à¤¿à¤•ता देने के लिठनेटिव का चयन करें। अपने चयनित Fiat मà¥à¤¦à¥à¤°à¤¾ में पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤ मूलà¥à¤¯à¥‹à¤‚ को पà¥à¤°à¤¾à¤¥à¤®à¤¿à¤•ता देने के लिठFiat का चयन करें।" + }, + "privacyMsg": { + "message": "गोपनीयता नीति" + }, + "privateKey": { + "message": "निजी कà¥à¤‚जी", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "चेतावनी: इस कà¥à¤‚जी का खà¥à¤²à¤¾à¤¸à¤¾ न करें। आपकी निजी कà¥à¤‚जियों वाला कोई भी वà¥à¤¯à¤•à¥à¤¤à¤¿ आपके खाते में रखी कोई भी परिसंपतà¥à¤¤à¤¿ की चोरी कर सकता है।" + }, + "privateNetwork": { + "message": "निजी नेटवरà¥à¤•" + }, + "queue": { + "message": "सूची" + }, + "readdToken": { + "message": "आप अपने खातों के विकलà¥à¤ª मेनू में \"टोकन जोड़ें\" पर जाकर भविषà¥à¤¯ में इस टोकन को वापस जोड़ सकते हैं।" + }, + "recents": { + "message": "हाल ही का\n" + }, + "recipientAddress": { + "message": "पà¥à¤°à¤¾à¤ªà¥à¤¤à¤•रà¥à¤¤à¤¾ का पता" + }, + "recipientAddressPlaceholder": { + "message": "ढूà¤à¤¢à¥‡à¤‚, सारà¥à¤µà¤œà¤¨à¤¿à¤• पता (0x), या ENS" + }, + "rejectAll": { + "message": "सभी को असà¥à¤µà¥€à¤•ार करें" + }, + "rejectTxsN": { + "message": "$1 के टà¥à¤°à¤¾à¤‚ज़ैकà¥à¤¶à¤¨ को रिजेकà¥à¤Ÿ करें" + }, + "rejectTxsDescription": { + "message": "आप $1 के अंतरण को असà¥à¤µà¥€à¤•ार करने वाले हैं।" + }, + "rejected": { + "message": "रिजेकà¥à¤Ÿ किया हà¥à¤†" + }, + "reset": { + "message": "रीसेट करें" + }, + "resetAccount": { + "message": "खाता रीसेट करें" + }, + "resetAccountDescription": { + "message": "आपका खाता रीसेट करने से आपका अंतरण इतिहास रिकà¥à¤¤\n\nहो जाà¤à¤—ा।" + }, + "deleteNetwork": { + "message": "नेटवरà¥à¤• हटाà¤à¤‚?" + }, + "deleteNetworkDescription": { + "message": "कà¥à¤¯à¤¾ आप वाकई इस नेटवरà¥à¤• को हटाना चाहते हैं?" + }, + "remindMeLater": { + "message": "मà¥à¤à¥‡ बाद में याद दिलाà¤à¤\n" + }, + "restoreFromSeed": { + "message": "खाता पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करें?" + }, + "restoreAccountWithSeed": { + "message": "सीड फ़à¥à¤°à¥‡à¥› से अपने खाते को रिसà¥à¤Ÿà¥‹à¤° करें" + }, + "requestsAwaitingAcknowledgement": { + "message": "अनà¥à¤°à¥‹à¤§à¥‹à¤‚ के सà¥à¤µà¥€à¤•ार किठजाने की पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ कर रहे हैं" + }, + "required": { + "message": "अपेकà¥à¤·à¤¿à¤¤" + }, + "restore": { + "message": "पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करें" + }, + "revealSeedWords": { + "message": "बीज शबà¥à¤¦ पà¥à¤°à¤•ट करें" + }, + "revealSeedWordsTitle": { + "message": "सीड फ़à¥à¤°à¥‡à¥›" + }, + "revealSeedWordsDescription": { + "message": "यदि आप कभी बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤°à¥‹à¤‚ बदलते हैं या कंपà¥à¤¯à¥‚टर को सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित करते हैं, तो आपको अपने खातों तक पहà¥à¤‚चने के लिठइस बीज वाकà¥à¤¯à¤¾à¤‚श की आवशà¥à¤¯à¤•ता होगी। उनà¥à¤¹à¥‡à¤‚ कहीं सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ और गà¥à¤ªà¥à¤¤ रूप से सहेजें।" + }, + "revealSeedWordsWarningTitle": { + "message": "इस वाकà¥à¤¯à¤¾à¤‚श को किसी के साथ साà¤à¤¾ न करें!" + }, + "revealSeedWordsWarning": { + "message": "इन शबà¥à¤¦à¥‹à¤‚ का उपयोग आपके समà¥à¤ªà¥‚रà¥à¤£ खातों को चà¥à¤°à¤¾à¤¨à¥‡ के लिठकिया जा सकता है।" + }, + "remove": { + "message": "निकालें" + }, + "removeAccount": { + "message": "खाता हटाà¤à¤‚" + }, + "removeAccountDescription": { + "message": "यह खाता आपके वॉयलेट से हटा दिया जाà¤à¤—ा। कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि जारी रखने से पहले आपके पास इस आयातित खाते के लिठमूल बीज वाकà¥à¤¯à¤¾à¤‚श या निजी कà¥à¤‚जी है। आप खाता डà¥à¤°à¥‰à¤ª-डाउन से दोबारा खाता आयात कर या बना सकते हैं ।" + }, + "readyToConnect": { + "message": "कनेकà¥à¤Ÿ होने के लिठतैयार हैं?" + }, + "rinkeby": { + "message": "\nरिंकीबी टेसà¥à¤Ÿ नेटवरà¥à¤•" + }, + "ropsten": { + "message": "रोपसà¥à¤Ÿà¥‡à¤¨ टेसà¥à¤Ÿ नेटवरà¥à¤•" + }, + "goerli": { + "message": "गोà¤à¤°à¥à¤²à¥€ टेसà¥à¤Ÿ नेटवरà¥à¤•" + }, + "save": { + "message": "सहेजें" + }, + "slow": { + "message": "धीमा" + }, + "slower": { + "message": "धीमा" + }, + "saveAsCsvFile": { + "message": " सीवीà¤à¤¸ फ़ाइल के रूप में सहेजें" + }, + "scanInstructions": { + "message": "अपने कैमरे के सामने कà¥à¤¯à¥‚आर कोड रखें" + }, + "scanQrCode": { + "message": "QR कोड सà¥à¤•ैन करें" + }, + "search": { + "message": "खोज" + }, + "searchResults": { + "message": "खोज के परिणाम" + }, + "secretBackupPhrase": { + "message": "गà¥à¤ªà¥à¤¤ बैकअप वाकà¥à¤¯à¤¾à¤‚श" + }, + "secretBackupPhraseDescription": { + "message": "आपका सीकà¥à¤°à¥‡à¤Ÿ बैकअप फ़à¥à¤°à¥‡à¥› आपके खाते का बैकअप लेना और उसे पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करना आसान बनाता है।" + }, + "secretBackupPhraseWarning": { + "message": "चेतावनी: अपने बैकअप फ़à¥à¤°à¥‡à¥› को कभी भी ज़ाहिर न करें। इस फ़à¥à¤°à¥‡à¥› से कोई भी आपका Ether हमेशा के लिठले सकता है।" + }, + "secretPhrase": { + "message": "अपने वॉलà¥à¤Ÿ को रिसà¥à¤Ÿà¥‹à¤° करने के लिठअपने बारह शबà¥à¤¦à¥‹à¤‚ के सीकà¥à¤°à¥‡à¤Ÿ फ़à¥à¤°à¥‡à¥› को यहाठदरà¥à¤œ करें।" + }, + "securityAndPrivacy": { + "message": "सà¥à¤°à¤•à¥à¤·à¤¾ और गोपनीयता" + }, + "securitySettingsDescription": { + "message": "गोपनीयता सेटिंग और वॉलेट सीड फ़à¥à¤°à¥‡à¥›" + }, + "seedPhrasePlaceholder": { + "message": "पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• शबà¥à¤¦ को à¤à¤• ही सà¥à¤ªà¥‡à¤¸ से अलग करें" + }, + "seedPhraseReq": { + "message": "बीज वाकà¥à¤¯à¤¾à¤‚श 12 शबà¥à¤¦ लंबे होते हैं" + }, + "selectCurrency": { + "message": "मà¥à¤¦à¥à¤°à¤¾ का चयन करें" + }, + "selectEachPhrase": { + "message": "यह सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करने के लिठकि यह सही है पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• वाकà¥à¤¯à¤¾à¤‚श का चयन करें।" + }, + "selectLocale": { + "message": "सà¥à¤¥à¤¾à¤¨ का चयन करें" + }, + "selectType": { + "message": "पà¥à¤°à¤•ार का चयन करें" + }, + "send": { + "message": "भेजें" + }, + "sendAmount": { + "message": "धनराशि भेजें" + }, + "sendETH": { + "message": "ईटीà¤à¤š भेजें" + }, + "sendTokens": { + "message": "टोकन भेजें" + }, + "sentEther": { + "message": "भेजे गठether" + }, + "sentTokens": { + "message": "भेजे गठटोकन" + }, + "separateEachWord": { + "message": "पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• शबà¥à¤¦ को à¤à¤• सà¥à¤ªà¥‡à¤¸ से अलग करें" + }, + "searchTokens": { + "message": "टोकन ढूà¤à¤¢à¥‡à¤‚" + }, + "selectAnAccount": { + "message": "à¤à¤• खाते का चयन करें" + }, + "selectAnAccountHelp": { + "message": "मेटामासà¥à¤• में देखने के लिठखाते का चयन करें" + }, + "selectAHigherGasFee": { + "message": "अपने अंतरण के पà¥à¤°à¥‹à¤¸à¥‡à¤¸ में तेजी लाने के लिठà¤à¤• उचà¥à¤š गैस शà¥à¤²à¥à¤• का चयन करें। *" + }, + "selectHdPath": { + "message": "HD पà¥à¤°à¤£à¤¾à¤²à¥€ चà¥à¤¨à¥‡à¤‚" + }, + "selectPathHelp": { + "message": "यदि आप अपने मौजूदा लेजर खातों को नीचे नहीं देख पाते हैं, तो \"लीगेसी (à¤à¤®à¤ˆà¤¡à¤¬à¥à¤²à¥à¤¯à¥‚/माईकà¥à¤°à¤¿à¤ªà¥à¤Ÿà¥‹)\" के लिठपाथ को बदलने का पà¥à¤°à¤¯à¤¾à¤¸ करें।" + }, + "settings": { + "message": "सेटिंग" + }, + "showAdvancedGasInline": { + "message": "उनà¥à¤¨à¤¤ गैस नियंतà¥à¤°à¤£" + }, + "showAdvancedGasInlineDescription": { + "message": "भेजने और पà¥à¤·à¥à¤Ÿà¤¿ करने के सà¥à¤•à¥à¤°à¥€à¤¨ पर गैस की कीमत दिखाने और सीमा को सीधे नियंतà¥à¤°à¤¿à¤¤ करने के लिठइसे चà¥à¤¨à¥‡à¤‚।" + }, + "showFiatConversionInTestnets": { + "message": "टेसà¥à¤Ÿà¤¨à¥‡à¤Ÿ पर रूपांतरण दिखाà¤à¤‚" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Testnets पर fiat परिवरà¥à¤¤à¤¨ दिखाने के लिठइसे चà¥à¤¨à¥‡à¤‚" + }, + "showHexData": { + "message": "हेकà¥à¤¸ डेटा दिखाà¤à¤" + }, + "showHexDataDescription": { + "message": "भेजे जानें वाले सà¥à¤•à¥à¤°à¥€à¤¨ पर हेकà¥à¤¸ डेटा फ़ीलà¥à¤¡ दिखाने के लिठइसे चà¥à¤¨à¥‡à¤‚" + }, + "sign": { + "message": "साइन" + }, + "signatureRequest": { + "message": "हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° अनà¥à¤°à¥‹à¤§" + }, + "signed": { + "message": "साइन किया गया" + }, + "signNotice": { + "message": "इस संदेश पर साइनिंग करने से खतरनाक दà¥à¤·à¥à¤ªà¥à¤°à¤­à¤¾à¤µ हो सकते हैं। केवल उन साइटों के संदेशों पर साइन करें जिन पर आप अपने पूरे खाते के लिठपूरी तरह भरोसा करते हैं।\n  इस खतरनाक तरीके को भविषà¥à¤¯ के संसà¥à¤•रण में हटा दिया जाà¤à¤—ा।" + }, + "sigRequest": { + "message": "हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° का अनà¥à¤°à¥‹à¤§" + }, + "somethingWentWrong": { + "message": "ओह! कà¥à¤› गलत हो गया।" + }, + "speedUp": { + "message": "गति बà¥à¤¾à¤à¤" + }, + "speedUpCancellation": { + "message": "रदà¥à¤¦ करने की इस पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ को गति दें" + }, + "speedUpTransaction": { + "message": "इस टà¥à¤°à¤¾à¤‚ज़ैकà¥à¤¶à¤¨ की गति बà¥à¤¾à¤à¤" + }, + "switchNetworks": { + "message": "नेटवरà¥à¤• सà¥à¤µà¤¿à¤š करें" + }, + "stateLogs": { + "message": "सà¥à¤Ÿà¥‡à¤Ÿ लॉग" + }, + "stateLogsDescription": { + "message": "सà¥à¤Ÿà¥‡à¤Ÿ लॉग में आपके सारà¥à¤µà¤œà¤¨à¤¿à¤• खाते के पते और भेजे गठटà¥à¤°à¤¾à¤‚ज़ैकà¥à¤¶à¤¨ होते हैं।" + }, + "stateLogError": { + "message": "सà¥à¤Ÿà¥‡à¤Ÿ लॉग को पà¥à¤¨à¤°à¥à¤ªà¥à¤°à¤¾à¤ªà¥à¤¤ करने में तà¥à¤°à¥à¤Ÿà¤¿à¥¤" + }, + "step1HardwareWallet": { + "message": "1. हारà¥à¤¡à¤µà¥‡à¤¯à¤° वॉलेट कनेकà¥à¤Ÿ करें" + }, + "step1HardwareWalletMsg": { + "message": "अपने हारà¥à¤¡à¤µà¥‡à¤¯à¤° वॉलेट को सीधे अपने कंपà¥à¤¯à¥‚टर से कनेकà¥à¤Ÿ करें।" + }, + "step2HardwareWallet": { + "message": "2. à¤à¤• खाता चà¥à¤¨à¥‡à¤‚" + }, + "step2HardwareWalletMsg": { + "message": "वह खाता चà¥à¤¨à¥‡à¤‚ जिसे आप देखना चाहते हैं। आप à¤à¤• समय में à¤à¤• का ही चयन कर सकते हैं" + }, + "step3HardwareWallet": { + "message": "3. डीà¤à¤ªà¥à¤¸ और अधिक का उपयोग करना आरंभ करें!" + }, + "step3HardwareWalletMsg": { + "message": "अपने हारà¥à¤¡à¤µà¥‡à¤¯à¤° खाते का उपयोग करें जैसे आप किसी भी ईथरअम खाते के साथ करेंगे। डीà¤à¤ªà¥à¤¸ में लॉग इन करें, ईटीà¤à¤š भेजें, खरीदें और ईआरसी 20 टोकन और कà¥à¤°à¤¿à¤ªà¥à¤Ÿà¥‹à¤•रंसी जैसे गैर-फंगबल टोकन सà¥à¤Ÿà¥‹à¤° करें।" + }, + "storePhrase": { + "message": "इस वाकà¥à¤¯à¤¾à¤‚श को 1पासवरà¥à¤¡ जैसे पासवरà¥à¤¡ मैनेजर में संगà¥à¤°à¤¹à¥€à¤¤ करें।" + }, + "submitted": { + "message": "पà¥à¤°à¤¸à¥à¤¤à¥à¤¤ किया गया" + }, + "supportCenter": { + "message": "हमारे सहायता केंदà¥à¤° पर जाà¤à¤" + }, + "symbol": { + "message": "सिमà¥à¤¬à¤²" + }, + "symbolBetweenZeroTwelve": { + "message": "पà¥à¤°à¤¤à¥€à¤• 11 वरà¥à¤£ या उससे कम का होना चाहिà¤à¥¤" + }, + "syncWithMobile": { + "message": "मोबाइल से सिंक करें" + }, + "syncWithMobileTitle": { + "message": "मोबाइल से सिंक करें" + }, + "syncWithMobileDesc": { + "message": "आप अपने खातों और सूचनाओं को अपने मोबाइल डिवाइस के साथ सिंक कर सकते हैं। मेटामासà¥à¤• मोबाइल à¤à¤ª खोलें, \"सेटिंग\" पर जाà¤à¤‚ और \"बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° à¤à¤•à¥à¤¸à¤Ÿà¥‡à¤‚शन से सिंक करें\" पर टैप करें" + }, + "syncWithMobileDescNewUsers": { + "message": "यदि आपने पहली बार मेटामासà¥à¤• मोबाइल à¤à¤ª खोला हैं, तो केवल अपने फोन में दिठगठचरणों का पालन करें।" + }, + "syncWithMobileScanThisCode": { + "message": "इस कोड को अपने मेटामासà¥à¤• मोबाइल à¤à¤ª से सà¥à¤•ैन करें" + }, + "syncWithMobileBeCareful": { + "message": "यह सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि इस कोड को सà¥à¤•ैन करते समय कोई आपकी सà¥à¤•à¥à¤°à¥€à¤¨ को देख नहीं देख रहा है" + }, + "syncWithMobileComplete": { + "message": "आपका डेटा सफलतापूरà¥à¤µà¤• समनà¥à¤µà¤¯à¤¿à¤¤ कर लिया गया है। मेटामासà¥à¤• मोबाइल à¤à¤ª का आनंद लें!" + }, + "terms": { + "message": "उपयोग की शरà¥à¤¤à¥‡à¤‚" + }, + "testFaucet": { + "message": "फॉसिट का परीकà¥à¤·à¤£ करें" + }, + "thisWillCreate": { + "message": "यह à¤à¤• नया वॉलेट और सीड फ़à¥à¤°à¥‡à¥› बनाà¤à¤—ा" + }, + "tips": { + "message": "टिपà¥à¤¸ " + }, + "to": { + "message": "सेवा में" + }, + "token": { + "message": "टोकन" + }, + "tokenAlreadyAdded": { + "message": "टोकन को पहले ही जोड़ा जा चà¥à¤•ा है।" + }, + "tokenContractAddress": { + "message": "टोकन संपरà¥à¤• पता" + }, + "tokenSymbol": { + "message": "टोकन पà¥à¤°à¤¤à¥€à¤•" + }, + "total": { + "message": "संपूरà¥à¤£" + }, + "transaction": { + "message": "अंतरण\n" + }, + "transactionConfirmed": { + "message": "$2 में अंतरण की पà¥à¤·à¥à¤Ÿà¤¿ की गई।" + }, + "transactionCreated": { + "message": "$2 पर $1 के मूलà¥à¤¯ से टà¥à¤°à¤¾à¤‚ज़ैकà¥à¤¶à¤¨ किया गया।" + }, + "transactionDropped": { + "message": "अंतरण $2 पर गिरा।" + }, + "transactionSubmitted": { + "message": "$2 पर $1 के गैस शà¥à¤²à¥à¤• के साथ टà¥à¤°à¤¾à¤‚ज़ैकà¥à¤¶à¤¨ दरà¥à¤œ किया गया।" + }, + "transactionResubmitted": { + "message": "$2 पर $1 के बढे हà¥à¤ गैस शà¥à¤²à¥à¤• के साथ टà¥à¤°à¤¾à¤‚ज़ैकà¥à¤¶à¤¨ फ़िर से दरà¥à¤œ हà¥à¤†" + }, + "transactionUpdated": { + "message": "$2 पर टà¥à¤°à¤¾à¤‚ज़ैकà¥à¤¶à¤¨ अपडेट किया गया।" + }, + "transactionErrored": { + "message": "अंतरण में तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆà¥¤ \n" + }, + "transactionCancelAttempted": { + "message": "$2 पर $1 के गैस शà¥à¤²à¥à¤• के साथ अंतरण रदà¥à¤¦ करने का पà¥à¤°à¤¯à¤¾à¤¸ किया गया" + }, + "transactionCancelSuccess": { + "message": "अंतरण सफलतापूरà¥à¤µà¤• $2 पर रदà¥à¤¦ कर दिया गया" + }, + "transactionError": { + "message": "टà¥à¤°à¤¾à¤‚ज़ैकà¥à¤¶à¤¨ में तà¥à¤°à¥à¤Ÿà¤¿à¥¤ गलतियों को कॉनà¥à¤Ÿà¥à¤°à¥ˆà¤•à¥à¤Ÿ कोड में दरà¥à¤¶à¤¯à¤¾ गया है।" + }, + "transactionErrorNoContract": { + "message": "à¤à¤• गैर-अनà¥à¤¬à¤‚ध पते पर à¤à¤• फ़ंकà¥à¤¶à¤¨ को कॉल करने की कोशिश कर रहा है।" + }, + "transactionFee": { + "message": "टà¥à¤°à¤¾à¤‚ज़ैकà¥à¤¶à¤¨ शà¥à¤²à¥à¤•" + }, + "transactionTime": { + "message": "टà¥à¤°à¤¾à¤‚ज़ैकà¥à¤¶à¤¨ का समय" + }, + "transfer": { + "message": "सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण" + }, + "transferBetweenAccounts": { + "message": "मरे खातों के बीच टà¥à¤°à¤¾à¤‚सफर करें" + }, + "transferFrom": { + "message": "से टà¥à¤°à¤¾à¤‚सफर करें" + }, + "troubleTokenBalances": { + "message": "हमें आपके टोकन बैलेंस लोड करने में परेशानी हà¥à¤ˆà¥¤ आप उनà¥à¤¹à¥‡à¤‚ देख सकते हैं", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "दोबारा कोशिश करें" + }, + "typePassword": { + "message": "अपना मेटामासà¥à¤• पासवरà¥à¤¡ टाइप करें" + }, + "unapproved": { + "message": "असà¥à¤µà¥€à¤•ृत" + }, + "units": { + "message": "इकाइयाà¤" + }, + "unknown": { + "message": "अजà¥à¤žà¤¾à¤¤" + }, + "unknownNetwork": { + "message": "निजी नेटवरà¥à¤• को अनलॉक करें" + }, + "unknownQrCode": { + "message": "तà¥à¤°à¥à¤Ÿà¤¿: हम उस कà¥à¤¯à¥‚आर कोड की पहचान नहीं कर सके" + }, + "unknownCameraErrorTitle": { + "message": "ओह! कà¥à¤› समसà¥à¤¯à¤¾ उतà¥à¤ªà¤¨à¥à¤¨ हो गई है..." + }, + "unknownCameraError": { + "message": "आपके कैमरे तक पहà¥à¤à¤šà¤¨à¥‡ का पà¥à¤°à¤¯à¤¾à¤¸ करते समय कोई तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆà¥¤ कृपया पà¥à¤¨: पà¥à¤°à¤¯à¤¾à¤¸ करें..." + }, + "unlock": { + "message": "अनलॉक करें" + }, + "unlockMessage": { + "message": "विकेंदà¥à¤°à¥€à¤•ृत वेब का इंतजार है" + }, + "updatedWithDate": { + "message": "$1 अपडेट किया गया" + }, + "urlErrorMsg": { + "message": "URI को उपयà¥à¤•à¥à¤¤ HTTP/HTTPS पà¥à¤°à¥€à¥žà¤¿à¤•à¥à¤¸ की आवशà¥à¤¯à¤•ता होती है।" + }, + "usedByClients": { + "message": "विभिनà¥à¤¨ पà¥à¤°à¤•ार के गà¥à¤°à¤¾à¤¹à¤•ों दà¥à¤µà¤¾à¤°à¤¾ उपयोग किया जाता है" + }, + "userName": { + "message": "उपयोगकरà¥à¤¤à¤¾ नाम" + }, + "viewAccount": { + "message": "खाता देखें" + }, + "viewinExplorer": { + "message": "à¤à¤•à¥à¤¸à¥à¤ªà¥à¤²à¥‹à¤°à¤° में देखें" + }, + "viewContact": { + "message": "संपरà¥à¤• देखें" + }, + "viewOnCustomBlockExplorer": { + "message": "$1 पर देखें" + }, + "viewOnEtherscan": { + "message": "इथरसà¥à¤•ैन पर देखें" + }, + "visitWebSite": { + "message": "हमारी वेबसाइट पर जाà¤à¤" + }, + "walletSeed": { + "message": "वॉलेट सीड" + }, + "welcomeBack": { + "message": "वापस आने पर सà¥à¤µà¤¾à¤—त है!" + }, + "welcome": { + "message": "MetaMask में आपका सà¥à¤µà¤¾à¤—त है" + }, + "writePhrase": { + "message": "इस वाकà¥à¤¯à¤¾à¤‚श को कागज के टà¥à¤•ड़े पर लिखें और à¤à¤• सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ सà¥à¤¥à¤¾à¤¨ पर संगà¥à¤°à¤¹à¥€à¤¤ करें। यदि आप और भी अधिक सà¥à¤°à¤•à¥à¤·à¤¾ चाहते हैं, तो इसे कागज के कई टà¥à¤•ड़ों पर लिखें और पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• को 2 - 3 विभिनà¥à¤¨ सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ में संगà¥à¤°à¤¹à¥€à¤¤ करें।" + }, + "yesLetsTry": { + "message": "हाà¤, चलिठकोशिश करते हैं" + }, + "youNeedToAllowCameraAccess": { + "message": "आपको इस सà¥à¤µà¤¿à¤§à¤¾ का उपयोग करने के लिठकैमरा à¤à¤•à¥à¤¸à¥‡à¤¸ की अनà¥à¤®à¤¤à¤¿ देने की आवशà¥à¤¯à¤•ता है।" + }, + "yourSigRequested": { + "message": "आपके हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° का अनà¥à¤°à¥‹à¤§ किया जा रहा है" + }, + "youSign": { + "message": "आप पà¥à¤°à¤µà¥‡à¤¶ कर रहे हैं" + }, + "yourPrivateSeedPhrase": { + "message": "आपका निजी बीज वाकà¥à¤¯à¤¾à¤‚श" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "शूनà¥à¤¯ गैस की कीमत में तेजी" + } +} diff --git a/app/_locales/hn/messages.json b/app/_locales/hn/messages.json index 54ddcc02b8fd..bfc32cd4e308 100644 --- a/app/_locales/hn/messages.json +++ b/app/_locales/hn/messages.json @@ -1,52 +1,10 @@ { - "privacyMode": { - "message": "गोपनीयता मोड" - }, - "privacyModeDescription": { - "message": "वेबसाइटों को आपकी खाता जानकारी देखने के लिठपहà¥à¤‚च का अनà¥à¤°à¥‹à¤§ करना होगा।" - }, - "exposeAccounts": { - "message": "खातों का परà¥à¤¦à¤¾à¤«à¤¾à¤¶ करें" - }, - "exposeDescription": { - "message": "मौजूदा वेबसाइट पर खातों का परà¥à¤¦à¤¾à¤«à¤¾à¤¶ करें। विरासत डैपà¥à¤¸ के लिठउपयोगी।" - }, - "confirmExpose": { - "message": "कà¥à¤¯à¤¾ आप वाकई अपने खातों को वरà¥à¤¤à¤®à¤¾à¤¨ वेबसाइट पर बेनकाब करना चाहते हैं?" - }, - "confirmClear": { - "message": "कà¥à¤¯à¤¾ आप वाकई अनà¥à¤®à¥‹à¤¦à¤¿à¤¤ वेबसाइटों को साफ़ करना चाहते हैं?" - }, - "clearApprovalDataSuccess": { - "message": "सà¥à¤µà¥€à¤•ृत वेबसाइट डेटा सफलतापूरà¥à¤µà¤• मंजूरी दे दी।" - }, - "approvalData": { - "message": "सà¥à¤µà¥€à¤•ृति डेटा" - }, - "approvalDataDescription": { - "message": "अनà¥à¤®à¥‹à¤¦à¤¿à¤¤ वेबसाइट डेटा साफ़ करें ताकि सभी साइटों को फिर से अनà¥à¤®à¥‹à¤¦à¤¨ का अनà¥à¤°à¥‹à¤§ करना होगा।" - }, - "clearApprovalData": { - "message": "अनà¥à¤®à¥‹à¤¦à¤¨ डेटा साफ़ करें" - }, "approve": { "message": "मंजूर" }, "reject": { "message": "असà¥à¤µà¥€à¤•ार" }, - "providerAPIRequest": { - "message": "वेब 3 à¤à¤ªà¥€à¤†à¤ˆ अनà¥à¤°à¥‹à¤§" - }, - "reviewProviderRequest": { - "message": "कृपया इस वेब 3 à¤à¤ªà¥€à¤†à¤ˆ अनà¥à¤°à¥‹à¤§ की समीकà¥à¤·à¤¾ करें।" - }, - "providerRequestInfo": { - "message": "नीचे सूचीबदà¥à¤§ डोमेन वेब 3 à¤à¤ªà¥€à¤†à¤ˆ तक पहà¥à¤‚च का अनà¥à¤°à¥‹à¤§ करने का पà¥à¤°à¤¯à¤¾à¤¸ कर रहा है ताकि यह à¤à¤¥à¥‡à¤°à¤¿à¤¯à¤® बà¥à¤²à¥‰à¤•चेन से बातचीत कर सके। वेब 3 à¤à¤•à¥à¤¸à¥‡à¤¸ को मंजूरी देने से पहले हमेशा सही जांच करें कि आप सही साइट पर हैं।" - }, - "accept": { - "message": "सà¥à¤µà¥€à¤•ार करें" - }, "account": { "message": "खाता" }, @@ -56,12 +14,6 @@ "accountName": { "message": "खाते का नाम" }, - "address": { - "message": "खाते का पता" - }, - "addCustomToken": { - "message": "कसà¥à¤Ÿà¤® टोकन जोड़ें" - }, "addToken": { "message": "टोकन जोड़ें" }, @@ -71,9 +23,6 @@ "amount": { "message": "राशि" }, - "amountPlusGas": { - "message": "राशि + गैस" - }, "appDescription": { "message": "इथीरियम बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° à¤à¤•à¥à¤¸à¤Ÿà¥‡à¤‚शन", "description": "आवेदन का विवरण" @@ -88,46 +37,18 @@ "attributions": { "message": "à¤à¤Ÿà¥à¤°à¤¿à¤¬à¥à¤¯à¥‚शन" }, - "available": { - "message": "à¤à¤Ÿà¥à¤°à¤¿à¤¬à¥à¤¯à¥‚शन उपलबà¥à¤§ हà¥à¤¨à¥‡" - }, "back": { "message": "वापस" }, "balance": { "message": "उपलबà¥à¤§ बैलेंस।" }, - "balances": { - "message": "आपके उपलबà¥à¤§ बैलेंस" - }, - "balanceIsInsufficientGas": { - "message": "वरà¥à¤¤à¤®à¤¾à¤¨ गैस कà¥à¤² के लिठअपरà¥à¤¯à¤¾à¤ªà¥à¤¤ शेष" - }, - "beta": { - "message": "BETA/बीटा" - }, - "betweenMinAndMax": { - "message": "$1 के बराबर या जà¥à¤¯à¤¦à¤¾ या, $2 के बराबर या कम होना चाहिà¤à¥¤", - "description": "हेकà¥à¤¸ इनपà¥à¤Ÿ के लिठदशमलव इनपà¥à¤Ÿ के रूप में सहायक" - }, "blockiesIdenticon": { "message": "बà¥à¤²à¥‰à¤•ीज पहचान का उपयोग करें" }, - "borrowDharma": { - "message": "धरà¥à¤®à¤¾ (बीटा) से / के साथ उधार लें" - }, "builtInCalifornia": { "message": "मेटामासà¥à¤• कैलिफ़ोरà¥à¤¨à¤¿à¤¯à¤¾ में डिज़ाइन और बनाया गया है।" }, - "buy": { - "message": "खरीदें" - }, - "buyCoinbase": { - "message": "कॉइनबेस पर खरीदें" - }, - "buyCoinbaseExplainer": { - "message": "बिलà¥à¤Ÿà¤•ोइन, इथीरियम और लाइटकोइन खरीदने और बेचने के लिठदà¥à¤¨à¤¿à¤¯à¤¾ का सबसे लोकपà¥à¤°à¤¿à¤¯ तरीका कॉइनबेस है।" - }, "buyCoinSwitch": { "message": "कॉइनसà¥à¤µà¤¿à¤š पर खरीदें" }, @@ -137,60 +58,24 @@ "cancel": { "message": "रदà¥à¤¦ करें" }, - "classicInterface": { - "message": "कà¥à¤²à¤¾à¤¸à¤¿à¤• इंटरफ़ेस का उपयोग क" - }, - "clickCopy": { - "message": "कॉपी करने के लिठकà¥à¤²à¤¿à¤• करें" - }, "confirm": { "message": "पà¥à¤·à¥à¤Ÿà¤¿ करें" }, - "confirmContract": { - "message": "अनà¥à¤¬à¤‚ध की पà¥à¤·à¥à¤Ÿà¤¿ करें" - }, "confirmPassword": { "message": "पासवरà¥à¤¡ की पà¥à¤·à¥à¤Ÿà¤¿ करें" }, - "confirmTransaction": { - "message": "लेनदेन की पà¥à¤·à¥à¤Ÿà¤¿ करें" - }, - "continue": { - "message": "जारी रखें" - }, - "continueToCoinbase": { - "message": "कॉइनबेस को बà¥à¤¹à¥‡à¤œà¤¨à¤¾ जारी रखें" - }, "continueToCoinSwitch": { "message": "कॉइनसà¥à¤µà¤¿à¤š को बà¥à¤¹à¥‡à¤œà¤¨à¤¾ जारी रखें" }, "contractDeployment": { "message": "अनà¥à¤¬à¤‚ध परिनियोजन व तैनाती" }, - "conversionProgress": { - "message": "रूपांतरण पà¥à¤°à¤—ति में हे।" - }, - "copiedButton": { - "message": "कॉपी किया गया" - }, - "copiedClipboard": { - "message": "कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ पर कॉपी किया गया" - }, "copiedExclamation": { "message": "कॉपी कर दिया गया!" }, - "copiedSafe": { - "message": "मैंने इसे कहीं सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ कॉपी कर दिया है" - }, - "copy": { - "message": "कॉपी / पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ करà¥à¤°à¥‡" - }, "copyToClipboard": { "message": "कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ पर कॉपी करें" }, - "copyButton": { - "message": " कॉपी / पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ करà¥à¤°à¥‡ [बतà¥à¤¤à¤¨] " - }, "copyPrivateKey": { "message": "यह आपकी निजी कà¥à¤‚जी है (कॉपी करने के लिठकà¥à¤²à¤¿à¤• करें)।" }, @@ -200,25 +85,9 @@ "createAccount": { "message": "खाता बनाà¤à¤‚" }, - "createDen": { - "message": "डेन बनाà¤à¤‚" - }, - "crypto": { - "message": "कà¥à¤°à¤¿à¤ªà¥à¤Ÿà¥‹", - "description": "à¤à¤•à¥à¤¸à¤šà¥‡à¤‚ज टाइप (कà¥à¤°à¤¿à¤ªà¥à¤Ÿà¥‹à¤•à¥à¤¯à¥‚चरस)" - }, - "currentConversion": { - "message": "वरà¥à¤¤à¤®à¤¾à¤¨ रूपांतरण" - }, - "currentNetwork": { - "message": "वरà¥à¤¤à¤®à¤¾à¤¨ नेटवरà¥à¤•" - }, "customGas": { "message": "अनà¥à¤•ूलित करें गैस" }, - "customize": { - "message": "अनà¥à¤•ूलित करें" - }, "customRPC": { "message": "कसà¥à¤Ÿà¤® RPC" }, @@ -231,39 +100,15 @@ "defaultNetwork": { "message": "ईथर लेनदेन के लिठडिफ़ॉलà¥à¤Ÿ नेटवरà¥à¤• मà¥à¤–à¥à¤¯ नेट है।" }, - "denExplainer": { - "message": "आपका डेन मेटामासà¥à¤• के भीतर आपका पासवरà¥à¤¡-à¤à¤¨à¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿà¥‡à¤¡ सà¥à¤Ÿà¥‹à¤°à¥‡à¤œ है।" - }, "deposit": { "message": "जमा" }, - "depositBTC": { - "message": "नीचे दिठगठपते पर अपना बीटीसी जमा करें:" - }, - "depositEth": { - "message": "Eth जमाआरà¥à¤¥" - }, "depositEther": { "message": "जमा - Ether" }, - "depositFiat": { - "message": "फिà¤à¤Ÿ के साथ जमा हो" - }, - "depositFromAccount": { - "message": "दूसरे खाते से जमा करें" - }, - "depositShapeShift": { - "message": "शेपशिप के साथ जमा करें" - }, - "depositShapeShiftExplainer": { - "message": "यदि आप अनà¥à¤¯ कà¥à¤°à¤¿à¤ªà¥à¤Ÿà¥‹à¤•ाउंटरज रखते हैं, तो आप सीधे मेटामासà¥à¤• वॉलेट में ईथर को वà¥à¤¯à¤¾à¤ªà¤¾à¤° और जमा कर सकते हैं। कोई खाता आवशà¥à¤¯à¤• नहीं है।" - }, "details": { "message": "संदेश विवरण" }, - "directDeposit": { - "message": "पà¥à¤°à¤¤à¥à¤¯à¤•à¥à¤· जमा" - }, "directDepositEther": { "message": "सीधे ईथर जमा करें" }, @@ -279,33 +124,15 @@ "edit": { "message": "संपादित करें" }, - "editAccountName": { - "message": "खाता नाम संपादित करें" - }, - "emailUs": { - "message": "हमें ईमेल करें!" - }, - "encryptNewDen": { - "message": "अपना नया डेन à¤à¤¨à¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ करें" - }, "enterPassword": { "message": "पासवरà¥à¤¡ दरà¥à¤œ करें" }, - "enterPasswordConfirm": { - "message": "पà¥à¤·à¥à¤Ÿà¤¿ करने के लिठअपना पासवरà¥à¤¡ दरà¥à¤œ करें" - }, "etherscanView": { "message": "ईथरसà¥à¤•ैन पर खाता देखें" }, - "exchangeRate": { - "message": "विनिमय दरै" - }, "exportPrivateKey": { "message": "निजी कà¥à¤‚जी निरà¥à¤¯à¤¾à¤¤ करें" }, - "exportPrivateKeyWarning": { - "message": "अपने जोखिम पर निजी कà¥à¤‚जी निरà¥à¤¯à¤¾à¤¤ करें।" - }, "failed": { "message": "विफल" }, @@ -317,49 +144,18 @@ "message": "फ़ाइल आयात काम नहीं कर रहा है? यहां कà¥à¤²à¤¿à¤• करें!", "description": "यूजर को अपने खाते को जे.à¤à¤¸.ौ.à¤à¤¨ फ़ाइल से आयात करने में मदद करता है" }, - "followTwitter": { - "message": "हमें टà¥à¤µà¤¿à¤Ÿà¤° पर अनà¥à¤¸à¤°à¤£ करें" - }, "from": { "message": "की तरफ से - संदेश" }, - "fromToSame": { - "message": "से और पता करने के लिठसमान नहीं हो सकता" - }, - "fromShapeShift": { - "message": "सेशशशफà¥à¤Ÿ का" - }, - "gas": { - "message": "गैस की लागत", - "description": "गैस की लागत का संकà¥à¤·à¤¿à¤ªà¥à¤¤ संकेत" - }, - "gasFee": { - "message": "गैस शà¥à¤²à¥à¤•" - }, "gasLimit": { "message": "गैस सीमा" }, - "gasLimitCalculation": { - "message": "हम नेटवरà¥à¤• की सफलता दर के आधार पर सà¥à¤à¤¾à¤ˆ गई गैस सीमा की गणना करते हैं।" - }, - "gasLimitRequired": { - "message": "गैस सीमा आवशà¥à¤¯à¤•" - }, "gasLimitTooLow": { "message": "२१००० - गैस की सीमा कम से कम 21000 होनी चाहिà¤" }, - "generatingSeed": { - "message": "सृजन बीज उतà¥à¤ªà¤¨à¥à¤¨ ... उतà¥à¤ªà¤¨à¥à¤¨ ...उतà¥à¤ªà¤¨à¥à¤¨..." - }, "gasPrice": { "message": "गैस मूलà¥à¤¯ (जीडबà¥à¤²à¥à¤¯à¥‚ईआई),(GWEI)" }, - "gasPriceCalculation": { - "message": "हम नेटवरà¥à¤• की सफलता दर के आधार पर सà¥à¤à¤¾à¤ गठगैस की कीमतों की गणना करते हैं।" - }, - "gasPriceRequired": { - "message": "गैस की कीमत आवशà¥à¤¯à¤• है" - }, "getEther": { "message": "ईथर पà¥à¤°à¤¾à¤ªà¥à¤¤ करें" }, @@ -367,32 +163,16 @@ "message": "$1 के लिठà¤à¤• नल से ईथर पà¥à¤°à¤¾à¤ªà¥à¤¤ करें", "description": "ईथर नल के लिठनेटवरà¥à¤• नाम पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤ करता है" }, - "greaterThanMin": { - "message": "$1 के बराबर या बराबर होना चाहिà¤à¥¤", - "description": "हेकà¥à¤¸ इनपà¥à¤Ÿ के लिठदशमलव इनपà¥à¤Ÿ के रूप में सहायक" - }, "here": { "message": "यहां", "description": "अधिक जानकारी के लिठयहां कà¥à¤²à¤¿à¤• करें- (परेशानी के साथ जाता है टोकनबैलेंस) (troubleTokenBalances)" }, - "hereList": { - "message": "यहां à¤à¤• सूची है !!!!" - }, "hide": { "message": "छà¥à¤ªà¤¾à¤à¤‚" }, - "hideToken": { - "message": "टोकन छिपाà¤à¤‚" - }, "hideTokenPrompt": { "message": "टोकन छिपाà¤à¤‚n?" }, - "howToDeposit": { - "message": "आप ईथर जमा कैसे करना चाहेंगे?" - }, - "holdEther": { - "message": "यह आपको आकाश और टोकन रखने की अनà¥à¤®à¤¤à¤¿ देता है, और विकेंदà¥à¤°à¥€à¤•ृत अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—ों के लिठआपके पà¥à¤² के रूप में कारà¥à¤¯ करता है।" - }, "import": { "message": "आयात", "description": "à¤à¤• चयनित फ़ाइल से à¤à¤• खाता आयात करने के लिठबटन " @@ -403,12 +183,6 @@ "importAccountMsg": { "message": "आयात किठगठखाते आपके मूल रूप से बनाठगठमेटामासà¥à¤• अकाउंट सीडफà¥à¤°à¥‡à¤œ से संबदà¥à¤§ नहीं होंगे। आयात किठगठखातों के बारे में और जानें" }, - "importAnAccount": { - "message": "खाता आयात करैॉ" - }, - "importDen": { - "message": "मौजूदा डेन आयात करें - DEN" - }, "imported": { "message": "आयातित", "description": "यह सà¥à¤¥à¤¿à¤¤à¤¿ दिखाती है कि कोई खाता पूरी तरह से कीरिंग में लोड हो चà¥à¤•ा है" @@ -428,20 +202,14 @@ "invalidAddressRecipient": { "message": "पà¥à¤°à¤¾à¤ªà¥à¤¤à¤•रà¥à¤¤à¤¾ का पता अमानà¥à¤¯ है" }, - "invalidGasParams": { - "message": "अमानà¥à¤¯ गैस पैरामीटर" - }, "invalidInput": { "message": "अमानà¥à¤¯ इनपà¥à¤Ÿà¥¤" }, - "invalidRequest": { - "message": "अमानà¥à¤¯ अनà¥à¤°à¥‹à¤§" - }, "invalidRPC": { "message": "अमानà¥à¤¯ RPC कै URI" }, - "jsonFail": { - "message": "कà¥à¤› गलत हो गया। कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि आपकी JSON फ़ाइल ठीक से फ़ॉरà¥à¤®à¥‡à¤Ÿ की गई है।" + "invalidBlockExplorerURL": { + "message": "अमानà¥à¤¯ Block Explorer कै URI" }, "jsonFile": { "message": "JSON फ़ाइल", @@ -450,19 +218,9 @@ "kovan": { "message": "कोवान टेसà¥à¤Ÿ नेटवरà¥à¤•" }, - "knowledgeDataBase": { - "message": "हमारे नॉलेज बेस पर जाà¤à¤‚" - }, - "lessThanMax": { - "message": "$1 से कम या बराबर होना चाहिà¤à¥¤", - "description": "हेकà¥à¤¸ इनपà¥à¤Ÿ के लिठदशमलव इनपà¥à¤Ÿ के रूप में सहायक" - }, "likeToAddTokens": { "message": "कà¥à¤¯à¤¾ आप इन टोकनों को जोड़ना चाहते हैं?" }, - "limit": { - "message": "सीमा" - }, "loading": { "message": "लोड हो रहा है ....." }, @@ -472,18 +230,12 @@ "localhost": { "message": "सà¥à¤¥à¤¾à¤¨à¥€à¤¯à¤¹à¥‹à¤¸à¥à¤Ÿ 8545" }, - "login": { + "unlock": { "message": "लॉग इन करें" }, - "logout": { + "lock": { "message": "लॉग आउट करें" }, - "loose": { - "message": "ढीला" - }, - "loweCaseWords": { - "message": "बीज शबà¥à¤¦ में केवल लोअरकेस वरà¥à¤£ होते हैं" - }, "mainnet": { "message": "मà¥à¤–à¥à¤¯ इथीरियम नेटवरà¥à¤•" }, @@ -493,9 +245,6 @@ "metamaskDescription": { "message": "मेटामासà¥à¤• इथीरियम के लिठà¤à¤• सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ पहचान वॉलà¥à¤Ÿ है।" }, - "min": { - "message": "नà¥à¤¯à¥‚नतम" - }, "myAccounts": { "message": "मेरे खाते" }, @@ -509,10 +258,6 @@ "message": "आयात करने के लिठआपको à¤à¤• फ़ाइल का चयन करना होगा।", "description": "पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ महतà¥à¤µà¤ªà¥‚रà¥à¤£ खाता है और उसे जारी रखने के लिठà¤à¤• फ़ाइल जोड़ने की आवशà¥à¤¯à¤•ता है" }, - "needImportPassword": { - "message": "चयनित फ़ाइल के लिठआपको à¤à¤• पासवरà¥à¤¡ दरà¥à¤œ करना होगा।", - "description": "पासवरà¥à¤¡ और फाइल को à¤à¤• खाते आयात करने के लिठआवशà¥à¤¯à¤• है" - }, "negativeETH": { "message": "ईटीà¤à¤š की नकारातà¥à¤®à¤• मातà¥à¤°à¤¾ नहीं भेज सकते हैं।." }, @@ -532,64 +277,22 @@ "newPassword": { "message": "नया पासवरà¥à¤¡ (नà¥à¤¯à¥‚नतम 8 वरà¥à¤£)" }, - "newRecipient": { - "message": "नया पà¥à¤°à¤¾à¤ªà¥à¤¤à¤•रà¥à¤¤à¤¾" - }, - "newRPC": { - "message": "नया RPC URL" - }, "next": { "message": "अगला" }, "noAddressForName": { "message": "इस नाम के लिठकोई पता सेट नहीं किया गया है।" }, - "noDeposits": { - "message": "कोई जमा पà¥à¤°à¤¾à¤ªà¥à¤¤ नहीं हà¥à¤ˆ" - }, - "noTransactionHistory": { - "message": "कोई लेनदेन इतिहास नहीं ..." - }, "noTransactions": { "message": "कोई लेन-देन नहीं" }, - "notStarted": { - "message": "पà¥à¤°à¤¾à¤°à¤‚भ नहीं किया गया" - }, - "oldUI": { - "message": "पà¥à¤°à¤¾à¤¨à¤¾ UI" - }, - "oldUIMessage": { - "message": "आप पà¥à¤°à¤¾à¤¨à¥‡ UI पर वापस आ गठहैं। आप ऊपर दाईं ओर डà¥à¤°à¥‰à¤ªà¤¡à¤¾à¤‰à¤¨ मेनू में विकलà¥à¤ª के माधà¥à¤¯à¤® से नठUI पर वापस सà¥à¤µà¤¿à¤š कर सकते हैं।" - }, - "or": { - "message": "या", - "description": "à¤à¤• नया खाता बनाने या आयात करने के बीच की पसंद" - }, - "passwordCorrect": { - "message": "कृपया सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें कि आपका पासवरà¥à¤¡ सही है।" - }, - "passwordMismatch": { - "message": "पासवरà¥à¤¡ मेल नहीं खाते", - "description": "पासवरà¥à¤¡ निरà¥à¤®à¤¾à¤£ पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ में, दो नठपासवरà¥à¤¡ फ़ीलà¥à¤¡ मेल नहीं खाते" - }, - "passwordShort": { - "message": "पासवरà¥à¤¡ परà¥à¤¯à¤¾à¤ªà¥à¤¤ लंबा नहीं", - "description": "पासवरà¥à¤¡ बनाने की पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ में, पासवरà¥à¤¡ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ होने के लिठपरà¥à¤¯à¤¾à¤ªà¥à¤¤ नहीं है" - }, "pastePrivateKey": { "message": "यहां अपनी निजी कà¥à¤‚जी सà¥à¤Ÿà¥à¤°à¤¿à¤‚ग चिपकाà¤à¤‚:", "description": "किसी निजी कà¥à¤‚जी से किसी खाते को आयात करने के लिà¤" }, - "pasteSeed": { - "message": "यहां अपने बीज वाकà¥à¤¯à¤¾à¤‚श पेसà¥à¤Ÿ करें!" - }, "personalAddressDetected": { "message": "वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त पता मिला। टोकन अनà¥à¤¬à¤‚ध का पता इनपà¥à¤Ÿà¥¤" }, - "pleaseReviewTransaction": { - "message": "कृपया अपने लेनदेन की समीकà¥à¤·à¤¾ करें।" - }, "privacyMsg": { "message": "गोपनीयता नीति" }, @@ -603,27 +306,12 @@ "privateNetwork": { "message": "निजी नेटवरà¥à¤•" }, - "qrCode": { - "message": "QR कोड दिखाà¤à¤‚" - }, "readdToken": { "message": "आप अपने खाता विकलà¥à¤ª मेनू में .टोकन जोड़ें. पर जाकर भविषà¥à¤¯ में इस टोकन को वापस जोड़ सकते हैं।" }, - "readMore": { - "message": "यहां और पढ़ें।" - }, - "readMore2": { - "message": "हां - और पढ़ें।" - }, - "receive": { - "message": "पà¥à¤°à¤¾à¤ªà¥à¤¤ करें" - }, "recipientAddress": { "message": "पà¥à¤°à¤¾à¤ªà¥à¤¤à¤•रà¥à¤¤à¤¾ पता" }, - "refundAddress": { - "message": "आपका रिफंड पता" - }, "rejected": { "message": "असà¥à¤µà¥€à¤•ृत" }, @@ -636,38 +324,21 @@ "required": { "message": "आवशà¥à¤¯à¤•" }, - "retryWithMoreGas": { - "message": "यहां à¤à¤• उचà¥à¤š गैस कीमत के साथ पà¥à¤¨: पà¥à¤°à¤¯à¤¾à¤¸ करें" - }, "revealSeedWords": { "message": "बीज शबà¥à¤¦ पà¥à¤°à¤•ट करें" }, "revealSeedWordsWarning": { "message": "किसी सारà¥à¤µà¤œà¤¨à¤¿à¤• सà¥à¤¥à¤¾à¤¨ पर अपने बीज के शबà¥à¤¦ ठीक नहीं करें! ये शबà¥à¤¦ आपके सभी खातों को चोरी करने के लिठउपयोग किठजा सकते हैं।" }, - "revert": { - "message": "वापस" - }, "rinkeby": { "message": "रिचीव टेसà¥à¤Ÿ नेटवरà¥à¤•" }, "ropsten": { "message": "रॉपà¥à¤¸à¥à¤Ÿà¥‡à¤¨ टेसà¥à¤Ÿ नेटवरà¥à¤•" }, - "sampleAccountName": { - "message": "उदाहरण के लिठमेरा नया खाता", - "description": "उपयोगकरà¥à¤¤à¤¾ को अपने खाते में मानव-पठनीय नाम जोड़ने की अवधारणा को समà¤à¥‡à¤‚." - }, "save": { "message": "सहेजें" }, - "saveAsFile": { - "message": "फ़ाइल के रूप में सहेजें", - "description": "खाता निरà¥à¤¯à¤¾à¤¤ पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾" - }, - "saveSeedAsFile": { - "message": "सेड वरà¥à¤¡à¥à¤¸ - फाईलà¥à¤¸ सेव करें" - }, "search": { "message": "खोज करें" }, @@ -677,15 +348,9 @@ "seedPhraseReq": { "message": "बीज वाकà¥à¤¯à¤¾à¤‚श 12 शबà¥à¤¦ लंबा हैं" }, - "select": { - "message": "चà¥à¤¨à¥‡à¤‚" - }, "selectCurrency": { "message": "मà¥à¤¦à¥à¤°à¤¾ चà¥à¤¨à¥‡à¤‚" }, - "selectService": { - "message": "सेवा चà¥à¤¨à¥‡à¤‚" - }, "selectType": { "message": "पà¥à¤°à¤•ार चà¥à¤¨à¥‡à¤‚" }, @@ -698,59 +363,32 @@ "sendTokens": { "message": "भेजें टोकन" }, - "sendTokensAnywhere": { - "message": "इथीरियम खाते वाले किसी को भी टोकन भेजें" - }, "settings": { "message": "सेटिंगà¥à¤¸" }, - "shapeshiftBuy": { - "message": "शेपेशिसà¥à¤Ÿ के साथ खरीदें" - }, "showPrivateKeys": { "message": "निजी कà¥à¤‚जी दिखाà¤à¤" }, - "showQRCode": { - "message": "QR कोड दिखाà¤à¤‚" - }, "sign": { "message": "हसà¥à¤¤à¤¾à¤•à¥à¤·à¤°" }, - "signMessage": { - "message": "हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° संदेश" - }, "signNotice": { "message": "इस संदेश पर हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° करने से \n साइड इफेकà¥à¤Ÿ हो सकते हैं। \n केवल अपने पूरे खाते के साथ पूरी तरह से भरोसेमंद \n साइटों से संदेश पर हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° करें। \n यह खतरनाक विधि भविषà¥à¤¯ के संसà¥à¤•रण में निकाल दी जाà¤à¤—ी।" }, "sigRequest": { "message": "हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° अनà¥à¤°à¥‹à¤§" }, - "sigRequested": { - "message": "हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° अनà¥à¤°à¥‹à¤§à¤¿à¤¤" - }, - "spaceBetween": { - "message": "केवल शबà¥à¤¦à¥‹à¤‚ के बीच à¤à¤• सà¥à¤¥à¤¾à¤¨ हो सकता है" - }, - "status": { - "message": "सà¥à¤¥à¤¿à¤¤à¤¿" - }, "stateLogs": { "message": "सà¥à¤¥à¤¿à¤¤à¤¿ संदेश" }, "stateLogsDescription": { "message": "सà¥à¤¥à¤¿à¤¤à¤¿ संदेश में आपका सारà¥à¤µà¤œà¤¨à¤¿à¤• खाता, पतों और भेजे गठलेनदेन, होते हैं।" }, - "submit": { - "message": "सबमिट करें" - }, "supportCenter": { "message": "हमारे सहायता केंदà¥à¤° पर जाà¤à¤‚" }, "symbolBetweenZeroTwelve": { - "message": "पà¥à¤°à¤¤à¥€à¤• 0 और 12 अकà¥à¤·à¤°à¥‹à¤‚ के बीच होना चाहिà¤" - }, - "takesTooLong": { - "message": "बहà¥à¤¤ समय ले रहा है?" + "message": "पà¥à¤°à¤¤à¥€à¤• 11 वरà¥à¤£ या उससे कम का होना चाहिà¤à¥¤" }, "terms": { "message": "उपयोग की शरà¥à¤¤à¥‡à¤‚" @@ -761,105 +399,43 @@ "to": { "message": "के लिà¤" }, - "toETHviaShapeShift": { - "message": "शैपशैफà¥à¤Ÿ दà¥à¤µà¤¾à¤°à¤¾ $1 से ETH में जमा", - "description": "संदेश की शà¥à¤°à¥à¤†à¤¤ में जमा पà¥à¤°à¤•ार भर जाà¤à¤—ा" - }, - "tokenAddress": { - "message": "टोकन पता" - }, "tokenAlreadyAdded": { "message": "टोकन पहले ही जोड़ा जा चà¥à¤•ा है।" }, - "tokenBalance": { - "message": "आपका टोकन बैलेंस है:" - }, - "tokenSelection": { - "message": "टोकन के लिठखोजें या हमारी लोकपà¥à¤°à¤¿à¤¯ टॉकेनà¥à¤¸ की सूची से चà¥à¤¨à¥‡à¤‚।" - }, "tokenSymbol": { "message": "टोकन पà¥à¤°à¤¤à¥€à¤•" }, - "tokenWarning1": { - "message": "अपने मेटामासà¥à¤• अकाउंट से खरीदे गठटोकनों का नज़र रखें। अगर आप किसी अलग खाते का उपयोग कर टोकन खरीदे हैं, तो ये टोकन यहां दिखाई नहीं देंगे।" - }, "total": { "message": "कà¥à¤²" }, - "transactions": { - "message": "लेनदेन" - }, - "transactionMemo": { - "message": "लेनदेन मेमो (वैकलà¥à¤ªà¤¿à¤•)" - }, - "transactionNumber": { - "message": "लेनदेन संखà¥à¤¯à¤¾" - }, - "transfers": { - "message": "सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण" - }, "troubleTokenBalances": { "message": "मà¥à¤¸à¥€à¤¬à¤¤... आपके टोकन शेष राशि को लोड करने में हमें परेशानी हà¥à¤ˆ थी। आप उनà¥à¤¹à¥‡à¤‚ देख सकते हैं", "description": "टोकन शेष देखने के लिठà¤à¤• लिंक ... (यहां)" }, - "twelveWords": { - "message": "ये 12 शबà¥à¤¦ आपके मेटामासà¥à¤• खातों को पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करने का à¤à¤•मातà¥à¤° तरीका है। \n उनà¥à¤¹à¥‡à¤‚ कहीं सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ और गà¥à¤ªà¥à¤¤ रूप से सहेजें।" - }, "typePassword": { "message": "अपना पासवरà¥à¤¡ टाइप करें" }, - "uiWelcome": { - "message": "नया यूआई (बीटा) में आपका सà¥à¤µà¤¾à¤—त है" - }, - "uiWelcomeMessage": { - "message": "आप अब नठमेटामासà¥à¤• UI का उपयोग कर रहे हैं। चारों ओर à¤à¤• नज़र डालें, टोकन भेजने की तरह नई सà¥à¤µà¤¿à¤§à¤¾à¤à¤‚ देखें, और हमें बताà¤à¤‚ कि आपके पास कोई समसà¥à¤¯à¤¾ है।" - }, - "unavailable": { - "message": "अनà¥à¤ªà¤²à¤¬à¥à¤§" - }, "unknown": { "message": "अजà¥à¤žà¤¾à¤¤ नेटवरà¥à¤•" }, "unknownNetwork": { "message": "अजà¥à¤žà¤¾à¤¤ निजी नेटवरà¥à¤•" }, - "unknownNetworkId": { - "message": "अजà¥à¤žà¤¾à¤¤ नेटवरà¥à¤• आईडी.य़" - }, - "uriErrorMsg": { + "urlErrorMsg": { "message": "URI-यूआरआई को उपयà¥à¤•à¥à¤¤ HTTP / HTTPS उपसरà¥à¤— की आवशà¥à¤¯à¤•ता होती है।" }, - "usaOnly": { - "message": "केवल यूà¤à¤¸à¤ - USA", - "description": "इस à¤à¤•à¥à¤¸à¤šà¥‡à¤‚ज का उपयोग करना संयà¥à¤•à¥à¤¤ राजà¥à¤¯ अमेरिका के अंदर ही सीमित है" - }, "usedByClients": { "message": "विभिनà¥à¤¨ कà¥à¤²à¤¾à¤‡à¤‚टà¥à¤¸ दà¥à¤µà¤¾à¤°à¤¾ उपयोग किया जाता है" }, - "useOldUI": { - "message": "पà¥à¤°à¤¾à¤¨à¥‡ UI का उपयोग करें" - }, - "validFileImport": { - "message": "आयात करने के लिठआपको à¤à¤• वैध फ़ाइल चà¥à¤¨à¤¨à¥€ होगी।" - }, - "vaultCreated": { - "message": "वॉलà¥à¤Ÿ बनाया गया" - }, "viewAccount": { "message": "खाता देखें" }, "visitWebSite": { "message": "हमारी वेब साइट पर जाà¤à¤‚" }, - "warning": { - "message": "चेतावनी" - }, "welcome": { "message": "मेटामासà¥à¤• बीटा में आपका सà¥à¤µà¤¾à¤—त है" }, - "whatsThis": { - "message": "यह कà¥à¤¯à¤¾ है?" - }, "yourSigRequested": { "message": "आपका हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° अनà¥à¤°à¥‹à¤§ किया जा रहा है" }, diff --git a/app/_locales/hr/messages.json b/app/_locales/hr/messages.json new file mode 100644 index 000000000000..a818b79a6cfe --- /dev/null +++ b/app/_locales/hr/messages.json @@ -0,0 +1,1300 @@ +{ + "chartOnlyAvailableEth": { + "message": "Grafikon je dostupan samo na mrežama Ethereum." + }, + "contractInteraction": { + "message": "Ugovorna interakcija" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "reject": { + "message": "Odbaci" + }, + "about": { + "message": "O opcijama" + }, + "aboutSettingsDescription": { + "message": "InaÄica, centar za podrÅ¡ku i informacije za kontakt" + }, + "acceleratingATransaction": { + "message": "* Ubrzavanjem se transakcije pomoću veće cijene goriva povećava Å¡ansa za bržu obradu mrežom, ali se uvijek ne jamÄi." + }, + "accessingYourCamera": { + "message": "Pristupanje vaÅ¡oj kameri..." + }, + "account": { + "message": "RaÄun" + }, + "accountDetails": { + "message": "Pojedinosti o raÄunu" + }, + "accountName": { + "message": "Naziv raÄuna" + }, + "accountOptions": { + "message": "Mogućnosti raÄuna" + }, + "accountSelectionRequired": { + "message": "Trebate odabrati raÄun!" + }, + "activityLog": { + "message": "zapisnik aktivnosti" + }, + "addNetwork": { + "message": "Dodaj mrežu" + }, + "addRecipient": { + "message": "Dodaj primatelja" + }, + "advanced": { + "message": "Napredno" + }, + "advancedSettingsDescription": { + "message": "Pristup znaÄajkama razvojnog inženjera, preuzimanje zapisnika stanja, poniÅ¡tavanje raÄuna, postavljanje testnih mreža i prilagoÄ‘eni RPC" + }, + "advancedOptions": { + "message": "Napredne mogućnosti" + }, + "addToAddressBook": { + "message": "Dodaj u imenik" + }, + "addToAddressBookModalPlaceholder": { + "message": "npr. Ivan M." + }, + "addAlias": { + "message": "Dodaj pseudonim" + }, + "addToken": { + "message": "Dodaj token" + }, + "addTokens": { + "message": "Dodaj tokene" + }, + "addSuggestedTokens": { + "message": "Dodaj predložene tokene" + }, + "addAcquiredTokens": { + "message": "Dodajte tokene koje ste kupili uslugom MetaMask" + }, + "amount": { + "message": "Iznos" + }, + "appDescription": { + "message": "NovÄanik Ethereum u vaÅ¡em pregledniku", + "description": "The description of the application" + }, + "approve": { + "message": "Odobri" + }, + "approved": { + "message": "Odboreno" + }, + "asset": { + "message": "Imovina" + }, + "attemptingConnect": { + "message": "PokuÅ¡aj povezivanja na podatkovni blok." + }, + "attemptToCancel": { + "message": "PokuÅ¡ati otkazati?" + }, + "attemptToCancelDescription": { + "message": "Slanjem ovog pokuÅ¡aja ne jamÄi se da će se vaÅ¡a izvorna transakcija otkazati. Ako je pokuÅ¡aj otkazivanja uspjeÅ¡an, naplaćuje vam se prethodno navedena naknada za prijenos." + }, + "attributions": { + "message": "Svojstva" + }, + "autoLockTimeLimit": { + "message": "BrojaÄ za automatsko odjavljivanje (minute)" + }, + "autoLockTimeLimitDescription": { + "message": "Postavite stanje u mirovanju u minutama prije nego Å¡to se MetaMask automatski odjavi" + }, + "average": { + "message": "ProsjeÄno" + }, + "back": { + "message": "Natrag" + }, + "backToAll": { + "message": "Natrag na sve" + }, + "backupApprovalNotice": { + "message": "Sigurnosno kopirajte svoj sigurnosni kôd za obnavljanje kako biste zaÅ¡titili svoj novÄanik i sredstva." + }, + "backupApprovalInfo": { + "message": "Ovaj je sigurnosni kôd potreban za obnavljanje novÄanika ako izgubite svoj ureÄ‘aj, zaboravite svoju lozinku, morate ponovno instalirati MetaMask ili želite pristupiti svojem novÄaniku na drugom ureÄ‘aju." + }, + "backupNow": { + "message": "Sigurnosno kopiraj sada" + }, + "balance": { + "message": "Stanje" + }, + "balanceOutdated": { + "message": "Stanje je možda zastarjelo" + }, + "basic": { + "message": "Osnovne" + }, + "blockExplorerUrl": { + "message": "Blokiraj Explorer" + }, + "blockExplorerView": { + "message": "Prikaži raÄun u $1", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "Upotrijebi identifikaciju blokovima" + }, + "browserNotSupported": { + "message": "VaÅ¡ se preglednik ne podržava..." + }, + "builtInCalifornia": { + "message": "MetaMask je osmiÅ¡ljen i izraÄ‘en u Kaliforniji." + }, + "buyWithWyre": { + "message": "Kupi ETH Wyerom" + }, + "buyWithWyreDescription": { + "message": "Wyreom vam se omogućava koriÅ¡tenje kreditnom karticom za polaganje ETH-a izravno na vaÅ¡ raÄun za MetaMask." + }, + "buyCoinSwitch": { + "message": "Kupujte na usluzi CoinSwitch" + }, + "buyCoinSwitchExplainer": { + "message": "Usluga CoinSwitch predstavlja mjesto stalne razmjene viÅ¡e od 300 kriptovaluta po najboljim teÄajevima." + }, + "bytes": { + "message": "Bajtovi" + }, + "off": { + "message": "IskljuÄeno" + }, + "ok": { + "message": "U redu" + }, + "on": { + "message": "UkljuÄi" + }, + "optionalBlockExplorerUrl": { + "message": "Blokiraj Explorerov URL (neobavezno)" + }, + "cancel": { + "message": "Odustani" + }, + "cancelAttempt": { + "message": "Otkaži pokuÅ¡aj" + }, + "cancellationGasFee": { + "message": "Otkazivanje naknade za gorivo" + }, + "cancelled": { + "message": "Otkazano" + }, + "chainId": { + "message": "Identifikacijska oznaka bloka" + }, + "clickToRevealSeed": { + "message": "Ovdje kliknite za otkrivanje tajnih rijeÄi" + }, + "close": { + "message": "Zatvori" + }, + "chromeRequiredForHardwareWallets": { + "message": "Trebate upotrebljavati MetaMask u pregledniku Google Chrome kako biste ga povezali s vaÅ¡im hardverskim novÄanikom." + }, + "confirm": { + "message": "Potvrdi" + }, + "confirmed": { + "message": "PotvrÄ‘eno" + }, + "confirmPassword": { + "message": "Potvrdi lozinku" + }, + "confirmSecretBackupPhrase": { + "message": "Potvrdite svoju alternativnu tajnu reÄenicu" + }, + "congratulations": { + "message": "ÄŒestitke" + }, + "connectHardwareWallet": { + "message": "Poveži hardverski novÄanik" + }, + "connect": { + "message": "Povežite se" + }, + "connectingTo": { + "message": "Povezivanje na $1" + }, + "connectingToKovan": { + "message": "Povezivanje na testnu mrežu Kovan" + }, + "connectingToMainnet": { + "message": "Povezivanje na glavnu mrežu Ethereum" + }, + "connectingToRopsten": { + "message": "Povezivanje na testnu mrežu Ropsten" + }, + "connectingToRinkeby": { + "message": "Povezivanje na testnu mrežu Rinkeby" + }, + "connectingToLocalhost": { + "message": "Povezivanje na Localhost 8545" + }, + "connectingToGoerli": { + "message": "Povezivanje na testnu mrežu Goerli" + }, + "continueToWyre": { + "message": "Nastavi na uslugu Wyre" + }, + "continueToCoinSwitch": { + "message": "Nastavi na uslugu CoinSwitch" + }, + "contractDeployment": { + "message": "Primjena ugovora" + }, + "copiedExclamation": { + "message": "Kopirano!" + }, + "copyAddress": { + "message": "Kopiraj adresu u meÄ‘uspremnik" + }, + "copyTransactionId": { + "message": "Kopiraj identifikacijsku oznaku transkacije" + }, + "copiedTransactionId": { + "message": "Kopirana identifikacijska oznaka transakcije" + }, + "copyToClipboard": { + "message": "Kopiraj u meÄ‘uspremnik" + }, + "copyPrivateKey": { + "message": "Ovo je vaÅ¡ privatni kljuÄ (kliknite za kopiranje)" + }, + "create": { + "message": "Stvori" + }, + "createAccount": { + "message": "Stvori raÄun" + }, + "createAWallet": { + "message": "Stvori novÄanik" + }, + "createPassword": { + "message": "Stvori lozinku" + }, + "currencyConversion": { + "message": "Konverzija valute" + }, + "currentLanguage": { + "message": "TrenutaÄni jezik" + }, + "customGas": { + "message": "Prilagodi gorivo" + }, + "customGasSubTitle": { + "message": "Povećavanjem se naknade može smanjiti vrijeme obrade, ali se ne jamÄi." + }, + "customToken": { + "message": "PrilagoÄ‘eni token" + }, + "customRPC": { + "message": "PrilagoÄ‘eni RPC" + }, + "decimalsMustZerotoTen": { + "message": "Decimalni brojevni ne smiju biti 0 i ne smiju prekoraÄivati 36." + }, + "decimal": { + "message": "Precizni decimalni brojevi" + }, + "defaultNetwork": { + "message": "Zadana je mreža za transakcije Ether glavna mreža." + }, + "delete": { + "message": "IzbriÅ¡i" + }, + "deleteAccount": { + "message": "IzbriÅ¡i raÄun" + }, + "deposit": { + "message": "Polog" + }, + "depositEther": { + "message": "Položi Ether" + }, + "details": { + "message": "Detalji" + }, + "directDepositEther": { + "message": "Izravan polog Ether" + }, + "directDepositEtherExplainer": { + "message": "Ako imate neÅ¡to Ethera, najbrži je naÄin prebacivanja Ethera u vaÅ¡ novi novÄanik izravan polog." + }, + "done": { + "message": "Gotovo" + }, + "downloadGoogleChrome": { + "message": "Preuzmi preglednik Google Chrome" + }, + "downloadSecretBackup": { + "message": "Preuzmite alternativnu sigurnosnu reÄenicu i pohranite je na sigurnom mjestu na vanjskom Å¡ifriranom tvrdom disku ili mediju za pohranu." + }, + "downloadStateLogs": { + "message": "Preuzmi zapisnike stanja" + }, + "dontHaveAHardwareWallet": { + "message": "Nemate hardverski novÄanik?" + }, + "dropped": { + "message": "NeuspjeÅ¡no" + }, + "edit": { + "message": "Uredi" + }, + "editContact": { + "message": "Uredi kontakt" + }, + "endOfFlowMessage1": { + "message": "ProÅ¡li ste test – Äuvajte svoju poÄetnu reÄenicu jer ste vi odgovorni za nju!" + }, + "endOfFlowMessage2": { + "message": "Savjeti za njezino sigurno Äuvanje" + }, + "endOfFlowMessage3": { + "message": "Spremite sigurnosnu kopiju na viÅ¡e mjesta." + }, + "endOfFlowMessage4": { + "message": "Nikada ne dijelite reÄenicu ni s kim." + }, + "endOfFlowMessage5": { + "message": "Pazite na kraÄ‘u identiteta! Na usluzi MetaMask nikada vas se neće pitati poÄetna reÄenica." + }, + "endOfFlowMessage6": { + "message": "Ako trebate ponovno sigurnosno kopirati svoju poÄetnu reÄenicu, možete je pronaći unutar stavke Postavke --> Sigurnost." + }, + "endOfFlowMessage7": { + "message": "Ako imate bilo kakvo pitanje ili vidite neÅ¡to Å¡to vam se Äini sumnjivim, poÅ¡aljite nam elektroniÄku poruku na support@metamask.io." + }, + "endOfFlowMessage8": { + "message": "Osoblje MetaMask ne može obnoviti vaÅ¡u poÄetnu reÄenicu. Saznajte viÅ¡e." + }, + "endOfFlowMessage9": { + "message": "Saznajte viÅ¡e." + }, + "endOfFlowMessage10": { + "message": "Sve zavrÅ¡eno" + }, + "ensRegistrationError": { + "message": "GreÅ¡ka u registraciji naziva ENS" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "Naziv ENS nije pronaÄ‘en na trenutaÄnoj mreži. PokuÅ¡ajte prebaciti na glavnu mrežu Ethereum." + }, + "enterAnAlias": { + "message": "UpiÅ¡i pseudonim" + }, + "enterPassword": { + "message": "UpiÅ¡i lozinku" + }, + "enterPasswordContinue": { + "message": "UpiÅ¡ite lozinku za nastavak" + }, + "ethereumPublicAddress": { + "message": "Javna adresa Ethereum" + }, + "etherscanView": { + "message": "Prikaži raÄun na Etherscanu" + }, + "estimatedProcessingTimes": { + "message": "Procijenjeno vrijeme obrade" + }, + "expandView": { + "message": "ProÅ¡iri prikaz" + }, + "exportPrivateKey": { + "message": "Izvezi privatni kljuÄ" + }, + "failed": { + "message": "NeuspjeÅ¡no" + }, + "fast": { + "message": "Brzo" + }, + "faster": { + "message": "Brže" + }, + "fileImportFail": { + "message": "Uvoženje datoteke ne radi? Kliknite ovdje.", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "Zaboravi ovaj ureÄ‘aj" + }, + "from": { + "message": "PoÅ¡iljatelj" + }, + "functionType": { + "message": "Vrsta funkcije" + }, + "gasLimit": { + "message": "OgraniÄenje goriva" + }, + "gasLimitInfoModalContent": { + "message": "OgraniÄenje za gorivo predstavlja najveći broj jedinica goriva koje ste spremi potroÅ¡iti." + }, + "gasLimitTooLow": { + "message": "OgraniÄenje za gorivo mora biti najmanje 21000" + }, + "gasUsed": { + "message": "Upotrijebljeno gorivo" + }, + "gasPrice": { + "message": "Cijena goriva (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "Iznimno niska cijena goriva" + }, + "gasPriceInfoModalContent": { + "message": "Cijena goriva odnosi se na vrijednost Ether koju ste spremni platiti za svaku jedinicu goriva." + }, + "gasPriceNoDenom": { + "message": "Cijena goriva" + }, + "general": { + "message": "Opće" + }, + "generalSettingsDescription": { + "message": "Konverzija valuta, glavna valuta, jezik, blockies identicon" + }, + "getEther": { + "message": "Dohvati Ether" + }, + "getEtherFromFaucet": { + "message": "Dohvati Ether iz svežnja za $1", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "Potražite pomoć." + }, + "getStarted": { + "message": "PoÄetak upotrebe" + }, + "happyToSeeYou": { + "message": "Sretni smo Å¡to ste tu." + }, + "hardware": { + "message": "hardver" + }, + "hardwareWalletConnected": { + "message": "Povezani hardverski novÄanik" + }, + "hardwareWallets": { + "message": "Poveži hardverski novÄanik" + }, + "hardwareWalletsMsg": { + "message": "Odaberite hardverski novÄanik koji biste željeli upotrebljavati s uslugom MetaMask" + }, + "havingTroubleConnecting": { + "message": "Imate poteÅ¡koća s povezivanjem?" + }, + "here": { + "message": "ovdje", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hexData": { + "message": "Podatci Hex" + }, + "hide": { + "message": "Sakrij preglednik" + }, + "hideTokenPrompt": { + "message": "Sakriti token?" + }, + "history": { + "message": "Povijest" + }, + "import": { + "message": "Uvezi", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "Uvezi raÄun" + }, + "importAccountMsg": { + "message": "Uvezeni se raÄuni ne pridružuju vaÅ¡oj izvorno stvorenoj poÄetnoj reÄenici za MetaMask. Saznajte viÅ¡e o uvezenim raÄunima" + }, + "importAccountSeedPhrase": { + "message": "Uvezi raÄun poÄetnom reÄenicom" + }, + "importWallet": { + "message": "Uvezi novÄanik" + }, + "importYourExisting": { + "message": "Uvezite svoj postojeći novÄanik poÄetnom reÄenicom od 12 rijeÄi" + }, + "imported": { + "message": "Uvezeno", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "Uvezi poÄetnom reÄenicom za raÄun" + }, + "infoHelp": { + "message": "Informacije i pomoć" + }, + "initialTransactionConfirmed": { + "message": "VaÅ¡u je poÄetnu transakciju potvrdila mreža. Kliknite na U REDU za natrag." + }, + "insufficientBalance": { + "message": "Nedovoljno raspoloživo stanje." + }, + "insufficientFunds": { + "message": "Nedovoljna sredstva." + }, + "insufficientTokens": { + "message": "Nedovoljno tokena." + }, + "invalidAddress": { + "message": "Nevaljana adresa" + }, + "invalidAddressRecipient": { + "message": "Adresa primatelja nije valjana" + }, + "knownAddressRecipient": { + "message": "Poznata ugovorna adresa." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "Ne mreža ETH, postavite na mala slova" + }, + "invalidInput": { + "message": "Nevaljani upis." + }, + "invalidRPC": { + "message": "Nevaljani URL RPC-a" + }, + "invalidBlockExplorerURL": { + "message": "Nevaljani URL Block Explorer-a" + }, + "invalidSeedPhrase": { + "message": "Nevaljana poÄetna reÄenica" + }, + "jsonFile": { + "message": "Datoteka JSON", + "description": "format for importing an account" + }, + "kovan": { + "message": "Testna mreža Kovan" + }, + "max": { + "message": "NajviÅ¡e" + }, + "learnMore": { + "message": "Saznajte viÅ¡e" + }, + "ledgerAccountRestriction": { + "message": "Treba se koristiti zadnjim raÄunom kako biste dodali novi raÄun." + }, + "letsGoSetUp": { + "message": "Da, obavimo postavljanje!" + }, + "likeToAddTokens": { + "message": "Želite li dodati ove tokene?" + }, + "links": { + "message": "Poveznice" + }, + "liveGasPricePredictions": { + "message": "PredviÄ‘anja uživo za cijenu goriva" + }, + "loading": { + "message": "UÄitavanje..." + }, + "loadingTokens": { + "message": "UÄitavanje tokena..." + }, + "loadMore": { + "message": "UÄitaj viÅ¡e" + }, + "lock": { + "message": "Odjava" + }, + "mainnet": { + "message": "Glavna mreža Ethereum" + }, + "memorizePhrase": { + "message": "Zapamtite ovu reÄenicu." + }, + "memo": { + "message": "podsjetnik" + }, + "message": { + "message": "Poruka" + }, + "metamaskDescription": { + "message": "Povezujete se na Ethereum i decentralizirani internet." + }, + "metamaskVersion": { + "message": "InaÄica usluge MetaMask" + }, + "mobileSyncText": { + "message": "UpiÅ¡ite svoju lozinku kako biste potvrdili da ste to vi!" + }, + "myAccounts": { + "message": "Moji raÄuni" + }, + "myWalletAccounts": { + "message": "Moji raÄuni za novÄanik" + }, + "myWalletAccountsDescription": { + "message": "Svi se vaÅ¡i raÄuni za MetaMask automatski dodaju u ovaj odjeljak." + }, + "mustSelectOne": { + "message": "Mora se odabrati barem jedan token." + }, + "needEtherInWallet": { + "message": "Trebate Ether u svojem novÄaniku kako biste ostvarili interakciju s decentraliziranim aplikacijama uporabom usluge MetaMask. " + }, + "needImportFile": { + "message": "Morate odabrati datoteku za uvoz.", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "Ne mogu se slati negativne vrijednosti ETH-a." + }, + "networkName": { + "message": "Naziv mreže" + }, + "networks": { + "message": "Mreže" + }, + "networkSettingsDescription": { + "message": "Dodaj i uredi prilagoÄ‘ene mreže RPC" + }, + "nevermind": { + "message": "Zanemari" + }, + "newAccount": { + "message": "Novi raÄun" + }, + "newAccountDetectedDialogMessage": { + "message": "Nova je adresa otkrivena! Ovdje kliknite za njezino dodavanje u vaÅ¡ imenik." + }, + "newAccountNumberName": { + "message": "RaÄun $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "Novi kontakt" + }, + "newContract": { + "message": "Novi ugovor" + }, + "newPassword": { + "message": "Nova lozinka (najmanje osam znakova)" + }, + "newNetwork": { + "message": "Nova mreža" + }, + "newToMetaMask": { + "message": "Novi korisnik usluge MetaMask?" + }, + "noAlreadyHaveSeed": { + "message": "Ne, već imam poÄetnu fazu" + }, + "protectYourKeys": { + "message": "ZaÅ¡titite svoje kljuÄeve!" + }, + "protectYourKeysMessage1": { + "message": "Pazite na svoju poÄetnu reÄenicu jer smo zaprimili prijave o postojanju mrežnih mjesta koja oponaÅ¡aju mrežno mjesto usluge MetaMask. Na mrežnom se mjestu MetaMask nikada ne traži vaÅ¡a poÄetna reÄenica!" + }, + "protectYourKeysMessage2": { + "message": "ZaÅ¡tite svoju reÄenicu. Ako vam se neÅ¡to Äini sumnjivim ili nemate povjerenja u mrežno mjesto, poÅ¡aljite nam elektroniÄku poruku na support@metamask.io" + }, + "rpcUrl": { + "message": "Novi URL RPC-a" + }, + "optionalChainId": { + "message": "Identifikacijska oznaka bloka (neobavezno)" + }, + "optionalSymbol": { + "message": "Simbol (neobavezno)" + }, + "newTotal": { + "message": "Novi ukupni zbroj" + }, + "newTransactionFee": { + "message": "Nova naknada za transakciju" + }, + "next": { + "message": "Sljedeće" + }, + "noAddressForName": { + "message": "Nijedna adresa nije postavljena za ovaj naziv." + }, + "noConversionRateAvailable": { + "message": "Nijedan konverzijski teÄaj nije dostupan" + }, + "noTransactions": { + "message": "Nemate transkacija" + }, + "notEnoughGas": { + "message": "Nema dovoljno goriva" + }, + "noWebcamFoundTitle": { + "message": "Mrežna kamera nije pronaÄ‘ena" + }, + "noWebcamFound": { + "message": "Mrežna kamera vaÅ¡eg raÄunala nije pronaÄ‘ena. PokuÅ¡ajte ponovno." + }, + "ofTextNofM": { + "message": "od" + }, + "orderOneHere": { + "message": "NaruÄite Trezor ili Ledger te Äuvajte svoja sredstva u hladnoj pohrani" + }, + "origin": { + "message": "Podrijetlo" + }, + "parameters": { + "message": "Parametri" + }, + "participateInMetaMetrics": { + "message": "Sudjelujte u anketi MetaMetrics" + }, + "participateInMetaMetricsDescription": { + "message": "Sudjelujte u anketi MetaMetrics kako biste nam pomogli poboljÅ¡ati uslugu MetaMask" + }, + "password": { + "message": "Zaporka" + }, + "passwordsDontMatch": { + "message": "Lozinke se ne podudaraju" + }, + "passwordNotLongEnough": { + "message": "Lozinka nije dovoljno duga" + }, + "pastePrivateKey": { + "message": "Ovdje zalijepite svoj privatni niz kljuÄa:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "na Äekanju" + }, + "personalAddressDetected": { + "message": "Otkrivena je osobna adresa. UpiÅ¡ite ugovornu adresu tokena." + }, + "prev": { + "message": "Prethodno" + }, + "primaryCurrencySetting": { + "message": "Glavna valuta" + }, + "primaryCurrencySettingDescription": { + "message": "Odaberite da se prvo prikazuju valute u osnovnoj valuti bloka (npr. ETH). Odaberite mogućnost Fiat za prikazivanje valuta u odabranoj valuti Fiat." + }, + "privacyMsg": { + "message": "Pravilnik o zaÅ¡titi privatnosti" + }, + "privateKey": { + "message": "Privatni kljuÄ", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "Upozorenje: nikada ne otkrivajte ovaj kljuÄ. Bilo tko s vaÅ¡im privatnim kljuÄevima može ukrasti bilo koju imovinu koja se nalazi na vaÅ¡em raÄunu." + }, + "privateNetwork": { + "message": "Privatna mreža" + }, + "queue": { + "message": "Red Äekanja" + }, + "readdToken": { + "message": "Ovaj token možete dodati kasnije odlaskom pod stavku „Dodaj token†u izborniku mogućnosti raÄuna. " + }, + "recents": { + "message": "Nedavno" + }, + "recipientAddress": { + "message": "Adresa primatelja" + }, + "recipientAddressPlaceholder": { + "message": "Pretraži, javne adrese (0x) ili ENS" + }, + "rejectAll": { + "message": "Odbaci sve" + }, + "rejectTxsN": { + "message": "Odbaci transakcije: $1" + }, + "rejectTxsDescription": { + "message": "Upravo ćete odbaciti skup transakcija $1." + }, + "rejected": { + "message": "OdbaÄeno" + }, + "reset": { + "message": "Ponovno postavi" + }, + "resetAccount": { + "message": "PoniÅ¡ti raÄun" + }, + "resetAccountDescription": { + "message": "PoniÅ¡tavanjem se raÄuna uklanja vaÅ¡a povijest transakcija." + }, + "deleteNetwork": { + "message": "Izbrisati mrežu?" + }, + "deleteNetworkDescription": { + "message": "Sigurno želite izbrisati ovu mrežu?" + }, + "remindMeLater": { + "message": "Podsjeti me kasnije" + }, + "restoreFromSeed": { + "message": "Obnoviti raÄun?" + }, + "restoreAccountWithSeed": { + "message": "Obnovite svoj raÄun poÄetnom reÄenicom" + }, + "requestsAwaitingAcknowledgement": { + "message": "zahtjevi se trebaju odobriti" + }, + "required": { + "message": "Zahtijeva se" + }, + "restore": { + "message": "Vrati" + }, + "revealSeedWords": { + "message": "Otkrij poÄetne rijeÄi" + }, + "revealSeedWordsTitle": { + "message": "PoÄetna reÄenica" + }, + "revealSeedWordsDescription": { + "message": "Ako ikada promijenite preglednike ili raÄunala, trebate ovu poÄetnu reÄenicu za pristupanje svojim raÄunima. Spremite ih negdje na sigurno i tajno mjesto." + }, + "revealSeedWordsWarningTitle": { + "message": "NE DIJELITE ovu reÄenicu ni s kim!" + }, + "revealSeedWordsWarning": { + "message": "Ove se rijeÄi mogu upotrijebiti za kraÄ‘u vaÅ¡ih raÄuna." + }, + "remove": { + "message": "Ukloni" + }, + "removeAccount": { + "message": "Uklanjanje raÄuna" + }, + "removeAccountDescription": { + "message": "Ovaj se raÄun uklanja iz vaÅ¡eg novÄanika. Provjerite imate li izvornu poÄetnu reÄenicu ili privatni kljuÄ za ovaj uvezeni raÄun prije nastavka. Ponovno možete uvoziti ili stvarati raÄune uporabom padajućeg izbornika za raÄun." + }, + "readyToConnect": { + "message": "Sve je spremno za povezivanje?" + }, + "rinkeby": { + "message": "Testna mreža Rinkeby" + }, + "ropsten": { + "message": "Testna mreža Ropsten" + }, + "goerli": { + "message": "Testna mreža Goerli" + }, + "save": { + "message": "Spremi" + }, + "slow": { + "message": "Sporo" + }, + "slower": { + "message": "Sporije" + }, + "saveAsCsvFile": { + "message": "Spremi kao datoteku CSV" + }, + "scanInstructions": { + "message": "Postavite kôd QR ispred kamere" + }, + "scanQrCode": { + "message": "Skeniraj kôd QR" + }, + "search": { + "message": "Traži" + }, + "searchResults": { + "message": "Rezultati pretraživanja" + }, + "secretBackupPhrase": { + "message": "Alternativna tajna reÄenica" + }, + "secretBackupPhraseDescription": { + "message": "VaÅ¡om se alternativnom tajnom reÄenicom jednostavno sigurnosno kopira i obnavlja vaÅ¡ raÄun." + }, + "secretBackupPhraseWarning": { + "message": "UPOZORENJE: nikada ne otkrivajte svoju alternativnu reÄenicu. Bilo tko ovom reÄenicom može zauvijek preuzeti vaÅ¡ Ether." + }, + "secretPhrase": { + "message": "Ovdje upiÅ¡ite svoju tajnu reÄenicu od 12 rijeÄi kako biste obnovili svoj sef." + }, + "securityAndPrivacy": { + "message": "Sigurnost i privatnost" + }, + "securitySettingsDescription": { + "message": "Postavke privatnosti i poÄetna reÄenica novÄanika" + }, + "seedPhrasePlaceholder": { + "message": "Odvojite pojedinaÄne rijeÄi jednim razmakom" + }, + "seedPhraseReq": { + "message": "PoÄetne reÄenice imaju 12 rijeÄi" + }, + "selectCurrency": { + "message": "Odaberite valutu" + }, + "selectEachPhrase": { + "message": "Odaberite svaku reÄenicu kako biste provjerili je li toÄna." + }, + "selectLocale": { + "message": "Odaberi lokalnu postavku" + }, + "selectType": { + "message": "Odaberi vrstu" + }, + "send": { + "message": "PoÅ¡alji" + }, + "sendAmount": { + "message": "Odaberi iznos" + }, + "sendETH": { + "message": "PoÅ¡alji ETH" + }, + "sendTokens": { + "message": "PoÅ¡alji tokene" + }, + "sentEther": { + "message": "poÅ¡alji ether" + }, + "sentTokens": { + "message": "poÅ¡alji tokene" + }, + "separateEachWord": { + "message": "Odvojite pojedinaÄne rijeÄi jednim razmakom" + }, + "searchTokens": { + "message": "Pretraži tokene" + }, + "selectAnAccount": { + "message": "Odaberi raÄun" + }, + "selectAnAccountHelp": { + "message": "Odaberi raÄun za prikaz u usluzi MetaMask" + }, + "selectAHigherGasFee": { + "message": "Odaberite viÅ¡u naknadu za gorivo kako biste ubrzali obraÄ‘ivanje vaÅ¡e transakcije.*" + }, + "selectHdPath": { + "message": "Odaberi put HD-a" + }, + "selectPathHelp": { + "message": "Ako ne vidite u nastavku postojeće raÄune Ledger, pokuÅ¡ajte promijeniti puteve na „NasljeÄ‘e (MEW / MyCrypto)â€" + }, + "settings": { + "message": "Postavke" + }, + "showAdvancedGasInline": { + "message": "Napredno upravljanje gorivom" + }, + "showAdvancedGasInlineDescription": { + "message": "Odaberite ovu stavku za prikaz cijene goriva i izravno ograniÄite kontrole prilikom slanja i potvrÄ‘ivanja zaslona." + }, + "showFiatConversionInTestnets": { + "message": "Prikaži konverziju na usluzi Testnets" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Odaberite ovu stavku za prikaz ravne konverzije na usluzi Testnets" + }, + "showPrivateKeys": { + "message": "Prikaži privatne kljuÄe" + }, + "showHexData": { + "message": "Prikaži podatke Hex" + }, + "showHexDataDescription": { + "message": "Odaberite ovu stavku za prikaz polja namijenjenog za podatke hex na zaslonu za slanje" + }, + "sign": { + "message": "Potpis" + }, + "signatureRequest": { + "message": "Zahtjev za potpisom" + }, + "signed": { + "message": "Potpisano" + }, + "signNotice": { + "message": "Potpisivanje ove poruke može\nimati opasne neželjene uÄinke. Samo potpisujte poruke\ns mrežnih mjesta u koja imate potpuno povjerenje kada je rijeÄ o vaÅ¡em cijelom raÄunu.\nOvaj se opasni naÄin uklanja u sljedećoj inaÄici." + }, + "sigRequest": { + "message": "Zahtjev za potpisom" + }, + "somethingWentWrong": { + "message": "Ups! NeÅ¡to je poÅ¡lo po zlu." + }, + "speedUp": { + "message": "Ubrzaj" + }, + "speedUpCancellation": { + "message": "Ubrzaj ovo otkazivanje" + }, + "speedUpTransaction": { + "message": "Ubrzaj ovu transakciju" + }, + "switchNetworks": { + "message": "Promijeni mreže" + }, + "stateLogs": { + "message": "Zapisnici stanja" + }, + "stateLogsDescription": { + "message": "U zapisnicima se stanja nalaze javne adrese raÄuna i poslane transakcije." + }, + "stateLogError": { + "message": "GreÅ¡ka u dohvaćanju zapisnika stanja." + }, + "step1HardwareWallet": { + "message": "1. Povežite se na svoj hardverski novÄanik" + }, + "step1HardwareWalletMsg": { + "message": "Povežite svoj hardverski novÄanik izravno na svoje raÄunalo." + }, + "step2HardwareWallet": { + "message": "2. Odaberite raÄun" + }, + "step2HardwareWalletMsg": { + "message": "Odaberite raÄun koji želite pregledati. Istovremeno možete odabrati samo jedan raÄun za pregled." + }, + "step3HardwareWallet": { + "message": "3. ZapoÄnite upotrebljavati dApps i viÅ¡e!" + }, + "step3HardwareWalletMsg": { + "message": "Upotrebljavajte svoj hardverski raÄun kako biste upotrebljavali bilo koji drugi raÄun Ethereum. Prijavite se u dApps, Å¡aljite Eth, kupujte i pohranjujte ERC20 tokene i nezamjenske tokene kao CryptoKitties." + }, + "storePhrase": { + "message": "Spremite ovu reÄenicu u upravitelj lozinkama poput aplikacije 1Password." + }, + "submitted": { + "message": "Poslano" + }, + "supportCenter": { + "message": "Posjetite naÅ¡ centar za podrÅ¡ku." + }, + "symbol": { + "message": "Simbol" + }, + "symbolBetweenZeroTwelve": { + "message": "Simbol mora biti 11 znakova ili manje." + }, + "syncWithMobile": { + "message": "Sinkroniziraj s mobilnim telefonom" + }, + "syncWithMobileTitle": { + "message": "Sinkroniziraj s mobilnim telefonom" + }, + "syncWithMobileDesc": { + "message": "Možete sinkronizirati svoje raÄune i informacije s vaÅ¡im mobilnim telefonom. Otvorite mobilnu aplikaciju MetaMask, idite u stavku „Postavke†i dodirnite „Sinkroniziraj iz dodatka preglednikaâ€" + }, + "syncWithMobileDescNewUsers": { + "message": "Kad otvorite mobilnu aplikaciju MetaMask po prvi puta, pridržavajte se koraka koji se prikazuju na telefonu." + }, + "syncWithMobileScanThisCode": { + "message": "Skenirajte ovaj kôd uporabom mobilne aplikacije MetaMask" + }, + "syncWithMobileBeCareful": { + "message": "Pazite da nitko ne gleda u vaÅ¡ zaslon dok skenirate ovaj kôd" + }, + "syncWithMobileComplete": { + "message": "VaÅ¡i su podatci uspjeÅ¡no sinkronizirani. Uživajte u mobilnoj aplikaciji MetaMask!" + }, + "terms": { + "message": "Odredbe uporabe" + }, + "testFaucet": { + "message": "Testni snop" + }, + "thisWillCreate": { + "message": "Ovom se radnjom stvara novi novÄanik i poÄetna reÄenica" + }, + "tips": { + "message": "Napojnice" + }, + "to": { + "message": "Primatelj" + }, + "tokenAlreadyAdded": { + "message": "Token je već dodan." + }, + "tokenContractAddress": { + "message": "Ugovorna adresa tokena" + }, + "tokenSymbol": { + "message": "Simbol tokena" + }, + "total": { + "message": "Ukupno" + }, + "transaction": { + "message": "transakcija" + }, + "transactionConfirmed": { + "message": "Transakcija je potvrÄ‘ena u $2." + }, + "transactionCreated": { + "message": "Stvorena je transakcija u vrijednosti od $1 u $2." + }, + "transactionDropped": { + "message": "Transakcija je bila neuspjeÅ¡na u $2." + }, + "transactionSubmitted": { + "message": "Transakcija je poslana s naknadom za gorivo od $1 u $2." + }, + "transactionResubmitted": { + "message": "Transakcija je ponovno poslana s naknadom za gorivo povećanom do vrijednosti od $1 u $2." + }, + "transactionUpdated": { + "message": "Transakcija je ažurirana u $2." + }, + "transactionErrored": { + "message": "DoÅ¡lo je do greÅ¡ke prilikom transakcije." + }, + "transactionCancelAttempted": { + "message": "PokuÅ¡ano je otkazivanje transakcije s naknadom za gorivo od $1 u $2" + }, + "transactionCancelSuccess": { + "message": "Transakcija je uspjeÅ¡no otkazana u $2" + }, + "transactionError": { + "message": "GreÅ¡ka transakcije. Iznimka u kôdu ugovora." + }, + "transactionErrorNoContract": { + "message": "PokuÅ¡ava se pozvati funkcija na neugovornoj adresi." + }, + "transactionFee": { + "message": "Naknada za transakciju" + }, + "transactionTime": { + "message": "Vrijeme transkacije" + }, + "transfer": { + "message": "Prenesi" + }, + "transferBetweenAccounts": { + "message": "Prenesi izmeÄ‘u mojih raÄuna" + }, + "transferFrom": { + "message": "Prenesi od" + }, + "troubleTokenBalances": { + "message": "Imamo problema s uÄitavanjem raspoloživog stanja vaÅ¡ih tokena. Možete ih vidjeti", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "PokuÅ¡aj ponovo" + }, + "typePassword": { + "message": "UpiÅ¡ite svoju lozinku MetaMask." + }, + "unapproved": { + "message": "Neodobreno" + }, + "units": { + "message": "jedinice/a" + }, + "unknown": { + "message": "Nepoznato" + }, + "unknownNetwork": { + "message": "Nepoznata privatna mreža" + }, + "unknownQrCode": { + "message": "GreÅ¡ka: ne možemo identificirati kôd QR" + }, + "unknownCameraErrorTitle": { + "message": "Ups! NeÅ¡to je poÅ¡lo po zlu..." + }, + "unknownCameraError": { + "message": "DoÅ¡lo je do greÅ¡ke prilikom pokuÅ¡aja pristupanja vaÅ¡oj kameri. PokuÅ¡ajte ponovno..." + }, + "unlock": { + "message": "OtkljuÄaj" + }, + "unlockMessage": { + "message": "Decentralizirani internet Äeka" + }, + "updatedWithDate": { + "message": "Ažurirano $1" + }, + "urlErrorMsg": { + "message": "URI-jevima se zahtijeva prikladan prefiks HTTP/HTTPS." + }, + "usedByClients": { + "message": "Upotrebljavaju brojni klijenti" + }, + "userName": { + "message": "KorisniÄko ime" + }, + "viewAccount": { + "message": "Prikaz raÄuna" + }, + "viewinExplorer": { + "message": "Prikaži u Exploreru" + }, + "viewContact": { + "message": "Prikaži kontakt" + }, + "viewOnCustomBlockExplorer": { + "message": "Prikaži u $1" + }, + "viewOnEtherscan": { + "message": "Prikaži na Etherscanu" + }, + "visitWebSite": { + "message": "Posjetite naÅ¡e mrežno mjesto" + }, + "walletSeed": { + "message": "PoÄetni novÄanik" + }, + "welcomeBack": { + "message": "Dobro doÅ¡li natrag!" + }, + "welcome": { + "message": "Dobro doÅ¡li u uslugu MetaMask" + }, + "writePhrase": { + "message": "ZapiÅ¡ite ovu reÄenicu na komad papira i pohranite je na sigurnom mjestu. Ako je želite joÅ¡ bolje zaÅ¡tititi, zapiÅ¡ite je na viÅ¡e komada papira, a zatim svaki komad pohranite na dva do tri drugaÄija mjesta." + }, + "yesLetsTry": { + "message": "Da, isprobajmo" + }, + "youNeedToAllowCameraAccess": { + "message": "Trebate dopustiti pristupanje kameri za koriÅ¡tenje ovom funkcijom." + }, + "yourSigRequested": { + "message": "VaÅ¡ se potpis zahtijeva" + }, + "youSign": { + "message": "Vi potpisujete" + }, + "yourPrivateSeedPhrase": { + "message": "VaÅ¡a privatna poÄetna reÄenica" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "Nulta cijena goriva kod ubrzavanja" + } +} diff --git a/app/_locales/ht/messages.json b/app/_locales/ht/messages.json index 720c35889c46..6881d8a1848c 100644 --- a/app/_locales/ht/messages.json +++ b/app/_locales/ht/messages.json @@ -1,46 +1,4 @@ { - "privacyMode": { - "message": "Mòd Privacy" - }, - "privacyModeDescription": { - "message": "Sou sit entènèt yo dwe mande aksè pou wè enfòmasyon kont ou." - }, - "exposeAccounts": { - "message": "Ekspoze Kont" - }, - "exposeDescription": { - "message": "Ekspoze kont sou sitwèb aktyèl la. Itil pou dapps eritaj." - }, - "confirmExpose": { - "message": "Èske ou sèten ou vle ekspoze kont ou sou sit entènèt aktyèl la?" - }, - "confirmClear": { - "message": "Èske ou sèten ou vle klè sitwèb apwouve?" - }, - "clearApprovalDataSuccess": { - "message": "Done sou sit wèb apwouve yo te klarifye avèk siksè." - }, - "approvalData": { - "message": "Done sou vi prive" - }, - "approvalDataDescription": { - "message": "Done sou vi prive klè pou tout sit entènèt yo dwe mande aksè pou wè enfòmasyon kont ankò." - }, - "clearApprovalData": { - "message": "Klè Done sou vi prive" - }, - "providerAPIRequest": { - "message": "Ethereum API Mande" - }, - "reviewProviderRequest": { - "message": "Tanpri revize sa API demann Ethereum." - }, - "providerRequestInfo": { - "message": "Domèn ki nan lis anba a ap mande pou jwenn aksè a blòkchou Ethereum ak pou wè kont ou ye kounye a. Toujou double tcheke ke ou sou sit ki kòrèk la anvan apwouve aksè." - }, - "accept": { - "message": "Aksepte" - }, "accessingYourCamera": { "message": "Aksè a Kamera" }, @@ -62,12 +20,6 @@ "activityLog": { "message": "aktivite ki fèt" }, - "address": { - "message": "Adrès" - }, - "addCustomToken": { - "message": "Ajoute token" - }, "addToken": { "message": "Ajoute Token" }, @@ -83,9 +35,6 @@ "amount": { "message": "Kantite lajan" }, - "amountPlusGas": { - "message": "Kantite lajan + Gaz" - }, "appDescription": { "message": "Ekstansyon Navigatè Ethereum", "description": "The description of the application" @@ -112,58 +61,27 @@ "attributions": { "message": "Atribisyon" }, - "available": { - "message": "Disponib" - }, "back": { "message": "Retounen" }, "balance": { "message": "Balans" }, - "balances": { - "message": "Balans Token" - }, - "balanceIsInsufficientGas": { - "message": "Ensifizan balans pou total gaz aktyèl la" - }, - "beta": { - "message": "BETA" - }, - "betweenMinAndMax": { - "message": "dwe plis pase oswa egal a $ 1 mwens ke oswa egal a $ 2.", - "description": "helper for inputting hex as decimal input" - }, "blockiesIdenticon": { "message": "Itilize Blockies Identicon" }, - "borrowDharma": { - "message": "Prete Avèk Dharma (Beta)" - }, "browserNotSupported": { "message": "Navigatè ou a pa sipòte..." }, "builtInCalifornia": { "message": "MetaMask fèt e bati nan California." }, - "buy": { - "message": "Achte" - }, - "buyCoinbase": { - "message": "Achte sou Coinbase" - }, - "buyCoinbaseExplainer": { - "message": "Coinbase se fason ki pi popilè nan mond lan yo achte ak vann Bitcoin, Ethereum, ak Litecoin." - }, "buyCoinSwitch": { "message": "Achte sou CoinSwitch" }, "buyCoinSwitchExplainer": { "message": "CoinSwitch se destinasyon nan yon sèl-Stop nan echanj plis pase 300 kriptoksèr nan pousantaj la pi byen." }, - "bytes": { - "message": "Bytes" - }, "ok": { "message": "Oke" }, @@ -176,18 +94,6 @@ "cancellationGasFee": { "message": "Anilasyon Gaz Chaj" }, - "cancelN": { - "message": "Anile tout $ 1 tranzaksyon" - }, - "classicInterface": { - "message": "Sèvi ak fas klasik la" - }, - "clickCopy": { - "message": "Klike sou kopi" - }, - "clickToAdd": { - "message": "Klike sou $ 1 pou ajoute yo nan kont ou" - }, "close": { "message": "Fèmen" }, @@ -200,24 +106,15 @@ "confirmed": { "message": "Konfime" }, - "confirmContract": { - "message": "Konfime Kontra" - }, "confirmPassword": { "message": "Konfime Modpas" }, - "confirmTransaction": { - "message": "Konfime Tranzaksyon" - }, "connectHardwareWallet": { "message": "Konekte Materyèl Wallet" }, "connect": { "message": "Konekte" }, - "connecting": { - "message": "Koneksyon..." - }, "connectingToKovan": { "message": "Konekte nan Kovan Tès Rezo a" }, @@ -230,54 +127,21 @@ "connectingToRinkeby": { "message": "Konekte nan Rinkeby Tès Rezo a" }, - "connectingToUnknown": { - "message": "Konekte nan rezo enkoni" - }, - "connectToLedger": { - "message": "Konekte ak Ledger" - }, - "connectToTrezor": { - "message": "Konekte ak Trezor" - }, - "continue": { - "message": "Kontinye" - }, - "continueToCoinbase": { - "message": "Kontinye Coinbase" - }, "continueToCoinSwitch": { "message": "Kontinye CoinSwitch" }, "contractDeployment": { "message": "Kontra Deplwaman" }, - "conversionProgress": { - "message": "Konvèsyon nan Pwogrè" - }, - "copiedButton": { - "message": "Kopye" - }, - "copiedClipboard": { - "message": "Kopi nan Clipboard" - }, "copiedExclamation": { "message": "Kopye!" }, - "copiedSafe": { - "message": "Mwen te kopye li yon kote ki san danje" - }, - "copy": { - "message": "Kopye" - }, "copyAddress": { "message": "Kopi adrès clipboard" }, "copyToClipboard": { "message": "Kopi clipboard" }, - "copyButton": { - "message": " Kopi " - }, "copyPrivateKey": { "message": "Sa a se kle prive ou (klike pou ou kopye)" }, @@ -287,34 +151,15 @@ "createAccount": { "message": "Kreye Kont" }, - "createDen": { - "message": "Kreye" - }, - "crypto": { - "message": "Crypto", - "description": "Exchange type (cryptocurrencies)" - }, - "currentConversion": { - "message": "Konvèsyon aktyèl" - }, "currentLanguage": { "message": "Lang Aktyèl" }, - "currentNetwork": { - "message": "Rezo aktyèl" - }, - "currentRpc": { - "message": "Aktyèl RPC" - }, "customGas": { "message": "Koutim Gaz" }, "customToken": { "message": "Koutim Token" }, - "customize": { - "message": "Koutim" - }, "customRPC": { "message": "Koutim RPC" }, @@ -327,39 +172,15 @@ "defaultNetwork": { "message": "Dfo rezo a pou tranzaksyon Ether se Mainnet." }, - "denExplainer": { - "message": "DEN ou se depo modpas avèk chif ou nan MetaMask." - }, "deposit": { "message": "Depo" }, - "depositBTC": { - "message": "Depoze BTC ou nan adrès ki anba a:" - }, - "depositEth": { - "message": "Depo Eth" - }, "depositEther": { "message": "Depo Ether" }, - "depositFiat": { - "message": "Depo ak Fiat" - }, - "depositFromAccount": { - "message": "Depo nan yon lòt kont" - }, - "depositShapeShift": { - "message": "Depo avèk ShapeShift" - }, - "depositShapeShiftExplainer": { - "message": "Si ou posede lòt cryptocurrencies, ou ka chanje ak depo Ether dirèkteman nan Wallet MetaMask ou. Pa gen kont ki nesesè." - }, "details": { "message": "Detay yo" }, - "directDeposit": { - "message": "Depo Dirèk" - }, "directDepositEther": { "message": "Dirèkteman Depo Ether" }, @@ -384,48 +205,21 @@ "edit": { "message": "Korije" }, - "editAccountName": { - "message": "Korije Non Kont" - }, - "editingTransaction": { - "message": "Fè chanjman nan tranzaksyon ou" - }, - "emailUs": { - "message": "Imèl nou!" - }, - "encryptNewDen": { - "message": "Ankripte nouvo DEN ou" - }, - "ensNameNotFound": { - "message": "Nou pa jwenn non ENS ou a" - }, "enterPassword": { "message": "Mete modpas" }, - "enterPasswordConfirm": { - "message": "Antre nan modpas ou a konfime" - }, "enterPasswordContinue": { "message": "Mete modpas pou kontinye" }, - "eth": { - "message": "ETH" - }, "etherscanView": { "message": "Gade kont sou Etherscan" }, - "exchangeRate": { - "message": "Chanje to" - }, "expandView": { "message": "Elaji Wè" }, "exportPrivateKey": { "message": "Voye Kòd Prive" }, - "exportPrivateKeyWarning": { - "message": "Voye kle prive ak pwòp risk ou." - }, "failed": { "message": "Tonbe" }, @@ -437,61 +231,27 @@ "message": "Enpòte dosye ki pa travay? Klike la a!", "description": "Helps user import their account from a JSON file" }, - "followTwitter": { - "message": "Swiv nou sou Twitter" - }, "forgetDevice": { "message": "Bliye aparèy sa a" }, "from": { "message": "Soti nan" }, - "fromToSame": { - "message": "Adrès orijinal le ak sa ou resevwa pake menm" - }, - "fromShapeShift": { - "message": "Soti nan ShapeShift" - }, "functionType": { "message": "Kalite Fonksyon" }, - "gas": { - "message": "Gaz", - "description": "Short indication of gas cost" - }, - "gasFee": { - "message": "Frè gaz" - }, "gasLimit": { "message": "Limit gaz" }, - "gasLimitCalculation": { - "message": "Nou kalkile gaz limit sijere a ki baze sou pousantaj siksè rezo a." - }, - "gasLimitRequired": { - "message": "Limit gaz nesesè" - }, "gasLimitTooLow": { "message": "Limit gaz dwe omwen 21000" }, "gasUsed": { "message": "Gaz yo Itilize" }, - "generatingSeed": { - "message": "Grenn jenerasyon..." - }, "gasPrice": { "message": "Pri gaz (GWEI)" }, - "gasPriceCalculation": { - "message": "Nou kalkile pri yo gaz ki sijere ki baze sou pousantaj siksè rezo." - }, - "gasPriceRequired": { - "message": "Pri Gaz la Egzije" - }, - "generatingTransaction": { - "message": "Tranzaksyon kap fè" - }, "getEther": { "message": "Jwenn Ether" }, @@ -502,10 +262,6 @@ "getHelp": { "message": "Jwenn èd." }, - "greaterThanMin": { - "message": "dwe pi gran pase oswa egal a $ 1.", - "description": "helper for inputting hex as decimal input" - }, "hardware": { "message": "materyèl" }, @@ -525,30 +281,15 @@ "message": "isit la", "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, - "hereList": { - "message": "Isit la nan yon lis !!!!" - }, - "hexData": { - "message": "Hex Data" - }, "hide": { "message": "Kache" }, - "hideToken": { - "message": "Kache Token" - }, "hideTokenPrompt": { "message": "Kache Token?" }, "history": { "message": "Istwa" }, - "howToDeposit": { - "message": "Ki jan ou ta renmen depo Ether?" - }, - "holdEther": { - "message": "Li pèmèt ou kenbe ether & tokens, epi sèvi kòm on pon pou desantralize aplikasyon." - }, "import": { "message": "Pòte", "description": "Button to import an account from a selected file" @@ -559,12 +300,6 @@ "importAccountMsg": { "message": " Kont pòte pa pral asosye avèk orijinal ou te kreye nan kont MetaMask seed fraz. Aprann plis sou kont enpòte " }, - "importAnAccount": { - "message": "Pòte yon kont" - }, - "importDen": { - "message": "Pòte ki deja egziste DEN" - }, "imported": { "message": "Pòte", "description": "status showing that an account has been fully loaded into the keyring" @@ -572,9 +307,6 @@ "importUsingSeed": { "message": "Pòte lè sèvi avèk seed fraz" }, - "info": { - "message": "Enfo" - }, "infoHelp": { "message": "Enfo & Èd" }, @@ -593,37 +325,25 @@ "invalidAddressRecipient": { "message": "Moun ki resevwa adrès la pa valab" }, - "invalidGasParams": { - "message": "Gaz Paramèt la pa valab" - }, "invalidInput": { "message": "Sa ou rantre a pa valab" }, - "invalidRequest": { - "message": "Demann pa valab" - }, "invalidRPC": { "message": "RPC URI pa valab" }, + "invalidBlockExplorerURL": { + "message": "Block Explorer URI pa valab" + }, "invalidSeedPhrase": { "message": "Seed fraz pa valab" }, - "jsonFail": { - "message": "Yon bagay ale mal. Tanpri, asire w ke dosye JSON ou an byen fòmate." - }, "jsonFile": { "message": "JSON Dosye", "description": "format for importing an account" }, - "keepTrackTokens": { - "message": "Gade tokens yo ou te achte ak kont MetaMask ou." - }, "kovan": { "message": "Kovan Tès Rezo" }, - "knowledgeDataBase": { - "message": "Vizite baz nou an" - }, "max": { "message": "Maksimòm" }, @@ -633,64 +353,33 @@ "ledgerAccountRestriction": { "message": "Ou bezwen sèvi ak dènye kont ou anvan ou ka ajoute yon nouvo." }, - "lessThanMax": { - "message": "dwe mwens pase oswa egal a $ 1.", - "description": "helper for inputting hex as decimal input" - }, "likeToAddTokens": { "message": "Èske ou ta renmen ajoute sa nan tokens?" }, "links": { "message": "Lyen" }, - "limit": { - "message": "Limitasyon" - }, "loading": { "message": "Telechaje..." }, "loadingTokens": { "message": "Telechaje Tokens..." }, - "localhost": { - "message": "Localhost 8545" - }, - "login": { - "message": "Ouvri" - }, - "logout": { + "lock": { "message": "Dekonekte" }, - "loose": { - "message": "Pèdi" - }, - "loweCaseWords": { - "message": "seed mo sèlman gen karaktè miniskil" - }, "mainnet": { "message": "Prensipal Ethereum Rezo a" }, - "menu": { - "message": "Opsyon" - }, "message": { "message": "Mesaje" }, "metamaskDescription": { "message": "MetaMask sekirize idantite pou Ethereum." }, - "metamaskSeedWords": { - "message": "MetaMask Seed Mo" - }, "metamaskVersion": { "message": "MetaMask Vèsyon" }, - "min": { - "message": "Minimòm" - }, - "missingYourTokens": { - "message": "Ou pa wè token ou a?" - }, "myAccounts": { "message": "Kont mwen" }, @@ -704,10 +393,6 @@ "message": "Ou dwe chwazi yon dosye pou enpòte.", "description": "User is important an account and needs to add a file to continue" }, - "needImportPassword": { - "message": "Ou dwe antre nan yon modpas pou dosye ou te chwazi a.", - "description": "Password and file needed to import an account" - }, "negativeETH": { "message": "Pa ka voye kantite lajan negatif ETH." }, @@ -730,116 +415,52 @@ "newPassword": { "message": "Nouvo modpas (minit 8)" }, - "newPassword8Chars": { - "message": "Nouvo modpas (minit 8)" - }, - "newRecipient": { - "message": "Nouvo Benefisyè" - }, - "newRPC": { - "message": "Nouvo RPC URL" - }, "next": { "message": "Aprè sa" }, "noAddressForName": { "message": "Pa gen adrès ki etabli pou non sa a." }, - "noDeposits": { - "message": "Pa gen depo ou te resevwa" - }, "noConversionRateAvailable": { "message": "Pa gen okenn Konvèsyon Disponib" }, - "noTransactionHistory": { - "message": "Pa gen istwa tranzaksyon." - }, "noTransactions": { "message": "Pa gen tranzaksyon" }, - "notFound": { - "message": "Pa jwenn" - }, - "notStarted": { - "message": "Pa kòmanse" - }, "noWebcamFoundTitle": { "message": "Pa jwenn webcam" }, "noWebcamFound": { "message": "Nou pakay jwenn webcam òdinatè ou. Tanpri eseye ankò." }, - "oldUI": { - "message": "Ansyen Itilizatè kouòdone" - }, - "oldUIMessage": { - "message": "Ou te retounen nan Ansyen Itilizatè kouòdone. Ou ka chanje tounen nan nouvo Ansyen Itilizatè nan opsyon a nan meni an tèt la." - }, - "onlySendToEtherAddress": { - "message": "Sèlman voye ETH nan yon adrès Ethereum." - }, - "onlySendTokensToAccountAddress": { - "message": "Sèlman voye $ 1 nan yon adrès kont Ethereum.", - "description": "displays token symbol" - }, - "openInTab": { - "message": "Louvri nan etikèt" - }, - "or": { - "message": "oubyen", - "description": "choice between creating or importing a new account" - }, "orderOneHere": { "message": "Mete nan lòd on Trezor oswa Ledger epi kenbe lajan ou nan yon stòk frèt." }, "origin": { "message": "Orijin" }, - "outgoing": { - "message": "Ap kite" - }, "parameters": { "message": "Paramèt" }, "password": { "message": "Modpas" }, - "passwordCorrect": { - "message": "Tanpri asire ke modpas ou kòrèk." - }, "passwordsDontMatch": { "message": "Modpas pa matche" }, - "passwordMismatch": { - "message": "modpas sa pa menm", - "description": "in password creation process, the two new password fields did not match" - }, "passwordNotLongEnough": { "message": "Modpas pa lontan ase" }, - "passwordShort": { - "message": "modpas pa sifi", - "description": "in password creation process, the password is not long enough to be secure" - }, "pastePrivateKey": { "message": "Kole fraz prive ou a la:", "description": "For importing an account from a private key" }, - "pasteSeed": { - "message": "Kole seed fraz ou a la!" - }, "pending": { "message": "l ap mache" }, "personalAddressDetected": { "message": "Adrès pèsonèl detekte. Antre adrès kontra token la." }, - "pleaseReviewTransaction": { - "message": "Tanpri revize tranzaksyon ou." - }, - "popularTokens": { - "message": "Popilè Tokens" - }, "prev": { "message": "Avan" }, @@ -862,30 +483,12 @@ "privateNetwork": { "message": "Rezo Prive" }, - "qrCode": { - "message": "Montre QR Kòd" - }, - "queue": { - "message": "Queue" - }, "readdToken": { "message": "Ou ka ajoute token sa aprè sa ankò ou prale nan \"Ajoute token\" nan opsyon meni kont ou an." }, - "readMore": { - "message": "Li plis isit la." - }, - "readMore2": { - "message": "Li plis isit la." - }, - "receive": { - "message": "Resevwa" - }, "recipientAddress": { "message": "Adrès pou resevwa" }, - "refundAddress": { - "message": "Adrès pou resevwa" - }, "reject": { "message": "Rejte" }, @@ -913,18 +516,12 @@ "restoreFromSeed": { "message": "Restore kont?" }, - "restoreVault": { - "message": "Retabli kazye" - }, "restoreAccountWithSeed": { "message": "Retabli kont ou avèk yo Seed Fraz" }, "required": { "message": "Egzije" }, - "retryWithMoreGas": { - "message": "Reseye ak yon pri gaz pi wo isit la" - }, "restore": { "message": "Retabli" }, @@ -943,9 +540,6 @@ "revealSeedWordsWarning": { "message": "Yo ka itilize mo sa pou vòlè kont ou." }, - "revert": { - "message": "Retounen" - }, "remove": { "message": "retire" }, @@ -964,26 +558,12 @@ "ropsten": { "message": "Ropsten Tès Rezo" }, - "rpc": { - "message": "Koutim RPC" - }, - "sampleAccountName": { - "message": "Pa egzanp, Nouvo kont mwen an", - "description": "Help user understand concept of adding a human-readable name to their account" - }, "save": { "message": "Sove" }, "saveAsCsvFile": { "message": "Sove kòm dosye CSV" }, - "saveAsFile": { - "message": "Sove kòm dosye", - "description": "Account export process" - }, - "saveSeedAsFile": { - "message": "Sove pawòl seed kòm dosye" - }, "scanInstructions": { "message": "Mete kòd QR la devan kamera ou" }, @@ -1002,18 +582,12 @@ "seedPhraseReq": { "message": "Seed fraz yo se 12 long mo" }, - "select": { - "message": "Chwazi" - }, "selectCurrency": { "message": "Chwazi Lajan" }, "selectLocale": { "message": "Chwazi Lokasyon" }, - "selectService": { - "message": "Chwazi Sèvis" - }, "selectType": { "message": "Chwazi Kalite" }, @@ -1038,9 +612,6 @@ "searchTokens": { "message": "Rechèch Tokens" }, - "selectAnAddress": { - "message": "Chwazi yon adrès" - }, "selectAnAccount": { "message": "Chwazi yon kont" }, @@ -1053,21 +624,12 @@ "selectPathHelp": { "message": "Si ou pa wè kont Ledger ou te genyen an anba a, eseye chanje chemen an \"Eritaj (MEW / MyCrypto)\"" }, - "sendTokensAnywhere": { - "message": "Voye Tokens pou nenpòt moun ki gen yon kont Ethereum" - }, "settings": { "message": "Paramèt" }, - "shapeshiftBuy": { - "message": "Achte avèk Shapeshift" - }, "showPrivateKeys": { "message": "Montre Kle Prive" }, - "showQRCode": { - "message": "Montre Kòd QR" - }, "showHexData": { "message": "Montre Hex Data" }, @@ -1083,36 +645,15 @@ "signed": { "message": "Te Siyen" }, - "signMessage": { - "message": "Siyen mesaj" - }, "signNotice": { "message": "Lè w siyen mesaj sa a ka gen efè segondè ki \ndanjere. Sèlman \nsit mesaj ki soti nan sit ou konplètman fè konfyans ak tout kont ou. \n Metòd danjere sa yo pral retire nan yon vèsyon fiti. " }, "sigRequest": { "message": "Demann Siyati" }, - "sigRequested": { - "message": "Demann Siyati" - }, - "spaceBetween": { - "message": "ka gen sèlman yon espas ant mo yo" - }, "speedUp": { "message": "pi vit" }, - "speedUpTitle": { - "message": "Monte vitès tranzaksyon" - }, - "speedUpSubtitle": { - "message": "Ogmante pri gaz ou pou eseye efase tranzaksyon ou pi vit" - }, - "status": { - "message": "Kondisyon" - }, - "stateLogs": { - "message": "State Logs" - }, "stateLogsDescription": { "message": "State logs gen adrès kont piblik ou yo epi tranzaksyon ou te voye yo." }, @@ -1137,9 +678,6 @@ "step3HardwareWalletMsg": { "message": "Sèvi ak kont materyèl ou menm jan ou t ap fè pou kont Etherum. Ouvri sesyon an nan dApps, voye Eth, achte ak stòke ERC20 tokens ak e ki pake chanje tokens tankou CryptoKitties." }, - "submit": { - "message": "Soumèt" - }, "submitted": { "message": "Te Soumèt" }, @@ -1147,10 +685,7 @@ "message": "Vizite Sant Sipò Nou" }, "symbolBetweenZeroTwelve": { - "message": "Senbòl yo dwe ant 0 ak 12 karaktè." - }, - "takesTooLong": { - "message": "Pran twò lontan?" + "message": "Senbòl yo dwe 11 karaktè oswa mwens." }, "terms": { "message": "Tèm pou itilize" @@ -1161,34 +696,12 @@ "to": { "message": "Pou" }, - "toETHviaShapeShift": { - "message": "$1 pou ETH pa ShapeShift", - "description": "system will fill in deposit type in start of message" - }, - "token": { - "message": "Token" - }, - "tokenAddress": { - "message": "Adrès Token" - }, "tokenAlreadyAdded": { "message": "Ou te deja ajoute token." }, - "tokenBalance": { - "message": "Balans Token ou se:" - }, - "tokenSelection": { - "message": "Chache Tokens oswa chwazi nan lis Tokens popilè nou an." - }, "tokenSymbol": { "message": "Token Senbòl" }, - "tokenWarning1": { - "message": "Kenbe tras token yo ou te achte ak kont MetaMask ou. Si ou te achte tokens pandan wap itilize yon kont diferan tokens sa yo pa pral parèt la." - }, - "total": { - "message": "Total" - }, "transaction": { "message": "tranzaksyon yo" }, @@ -1198,9 +711,6 @@ "transactionCreated": { "message": "Tranzaksyon ou te kreye avèk on valè de $1 pou $2." }, - "transactionWithNonce": { - "message": "Tranzaksyon $1" - }, "transactionDropped": { "message": "Tranzaksyon ou te tonbe a $2." }, @@ -1210,33 +720,12 @@ "transactionUpdated": { "message": "Tranzaksyon ou te aktyalize a $2." }, - "transactionUpdatedGas": { - "message": "Tranzaksyon ou te aktyalize avèk on pri gaz de $1 a $2." - }, - "transactions": { - "message": "transactions" - }, "transactionError": { "message": "Erè tranzaksyon. Eksepsyon jete nan kòd kontra." }, - "transactionMemo": { - "message": "Memo tranzaksyon (opsyonèl)" - }, - "transactionNumber": { - "message": "Nimewo Tranzaksyon" - }, "transfer": { "message": "Transfè" }, - "transferFrom": { - "message": "Transfer From" - }, - "transfers": { - "message": "Transfè yo" - }, - "trezorHardwareWallet": { - "message": "TREZOR Materyèl Bous" - }, "troubleTokenBalances": { "message": "Nou te gen pwoblèm chaje balans token ou. Ou ka wè yo ", "description": "Followed by a link (here) to view token balances" @@ -1244,39 +733,21 @@ "tryAgain": { "message": "Eseye anko" }, - "twelveWords": { - "message": "12 mo sa yo se sèl fason pou retabli kont MetaMask ou yo. \nKenbe yo yon kote ki an sekirite ak sekrè." - }, "typePassword": { "message": "Tape modpas ou" }, - "uiWelcome": { - "message": "Byenveni nan New itilizatè koòdone (Beta)" - }, - "uiWelcomeMessage": { - "message": "Kounya w ap itilize nouvo MetaMask UI (itilizatè koòdone) a." - }, "unapproved": { "message": "Pa apwouve" }, - "unavailable": { - "message": "Pa disponib" - }, "units": { "message": "inite yo" }, "unknown": { "message": "Enkoni" }, - "unknownFunction": { - "message": "Fonksyon enkoni" - }, "unknownNetwork": { "message": "Rezo Prive Enkoni" }, - "unknownNetworkId": { - "message": "Rezo ID Enkoni" - }, "unknownQrCode": { "message": "Erè: Nou pa t kapab idantifye QR kòd sa" }, @@ -1295,25 +766,12 @@ "updatedWithDate": { "message": "Mete ajou $1" }, - "uriErrorMsg": { + "urlErrorMsg": { "message": "URIs mande pou apwopriye prefiks HTTP / HTTPS a." }, - "usaOnly": { - "message": "USA sèlman", - "description": "Using this exchange is limited to people inside the USA" - }, "usedByClients": { "message": "Itilize pa yon varyete de kliyan diferan" }, - "useOldUI": { - "message": "Itilizasyon ansyen UI (itilizatè koòdone)" - }, - "validFileImport": { - "message": "Ou dwe chwazi yon dosye ki valab pou enpòte." - }, - "vaultCreated": { - "message": "Kòf Kreye" - }, "viewAccount": { "message": "Wè Kont" }, @@ -1326,18 +784,12 @@ "walletSeed": { "message": "Bous Seed" }, - "warning": { - "message": "Avètisman" - }, "welcomeBack": { "message": "Bon Retou!" }, "welcome": { "message": "Byenveni nan MetaMask" }, - "whatsThis": { - "message": "Kisa sa ye?" - }, "yesLetsTry": { "message": "Wi, ann eseye" }, diff --git a/app/_locales/hu/messages.json b/app/_locales/hu/messages.json new file mode 100644 index 000000000000..73d19f975ec1 --- /dev/null +++ b/app/_locales/hu/messages.json @@ -0,0 +1,1300 @@ +{ + "chartOnlyAvailableEth": { + "message": "A diagram csak Ethereum hálózatokon érhetÅ‘ el" + }, + "contractInteraction": { + "message": "SzerzÅ‘déses interakció" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "reject": { + "message": "Elutasítás" + }, + "about": { + "message": "Névjegy" + }, + "aboutSettingsDescription": { + "message": "Verzió, ügyfélszolgálat és elérhetÅ‘ségek" + }, + "acceleratingATransaction": { + "message": "* Ha szeretné felgyorsítani a tranzakciót azzal, hogy magasabb gázárat használ, az növeli a gyorsabb feldolgozás esélyét, de ez nem mindig garantált." + }, + "accessingYourCamera": { + "message": "Kamerához való hozzáférés..." + }, + "account": { + "message": "Fiók" + }, + "accountDetails": { + "message": "Fiókadatok" + }, + "accountName": { + "message": "Fióknév" + }, + "accountOptions": { + "message": "Fiókbeállítások" + }, + "accountSelectionRequired": { + "message": "Ki kell választania egy fiókot!" + }, + "activityLog": { + "message": "tevékenységi napló" + }, + "addNetwork": { + "message": "Hálózat hozzáadása" + }, + "addRecipient": { + "message": "Címzett hozzáadása" + }, + "advanced": { + "message": "Speciális" + }, + "advancedSettingsDescription": { + "message": "Hozzáférés fejlesztÅ‘i funkciókhoz, állapotnaplók letöltése, fiók újraállítása, testnetek és egyéni RPC-k beállítása" + }, + "advancedOptions": { + "message": "Haladó beállítások" + }, + "addToAddressBook": { + "message": "Hozzáadás a címjegyzékhez" + }, + "addToAddressBookModalPlaceholder": { + "message": "pl. John D." + }, + "addAlias": { + "message": "Ãlnév hozzáadása" + }, + "addToken": { + "message": "Token hozzáadása" + }, + "addTokens": { + "message": "Érmék hozzáadása" + }, + "addSuggestedTokens": { + "message": "Javasolt tokenek hozzáadása" + }, + "addAcquiredTokens": { + "message": "Adja hozzá MetaMask-kal a kapott érméket" + }, + "amount": { + "message": "Összeg" + }, + "appDescription": { + "message": "Ethereum tárca a böngészÅ‘jében", + "description": "The description of the application" + }, + "approve": { + "message": "Jóváhagyás" + }, + "approved": { + "message": "Jóváhagyva" + }, + "asset": { + "message": "Eszköz" + }, + "attemptingConnect": { + "message": "Próbálunk csatlakozni a blokklánchoz." + }, + "attemptToCancel": { + "message": "Megpróbálja törölni?" + }, + "attemptToCancelDescription": { + "message": "A próbálkozás elküldése nem garantálja, hogy az eredeti tranzakció törlésre kerül. Ha a törlési kísérlet sikeres, akkor a fenti tranzakciós díjat számítjuk fel önnek." + }, + "attributions": { + "message": "Attribúciók" + }, + "autoLockTimeLimit": { + "message": "Automatikus kijelentkezés idÅ‘zítÅ‘ (perc)" + }, + "autoLockTimeLimitDescription": { + "message": "Adja meg a MetaMask automatikus kijelentkezéséig tartó tétlen állapot idejét percekben " + }, + "average": { + "message": "Ãtlag" + }, + "back": { + "message": "Vissza" + }, + "backToAll": { + "message": "Vissza az összeshez" + }, + "backupApprovalNotice": { + "message": "Készíts biztonsági másolatot titkos helyreállítási kódodról, hogy pénztárcád és pénzalapod biztosítva legyen." + }, + "backupApprovalInfo": { + "message": "Ez a titkos kód a tárca helyreállításához szükséges, ha elveszíti eszközét, elfelejti jelszavát, újra kell telepítenie a MetaMask alkalmazást, vagy ha a tárcájához egy másik eszközrÅ‘l szeretne hozzáférni." + }, + "backupNow": { + "message": "Készíts biztonsági mentést most" + }, + "balance": { + "message": "Egyenleg" + }, + "balanceOutdated": { + "message": "Az egyenleg elavult lehet" + }, + "basic": { + "message": "AlapvetÅ‘" + }, + "blockExplorerUrl": { + "message": "Explorer blokkolása" + }, + "blockExplorerView": { + "message": "Tekintse meg a fiókot a(z) $1-en", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "Blockies identikon használata" + }, + "browserNotSupported": { + "message": "Az ön böngészÅ‘je nem támogatott..." + }, + "builtInCalifornia": { + "message": "A MetaMaskot Kaliforniában tervezték és hozták létre." + }, + "buyWithWyre": { + "message": "Vásároljon ETH-t a Wyre-rel" + }, + "buyWithWyreDescription": { + "message": "A Wyre segítségével egyensen a MetaMaks fiókjában tehet letétbe ETH-t." + }, + "buyCoinSwitch": { + "message": "Vegye meg a CoinSwitchen" + }, + "buyCoinSwitchExplainer": { + "message": "A CoinSwitch a legjobb hely több mint 300 cryptovaluta legjobb árfolyamon történÅ‘ átváltására." + }, + "bytes": { + "message": "Bájtok" + }, + "off": { + "message": "Kikapcsolva" + }, + "ok": { + "message": "OK" + }, + "on": { + "message": "Be" + }, + "optionalBlockExplorerUrl": { + "message": "Explorer URL letiltása (nem kötelezÅ‘)" + }, + "cancel": { + "message": "Mégse" + }, + "cancelAttempt": { + "message": "Kísérlet megszakítása" + }, + "cancellationGasFee": { + "message": "A törlés gázára" + }, + "cancelled": { + "message": "Megszakítva" + }, + "chainId": { + "message": "Lánc azonosítója" + }, + "clickToRevealSeed": { + "message": "Kattintson ide a titkos szavak megjelenítéséhez" + }, + "close": { + "message": "Bezárás" + }, + "chromeRequiredForHardwareWallets": { + "message": "A MetaMask-ot Google Chrome-mal kell használnia a Hardveres pénztárcához való csatlakozáshoz." + }, + "confirm": { + "message": "MegerÅ‘sítés" + }, + "confirmed": { + "message": "MegerÅ‘sítve" + }, + "confirmPassword": { + "message": "Jelszó megerÅ‘sítése" + }, + "confirmSecretBackupPhrase": { + "message": "ErÅ‘sítsd meg titkos biztonsági szókapcsolatodat" + }, + "congratulations": { + "message": "Gratulálunk" + }, + "connectHardwareWallet": { + "message": "Hardverpénztárca csatlakoztatása" + }, + "connect": { + "message": "Csatlakozás" + }, + "connectingTo": { + "message": "Kapcsolódás: $1" + }, + "connectingToKovan": { + "message": "Csatlakozás a Kovan teszthálózathoz" + }, + "connectingToMainnet": { + "message": "Csatlakozás a fÅ‘ Ethereum hálózathoz" + }, + "connectingToRopsten": { + "message": "Csatlakozás a Ropsten teszthálózathoz" + }, + "connectingToRinkeby": { + "message": "Kapcsolódás a Rinkeby Teszthálózathoz" + }, + "connectingToLocalhost": { + "message": "Csatlakozás a Localhost 8645-höz" + }, + "connectingToGoerli": { + "message": "Csatlakozás a Goerli teszthálózathoz" + }, + "continueToWyre": { + "message": "Tovább a Wyre-re" + }, + "continueToCoinSwitch": { + "message": "Tovább a CoinSwitch-re" + }, + "contractDeployment": { + "message": "SzerzÅ‘dés alkalmazása" + }, + "copiedExclamation": { + "message": "Kimásolva!" + }, + "copyAddress": { + "message": "Másolja a címet a vágólapra" + }, + "copyTransactionId": { + "message": "Tranzakció azonosítójának másolása" + }, + "copiedTransactionId": { + "message": "Másolt tranzakció-azonosító" + }, + "copyToClipboard": { + "message": "Másolás a vágólapra" + }, + "copyPrivateKey": { + "message": "Ez a saját titkos kulcsod (kattints rá a másoláshoz)" + }, + "create": { + "message": "Létrehozás" + }, + "createAccount": { + "message": "Fiók létrehozása" + }, + "createAWallet": { + "message": "Hozz létre egy pénztárcát" + }, + "createPassword": { + "message": "Jelszó létrehozása" + }, + "currencyConversion": { + "message": "Valutaváltás" + }, + "currentLanguage": { + "message": "Aktuális nyelv" + }, + "customGas": { + "message": "Gáz testreszabása" + }, + "customGasSubTitle": { + "message": "A díj növelése csökkentheti a feldolgozási idÅ‘t, de ez nem garantált." + }, + "customToken": { + "message": "Egyéni token" + }, + "customRPC": { + "message": "Egyedi RPC" + }, + "decimalsMustZerotoTen": { + "message": "A tizedesjegyek száma 0 és 36 között legyen . " + }, + "decimal": { + "message": "A pontosság tizedesjegyei" + }, + "defaultNetwork": { + "message": "Az Ether tranzakciók alapértelmezett hálózata a Main Net." + }, + "delete": { + "message": "Törlés" + }, + "deleteAccount": { + "message": "Fiók törlése" + }, + "deposit": { + "message": "Befizetés" + }, + "depositEther": { + "message": "Ether befizetése" + }, + "details": { + "message": "Részletek" + }, + "directDepositEther": { + "message": "Fizess be ethert közvetlenül" + }, + "directDepositEtherExplainer": { + "message": "Amennyiben már rendelkezik némi Ether-rel, a közvetlen letéttel gyorsan elhelyezheti azt új pénztárcájában." + }, + "done": { + "message": "Kész" + }, + "downloadGoogleChrome": { + "message": "Google Chrome letöltése" + }, + "downloadSecretBackup": { + "message": "Töltse le a Secret Backup Phrase-t és tárolja biztonságosan egy titkosított külsÅ‘ merevlemezen vagy tárolón." + }, + "downloadStateLogs": { + "message": "Ãllapotnapló letöltése" + }, + "dontHaveAHardwareWallet": { + "message": "Nincs hardveres tárcája? " + }, + "dropped": { + "message": "Ejtve" + }, + "edit": { + "message": "Szerkesztés" + }, + "editContact": { + "message": "Kapcsolatok szerkesztése" + }, + "endOfFlowMessage1": { + "message": "Ãtment a teszten - tartsa biztonságban a seed mondatot, ez az ön felelÅ‘ssége!" + }, + "endOfFlowMessage2": { + "message": "Tanácsok a biztonságos tárolásához" + }, + "endOfFlowMessage3": { + "message": "Készíts biztonsági mentést több helyen." + }, + "endOfFlowMessage4": { + "message": "Soha ne ossza meg senkivel a mondatot." + }, + "endOfFlowMessage5": { + "message": "Vigyázzon az adathalászokkal! A MetaMask soha nem kéri spontán módon a seed mondatot." + }, + "endOfFlowMessage6": { + "message": "Ha ismét biztonsági másolatot kell készítenie a seed mondatról, megtalálja azt a Beállítások -> Biztonság menüben." + }, + "endOfFlowMessage7": { + "message": "Ha bármilyen kérdése van, vagy valami gyanús dolgot tapasztal, írjon a support@metamask.io címre." + }, + "endOfFlowMessage8": { + "message": "A MetaMask nem tudta helyreállítani a seed mondatot. Tudjon meg többet." + }, + "endOfFlowMessage9": { + "message": "BÅ‘vebb információk." + }, + "endOfFlowMessage10": { + "message": "Minden kész" + }, + "ensRegistrationError": { + "message": "Hiba történt az ENS név regisztrációjakor" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "ENS név nem található a jelenlegi hálózaton. Próbálj váltani Ethereum fÅ‘hálózatra." + }, + "enterAnAlias": { + "message": "Adjon meg álnevet" + }, + "enterPassword": { + "message": "Adja meg a jelszót" + }, + "enterPasswordContinue": { + "message": "A folytatáshoz adja meg a jelszót" + }, + "ethereumPublicAddress": { + "message": "Ethereum nyilvános címe" + }, + "etherscanView": { + "message": "Fiók megtekintése Etherscanen" + }, + "estimatedProcessingTimes": { + "message": "Becsült feldolgozási idÅ‘k" + }, + "expandView": { + "message": "Nézet nagyítása" + }, + "exportPrivateKey": { + "message": "Privát kulcs exportálása" + }, + "failed": { + "message": "Sikertelen" + }, + "fast": { + "message": "Gyors" + }, + "faster": { + "message": "Gyorsabban" + }, + "fileImportFail": { + "message": "Nem működik a fájl importálása? Kattintson ide!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "Felejtse el ezt az eszközt" + }, + "from": { + "message": "Feladó" + }, + "functionType": { + "message": "Függvénytípus" + }, + "gasLimit": { + "message": "Gáz határértéke" + }, + "gasLimitInfoModalContent": { + "message": "A gázkorlátozás az elkölthetÅ‘ gázegységek maximális mennyisége." + }, + "gasLimitTooLow": { + "message": "A gáz határértéke legyen legalább 21000" + }, + "gasUsed": { + "message": "Használt gáz" + }, + "gasPrice": { + "message": "Gázár (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "Üzemanyag ár Különösen alacsony" + }, + "gasPriceInfoModalContent": { + "message": "A gáz ára meghatározza, hogy ön mennyi Ethert hajlandó fizetni minden egyes gázegységért." + }, + "gasPriceNoDenom": { + "message": "Gázár" + }, + "general": { + "message": "Ãltalános" + }, + "generalSettingsDescription": { + "message": "Pénznem átváltása, elsÅ‘dleges pénznem, nyelv, blockies identikonok" + }, + "getEther": { + "message": "Ether beszerzése" + }, + "getEtherFromFaucet": { + "message": "Szerezzen Ethert pénzcsapból a(z) $1-ért", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "Segítség kérése" + }, + "getStarted": { + "message": "ElsÅ‘ lépések" + }, + "happyToSeeYou": { + "message": "Örülünk, hogy itt van. " + }, + "hardware": { + "message": "hardver" + }, + "hardwareWalletConnected": { + "message": "Hardverpénztárca csatlakoztatva" + }, + "hardwareWallets": { + "message": "Hardveres tárca csatlakoztatása" + }, + "hardwareWalletsMsg": { + "message": "Válassza ki a MetaMask-kal használni kívánt hardveres pénztárcát" + }, + "havingTroubleConnecting": { + "message": "Gond van a csatlakozással?" + }, + "here": { + "message": "itt", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hexData": { + "message": "Hex adat" + }, + "hide": { + "message": "Elrejtés" + }, + "hideTokenPrompt": { + "message": "Elrejted a tokent?" + }, + "history": { + "message": "ElÅ‘zmények" + }, + "import": { + "message": "Importálás", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "Fiók importálása" + }, + "importAccountMsg": { + "message": "Az importált fiókot nem társítjuk az eredetileg létrehozott MetaMask-fiók seed mondatához. További információ az importált fiókokról" + }, + "importAccountSeedPhrase": { + "message": "Fiók importálása seed mondat segítségével" + }, + "importWallet": { + "message": "Pénztárca importálása" + }, + "importYourExisting": { + "message": "Importálja meglévÅ‘ pénztárcáját a 12 szóból álló seed mondat segítségével" + }, + "imported": { + "message": "Importált", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "Importálás a fiók seed mondatának használatával" + }, + "infoHelp": { + "message": "Információk és súgó" + }, + "initialTransactionConfirmed": { + "message": "Eredeti tranzakciódat jóváhagyta a hálózat. A visszatéréshez kattints az OK-ra." + }, + "insufficientBalance": { + "message": "Fedezethiány." + }, + "insufficientFunds": { + "message": "Nincs elegendÅ‘ összeg." + }, + "insufficientTokens": { + "message": "Nincs elegendÅ‘ tokene." + }, + "invalidAddress": { + "message": "Helytelen cím" + }, + "invalidAddressRecipient": { + "message": "A címzett címe érvénytelen " + }, + "knownAddressRecipient": { + "message": "Ismert szerzÅ‘déses cím." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "Nem ETH hálózat, állítsa kisbetűre" + }, + "invalidInput": { + "message": "Érvénytelen bevitel." + }, + "invalidRPC": { + "message": "Helytelen RPC URL" + }, + "invalidBlockExplorerURL": { + "message": "Helytelen Block Explorer URL" + }, + "invalidSeedPhrase": { + "message": "Érvénytelen seed mondat" + }, + "jsonFile": { + "message": "JSON-fájl", + "description": "format for importing an account" + }, + "kovan": { + "message": "Kovan teszthálózat" + }, + "max": { + "message": "Maximum" + }, + "learnMore": { + "message": "Tudjon meg többet" + }, + "ledgerAccountRestriction": { + "message": "Használnia kell a korábbi fiókját, mielÅ‘tt újat adhat hozzá. " + }, + "letsGoSetUp": { + "message": "Igen, hozzuk létre!" + }, + "likeToAddTokens": { + "message": "Hozzá szeretné adni ezeket az érméket?" + }, + "links": { + "message": "Linkek" + }, + "liveGasPricePredictions": { + "message": "ÉlÅ‘ elÅ‘rejelzések gázárak alakulására" + }, + "loading": { + "message": "Betöltés..." + }, + "loadingTokens": { + "message": "Tokenek betöltése..." + }, + "loadMore": { + "message": "Továbbiak betöltése" + }, + "lock": { + "message": "Kilépés" + }, + "mainnet": { + "message": "FÅ‘ Ethereum hálózat" + }, + "memorizePhrase": { + "message": "Jegyezze meg ezt a szakaszt." + }, + "memo": { + "message": "emlékeztetÅ‘" + }, + "message": { + "message": "Üzenet" + }, + "metamaskDescription": { + "message": "Csatlakozás az Ethereumhoz és a decentralizált hálózathoz." + }, + "metamaskVersion": { + "message": "MetaMask verzió" + }, + "mobileSyncText": { + "message": "Kérünk írd be jelszavad, hogy igazold kiléted!" + }, + "myAccounts": { + "message": "Fiókjaim" + }, + "myWalletAccounts": { + "message": "Saját tárca fiókjai" + }, + "myWalletAccountsDescription": { + "message": "Az összes MetaMask által létrehozott fiókot automatikusan hozzáadja a munkamenethez." + }, + "mustSelectOne": { + "message": "Legalább 1 tokent ki kell választania." + }, + "needEtherInWallet": { + "message": "Ha a MetaMaskon keresztül szeretne interakcióba lépni decentralizált alkalmazással, ahhoz a tárcájában Ethernek kell lennie." + }, + "needImportFile": { + "message": "Ki kell választania az importálni kívánt fájlt.", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "Nem lehet negatív mennyiségű ETH-t küldeni." + }, + "networkName": { + "message": "Hálózat neve" + }, + "networks": { + "message": "Hálózatok" + }, + "networkSettingsDescription": { + "message": "Egyedi RPC-hálózatok hozzáadása és szerkesztése" + }, + "nevermind": { + "message": "Nem fontos" + }, + "newAccount": { + "message": "Új fiók" + }, + "newAccountDetectedDialogMessage": { + "message": "Új címet észleltünk! Kattints ide, ha szeretnéd feljegyezni címtáradba." + }, + "newAccountNumberName": { + "message": "$1 fiók", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "Új kapcsolat" + }, + "newContract": { + "message": "Új szerzÅ‘dés" + }, + "newPassword": { + "message": "Új jelszó (minimum 8 karakter)" + }, + "newNetwork": { + "message": "Új hálózat" + }, + "newToMetaMask": { + "message": "Új a MetaMask-on?" + }, + "noAlreadyHaveSeed": { + "message": "Nem, már rendelkezem gyarapítási fázissal" + }, + "protectYourKeys": { + "message": "Védje kulcsait!" + }, + "protectYourKeysMessage1": { + "message": "Vigyázzod a gyarapítási fázissal - olyan oldalakat jelentettek, amelyek a MetaMask-ot utánozzák. A MetaMask soha nem kéri el a gyarapítási fázisát." + }, + "protectYourKeysMessage2": { + "message": "Årizze biztonságos helyen a mondatot. Ha bármilyen gyanús dolgot tapasztal, vagy bizonytalan egy weboldalt illetÅ‘en, írjon a support@metamask.io címre." + }, + "rpcUrl": { + "message": "Új RPC URL" + }, + "optionalChainId": { + "message": "ChainID (nem kötelezÅ‘)" + }, + "optionalSymbol": { + "message": "Szimbólum (opcionális)" + }, + "newTotal": { + "message": "Új végösszeg" + }, + "newTransactionFee": { + "message": "Új tranzakciós költség" + }, + "next": { + "message": "KövetkezÅ‘" + }, + "noAddressForName": { + "message": "Nem lett cím beállítva ehhez a névhez." + }, + "noConversionRateAvailable": { + "message": "Nincs elérhetÅ‘ átváltási díj" + }, + "noTransactions": { + "message": "Nincsenek tranzakciói" + }, + "notEnoughGas": { + "message": "Nincs elég gáz" + }, + "noWebcamFoundTitle": { + "message": "Nem találtunk webkamerát" + }, + "noWebcamFound": { + "message": "Nem található számítógéped webkamerája. Kérünk, próbáld újra." + }, + "ofTextNofM": { + "message": "ból" + }, + "orderOneHere": { + "message": "Rendeljen trezort vagy fÅ‘könyvet, és tárolja pénzeszközeit hideg tárcában" + }, + "origin": { + "message": "Eredet" + }, + "parameters": { + "message": "Paraméterek" + }, + "participateInMetaMetrics": { + "message": "Vegyen részt a MetaMetrics-ben" + }, + "participateInMetaMetricsDescription": { + "message": "Vegyél részt a MetaMetricsben, hogy segíts a MetaMask fejlesztésében." + }, + "password": { + "message": "Jelszó" + }, + "passwordsDontMatch": { + "message": "A jelszavak nem egyeznek" + }, + "passwordNotLongEnough": { + "message": "A jelszó nem.elég hosszú" + }, + "pastePrivateKey": { + "message": "Illessze be ide a privát kulcs karakterláncát:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "folyamatban" + }, + "personalAddressDetected": { + "message": "Személyes címet észleltünk. Adja meg a token szerzÅ‘dés címét." + }, + "prev": { + "message": "ElÅ‘zÅ‘" + }, + "primaryCurrencySetting": { + "message": "ElsÅ‘dleges pénznem" + }, + "primaryCurrencySettingDescription": { + "message": "Válaszd a helyit, hogy az értékek elsÅ‘sorban a helyi pénznemben jelenjenek meg (pl. ETH). Válaszd a Fiatot, hogy az értékek elsÅ‘sorban a választott fiat pénznemben jelenjenek meg." + }, + "privacyMsg": { + "message": "Adatvédelmi szabályzat" + }, + "privateKey": { + "message": "Privát kulcs", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "Figyelem! Soha ne adja át másnak ezt a kulcsot. A privát kulcs birtokában ellophatják a számláján lévÅ‘ pénzeszközöket." + }, + "privateNetwork": { + "message": "Magánhálózat" + }, + "queue": { + "message": "Nyomtatólista" + }, + "readdToken": { + "message": "Ezt a tokent a jövÅ‘ben is hozzáadhatja, ha a fiókbeállítások menü „Token hozzáadása†elemére lép." + }, + "recents": { + "message": "Legutóbbiak" + }, + "recipientAddress": { + "message": "Címzett címe" + }, + "recipientAddressPlaceholder": { + "message": "Keresés, nyilvános cím (0x) vagy ENS" + }, + "rejectAll": { + "message": "Mindet elutasít" + }, + "rejectTxsN": { + "message": "$1 tranzakciók elutasítása" + }, + "rejectTxsDescription": { + "message": "Ezáltal kötegben utasítja el a(z) $1 tranzakciókat." + }, + "rejected": { + "message": "Elutasítva" + }, + "reset": { + "message": "Visszaállítás" + }, + "resetAccount": { + "message": "Fiók visszaállítása" + }, + "resetAccountDescription": { + "message": "A fiók visszaállítása törli a tranzakciók elÅ‘zményeit." + }, + "deleteNetwork": { + "message": "Törli a hálózatot?" + }, + "deleteNetworkDescription": { + "message": "Biztosan törli ezt a hálózatot?" + }, + "remindMeLater": { + "message": "Emlékeztessen késÅ‘bb" + }, + "restoreFromSeed": { + "message": "Visszaállítja a fiókot? " + }, + "restoreAccountWithSeed": { + "message": "Fiók helyreállítása a seed mondat segítségével" + }, + "requestsAwaitingAcknowledgement": { + "message": "jóváhagyásra váró kérelmek" + }, + "required": { + "message": "KötelezÅ‘" + }, + "restore": { + "message": "Visszaállítás" + }, + "revealSeedWords": { + "message": "Seed szavak megjelenítése" + }, + "revealSeedWordsTitle": { + "message": "Kulcsszólánc" + }, + "revealSeedWordsDescription": { + "message": "Ha valamikor böngészÅ‘t váltasz, vagy számítógépet cserélsz, a fiókjaid használatához szükséged lesz erre a kulcsszóláncra. Årizd Å‘ket egy biztonságos és titkos helyen." + }, + "revealSeedWordsWarningTitle": { + "message": "NE ossza meg ezt a mondatot senkivel!" + }, + "revealSeedWordsWarning": { + "message": "Ezekkel a szavakkal ellophatóak a fiókjai." + }, + "remove": { + "message": "Eltávolítás" + }, + "removeAccount": { + "message": "Fiók eltávolítása" + }, + "removeAccountDescription": { + "message": "Ez a fiók el lesz távolítva pénztárcádból. A folytatás elÅ‘tt gyÅ‘zÅ‘dj meg róla, hogy rendelkezésedre áll az eredeti kulcsszólánc vagy titkos kulcs. A fiók legördülÅ‘ menüjébÅ‘l újból importálhatsz vagy létrehozhatsz fiókokat. " + }, + "readyToConnect": { + "message": "Készen áll a csatlakozásra?" + }, + "rinkeby": { + "message": "Rinkeby teszthálózat" + }, + "ropsten": { + "message": "Ropsten teszthálózat" + }, + "goerli": { + "message": "Goerli teszthálózat" + }, + "save": { + "message": "Mentés" + }, + "slow": { + "message": "Lassú" + }, + "slower": { + "message": "Lassabban" + }, + "saveAsCsvFile": { + "message": "Mentés CSV-fájlként" + }, + "scanInstructions": { + "message": "Helyezze a QR-kódot a fényképezÅ‘gép elé" + }, + "scanQrCode": { + "message": "QR-kód beolvasása" + }, + "search": { + "message": "Keresés" + }, + "searchResults": { + "message": "Keresési eredmények" + }, + "secretBackupPhrase": { + "message": "Titkos biztonsági kifejezés " + }, + "secretBackupPhraseDescription": { + "message": "Titkos biztonsági szókapcsolatoddal könnyedén készíthetsz biztonsági mentést és helyreállíthatod fiókodat." + }, + "secretBackupPhraseWarning": { + "message": "FIGYELEM: Senkise se adja meg a biztonsági szakaszát. Ennek tulajdonosa örökre elviheti Ether-jeit." + }, + "secretPhrase": { + "message": "Tárolód helyreállításához írd be titkos tizenkét szavas szókapcsolatodat ide." + }, + "securityAndPrivacy": { + "message": "Biztonság és adatvédelem" + }, + "securitySettingsDescription": { + "message": "Biztonsági beállítások és pénztárca kulcsszólánca" + }, + "seedPhrasePlaceholder": { + "message": "A szavakat egy-egy szóközzel válassza el" + }, + "seedPhraseReq": { + "message": "A seed mondat 12 szóból áll" + }, + "selectCurrency": { + "message": "Válasszon valutát" + }, + "selectEachPhrase": { + "message": "Kérjük, válassza ki az egyes mondatokat, hogy meggyÅ‘zÅ‘djön azok helyességérÅ‘l. " + }, + "selectLocale": { + "message": "Válaszd ki a területi beállítást" + }, + "selectType": { + "message": "Válasszon típust" + }, + "send": { + "message": "Küldés" + }, + "sendAmount": { + "message": "Összeg küldése" + }, + "sendETH": { + "message": "ETH küldése" + }, + "sendTokens": { + "message": "Token küldése" + }, + "sentEther": { + "message": "elküldött ether" + }, + "sentTokens": { + "message": "elküldött érmék" + }, + "separateEachWord": { + "message": "Minden egyes szavat szóközzel válasszon el" + }, + "searchTokens": { + "message": "Keresés a tokenek között" + }, + "selectAnAccount": { + "message": "Válasszon fiókot" + }, + "selectAnAccountHelp": { + "message": "Válássza ki a MetaMask-ban megtekinteni kívánt fiókot" + }, + "selectAHigherGasFee": { + "message": "Válasszon magasabb gázdíjat az ügylet feldolgozásának gyorsításához.*" + }, + "selectHdPath": { + "message": "Válassz HD elérési útvonalat" + }, + "selectPathHelp": { + "message": "Ha nem láthatók alább Ledger számláid, próbáld kicserélni az elérési útvonalat: „Legacy (MEW / MyCypto)â€" + }, + "settings": { + "message": "Beállítások" + }, + "showAdvancedGasInline": { + "message": "Speciális gázszabályzók" + }, + "showAdvancedGasInlineDescription": { + "message": "Jelöld meg ezt a gázárak és korlátozásellenÅ‘rzés mutatásához közvetlenül a küldési és megerÅ‘sítési képernyÅ‘kön." + }, + "showFiatConversionInTestnets": { + "message": "Konverzió mutatása Testnetsen" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Válassza ezt, ha a Testnetsen szeretné megnézni a törvényes fizetÅ‘eszközre való átváltást" + }, + "showPrivateKeys": { + "message": "Mutassa a privát kulcsokat" + }, + "showHexData": { + "message": "Hex adatok mutatása" + }, + "showHexDataDescription": { + "message": "Válassza ezt, ha a hex adatmezÅ‘t a küldÅ‘ képernyÅ‘n szeretné megnézni" + }, + "sign": { + "message": "Aláír" + }, + "signatureRequest": { + "message": "Aláírási kérelem" + }, + "signed": { + "message": "Aláírva" + }, + "signNotice": { + "message": "Az üzenet aláírása veszélyes következményekkel járhat. Csak olyan webhely üzenetét írja alá, amelyben teljes mértékben és a teljes fiókjával megbízik. Ezt a veszélyes módszert egy késÅ‘bbi verzióból eltávolítjuk." + }, + "sigRequest": { + "message": "Aláírás kérése" + }, + "somethingWentWrong": { + "message": "Hoppá! Valami hiba történt..." + }, + "speedUp": { + "message": "Gyorsítás" + }, + "speedUpCancellation": { + "message": "Törlés felgyorsítása" + }, + "speedUpTransaction": { + "message": "Gyorsítsd fel ezt a tranzakciót" + }, + "switchNetworks": { + "message": "Hálózátváltás" + }, + "stateLogs": { + "message": "Ãllapotnapló" + }, + "stateLogsDescription": { + "message": "Az állapotnaplóban megtalálhatók nyilvános fiókcímeid és elküldött tranzakcióid." + }, + "stateLogError": { + "message": "Hiba történt az állapotnaplók lekérésekor." + }, + "step1HardwareWallet": { + "message": "1. Csatlakoztassa a hardveres pénztárcát" + }, + "step1HardwareWalletMsg": { + "message": "Csatlakoztassa hardveres tárcáját közvetlenül a számítógéphez." + }, + "step2HardwareWallet": { + "message": "2. Válassz egy fiókot" + }, + "step2HardwareWalletMsg": { + "message": "Válassza ki a megtekinteni kívánt fiókot. Egyszerre csak egyet választhat." + }, + "step3HardwareWallet": { + "message": "3. Kezdje el használni a dApps-t és másokat!" + }, + "step3HardwareWalletMsg": { + "message": "Használja hardveres fiókját úgy, mint bármilyen Ethereum fiókot. Jelentkezzen be a dAppsba, küldjön Ethet, vásároljon és tároljon ERC20 tokeneket és nem helyettesíthetÅ‘ tokeneket, például CryptoKitties-t." + }, + "storePhrase": { + "message": "Tárolja a mondatot jelszókezelÅ‘ben, például az 1Passwordben." + }, + "submitted": { + "message": "Elküldve" + }, + "supportCenter": { + "message": "Vegye fel a kapcsolatot Támogató Központunkkal" + }, + "symbol": { + "message": "Szimbólum" + }, + "symbolBetweenZeroTwelve": { + "message": "A szimbólum 0 és 12 karakter között kell legyen." + }, + "syncWithMobile": { + "message": "Szinkronizálás telefonnal" + }, + "syncWithMobileTitle": { + "message": "Szinkronizálás mobillal" + }, + "syncWithMobileDesc": { + "message": "Szinkronizálhatja fiókjait és adatait a mobilkészülékkel. Nyissa meg a MetaMask mobilalkalmazást, lépjen a \"Beállítások\" elemre, majd koppintson a \"Szinkronizálás a böngészÅ‘ bÅ‘vítményébÅ‘l\" elemre." + }, + "syncWithMobileDescNewUsers": { + "message": "Ha most elÅ‘ször nyitja meg a MetaMask mobilalkalmazást, kövesse a telefonon megadott lépéseket." + }, + "syncWithMobileScanThisCode": { + "message": "Olvasd be ezt a kódot MetaMask mobilalkalmazásoddal" + }, + "syncWithMobileBeCareful": { + "message": "GyÅ‘zÅ‘djön meg arról, hogy senki nem látja a képernyÅ‘t, amikor beolvassa ezt a kódot" + }, + "syncWithMobileComplete": { + "message": "Adatai szinkronizálása sikerült. Élvezze a MetaMask mobilalkalmazást!" + }, + "terms": { + "message": "Használati feltételek" + }, + "testFaucet": { + "message": "Teszt csap" + }, + "thisWillCreate": { + "message": "Eh új pénztárcát és termelési idÅ‘szakot hoz létre" + }, + "tips": { + "message": "Adományok" + }, + "to": { + "message": "Erre:" + }, + "tokenAlreadyAdded": { + "message": "A tokent már hozzáadtuk. " + }, + "tokenContractAddress": { + "message": "Token szerzÅ‘déscím" + }, + "tokenSymbol": { + "message": "Tokenszimbólum" + }, + "total": { + "message": "Összesen" + }, + "transaction": { + "message": "tranzakció" + }, + "transactionConfirmed": { + "message": "Tranzakció megerÅ‘sítve $2-on." + }, + "transactionCreated": { + "message": "Egy $1 értékű tranzakció létrehozva $2-kor." + }, + "transactionDropped": { + "message": "Tranzakció elvetve: $2." + }, + "transactionSubmitted": { + "message": "Tranzakció jóváhagyva $1 üzemanyag költséggel $2-kor." + }, + "transactionResubmitted": { + "message": "A tranzakció újra beküldve $1 / $2 emelt gázdíjjal." + }, + "transactionUpdated": { + "message": "Tranzakció frissítve $2-nál" + }, + "transactionErrored": { + "message": "Hiba történt a tranzakció során." + }, + "transactionCancelAttempted": { + "message": "Tranzakció visszavonást próbáltak végrehajtani $1 üzemanyagköltséggel $2-kor" + }, + "transactionCancelSuccess": { + "message": "Tranzakció sikeresen törölve $2-nál" + }, + "transactionError": { + "message": "Tranzakciós hiba. Kivétel van a szerzÅ‘dés kódjában." + }, + "transactionErrorNoContract": { + "message": "Nem-szerzÅ‘déses címen próbál egy funkciót meghívni." + }, + "transactionFee": { + "message": "Tranzakciós költség" + }, + "transactionTime": { + "message": "Tranzakció ideje" + }, + "transfer": { + "message": "Ãtutalás" + }, + "transferBetweenAccounts": { + "message": "Fiókok közötti küldés" + }, + "transferFrom": { + "message": "Ãtvezetés innen: " + }, + "troubleTokenBalances": { + "message": "Gondjaink voltak tokenegyenlegeid betöltésével. Megtekintheted Å‘ket", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "Újra" + }, + "typePassword": { + "message": "Ãrd be MetaMask jelszavadat" + }, + "unapproved": { + "message": "Jóvá nem hagyott" + }, + "units": { + "message": "egységek" + }, + "unknown": { + "message": "Ismeretlen" + }, + "unknownNetwork": { + "message": "Ismeretlen magánhálózat" + }, + "unknownQrCode": { + "message": "Hiba: nem tudtuk azonosítani a QR-kódot" + }, + "unknownCameraErrorTitle": { + "message": "Hoppá! Valami hiba történt..." + }, + "unknownCameraError": { + "message": "Hiba történt a kamerához való hozzáférés közben. Kérjük, próbálja újra..." + }, + "unlock": { + "message": "Feloldás" + }, + "unlockMessage": { + "message": "A decentralizált hálózat csak önre vár" + }, + "updatedWithDate": { + "message": "$1 frissítve" + }, + "urlErrorMsg": { + "message": "Az URI-hez szükség van a megfelelÅ‘ HTTP/HTTPS elÅ‘tagra." + }, + "usedByClients": { + "message": "Számos különbözÅ‘ ügyfél használja" + }, + "userName": { + "message": "Felhasználónév" + }, + "viewAccount": { + "message": "Fiók megtekintése" + }, + "viewinExplorer": { + "message": "Megtekintés Explorerben" + }, + "viewContact": { + "message": "Névjegy megtekintése" + }, + "viewOnCustomBlockExplorer": { + "message": "Megtekintés $1-kor" + }, + "viewOnEtherscan": { + "message": "Nézze meg Etherscanen" + }, + "visitWebSite": { + "message": "Látogass el weboldalunkra" + }, + "walletSeed": { + "message": "Pénztárca kulcsszólánca" + }, + "welcomeBack": { + "message": "Üdvözöljük újra!" + }, + "welcome": { + "message": "Üdvözöljük a MetaMaskban" + }, + "writePhrase": { + "message": "Ãrd le ezt a szókapcsolatot egy darab papírra és Å‘rizd meg egy biztonságos helyen. Ha még nagyobb biztonságra törekszel, írd le több darab papírra, és tartsd Å‘ket 2-3 különbözÅ‘ helyen." + }, + "yesLetsTry": { + "message": "Igen, próbáljuk ki!" + }, + "youNeedToAllowCameraAccess": { + "message": "Ennek a funkciónak a használatához engedélyeznie kell a kamerához való hozzáférést." + }, + "yourSigRequested": { + "message": "Szükség van az aláírására" + }, + "youSign": { + "message": "Aláírja" + }, + "yourPrivateSeedPhrase": { + "message": "Az ön privát seed mondata" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "Nulla gázár a gyorsuláshoz" + } +} diff --git a/app/_locales/id/messages.json b/app/_locales/id/messages.json new file mode 100644 index 000000000000..267c5c079a6d --- /dev/null +++ b/app/_locales/id/messages.json @@ -0,0 +1,1282 @@ +{ + "chartOnlyAvailableEth": { + "message": "Grafik hanya tersedia pada jaringan Ethereum." + }, + "contractInteraction": { + "message": "Interaksi Kontrak" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "reject": { + "message": "Tolak" + }, + "about": { + "message": "Tentang" + }, + "aboutSettingsDescription": { + "message": "Versi, pusat dukungan, dan informasi kontak" + }, + "acceleratingATransaction": { + "message": "* Mempercepat transaksi dengan menggunakan harga gas yang lebih tinggi meningkatkan peluangnya untuk lebih cepat diproses oleh jaringan, tetapi tak selalu terjamin pasti cepat." + }, + "accessingYourCamera": { + "message": "Mengakses kamera Anda..." + }, + "account": { + "message": "Akun" + }, + "accountDetails": { + "message": "Rincian Akun" + }, + "accountName": { + "message": "Nama Akun" + }, + "accountOptions": { + "message": "Opsi Akun" + }, + "accountSelectionRequired": { + "message": "Anda perlu memilih akun!" + }, + "activityLog": { + "message": "log aktivitas" + }, + "addNetwork": { + "message": "Tambah Jaringan" + }, + "addRecipient": { + "message": "Tambah Penerima" + }, + "advanced": { + "message": "Lanjutan" + }, + "advancedSettingsDescription": { + "message": "Akses fitur pengembang, unduh Log Status, Atur Ulang Akun, tata testnets dan RPC kustom" + }, + "advancedOptions": { + "message": "Opsi Lanjutan" + }, + "addToAddressBook": { + "message": "Tambahkan ke buku alamat " + }, + "addToAddressBookModalPlaceholder": { + "message": "cth: John D." + }, + "addAlias": { + "message": "Tambah alias" + }, + "addToken": { + "message": "Tambah Token" + }, + "addTokens": { + "message": "Tambah Token" + }, + "addSuggestedTokens": { + "message": "Tambah Token yang Disarankan" + }, + "addAcquiredTokens": { + "message": "Tambahkan token yang sudah Anda peroleh menggunakan MetaMask" + }, + "amount": { + "message": "Jumlah" + }, + "appDescription": { + "message": "Sebuah Dompet Ethereum di Peramban Anda", + "description": "The description of the application" + }, + "approve": { + "message": "Setujui" + }, + "approved": { + "message": "Disetujui" + }, + "asset": { + "message": "Aset" + }, + "attemptingConnect": { + "message": "Mencoba menghubungkan ke blockchain." + }, + "attemptToCancel": { + "message": "Coba Batalkan?" + }, + "attemptToCancelDescription": { + "message": "Mengirimkan upaya ini tidak menjamin transaksi asli Anda akan dibatalkan. Jika upaya pembatalan berhasil, Anda akan dikenakan biaya transaksi di atas." + }, + "attributions": { + "message": "Atribusi" + }, + "autoLockTimeLimit": { + "message": "Jangka Waktu Keluar-Otomatis (menit)" + }, + "autoLockTimeLimitDescription": { + "message": "Atur waktu diam dalam menit sebelum MetaMask mengeluarkan Anda secara otomatis" + }, + "average": { + "message": "Rata-rata" + }, + "back": { + "message": "Mundur" + }, + "backToAll": { + "message": "Kembali ke Semua" + }, + "backupApprovalNotice": { + "message": "Cadangkan kode Pemulihan Rahasia guna mengamankan dompet dan dana Anda." + }, + "backupApprovalInfo": { + "message": "Kode rahasia Anda diperlukan untuk memulihkan dompet jika perangkat hilang, lupa sandi, harus menginstal ulang MetaMask, atau ingin mengakses dompet Anda di perangkat lain." + }, + "backupNow": { + "message": "Cadangkan sekarang" + }, + "balance": { + "message": "Saldo" + }, + "balanceOutdated": { + "message": "Saldo mungkin kedaluwarsa" + }, + "basic": { + "message": "Dasar" + }, + "blockExplorerUrl": { + "message": "Blokir Penjelajah" + }, + "blockExplorerView": { + "message": "Lihat akun di $1", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "Gunakan Blockies Identicon" + }, + "browserNotSupported": { + "message": "Peramban Anda tidak didukung..." + }, + "builtInCalifornia": { + "message": "MetaMask dirancang dan dibangun di California." + }, + "buyWithWyre": { + "message": "Membeli ETH dengan Wyre" + }, + "buyWithWyreDescription": { + "message": "Wyre mengizinkan Anda menggunakan kartu kredit untuk mendepositkan ETH langsung ke akun MetaMask." + }, + "buyCoinSwitch": { + "message": "Beli di CoinSwitch" + }, + "buyCoinSwitchExplainer": { + "message": "CoinSwitch adalah destinasi serba-ada untuk pertukaran lebih dari 300 mata uang kripto dengan kurs terbaik." + }, + "bytes": { + "message": "Byte" + }, + "off": { + "message": "Mati" + }, + "ok": { + "message": "Oke" + }, + "on": { + "message": "Aktif" + }, + "optionalBlockExplorerUrl": { + "message": "Blokir URL Penjelajah (opsional)" + }, + "cancel": { + "message": "Batal" + }, + "cancelAttempt": { + "message": "Batalkan Percobaan" + }, + "cancellationGasFee": { + "message": "Pembatalan Biaya Gas" + }, + "cancelled": { + "message": "Dibatalkan" + }, + "chainId": { + "message": "ID Rantai" + }, + "clickToRevealSeed": { + "message": "Klik di sini untuk mengungkapkan kata-kata rahasia" + }, + "close": { + "message": "Tutup" + }, + "chromeRequiredForHardwareWallets": { + "message": "Anda harus menggunakan MetaMask di Google Chrome untuk menyambung ke dompet Perangkat Keras Anda." + }, + "confirm": { + "message": "Konfirmasi" + }, + "confirmed": { + "message": "Dikonfirmasi" + }, + "confirmPassword": { + "message": "Konfirmasi Sandi" + }, + "confirmSecretBackupPhrase": { + "message": "Konfirmasikan Frasa Cadangan Rahasia Anda" + }, + "congratulations": { + "message": "Selamat" + }, + "connectHardwareWallet": { + "message": "Hubungkan Dompet Peranti Keras" + }, + "connect": { + "message": "Sambungkan" + }, + "connectingTo": { + "message": "Menghubungkan ke $1" + }, + "connectingToKovan": { + "message": "Menyambung ke Jaringan Tes Kovan" + }, + "connectingToMainnet": { + "message": "Menghubungkan ke Jaringan Ethereum Utama" + }, + "connectingToRopsten": { + "message": "Menghubungkan ke Jaringan Uji Coba Ropsten " + }, + "connectingToRinkeby": { + "message": "Menghubungkan ke Jaringan Uji Coba Rinkeby " + }, + "connectingToLocalhost": { + "message": "Menghubungkan ke Localhost 8545" + }, + "connectingToGoerli": { + "message": "Menghubungkan ke Jaringan Uji Coba Goerli" + }, + "continueToWyre": { + "message": "Lanjutkan ke Wyre" + }, + "continueToCoinSwitch": { + "message": "Lanjut ke CoinSwitch" + }, + "contractDeployment": { + "message": "Penerapan Kontrak" + }, + "copiedExclamation": { + "message": "Disalin!" + }, + "copyAddress": { + "message": "Salin alamat ke clipboard" + }, + "copyTransactionId": { + "message": "Salin ID Transaksi" + }, + "copiedTransactionId": { + "message": "ID Transaksi Tersalin" + }, + "copyToClipboard": { + "message": "Salin ke papan klip" + }, + "copyPrivateKey": { + "message": "Ini adalah kunci pribadi Anda (klik untuk menyalin)" + }, + "create": { + "message": "Buat" + }, + "createAccount": { + "message": "Buat Akun" + }, + "createAWallet": { + "message": "Buat Dompet" + }, + "createPassword": { + "message": "Buat Sandi" + }, + "currencyConversion": { + "message": "Konversi Mata Uang" + }, + "currentLanguage": { + "message": "Bahasa Saat Ini" + }, + "customGas": { + "message": "Kustomisasi Bensin" + }, + "customGasSubTitle": { + "message": "Meningkatkan harga dapat mengurangi waktu pemrosesan, tetapi ini tidak dijamin." + }, + "customToken": { + "message": "Token Kustom" + }, + "customRPC": { + "message": "RPC Kustom" + }, + "decimalsMustZerotoTen": { + "message": "Desimal harus sekurang-kurangnya 0, dan tidak lebih dari 36." + }, + "decimal": { + "message": "Ketelitian Desimal" + }, + "defaultNetwork": { + "message": "Jaringan default untuk transaksi Ether adalah Main Net." + }, + "delete": { + "message": "Hapus" + }, + "deleteAccount": { + "message": "Hapus Akun" + }, + "details": { + "message": "Detail" + }, + "directDepositEther": { + "message": "Deposit Ether Langsung" + }, + "directDepositEtherExplainer": { + "message": "Jika Anda sudah memiliki Ether, cara tercepat mendapatkan Ether di dompet baru lewat deposit langsung." + }, + "done": { + "message": "Selesai" + }, + "downloadGoogleChrome": { + "message": "Unduh Google Chrome" + }, + "downloadSecretBackup": { + "message": "Unduh Frasa Cadangan Rahasia ini dan simpanlah dengan aman di hard drive eksternal atau media penyimpanan terenkripsi." + }, + "downloadStateLogs": { + "message": "Unduh Log Kondisi" + }, + "dontHaveAHardwareWallet": { + "message": "Tidak punya dompet perangkat keras?" + }, + "dropped": { + "message": "Jatuh" + }, + "editContact": { + "message": "Sunting Kontak" + }, + "endOfFlowMessage1": { + "message": "Anda lulus tes - jagalah agar frasa benih Anda aman, itu tanggung jawab Anda!" + }, + "endOfFlowMessage2": { + "message": "Tips menyimpan secara aman" + }, + "endOfFlowMessage3": { + "message": "Simpanlah cadangan di beberapa tempat." + }, + "endOfFlowMessage4": { + "message": "Jangan pernah bagikan frasa dengan siapa pun." + }, + "endOfFlowMessage5": { + "message": "Hati-hati terhadap phishing! MetaMask tidak akan pernah meminta frasa benih Anda secara spontan." + }, + "endOfFlowMessage6": { + "message": "Jika Anda perlu mencadangkan frase seed lagi, Anda dapat menemukannya dalam Pengaturan -> Keamanan." + }, + "endOfFlowMessage7": { + "message": "Jika Anda punya pertanyaan atau melihat sesuatu yang ganjil, kirimkan email ke support@metamask.io." + }, + "endOfFlowMessage8": { + "message": "MetaMask tidak dapat memulihkan frasa seed Anda. Pelajari lebih lanjut." + }, + "endOfFlowMessage9": { + "message": "Pelajari lebih lanjut." + }, + "endOfFlowMessage10": { + "message": "Selesai" + }, + "ensRegistrationError": { + "message": "Terjadi kesalahan dalam pendaftaran nama ENS" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "Nama ENS tidak ditemukan pada jaringan saat ini. Cobalah beralih ke jaringan Ethereum utama." + }, + "enterAnAlias": { + "message": "Masukkan alias" + }, + "enterPassword": { + "message": "Masukkan sandi" + }, + "enterPasswordContinue": { + "message": "Masukkan sandi untuk melanjutkan" + }, + "ethereumPublicAddress": { + "message": "Alamat Publik Ethereum " + }, + "etherscanView": { + "message": "Lihat akun di Etherscan" + }, + "estimatedProcessingTimes": { + "message": "Estimasi Waktu Pemrosesan" + }, + "expandView": { + "message": "Bentangkan Tampilan" + }, + "exportPrivateKey": { + "message": "Ekspor Kunci Privat" + }, + "failed": { + "message": "Gagal" + }, + "fast": { + "message": "Cepat" + }, + "faster": { + "message": "Lebih Cepat" + }, + "fileImportFail": { + "message": "Impor berkas tidak tersedia? Klik di sini!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "Lupakan perangkat ini" + }, + "from": { + "message": "Dari" + }, + "functionType": { + "message": "Jenis Fungsi" + }, + "gasLimit": { + "message": "Batas Gas" + }, + "gasLimitInfoModalContent": { + "message": "Limit Bensin adalah jumlah maksimal satuan bensin yang Anda bersedia gunakan." + }, + "gasLimitTooLow": { + "message": "Batas Gas harus paling tidak 21000" + }, + "gasUsed": { + "message": "Gas yang Digunakan" + }, + "gasPrice": { + "message": "Harga Bensin (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "Harga Bensin Amat Rendah" + }, + "gasPriceInfoModalContent": { + "message": "Harga gas menentukan jumlah Ether yang bersedia Anda bayarkan untuk setiap unit gas." + }, + "gasPriceNoDenom": { + "message": "Harga Bensin" + }, + "general": { + "message": "Umum" + }, + "generalSettingsDescription": { + "message": "Konversi mata uang, mata uang utama, bahasa, blockies identicon" + }, + "getEther": { + "message": "Dapatkan Ether" + }, + "getEtherFromFaucet": { + "message": "Dapatkan Ether dari keran untuk $1", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "Dapatkan Bantuan." + }, + "getStarted": { + "message": "Mulai" + }, + "happyToSeeYou": { + "message": "Kami senang bertemu dengan Anda." + }, + "hardware": { + "message": "perangkat keras" + }, + "hardwareWalletConnected": { + "message": "Dompet peranti keras terhubung" + }, + "hardwareWallets": { + "message": "Hubungkan dompet peranti keras" + }, + "hardwareWalletsMsg": { + "message": "Pilih dompet hardware yang ingin Anda pakai dengan MetaMask" + }, + "havingTroubleConnecting": { + "message": "Kesulitan menghubungkan?" + }, + "here": { + "message": "di sini", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hexData": { + "message": "Data Hex" + }, + "hide": { + "message": "Sembunyikan" + }, + "hideTokenPrompt": { + "message": "Sembunyikan Token?" + }, + "history": { + "message": "Histori" + }, + "import": { + "message": "Impor", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "Impor Akun" + }, + "importAccountMsg": { + "message": "Akun impor tidak akan dihubungkan dengan frasa benih akun MetaMask yang diciptakan pertama kali. Pelajari lebih lanjut tentang akun impor" + }, + "importAccountSeedPhrase": { + "message": "Impor Akun dengan Frasa Benih" + }, + "importWallet": { + "message": "Impor Dompet" + }, + "importYourExisting": { + "message": "Impor dompet Anda yang ada menggunakan frasa 12 benih kata" + }, + "imported": { + "message": "Diimpor", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "Impor menggunakan frasa benih akun" + }, + "infoHelp": { + "message": "Info & Bantuan" + }, + "initialTransactionConfirmed": { + "message": "Transaksi awal Anda telah dikonfirmasi oleh jaringan. Klik OK untuk kembali." + }, + "insufficientBalance": { + "message": "Saldo tidak mencukupi." + }, + "insufficientFunds": { + "message": "Dana tidak cukup." + }, + "insufficientTokens": { + "message": "Token tak mencukupi." + }, + "invalidAddress": { + "message": "Alamat tidak sah" + }, + "invalidAddressRecipient": { + "message": "Alamat penerima tidak valid" + }, + "knownAddressRecipient": { + "message": "Alamat kontrak dikenal." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "Bukan jaringan ETH, tetapkan ke huruf kecil" + }, + "invalidInput": { + "message": "Input tidak sah." + }, + "invalidRPC": { + "message": "URL RPC Tidak Sah" + }, + "invalidBlockExplorerURL": { + "message": "URL Block Explorer Tidak Sah" + }, + "invalidSeedPhrase": { + "message": "Frasa benih tidak valid" + }, + "jsonFile": { + "message": "Berkas JSON", + "description": "format for importing an account" + }, + "kovan": { + "message": "Jaringan Uji Coba Kovan" + }, + "max": { + "message": "Maks" + }, + "learnMore": { + "message": "Pelajari lebih lanjut" + }, + "ledgerAccountRestriction": { + "message": "Anda perlu menggunakan akun terakhir sebelum dapat menambahkan akun baru." + }, + "letsGoSetUp": { + "message": "Ya, ayo tata!" + }, + "likeToAddTokens": { + "message": "Apakah Anda ingin menambahkan token-token ini?" + }, + "links": { + "message": "Tautan" + }, + "liveGasPricePredictions": { + "message": "Prediksi Harga Gas Langsung" + }, + "loading": { + "message": "Memuat..." + }, + "loadingTokens": { + "message": "Memuat Token..." + }, + "loadMore": { + "message": "Muat Lainnya" + }, + "lock": { + "message": "Keluar" + }, + "mainnet": { + "message": "Jaringan Ethereum Utama" + }, + "memorizePhrase": { + "message": "Ingatlah frasa ini." + }, + "message": { + "message": "Pesan" + }, + "metamaskDescription": { + "message": "Menghubungkan Anda ke Ethereum dan Web Terdesentralisasi." + }, + "metamaskVersion": { + "message": "Versi MetaMask" + }, + "mobileSyncText": { + "message": "Harap masukkan sandi untuk mengonfirmasi ini memang Anda!" + }, + "myAccounts": { + "message": "Akun Saya" + }, + "myWalletAccounts": { + "message": "Akun Dompet Saya" + }, + "myWalletAccountsDescription": { + "message": "Semua akun Anda yang dibuat oleh MetaMask otomatis akan ditambahkan ke bagian ini." + }, + "mustSelectOne": { + "message": "Harus memilih setidaknya 1 token." + }, + "needEtherInWallet": { + "message": "Untuk berinteraksi dengan aplikasi terdesentralisasi menggunakan MetaMask, Anda memerlukan adanya Ether di dompet Anda." + }, + "needImportFile": { + "message": "Anda harus memilih berkas untuk diimpor.", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "Tidak dapat mengirim nominal negatif ETH." + }, + "networkName": { + "message": "Nama Jaringan" + }, + "networks": { + "message": "Jaringan" + }, + "networkSettingsDescription": { + "message": "Tambah dan edit jaringan RPC kustom" + }, + "nevermind": { + "message": "Abaikan" + }, + "newAccount": { + "message": "Akun Baru" + }, + "newAccountDetectedDialogMessage": { + "message": "Alamat baru terdeteksi! Klik di sini untuk menambahkannya ke buku alamat." + }, + "newAccountNumberName": { + "message": "Akun $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "Kontak Baru" + }, + "newContract": { + "message": "Kontrak Baru" + }, + "newPassword": { + "message": "Kata Sandi Baru (min 8 karakter)" + }, + "newNetwork": { + "message": "Jaringan Baru" + }, + "newToMetaMask": { + "message": "Baru di MetaMask?" + }, + "noAlreadyHaveSeed": { + "message": "Tidak, saya sudah memiliki frasa seed" + }, + "protectYourKeys": { + "message": "Lindungi Kunci Anda!" + }, + "protectYourKeysMessage1": { + "message": "Berhati-hatilah dengan frasa seed Anda — terdapat laporan tentang website yang coba mengimitasi MetaMask. MetaMask tidak akan pernah meminta frasa seed Anda!" + }, + "protectYourKeysMessage2": { + "message": "Jaga keamanan frasa Anda. Jika Anda menemukan sesuatu yang mencurigakan, atau ragu dengan sebuah situs web, kirim surel ke support@metamask.io" + }, + "rpcUrl": { + "message": "URL RPC Baru" + }, + "optionalChainId": { + "message": "ID Rantai (opsional)" + }, + "optionalSymbol": { + "message": "Simbol (opsional)" + }, + "newTotal": { + "message": "Total Baru" + }, + "newTransactionFee": { + "message": "Biaya Transaksi Baru" + }, + "next": { + "message": "Berikutnya" + }, + "noAddressForName": { + "message": "Belum ada alamat yang dipasang untuk nama ini." + }, + "noConversionRateAvailable": { + "message": "Kurs Konversi Tidak Tersedia" + }, + "noTransactions": { + "message": "Anda tidak memiliki transaksi" + }, + "notEnoughGas": { + "message": "Bensin Tidak Cukup" + }, + "noWebcamFoundTitle": { + "message": "Webcam tidak ditemukan" + }, + "noWebcamFound": { + "message": "Webcam komputer Anda tidak ditemukan. Harap coba kembali." + }, + "ofTextNofM": { + "message": "dari" + }, + "orderOneHere": { + "message": "Pesanlah Trezor atau Ledger dan simpan dana Anda di penyimpanan dingin" + }, + "origin": { + "message": "Asal" + }, + "parameters": { + "message": "Parameter" + }, + "participateInMetaMetrics": { + "message": "Berpartisipasilah di MetaMetrics" + }, + "participateInMetaMetricsDescription": { + "message": "Berpartisipasilah dalam MetaMetrics guna membantu kami menjadikan MetaMask lebih baik" + }, + "password": { + "message": "Sandi" + }, + "passwordsDontMatch": { + "message": "Sandi Tidak Sama" + }, + "passwordNotLongEnough": { + "message": "Sandi kurang panjang" + }, + "pastePrivateKey": { + "message": "Tempelkan string kunci privat di sini:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "tertunda" + }, + "personalAddressDetected": { + "message": "Alamat personal terdeteksi. Masukkan alamat kontrak token." + }, + "prev": { + "message": "Sebelumnya" + }, + "primaryCurrencySetting": { + "message": "Mata Uang Utama" + }, + "primaryCurrencySettingDescription": { + "message": "Pilih asli untuk memprioritaskan menampilkan nilai dalam mata uang asli dari rantai (cth: ETH). Pilih Fiat untuk memprioritaskan menampilkan nilai dalam mata uang fiat pilihan Anda." + }, + "privacyMsg": { + "message": "Kebijakan Privasi" + }, + "privateKey": { + "message": "Kunci Pribadi", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "PERINGATAN: Jangan pernah mengungkap kunci ini. Siapa saja dapat mencuri aset yang tersimpan di akun Anda dengan kunci pribadi Anda." + }, + "privateNetwork": { + "message": "Jaringan Privat" + }, + "queue": { + "message": "Antrean" + }, + "readdToken": { + "message": "Anda dapat menambahkan token ini kembali di masa mendatang dengan memilih opsi \"Tambah Token\" di menu opsi akun Anda." + }, + "recents": { + "message": "Terkini" + }, + "recipientAddress": { + "message": "Alamat Penerima" + }, + "recipientAddressPlaceholder": { + "message": "Pencarian, alamat publik (0x), atau ENS" + }, + "rejectAll": { + "message": "Tolak Semua" + }, + "rejectTxsN": { + "message": "Tolak transaksi $1" + }, + "rejectTxsDescription": { + "message": "Anda akan menolak tumpak $1 transaksi." + }, + "rejected": { + "message": "Ditolak" + }, + "reset": { + "message": "Setel ulang" + }, + "resetAccount": { + "message": "Reset Akun" + }, + "resetAccountDescription": { + "message": "Mengatur ulang akun akan membersihkan riwayat transaksi Anda." + }, + "deleteNetwork": { + "message": "Hapus Jaringan?" + }, + "deleteNetworkDescription": { + "message": "Apakah Anda yakin ingin menghapus jaringan ini?" + }, + "remindMeLater": { + "message": "Ingatkan saya nanti." + }, + "restoreFromSeed": { + "message": "Pulihkan Akun?" + }, + "restoreAccountWithSeed": { + "message": "Pulihkan Akun Anda dengan Frasa Benih" + }, + "requestsAwaitingAcknowledgement": { + "message": "permintaan menunggu untuk dibenarkan" + }, + "required": { + "message": "Dibutuhkan" + }, + "restore": { + "message": "Pulihkan" + }, + "revealSeedWords": { + "message": "Singkap Kata-Kata Benih" + }, + "revealSeedWordsTitle": { + "message": "Frasa Seed" + }, + "revealSeedWordsDescription": { + "message": "Jika mengganti peramban atau memindahkan komputer, Anda akan memerlukan frasa seed ini untuk mengakses akun. Simpanlah di tempat aman dan rahasia." + }, + "revealSeedWordsWarningTitle": { + "message": "JANGAN sebarkan frasa ini ke siapa pun!" + }, + "revealSeedWordsWarning": { + "message": "Kata-kata ini dapat digunakan untuk mencuri semua akun Anda." + }, + "remove": { + "message": "Hapus" + }, + "removeAccount": { + "message": "Hapus akun" + }, + "removeAccountDescription": { + "message": "Akun ini akan dihapus dari dompet. Pastikan Anda memiliki frasa seed asli atau kunci privat untuk akun impor ini sebelum melanjutkan. Anda dapat mengimpor atau membuat akun lagi dari menu drop-down akun." + }, + "readyToConnect": { + "message": "Siap untuk Menyambung?" + }, + "rinkeby": { + "message": "Jaringan Uji Rinkeby" + }, + "ropsten": { + "message": "Jaringan Tes Ropsten" + }, + "goerli": { + "message": "Jaringan Uji Goerli" + }, + "save": { + "message": "Simpan" + }, + "slow": { + "message": "Lambat" + }, + "slower": { + "message": "Lebih Lambat" + }, + "saveAsCsvFile": { + "message": "Simpan sebagai Berkas CSV" + }, + "scanInstructions": { + "message": "Tempatkan kode QR di depan kamera Anda" + }, + "scanQrCode": { + "message": "Pindai Kode QR" + }, + "search": { + "message": "Telusuri" + }, + "searchResults": { + "message": "Hasil Pencarian" + }, + "secretBackupPhrase": { + "message": "Frasa Cadangan Rahasia" + }, + "secretBackupPhraseDescription": { + "message": "Frasa cadangan rahasia Anda akan memudahkan untuk membuat cadangan dan memulihkan akun Anda." + }, + "secretBackupPhraseWarning": { + "message": "PERINGATAN: Jangan pernah mengungkap frasa cadangan Anda. Siapa saja dapat mengambil Ether Anda selamanya dengan frasa ini." + }, + "secretPhrase": { + "message": "Masukkan frasa dua belas kata rahasia Anda di sini untuk memulihkan lemari besi Anda." + }, + "securityAndPrivacy": { + "message": "Keamanan & Privasi" + }, + "securitySettingsDescription": { + "message": "Pengaturan privasi dan frasa seed dompet" + }, + "seedPhrasePlaceholder": { + "message": "Pisahkan setiap kata dengan spasi tunggal" + }, + "seedPhraseReq": { + "message": "Frasa seed terdiri atas 12 kata" + }, + "selectCurrency": { + "message": "Pilih Mata Uang" + }, + "selectEachPhrase": { + "message": "Silakan pilih setiap frasa untuk memastikan bahwa ini benar." + }, + "selectLocale": { + "message": "Pilih Lokal" + }, + "selectType": { + "message": "Pilih Jenis" + }, + "send": { + "message": "Kirim" + }, + "sendAmount": { + "message": "Nominal Kirim" + }, + "sendETH": { + "message": "Kirim ETH" + }, + "sendTokens": { + "message": "Kirim Token" + }, + "sentEther": { + "message": "kirim ether" + }, + "sentTokens": { + "message": "token terkirim" + }, + "separateEachWord": { + "message": "Pisahkan setiap kata dengan spasi tunggal" + }, + "searchTokens": { + "message": "Cari Token" + }, + "selectAnAccount": { + "message": "Pilih Akun" + }, + "selectAnAccountHelp": { + "message": "Pilih akun untuk dilihat di MetaMask" + }, + "selectAHigherGasFee": { + "message": "Pilih biaya gas yang lebih tinggi untuk mempercepat proses transaksi Anda.*" + }, + "selectHdPath": { + "message": "Pilih HD Path" + }, + "selectPathHelp": { + "message": "Jika tidak melihat akun Buku Besar Anda saat ini di bawah, cobalah beralih jalur ke \"Legacy (MEW / MyCrypto)\"" + }, + "settings": { + "message": "Setelan" + }, + "showAdvancedGasInline": { + "message": "Kendali gas tingkat lanjut" + }, + "showAdvancedGasInlineDescription": { + "message": "Pilih ini untuk menampilkan harga gas dan batasi kontrol langsung pada layar pengiriman dan konfirmasi." + }, + "showFiatConversionInTestnets": { + "message": "Tampilkan Konversi di Testnets" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Pilih ini untuk menampilkan konversi fiat di Testnets" + }, + "showPrivateKeys": { + "message": "Tampilkan Kunci Pribadi" + }, + "showHexData": { + "message": "Tampilkan Data Hex" + }, + "showHexDataDescription": { + "message": "Pilih ini untuk menampilkan larik data heksadesimal pada layar pengiriman" + }, + "sign": { + "message": "Tanda tangani" + }, + "signatureRequest": { + "message": "Permintaan Tanda Tangan" + }, + "signed": { + "message": "Ditandatangani" + }, + "signNotice": { + "message": "Menandatangani pesan ini dapat memberi efek samping yang berbahaya. Hanya tanda tangani pesan dari situs yang benar-benar Anda percayakan dengan seluruh akun Anda.\nMetode berbahaya ini akan dihapus di versi mendatang." + }, + "sigRequest": { + "message": "Permintaan Tanda Tangan" + }, + "somethingWentWrong": { + "message": "Ups! Terjadi sesuatu." + }, + "speedUp": { + "message": "Percepat" + }, + "speedUpCancellation": { + "message": "Percepat pembatalan ini" + }, + "speedUpTransaction": { + "message": "Percepat transaksi ini" + }, + "switchNetworks": { + "message": "Ganti Jaringan" + }, + "stateLogs": { + "message": "Log Kondisi" + }, + "stateLogsDescription": { + "message": "Log status mengandung alamat akun publik dan transaksi terkirim Anda." + }, + "stateLogError": { + "message": "Kesalahan dalam mengambil log kondisi." + }, + "step1HardwareWallet": { + "message": "1. Hubungkan Dompet Peranti Keras" + }, + "step1HardwareWalletMsg": { + "message": "Hubungkan dompet perangkat keras Anda langsung ke komputer Anda." + }, + "step2HardwareWallet": { + "message": "2. Pilih Akun" + }, + "step2HardwareWalletMsg": { + "message": "Pilih akun yang ingin Anda tinjau. Anda hanya dapat memilih satu akun pada satu waktu." + }, + "step3HardwareWallet": { + "message": "3. Mulai gunakan dApps dan lainnya!" + }, + "step3HardwareWalletMsg": { + "message": "Gunakan akun peranti keras Anda seperti layaknya akun Ethereum. Masuklah ke dApps, kirim Eth, beli dan simpan token ERC20 dan token Non-Fungible seperti CryptoKitties." + }, + "storePhrase": { + "message": "Simpan frasa ini dalam manajer sandi seperti 1Password." + }, + "submitted": { + "message": "Terkirim" + }, + "supportCenter": { + "message": "Kunjungi Pusat Bantuan kami" + }, + "symbol": { + "message": "Simbol" + }, + "symbolBetweenZeroTwelve": { + "message": "Simbol harus antara 0 sampai 12 karakter." + }, + "syncWithMobile": { + "message": "Sinkronkan dengan ponsel" + }, + "syncWithMobileTitle": { + "message": "Sinkronkan dengan seluler" + }, + "syncWithMobileDesc": { + "message": "Anda dapat menyinkronkan akun dan informasi Anda dengan perangkat seluler. Buka aplikasi seluler MetaMask, pilih \"Pengaturan\" lalu ketuk \"Sinkronkan dari Ekstensi Peramban\"" + }, + "syncWithMobileDescNewUsers": { + "message": "Jika Anda baru saja membuka aplikasi MetaMask Mobile untuk pertama kali, ikuti langkah-langkah pada ponsel Anda." + }, + "syncWithMobileScanThisCode": { + "message": "Pindai kode ini dengan aplikasi ponsel MetaMask " + }, + "syncWithMobileBeCareful": { + "message": "Pastikan tidak ada yang melihat ke layar ketika kode ini Anda pindai" + }, + "syncWithMobileComplete": { + "message": "Data Anda telah berhasil disinkronkan. Nikmati aplikasi mobile MetaMask!" + }, + "terms": { + "message": "Syarat Penggunaan" + }, + "testFaucet": { + "message": "Tes Keran" + }, + "thisWillCreate": { + "message": "Ini akan membuat dompet dan frasa seed baru" + }, + "tips": { + "message": "Tip" + }, + "to": { + "message": "Ke" + }, + "tokenAlreadyAdded": { + "message": "Token sudah ditambahkan." + }, + "tokenContractAddress": { + "message": "Alamat Kontrak Token" + }, + "tokenSymbol": { + "message": "Simbol Token" + }, + "transaction": { + "message": "transaksi" + }, + "transactionConfirmed": { + "message": "Transaksi dikonfirmasi di $2." + }, + "transactionCreated": { + "message": "Transaksi dibuat dengan nilai $1 di $2." + }, + "transactionDropped": { + "message": "Transaksi dibatalkan di $2." + }, + "transactionSubmitted": { + "message": "Transaksi diajukan dengan biaya gas sebesar $1 di $2." + }, + "transactionResubmitted": { + "message": "Transaksi dikirim ulang dengan biaya gas meningkat menjadi $1 di $2" + }, + "transactionUpdated": { + "message": "Transaksi diperbarui di $2." + }, + "transactionErrored": { + "message": "Transaksi mengalami eror." + }, + "transactionCancelAttempted": { + "message": "Pembatalan transaksi dicoba dengan biaya gas sebesar $1 di $2" + }, + "transactionCancelSuccess": { + "message": "Transaksi berhasil dibatalkan di $2." + }, + "transactionError": { + "message": "Eror Transaksi. Pengecualian dimasukkan ke dalam kode kontrak." + }, + "transactionErrorNoContract": { + "message": "Mencoba memanggil fungsi pada alamat non-kontrak." + }, + "transactionFee": { + "message": "Biaya Transaksi" + }, + "transactionTime": { + "message": "Waktu Transaksi" + }, + "transferBetweenAccounts": { + "message": "Transfer antar akun saya" + }, + "transferFrom": { + "message": "Transfer Dari" + }, + "troubleTokenBalances": { + "message": "Kami menemui masalah dalam memuat saldo token. Anda dapat melihatnya", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "Coba lagi" + }, + "typePassword": { + "message": "Ketik kata sandi MetaMask Anda" + }, + "unapproved": { + "message": "Tak disetujui" + }, + "units": { + "message": "unit" + }, + "unknown": { + "message": "Tidak dikenal" + }, + "unknownNetwork": { + "message": "Jaringan Pribadi Tak Dikenal" + }, + "unknownQrCode": { + "message": "Kesalahan: Kami tidak dapat mengidentifikasi kode QR itu" + }, + "unknownCameraErrorTitle": { + "message": "Ups! Terjadi sesuatu..." + }, + "unknownCameraError": { + "message": "Terjadi eror saat mencoba mengakses kamera. Harap coba ulang..." + }, + "unlock": { + "message": "Buka kunci" + }, + "unlockMessage": { + "message": "Web terdesentralisasi menanti" + }, + "updatedWithDate": { + "message": "Diperbarui $1" + }, + "urlErrorMsg": { + "message": "URI memerlukan awalan HTTP/HTTPS yang sesuai." + }, + "usedByClients": { + "message": "Digunakan oleh berbagai klien" + }, + "userName": { + "message": "Nama Pengguna" + }, + "viewAccount": { + "message": "Lihat Akun" + }, + "viewinExplorer": { + "message": "Lihat di Explorer" + }, + "viewContact": { + "message": "Lihat Kontak" + }, + "viewOnCustomBlockExplorer": { + "message": "Lihat di $1" + }, + "viewOnEtherscan": { + "message": "Lihat di Etherscan" + }, + "visitWebSite": { + "message": "Kunjungi website kami" + }, + "walletSeed": { + "message": "Benih Dompet" + }, + "welcomeBack": { + "message": "Selamat Datang Kembali!" + }, + "welcome": { + "message": "Selamat Datang di MetaMask" + }, + "writePhrase": { + "message": "Tuliskan frasa ini di selembar kertas dan simpan di tempat aman. Jika ingin lebih aman, tulislah di beberapa lembar kertas dan simpan masing-masing kertas di 2 - 3 lokasi berbeda." + }, + "yesLetsTry": { + "message": "Ya, ayo kita coba" + }, + "youNeedToAllowCameraAccess": { + "message": "Anda perlu mengizinkan akses kamera untuk menggunakan fitur ini." + }, + "yourSigRequested": { + "message": "Tanda tangan Anda sedang diminta" + }, + "youSign": { + "message": "Anda menandatangani" + }, + "yourPrivateSeedPhrase": { + "message": "Frase benih pribadi Anda" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "Harga gas nol saat mempercepat" + } +} diff --git a/app/_locales/index.json b/app/_locales/index.json index 30fb87faf3a7..31199dcabb93 100644 --- a/app/_locales/index.json +++ b/app/_locales/index.json @@ -1,24 +1,57 @@ [ + { "code": "am", "name": "አማርኛ" }, + { "code": "ar", "name": "العربية" }, + { "code": "bg", "name": "българÑки" }, + { "code": "bn", "name": "বাংলা" }, + { "code": "ca", "name": "Català" }, { "code": "cs", "name": "ÄŒeÅ¡tina" }, - { "code": "de", "name": "Deutsche" }, + { "code": "da", "name": "Dansk" }, + { "code": "de", "name": "Deutsch" }, + { "code": "el", "name": "ελληνικά" }, { "code": "en", "name": "English" }, { "code": "es", "name": "Español" }, + { "code": "es_419", "name": "Español (Latin America)" }, + { "code": "et", "name": "Estonian" }, + { "code": "fa", "name": "ÙØ§Ø±Ø³ÛŒ" }, + { "code": "fi", "name": "Suomi" }, + { "code": "fil", "name": "Filipino" }, { "code": "fr", "name": "Français" }, - { "code": "ht", "name": "Kreyòl ayisyen" }, + { "code": "gu", "name": "ગà«àªœàª°àª¾àª¤" }, + { "code": "he", "name": "עברית" }, + { "code": "hi", "name": "मानक हिनà¥à¤¦à¥€" }, { "code": "hn", "name": "हिनà¥à¤¦à¥€" }, + { "code": "hr", "name": "Hrvatski" }, + { "code": "ht", "name": "Kreyòl ayisyen" }, + { "code": "hu", "name": "Magyar" }, + { "code": "id", "name": "Bahasa Indonesia" }, { "code": "it", "name": "Italiano" }, { "code": "ja", "name": "日本語" }, + { "code": "kn", "name": "ಕನà³à²¨à²¡" }, { "code": "ko", "name": "한국어" }, + { "code": "lt", "name": "LietuviÅ¡kai" }, + { "code": "lv", "name": "Latvian" }, + { "code": "ml", "name": "മലയാളം" }, + { "code": "mr", "name": "मराठी" }, + { "code": "ms", "name": "Malay" }, { "code": "nl", "name": "Nederlands" }, + { "code": "no", "name": "Norwegian" }, { "code": "ph", "name": "Pilipino" }, { "code": "pl", "name": "Polskie" }, { "code": "pt", "name": "Português" }, + { "code": "pt_BR", "name": "Português (Brazillian)" }, + { "code": "pt_PT", "name": "Português (European)" }, + { "code": "ro", "name": "Limba română" }, { "code": "ru", "name": "РуÑÑкий" }, { "code": "sk", "name": "SlovenÄina" }, { "code": "sl", "name": "SlovenÅ¡Äina" }, + { "code": "sr", "name": "ÑрпÑки" }, + { "code": "sv", "name": "Svenska" }, + { "code": "sw", "name": "Swahili" }, + { "code": "ta", "name": "தமிழà¯" }, + { "code": "te", "name": "తెలà±à°—à±" }, { "code": "th", "name": "ไทย" }, - { "code": "tml", "name": "தமிழà¯" }, { "code": "tr", "name": "Türkçe" }, + { "code": "uk", "name": "УкраїнÑька мова" }, { "code": "vi", "name": "Tiếng Việt" }, { "code": "zh_CN", "name": "中文(简体)" }, { "code": "zh_TW", "name": "中文(ç¹é«”)" } diff --git a/app/_locales/it/messages.json b/app/_locales/it/messages.json index c79f22b710a8..62683c407bbd 100644 --- a/app/_locales/it/messages.json +++ b/app/_locales/it/messages.json @@ -1,64 +1,123 @@ { - "privacyMode": { - "message": "Modalità privacy" + "acceptTermsOfUse": { + "message": "Ho letto e accetto i $1", + "description": "$1 is the `terms` message" }, - "privacyModeDescription": { - "message": "I siti Web devono richiedere l'accesso per visualizzare le informazioni del tuo account." + "eth_accounts": { + "message": "Accesso agli indirizzi dei tuoi account autorizzati (richiesto)", + "description": "The description for the `eth_accounts` permission" }, - "exposeAccounts": { - "message": "Esponi Accounts" + "connectedSites": { + "message": "Siti connessi" }, - "exposeDescription": { - "message": "Esporre gli account al sito Web corrente. Utile per dapps legacy." + "connectedSitesDescription": { + "message": "$1 è connesso a questi siti che hanno accesso all'indirizzo del tuo account.", + "description": "$1 is the account name" + }, + "connectedSitesEmptyDescription": { + "message": "$1 non è connesso ad alcun sito.", + "description": "$1 is the account name" + }, + "connectedAccountsDescriptionSingular": { + "message": "Hai un account connesso a questo sito." + }, + "connectedAccountsDescriptionPlural": { + "message": "Hai $1 account connessi a questo sito.", + "description": "$1 is the number of accounts" + }, + "connectedAccountsEmptyDescription": { + "message": "MetaMask non è connesso a questo sito. Per connetterti ad un sito web3, trova il pulsante di connessione." + }, + "currentAccountNotConnected": { + "message": "Il tuo account corrente non è connesso" + }, + "switchToThisAccount": { + "message": " Passa a questo account" + }, + "disconnectThisAccount": { + "message": "Disconnetti questo account" + }, + "permissions": { + "message": "Permessi" + }, + "showPermissions": { + "message": "Mostra permessi" + }, + "authorizedPermissions": { + "message": "Hai autorizzato i seguenti permessi" + }, + "connectManually": { + "message": "Connettiti al sito manualmente" + }, + "disconnect": { + "message": "Disconnetti" + }, + "disconnectAllAccounts": { + "message": "Disconnetti tutti gli account" + }, + "disconnectPrompt": { + "message": "Disconnetti $1" + }, + "disconnectAllAccountsConfirmationDescription": { + "message": "Sicuro di volerti disconnettere? Il sito potrebbe non funzionare correttamente." + }, + "dismiss": { + "message": "Ignora" + }, + "showIncomingTransactions": { + "message": "Mostra Transazioni in Ingresso" + }, + "showIncomingTransactionsDescription": { + "message": "Usa Etherscan per visualizzare le transazioni in ingresso nella lista delle transazioni" }, "chartOnlyAvailableEth": { "message": "Grafico disponibile solo per le reti Ethereum." }, - "confirmExpose": { - "message": "Sei sicuro di voler esporre i tuoi account al sito web corrente?" + "connecting": { + "message": "Connessione..." }, - "confirmClear": { - "message": "Sei sicuro di voler cancellare i siti Web approvati?" + "connectWithMetaMask": { + "message": "Connetti con MetaMask" }, - "contractInteraction": { - "message": "Interazione Contratto" + "connectTo": { + "message": "Connettiti a $1", + "description": "$1 is the name/origin of a site/dapp that the user can connect to metamask" }, - "clearApprovalDataSuccess": { - "message": "Dati del sito Web approvati cancellati correttamente." + "connectToAll": { + "message": "Connettiti a tutti i tuoi $1", + "description": "$1 will be replaced by the translation of connectToAllAccounts" }, - "approvalData": { - "message": "Dati di approvazione" + "connectToAllAccounts": { + "message": "account", + "description": "will replace $1 in connectToAll, completing the sentence 'connect to all of your accounts', will be text that shows list of accounts on hover" }, - "approvalDataDescription": { - "message": "Cancella i dati del sito web approvati, quindi tutti i siti devono richiedere nuovamente l'approvazione." + "connectToMultiple": { + "message": "Connettiti a $1", + "description": "$1 will be replaced by the translation of connectToMultipleNumberOfAccounts" }, - "clearApprovalData": { - "message": "Cancella i dati di approvazione" + "connectToMultipleNumberOfAccounts": { + "message": "$1 account", + "description": "$1 is the number of accounts to which the web3 site/application is asking to connect; this will substitute $1 in connectToMultiple" + }, + "contractInteraction": { + "message": "Interazione Contratto" }, "reject": { "message": "Annulla" }, - "providerRequest": { - "message": "$1 vorrebbe connettersi al tuo account" - }, - "providerRequestInfo": { - "message": "Il dominio elencato di seguito sta tentando di richiedere l'accesso all'API Ethereum in modo che possa interagire con la blockchain di Ethereum. Controlla sempre di essere sul sito corretto prima di approvare l'accesso a Ethereum." - }, "about": { "message": "Informazioni" }, "aboutSettingsDescription": { - "message": "Version, centro di supporto e contatti." - }, - "aboutUs": { - "message": "Chi siamo" - }, - "accept": { - "message": "Accetta" + "message": "Versione, centro di supporto e contatti" }, "acceleratingATransaction": { "message": "* Accelerare una transazione usando un prezzo del gas maggiore aumenta la probabilità che la rete la elabori più velocemente, ma non è garantito." }, + "accessAndSpendNotice": { + "message": "$1 può avere accesso e spendere al massimo", + "description": "$1 is the url of the site requesting ability to spend" + }, "accessingYourCamera": { "message": "Accesso alla fotocamera..." }, @@ -77,26 +136,38 @@ "accountSelectionRequired": { "message": "Devi selezionare un account!" }, + "active": { + "message": "Attivo" + }, + "activity": { + "message": "Attività" + }, "activityLog": { "message": "log attività" }, - "address": { - "message": "Indirizzo" - }, "addNetwork": { "message": "Aggiungi Rete" }, + "addRecipient": { + "message": "Aggiungi destinatario" + }, "advanced": { "message": "Avanzate" }, "advancedSettingsDescription": { - "message": "Accedi alle funzionalità sviluppatore, download dei log di Stato, Reset Account, imposta reti di test e RPC personalizzata." + "message": "Accedi alle funzionalità sviluppatore, download dei log di Stato, Reset Account, imposta reti di test e RPC personalizzata" }, "advancedOptions": { "message": "Opzioni Avanzate" }, - "addCustomToken": { - "message": "Aggiungi un token personalizzato" + "addToAddressBook": { + "message": "Aggiungi alla rubrica" + }, + "addToAddressBookModalPlaceholder": { + "message": "Ad esempio, John D." + }, + "addAlias": { + "message": "Aggiungi alias" }, "addToken": { "message": "Aggiungi Token" @@ -110,31 +181,45 @@ "addAcquiredTokens": { "message": "Aggiungi i token che hai acquistato usando MetaMask" }, - "agreeTermsOfService": { - "message": "Accetto i termini di servizio" + "alerts": { + "message": "Avvisi" }, - "allDone": { - "message": "Tutto Fatto" + "alertsSettingsDescription": { + "message": "Attiva o disattiva ogni avviso" }, - "alreadyHaveSeedPhrase": { - "message": "No, ho già una frase seed" + "alertSettingsUnconnectedAccount": { + "message": "Navigazione su un sito con un account non connesso" + }, + "alertSettingsUnconnectedAccountDescription": { + "message": "Questo avviso è mostrato nel popup quando stai visitando un sito Web3, ma l'account selezionato non è connesso al sito." + }, + "allowOriginSpendToken": { + "message": "Vuoi consentire a $1 di spendere $2?", + "description": "$1 is the url of the site and $2 is the symbol of the token they are requesting to spend" + }, + "allowThisSiteTo": { + "message": "Permetti a questo sito di:" + }, + "allowExternalExtensionTo": { + "message": "Permetti a questa estensione di:" + }, + "allowWithdrawAndSpend": { + "message": "Consenti a $1 di ritirare e spendere fino a questo importo:", + "description": "The url of the site that requested permission to 'withdraw and spend'" }, "amount": { "message": "Importo" }, - "amountPlusGas": { - "message": "Importo + Gas" - }, - "amountPlusTxFee": { - "message": "Importo + Costo TX" + "amountWithColon": { + "message": "Importo:" }, "appDescription": { "message": "Ethereum Browser Extension", - "description": "La descrizione dell'applicazione" + "description": "The description of the application" }, "appName": { "message": "MetaMask", - "description": "Il nome dell'applicazione" + "description": "The name of the application" }, "approve": { "message": "Approva" @@ -145,6 +230,9 @@ "asset": { "message": "Asset" }, + "assets": { + "message": "Patrimonio" + }, "attemptingConnect": { "message": "Tentativo di connessione alla blockchain." }, @@ -157,43 +245,39 @@ "attributions": { "message": "Attribuzioni" }, - "autoLogoutTimeLimit": { - "message": "Timer di Logout Automatico (minuti)" + "autoLockTimeLimit": { + "message": "Timer di logout automatico (minuti)" }, - "autoLogoutTimeLimitDescription": { + "autoLockTimeLimitDescription": { "message": "Imposta il tempo di inattività dopo il quale MetaMask fa il log out automaticamente" }, - "available": { - "message": "Disponibile" - }, "average": { "message": "Media" }, "back": { "message": "Indietro" }, + "backToAll": { + "message": "Torna a \"Tutti\"" + }, + "backupApprovalNotice": { + "message": "Mantieni al sicuro il portafoglio e i fondi eseguendo il backup della frase di recupero." + }, + "backupApprovalInfo": { + "message": "Questo codice è necessario per recuperare il tuo portafoglio nel caso in cui perdi il tuo dispositivo, dimentichi la tua password, debba reinstallare MetaMask o voglia accedere al tuo portafoglio su un altro dispositivo." + }, + "backupNow": { + "message": "Esegui il backup ora" + }, "balance": { "message": "Bilancio:" }, "balanceOutdated": { "message": "Il bilancio può essere non aggiornato" }, - "balances": { - "message": "I tuoi bilanci" - }, - "balanceIsInsufficientGas": { - "message": "Bilancio insufficiente per il gas totale corrente" - }, "basic": { "message": "Base" }, - "beta": { - "message": "BETA" - }, - "betweenMinAndMax": { - "message": "deve essere maggiore o uguale a $1 e minore o uguale a $2.", - "description": "aiuto per inserire un input esadecimale come decimale" - }, "blockExplorerUrl": { "message": "Block Explorer" }, @@ -204,8 +288,14 @@ "blockiesIdenticon": { "message": "Usa le icone Blockie" }, - "borrowDharma": { - "message": "Prendi in presisito con Dharma (Beta)" + "nonceField": { + "message": "Personalizza il numero della transazione" + }, + "nonceFieldHeading": { + "message": "Numero Transazione Personalizzato" + }, + "nonceFieldDescription": { + "message": "Attiva per cambiare il numero della transazione nelle schermate di conferma. Questa è una funzionalità avanzata, usala con cautela." }, "browserNotSupported": { "message": "Il tuo Browser non è supportato..." @@ -213,15 +303,6 @@ "builtInCalifornia": { "message": "MetaMask è progettato e realizzato in California." }, - "buy": { - "message": "Compra" - }, - "buyCoinbase": { - "message": "Compra su Coinbase" - }, - "buyCoinbaseExplainer": { - "message": "Coinbase è il servizio più popolare al mondo per comprare e vendere Bitcoin, Ethereum e Litecoin." - }, "buyWithWyre": { "message": "Compra ETH con Wyre" }, @@ -237,9 +318,15 @@ "bytes": { "message": "Bytes" }, + "off": { + "message": "Off" + }, "ok": { "message": "Ok" }, + "on": { + "message": "On" + }, "optionalBlockExplorerUrl": { "message": "URL del Block Explorer (opzionale)" }, @@ -253,22 +340,10 @@ "message": "Costo di Annullamento in Gas" }, "cancelled": { - "message": "Cancellata" - }, - "cancelN": { - "message": "Annulla tutte le transazioni relative a $1" + "message": "Annullata" }, "chainId": { - "message": "Chain ID" - }, - "classicInterface": { - "message": "Usa l'interfaccia classica" - }, - "clickCopy": { - "message": "Clicca per Copiare" - }, - "clickToAdd": { - "message": "Clicca su $1 per aggiungerli al tuo account" + "message": "Blockchain ID" }, "clickToRevealSeed": { "message": "Clicca qui per rivelare la tua frase segreta" @@ -279,45 +354,30 @@ "chromeRequiredForHardwareWallets": { "message": "Devi usare MetaMask con Google Chrome per connettere il tuo Portafoglio Hardware" }, - "company": { - "message": "Azienda" - }, "confirm": { "message": "Conferma" }, - "confirmationTime": { - "message": "Tempo di conferma (sec)" - }, "confirmed": { "message": "Confermata" }, - "confirmContract": { - "message": "Conferma Contratto" - }, "confirmPassword": { "message": "Conferma Password" }, "confirmSecretBackupPhrase": { "message": "Conferma la tua Frase di Backup Segreta" }, - "confirmTransaction": { - "message": "Conferma Transazione" - }, "congratulations": { "message": "Congratulazioni" }, + "connectAccountOrCreate": { + "message": "Connetti un account o creane uno nuovo" + }, "connectHardwareWallet": { "message": "Connetti Portafoglio Hardware" }, "connect": { "message": "Connetti" }, - "connectRequest": { - "message": "Richiesta Connessione" - }, - "connecting": { - "message": "Connessione..." - }, "connectingTo": { "message": "Connessione in corso a $1" }, @@ -339,20 +399,11 @@ "connectingToGoerli": { "message": "Connessione alla Rete di Test Goerli" }, - "connectingToUnknown": { - "message": "Connessione ad una Rete Sconosciuta" - }, - "connectToLedger": { - "message": "Connettersi al Ledger" - }, - "connectToTrezor": { - "message": "Connettersi al Trezor" + "contacts": { + "message": "Contatti" }, - "continue": { - "message": "Continua" - }, - "continueToCoinbase": { - "message": "Continua su Coinbase" + "contactsSettingsDescription": { + "message": "Aggiungi, modifica, rimuovi e gestisci i tuoi contatti" }, "continueToWyre": { "message": "Continua su Wyre" @@ -363,24 +414,9 @@ "contractDeployment": { "message": "Distribuzione Contratto" }, - "conversionProgress": { - "message": "Conversione in corso" - }, - "copiedButton": { - "message": "Copiato" - }, - "copiedClipboard": { - "message": "Copiato negli Appunti" - }, "copiedExclamation": { "message": "Copiato!" }, - "copiedSafe": { - "message": "Le ho copiate in un posto sicuro" - }, - "copy": { - "message": "Copia" - }, "copyAddress": { "message": "Copia l'indirizzo" }, @@ -393,9 +429,6 @@ "copyToClipboard": { "message": "Copia negli appunti" }, - "copyButton": { - "message": " Copia " - }, "copyPrivateKey": { "message": "Questa è la tua chiave privata (clicca per copiare)" }, @@ -406,30 +439,20 @@ "message": "Crea Account" }, "createAWallet": { - "message": "Crea un Wallet" - }, - "createDen": { - "message": "Crea" + "message": "Crea un Portafoglio" }, "createPassword": { "message": "Crea Password" }, - "crypto": { - "message": "Crypto", - "description": "Tipo di exchange (cryptomonete)" - }, "currencyConversion": { "message": "Conversione Moneta" }, + "currentExtension": { + "message": "Pagina estensione corrente" + }, "currentLanguage": { "message": "Lingua Corrente" }, - "currentNetwork": { - "message": "Rete Corrente" - }, - "currentRpc": { - "message": "RPC Corrente" - }, "customGas": { "message": "Personalizza Gas" }, @@ -439,12 +462,15 @@ "customToken": { "message": "Token Personalizzato" }, - "customize": { - "message": "Personalizza" - }, "customRPC": { "message": "RPC Personalizzata" }, + "customSpendLimit": { + "message": "Limite Spesa Personalizzato" + }, + "dataBackupFoundInfo": { + "message": "Alcuni dati sul tuo account sono state salvate durante una installazione precedente di MetaMask. Questi includono le impostazioni, i contatti, e i token. Vuoi ripristinare questi dati?" + }, "decimalsMustZerotoTen": { "message": "Il numero di decimali deve essere almeno 0, e non oltre 36." }, @@ -454,39 +480,21 @@ "defaultNetwork": { "message": "La rete predefinita per transazioni in Ether è la Rete Ethereum Principale." }, - "denExplainer": { - "message": "Il DEN è il tuo archivio crittato con password dentro MetaMask." + "delete": { + "message": "Elimina" + }, + "deleteAccount": { + "message": "Cancella account" }, "deposit": { "message": "Deposita" }, - "depositBTC": { - "message": "Deposita i tuoi BTC all'indirizzo sotto:" - }, - "depositEth": { - "message": "Deposita Eth" - }, "depositEther": { "message": "Deposita Ether" }, - "depositFiat": { - "message": "Deposita con moneta Fiat" - }, - "depositFromAccount": { - "message": "Deposita da un altro account" - }, - "depositShapeShift": { - "message": "Deposita con ShapeShift" - }, - "depositShapeShiftExplainer": { - "message": "Se possiedi altre criptomonete, puoi scambiare e depositare Ether direttamente nel tuo portafoglio MetaMask. Nessun account richiesto." - }, "details": { "message": "Dettagli" }, - "directDeposit": { - "message": "Deposito Diretto" - }, "directDepositEther": { "message": "Deposita Direttamente Ether" }, @@ -496,6 +504,9 @@ "done": { "message": "Finito" }, + "dontShowThisAgain": { + "message": "Non mostrare di nuovo" + }, "downloadGoogleChrome": { "message": "Scarica Google Chrome" }, @@ -503,7 +514,7 @@ "message": "Scarica questa Frase di Backup Segreta e tienila al sicuro in un hard disk o supporto di memorizzazione esterno criptato." }, "downloadStateLogs": { - "message": "Scarica i log di Stato" + "message": "Scarica i log di stato" }, "dontHaveAHardwareWallet": { "message": "Non hai un portafoglio hardware?" @@ -514,20 +525,11 @@ "edit": { "message": "Modifica" }, - "editNetwork": { - "message": "Modifica Rete" - }, - "editAccountName": { - "message": "Modifica Nome Account" + "editContact": { + "message": "Modifica contatto" }, - "editingTransaction": { - "message": "Modifica la transazione" - }, - "emailUs": { - "message": "Mandaci una mail!" - }, - "encryptNewDen": { - "message": "Cripta il tuo nuovo DEN" + "editPermission": { + "message": "Modifica Permessi" }, "endOfFlowMessage1": { "message": "Hai passato il test - tieni la tua frase seed al sicuro, è tua responsabilità!" @@ -553,20 +555,71 @@ "endOfFlowMessage8": { "message": "MetaMask non può recuperare la tua frase seed. Impara di più." }, - "ensNameNotFound": { - "message": "Nome ENS non trovato" + "endOfFlowMessage9": { + "message": "Scopri di più." + }, + "endOfFlowMessage10": { + "message": "Tutto Fatto" + }, + "externalExtension": { + "message": "Estensione Esterna" + }, + "onboardingReturnNotice": { + "message": "\"$1\" chiuderà questa tab e ritornerà a $2", + "description": "Return the user to the site that initiated onboarding" + }, + "ensRegistrationError": { + "message": "Errore nella registrazione del nome ENS" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "Nome ENS non trovato sulla rete attuale. Prova a passare alla rete principale di Ethereum." + }, + "enterAnAlias": { + "message": "Inserisci un alias" + }, + "enterMaxSpendLimit": { + "message": "Inserisici Limite Spesa" }, "enterPassword": { "message": "Inserisci password" }, - "enterPasswordConfirm": { - "message": "Inserisci la tua password per confermare" - }, "enterPasswordContinue": { "message": "Inserisci la tua password per continuare" }, - "eth": { - "message": "ETH" + "errorCode": { + "message": "Codice: $1", + "description": "Displayed error code for debugging purposes. $1 is the error code" + }, + "errorDetails": { + "message": "Dettagli Errore", + "description": "Title for collapsible section that displays error details for debugging purposes" + }, + "errorMessage": { + "message": "Messaggio: $1", + "description": "Displayed error message for debugging purposes. $1 is the error message" + }, + "errorName": { + "message": "Codice: $1", + "description": "Displayed error name for debugging purposes. $1 is the error name" + }, + "errorPageTitle": { + "message": "MetaMask ha riscontrato un errore", + "description": "Title of generic error page" + }, + "errorPageMessage": { + "message": "Prova di nuovo ricaricando la pagina, o contatta il supporto a support@metamask.io (inglese)", + "description": "Message displayed on generic error page in the fullscreen or notification UI" + }, + "errorPagePopupMessage": { + "message": "Prova a chiudere e riaprire il popup, o contatta il supporto a support@metamask.io (inglese)", + "description": "Message displayed on generic error page in the popup UI" + }, + "errorStack": { + "message": "Stack:", + "description": "Title for error stack, which is displayed for debugging purposes" + }, + "ethereumPublicAddress": { + "message": "Indirizzo pubblico Ethereum " }, "etherscanView": { "message": "Vedi account su Etherscan" @@ -574,43 +627,34 @@ "estimatedProcessingTimes": { "message": "Tempi di Elaborazione Stimati" }, - "exchangeRate": { - "message": "Tasso di cambio" - }, "expandView": { "message": "Espandi Vista" }, "exportPrivateKey": { "message": "Esporta Chiave Privata" }, - "exportPrivateKeyWarning": { - "message": "Esporta chiave privata a tuo rischio." - }, "failed": { "message": "Fallita" }, + "failureMessage": { + "message": "Qualcosa è andato storto e non è possibile completare l'azione" + }, "fast": { "message": "Veloce" }, "faster": { "message": "Più veloce" }, - "fastest": { - "message": "Velocissima" - }, - "feeChartTitle": { - "message": "Previsioni sulle Commissioni per le Transazioni dal Vivo" + "feeAssociatedRequest": { + "message": "Una tassa è associata a questa richiesta." }, "fiat": { "message": "FIAT", - "description": "Tipo di scambio" + "description": "Exchange type" }, "fileImportFail": { "message": "Importazione file non funziona? Clicca qui!", - "description": "Aiuta gli utenti a importare il loro account da un file JSON" - }, - "followTwitter": { - "message": "Seguici su Twitter" + "description": "Helps user import their account from a JSON file" }, "forgetDevice": { "message": "Dimentica questo dispositivo" @@ -618,48 +662,33 @@ "from": { "message": "Da" }, - "fromToSame": { - "message": "Gli indirizzi Da e A non possono essere uguali" + "fromAddress": { + "message": "Da: $1", + "description": "$1 is the address to include in the From label. It is typically shortened first using shortenAddress" }, - "fromShapeShift": { - "message": "Da ShapeShift" + "functionApprove": { + "message": "Funzione: Approve" }, "functionType": { "message": "Tipo della Funzione" }, - "gas": { - "message": "Gas", - "description": "Piccola indicazione del costo del gas" - }, - "gasFee": { - "message": "Costo Gas" - }, "gasLimit": { "message": "Gas Limite" }, - "gasLimitCalculation": { - "message": "Calcoliamo il gas limite suggerito in base al successo delle transazioni in rete." - }, "gasLimitInfoModalContent": { "message": "Il gas limite è il massimo importo di unità di gas che sei disposto a spendere." }, - "gasLimitRequired": { - "message": "Gas Limite Richiesto" - }, "gasLimitTooLow": { "message": "Il Gas Limite deve essere almeno 21000" }, "gasUsed": { "message": "Gas Utilizzato" }, - "generatingSeed": { - "message": "Generando la frase seed..." - }, "gasPrice": { "message": "Prezzo del Gas (GWEI)" }, "gasPriceExtremelyLow": { - "message": "Prezzo del gas estremamente basso" + "message": "Prezzo del gas troppo basso" }, "gasPriceInfoModalContent": { "message": "Il prezzo del gas specifica il totale di Ether che sei disposto a pagare per ogni unità di gas." @@ -667,11 +696,13 @@ "gasPriceNoDenom": { "message": "Prezzo del Gas" }, - "gasPriceCalculation": { - "message": "Calcoliamo il prezzo del gas suggerito in base al successo delle transazioni in rete." + "gdprMessage": { + "message": "Questi dati sono aggregati e sono quindi anonimi per le finalità del Regolamento generale sulla protezione dei dati (UE) 2016/679. Per maggiori informazioni sulla nostra politica sulla privacy, vedi $1.", + "description": "$1 refers to the gdprMessagePrivacyPolicy message, the translation of which is meant to be used exclusively in the context of gdprMessage" }, - "gasPriceRequired": { - "message": "Prezzo Gas Richiesto" + "gdprMessagePrivacyPolicy": { + "message": "Politica Privacy qua", + "description": "this translation is intended to be exclusively used as the replacement for the $1 in the gdprMessage translation" }, "general": { "message": "Generale" @@ -679,15 +710,12 @@ "generalSettingsDescription": { "message": "Conversione moneta, moneta primaria, lingua, icone blockie" }, - "generatingTransaction": { - "message": "Generando la transazione" - }, "getEther": { "message": "Ottieni Ether" }, "getEtherFromFaucet": { "message": "Ottieni Get Ether da un faucet per $1", - "description": "Visualizza il nome della rete per il faucet Ether" + "description": "Displays network name for Ether faucet" }, "getHelp": { "message": "Aiuto." @@ -695,10 +723,6 @@ "getStarted": { "message": "Inizia" }, - "greaterThanMin": { - "message": "deve essere maggiore o uguale a $1.", - "description": "aiuto per inserire un input esadecimale come decimale" - }, "happyToSeeYou": { "message": "Siamo contenti di vederti." }, @@ -719,10 +743,7 @@ }, "here": { "message": "qui", - "description": "per intendere -clicca qui- per maggiori informazioni (va con troubleTokenBalances)" - }, - "hereList": { - "message": "Questa è una lista!!!!" + "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, "hexData": { "message": "Dati Hex" @@ -730,8 +751,9 @@ "hide": { "message": "Nascondi" }, - "hideToken": { - "message": "Nascondi Token" + "hideTokenSymbol": { + "message": "Nascondi $1", + "description": "$1 is the symbol for a token (e.g. 'DAI')" }, "hideTokenPrompt": { "message": "Nascondi Token?" @@ -739,15 +761,9 @@ "history": { "message": "Storico" }, - "howToDeposit": { - "message": "Come vuoi depositare Ether?" - }, - "holdEther": { - "message": "Ti permette di custodire ether & token, e serve da ponte per le applicazioni decentralizzate." - }, "import": { "message": "Importa", - "description": "Tasto per importare un account da un file selezionato" + "description": "Button to import an account from a selected file" }, "importAccount": { "message": "Importa Account" @@ -758,12 +774,6 @@ "importAccountSeedPhrase": { "message": "Importa un Account con una Frase Seed" }, - "importAnAccount": { - "message": "Importa un account" - }, - "importDen": { - "message": "Importa un DEN Esistente" - }, "importWallet": { "message": "Importa Portafoglio" }, @@ -772,17 +782,11 @@ }, "imported": { "message": "Importato", - "description": "stato che conferma che un account è stato totalmente caricato nel portachiavi" + "description": "status showing that an account has been fully loaded into the keyring" }, "importUsingSeed": { "message": "Importa account con frase seed" }, - "importWithSeedPhrase": { - "message": "Importa con una frase seed" - }, - "info": { - "message": "Informazioni" - }, "infoHelp": { "message": "Informazioni & Aiuto" }, @@ -807,56 +811,58 @@ "knownAddressRecipient": { "message": "Indirizzo del contratto conosciuto." }, - "invalidAddressRecipientNotEthNetwork": { - "message": "Non rete ETH, inserisci caratteri minuscoli" + "knownTokenWarning": { + "message": "Questa azione modificherà i token che sono già nel tuo portafoglio, che possono essere utilizzati per truffarti. Approva solo se sei sicuro di voler cambiare ciò che rappresentano questi token." }, - "invalidGasParams": { - "message": "Parametri del Gas non validi" + "reusedTokenNameWarning": { + "message": "Un token usa un simbolo già usato da un altro token, ciò può confondere o ingannare." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "Rete non ETH, inserisci caratteri minuscoli" }, "invalidInput": { "message": "Input non valido." }, - "invalidRequest": { - "message": "Richiesta non Valida" - }, "invalidRPC": { "message": "URI RPC invalido" }, + "invalidBlockExplorerURL": { + "message": "URI Block Explorer invalido" + }, "invalidSeedPhrase": { "message": "Frase seed non valida" }, - "jsonFail": { - "message": "Qualcosa è andato storto. Assicurati che il file JSON sia formattato correttamente." + "ipfsGateway": { + "message": "Portale IPFS" + }, + "ipfsGatewayDescription": { + "message": "Inserisci l'URL del portale IPFS CID da usare per la risoluzione del contenuto ENS." + }, + "invalidIpfsGateway": { + "message": "Portale IPFS non valido: il valore deve essere un URL valido" + }, + "forbiddenIpfsGateway": { + "message": "Portale IPFS vietato: specifica un portale CID" }, "jsonFile": { "message": "File JSON", - "description": "formato per importare un account" - }, - "keepTrackTokens": { - "message": "Tieni traccia dei tokens che hai acquistato con il tuo account MetaMask." + "description": "format for importing an account" }, "kovan": { "message": "Rete di test Kovan" }, - "knowledgeDataBase": { - "message": "Visita la nostra Knowledge Base" - }, "max": { "message": "Massimo" }, + "lastConnected": { + "message": "Ultima Connessione" + }, "learnMore": { "message": "Scopri di più" }, "ledgerAccountRestriction": { "message": "E' necessario utilizzare l'ultimo account prima di poterne aggiungere uno nuovo." }, - "legal": { - "message": "Informazioni Legali" - }, - "lessThanMax": { - "message": "deve essere minore o uguale a $1.", - "description": "aiuto per inserire un input esadecimale come decimale" - }, "letsGoSetUp": { "message": "Si, iniziamo!" }, @@ -866,11 +872,8 @@ "links": { "message": "Collegamenti" }, - "limit": { - "message": "Limite" - }, "liveGasPricePredictions": { - "message": "Previsioni sui Prezzi del Gas dal Vivo" + "message": "Previsione del prezzo del gas in tempo reale" }, "loading": { "message": "Caricamento..." @@ -878,20 +881,17 @@ "loadingTokens": { "message": "Caricamento Tokens..." }, + "loadMore": { + "message": "Carica di più" + }, "localhost": { "message": "Localhost 8545" }, - "login": { - "message": "Accedi" - }, - "logout": { + "lock": { "message": "Disconnetti" }, - "loose": { - "message": "Libero" - }, - "loweCaseWords": { - "message": "le frasi seed hanno solo lettere minuscole" + "lockTimeTooGreat": { + "message": "Tempo di inattività troppo lungo" }, "mainnet": { "message": "Rete Ethereum Principale" @@ -899,39 +899,39 @@ "memorizePhrase": { "message": "Memorizza questa frase." }, - "menu": { - "message": "Menu" + "memo": { + "message": "promemoria" }, "message": { "message": "Messaggio" }, + "metaMaskConnectStatusParagraphOne": { + "message": "Ora hai piu controllo sulle connessioni del tuo account in MetaMask." + }, + "metaMaskConnectStatusParagraphTwo": { + "message": "Il bottone di stato della connessione mostra se il sito che stai visitando è connesso all'account corrente" + }, + "metaMaskConnectStatusParagraphThree": { + "message": "Clicca per gestire i tuo account connessi." + }, "metamaskDescription": { "message": "MetaMask è una cassaforte sicura per identità su Ethereum." }, - "metamaskSeedWords": { - "message": "Parole Seed di MetaMask" - }, "metamaskVersion": { "message": "versione di MetaMask" }, - "min": { - "message": "Minimo" - }, - "missingYourTokens": { - "message": "Non vedi i tuoi token?" - }, - "minutesShorthand": { - "message": "Min" - }, - "mobileSyncTitle": { - "message": "Sincronizza account con il dispositivo mobile" - }, "mobileSyncText": { "message": "Per favore inserisci la password per confermare che sei te!" }, "myAccounts": { "message": "Miei Account" }, + "myWalletAccounts": { + "message": "I miei account di portafoglio" + }, + "myWalletAccountsDescription": { + "message": "Tutti gli account creati con MetaMask saranno automaticamente aggiunti a questa sezione." + }, "mustSelectOne": { "message": "Devi selezionare almeno un token." }, @@ -940,11 +940,7 @@ }, "needImportFile": { "message": "Devi selezionare un file da importare.", - "description": "L'utente sta importando un account e deve aggiungere un file per continuare" - }, - "needImportPassword": { - "message": "Dei inserire una password per il file selezionato.", - "description": "Password e file necessari per importare un account" + "description": "User is important an account and needs to add a file to continue" }, "negativeETH": { "message": "Non puoi inviare una quantità di ETH negativa." @@ -964,9 +960,15 @@ "newAccount": { "message": "Nuovo Account" }, + "newAccountDetectedDialogMessage": { + "message": "Rilevato un nuovo indirizzo! Clicca qui per aggiungerlo alla tua rubrica." + }, "newAccountNumberName": { "message": "Account $1", - "description": "Nome predefinito per il prossimo account da creare nella schermata di creazione account" + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "Nuovo contatto" }, "newContract": { "message": "Nuovo Contratto" @@ -974,17 +976,11 @@ "newPassword": { "message": "Nuova Password (minimo 8 caratteri)" }, - "newPassword8Chars": { - "message": "Nuova Password (minimo 8 caratteri)" - }, - "newRecipient": { - "message": "Nuovo Destinatario" - }, "newNetwork": { "message": "Nuova Rete" }, "newToMetaMask": { - "message": "Nuovo a MetaMask?" + "message": "Nuovo su MetaMask?" }, "noAlreadyHaveSeed": { "message": "No, ho già una frase seed" @@ -1001,11 +997,11 @@ "rpcUrl": { "message": "Nuovo URL RPC" }, - "showAdvancedOptions": { - "message": "Mostra Opzioni Avanzate" + "onlyConnectTrust": { + "message": "Connettiti solo con siti di cui ti fidi." }, - "hideAdvancedOptions": { - "message": "Nascondi Opzioni Avanzate" + "onlyAddTrustedNetworks": { + "message": "Una rete Ethereum malevola può mentire sullo stato della blockchain e registrare le tue azioni. Aggiungi solo reti fidate." }, "optionalChainId": { "message": "ChainID (opzionale)" @@ -1013,9 +1009,6 @@ "optionalSymbol": { "message": "Simbolo (opzionale)" }, - "optionalNickname": { - "message": "Nickname (opzionale)" - }, "newTotal": { "message": "Nuovo Totale" }, @@ -1025,74 +1018,46 @@ "next": { "message": "Avanti" }, + "nextNonceWarning": { + "message": "Numero di transazione deve essere maggiore di $1", + "description": "The next nonce according to MetaMask's internal logic" + }, "noAddressForName": { "message": "Nessun indirizzo è stato impostato per questo nome." }, - "noDeposits": { - "message": "Nessun deposito ricevuto" - }, "noConversionRateAvailable": { - "message": "Tasso di Conversione non Disponibile" - }, - "noTransactionHistory": { - "message": "Nessuna cronologia delle transazioni." + "message": "Tasso di conversione non disponibile" }, "noTransactions": { "message": "Nessuna Transazione" }, - "notEnoughGas": { - "message": "Gas Non Sufficiente" + "noThanks": { + "message": "No Grazie" }, - "notFound": { - "message": "Non Trovata" + "notCurrentAccount": { + "message": "È questo l'account corretto? È diverso dall'account selezionato nel tuo portafoglio" }, - "notStarted": { - "message": "Non Iniziato" + "notEnoughGas": { + "message": "Gas Non Sufficiente" }, "noWebcamFoundTitle": { - "message": "Webcam non trovata" + "message": "Fotocamera non trovata" }, "noWebcamFound": { - "message": "La webcam del tuo computer non è stata trovata. Per favore riprovaci." + "message": "La fotocamera del tuo computer non è stata trovata. Riprova." }, "ofTextNofM": { "message": "di" }, - "oldUI": { - "message": "Vecchia interfaccia" - }, - "oldUIMessage": { - "message": "Sei ritornato alla vecchia interfaccia. Puoi ritornare alla nuova interfaccia tramite l'opzione nel menu a discesa in alto a destra." - }, - "onlySendToEtherAddress": { - "message": "Invia ETH solamente ad un account Ethereum." - }, - "onlySendTokensToAccountAddress": { - "message": "Invia solamente $1 ad un account Ethereum.", - "description": "mostra il simbolo del token" - }, - "openInTab": { - "message": "Apri in una scheda" - }, - "or": { - "message": "o", - "description": "scelta tra creare o importare un nuovo account" - }, "orderOneHere": { "message": "Compra un Trezor o un Ledger e tieni i tuoi soldi al sicuro" }, "origin": { "message": "Origine" }, - "outgoing": { - "message": "In Uscita" - }, "parameters": { "message": "Parametri" }, - "originalTotal": { - "message": "Totale Precedente" - }, "participateInMetaMetrics": { "message": "Participa in MetaMetrics" }, @@ -1102,41 +1067,31 @@ "password": { "message": "Password" }, - "passwordCorrect": { - "message": "Assicurati che la password sia corretta." - }, "passwordsDontMatch": { "message": "Le Password Non Corrispondono" }, - "passwordMismatch": { - "message": "le password non corrispondono", - "description": "nella creazione della password, le due password all'interno dei campi non corrispondono" - }, "passwordNotLongEnough": { "message": "Password non abbastanza lunga" }, - "passwordShort": { - "message": "password non sufficientemente lunga", - "description": "nella creazione della password, la password non è lunga abbastanza" - }, "pastePrivateKey": { "message": "Incolla la tua chiave privata qui:", - "description": "Per importare un account da una chiave privata" - }, - "pasteSeed": { - "message": "Incolla la tua frase seed qui!" + "description": "For importing an account from a private key" }, "pending": { "message": "in corso" }, + "permissionCheckedIconDescription": { + "message": "Hai approvato questo permesso" + }, + "permissionUncheckedIconDescription": { + "message": "Non hai approvato questo permesso" + }, "personalAddressDetected": { "message": "Rilevato indirizzo personale. Inserisci l'indirizzo del contratto del token." }, - "pleaseReviewTransaction": { - "message": "Ricontrolla la tua transazione." - }, - "popularTokens": { - "message": "Tokens Popolari" + "plusXMore": { + "message": "+ $1 elementi", + "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, "prev": { "message": "Precedente" @@ -1152,7 +1107,7 @@ }, "privateKey": { "message": "Chiave Privata", - "description": "seleziona questo tipo di file per importare un account" + "description": "select this type of file to use to import an account" }, "privateKeyWarning": { "message": "Attenzione: non dire a nessuno questa chiave! Chiunque con la tua chiave privata può rubare qualsiasi moneta contenuta nel tuo account." @@ -1160,20 +1115,20 @@ "privateNetwork": { "message": "Rete Privata" }, - "qrCode": { - "message": "Mostra Codice QR" + "proposedApprovalLimit": { + "message": "Limite di Approvazione Proposto" }, "queue": { "message": "Coda" }, + "queued": { + "message": "In coda" + }, "readdToken": { "message": "Puoi aggiungere nuovamente questo token in futuro andando in “Aggiungi token†nel menu delle opzioni del tuo account." }, - "readMore": { - "message": "Leggi di più qui." - }, - "readMore2": { - "message": "Leggi di più." + "recents": { + "message": "Recenti" }, "receive": { "message": "Ricevi" @@ -1181,8 +1136,8 @@ "recipientAddress": { "message": "Indirizzo Destinatario" }, - "refundAddress": { - "message": "Indirizzo di Rimborso" + "recipientAddressPlaceholder": { + "message": "Ricerca, indirizzo pubblico (0x) o ENS" }, "rejectAll": { "message": "Respingi Tutto" @@ -1200,29 +1155,36 @@ "message": "Ripristina" }, "resetAccount": { - "message": "Ripristina Account" + "message": "Ripristina account" }, "resetAccountDescription": { "message": "Ripristinare il tuo account cancellerà lo storico delle transazioni." }, + "deleteNetwork": { + "message": "Cancella la rete?" + }, + "deleteNetworkDescription": { + "message": "Sei sicuro di voler eliminare questa rete?" + }, + "remindMeLater": { + "message": "Ricordamelo dopo" + }, "restoreFromSeed": { "message": "Ripristina da una frase seed" }, - "restoreVault": { - "message": "Ripristina Cassaforte" - }, "restoreAccountWithSeed": { "message": "Ripristina Account con la Frase Seed" }, + "restoreWalletPreferences": { + "message": "È stato trovato un backup dei tuoi dati da $1. Vuoi ripristinare le preferenze del portafoglio?", + "description": "$1 is the date at which the data was backed up" + }, "requestsAwaitingAcknowledgement": { "message": "richiedi che l'attesa sia recepita" }, "required": { "message": "Richiesto" }, - "retryWithMoreGas": { - "message": "Riprova con un prezzo del Gas maggiore qui" - }, "restore": { "message": "Ripristina" }, @@ -1241,9 +1203,6 @@ "revealSeedWordsWarning": { "message": "Non ripristinare la tua frase seed in pubblico!. Queste parole possono essere usate per rubare il tuo account." }, - "revert": { - "message": "Ripristina" - }, "remove": { "message": "rimuovi" }, @@ -1265,13 +1224,6 @@ "goerli": { "message": "Rete di test Goerli" }, - "rpc": { - "message": "RPC Personalizzata" - }, - "sampleAccountName": { - "message": "Es: Il mio nuovo account", - "description": "Aiuta l'utente a capire il concetto di aggiungere un nome leggibile al loro account" - }, "save": { "message": "Salva" }, @@ -1284,13 +1236,6 @@ "saveAsCsvFile": { "message": "Salva Come File CSV" }, - "saveAsFile": { - "message": "Salva come File", - "description": "Processo per esportare un account" - }, - "saveSeedAsFile": { - "message": "Salva la Frase Seed come File" - }, "scanInstructions": { "message": "Posizione il codice QR davanti alla fotocamera" }, @@ -1321,17 +1266,26 @@ "securitySettingsDescription": { "message": "Impostazioni sulla Privacy e sulla frase seed del portafoglio" }, - "secondsShorthand": { - "message": "Sec" - }, "seedPhrasePlaceholder": { "message": "Separa ogni parola con un singolo spazio" }, + "seedPhrasePlaceholderPaste": { + "message": "Incolla frase seed dagli appunti" + }, + "showSeedPhrase": { + "message": "Mostra frase seed" + }, "seedPhraseReq": { "message": "le frasi seed sono lunghe 12 parole" }, - "select": { - "message": "Seleziona" + "selectingAllWillAllow": { + "message": "Selezionare tutto consentirà al sito di avere accesso a tutti i tuoi account. Assicurati di fidarti del sito." + }, + "selectAccounts": { + "message": "Seleziona account" + }, + "selectAll": { + "message": "Seleziona tutti" }, "selectCurrency": { "message": "Seleziona Moneta" @@ -1342,12 +1296,12 @@ "selectLocale": { "message": "Selezione Lingua" }, - "selectService": { - "message": "Seleziona Servizio" - }, "selectType": { "message": "Seleziona Tipo" }, + "buy": { + "message": "Compra" + }, "send": { "message": "Invia" }, @@ -1366,14 +1320,21 @@ "sentTokens": { "message": "tokens inviati" }, + "sendSpecifiedTokens": { + "message": "Invia $1", + "description": "Symbol of the specified token" + }, "separateEachWord": { "message": "Separa ogni parola con un solo spazio" }, "searchTokens": { "message": "Cerca Tokens" }, - "selectAnAddress": { - "message": "Seleziona un Indirizzo" + "searchAccounts": { + "message": "Cerca Account" + }, + "noAccountsFound": { + "message": "Nessun account trovato per la ricerca effettuata" }, "selectAnAccount": { "message": "Seleziona un Account" @@ -1381,9 +1342,6 @@ "selectAnAccountHelp": { "message": "Selezione l'account da visualizzare in MetaMask" }, - "selectAnAsset": { - "message": "Seleziona un Asset" - }, "selectAHigherGasFee": { "message": "Seleziona un costo in gas maggiore per accelerare l'elaborazione della transazione.*" }, @@ -1393,15 +1351,9 @@ "selectPathHelp": { "message": "Se non vedi il tuo account Ledger esistente di seguito, prova a cambiare il percorso in \"Legacy (MEW / MyCrypto)\"" }, - "sendTokensAnywhere": { - "message": "Invia Tokens a chiunque abbia un account Ethereum" - }, "settings": { "message": "Impostazioni" }, - "shapeshiftBuy": { - "message": "Compra con Shapeshift" - }, "showAdvancedGasInline": { "message": "Controlli gas avanzati" }, @@ -1417,11 +1369,8 @@ "showPrivateKeys": { "message": "Mostra Chiave Privata" }, - "showQRCode": { - "message": "Mostra Codie QR" - }, "showHexData": { - "message": "Mostra Dati Hex" + "message": "Mostra dati hex" }, "showHexDataDescription": { "message": "Seleziona per mostrare il campo dei dati hex nella schermata di invio" @@ -1432,35 +1381,23 @@ "signatureRequest": { "message": "Firma Richiesta" }, + "signatureRequest1": { + "message": "Message" + }, "signed": { "message": "Firmata" }, - "signMessage": { - "message": "Firma Messaggio" - }, "signNotice": { "message": "Firmare questo messaggio può avere effetti collaterali pericolosi. \nFirma messaggi da siti di cui ti fidi totalmente. \nQuesto metodo pericoloso sarà rimosso in versioni future." }, "sigRequest": { "message": "Firma Richiesta" }, - "sigRequested": { - "message": "Richiesta Firma" - }, "somethingWentWrong": { "message": "Oops! Qualcosa è andato storto." }, - "spaceBetween": { - "message": "ci può essere solo uno spazio tra le parole" - }, "speedUp": { - "message": "velocizza" - }, - "speedUpTitle": { - "message": "Velocizza Transazione" - }, - "speedUpSubtitle": { - "message": "Aumenta il prezzo del gas per tentare di sovrascrivere e velocizzare la transazione" + "message": "Velocizza" }, "speedUpCancellation": { "message": "Accelera questo annullamento" @@ -1468,14 +1405,27 @@ "speedUpTransaction": { "message": "Accelera questa transazione" }, + "spendLimitPermission": { + "message": "Limite di spesa permesso" + }, + "spendLimitRequestedBy": { + "message": "Limite di spesa richiesta da $1", + "description": "Origin of the site requesting the spend limit" + }, + "spendLimitTooLarge": { + "message": "Limite di spesa troppo grande" + }, + "spendLimitInvalid": { + "message": "Limite di spesa non valido; deve essere un numero positivo" + }, "switchNetworks": { "message": "Cambia Reti" }, - "status": { - "message": "Stato" + "stateLogFileName": { + "message": "Log di Stato di MetaMask" }, "stateLogs": { - "message": "Log di Stato" + "message": "Log di stato" }, "stateLogsDescription": { "message": "I log di stato contengono i tuoi indirizzi pubblici e le transazioni effettuate." @@ -1483,6 +1433,12 @@ "stateLogError": { "message": "Errore nel recupero dei log di stato." }, + "statusConnected": { + "message": "Connesso" + }, + "statusNotConnected": { + "message": "Non connesso" + }, "step1HardwareWallet": { "message": "1. Connetti Portafoglio Hardware" }, @@ -1519,6 +1475,15 @@ "symbolBetweenZeroTwelve": { "message": "Il simbolo deve essere lungo tra 0 e 12 caratteri." }, + "syncWithThreeBox": { + "message": "Sincronizza dati con 3Box (sperimentale)" + }, + "syncWithThreeBoxDescription": { + "message": "Attiva per avere le tue impostazioni salvate su 3Box. Questa funzionalità è attualmente sperimentale; usala a tuo rischio." + }, + "syncWithThreeBoxDisabled": { + "message": "3Box è stato disabilitato a causa di un errore durante la sincronizzazione iniziale" + }, "syncWithMobile": { "message": "Sincronizza con dispositivo mobile" }, @@ -1540,9 +1505,6 @@ "syncWithMobileComplete": { "message": "I tuoi dati sono stati sincronizzati con successo. Goditi l'app di MetaMask!" }, - "takesTooLong": { - "message": "Ci sta mettendo troppo?" - }, "terms": { "message": "Termini di Uso" }, @@ -1558,34 +1520,28 @@ "to": { "message": "A" }, - "toETHviaShapeShift": { - "message": "$1 a ETH via ShapeShift", - "description": "il sistema riempirà il tipo di deposito all'inizio del messaggio" + "toAddress": { + "message": "A: $1", + "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" + }, + "toWithColon": { + "message": "To:" }, "token": { "message": "Token" }, - "tokenAddress": { - "message": "Indirizzo Token" - }, "tokenAlreadyAdded": { "message": "Il token è già stato aggiunto." }, - "tokenBalance": { - "message": "Bilancio Token:" - }, "tokenContractAddress": { "message": "Indirizzo Contratto Token" }, - "tokenSelection": { - "message": "Cerca un token o seleziona dalla lista di token più popolari." + "tokenOptions": { + "message": "Opzioni token" }, "tokenSymbol": { "message": "Simbolo Token" }, - "tokenWarning1": { - "message": "Tieni traccia dei token che hai acquistato con il tuo account MetaMask. Se hai acquistato token con un account diverso, quei token non appariranno qui." - }, "total": { "message": "Totale" }, @@ -1598,9 +1554,6 @@ "transactionCreated": { "message": "Transazione di valore $1 creata alle $2." }, - "transactionWithNonce": { - "message": "Transazione $1" - }, "transactionDropped": { "message": "Transazione abbandonata alle $2." }, @@ -1613,9 +1566,6 @@ "transactionUpdated": { "message": "Transazione aggiornata alle $2." }, - "transactionUpdatedGas": { - "message": "Transazione aggiornata con un prezzo del gas di $1 alle $2." - }, "transactionErrored": { "message": "La transazione ha riscontrato un errore." }, @@ -1625,9 +1575,6 @@ "transactionCancelSuccess": { "message": "Transazione cancellata alle $2" }, - "transactions": { - "message": "transazioni" - }, "transactionError": { "message": "Errore Transazione. Eccceziona generata nel codice del contratto." }, @@ -1637,54 +1584,40 @@ "transactionFee": { "message": "Costo Transazione" }, - "transactionMemo": { - "message": "Promemoria Transazione (opzionale)" - }, - "transactionNumber": { - "message": "Numero Transazione" - }, "transactionTime": { "message": "Tempo Conferma Transazione" }, + "showTransactionTimeDescription": { + "message": "Seleziona per mostrare nella scheda attività una stima dei tempi di transazione per le transazioni in corso sulla rete Ethereum principale. Nota: la stima è approssimativa basata sulle condizioni della rete." + }, "transfer": { "message": "Trasferisci" }, + "transferBetweenAccounts": { + "message": "Trasferimento tra i miei account" + }, "transferFrom": { "message": "Trasferisci Da" }, - "transfers": { - "message": "Trasferimenti" - }, - "trezorHardwareWallet": { - "message": "TREZOR Portafoglio Hardware" - }, "troubleTokenBalances": { "message": "Abbiamo avuto un problema a caricare il bilancio dei tuoi token. Puoi vederlo ", - "description": "Seguito da un link (qui) per vedere il bilancio dei token" + "description": "Followed by a link (here) to view token balances" + }, + "trustSiteApprovePermission": { + "message": "Ti fidi di questo sito? Garantendo l'autorizzazione, stai consentendo a $1 di ritirare i tuoi $2 e automatizzare trnsazioni per te.", + "description": "$1 is the url requesting permission and $2 is the symbol of the currency that the request is for" }, "tryAgain": { "message": "Prova di nuovo" }, - "twelveWords": { - "message": "Queste 12 parole sono l'unico modo per ripristinare i tuoi account MetaMask. \nSalvale in un posto sicuro e segreto." - }, "typePassword": { "message": "Inserisci Password" }, - "uiMigrationAnnouncement": { - "message": "Benvenuto alla nuova interfaccia di MetaMask. Se hai un feedback a proposito dell'interfaccia o richieste di funzionalità, per favore contatta il nostro team di supporto su GitHub." - }, - "uiWelcome": { - "message": "Benvenuto alla nuova interfaccia (Beta)" - }, - "uiWelcomeMessage": { - "message": "Stai utilizzanto la nuova interfaccia di MetaMask. Guarda in giro, prova nuove funzionalità come inviare token, e facci sapere se hai dei problemi." - }, "unapproved": { "message": "Non approvata" }, - "unavailable": { - "message": "Non Disponibile" + "alertDisableTooltip": { + "message": "Può essere cambiato in \"Impostazioni > Avvisi\"" }, "units": { "message": "unità" @@ -1695,9 +1628,6 @@ "unknownNetwork": { "message": "Rete Privata Sconosciuta" }, - "unknownNetworkId": { - "message": "ID rete sconosciuto" - }, "unknownQrCode": { "message": "Errore: Non siamo riusciti a identificare il codice QR" }, @@ -1707,6 +1637,9 @@ "unknownCameraError": { "message": "C'è stato un errore nel tentativo di accedere alla fotocamera. Per favore prova di nuovo..." }, + "unlimited": { + "message": "Illimitato" + }, "unlock": { "message": "Sblocca" }, @@ -1716,36 +1649,41 @@ "updatedWithDate": { "message": "Aggiornata $1" }, - "uriErrorMsg": { + "urlErrorMsg": { "message": "Gli URI richiedono un prefisso HTTP/HTTPS." }, - "usaOnly": { - "message": "Solo USA", - "description": "Usare questo sito di scambio è possibile solo per persone residenti in USA." + "urlExistsErrorMsg": { + "message": "L'URL è già presente nella lista di reti" }, "usedByClients": { "message": "Usato da una varietà di clients diversi" }, - "useOldUI": { - "message": "Use la vecchia UI" + "usePhishingDetection": { + "message": "Rilevamento del Phishing" }, - "validFileImport": { - "message": "Devi selezionare un file valido da importare." + "usePhishingDetectionDescription": { + "message": "Visualizza un avvertimento sui domini di phishing rivolto a utenti di Ethereum" }, - "vaultCreated": { - "message": "Cassaforte Creata" + "userName": { + "message": "Nome utente" }, "viewAccount": { "message": "Vedi Account" }, + "viewinExplorer": { + "message": "Vista in Explorer" + }, + "viewContact": { + "message": "Visualizza contatto" + }, "viewOnCustomBlockExplorer": { "message": "Vedi su $1" }, "viewOnEtherscan": { "message": "Vedi su Etherscan" }, - "viewNetworkInfo": { - "message": "Visualizza Informazioni Rete" + "retryTransaction": { + "message": "Retry Transaction" }, "visitWebSite": { "message": "Visita il nostro sito web" @@ -1753,9 +1691,6 @@ "walletSeed": { "message": "Seed del Portafoglio" }, - "warning": { - "message": "Attenzione" - }, "welcomeBack": { "message": "Bentornato!" }, @@ -1763,11 +1698,15 @@ "message": "Benvenuto nella Beta di MetaMask" }, "whatsThis": { - "message": "Cos'è questo?" + "message": "Cos'è?" }, "writePhrase": { "message": "Scrivi questa frase su un foglio di carta e conservala in un posto sicuro. Se vuoi ancora più sicurezza, scrivila su più fogli e conserva ognuno in 2 o 3 posti diversi. " }, + "xOfY": { + "message": "$1 di $2", + "description": "$1 and $2 are intended to be two numbers, where $2 is a total, and $1 is a count towards that total" + }, "yesLetsTry": { "message": "Si, proviamo" }, @@ -1783,19 +1722,37 @@ "yourPrivateSeedPhrase": { "message": "La tua frase seed privata" }, - "yourUniqueAccountImage": { - "message": "L'immagine esclusiva del tuo account" + "zeroGasPriceOnSpeedUpError": { + "message": "Prezzo del gas maggiore di zero" }, - "yourUniqueAccountImageDescription1": { - "message": "Questa immagine è stata generata automaticamente per te dal tuo nuovo indirizzo." + "decryptRequest": { + "message": "Decifra richiesta" }, - "yourUniqueAccountImageDescription2": { - "message": "Vedrai questa immagine ogni volta che dovrai confermare una transazione." + "decrypt": { + "message": "Decifra" }, - "yourUniqueAccountImageDescription3": { - "message": "MetaMask non ti chiederà mai la tua frase seed!" + "decryptMessageNotice": { + "message": "$1 vorrebbe leggere questo messaggio per completare l'azione", + "description": "$1 is website or dapp name" }, - "zeroGasPriceOnSpeedUpError": { - "message": "Prezzo del gas maggiore di zero" + "decryptMetamask": { + "message": "Decifra messaggio" + }, + "decryptCopy": { + "message": "Copia messaggio cifrato" + }, + "decryptInlineError": { + "message": "Questo messaggio non può essere decifrato a causa dell'errore: $1", + "description": "$1 is error message" + }, + "provide": { + "message": "Fornisci" + }, + "encryptionPublicKeyRequest": { + "message": "Richiedi chiave pubblica di cifratura" + }, + "encryptionPublicKeyNotice": { + "message": "$1 vorrebbe la tua chiave di cifratura pubblica. Consentendo, questo sito sarà in grado di comporre messaggi criptati per te.", + "description": "$1 is website or dapp name" } } diff --git a/app/_locales/ja/messages.json b/app/_locales/ja/messages.json index 49b033997d43..fbb5512999da 100644 --- a/app/_locales/ja/messages.json +++ b/app/_locales/ja/messages.json @@ -1,66 +1,63 @@ { - "privacyMode": { - "message": "プライãƒã‚·ãƒ¼ãƒ¢ãƒ¼ãƒ‰" + "chartOnlyAvailableEth": { + "message": "ãƒãƒ£ãƒ¼ãƒˆã¯Ethereumãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã§ã®ã¿åˆ©ç”¨å¯èƒ½ã§ã™ã€‚" }, - "privacyModeDescription": { - "message": "ウェブサイトã¯ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆæƒ…報を閲覧ã™ã‚‹ãŸã‚ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’è¦æ±‚ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" + "contractInteraction": { + "message": "コントラクトã¸ã®ã‚¢ã‚¯ã‚»ã‚¹" }, - "exposeAccounts": { - "message": "アカウントを公開ã™ã‚‹" - }, - "exposeDescription": { - "message": "アカウントをç¾åœ¨ã®ã‚¦ã‚§ãƒ–サイトã«å…¬é–‹ã™ã‚‹ã€‚従æ¥ã®dappsã«å½¹ç«‹ã¡ã¾ã™ã€‚" + "reject": { + "message": "æ‹’å¦" }, - "confirmExpose": { - "message": "ç¾åœ¨ã®ã‚¦ã‚§ãƒ–サイトã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’公開ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ" + "aboutSettingsDescription": { + "message": "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚„サãƒãƒ¼ãƒˆã€å•åˆã›å…ˆãªã©" }, - "confirmClear": { - "message": "承èªã•れãŸã‚¦ã‚§ãƒ–サイトをクリアã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ" + "acceleratingATransaction": { + "message": "*より高ã„ガス価格を使用ã™ã‚‹ã¨ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã§ã‚ˆã‚Šé€Ÿã処ç†ã•れã€ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’高速化ã§ãã‚‹å¯èƒ½æ€§ãŒé«˜ããªã‚Šã¾ã™ãŒã€å¸¸ã«ä¿è¨¼ã•れるã¨ã¯é™ã‚Šã¾ã›ã‚“。" }, - "clearApprovalDataSuccess": { - "message": "承èªã•れãŸã‚¦ã‚§ãƒ–ã‚µã‚¤ãƒˆãƒ‡ãƒ¼ã‚¿ãŒæ­£å¸¸ã«æ¶ˆåŽ»ã•れã¾ã—ãŸã€‚" + "accessingYourCamera": { + "message": "カメラã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã„ã¾ã™..." }, - "approvalData": { - "message": "承èªãƒ‡ãƒ¼ã‚¿" + "account": { + "message": "アカウント" }, - "approvalDataDescription": { - "message": "承èªã•れãŸã‚¦ã‚§ãƒ–サイトã®ãƒ‡ãƒ¼ã‚¿ã‚’クリアã™ã‚‹ã¨ã€ã™ã¹ã¦ã®ã‚µã‚¤ãƒˆã§æ‰¿èªã‚’å†åº¦è¦æ±‚ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" + "accountDetails": { + "message": "アカウント詳細" }, - "clearApprovalData": { - "message": "承èªãƒ‡ãƒ¼ã‚¿ã®ã‚¯ãƒªã‚¢" + "accountName": { + "message": "アカウントå" }, - "approve": { - "message": "承èªã™ã‚‹" + "accountOptions": { + "message": "アカウント設定" }, - "reject": { - "message": "æ‹’å¦" + "accountSelectionRequired": { + "message": "ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。" }, - "providerAPIRequest": { - "message": "Web3 APIリクエスト" + "activityLog": { + "message": "アクティビティログ" }, - "reviewProviderRequest": { - "message": "ã“ã®Ethereum APIリクエストを確èªã—ã¦ãã ã•ã„。" + "addNetwork": { + "message": "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯è¿½åŠ " }, - "providerRequestInfo": { - "message": "下記ã®ãƒ‰ãƒ¡ã‚¤ãƒ³ã¯ã€Ethereumブロックãƒã‚§ãƒ¼ãƒ³ã¨ã‚„りå–りã§ãるよã†ã«Ethereum APIã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’リクエストã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ Web3アクセスを承èªã™ã‚‹å‰ã«ã€æ­£ã—ã„サイトã«ã„ã‚‹ã“ã¨ã‚’常ã«ç¢ºèªã—ã¦ãã ã•ã„。" + "addRecipient": { + "message": "å—å–人追加" }, - "accept": { - "message": "承èª" + "advanced": { + "message": "詳細" }, - "account": { - "message": "アカウント" + "advancedSettingsDescription": { + "message": "開発者å‘ã‘æ©Ÿèƒ½ã§ã¯ã€çŠ¶æ…‹ãƒ­ã‚°ã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãƒªã‚»ãƒƒãƒˆã—ã€ãƒ†ã‚¹ãƒˆãƒãƒƒãƒˆã‚„カスタムRPCã®è¨­å®šãŒå¯èƒ½ã§ã™ã€‚" }, - "accountDetails": { - "message": "アカウント詳細" + "advancedOptions": { + "message": "詳細設定" }, - "accountName": { - "message": "アカウントå" + "addToAddressBook": { + "message": "アドレス帳ã«è¿½åŠ " }, - "address": { - "message": "アドレス" + "addToAddressBookModalPlaceholder": { + "message": "例: John D" }, - "addCustomToken": { - "message": "カスタムトークンを追加" + "addAlias": { + "message": "エイリアスを追加" }, "addToken": { "message": "トークンを追加" @@ -68,12 +65,15 @@ "addTokens": { "message": "トークンを追加" }, + "addSuggestedTokens": { + "message": "推奨トークンを追加" + }, + "addAcquiredTokens": { + "message": "MetaMaskã§ç²å¾—ã—ãŸãƒˆãƒ¼ã‚¯ãƒ³ã‚’追加ã™ã‚‹" + }, "amount": { "message": "金é¡" }, - "amountPlusGas": { - "message": "é‡‘é¡ + ガス" - }, "appDescription": { "message": "Ethereumã®ãƒ–ラウザ・エクステンション", "description": "The description of the application" @@ -82,45 +82,44 @@ "message": "MetaMask", "description": "The name of the application" }, - "attemptingConnect": { - "message": "ブロックãƒã‚§ãƒ¼ãƒ³ã«æŽ¥ç¶šä¸­" + "approve": { + "message": "承èªã™ã‚‹" }, - "available": { - "message": "有効" + "approved": { + "message": "æ‰¿èªæ¸ˆã¿" }, - "back": { - "message": "戻る" + "asset": { + "message": "アセット" }, - "balance": { - "message": "残高:" + "attemptingConnect": { + "message": "ブロックãƒã‚§ãƒ¼ãƒ³ã«æŽ¥ç¶šä¸­" }, - "balances": { - "message": "トークン残高" + "attemptToCancel": { + "message": "キャンセルを試ã¿ã¾ã™ã‹ï¼Ÿ" }, - "balanceIsInsufficientGas": { - "message": "ç¾åœ¨ã®ã‚¬ã‚¹ç·é‡ã«å¯¾ã—ã¦æ®‹é«˜ãŒä¸è¶³ã—ã¦ã„ã¾ã™" + "attemptToCancelDescription": { + "message": "ã“ã®ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã‚’é€ä¿¡ã—ã¦ã‚‚ã€å…ƒã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãŒã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•れるã“ã¨ã¯ä¿è¨¼ã•れã¾ã›ã‚“ã€‚ã‚­ãƒ£ãƒ³ã‚»ãƒ«ãŒæˆåŠŸã—ãŸå ´åˆã€ä¸Šè¨˜ã®å–引手数料ãŒè«‹æ±‚ã•れã¾ã™ã€‚" }, - "beta": { - "message": "ベータ版" + "attributions": { + "message": "属性" }, - "betweenMinAndMax": { - "message": " $1以上 $2以下ã«ã—ã¦ä¸‹ã•ã„。", - "description": "helper for inputting hex as decimal input" + "autoLockTimeLimit": { + "message": "自動ログアウト(分)" }, - "blockiesIdenticon": { - "message": "Blockies Identicon を使用" + "autoLockTimeLimitDescription": { + "message": "MetaMaskãŒè‡ªå‹•çš„ã«ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã™ã‚‹ã¾ã§ã®ã‚¢ã‚¤ãƒ‰ãƒ«æ™‚間を分å˜ä½ã§è¨­å®šã—ã¾ã™ã€‚" }, - "borrowDharma": { - "message": "Dharmaã§å€Ÿã‚Šã‚‹(ベータ版)" + "average": { + "message": "å¹³å‡" }, - "buy": { - "message": "購入" + "back": { + "message": "戻る" }, - "buyCoinbase": { - "message": "Coinbaseã®ã‚µã‚¤ãƒˆã§è³¼å…¥" + "balance": { + "message": "残高:" }, - "buyCoinbaseExplainer": { - "message": "Etherを購入ã§ãã¾ã™ã€‚Coinbaseã¯ã€ä¸–界的ãªBitcoinã€Ethereumã€ãã—ã¦Litecoinã®å–引所ã§ã™ã€‚" + "blockiesIdenticon": { + "message": "Blockies Identicon を使用" }, "buyCoinSwitch": { "message": "CoinSwitchã®ã‚µã‚¤ãƒˆã§è³¼å…¥" @@ -131,57 +130,24 @@ "cancel": { "message": "キャンセル" }, - "classicInterface": { - "message": "旧インタフェイスを使用" - }, - "clickCopy": { - "message": "クリックã—ã¦ã‚³ãƒ”ー" - }, "confirm": { "message": "確èª" }, - "confirmContract": { - "message": "コントラクトã®ç¢ºèª" - }, "confirmPassword": { "message": "パスワードã®ç¢ºèª" }, - "confirmTransaction": { - "message": "トランザクションã®ç¢ºèª" - }, - "continue": { - "message": "続行" - }, - "continueToCoinbase": { - "message": "Coinbaseã‚’é–‹ã" - }, "continueToCoinSwitch": { "message": "CoinSwitchã‚’é–‹ã" }, "contractDeployment": { "message": "コントラクトã®ãƒ‡ãƒ—ロイ" }, - "conversionProgress": { - "message": "変æ›ä¸­" - }, - "copiedButton": { - "message": "コピー完了" - }, - "copiedClipboard": { - "message": "クリップボードã¸ã‚³ãƒ”ー済ã¿" - }, "copiedExclamation": { "message": "コピー完了!" }, - "copy": { - "message": "コピー" - }, "copyToClipboard": { "message": "クリップボードã¸ã‚³ãƒ”ー" }, - "copyButton": { - "message": " コピー " - }, "copyPrivateKey": { "message": "ã“れã¯ã‚ãªãŸã®ç§˜å¯†éµã§ã™(クリックã§ã‚³ãƒ”ー)" }, @@ -191,25 +157,12 @@ "createAccount": { "message": "アカウント作æˆ" }, - "createDen": { - "message": "作æˆ" - }, - "crypto": { - "message": "æš—å·é€šè²¨", - "description": "Exchange type (cryptocurrencies)" - }, - "currentConversion": { - "message": "基軸通貨" - }, "customGas": { "message": "ガスã®ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚º" }, "customToken": { "message": "カスタムトークン" }, - "customize": { - "message": "カスタマイズ" - }, "customRPC": { "message": "カスタムRPC" }, @@ -219,39 +172,15 @@ "defaultNetwork": { "message": "デフォルトã®Etheré€å—ä¿¡ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã¯ãƒ¡ã‚¤ãƒ³ãƒãƒƒãƒˆã§ã™ã€‚" }, - "denExplainer": { - "message": "DENã¨ã¯ã€ã‚ãªãŸã®ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ãŒæš—å·åŒ–ã•れãŸMetaMask内ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã§ã™ã€‚" - }, "deposit": { "message": "振込" }, - "depositBTC": { - "message": "BTCを下記ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã¸æŒ¯è¾¼ã‚“ã§ãã ã•ã„:" - }, - "depositEth": { - "message": "ETHを入金" - }, "depositEther": { "message": "Etherを振込" }, - "depositFiat": { - "message": "法定通貨ã§ãƒ‡ãƒã‚¸ãƒƒãƒˆ" - }, - "depositFromAccount": { - "message": "別ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‹ã‚‰å…¥é‡‘" - }, - "depositShapeShift": { - "message": "ShapeShiftã§äº¤æ›" - }, - "depositShapeShiftExplainer": { - "message": "ä»–ã®æš—å·é€šè²¨ã¨Etherを交æ›ã—ã¦ã€MetaMaskã®ã‚¦ã‚©ãƒ¬ãƒƒãƒˆã¸å…¥é‡‘ã§ãã¾ã™ã€‚アカウント作æˆã¯ä¸è¦ã§ã™ã€‚" - }, "details": { "message": "詳細" }, - "directDeposit": { - "message": "ダイレクトデãƒã‚¸ãƒƒãƒˆ" - }, "directDepositEther": { "message": "Etherを直接入金" }, @@ -264,11 +193,8 @@ "edit": { "message": "編集" }, - "editAccountName": { - "message": "アカウントåを編集" - }, - "encryptNewDen": { - "message": "æ–°ã—ã„DENã‚’æš—å·åŒ–ã™ã‚‹" + "endOfFlowMessage10": { + "message": "å…¨ã¦å®Œäº†" }, "enterPassword": { "message": "パスワードを入力" @@ -276,15 +202,9 @@ "etherscanView": { "message": "Etherscanã§ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’確èª" }, - "exchangeRate": { - "message": "交æ›ãƒ¬ãƒ¼ãƒˆ" - }, "exportPrivateKey": { "message": "秘密éµã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ" }, - "exportPrivateKeyWarning": { - "message": "ã‚ãªãŸè‡ªèº«ã®è²¬ä»»ã§ç§˜å¯†éµã‚’エクスãƒãƒ¼ãƒˆ" - }, "failed": { "message": "失敗" }, @@ -299,37 +219,15 @@ "from": { "message": "é€ä¿¡å…ƒ" }, - "fromShapeShift": { - "message": "ShapeShiftã‹ã‚‰" - }, - "gas": { - "message": "ガス", - "description": "Short indication of gas cost" - }, - "gasFee": { - "message": "ガス料金" - }, "gasLimit": { "message": "ガスリミット" }, - "gasLimitCalculation": { - "message": "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®æˆåŠŸçŽ‡ã‚’åŸºã«ã—ã¦ã€ã‚¬ã‚¹ãƒªãƒŸãƒƒãƒˆã‚’ææ¡ˆã—ã¦ã„ã¾ã™ã€‚" - }, - "gasLimitRequired": { - "message": "å¿…è¦ã‚¬ã‚¹ãƒªãƒŸãƒƒãƒˆ" - }, "gasLimitTooLow": { "message": "ã‚¬ã‚¹ãƒªãƒŸãƒƒãƒˆã¯æœ€ä½Ž21000ã§ã™ã€‚" }, "gasPrice": { "message": "ガスプライス (GWEI)" }, - "gasPriceCalculation": { - "message": "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®æˆåŠŸçŽ‡ã‚’åŸºã«ã—ã¦ã€ã‚¬ã‚¹ãƒ—ãƒ©ã‚¤ã‚¹ã‚’ææ¡ˆã—ã¦ã„ã¾ã™ã€‚" - }, - "gasPriceRequired": { - "message": "å¿…è¦ã‚¬ã‚¹ãƒ—ライス" - }, "getEther": { "message": "Etherã‚’å–å¾—ã™ã‚‹" }, @@ -337,10 +235,6 @@ "message": "フォーセット㧠$1ã®Etherã‚’å¾—ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚", "description": "Displays network name for Ether faucet" }, - "greaterThanMin": { - "message": " $1以上ã«ã—ã¦ä¸‹ã•ã„。", - "description": "helper for inputting hex as decimal input" - }, "here": { "message": "ã“ã“", "description": "as in -click here- for more information (goes with troubleTokenBalances)" @@ -348,15 +242,9 @@ "hide": { "message": "éš ã™" }, - "hideToken": { - "message": "トークンを隠ã™" - }, "hideTokenPrompt": { "message": "トークンを隠ã—ã¾ã™ã‹?" }, - "howToDeposit": { - "message": "ã©ã®ã‚ˆã†ã«Etherをデãƒã‚¸ãƒƒãƒˆã—ã¾ã™ã‹?" - }, "import": { "message": "追加", "description": "Button to import an account from a selected file" @@ -367,12 +255,6 @@ "importAccountMsg": { "message": "追加ã—ãŸã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯MetaMaskã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãƒ‘スフレーズã¨ã¯é–¢é€£ä»˜ã‘られã¾ã›ã‚“。インãƒãƒ¼ãƒˆã—ãŸã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ã¤ã„ã¦ã®è©³ç´°ã¯" }, - "importAnAccount": { - "message": "アカウントをインãƒãƒ¼ãƒˆ" - }, - "importDen": { - "message": "既存ã®DENをインãƒãƒ¼ãƒˆ" - }, "imported": { "message": "インãƒãƒ¼ãƒˆå®Œäº†", "description": "status showing that an account has been fully loaded into the keyring" @@ -386,74 +268,46 @@ "invalidAddress": { "message": "アドレスãŒç„¡åйã§ã™ã€‚" }, - "invalidGasParams": { - "message": "ガスã®ãƒ‘ラメーターãŒç„¡åйã§ã™ã€‚" - }, "invalidInput": { "message": "インプットãŒç„¡åйã§ã™ã€‚" }, - "invalidRequest": { - "message": "リクエストãŒç„¡åйã§ã™ã€‚" - }, "jsonFile": { "message": "JSONファイル", "description": "format for importing an account" }, - "keepTrackTokens": { - "message": "MetaMaskアカウントã§å…¥æ‰‹ã—ãŸãƒˆãƒ¼ã‚¯ãƒ³ã‚’検索ã§ãã¾ã™ã€‚" - }, "kovan": { "message": "Kovanテストãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" }, + "max": { + "message": "最大" + }, "learnMore": { "message": "詳細" }, - "lessThanMax": { - "message": " $1以下ã«ã—ã¦ä¸‹ã•ã„。", - "description": "helper for inputting hex as decimal input" - }, "likeToAddTokens": { "message": "トークンを追加ã—ã¾ã™ã‹?" }, "links": { "message": "リンク" }, - "limit": { - "message": "リミット" - }, "loading": { "message": "ロード中..." }, "loadingTokens": { "message": "トークンをロード中..." }, - "localhost": { - "message": "Localhost 8545" - }, - "login": { + "unlock": { "message": "ログイン" }, - "logout": { + "lock": { "message": "ログアウト" }, - "loose": { - "message": "外部秘密éµ" - }, - "max": { - "message": "最大" - }, "mainnet": { "message": "Ethereumメインãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" }, - "menu": { - "message": "メニュー" - }, "message": { "message": "メッセージ" }, - "min": { - "message": "ミニマム" - }, "myAccounts": { "message": "マイアカウント" }, @@ -467,10 +321,6 @@ "message": "インãƒãƒ¼ãƒˆã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„。", "description": "User is important an account and needs to add a file to continue" }, - "needImportPassword": { - "message": "é¸æŠžã—ãŸãƒ•ァイルã®ãƒ‘スワードを入力ã—ã¦ãã ã•ã„。", - "description": "Password and file needed to import an account" - }, "networks": { "message": "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" }, @@ -487,11 +337,8 @@ "newPassword": { "message": "æ–°è¦ãƒ‘スワード(最低8文字)" }, - "newRecipient": { - "message": "æ–°è¦å—å–人" - }, - "newRPC": { - "message": "æ–°ã—ã„RPCã®URLを追加" + "noAlreadyHaveSeed": { + "message": "ã™ã§ã«ã‚·ãƒ¼ãƒ‰ã‚’æŒã£ã¦ã„ã¾ã™" }, "next": { "message": "次ã¸" @@ -499,55 +346,16 @@ "noAddressForName": { "message": "ã“ã®åå‰ã«ã¯ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“。" }, - "noDeposits": { - "message": "振込ã¿ãŒã‚りã¾ã›ã‚“。" - }, - "noTransactionHistory": { - "message": "トランザクション履歴ãŒã‚りã¾ã›ã‚“。" - }, "noTransactions": { "message": "トランザクションãŒã‚りã¾ã›ã‚“。" }, - "notStarted": { - "message": "スタートã—ã¦ã„ã¾ã›ã‚“。" - }, - "oldUI": { - "message": "æ—§UI" - }, - "oldUIMessage": { - "message": "æ—§UIを表示ã—ã¦ã„ã¾ã™ã€‚å³ä¸Šã®ãƒ‰ãƒ­ãƒƒãƒ—ダウンメニューã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚ˆã‚Šã€æ–°UIã¸åˆ‡ã‚Šæ›¿ãˆãŒå¯èƒ½ã§ã™ã€‚" - }, - "openInTab": { - "message": "タブを開ã" - }, - "or": { - "message": "ã¾ãŸã¯", - "description": "choice between creating or importing a new account" - }, "password": { "message": "パスワード" }, - "passwordMismatch": { - "message": "パスワードãŒä¸€è‡´ã—ã¾ã›ã‚“。", - "description": "in password creation process, the two new password fields did not match" - }, - "passwordShort": { - "message": "パスワードãŒçŸ­ã™ãŽã¾ã™ã€‚", - "description": "in password creation process, the password is not long enough to be secure" - }, "pastePrivateKey": { "message": "秘密éµã‚’ã“ã“ã«ãƒšãƒ¼ã‚¹ãƒˆã—ã¦ä¸‹ã•ã„:", "description": "For importing an account from a private key" }, - "pasteSeed": { - "message": "パスフレーズをã“ã“ã«ãƒšãƒ¼ã‚¹ãƒˆã—ã¦ä¸‹ã•ã„!" - }, - "pleaseReviewTransaction": { - "message": "トランザクションを確èªã—ã¦ä¸‹ã•ã„。" - }, - "popularTokens": { - "message": "人気ã®ãƒˆãƒ¼ã‚¯ãƒ³" - }, "privacyMsg": { "message": "プライãƒã‚·ãƒ¼ãƒãƒªã‚·ãƒ¼" }, @@ -561,24 +369,12 @@ "privateNetwork": { "message": "プライベート・ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" }, - "qrCode": { - "message": "QRコードを表示" - }, "readdToken": { "message": "アカウントã®ã‚ªãƒ—ションメニューã‹ã‚‰ã€Œãƒˆãƒ¼ã‚¯ãƒ³ã‚’追加ã€ã™ã‚Œã°ã€å°†æ¥ã“ã®ãƒˆãƒ¼ã‚¯ãƒ³ã‚’追加ã—ç›´ã™ã“ã¨ãŒã§ãã¾ã™ã€‚" }, - "readMore": { - "message": "ã‚‚ã£ã¨èª­ã‚€" - }, - "receive": { - "message": "å—å–" - }, "recipientAddress": { "message": "å—å–人アドレス" }, - "refundAddress": { - "message": "å—å–アドレス" - }, "rejected": { "message": "æ‹’å¦ã•れã¾ã—ãŸ" }, @@ -588,59 +384,30 @@ "restoreFromSeed": { "message": "パスフレーズã‹ã‚‰å¾©å…ƒã™ã‚‹" }, - "restoreVault": { - "message": "ウォレットを復元ã™ã‚‹" - }, "required": { "message": "å¿…è¦ã§ã™ã€‚" }, - "retryWithMoreGas": { - "message": "より高ã„ガスプライスã§å†åº¦è©¦ã—ã¦ä¸‹ã•ã„。" - }, - "walletSeed": { - "message": "ウォレットã®ãƒ‘スフレーズ" - }, "revealSeedWords": { "message": "パスフレーズを表示" }, - "revert": { - "message": "å…ƒã«æˆ»ã™" - }, "rinkeby": { "message": "Rinkebyテストãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" }, "ropsten": { "message": "Ropstenテストãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" }, - "sampleAccountName": { - "message": "例.æ–°ã—ã„マイアカウント", - "description": "Help user understand concept of adding a human-readable name to their account" - }, "save": { "message": "ä¿å­˜" }, - "saveAsFile": { - "message": "ファイルã¨ã—ã¦ä¿å­˜", - "description": "Account export process" - }, "search": { "message": "検索" }, "searchResults": { "message": "æ¤œç´¢çµæžœ" }, - "newPassword8Chars": { - "message": "æ–°ã—ã„パスワード (8æ¡ä»¥ä¸Š)" - }, - "select": { - "message": "é¸æŠž" - }, "selectCurrency": { "message": "é€šè²¨ã‚’é¸æŠž" }, - "selectService": { - "message": "ã‚µãƒ¼ãƒ“ã‚¹ã‚’é¸æŠž" - }, "selectType": { "message": "キーã®ç¨®é¡ž" }, @@ -653,39 +420,20 @@ "sendTokens": { "message": "トークンをé€ä¿¡" }, - "onlySendToEtherAddress": { - "message": "ETH ã¯ã‚¤ãƒ¼ã‚µãƒªã‚¦ãƒ ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ã¿ã«é€ä¿¡ã§ãã¾ã™ã€‚" - }, - "onlySendTokensToAccountAddress": { - "message": "$1 ã¯ã‚¤ãƒ¼ã‚µãƒªã‚¢ãƒ ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ã¿ã«é€ä¿¡ã§ãã¾ã™ã€‚", - "description": "displays token symbol" - }, "searchTokens": { "message": "ãƒˆãƒ¼ã‚¯ãƒ³ã®æ¤œç´¢" }, - "sendTokensAnywhere": { - "message": "イーサリアムアカウントをæŒã£ã¦ã„る人ã«ãƒˆãƒ¼ã‚¯ãƒ³ã‚’é€ã‚‹" - }, "settings": { "message": "設定" }, - "info": { - "message": "情報" - }, - "shapeshiftBuy": { - "message": "Shapeshiftã§äº¤æ›" - }, "showPrivateKeys": { "message": "秘密éµã‚’表示" }, - "showQRCode": { - "message": "QRコードを表示" - }, "sign": { "message": "ç½²å" }, - "signMessage": { - "message": "メッセージã«ç½²å" + "signatureRequest": { + "message": "ç½²åリクエスト" }, "signNotice": { "message": "ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¸ã®ç½²åã¯å±é™ºã¨ãªã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚\n完全ã«ä¿¡é ¼ã™ã‚‹ã‚µã‚¤ãƒˆã‹ã‚‰ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã¿ã€\nã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§ç½²åã—ã¦ä¸‹ã•ã„。今後ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã€\nã“ã®å±é™ºãªãƒ¡ã‚½ãƒƒãƒ‰ã¯å‰Šé™¤ã•れる予定ã§ã™ã€‚" @@ -693,18 +441,6 @@ "sigRequest": { "message": "ç½²åリクエスト" }, - "sigRequested": { - "message": "ç½²åãŒãƒªã‚¯ã‚¨ã‚¹ãƒˆã•れã¾ã—ãŸ" - }, - "status": { - "message": "ステータス" - }, - "submit": { - "message": "é€ä¿¡" - }, - "takesTooLong": { - "message": "é€ä¿¡ã«æ™‚é–“ãŒã‹ã‹ã‚Šã¾ã™ã‹?" - }, "terms": { "message": "利用è¦ç´„" }, @@ -714,43 +450,15 @@ "to": { "message": "é€ä¿¡å…ˆ" }, - "toETHviaShapeShift": { - "message": "ShapeShiftã§ $1ã‚’ETHã«ã™ã‚‹", - "description": "system will fill in deposit type in start of message" - }, "token": { "message": "トークン" }, - "tokenAddress": { - "message": "トークンアドレス" - }, - "tokenBalance": { - "message": "ã‚ãªãŸã®ãƒˆãƒ¼ã‚¯ãƒ³æ®‹é«˜:" - }, - "tokenSelection": { - "message": "トークンを検索ã€ã¾ãŸã¯ãƒªã‚¹ãƒˆã‹ã‚‰é¸æŠžã—ã¦ãã ã•ã„。" - }, "tokenSymbol": { "message": "トークンシンボル" }, - "tokenWarning1": { - "message": "MetaMaskã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§å–å¾—ã—ãŸã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ã¿è¿½åŠ ã§ãã¾ã™ã€‚ä»–ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’使用ã—ã¦å–å¾—ã—ãŸãƒˆãƒ¼ã‚¯ãƒ³ã¯ã€ã‚«ã‚¹ã‚¿ãƒ ãƒˆãƒ¼ã‚¯ãƒ³ã‚’使用ã—ã¦ãã ã•ã„。" - }, "total": { "message": "åˆè¨ˆ" }, - "transactions": { - "message": "トランザクション" - }, - "transactionMemo": { - "message": "トランザクションメモ (オプション)" - }, - "transactionNumber": { - "message": "トランザクション番å·" - }, - "transfers": { - "message": "トランスファー" - }, "troubleTokenBalances": { "message": "トークン残高をå–å¾—ã§ãã¾ã›ã‚“。ã“ã¡ã‚‰ã§ã”確èªãã ã•ã„。", "description": "Followed by a link (here) to view token balances" @@ -758,42 +466,23 @@ "typePassword": { "message": "パスワードã®å…¥åŠ›" }, - "uiWelcome": { - "message": "æ–°UIã¸ã‚ˆã†ã“ã! (ベータ版)" - }, - "uiWelcomeMessage": { - "message": "ç¾åœ¨ã€MetaMask ã®æ–°ã—ã„UIã‚’ãŠä½¿ã„ã«ãªã£ã¦ã„ã¾ã™ã€‚トークンé€ä¿¡ãªã©ã€æ–°ãŸãªæ©Ÿèƒ½ã‚’試ã—ã¦ã¿ã¾ã—ょã†! 何ã‹å•題ãŒã‚れã°ã”報告ãã ã•ã„。" - }, - "unavailable": { - "message": "有効ã§ã¯ã‚りã¾ã›ã‚“。" - }, "unknown": { "message": "䏿˜Ž" }, "unknownNetwork": { "message": "䏿˜Žãªãƒ—ライベートãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" }, - "unknownNetworkId": { - "message": "䏿˜Žãªãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ID" - }, - "usaOnly": { - "message": "米国居ä½è€…ã®ã¿", - "description": "Using this exchange is limited to people inside the USA" - }, "usedByClients": { "message": "様々ãªã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«ã‚ˆã£ã¦ä½¿ç”¨ã•れã¦ã„ã¾ã™ã€‚" }, - "useOldUI": { - "message": "æ—§UIã«åˆ‡ã‚Šæ›¿ãˆ" - }, "viewAccount": { "message": "アカウントを見る" }, "viewOnEtherscan": { "message": "Etherscan ã§è¦‹ã‚‹" }, - "warning": { - "message": "警告" + "walletSeed": { + "message": "ウォレットã®ãƒ‘スフレーズ" }, "welcomeBack": { "message": "ãŠã‹ãˆã‚Šãªã•ã„!" @@ -801,9 +490,6 @@ "welcome": { "message": "MetaMask ベータ版ã¸ã‚ˆã†ã“ã!" }, - "whatsThis": { - "message": "ã“ã®æ©Ÿèƒ½ã«ã¤ã„ã¦" - }, "yourSigRequested": { "message": "ã‚ãªãŸã®ç½²åãŒãƒªã‚¯ã‚¨ã‚¹ãƒˆã•れã¦ã„ã¾ã™ã€‚" }, diff --git a/app/_locales/kn/messages.json b/app/_locales/kn/messages.json new file mode 100644 index 000000000000..207dccfb7415 --- /dev/null +++ b/app/_locales/kn/messages.json @@ -0,0 +1,1310 @@ +{ + "chartOnlyAvailableEth": { + "message": "ಎಥೆರಿಯಮೠನೆಟà³â€Œà²µà²°à³à²•à³â€Œà²—ಳಲà³à²²à²¿ ಮಾತà³à²°à²µà³‡ ಚಾರà³à²Ÿà³â€Œà²—ಳೠಲಭà³à²¯à²µà²¿à²°à³à²¤à³à²¤à²µà³†." + }, + "contractInteraction": { + "message": "ಒಪà³à²ªà²‚ದದ ಸಂವಹನ" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "reject": { + "message": "ತಿರಸà³à²•ರಿಸಿ" + }, + "about": { + "message": "ಕà³à²°à²¿à²¤à³" + }, + "aboutSettingsDescription": { + "message": "ಆವೃತà³à²¤à²¿, ಬೆಂಬಲ ಕೇಂದà³à²° ಮತà³à²¤à³ ಸಂಪರà³à²• ಮಾಹಿತಿ" + }, + "acceleratingATransaction": { + "message": "* ಹೆಚà³à²šà²¿à²¨ ಗà³à²¯à²¾à²¸à³ ಬೆಲೆಯನà³à²¨à³ ಬಳಸಿಕೊಂಡೠವಹಿವಾಟನà³à²¨à³ ವೇಗಗೊಳಿಸà³à²µà³à²¦à²°à²¿à²‚ದ ನೆಟà³â€Œà²µà²°à³à²•ೠವೇಗವಾಗಿ ಪà³à²°à²•à³à²°à²¿à²¯à³†à²—ೊಳà³à²³à³à²µ ಸಾಧà³à²¯à²¤à³†à²—ಳನà³à²¨à³ ಅದೠಹೆಚà³à²šà²¿à²¸à³à²¤à³à²¤à²¦à³†, ಆದರೆ ಇದೠಯಾವಾಗಲೂ ಖಚಿತವಾಗಿರà³à²µà³à²¦à²¿à²²à³à²²." + }, + "accessingYourCamera": { + "message": "ನಿಮà³à²® ಕà³à²¯à²¾à²®à²°à²¾à²µà²¨à³à²¨à³ ಪà³à²°à²µà³‡à²¶à²¿à²¸à²²à²¾à²—à³à²¤à³à²¤à²¿à²¦à³†..." + }, + "account": { + "message": "ಖಾತೆ" + }, + "accountDetails": { + "message": "ಖಾತೆಯ ವಿವರಗಳà³" + }, + "accountName": { + "message": "ಖಾತೆಯ ಹೆಸರà³" + }, + "accountOptions": { + "message": "ಖಾತೆಯ ಆಯà³à²•ೆಗಳà³" + }, + "accountSelectionRequired": { + "message": "ನೀವೠಖಾತೆಯನà³à²¨à³ ಆಯà³à²•ೆಮಾಡà³à²µ ಅಗತà³à²¯à²µà²¿à²¦à³†!" + }, + "activityLog": { + "message": "ಚಟà³à²µà²Ÿà²¿à²•ೆ ಲಾಗà³" + }, + "addNetwork": { + "message": "ನೆಟà³â€Œà²µà²°à³à²•ೠಸೇರಿಸಿ" + }, + "addRecipient": { + "message": "ಸà³à²µà³€à²•ೃತಿದಾರರನà³à²¨à³ ಸೇರಿಸಿ" + }, + "advanced": { + "message": "ಸà³à²§à²¾à²°à²¿à²¤" + }, + "advancedSettingsDescription": { + "message": "ಡೆವಲಪರೠವೈಶಿಷà³à²Ÿà³à²¯à²—ಳನà³à²¨à³ ಪà³à²°à²µà³‡à²¶à²¿à²¸à²¿, ರಾಜà³à²¯à²¦ ಲಾಗà³â€Œà²—ಳನà³à²¨à³ ಡೌನà³â€Œà²²à³‹à²¡à³ ಮಾಡಿ, ಖಾತೆಯನà³à²¨à³ ಮರà³à²¹à³Šà²‚ದಿಸಿ, ಟೆಸà³à²Ÿà³â€Œà²¨à³†à²Ÿà³à²¸à³â€Œ ಹೊಂದಿಸಿ ಮತà³à²¤à³ ಕಸà³à²Ÿà²®à³ RPC" + }, + "advancedOptions": { + "message": "ಸà³à²§à²¾à²°à²¿à²¤ ಆಯà³à²•ೆಗಳà³" + }, + "addToAddressBook": { + "message": "ವಿಳಾಸ ಪà³à²¸à³à²¤à²•ಕà³à²•ೆ ಸೇರಿಸಿ" + }, + "addToAddressBookModalPlaceholder": { + "message": "ಉದಾ. ಜಾನೠಡಿ." + }, + "addAlias": { + "message": "ಅಲಿಯಾಸೠಸೇರಿಸಿ" + }, + "addToken": { + "message": "ಟೋಕನೠಸೇರಿಸಿ" + }, + "addTokens": { + "message": "ಟೋಕನà³â€Œà²—ಳನà³à²¨à³ ಸೇರಿಸಿ" + }, + "addSuggestedTokens": { + "message": "ಸೂಚಿಸಲಾದ ಟೋಕನà³â€Œà²—ಳನà³à²¨à³ ಸೇರಿಸಿ" + }, + "addAcquiredTokens": { + "message": "MetaMask ಬಳಸಿಕೊಂಡೠನೀವೠಸà³à²µà²¾à²§à³€à²¨à²ªà²¡à²¿à²¸à²¿à²•ೊಂಡಿರà³à²µ ಟೋಕನà³â€Œà²—ಳನà³à²¨à³ ಸೇರಿಸಿ" + }, + "amount": { + "message": "ಮೊತà³à²¤" + }, + "appDescription": { + "message": "ನಿಮà³à²® ಬà³à²°à³Œà²¸à²°à³â€Œà²¨à²²à³à²²à²¿à²°à³à²µ ಎಥೆರಿಯಮೠವà³à²¯à²¾à²²à³†à²Ÿà³", + "description": "The description of the application" + }, + "approve": { + "message": "ಅನà³à²®à³‹à²¦à²¿à²¸à²¿" + }, + "approved": { + "message": "ಅನà³à²®à³‹à²¦à²¿à²¸à²²à²¾à²—ಿದೆ" + }, + "asset": { + "message": "ಆಸà³à²¤à²¿" + }, + "attemptingConnect": { + "message": "ಬà³à²²à²¾à²•à³â€Œà²šà³ˆà²¨à³â€Œà²—ೆ ಸಂಪರà³à²•ಿಸಲೠಪà³à²°à²¯à²¤à³à²¨à²¿à²¸à²²à²¾à²—à³à²¤à³à²¤à²¿à²¦à³†." + }, + "attemptToCancel": { + "message": "ರದà³à²¦à³à²—ೊಳಿಸಲೠಪà³à²°à²¯à²¤à³à²¨à²¿à²¸à³à²¤à³à²¤à²¿à²°à³à²µà²¿à²°à²¾?" + }, + "attemptToCancelDescription": { + "message": "ಈ ಪà³à²°à²¯à²¤à³à²¨à²µà²¨à³à²¨à³ ಸಲà³à²²à²¿à²¸à³à²µà³à²¦à²°à²¿à²‚ದ ನಿಮà³à²® ಮೂಲ ವಹಿವಾಟೠರದà³à²¦à³à²—ೊಳà³à²³à³à²¤à³à²¤à²¦à³† ಎಂಬà³à²¦à²¾à²—ಿ ಖಾತà³à²°à²¿à²ªà²¡à²¿à²¸à²²à²¾à²—à³à²µà³à²¦à²¿à²²à³à²². ರದà³à²¦à³ ಮಾಡà³à²µ ಪà³à²°à²¯à²¤à³à²¨à²µà³ ಯಶಸà³à²µà²¿à²¯à²¾à²¦à²°à³†, ಮೇಲಿನ ವಹಿವಾಟೠಶà³à²²à³à²•ವನà³à²¨à³ ನಿಮಗೆ ವಿಧಿಸಲಾಗà³à²¤à³à²¤à²¦à³†." + }, + "attributions": { + "message": "ಗà³à²£à²²à²•à³à²·à²£à²—ಳà³" + }, + "autoLockTimeLimit": { + "message": "ಸà³à²µà²¯à²‚-ಲಾಗà³à²”ಟà³â€Œ ಟೈಮರೠ(ನಿಮಿಷಗಳà³)" + }, + "autoLockTimeLimitDescription": { + "message": "MetaMask ಸà³à²µà²¯à²‚ಚಾಲಿತವಾಗಿ ಲಾಗೠಔಟà³â€Œ ಆಗà³à²µ ಮೊದಲೠನಿಮಿಷಗಳಲà³à²²à²¿ ನಿಷà³à²•à³à²°à²¿à²¯ ಸಮಯವನà³à²¨à³ ಹೊಂದಿಸಿ" + }, + "average": { + "message": "ಸರಾಸರಿ" + }, + "back": { + "message": "ಹಿಂದೆ" + }, + "backToAll": { + "message": "ಎಲà³à²²à²µà²¨à³à²¨à³ ಹಿಂತಿರà³à²—ಿಸಿ" + }, + "backupApprovalNotice": { + "message": "ನಿಮà³à²® ವà³à²¯à²¾à²²à³†à²Ÿà³â€Œ ಮತà³à²¤à³ ನಿಧಿಗಳನà³à²¨à³ ಭದà³à²°à²µà²¾à²—ಿರಿಸಲೠನಿಮà³à²® ರಹಸà³à²¯ ಮರà³à²ªà²¡à³†à²¦à³à²•ೊಳà³à²³à³à²µà²¿à²•ೆಯ ಕೋಡೠಅನà³à²¨à³ ಬà³à²¯à²¾à²•ಪೠಮಾಡಿ." + }, + "backupApprovalInfo": { + "message": "ನಿಮà³à²® ಸಾಧನವನà³à²¨à³ ನೀವೠಕಳೆದà³à²•ೊಂಡಾಗ, ನಿಮà³à²® ಪಾಸà³â€Œà²µà²°à³à²¡à³ ಅನà³à²¨à³ ಮರೆತರೆ, MetaMask ಅನà³à²¨à³ ಮರà³-ಸà³à²¥à²¾à²ªà²¿à²¸à²²à³ ಅಥವಾ ಬೇರೊಂದೠಸಾಧನದಲà³à²²à²¿ ನಿಮà³à²® ವà³à²¯à²¾à²²à³†à²Ÿà³â€Œ ಅನà³à²¨à³ ಪà³à²°à²µà³‡à²¶à²¿à²¸à²²à³ ಬಯಸಿದ ಸಂದರà³à²­à²¦à²²à³à²²à²¿ ನಿಮà³à²® ವà³à²¯à²¾à²²à³†à²Ÿà³â€Œ ಅನà³à²¨à³ ಮರà³à²ªà²¡à³†à²¦à³à²•ೊಳà³à²³à²²à³ ಈ ರಹಸà³à²¯ ಕೋಡೠಅಗತà³à²¯à²µà²¿à²°à³à²¤à³à²¤à²¦à³†." + }, + "backupNow": { + "message": "ಈಗ ಬà³à²¯à²¾à²•ಪà³â€Œ ಮಾಡಿ" + }, + "balance": { + "message": "ಮೊಬಲಗà³" + }, + "balanceOutdated": { + "message": "ಮೊಬಲಗೠಹಳೆಯದಾಗಿರಬಹà³à²¦à³" + }, + "basic": { + "message": "ಮೂಲ" + }, + "blockExplorerUrl": { + "message": "ಅನà³à²µà³‡à²·à²•ವನà³à²¨à³ ನಿರà³à²¬à²‚ಧಿಸಿ" + }, + "blockExplorerView": { + "message": " $1 ನಲà³à²²à²¿ ಖಾತೆಯನà³à²¨à³ ವೀಕà³à²·à²¿à²¸à²¿", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "ಬà³à²²à²¾à²•ೀಸೠà²à²¡à³†à²‚ಟಿಕಾನೠಬಳಸಿ" + }, + "browserNotSupported": { + "message": "ನಿಮà³à²® ಬà³à²°à³Œà²¸à²°à³ ಬೆಂಬಲಿಸà³à²¤à³à²¤à²¿à²²à³à²²..." + }, + "builtInCalifornia": { + "message": "MetaMask ಅನà³à²¨à³ ವಿನà³à²¯à²¾à²¸à²—ೊಳಿಸಲಾಗಿದೆ ಮತà³à²¤à³ ಕà³à²¯à²¾à²²à²¿à²«à³‹à²°à³à²¨à²¿à²¯à²¾à²¦à²²à³à²²à²¿ ನಿರà³à²®à²¿à²¸à²²à²¾à²—ಿದೆ." + }, + "buyWithWyre": { + "message": "Wyre ನೊಂದಿಗೆ ETH ಖರೀದಿಸಿ" + }, + "buyWithWyreDescription": { + "message": "ನಿಮà³à²® MetaMask ಖಾತೆಗೆ ETH ಅನà³à²¨à³ ಜಮಾ ಮಾಡಲೠಕà³à²°à³†à²¡à²¿à²Ÿà³ ಕಾರà³à²¡à³ ಬಳಸಲೠWyre ನಿಮಗೆ ಅನà³à²®à²¤à²¿à²¸à³à²¤à³à²¤à²¦à³†." + }, + "buyCoinSwitch": { + "message": "ಕಾಯಿನà³â€Œà²¸à³à²µà³€à²šà³â€Œà²¨à²²à³à²²à²¿ ಖರೀದಿಸಿ" + }, + "buyCoinSwitchExplainer": { + "message": "300 ಕà³à²•ೂ ಹೆಚà³à²šà³ ಕà³à²°à²¿à²ªà³à²Ÿà³‹à²•ರೆನà³à²¸à²¿à²—ಳನà³à²¨à³ ಉತà³à²¤à²® ದರದಲà³à²²à²¿ ವಿನಿಮಯ ಮಾಡಿಕೊಳà³à²³à³à²µ ಒಂದೠತಾಣವೆಂದರೆ ಕಾಯಿನà³â€Œà²¸à³à²µà²¿à²šà³ ಆಗಿದೆ." + }, + "bytes": { + "message": "ಬೈಟà³â€Œà²—ಳà³" + }, + "off": { + "message": "ಆಫà³" + }, + "ok": { + "message": "ಸರಿ" + }, + "on": { + "message": "ಆನà³â€Œ" + }, + "optionalBlockExplorerUrl": { + "message": "ಅನà³à²µà³‡à²·à²• URL ಅನà³à²¨à³ ನಿರà³à²¬à²‚ಧಿಸಿ (à²à²šà³à²›à²¿à²•)" + }, + "cancel": { + "message": "ರದà³à²¦à³à²®à²¾à²¡à²¿" + }, + "cancelAttempt": { + "message": "ಪà³à²°à²¯à²¤à³à²¨à²µà²¨à³à²¨à³ ರದà³à²¦à³à²ªà²¡à²¿à²¸à²¿" + }, + "cancellationGasFee": { + "message": "ರದà³à²¦à³à²—ೊಳಿಸà³à²µ ಗà³à²¯à²¾à²¸à³ ಶà³à²²à³à²•" + }, + "cancelled": { + "message": "ರದà³à²¦à³à²—ೊಳಿಸಲಾಗಿದೆ" + }, + "chainId": { + "message": "ಚೈನೠID" + }, + "clickToRevealSeed": { + "message": "ರಹಸà³à²¯ ಪದಗಳನà³à²¨à³ ಬಹಿರಂಗಪಡಿಸಲೠಇಲà³à²²à²¿ ಕà³à²²à²¿à²•ೠಮಾಡಿ" + }, + "close": { + "message": "ಮà³à²šà³à²šà²¿" + }, + "chromeRequiredForHardwareWallets": { + "message": "ನಿಮà³à²® ಹಾರà³à²¡à³â€Œà²µà³‡à²°à³ ವà³à²¯à²¾à²²à³†à²Ÿà³â€Œà²—ೆ ಸಂಪರà³à²•ಪಡಿಸà³à²µ ಸಲà³à²µà²¾à²—ಿ Google Chrome ನಲà³à²²à²¿ ನಿಮಗೆ MetaMask ಅನà³à²¨à³ ಬಳಸà³à²µ ಅಗತà³à²¯à²µà²¿à²¦à³†." + }, + "confirm": { + "message": "ದೃಢೀಕರಿಸà³" + }, + "confirmed": { + "message": "ಖಚಿತಪಡಿಸಲಾಗಿದೆ" + }, + "confirmPassword": { + "message": "ಪಾಸà³â€Œà²µà²°à³à²¡à³ ಅನà³à²¨à³ ಖಚಿತಪಡಿಸಿ" + }, + "confirmSecretBackupPhrase": { + "message": "ನಿಮà³à²® ರಹಸà³à²¯ ಬà³à²¯à²¾à²•ಪೠಫà³à²°à³‡à²¸à³ ಅನà³à²¨à³ ಖಚಿತಪಡಿಸಿ" + }, + "congratulations": { + "message": "ಅಭಿನಂದನೆಗಳà³" + }, + "connectHardwareWallet": { + "message": "ಹಾರà³à²¡à³â€Œà²µà³†à²°à³ ವà³à²¯à²¾à²²à³†à²Ÿà³â€Œâ€Œà²—ೆ ಸಂಪರà³à²•ಪಡಿಸಿ" + }, + "connect": { + "message": "ಸಂಪರà³à²•ಿಸà³" + }, + "connectingTo": { + "message": "$1 ಗೆ ಸಂಪರà³à²•ಪಡಿಸಲಾಗà³à²¤à³à²¤à²¿à²¦à³†" + }, + "connectingToKovan": { + "message": "Kovan ಪರೀಕà³à²·à²¾ ನೆಟà³â€Œà²µà²°à³à²•à³â€Œà²—ೆ ಸಂಪರà³à²•ಿಸಲಾಗà³à²¤à³à²¤à²¿à²¦à³†Â " + }, + "connectingToMainnet": { + "message": "ಮà³à²–à³à²¯ ಎಥೆರಿಯಮೠನೆಟà³â€Œà²µà²°à³à²•à³â€Œà²—ೆ ಸಂಪರà³à²•ಿಸಲಾಗà³à²¤à³à²¤à²¿à²¦à³†" + }, + "connectingToRopsten": { + "message": "Ropsten ಪರೀಕà³à²·à²¾ ನೆಟà³â€Œà²µà²°à³à²•à³â€Œà²—ೆ ಸಂಪರà³à²•ಿಸಲಾಗà³à²¤à³à²¤à²¿à²¦à³†" + }, + "connectingToRinkeby": { + "message": "Rinkeby ಪರೀಕà³à²·à²¾ ನೆಟà³â€Œà²µà²°à³à²•à³â€Œà²—ೆ ಸಂಪರà³à²•ಿಸಲಾಗà³à²¤à³à²¤à²¿à²¦à³†" + }, + "connectingToLocalhost": { + "message": "ಲೋಕಲà³â€Œà²¹à³‹à²¸à³à²Ÿà³ 8545 ಗೆ ಸಂಪರà³à²•ಿಸಲಾಗà³à²¤à³à²¤à²¿à²¦à³†" + }, + "connectingToGoerli": { + "message": "Goerli ಪರೀಕà³à²·à²¾ ನೆಟà³â€Œà²µà²°à³à²•à³â€Œà²—ೆ ಸಂಪರà³à²•ಿಸಲಾಗà³à²¤à³à²¤à²¿à²¦à³†" + }, + "continueToWyre": { + "message": "Wyre ಗೆ ಮà³à²‚ದà³à²µà²°à²¿à²¸à²¿" + }, + "continueToCoinSwitch": { + "message": "CoinSwitch ಗೆ ಮà³à²‚ದà³à²µà²°à²¿à²¸à²¿" + }, + "contractDeployment": { + "message": "ಒಪà³à²ªà²‚ದದ ನಿಯೋಜನೆ" + }, + "copiedExclamation": { + "message": "ನಕಲಿಸಲಾಗಿದೆ!" + }, + "copyAddress": { + "message": "ವಿಳಾಸವನà³à²¨à³ ಕà³à²²à²¿à²ªà³â€Œà²¬à³‹à²°à³à²¡à³â€Œà²—ೆ ನಕಲಿಸಿ" + }, + "copyTransactionId": { + "message": "ವà³à²¯à²µà²¹à²¾à²° ID ಅನà³à²¨à³ ನಕಲಿಸಿ" + }, + "copiedTransactionId": { + "message": "ವà³à²¯à²µà²¹à²¾à²° ID ಅನà³à²¨à³ ನಕಲಿಸಲಾಗಿದೆ" + }, + "copyToClipboard": { + "message": "ಕà³à²²à²¿à²ªà³â€Œà²¬à³‹à²°à³à²¡à³â€Œà²—ೆ ನಕಲಿಸಿ" + }, + "copyPrivateKey": { + "message": "ಇದೠನಿಮà³à²® ಖಾಸಗಿ ಕೀ ಆಗಿದೆ (ನಕಲಿಸಲೠಕà³à²²à²¿à²•ೠಮಾಡಿ)" + }, + "create": { + "message": "ರಚಿಸಿ" + }, + "createAccount": { + "message": "ಖಾತೆಯನà³à²¨à³ ರಚಿಸಿ" + }, + "createAWallet": { + "message": "ವà³à²¯à²¾à²²à³†à²Ÿà³â€Œ ಅನà³à²¨à³ ರಚಿಸಿ" + }, + "createPassword": { + "message": "ಪಾಸà³â€Œà²µà²°à³à²¡à³ ರಚಿಸಿ" + }, + "currencyConversion": { + "message": "ಕರೆನà³à²¸à²¿ ಪರಿವರà³à²¤à²¨à³†" + }, + "currentLanguage": { + "message": "ಪà³à²°à²¸à³à²¤à³à²¤ ಭಾಷೆ" + }, + "customGas": { + "message": "ಗà³à²¯à²¾à²¸à³ ಕಸà³à²Ÿà²®à³ˆà²¸à³ ಮಾಡಿ" + }, + "customGasSubTitle": { + "message": "ಹೆಚà³à²šà³à²¤à³à²¤à²¿à²°à³à²µ ಶà³à²²à³à²•ವೠಪà³à²°à²•à³à²°à²¿à²¯à³†à²—ೊಳಿಸà³à²µ ಸಮಯದಲà³à²²à²¿ ಕಡಿಮೆಯಾಗà³à²¤à³à²¤à²¦à³† ಆದರೆ ಇದೠಖಚಿತವಾಗಿಲà³à²²." + }, + "customToken": { + "message": "ಕಸà³à²Ÿà²®à³ ಟೋಕನà³" + }, + "customRPC": { + "message": "ಕಸà³à²Ÿà²®à³ RPC" + }, + "decimalsMustZerotoTen": { + "message": "ದಶಮಾಂಶಗಳೠಕನಿಷà³à²Ÿ 0 ಆಗಿರಬೇಕೠಮತà³à²¤à³ 36 ಕà³à²•ಿಂತ ಹೆಚà³à²šà²¿à²°à²¬à²¾à²°à²¦à³" + }, + "decimal": { + "message": "ನಿಖರತೆಯ ದಶಮಾಂಶಗಳà³" + }, + "defaultNetwork": { + "message": "ಎಥರೠವಹಿವಾಟà³à²—ಳಿಗಾಗಿ ಡೀಫಾಲà³à²Ÿà³ ನೆಟà³â€Œà²µà²°à³à²•ೠಪà³à²°à²®à³à²–ವಾಗಿರà³à²µ ನೆಟೠಆಗಿದೆ." + }, + "delete": { + "message": "ಅಳಿಸಿ" + }, + "deleteAccount": { + "message": "ಖಾತೆಯನà³à²¨à³ ಅಳಿಸಿ" + }, + "deposit": { + "message": "ಠೇವಣಿ" + }, + "depositEther": { + "message": "ಎಥರೠಠೇವಣಿ ಮಾಡಿ" + }, + "details": { + "message": "ವಿವರಗಳà³" + }, + "directDepositEther": { + "message": "ಎಥರೠನೇರವಾಗಿ ಠೇವಣಿ ಮಾಡಿ" + }, + "directDepositEtherExplainer": { + "message": "ನೀವೠಈಗಾಗಲೇ ಕೆಲವೠಎಥರೠಹೊಂದಿದà³à²¦à²°à³†, ನೇರ ಠೇವಣಿ ಮೂಲಕ ನಿಮà³à²® ಹೊಸ ವà³à²¯à²¾à²²à³†à²Ÿà³â€Œà²¨à²²à³à²²à²¿ ಎಥರೠಅನà³à²¨à³ ಪಡೆಯà³à²µ ತà³à²µà²°à²¿à²¤ ಮಾರà³à²—." + }, + "done": { + "message": "ಮà³à²—ಿದಿದೆ" + }, + "downloadGoogleChrome": { + "message": "Google Chrome ಡೌನà³â€Œà²²à³‹à²¡à³ ಮಾಡಿ" + }, + "downloadSecretBackup": { + "message": "ಈ ರಹಸà³à²¯ ಬà³à²¯à²¾à²•ಪೠಫà³à²°à³‡à²¸à³â€Œ ಅನà³à²¨à³ ಡೌನà³â€Œà²²à³‹à²¡à³ ಮಾಡಿ ಮತà³à²¤à³ ಬಾಹà³à²¯ ಎನà³â€Œà²•à³à²°à²¿à²ªà³à²Ÿà³ ಮಾಡಿದ ಹಾರà³à²¡à³ ಡà³à²°à³ˆà²µà³ ಅಥವಾ ಸಂಗà³à²°à²¹à²£à³† ಮಾಧà³à²¯à²®à²¦à²²à³à²²à²¿ ಅದನà³à²¨à³ ಸà³à²°à²•à³à²·à²¿à²¤à²µà²¾à²—ಿ ಸಂಗà³à²°à²¹à²¿à²¸à²¿à²¡à²¿." + }, + "downloadStateLogs": { + "message": "ರಾಜà³à²¯à²¦ ಲಾಗà³â€Œà²—ಳನà³à²¨à³ ಡೌನà³â€Œà²²à³‹à²¡à³ ಮಾಡಿ" + }, + "dontHaveAHardwareWallet": { + "message": "ಹಾರà³à²¡à³â€Œà²µà³‡à²°à³ ವà³à²¯à²¾à²²à³†à²Ÿà³â€Œ ಅನà³à²¨à³ ಹೊಂದಿಲà³à²²à²µà³‡?" + }, + "dropped": { + "message": "ಕೈಬಿಡಲಾಗಿದೆ" + }, + "edit": { + "message": "ಎಡಿಟà³" + }, + "editContact": { + "message": "ಸಂಪರà³à²•ವನà³à²¨à³ ಸಂಪಾದಿಸಿ" + }, + "endOfFlowMessage1": { + "message": "ನೀವೠಪರೀಕà³à²·à³†à²¯à²¨à³à²¨à³ ಪಾಸೠಮಾಡಿರà³à²µà²¿à²°à²¿ - ನಿಮà³à²® ಸೀಡà³â€Œà²«à³à²°à³‡à²¸à³ ಸà³à²°à²•à³à²·à²¿à²¤à²µà²¾à²—ಿರಿಸಿ, ಅದೠನಿಮà³à²® ಜವಾಬà³à²¦à²¾à²°à²¿à²¯à²¾à²—ಿದೆ!" + }, + "endOfFlowMessage2": { + "message": "ಅದನà³à²¨à³ ಸà³à²°à²•à³à²·à²¿à²¤à²µà²¾à²—ಿ ಸಂಗà³à²°à²¹à²¿à²¸à³à²µ ಸಲಹೆಗಳà³" + }, + "endOfFlowMessage3": { + "message": "ಬಹೠಸà³à²¥à²³à²—ಳಲà³à²²à²¿ ಬà³à²¯à²¾à²•ಪà³â€Œ ಉಳಿಸಿ" + }, + "endOfFlowMessage4": { + "message": "ಯಾರೊಂದಿಗೂ ಫà³à²°à³‡à²¸à³ ಅನà³à²¨à³ ಎಂದಿಗೂ ಹಂಚಿಕೊಳà³à²³à²¬à³‡à²¡à²¿." + }, + "endOfFlowMessage5": { + "message": "ಫಿಶಿಂಗೠಕà³à²°à²¿à²¤à³ ಜಾಗರೂಕರಾಗಿರಿ! MetaMask ನಿಮà³à²® ಸೀಡೠಫà³à²°à³‡à²¸à³ ಅನà³à²¨à³ ಎಂದಿಗೂ ಸà³à²µà²¯à²‚ಪà³à²°à³‡à²°à²¿à²¤à²µà²¾à²—ಿ ಕೇಳà³à²µà³à²¦à²¿à²²à³à²²." + }, + "endOfFlowMessage6": { + "message": "ನಿಮà³à²® ಸೀಡೠಫà³à²°à³‡à²¸à³â€Œà²¨à²¿à²‚ದ ಮತà³à²¤à³Šà²®à³à²®à³† ನೀವೠಮತà³à²¤à³† ಬà³à²¯à²¾à²•ಪೠಮಾಡಬೇಕಾದರೆ, ನೀವೠಅದನà³à²¨à³ ಸೆಟà³à²Ÿà²¿à²‚ಗà³â€Œà²—ಳೠ-> ಭದà³à²°à²¤à³†à²¯à²²à³à²²à²¿ ಕಾಣಬಹà³à²¦à³." + }, + "endOfFlowMessage7": { + "message": "ನೀವೠಎಂದಾದರೂ ಪà³à²°à²¶à³à²¨à³†à²—ಳನà³à²¨à³ ಹೊಂದಿದà³à²¦à²°à³† ಅಥವಾ ನೀವೠಯಾವಗಲಾದರೂ ಗೊಂದಲಮಯವಾಗಿದà³à²¦à²°à³† support@metamask.io ಗೆ ಇಮೇಲೠಮಾಡಿ." + }, + "endOfFlowMessage8": { + "message": "MetaMask ಗೆ ನಿಮà³à²® ಸೀಡà³â€Œà²«à³à²°à³‡à²¸à³ ಮರಳಿಪಡೆಯಲೠಸಾಧà³à²¯à²µà²¿à²²à³à²². ಇನà³à²¨à²·à³à²Ÿà³ ತಿಳಿಯಿರಿ." + }, + "endOfFlowMessage9": { + "message": "ಇನà³à²¨à²·à³à²Ÿà³ ತಿಳಿಯಿರಿ." + }, + "endOfFlowMessage10": { + "message": "ಎಲà³à²²à²¾ ಮà³à²—ಿದಿದೆ" + }, + "ensRegistrationError": { + "message": "ENS ಹೆಸರಿನ ನೋಂದಣಿಯಲà³à²²à²¿ ದೋಷ" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "ಪà³à²°à²¸à³à²¤à³à²¤ ನೆಟà³â€Œà²µà²°à³à²•à³â€Œà²¨à²²à³à²²à²¿ ENS ಹೆಸರೠಕಂಡà³à²¬à²‚ದಿಲà³à²². ಮà³à²–à³à²¯à²µà²¾à²—ಿರà³à²µ ಎಥೆರಿಯಮೠನೆಟà³â€Œà²µà²°à³à²•à³â€Œà²—ೆ ಬದಲಾಯಿಸಲೠಪà³à²°à²¯à²¤à³à²¨à²¿à²¸à²¿." + }, + "enterAnAlias": { + "message": "ಆಲಿಯಾಸೠಅನà³à²¨à³ ನಮೂದಿಸಿ" + }, + "enterPassword": { + "message": "ಪಾಸà³â€Œà²µà²°à³à²¡à³â€Œ ಅನà³à²¨à³ ನಮೂದಿಸಿ" + }, + "enterPasswordContinue": { + "message": "ಮà³à²‚ದà³à²µà²°à³†à²¯à²²à³ ಪಾಸà³â€Œà²µà²°à³à²¡à³ ನಮೂದಿಸಿ" + }, + "ethereumPublicAddress": { + "message": "ಎಥೆರಿಯಮೠಸಾರà³à²µà²œà²¨à²¿à²• ವಿಳಾಸ" + }, + "etherscanView": { + "message": "ಎಥರà³â€Œà²¸à³à²•à³à²¯à²¾à²¨à³â€Œà²¨à²²à³à²²à²¿ ಖಾತೆಯನà³à²¨à³ ವೀಕà³à²·à²¿à²¸à²¿" + }, + "estimatedProcessingTimes": { + "message": "ಅಂದಾಜೠಪà³à²°à²•à³à²°à²¿à²¯à³† ಸಮಯ" + }, + "expandView": { + "message": "ವಿಸà³à²¤à²°à²¿à²¸à²¿à²¦ ವೀಕà³à²·à²£à³†" + }, + "exportPrivateKey": { + "message": "ಖಾಸಗಿ ಕೀಲಿಯನà³à²¨à³ ರಫà³à²¤à³ ಮಾಡಿ" + }, + "failed": { + "message": "ವಿಫಲವಾಗಿದೆ" + }, + "fast": { + "message": "ವೇಗ" + }, + "faster": { + "message": "ವೇಗವಾಗಿ" + }, + "fiat": { + "message": "ಫಿಯೆಟà³", + "description": "Exchange type" + }, + "fileImportFail": { + "message": "ಫೈಲೠಆಮದೠಮಾಡà³à²µà²¿à²•ೆ ಕಾರà³à²¯à²¨à²¿à²°à³à²µà²¹à²¿à²¸à³à²¤à³à²¤à²¿à²²à³à²²à²µà³‡? ಇಲà³à²²à²¿ ಕà³à²²à²¿à²•ೠಮಾಡಿ!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "ಈ ಸಾಧನವನà³à²¨à³ ಮರೆತà³à²¬à²¿à²¡à²¿" + }, + "from": { + "message": "ನಿಂದ" + }, + "functionType": { + "message": "ಕಾರà³à²¯à²¦ ಪà³à²°à²•ಾರ" + }, + "gasLimit": { + "message": "ಗà³à²¯à²¾à²¸à³ ಮಿತಿ" + }, + "gasLimitInfoModalContent": { + "message": "ಗà³à²¯à²¾à²¸à³â€Œ ಮಿತಿ ಎಂದರೆ ನೀವೠಖರà³à²šà³ ಮಾಡಲೠಸಿದà³à²§à²µà²¿à²°à³à²µ ಗà³à²¯à²¾à²¸à³â€Œà²¨ ಗರಿಷà³à²  ಪà³à²°à²®à²¾à²£." + }, + "gasLimitTooLow": { + "message": "ಗà³à²¯à²¾à²¸à³ ಮಿತಿಯೠಕನಿಷà³à²Ÿ 21000 ಆಗಿರಬೇಕà³" + }, + "gasUsed": { + "message": "ಗà³à²¯à²¾à²¸à³ ಬಳಸಲಾಗಿದೆ" + }, + "gasPrice": { + "message": "ಗà³à²¯à²¾à²¸à³ ದರ (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "ಗà³à²¯à²¾à²¸à³ ದರವೠಅತà³à²¯à²‚ತ ಕಡಿಮೆಯಿದೆ" + }, + "gasPriceInfoModalContent": { + "message": "ಗà³à²¯à²¾à²¸à³ ದರವೠಪà³à²°à²¤à²¿ ಯೂನಿಟೠಗà³à²¯à²¾à²¸à³â€Œà²—ೆ ನೀವೠಪಾವತಿಸಲೠಸಿದà³à²§à²µà²¿à²°à³à²µ ಎಥರà³â€Œà²¨ ಪà³à²°à²®à²¾à²£à²µà²¨à³à²¨à³ ಸೂಚಿಸà³à²¤à³à²¤à²¦à³†." + }, + "gasPriceNoDenom": { + "message": "ಗà³à²¯à²¾à²¸à³ ದರ" + }, + "general": { + "message": "ಸಾಮಾನà³à²¯" + }, + "generalSettingsDescription": { + "message": "ಕರೆನà³à²¸à²¿ ಪರಿವರà³à²¤à²¨à³†, ಪà³à²°à²¾à²¥à²®à²¿à²• ಕರೆನà³à²¸à²¿, ಭಾಷೆ, ನಿರà³à²¬à²‚ಧಗಳ ಗà³à²°à³à²¤à²¿à²¸à³à²µà²¿à²•ೆ" + }, + "getEther": { + "message": "ಎಥರೠಪಡೆಯಿರಿ" + }, + "getEtherFromFaucet": { + "message": "$1 ಗಾಗಿ ಫಾಸೆಟà³â€Œà²¨à²¿à²‚ದ ಎಥರೠಅನà³à²¨à³ ಪಡೆಯಿರಿ", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "ಸಹಾಯವನà³à²¨à³ ಪಡೆಯಿರಿ." + }, + "getStarted": { + "message": "ಪà³à²°à²¾à²°à²‚ಭಗೊಂಡಿದೆ" + }, + "happyToSeeYou": { + "message": "ನಿಮà³à²®à²¨à³à²¨à³ ನೋಡಿ ನಮಗೆ ಸಂತೋಷವಾಗಿದೆ." + }, + "hardware": { + "message": "ಹಾರà³à²¡à³â€Œà²µà³‡à²°à³" + }, + "hardwareWalletConnected": { + "message": "ಹಾರà³à²¡à³â€Œà²µà³‡à²°à³ ವà³à²¯à²¾à²²à³†à²Ÿà³ ಅನà³à²¨à³ ಸಂಪರà³à²•ಪಡಿಸಲಾಗಿದೆ" + }, + "hardwareWallets": { + "message": "ಹಾರà³à²¡à³â€Œà²µà³‡à²°à³ ವà³à²¯à²¾à²²à³†à²Ÿà³â€Œ ಸಂಪರà³à²•ಿಸಿ" + }, + "hardwareWalletsMsg": { + "message": "MetaMask ನೊಂದಿಗೆ ಬಳಸಲೠನೀವೠಇಷà³à²Ÿà²ªà²¡à³à²µ ಹಾರà³à²¡â€Œà²µà³‡à²°à³ ವà³à²¯à²¾à²²à³†à²Ÿà³ ಅನà³à²¨à³ ಆಯà³à²•ೆಮಾಡಿ" + }, + "havingTroubleConnecting": { + "message": "ಸಂಪರà³à²•ಿಸà³à²µà²²à³à²²à²¿ ತೊಂದರೆ ಇದೆಯೇ?" + }, + "here": { + "message": "ಇಲà³à²²à²¿", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hexData": { + "message": "Hex ಡೇಟಾ" + }, + "hide": { + "message": "ಮರೆಮಾಡಿ" + }, + "hideTokenPrompt": { + "message": "ಟೋಕನೠಮರೆಮಾಡà³à²µà³à²¦à³‡?" + }, + "history": { + "message": "ಇತಿಹಾಸ" + }, + "import": { + "message": "ಆಮದà³", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "ಖಾತೆಯನà³à²¨à³ ಆಮದೠಮಾಡಿ" + }, + "importAccountMsg": { + "message": "ನಿಮà³à²® ಮೂಲ ರಚಿಸಿರà³à²µ MetaMask ಖಾತೆಯ ಸೀಡà³â€Œà²«à³à²°à³‡à²¸à³â€Œà²¨à³Šà²‚ದಿಗೆ ಆಮದೠಮಾಡಲಾದ ಖಾತೆಗಳನà³à²¨à³ ಸಂಯೋಜನೆ ಮಾಡಲಾಗಿಲà³à²². ಆಮದೠಮಾಡಲಾಗಿರà³à²µ ಖಾತೆಗಳ ಕà³à²°à²¿à²¤à³ ಇನà³à²¨à²·à³à²Ÿà³ ತಿಳಿಯಿರಿ" + }, + "importAccountSeedPhrase": { + "message": "ಸೀಡà³â€Œ ಫà³à²°à³‡à²¸à³â€Œà²¨à³Šà²‚ದಿಗೆ ಖಾತೆಯನà³à²¨à³ ಆಮದೠಮಾಡಿ" + }, + "importWallet": { + "message": "ವà³à²¯à²¾à²²à³†à²Ÿà³ ಅನà³à²¨à³ ಆಮದೠಮಾಡಿ" + }, + "importYourExisting": { + "message": "12 ಪದದ ಸೀಡೠಫà³à²°à³‡à²¸à³ ಅನà³à²¨à³ ಬಳಸಿಕೊಂಡೠನಿಮà³à²® ಅಸà³à²¤à²¿à²¤à³à²µà²¦à²²à³à²²à²¿à²°à³à²µ ವà³à²¯à²¾à²²à³†à²Ÿà³ ಅನà³à²¨à³ ಆಮದೠಮಾಡಿ" + }, + "imported": { + "message": "ಆಮದà³à²®à²¾à²¡à²²à²¾à²—ಿದೆ", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "ಸೀಡà³â€Œ ಫà³à²°à³‡à²¸à³â€Œ ಖಾತೆಯನà³à²¨à³ ಬಳಸಿಕೊಂಡೠಆಮದೠಮಾಡಿ" + }, + "infoHelp": { + "message": "ಮಾಹಿತಿ & ಸಹಾಯ" + }, + "initialTransactionConfirmed": { + "message": "ನಿಮà³à²® ಆರಂಭಿಕ ವಹಿವಾಟನà³à²¨à³ ನೆಟà³â€Œà²µà²°à³à²•ೠಮೂಲಕ ಖಚಿತಪಡಿಸಲಾಗಿದೆ. ಹಿಂತಿರà³à²—ಲೠಸರಿ ಕà³à²²à²¿à²•ೠಮಾಡಿ." + }, + "insufficientBalance": { + "message": "ಸಾಕಷà³à²Ÿà³ ಮೊಬಲಗೠಇಲà³à²²." + }, + "insufficientFunds": { + "message": "ಸಾಕಷà³à²Ÿà³ ಫಂಡà³â€Œà²—ಳಿಲà³à²²." + }, + "insufficientTokens": { + "message": "ಸಾಕಷà³à²Ÿà³ ಟೋಕನà³â€Œà²—ಳಿಲà³à²²." + }, + "invalidAddress": { + "message": "ಅಮಾನà³à²¯à²µà²¾à²¦ ವಿಳಾಸ" + }, + "invalidAddressRecipient": { + "message": "ಸà³à²µà³€à²•ೃತಿದಾರರ ವಿಳಾಸವೠಅಮಾನà³à²¯à²µà²¾à²—ಿದೆ" + }, + "knownAddressRecipient": { + "message": "ತಿಳಿದಿರà³à²µ ಒಪà³à²ªà²‚ದದ ವಿಳಾಸ." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "ETH ನೆಟà³â€Œà²µà²°à³à²•à³â€Œà²—ಳಿಲà³à²², ಸಣà³à²£à²•à³à²·à²°à²•à³à²•ೆ ಹೊಂದಿಸಲಾಗಿದೆ" + }, + "invalidInput": { + "message": "ಅಮಾನà³à²¯à²µà²¾à²¦ ಇನà³â€Œà²ªà³à²Ÿà³." + }, + "invalidRPC": { + "message": "ಅಮಾನà³à²¯à²µà²¾à²¦ RPC URL" + }, + "invalidBlockExplorerURL": { + "message": "ಅಮಾನà³à²¯à²µà²¾à²¦ Block Explorer URL" + }, + "invalidSeedPhrase": { + "message": "ಅಮಾನà³à²¯à²µà²¾à²¦ ಸೀಡೠಫà³à²°à³‡à²¸à³" + }, + "jsonFile": { + "message": "JSON ಫೈಲà³", + "description": "format for importing an account" + }, + "kovan": { + "message": "Kovan ಪರೀಕà³à²·à³† ನೆಟà³â€Œà²µà²°à³à²•à³" + }, + "max": { + "message": "ಗರಿಷà³à²Ÿ" + }, + "learnMore": { + "message": "ಇನà³à²¨à²·à³à²Ÿà³ ತಿಳಿಯಿರಿ" + }, + "ledgerAccountRestriction": { + "message": "ನೀವೠಹೊಸದನà³à²¨à³ ಸೇರಿಸà³à²µà³à²¦à²° ಮೊದಲೠನಿಮà³à²® ಹಿಂದಿನ ಖಾತೆಯನà³à²¨à³ ನೀವೠಬಳಸಬೇಕà³." + }, + "letsGoSetUp": { + "message": "ಹೌದà³, ಹೊಂದಿಸೋಣ!" + }, + "likeToAddTokens": { + "message": "ನೀವೠಈ ಟೋಕನà³â€Œà²—ಳನà³à²¨à³ ಸೇರಿಸಲೠಬಯಸà³à²¤à³à²¤à³€à²°à²¾?" + }, + "links": { + "message": "ಲಿಂಕà³â€Œà²—ಳà³" + }, + "liveGasPricePredictions": { + "message": "ಲೈವೠಗà³à²¯à²¾à²¸à³ ಬೆಲೆಯ ಭವಿಷà³à²¯à²—ಳà³" + }, + "loading": { + "message": "ಲೋಡೠಆಗà³à²¤à³à²¤à²¿à²¦à³†..." + }, + "loadingTokens": { + "message": "ಟೋಕನà³â€Œà²—ಳನà³à²¨à³ ಲೋಡೠಮಾಡಲಾಗà³à²¤à³à²¤à²¿à²¦à³†..." + }, + "loadMore": { + "message": "ಇನà³à²¨à²·à³à²Ÿà³ ಲೋಡೠಮಾಡಿ" + }, + "localhost": { + "message": "ಲೋಕಲà³â€Œà²¹à³‹à²¸à³à²Ÿà³ 8545" + }, + "lock": { + "message": "ಲಾಗೠಔಟà³" + }, + "mainnet": { + "message": "ಪà³à²°à²®à³à²– ಎಥೆರಿಯಮೠನೆಟà³â€Œà²µà²°à³à²•à³" + }, + "memorizePhrase": { + "message": "ಈ ಫà³à²°à³‡à²¸à³ ಅನà³à²¨à³ ನೆನಪಿಡಿ." + }, + "memo": { + "message": "ಮೆಮೊ" + }, + "message": { + "message": "ಸಂದೇಶ" + }, + "metamaskDescription": { + "message": "ನಿಮà³à²®à²¨à³à²¨à³ ಎಥೆರಿಯಮೠಮತà³à²¤à³ ವಿಕೇಂದà³à²°à³€à²•ೃತ ವೆಬà³â€Œà²—ೆ ಸಂಪರà³à²•ಿಸಲಾಗà³à²¤à³à²¤à²¿à²¦à³†." + }, + "metamaskVersion": { + "message": "MetaMask ಆವೃತà³à²¤à²¿" + }, + "mobileSyncText": { + "message": "ಇದೠನೀವೇ ಎಂಬà³à²¦à²¨à³à²¨à³ ಖಚಿತಪಡಿಸಲೠದಯವಿಟà³à²Ÿà³ ನಿಮà³à²® ಪಾಸà³â€Œà²µà²°à³à²¡à³ ಅನà³à²¨à³ ನಮೂದಿಸಿ!" + }, + "myAccounts": { + "message": "ನನà³à²¨ ಖಾತೆಗಳà³" + }, + "myWalletAccounts": { + "message": "ನನà³à²¨ ವà³à²¯à²¾à²²à³†à²Ÿà³ ಖಾತೆಗಳà³" + }, + "myWalletAccountsDescription": { + "message": "ನಿಮà³à²® MetaMask ರಚಿಸಿದ ಎಲà³à²²à²¾ ಖಾತೆಗಳನà³à²¨à³ ಸà³à²µà²¯à²‚ಚಾಲಿತವಾಗಿ ಈ ವಿಭಾಗಕà³à²•ೆ ಸೇರಿಸಲಾಗà³à²¤à³à²¤à²¦à³†." + }, + "mustSelectOne": { + "message": "ಕನಿಷà³à²Ÿ 1 ಟೋಕನೠಅನà³à²¨à³ ಆಯà³à²•ೆಮಾಡಬೇಕà³." + }, + "needEtherInWallet": { + "message": "MetaMask ಬಳಸಿಕೊಂಡೠವಿಕೇಂದà³à²°à³€à²•ೃತ ಖಾತೆಗಳೊಂದಿಗೆ ಸಂವಹನ ನಡೆಸಲà³, ನಿಮà³à²® ವà³à²¯à²¾à²²à³†à²Ÿà³â€Œà²¨à²²à³à²²à²¿ ನಿಮಗೆ ಎಥರೠಅಗತà³à²¯à²µà²¿à²¦à³†." + }, + "needImportFile": { + "message": "ಆಮದೠಮಾಡಲೠನೀವೠಫೈಲೠಅನà³à²¨à³ ಆಯà³à²•ೆಮಾಡಬೇಕà³.", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "ನಕಾರಾತà³à²®à²• ಪà³à²°à²®à²¾à²£à²¦ ಇಟಿಹೆಚೠಅನà³à²¨à³ ಕಳà³à²¹à²¿à²¸à²²à³ ಸಾಧà³à²¯à²µà²¿à²²à³à²²." + }, + "networkName": { + "message": "ನೆಟà³â€Œà²µà²°à³à²•ೠಹೆಸರà³" + }, + "networks": { + "message": "ನೆಟà³â€Œà²µà²°à³à²•à³â€Œà²—ಳà³" + }, + "networkSettingsDescription": { + "message": "ಕಸà³à²Ÿà²®à³ RPC ನೆಟà³â€Œà²µà²°à³à²•à³â€Œà²—ಳನà³à²¨à³ ಸೇರಿಸಿ ಮತà³à²¤à³ ಸಂಪಾದಿಸಿ" + }, + "nevermind": { + "message": "ಪರವಾಗಿಲà³à²²" + }, + "newAccount": { + "message": "ಹೊಸ ಖಾತೆ" + }, + "newAccountDetectedDialogMessage": { + "message": "ಹೊಸ ವಿಳಾಸ ಪತà³à²¤à³†à²¯à²¾à²—ಿದೆ! ನಿಮà³à²® ವಿಳಾಸ ಪà³à²¸à³à²¤à²•ಕà³à²•ೆ ಸೇರಿಸಲೠಇಲà³à²²à²¿ ಕà³à²²à²¿à²•ೠಮಾಡಿ." + }, + "newAccountNumberName": { + "message": "ಖಾತೆ $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "ಹೊಸ ಸಂಪರà³à²•" + }, + "newContract": { + "message": "ಹೊಸ ಒಪà³à²ªà²‚ದ" + }, + "newPassword": { + "message": "ಹೊಸ ಪಾಸà³â€Œà²µà²°à³à²¡à³ (ಕನಿಷà³à²Ÿ 8 ಅಕà³à²·à²°à²—ಳà³)" + }, + "newNetwork": { + "message": "ಹೊಸ ನೆಟà³â€Œà²µà²°à³à²•à³" + }, + "newToMetaMask": { + "message": "MetaMask ಗೆ ಹೊಸಬರೇ?" + }, + "noAlreadyHaveSeed": { + "message": "ಇಲà³à²², ನಾನೠಈಗಾಗಲೇ ಸೀಡೠಫà³à²°à³‡à²¸à³ ಅನà³à²¨à³ ಹೊಂದಿದà³à²¦à³‡à²¨à³†" + }, + "protectYourKeys": { + "message": "ನಿಮà³à²® ಕೀಗಳನà³à²¨à³ ರಕà³à²·à²¿à²¸à²¿!" + }, + "protectYourKeysMessage1": { + "message": "ನಿಮà³à²® ಸೀಡೠಫà³à²°à³‡à²¸à³â€Œà²¨à³Šà²‚ದಿಗೆ ಜಾಗರೂಕರಾಗಿರಿ — MetaMask ಅನà³à²¨à³ ಅನà³à²•ರಿಸಲೠಪà³à²°à²¯à²¤à³à²¨à²¿à²¸à³à²¤à³à²¤à²¿à²°à³à²µ ವೆಬà³â€Œà²¸à³ˆà²Ÿà³â€Œà²—ಳ ವರದಿಗಳಿವೆ. MetaMask ನಿಮà³à²® ಸೀಡೠಫà³à²°à³‡à²¸à³ ಅನà³à²¨à³ ಎಂದಿಗೂ ಕೇಳà³à²µà³à²¦à²¿à²²à³à²²!" + }, + "protectYourKeysMessage2": { + "message": "ನಿಮà³à²® ಫà³à²°à³‡à²¸à³ ಅನà³à²¨à³ ಸà³à²°à²•à³à²·à²¿à²¤à²µà²¾à²—ಿರಿಸಿ. à²à²¨à²¾à²¦à²°à³‚ ಅನà³à²®à²¾à²¨à²¾à²¸à³à²ªà²¦à²µà²¾à²—ಿರà³à²µà³à²¦à²¨à³à²¨à³ ಅಥವಾ ವೆಬà³â€Œà²¸à³ˆà²Ÿà³ ಕà³à²°à²¿à²¤à³ ನಿಮಗೆ ಅನಿಶà³à²šà²¿à²¤à²¤à³†à²¯à²¿à²¦à³à²¦à²°à³†, support@metamask.io ಗೆ ಇಮೇಲೠಮಾಡಿ" + }, + "rpcUrl": { + "message": "ಹೊಸ RPC URL" + }, + "optionalChainId": { + "message": "ಚೈನà³â€Œà²à²¡à²¿ (à²à²šà³à²›à²¿à²•)" + }, + "optionalSymbol": { + "message": "ಚಿಹà³à²¨à³† (à²à²šà³à²›à²¿à²•)" + }, + "newTotal": { + "message": "ಹೊಸ ಮೊತà³à²¤" + }, + "newTransactionFee": { + "message": "ಹೊಸ ವಹಿವಾಟೠಶà³à²²à³à²•" + }, + "next": { + "message": "ಮà³à²‚ದೆ" + }, + "noAddressForName": { + "message": "ಈ ಹೆಸರಿಗೆ ಯಾವà³à²¦à³‡ ವಿಳಾಸವನà³à²¨à³ ಹೊಂದಿಸಲಾಗಿಲà³à²²." + }, + "noConversionRateAvailable": { + "message": "ಯಾವà³à²¦à³‡ ಪರಿವರà³à²¤à²¨à³† ದರ ಲಭà³à²¯à²µà²¿à²²à³à²²" + }, + "noTransactions": { + "message": "ನೀವೠಯಾವà³à²¦à³‡ ವಹಿವಾಟà³à²—ಳನà³à²¨à³ ಹೊಂದಿಲà³à²²" + }, + "notEnoughGas": { + "message": "ಸಾಕಷà³à²Ÿà³ ಗà³à²¯à²¾à²¸à³ ಇಲà³à²²" + }, + "noWebcamFoundTitle": { + "message": "ವೆಬà³â€Œà²•à³à²¯à²¾à²®à³ ಕಂಡà³à²¬à²‚ದಿಲà³à²²" + }, + "noWebcamFound": { + "message": "ನಿಮà³à²® ಕಂಪà³à²¯à³‚ಟರà³â€Œà²¨ ವೆಬà³â€Œà²•à³à²¯à²¾à²®à³ ಕಂಡà³à²¬à²‚ದಿಲà³à²². ದಯವಿಟà³à²Ÿà³ ಮತà³à²¤à³† ಪà³à²°à²¯à²¤à³à²¨à²¿à²¸à²¿." + }, + "ofTextNofM": { + "message": "ರಲà³à²²à²¿" + }, + "orderOneHere": { + "message": "ಟà³à²°à³†à²œà²°à³ ಅಥವಾ ಲೆಡà³à²œà²°à³ ಅನà³à²¨à³ ಆರà³à²¡à²°à³ ಮಾಡಿ ಮತà³à²¤à³ ನಿಮà³à²® ನಿಧಿಗಳನà³à²¨à³ ಕೋಲà³à²¡à³ ಸà³à²Ÿà³‹à²°à³‡à²œà³â€Œà²¨à²²à³à²²à²¿à²°à²¿à²¸à²¿" + }, + "origin": { + "message": "ಮೂಲ" + }, + "parameters": { + "message": "ಪà³à²¯à²¾à²°à²¾à²®à³€à²Ÿà²°à³â€Œà²—ಳà³" + }, + "participateInMetaMetrics": { + "message": "MetaMetrics ನಲà³à²²à²¿ ಭಾಗವಹಿಸಿ" + }, + "participateInMetaMetricsDescription": { + "message": "MetaMask ಅನà³à²¨à³ ಉತà³à²¤à²®à²—ೊಳಿಸಲೠನಮಗೆ ಸಹಾಯ ಮಾಡಲೠMetaMetrics ನಲà³à²²à²¿ ಭಾಗವಹಿಸಿ" + }, + "password": { + "message": "ಪಾಸà³â€Œà²µà²°à³à²¡à³" + }, + "passwordsDontMatch": { + "message": "ಪಾಸà³â€Œà²µà²°à³à²¡à³â€Œà²—ಳೠಹೊಂದಾಣಿಕೆಯಾಗà³à²¤à³à²¤à²¿à²²à³à²²" + }, + "passwordNotLongEnough": { + "message": "ಪಾಸà³â€Œà²µà²°à³à²¡à³ ಸಾಕಷà³à²Ÿà³ ದೀರà³à²˜à²µà²¾à²—ಿಲà³à²²" + }, + "pastePrivateKey": { + "message": "ನಿಮà³à²® ಖಾಸಗಿ ಪà³à²°à²®à³à²– ಸà³à²Ÿà³à²°à²¿à²‚ಗೠಅನà³à²¨à³ ಇಲà³à²²à²¿ ನಕಲಿಸಿ:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "ಬಾಕಿಯಿರà³à²µà³à²¦à³" + }, + "personalAddressDetected": { + "message": "ವೈಯಕà³à²¤à²¿à²• ವಿಳಾಸ ಪತà³à²¤à³†à²¯à²¾à²—ಿದೆ. ಟೋಕನೠಒಪà³à²ªà²‚ದದ ವಿಳಾಸವನà³à²¨à³ ನಮೂದಿಸಿ." + }, + "prev": { + "message": "ಹಿಂದಿನ" + }, + "primaryCurrencySetting": { + "message": "ಪà³à²°à²¾à²¥à²®à²¿à²• ಕರೆನà³à²¸à²¿" + }, + "primaryCurrencySettingDescription": { + "message": "ಸರಪಳಿಯ ಸà³à²¥à²³à³€à²¯ ಕರೆನà³à²¸à²¿à²¯à²²à³à²²à²¿ ಮೌಲà³à²¯à²—ಳನà³à²¨à³ ಪà³à²°à²¦à²°à³à²¶à²¿à²¸à²²à³ ಆದà³à²¯à²¤à³† ನೀಡಲೠಸà³à²¥à²³à³€à²¯à²µà²¨à³à²¨à³ ಆಯà³à²•ೆಮಾಡಿ (ಉದಾ. ETH). ನಿಮà³à²® ಆಯà³à²•ೆಮಾಡಿದ ಫಿಯೆಟೠಕರೆನà³à²¸à²¿à²¯à²²à³à²²à²¿ ಮೌಲà³à²¯à²—ಳನà³à²¨à³ ಪà³à²°à²¦à²°à³à²¶à²¿à²¸à²²à³ ಆದà³à²¯à²¤à³† ನೀಡಲೠಫಿಯೆಟೠಆಯà³à²•ೆಮಾಡಿ." + }, + "privacyMsg": { + "message": "ಗೌಪà³à²¯à²¤à³† ನೀತಿ" + }, + "privateKey": { + "message": "ಖಾಸಗಿ ಕೀ", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "ಎಚà³à²šà²°à²¿à²•ೆ: ಈ ಕೀಯನà³à²¨à³ ಎಂದಿಗೂ ಬಹಿರಂಗಪಡಿಸಬೇಡಿ. ನಿಮà³à²® ಖಾಸಗಿ ಕೀಗಳನà³à²¨à³ ಹೊಂದಿರà³à²µ ಯಾರಾದರೂ ನಿಮà³à²® ಖಾತೆಯಲà³à²²à²¿à²°à³à²µ ಯಾವà³à²¦à³‡ ಸà³à²µà²¤à³à²¤à³à²—ಳನà³à²¨à³ ಕದಿಯಬಹà³à²¦à³." + }, + "privateNetwork": { + "message": "ಖಾಸಗಿ ನೆಟà³â€Œà²µà²°à³à²•à³" + }, + "queue": { + "message": "ಸರತಿ" + }, + "readdToken": { + "message": "ನಿಮà³à²® ಖಾತೆಗಳ ಆಯà³à²•ೆಗಳ ಮೆನà³à²µà²¿à²¨à²²à³à²²à²¿ \"ಟೋಕನೠಸೇರಿಸà³\" ಗೆ ಹೋಗà³à²µ ಮೂಲಕ ನೀವೠಈ ಟೋಕನೠಅನà³à²¨à³ ಭವಿಷà³à²¯à²¦à²²à³à²²à²¿ ಮರಳಿ ಸೇರಿಸಬಹà³à²¦à³." + }, + "recents": { + "message": "ಇತà³à²¤à³€à²šà²¿à²¨à²µà³à²—ಳà³" + }, + "recipientAddress": { + "message": "ಸà³à²µà³€à²•ರಿಸà³à²µà²µà²° ವಿಳಾಸ" + }, + "recipientAddressPlaceholder": { + "message": "ಸಾರà³à²µà²œà²¨à²¿à²• ವಿಳಾಸ (0x) ಅಥವಾ ENS ಹà³à²¡à³à²•ಿ" + }, + "rejectAll": { + "message": "ಎಲà³à²²à²µà²¨à³à²¨à³‚ ತಿರಸà³à²•ರಿಸಿ" + }, + "rejectTxsN": { + "message": "$1 ವಹಿವಾಟà³à²—ಳನà³à²¨à³ ತಿರಸà³à²•ರಿಸಿ" + }, + "rejectTxsDescription": { + "message": "ನೀವೠ$1 ವಹಿವಾಟà³à²—ಳನà³à²¨à³ ಬà³à²¯à²¾à²šà³ ತಿರಸà³à²•ರಿಸಲಿರà³à²µà²¿à²°à²¿." + }, + "rejected": { + "message": "ತಿರಸà³à²•ರಿಸಲಾಗಿದೆ" + }, + "reset": { + "message": "ಮರà³à²¹à³Šà²‚ದಿಸà³" + }, + "resetAccount": { + "message": "ಖಾತೆಯನà³à²¨à³ ಮರà³à²¹à³Šà²‚ದಿಸಿ" + }, + "resetAccountDescription": { + "message": "ನಿಮà³à²® ಖಾತೆಯ ಮರà³à²¹à³Šà²‚ದಿಸà³à²µà²¿à²•ೆಯೠನಿಮà³à²® ವಹಿವಾಟೠಇತಿಹಾಸವನà³à²¨à³ ತೆರವà³à²—ೊಳಿಸà³à²¤à³à²¤à²¦à³†." + }, + "deleteNetwork": { + "message": "ನೆಟà³â€Œà²µà²°à³à²•ೠಅಳಿಸà³à²µà³à²¦à³‡?" + }, + "deleteNetworkDescription": { + "message": "ನೀವೠಈ ನೆಟà³â€Œà²µà²°à³à²•ೠಅನà³à²¨à³ ಖಚಿತವಾಗಿ ಅಳಿಸಲೠಬಯಸà³à²¤à³à²¤à³€à²°à²¾?" + }, + "remindMeLater": { + "message": "ನನಗೆ ನಂತರ ನೆನಪಿಸà³" + }, + "restoreFromSeed": { + "message": "ಖಾತೆಯನà³à²¨à³ ಮರà³à²¸à³à²¥à²¾à²ªà²¿à²¸à³à²µà³à²¦à³‡?" + }, + "restoreAccountWithSeed": { + "message": "ಸೀಡೠಫà³à²°à³‡à²¸à³â€Œà²¨à³Šà²‚ದಿಗೆ ನಿಮà³à²® ಖಾತೆಯನà³à²¨à³ ಮರà³à²¸à³à²¥à²¾à²ªà²¿à²¸à²¿" + }, + "requestsAwaitingAcknowledgement": { + "message": "ಅಂಗೀಕರಿಸಲೠನಿರೀಕà³à²·à²¿à²¸à³à²¤à³à²¤à²¿à²°à³à²µ ವಿನಂತಿಗಳà³" + }, + "required": { + "message": "ಅಗತà³à²¯à²µà²¿à²¦à³†" + }, + "restore": { + "message": "ಮರà³à²¸à³à²¥à²¾à²ªà²¨à³†" + }, + "revealSeedWords": { + "message": "ಸೀಡೠವರà³à²¡à³à²¸à³ ಬಹಿರಂಗಪಡಿಸಿ" + }, + "revealSeedWordsTitle": { + "message": "ಸೀಡೠಫà³à²°à³‡à²¸à³" + }, + "revealSeedWordsDescription": { + "message": "ನೀವೠಬà³à²°à³Œà²¸à²°à³â€Œà²—ಳನà³à²¨à³ ಬದಲಾಯಿಸಿದರೆ ಅಥವಾ ಕಂಪà³à²¯à³‚ಟರà³â€Œà²—ಳನà³à²¨à³ ಸರಿಸಿದರೆ, ನಿಮà³à²® ಖಾತೆಗಳನà³à²¨à³ ಪà³à²°à²µà³‡à²¶à²¿à²¸à²²à³ ನಿಮಗೆ ಈ ಸೀಡೠಫà³à²°à³‡à²¸à³â€Œà²—ಳ ಅಗತà³à²¯à²µà²¿à²°à³à²¤à³à²¤à²¦à³†. ಅವà³à²—ಳನà³à²¨à³ ಎಲà³à²²à²¿à²¯à²¾à²¦à²°à³‚ ಸà³à²°à²•à³à²·à²¿à²¤à²µà²¾à²—ಿ ಮತà³à²¤à³ ರಹಸà³à²¯à²µà²¾à²—ಿ ಉಳಿಸಿ." + }, + "revealSeedWordsWarningTitle": { + "message": "ಈ ಫà³à²°à³‡à²¸à³ ಅನà³à²¨à³ ಯಾರೊಂದಿಗೂ ಹಂಚಿಕೊಳà³à²³à²¬à³‡à²¡à²¿!" + }, + "revealSeedWordsWarning": { + "message": "ಈ ಪದಗಳನà³à²¨à³ ನಿಮà³à²® ಎಲà³à²²à²¾ ಖಾತೆಗಳನà³à²¨à³ ಕದಿಯಲೠಬಳಸಬಹà³à²¦à³." + }, + "remove": { + "message": "ತೆಗೆದà³à²¹à²¾à²•à³" + }, + "removeAccount": { + "message": "ಖಾತೆಯನà³à²¨à³ ತೆಗೆದà³à²¹à²¾à²•ಿ" + }, + "removeAccountDescription": { + "message": "ಈ ಖಾತೆಯನà³à²¨à³ ನಿಮà³à²® ವà³à²¯à²¾à²²à³†à²Ÿà³â€Œà²¨à²¿à²‚ದ ತೆಗೆದà³à²¹à²¾à²•ಲಾಗà³à²¤à³à²¤à²¦à³†. ದಯವಿಟà³à²Ÿà³ ಮà³à²‚ದà³à²µà²°à²¿à²¯à³à²µ ಮೊದಲೠಈ ಆಮದೠಖಾತೆಗಾಗಿ ನೀವೠಸೀಡೠಫà³à²°à³‡à²¸à³ ಅಥವಾ ಖಾಸಗಿ ಕೀಯನà³à²¨à³ ಹೊಂದಿರà³à²µà²¿à²°à²¾ ಎಂಬà³à²¦à²¨à³à²¨à³ ಖಚಿತಪಡಿಸಿಕೊಳà³à²³à²¿. ಖಾತೆಯ ಡà³à²°à²¾à²ªà³-ಡೌನà³â€Œà²¨à²¿à²‚ದ ನೀವೠಮತà³à²¤à³† ಖಾತೆಗಳನà³à²¨à³ ಆಮದೠಮಾಡಿಕೊಳà³à²³à²¬à²¹à³à²¦à³ ಅಥವಾ ರಚಿಸಬಹà³à²¦à³." + }, + "readyToConnect": { + "message": "ಸಂಪರà³à²•ಿಸಲೠಸಿದà³à²§à²µà³‡?" + }, + "rinkeby": { + "message": "Rinkeby ಪರೀಕà³à²·à³† ನೆಟà³â€Œà²µà²°à³à²•à³" + }, + "ropsten": { + "message": "Ropsten ಪರೀಕà³à²·à³† ನೆಟà³â€Œà²µà²°à³à²•à³" + }, + "goerli": { + "message": "Goerli ಪರೀಕà³à²·à³† ನೆಟà³â€Œà²µà²°à³à²•à³" + }, + "save": { + "message": "ಉಳಿಸà³" + }, + "slow": { + "message": "ನಿಧಾನ" + }, + "slower": { + "message": "ನಿಧಾನ" + }, + "saveAsCsvFile": { + "message": "CSV ಫೈಲೠರೂಪದಲà³à²²à²¿ ಉಳಿಸಿ" + }, + "scanInstructions": { + "message": "ನಿಮà³à²® ಕà³à²¯à²¾à²®à²°à²¾à²¦ ಮà³à²‚ದೆ QR ಕೋಡೠಇರಿಸಿ" + }, + "scanQrCode": { + "message": "QR ಕೋಡೠಸà³à²•à³à²¯à²¾à²¨à³ ಮಾಡಿ" + }, + "search": { + "message": "ಹà³à²¡à³à²•ಾಟ" + }, + "searchResults": { + "message": "ಹà³à²¡à³à²•ಾಟ ಫಲಿತಾಂಶಗಳà³" + }, + "secretBackupPhrase": { + "message": "ರಹಸà³à²¯ ಬà³à²¯à²¾à²•ಪೠಫà³à²°à³‡à²¸à³" + }, + "secretBackupPhraseDescription": { + "message": "ನಿಮà³à²® ಖಾತೆಯನà³à²¨à³ ಬà³à²¯à²¾à²•ೠಅಪೠಮತà³à²¤à³ ಮರà³à²¸à³à²¥à²¾à²ªà²¿à²¸à³à²µà³à²¦à²¨à³à²¨à³ ನಿಮà³à²® ರಹಸà³à²¯ ಬà³à²¯à²¾à²•ಪೠಫà³à²°à³‡à²¸à³ ಸà³à²²à²­à²µà²¾à²—ಿಸà³à²¤à³à²¤à²¦à³†." + }, + "secretBackupPhraseWarning": { + "message": "ಎಚà³à²šà²°à²¿à²•ೆ: ನಿಮà³à²® ಬà³à²¯à²¾à²•ಪೠಫà³à²°à³‡à²¸à³ ಅನà³à²¨à³ ಎಂದಿಗೂ ಬಹಿರಗಪಡಿಸಬೇಡಿ. ಈ ಫà³à²°à³‡à²¸à³ ಅನà³à²¨à³ ಹೊಂದಿರà³à²µ ಯಾರಾದರೂ ನಿಮà³à²® ಎಥರೠಅನà³à²¨à³ ಶಾಶà³à²µà²¤à²µà²¾à²—ಿ ತೆಗೆದà³à²•ೊಳà³à²³à²¬à²¹à³à²¦à³." + }, + "secretPhrase": { + "message": "ನಿಮà³à²® ವಾಲà³à²Ÿà³ ಅನà³à²¨à³ ಮರà³à²¸à³à²¥à²¾à²ªà²¿à²¸à²²à³ ನಿಮà³à²® ರಹಸà³à²¯ ಹನà³à²¨à³†à²°à²¡à³ ಪದದ ಫà³à²°à³‡à²¸à³ ಅನà³à²¨à³ ಇಲà³à²²à²¿ ನಮೂದಿಸಿ." + }, + "securityAndPrivacy": { + "message": "ಭದà³à²°à²¤à³† ಮತà³à²¤à³ ಗೌಪà³à²¯à²¤à³†" + }, + "securitySettingsDescription": { + "message": "ಗೌಪà³à²¯à²¤à³† ಸೆಟà³à²Ÿà²¿à²‚ಗà³â€Œà²—ಳೠಮತà³à²¤à³ ವà³à²¯à²¾à²²à³†à²Ÿà³ ಸೀಡೠಫà³à²°à³‡à²¸à³" + }, + "seedPhrasePlaceholder": { + "message": "ಒಂದೠಸà³à²ªà³‡à²¸à³ ಮೂಲಕ ಪà³à²°à²¤à²¿ ಪದವನà³à²¨à³ ಬೇರà³à²ªà²¡à²¿à²¸à²¿" + }, + "seedPhraseReq": { + "message": "ಸೀಡೠಫà³à²°à³‡à²¸à³â€Œà²—ಳೠ12 ಪದಗಳಷà³à²Ÿà³ ದೀರà³à²˜à²µà²¾à²—ಿವೆ" + }, + "selectCurrency": { + "message": "ಕರೆನà³à²¸à²¿à²¯à²¨à³à²¨à³ ಆಯà³à²•ೆಮಾಡಿ" + }, + "selectEachPhrase": { + "message": "ಅದೠಸರಿಯಾಗಿದೆಯೆ ಎಂಬà³à²¦à²¨à³à²¨à³ ಖಚಿತಪಡಿಸಿಕೊಳà³à²³à²²à³ ದಯವಿಟà³à²Ÿà³ ಪà³à²°à²¤à²¿ ಫà³à²°à³‡à²¸à³ ಅನà³à²¨à³ ಆಯà³à²•ೆಮಾಡಿ." + }, + "selectLocale": { + "message": "ಪà³à²°à²¦à³‡à²¶à²µà²¨à³à²¨à³ ಆಯà³à²•ೆಮಾಡಿ" + }, + "selectType": { + "message": "ಪà³à²°à²•ಾರವನà³à²¨à³ ಆಯà³à²•ೆಮಾಡಿ" + }, + "send": { + "message": "ಕಳà³à²¹à²¿à²¸à³" + }, + "sendAmount": { + "message": "ಮೊತà³à²¤à²µà²¨à³à²¨à³ ಕಳà³à²¹à²¿à²¸à²¿" + }, + "sendETH": { + "message": "ETH ಕಳà³à²¹à²¿à²¸à²¿" + }, + "sendTokens": { + "message": "ಟೋಕನà³â€Œà²—ಳನà³à²¨à³ ಕಳà³à²¹à²¿à²¸à²¿" + }, + "sentEther": { + "message": "ಕಳà³à²¹à²¿à²¸à²²à²¾à²¦ ಎಥರà³" + }, + "sentTokens": { + "message": "ಕಳà³à²¹à²¿à²¸à²²à²¾à²¦ ಟೋಕನà³â€Œà²—ಳà³" + }, + "separateEachWord": { + "message": "ಒಂದೠಸà³à²ªà³‡à²¸à³ ಮೂಲಕ ಪà³à²°à²¤à²¿ ಪದವನà³à²¨à³ ಬೇರà³à²ªà²¡à²¿à²¸à²¿" + }, + "searchTokens": { + "message": "ಟೋಕನà³â€Œà²—ಳನà³à²¨à³ ಹà³à²¡à³à²•ಿ" + }, + "selectAnAccount": { + "message": "ಖಾತೆಯನà³à²¨à³ ಆಯà³à²•ೆಮಾಡಿ" + }, + "selectAnAccountHelp": { + "message": "MetaMask ನಲà³à²²à²¿ ವೀಕà³à²·à²¿à²¸à²²à³ ಖಾತೆಯನà³à²¨à³ ಆಯà³à²•ೆಮಾಡಿ" + }, + "selectAHigherGasFee": { + "message": "ನಿಮà³à²® ವಹಿವಾಟಿನ ಪà³à²°à²•à³à²°à²¿à²¯à³†à²¯à²¨à³à²¨à³ ಸà³à²§à²¾à²°à²¿à²¸à²²à³ ಅಧಿಕ ಗà³à²¯à²¾à²¸à³ ಶà³à²²à³à²•ವನà³à²¨à³ ಆಯà³à²•ೆಮಾಡಿ.*" + }, + "selectHdPath": { + "message": "HD ಪಾತೠಆಯà³à²•ೆಮಾಡಿ" + }, + "selectPathHelp": { + "message": "ನಿಮà³à²® ಅಸà³à²¤à²¿à²¤à³à²µà²¦à²²à³à²²à²¿à²°à³à²µ ಲೆಡà³à²œà²°à³ ಖಾತೆಗಳನà³à²¨à³ ನೀವೠಕೆಳಗೆ ನೋಡದಿದà³à²¦à²°à³†, ಪಾತà³â€Œà²—ಳನà³à²¨à³ \"ಲೆಗಸಿ (MEW / MyCrypto)\" ಗೆ ಬದಲಾಯಿಸಲೠಪà³à²°à²¯à²¤à³à²¨à²¿à²¸à²¿" + }, + "settings": { + "message": "ಸೆಟà³à²Ÿà²¿à²‚ಗà³â€Œà²—ಳà³" + }, + "showAdvancedGasInline": { + "message": "ಸà³à²§à²¾à²°à²¿à²¤ ಗà³à²¯à²¾à²¸à³ ನಿಯಂತà³à²°à²£à²—ಳà³" + }, + "showAdvancedGasInlineDescription": { + "message": "ಕಳà³à²¹à²¿à²¸à³à²µ ಮತà³à²¤à³ ಖಚಿತಪಡಿಸà³à²µ ಪರದೆಯ ಮೇಲೆ ನೇರವಾಗಿ ಗà³à²¯à²¾à²¸à³ ಬೆಲೆ ಮತà³à²¤à³ ಮಿತಿಯ ನಿಯಂತà³à²°à²£à²—ಳನà³à²¨à³ ತೋರಿಸಲೠಇದನà³à²¨à³ ಆಯà³à²•ೆಮಾಡಿ." + }, + "showFiatConversionInTestnets": { + "message": "Testnets ನಲà³à²²à²¿ ಪರಿವರà³à²¤à²¨à³†à²¯à²¨à³à²¨à³ ತೋರಿಸಿ" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Testnets ನಲà³à²²à²¿ ಫಿಯೆಟೠಪರಿವರà³à²¤à²¨à³†à²¯à²¨à³à²¨à³ ತೋರಿಸಲೠಇದನà³à²¨à³ ಆಯà³à²•ೆಮಾಡಿ" + }, + "showPrivateKeys": { + "message": "ಖಾಸಗಿ ಕೀಗಳನà³à²¨à³ ತೋರಿಸಿ" + }, + "showHexData": { + "message": "ಹೆಕà³à²¸à³ ಡೇಟಾವನà³à²¨à³ ತೋರಿಸಿ" + }, + "showHexDataDescription": { + "message": "ಕಳà³à²¹à²¿à²¸à³à²µ ಪರದೆಯಲà³à²²à²¿ ಹೆಕà³à²¸à³ ಡೇಟಾ ಕà³à²·à³‡à²¤à³à²°à²µà²¨à³à²¨à³ ತೋರಿಸಲೠಇದನà³à²¨à³ ಆಯà³à²•ೆಮಾಡಿ" + }, + "sign": { + "message": "ಸಹಿ" + }, + "signatureRequest": { + "message": "ಸಹಿಯ ವಿನಂತಿ" + }, + "signed": { + "message": "ಸಹಿ ಮಾಡಲಾಗಿದೆ" + }, + "signNotice": { + "message": "ಈ ಸಂದೇಶಕà³à²•ೆ ಸಹಿ ಮಾಡà³à²µà²¿à²•ೆಯೠ\nಅಪಾಯಕಾರಿ ಅಡà³à²¡à²ªà²°à²¿à²£à²¾à²®à²—ಳನà³à²¨à³ ಹೊಂದಿರಬಹà³à²¦à³. ನಿಮà³à²® ಸಂಪೂರà³à²£ ಖಾತೆಯೊಂದಿಗೆ ನೀವೠಸಂಪೂರà³à²£à²µà²¾à²—ಿ ನಂಬà³à²µ ಸೈಟà³â€Œà²—ಳಿಂದ\nಮಾತà³à²° ಸಂದೇಶಗಳಿಗೆ ಸಹಿ ಮಾಡಿ.\nಭವಿಷà³à²¯à²¦ ಆವೃತà³à²¤à²¿à²¯à²²à³à²²à²¿ ಈ ಅಪಾಯಕಾರಿ ವಿಧಾನವನà³à²¨à³ ತೆಗೆದà³à²¹à²¾à²•ಲಾಗà³à²¤à³à²¤à²¦à³†." + }, + "sigRequest": { + "message": "ಸಹಿಯ ವಿನಂತಿ" + }, + "somethingWentWrong": { + "message": "ಓಹà³â€Œâ€! à²à²¨à³‹ ತಪà³à²ªà²¾à²—ಿದೆ." + }, + "speedUp": { + "message": "ವೇಗ ಹೆಚà³à²šà²¿à²¸à³" + }, + "speedUpCancellation": { + "message": "ಈ ರದà³à²¦à²¤à²¿à²¯ ವೇಗವನà³à²¨à³ ಹೆಚà³à²šà²¿à²¸à²¿" + }, + "speedUpTransaction": { + "message": "ಈ ವಹಿವಾಟಿನ ವೇಗವನà³à²¨à³ ಹೆಚà³à²šà²¿à²¸à²¿" + }, + "switchNetworks": { + "message": "ನೆಟà³â€Œà²µà²°à³à²•à³â€Œà²—ಳನà³à²¨à³ ಬದಲಾಯಿಸಿ" + }, + "stateLogs": { + "message": "ರಾಜà³à²¯à²¦ ಲಾಗà³â€Œà²—ಳà³" + }, + "stateLogsDescription": { + "message": "ರಾಜà³à²¯à²¦ ಲಾಗà³â€Œà²—ಳೠನಿಮà³à²® ಸಾರà³à²µà²œà²¨à²¿à²• ಖಾತೆಯ ವಿಳಾಸಗಳೠಮತà³à²¤à³ ಕಳà³à²¹à²¿à²¸à²²à²¾à²¦ ವಹಿವಾಟà³à²—ಳನà³à²¨à³ ಹೊಂದಿರà³à²¤à³à²¤à²µà³†." + }, + "stateLogError": { + "message": "ರಾಜà³à²¯à²¦ ಲಾಗà³â€Œà²—ಳನà³à²¨à³ ಹಿಂಪಡೆಯà³à²µà²²à³à²²à²¿ ದೋಷ." + }, + "step1HardwareWallet": { + "message": "1. ಹಾರà³à²¡à³â€Œà²µà³†à²°à³ ವà³à²¯à²¾à²²à³†à²Ÿà³ ಸಂಪರà³à²•ಪಡಿಸಿ" + }, + "step1HardwareWalletMsg": { + "message": "ನಿಮà³à²® ಹಾರà³à²¡à³â€Œà²µà³‡à²°à³ ವà³à²¯à²¾à²²à³†à²Ÿà³ ಅನà³à²¨à³ ನೇರವಾಗಿ ನಿಮà³à²® ಕಂಪà³à²¯à³‚ಟರà³â€Œà²—ೆ ಸಂಪರà³à²•ಿಸಿ." + }, + "step2HardwareWallet": { + "message": "2. ಖಾತೆಯನà³à²¨à³ ಆಯà³à²•ೆಮಾಡಿ" + }, + "step2HardwareWalletMsg": { + "message": "ನೀವೠವೀಕà³à²·à²¿à²¸à²²à³ ಬಯಸà³à²µ ಖಾತೆಯನà³à²¨à³ ಆಯà³à²•ೆಮಾಡಿ. ನೀವೠಒಮà³à²®à³†à²—ೆ ಒಂದನà³à²¨à³ ಮಾತà³à²° ಆಯà³à²•ೆಮಾಡಬಹà³à²¦à³." + }, + "step3HardwareWallet": { + "message": "3. dApps ಮತà³à²¤à³ ಹೆಚà³à²šà²¿à²¨à²¦à²¨à³à²¨à³ ಬಳಸಲೠಪà³à²°à²¾à²°à²‚ಭಿಸಿ!" + }, + "step3HardwareWalletMsg": { + "message": "ಯಾವà³à²¦à³‡ ಎಥೆರಿಯಮೠಖಾತೆಯೊಂದಿಗೆ ನಿಮà³à²® ಹಾರà³à²¡à³â€Œà²µà³‡à²°à³ ಖಾತೆಯನà³à²¨à³ ಬಳಸಿ. dApps ಗೆ ಲಾಗಿನೠಮಾಡಿ, Eth ಕಳà³à²¹à²¿à²¸à²¿, ERC20 ಟೋಕನà³â€Œà²—ಳನà³à²¨à³ ಮತà³à²¤à³ ಕà³à²°à²¿à²ªà³à²Ÿà³‹à²•ಿಟà³à²Ÿà³€à²¸à³â€Œà²¨à²‚ತಹ ಫಂಗಿಬಲೠಟೋಕನà³â€Œà²—ಳನà³à²¨à³ ಖರೀದಿಸಿ ಮತà³à²¤à³ ಸಂಗà³à²°à²¹à²¿à²¸à²¿." + }, + "storePhrase": { + "message": "ಈ ಫà³à²°à³‡à²¸à³ ಅನà³à²¨à³ ಪಾಸà³â€Œà²µà²°à³à²¡à³ ನಿರà³à²µà²¾à²¹à²•ದಲà³à²²à²¿ 1Password ರೂಪದಲà³à²²à²¿ ಸಂಗà³à²°à²¹à²¿à²¸à²¿." + }, + "submitted": { + "message": "ಸಲà³à²²à²¿à²¸à²²à²¾à²—ಿದೆ" + }, + "supportCenter": { + "message": "ನಮà³à²® ಬೆಂಬಲ ಕೇಂದà³à²°à²•à³à²•ೆ ಭೇಟಿ ಮಾಡಿ" + }, + "symbol": { + "message": "ಚಿಹà³à²¨à³†" + }, + "symbolBetweenZeroTwelve": { + "message": "ಚಿಹà³à²¨à³†à²¯à³ 0 ಮತà³à²¤à³ 12 ಅಕà³à²·à²°à²—ಳ ನಡà³à²µà³† ಇರಬೇಕà³." + }, + "syncWithMobile": { + "message": "ಮೊಬೈಲà³â€Œà²¨à³Šà²‚ದಿಗೆ ಸಿಂಕೠಮಾಡಿ" + }, + "syncWithMobileTitle": { + "message": "ಮೊಬೈಲà³â€Œà²¨à³Šà²‚ದಿಗೆ ಸಿಂಕೠಮಾಡಿ" + }, + "syncWithMobileDesc": { + "message": "ನಿಮà³à²® ಮೊಬೈಲೠಸಾಧನದೊಂದಿಗೆ ನಿಮà³à²® ಖಾತೆಗಳೠಮತà³à²¤à³ ಮಾಹಿತಿಯನà³à²¨à³ ನೀವೠಸಿಂಕೠಮಾಡಬಹà³à²¦à²¾à²—ಿದೆ. MetaMask ಮೊಬೈಲೠಅಪà³à²²à²¿à²•ೇಶನೠತೆರೆಯಿರಿ, \"ಸೆಟà³à²Ÿà²¿à²‚ಗà³â€Œà²—ಳಿಗೆ\" ಹೋಗಿ ಮತà³à²¤à³ \"ಬà³à²°à³Œà²¸à²°à³ ವಿಸà³à²¤à²°à²£à³†à²¯à²¿à²‚ದ ಸಿಂಕೠಮಾಡಿ\" ಟà³à²¯à²¾à²ªà³ ಮಾಡಿ" + }, + "syncWithMobileDescNewUsers": { + "message": "ನೀವೠಮೊದಲ ಬಾರಿಗೆ MetaMask ಮೊಬೈಲೠಅಪà³à²²à²¿à²•ೇಶನೠಅನà³à²¨à³ ತೆರೆದರೆ, ನಿಮà³à²® ಫೋನà³â€Œà²¨à²²à³à²²à²¿à²°à³à²µ ಹಂತಗಳನà³à²¨à³ ಅನà³à²¸à²°à²¿à²¸à²¿." + }, + "syncWithMobileScanThisCode": { + "message": "ನಿಮà³à²® MetaMask ಮೊಬೈಲೠಅಪà³à²²à²¿à²•ೇಶನೠಮೂಲಕ ಈ ಕೋಡೠಅನà³à²¨à³ ಸà³à²•à³à²¯à²¾à²¨à³ ಮಾಡಿ" + }, + "syncWithMobileBeCareful": { + "message": "ನೀವೠಈ ಕೋಡೠಅನà³à²¨à³ ಸà³à²•à³à²¯à²¾à²¨à³ ಮಾಡà³à²¤à³à²¤à²¿à²°à³à²µà²¾à²— ಯಾರೂ ನಿಮà³à²® ಪರದೆಯ ಕಡೆಗೆ ನೋಡà³à²¤à³à²¤à²¿à²²à³à²²à²µà³‡ ಎಂಬà³à²¦à²¨à³à²¨à³ ಖಚಿತಪಡಿಸಿಕೊಳà³à²³à²¿." + }, + "syncWithMobileComplete": { + "message": "ನಿಮà³à²® ಡೇಟಾ ಯಶಸà³à²µà²¿à²¯à²¾à²—ಿ ಸಿಂಕೠಆಗಿದೆ. MetaMask ಮೊಬೈಲೠಅಪà³à²²à²¿à²•ೇಶನೠಅನà³à²¨à³ ಆನಂದಿಸಿ!" + }, + "terms": { + "message": "ಬಳಕೆಯ ನಿಯಮಗಳà³" + }, + "testFaucet": { + "message": "ಫಾಸೆಟೠಪರೀಕà³à²·à²¿à²¸à²¿" + }, + "thisWillCreate": { + "message": "ಇದೠಹೊಸ ವà³à²¯à²¾à²²à³†à²Ÿà³ ಮತà³à²¤à³ ಸೀಡೠಫà³à²°à³‡à²¸à³ ಅನà³à²¨à³ ರಚಿಸà³à²¤à³à²¤à²¦à³†" + }, + "tips": { + "message": "ಸಲಹೆಗಳà³" + }, + "to": { + "message": "ವರೆಗೆ" + }, + "token": { + "message": "ಟೋಕನà³" + }, + "tokenAlreadyAdded": { + "message": "ಟೋಕನೠಅನà³à²¨à³ ಈಗಾಗಲೇ ಸೇರಿಸಲಾಗಿದೆ." + }, + "tokenContractAddress": { + "message": "ಟೋಕನೠಒಪà³à²ªà²‚ದದ ವಿಳಾಸ" + }, + "tokenSymbol": { + "message": "ಟೋಕನೠಚಿಹà³à²¨à³†" + }, + "total": { + "message": "ಒಟà³à²Ÿà³" + }, + "transaction": { + "message": "ವಹಿವಾಟà³" + }, + "transactionConfirmed": { + "message": "$2 ಗೆ ವಹಿವಾಟನà³à²¨à³ ಖಚಿತಪಡಿಸಲಾಗಿದೆ." + }, + "transactionCreated": { + "message": "ವಹಿವಾಟನà³à²¨à³ $2 ನಲà³à²²à²¿ $1 ಮೌಲà³à²¯à²¦à³Šà²‚ದಿಗೆ ರಚಿಸಲಾಗಿದೆ." + }, + "transactionDropped": { + "message": "$2 ನಲà³à²²à²¿ ವಹಿವಾಟೠಕà³à²¸à²¿à²¦à²¿à²¦à³†." + }, + "transactionSubmitted": { + "message": "ವಹಿವಾಟನà³à²¨à³ $2 ನಲà³à²²à²¿ $1 ಗà³à²¯à²¾à²¸à³ ಶà³à²²à³à²•ದೊಂದಿಗೆ ರಚಿಸಲಾಗಿದೆ." + }, + "transactionResubmitted": { + "message": "$2 ನಲà³à²²à²¿ $1 ಗೆ à²à²°à²¿à²¦ ಗà³à²¯à²¾à²¸à³ ಶà³à²²à³à²•ದೊಂದಿಗೆ ವಹಿವಾಟನà³à²¨à³ ಮರà³à²¸à²²à³à²²à²¿à²¸à²²à²¾à²—ಿದೆ" + }, + "transactionUpdated": { + "message": "$2 ನಲà³à²²à²¿ ವಹಿವಾಟನà³à²¨à³ ನವೀಕರಿಸಲಾಗಿದೆ." + }, + "transactionErrored": { + "message": "ವಹಿವಾಟಿನಲà³à²²à²¿ ದೋಷ ಕಂಡà³à²¬à²‚ದಿದೆ." + }, + "transactionCancelAttempted": { + "message": "$2 ನಲà³à²²à²¿ $1 ಗà³à²¯à²¾à²¸à³ ಶà³à²²à³à²•ದೊಂದಿಗೆ ವಹಿವಾಟಿನ ರದà³à²¦à²¤à²¿à²¯à²¨à³à²¨à³ ಪà³à²°à²¯à²¤à³à²¨à²¿à²¸à²²à²¾à²—ಿದೆ" + }, + "transactionCancelSuccess": { + "message": "ವಹಿವಾಟನà³à²¨à³ $2 ನಲà³à²²à²¿ ಯಶಸà³à²µà²¿à²¯à²¾à²—ಿ ರದà³à²¦à³à²®à²¾à²¡à²²à²¾à²—ಿದೆ" + }, + "transactionError": { + "message": "ವಹಿವಾಟಿನ ದೋಷ. ಒಪà³à²ªà²‚ದದ ಕೋಡà³â€Œà²¨à²²à³à²²à²¿ ವಿನಾಯಿತಿಯನà³à²¨à³ ನೀಡಲಾಗಿದೆ." + }, + "transactionErrorNoContract": { + "message": "ಒಪà³à²ªà²‚ದವಲà³à²²à²¦ ವಿಳಾಸದಲà³à²²à²¿ ಕಾರà³à²¯à²•à³à²•ೆ ಕರೆ ಮಾಡಲೠಪà³à²°à²¯à²¤à³à²¨à²¿à²¸à²²à²¾à²—à³à²¤à³à²¤à²¿à²¦à³†." + }, + "transactionFee": { + "message": "ವಹಿವಾಟೠಶà³à²²à³à²•" + }, + "transactionTime": { + "message": "ವಹಿವಾಟೠಸಮಯ" + }, + "transfer": { + "message": "ವರà³à²—ಾಯಿಸಿ" + }, + "transferBetweenAccounts": { + "message": "ನನà³à²¨ ಖಾತೆಗಳ ನಡà³à²µà³† ವರà³à²—ಾಯಿಸಿ" + }, + "transferFrom": { + "message": "ಇದರಿಂದ ವರà³à²—ಾಯಿಸಿ" + }, + "troubleTokenBalances": { + "message": "ನಿಮà³à²® ಟೋಕನೠಬà³à²¯à²¾à²²à³†à²¨à³à²¸à³â€Œà²—ಳನà³à²¨à³ ಲೋಡೠಮಾಡà³à²µà²²à³à²²à²¿ ನಮಗೆ ಸಮಸà³à²¯à³†à²¯à²¾à²—ಿದೆ. ನೀವೠಅವà³à²—ಳನà³à²¨à³ ನೋಡಬಹà³à²¦à³", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "ಪà³à²¨à²ƒ ಪà³à²°à²¯à²¤à³à²¨à²¿à²¸à²¿" + }, + "typePassword": { + "message": "ನಿಮà³à²® MetaMask ಪಾಸà³â€Œà²µà²°à³à²¡à³ ಅನà³à²¨à³ ಟೈಪೠಮಾಡಿ" + }, + "unapproved": { + "message": "ಅನà³à²®à³‹à²¦à²¿à²¸à²¦à²¿à²°à³à²µà³à²¦à³" + }, + "units": { + "message": "ಘಟಕಗಳà³" + }, + "unknown": { + "message": "ಅಪರಿಚಿತ" + }, + "unknownNetwork": { + "message": "ಅಪರಿಚಿತ ಖಾಸಗಿ ನೆಟà³â€Œà²µà²°à³à²•à³" + }, + "unknownQrCode": { + "message": "ದೋಷ: ನಮಗೆ ಆ QR ಕೋಡೠಅನà³à²¨à³ ಗà³à²°à³à²¤à²¿à²¸à²²à³ ಸಾಧà³à²¯à²µà²¾à²—ಿಲà³à²²" + }, + "unknownCameraErrorTitle": { + "message": "ಓಹà³! à²à²¨à³‹ ತಪà³à²ªà²¾à²—ಿದೆ...." + }, + "unknownCameraError": { + "message": "ನಿಮà³à²® ಕà³à²¯à²¾à²®à²°à²¾à²µà²¨à³à²¨à³ ಪà³à²°à²µà³‡à²¶à²¿à²¸à²²à³ ಪà³à²°à²¯à²¤à³à²¨à²¿à²¸à³à²µà²¾à²— ದೋಷ ಸಂಭವಿಸಿದೆ. ದಯವಿಟà³à²Ÿà³ ಮತà³à²¤à³† ಪà³à²°à²¯à²¤à³à²¨à²¿à²¸à²¿..." + }, + "unlock": { + "message": "ಅನà³â€Œà²²à²¾à²•à³" + }, + "unlockMessage": { + "message": "ವಿಕೇಂದà³à²°à³€à²•ೃತ ವೆಬೠನಿರೀಕà³à²·à²¿à²¸à³à²¤à³à²¤à²¿à²¦à³†" + }, + "updatedWithDate": { + "message": "$1 ನವೀಕರಿಸಲಾಗಿದೆ" + }, + "urlErrorMsg": { + "message": "URI ಗಳಿಗೆ ಸೂಕà³à²¤à²µà²¾à²¦ HTTP/HTTPS ಪೂರà³à²µà²ªà³à²°à²¤à³à²¯à²¯à²¦ ಅಗತà³à²¯à²µà²¿à²¦à³†." + }, + "usedByClients": { + "message": "ವಿಭಿನà³à²¨ ಕà³à²²à³ˆà²‚ಟà³â€Œà²—ಳ ಮೂಲಕ ಬಳಸಲಾಗà³à²¤à³à²¤à²¦à³†" + }, + "userName": { + "message": "ಬಳಕೆದಾರಹೆಸರà³" + }, + "viewAccount": { + "message": "ಖಾತೆಯನà³à²¨à³ ವೀಕà³à²·à²¿à²¸à²¿" + }, + "viewinExplorer": { + "message": "ಎಕà³à²¸à³â€Œà²ªà³à²²à³‹à²°à²°à³â€Œà²¨à²²à³à²²à²¿ ವೀಕà³à²·à²¿à²¸à²¿" + }, + "viewContact": { + "message": "ಸಂಪರà³à²•ವನà³à²¨à³ ವೀಕà³à²·à²¿à²¸à²¿" + }, + "viewOnCustomBlockExplorer": { + "message": "$1 ನಲà³à²²à²¿ ವೀಕà³à²·à²¿à²¸à²¿" + }, + "viewOnEtherscan": { + "message": "ಎಥೆರà³â€Œà²¸à³à²•à³à²¯à²¾à²¨à³â€Œà²¨à²²à³à²²à²¿ ವೀಕà³à²·à²¿à²¸à²¿" + }, + "visitWebSite": { + "message": "ನಮà³à²® ವೆಬೠಸೈಟೠಅನà³à²¨à³ ಭೇಟಿ ಮಾಡಿ" + }, + "walletSeed": { + "message": "ವà³à²¯à²¾à²²à³†à²Ÿà³ ಸೀಡà³" + }, + "welcomeBack": { + "message": "ಮರಳಿ ಸà³à²µà²¾à²—ತ!" + }, + "welcome": { + "message": "MetaMask ಗೆ ಸà³à²µà²¾à²—ತ" + }, + "writePhrase": { + "message": "ಕಾಗದದ ತà³à²‚ಡಿನ ಮೇಲೆ ಈ ಫà³à²°à³‡à²¸à³ ಅನà³à²¨à³ ಬರೆಯಿರಿ ಮತà³à²¤à³ ಸà³à²°à²•à³à²·à²¿à²¤ ಸà³à²¥à²³à²¦à²²à³à²²à²¿à²°à²¿à²¸à²¿. ನೀವೠಇನà³à²¨à³‚ ಹೆಚà³à²šà²¿à²¨ ಸà³à²°à²•à³à²·à²¤à³†à²¯à²¨à³à²¨à³ ಬಯಸಿದರೆ, ಹಲವೠಕಾಗದದ ತà³à²‚ಡà³à²—ಳ ಮೇಲೆ ಬರೆಯಿರಿ ಮತà³à²¤à³ ಪà³à²°à²¤à²¿à²¯à³Šà²‚ದನà³à²¨à³ 2 - 3 ವಿವಿಧ ಸà³à²¥à²³à²—ಳಲà³à²²à²¿ ಇರಿಸಿ." + }, + "yesLetsTry": { + "message": "ಹೌದà³, ಪà³à²°à²¯à²¤à³à²¨à²¿à²¸à³‹à²£" + }, + "youNeedToAllowCameraAccess": { + "message": "ಈ ವೈಶಿಷà³à²Ÿà³à²¯à²µà²¨à³à²¨à³ ಬಳಸಲೠನೀವೠಕà³à²¯à²¾à²®à²°à²¾ ಪà³à²°à²µà³‡à²¶à²µà²¨à³à²¨à³ ಅನà³à²®à²¤à²¿à²¸à²¬à³‡à²•ಾಗà³à²¤à³à²¤à²¦à³†." + }, + "yourSigRequested": { + "message": "ನಿಮà³à²® ಸಹಿಯನà³à²¨à³ ವಿನಂತಿಸಲಾಗಿದೆ" + }, + "youSign": { + "message": "ನೀವೠಸಹಿ ಮಾಡà³à²¤à³à²¤à²¿à²°à³à²µà²¿à²°à²¿" + }, + "yourPrivateSeedPhrase": { + "message": "ನಿಮà³à²® ಖಾಸಗಿ ಸೀಡೠಫà³à²°à³‡à²¸à³" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "ವೇಗ ಹೆಚà³à²šà²¿à²¸à³à²µà³à²¦à²•à³à²•ೆ ಶೂನà³à²¯ ಗà³à²¯à²¾à²¸à³ ಬೆಲೆ" + } +} diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json index 541d9dd5c322..8b73492f8516 100644 --- a/app/_locales/ko/messages.json +++ b/app/_locales/ko/messages.json @@ -1,51 +1,18 @@ { - "privacyMode": { - "message": "ê°œì¸ ì •ë³´ 보호 모드" + "chartOnlyAvailableEth": { + "message": "ì´ë”리움 네트워í¬ì—서만 사용 가능한 차트." }, - "privacyModeDescription": { - "message": "웹 사ì´íŠ¸ëŠ” 계정 정보를 ë³¼ 수있는 액세스 ê¶Œí•œì„ ìš”ì²­í•´ì•¼í•©ë‹ˆë‹¤." - }, - "exposeAccounts": { - "message": "계정 노출" - }, - "exposeDescription": { - "message": "ê³„ì •ì„ í˜„ìž¬ 웹 사ì´íŠ¸ì— ë…¸ì¶œí•˜ì‹­ì‹œì˜¤. 기존 dappsì— ìœ ìš©í•©ë‹ˆë‹¤." - }, - "confirmExpose": { - "message": "ê³„ì •ì„ í˜„ìž¬ 웹 사ì´íŠ¸ì— ê³µê°œ 하시겠습니까?" - }, - "confirmClear": { - "message": "ìŠ¹ì¸ ëœ ì›¹ 사ì´íŠ¸ë¥¼ ì‚­ì œ 하시겠습니까?" - }, - "clearApprovalDataSuccess": { - "message": "ìŠ¹ì¸ ëœ ì›¹ 사ì´íЏ ë°ì´í„°ê°€ 성공ì ìœ¼ë¡œ ì‚­ì œë˜ì—ˆìŠµë‹ˆë‹¤." - }, - "approvalData": { - "message": "ìŠ¹ì¸ ë°ì´í„°" - }, - "approvalDataDescription": { - "message": "ìŠ¹ì¸ ëœ ì›¹ 사ì´íЏ ë°ì´í„°ë¥¼ 삭제하여 모든 사ì´íЏì—서 승ì¸ì„ 다시 요청해야합니다." - }, - "clearApprovalData": { - "message": "ìŠ¹ì¸ ë°ì´í„° ì‚­ì œ" + "contractInteraction": { + "message": "계약 ìƒí˜¸ 작용" }, "reject": { "message": "ê±°ë¶€" }, - "providerAPIRequest": { - "message": "Web3 API 요청" - }, - "reviewProviderRequest": { - "message": "ì´ Ethereum API ìš”ì²­ì„ ê²€í† í•˜ì„¸ìš”." - }, - "providerRequest": { - "message": "$1ì´ ë‹¹ì‹ ì˜ ê³„ì •ì— ì—°ê²°í•˜ê¸¸ ì›í•©ë‹ˆë‹¤." - }, - "providerRequestInfo": { - "message": "아래 ë‚˜ì—´ëœ ë„ë©”ì¸ì€ Web3 APIì— ëŒ€í•œ 액세스를 요청하여 Ethereum ë¸”ë¡ ì²´ì¸ê³¼ ìƒí˜¸ 작용할 수 있습니다. Ethereum 액세스를 승ì¸í•˜ê¸° ì „ì— í•­ìƒ ì˜¬ë°”ë¥¸ 사ì´íŠ¸ì— ìžˆëŠ”ì§€ 다시 확ì¸í•˜ì‹­ì‹œì˜¤." + "about": { + "message": "ì •ë³´" }, - "accept": { - "message": "수ë½" + "aboutSettingsDescription": { + "message": "버전, ì§€ì› ì„¼í„°, 그리고 ì—°ë½ì²˜ ì •ë³´" }, "acceleratingATransaction": { "message": "* ë” ë†’ì€ ê°€ìŠ¤ ìš”ê¸ˆì„ ì‚¬ìš©í•˜ì—¬ íŠ¸ëžœìž­ì…˜ì„ ê°€ì†í™”하면 네트워í¬ì— ì˜í•´ ë” ë¹¨ë¦¬ ì²˜ë¦¬ë  ê°€ëŠ¥ì„±ì´ ì¦ê°€í•˜ì§€ë§Œ í•­ìƒ ë¹ ë¥¸ 처리가 보장ë˜ëŠ” ê²ƒì€ ì•„ë‹™ë‹ˆë‹¤." @@ -71,14 +38,29 @@ "activityLog": { "message": "í™œë™ ë¡œê·¸" }, - "address": { - "message": "주소" + "addNetwork": { + "message": "ë„¤íŠ¸ì›Œí¬ ì¶”ê°€" + }, + "addRecipient": { + "message": "ìˆ˜ì‹ ìž ì¶”ê°€" + }, + "advanced": { + "message": "고급" + }, + "advancedSettingsDescription": { + "message": "ê°œë°œìž ê¸°ëŠ¥ 사용, ìƒíƒœ 로그 다운로드, 계정 재설정, 테스트넷 ë° ì‚¬ìš©ìž ì •ì˜ RPC 설정" }, "advancedOptions": { "message": "고급 옵션" }, - "addCustomToken": { - "message": "ì‚¬ìš©ìž ì •ì˜ í† í° ì¶”ê°€" + "addToAddressBook": { + "message": "주소ë¡ì— 추가" + }, + "addToAddressBookModalPlaceholder": { + "message": "예. ì¡´ D." + }, + "addAlias": { + "message": "가명 추가" }, "addToken": { "message": "í† í° ì¶”ê°€" @@ -92,28 +74,16 @@ "addAcquiredTokens": { "message": "메타마스í¬ë¥¼ 통해 íšë“한 í† í° ì¶”ê°€" }, - "advanced": { - "message": "고급" - }, - "allDone": { - "message": "ëª¨ë‘ ì™„ë£Œ" - }, "amount": { "message": "수량" }, - "amountPlusGas": { - "message": "수량 + 가스" - }, - "amountPlusTxFee": { - "message": "Amount + TX Fee" - }, "appDescription": { "message": "ì´ë”리움 브ë¼ìš°ì € 확장 프로그램", - "description": "애플리케ì´ì…˜ 설명" + "description": "The description of the application" }, "appName": { "message": "메타마스í¬", - "description": "애플리케ì´ì…˜ ì´ë¦„" + "description": "The name of the application" }, "approve": { "message": "수ë½" @@ -121,6 +91,9 @@ "approved": { "message": "수ë½" }, + "asset": { + "message": "ìžì‚°" + }, "attemptingConnect": { "message": "블ë¡ì²´ì¸ì— ì ‘ì†ì„ 시ë„하는 중입니다." }, @@ -133,8 +106,11 @@ "attributions": { "message": "ì†ì„±" }, - "available": { - "message": "사용 가능" + "autoLockTimeLimit": { + "message": "ìžë™ 로그아웃 타ì´ë¨¸ (ë¶„)" + }, + "autoLockTimeLimitDescription": { + "message": "MetaMaskê°€ ìžë™ìœ¼ë¡œ 로그아웃ë˜ê¸° ì „ 유휴 ì‹œê°„ì„ ë¶„ 단위로 설정하세요" }, "average": { "message": "í‰ê· " @@ -142,45 +118,45 @@ "back": { "message": "ëŒì•„가기" }, - "balance": { - "message": "잔액" + "backToAll": { + "message": "전체로 ëŒì•„가기" }, - "balances": { - "message": "í† í° ìž”ì•¡" + "backupApprovalNotice": { + "message": "비밀 복구 코드를 백업하여 월렛과 ìžê¸ˆì„ 안전하게 유지하세요." }, - "balanceIsInsufficientGas": { - "message": "현재 가스 ì´í•©ì— 대해 ìž”ì•¡ì´ ë¶€ì¡±í•©ë‹ˆë‹¤" + "backupApprovalInfo": { + "message": "ì´ ë¹„ë°€ 코드는 기기를 분실해서 ì›”ë ›ì„ ë³µêµ¬í•´ì•¼ 하거나, 비밀번호를 잊어버리거나, MetaMask를 재설치해야 하거나, 다른 기기ì—서 ì›”ë ›ì— ì ‘ì†í•˜ê³  ì‹¶ì€ ê²½ìš°ì— í•„ìš”í•©ë‹ˆë‹¤." + }, + "backupNow": { + "message": "지금 백업하기" + }, + "balance": { + "message": "잔액" }, - "basic": { - "message": "Basic" + "balanceOutdated": { + "message": "ìž”ì•¡ì´ ì˜¤ëž˜ëœ ì •ë³´ì¼ ìˆ˜ 있습니다" }, - "beta": { - "message": "BETA" + "blockExplorerUrl": { + "message": "ìµìŠ¤í”Œë¡œëŸ¬ 차단" }, - "betweenMinAndMax": { - "message": "$1 ì´ìƒ $2 ì´í•˜ì—¬ì•¼ 합니다.", - "description": "10진수 입력으로 hexê°’ ìž…ë ¥ì„ ë„와ì¤ë‹ˆë‹¤" + "blockExplorerView": { + "message": "$1ì— ê³„ì •ì„ ë³´ì„¸ìš”", + "description": "$1 replaced by URL for custom block explorer" }, "blockiesIdenticon": { "message": "Blockies ì•„ì´ë´í‹°ì½˜ 사용" }, - "borrowDharma": { - "message": "Dharmaì—서 대출받기 (Beta)" - }, "browserNotSupported": { "message": "브ë¼ìš°ì €ë¥¼ ì§€ì›í•˜ì§€ 않습니다..." }, "builtInCalifornia": { "message": "메타마스í¬ëŠ” 캘리í¬ë‹ˆì•„ì—서 ë””ìžì¸ë˜ê³  만들어졌습니다." }, - "buy": { - "message": "구매" + "buyWithWyre": { + "message": "Wyre로 ETH 구매" }, - "buyCoinbase": { - "message": "ì½”ì¸ë² ì´ìФì—서 구매하기" - }, - "buyCoinbaseExplainer": { - "message": "ì½”ì¸ë² ì´ìŠ¤ëŠ” 비트코ì¸, ì´ë”리움, ë¼ì´íŠ¸ì½”ì¸ì„ 거래할 수 있는 유명한 거래소입니다." + "buyWithWyreDescription": { + "message": "Wyre는 ì‹ ìš© 카드를 사용하여 ETHì„ ë°”ë¡œ MetaMask ê³„ì •ì— ìž…ê¸ˆí•  수 있게 í•´ì¤ë‹ˆë‹¤." }, "buyCoinSwitch": { "message": "ì½”ì¸ ìŠ¤ìœ„ì¹˜ 구입" @@ -191,9 +167,18 @@ "bytes": { "message": "ë°”ì´íЏ" }, + "off": { + "message": "ë„기" + }, "ok": { "message": "확ì¸" }, + "on": { + "message": "사용" + }, + "optionalBlockExplorerUrl": { + "message": "ìµìŠ¤í”Œë¡œëŸ¬ URL 차단 (ì„ íƒ ì‚¬í•­)" + }, "cancel": { "message": "취소" }, @@ -206,17 +191,8 @@ "cancelled": { "message": "취소ë¨" }, - "cancelN": { - "message": "모든 $1 트랜잭션 취소" - }, - "classicInterface": { - "message": "예전 ì¸í„°íŽ˜ì´ìФ" - }, - "clickCopy": { - "message": "í´ë¦­í•˜ì—¬ 복사" - }, - "clickToAdd": { - "message": "ê³„ì •ì— í† í°ì„ 추가하기 위해 $1를 í´ë¦­í•˜ì„¸ìš”." + "chainId": { + "message": "ì²´ì¸ ID" }, "clickToRevealSeed": { "message": "비밀 단어를 보기 위해 여기를 í´ë¦­í•˜ì„¸ìš”." @@ -230,24 +206,15 @@ "confirm": { "message": "승ì¸" }, - "confirmationTime": { - "message": "처리 시간 (ì´ˆ)" - }, "confirmed": { "message": "승ì¸ë¨" }, - "confirmContract": { - "message": "컨트랙트 승ì¸" - }, "confirmPassword": { "message": "비밀번호 확ì¸" }, "confirmSecretBackupPhrase": { "message": "비밀 백업 구문 확ì¸" }, - "confirmTransaction": { - "message": "트랜잭션 승ì¸" - }, "congratulations": { "message": "축하합니다." }, @@ -257,12 +224,6 @@ "connect": { "message": "ì—°ê²°" }, - "connectRequest": { - "message": "ì—°ê²° 요청" - }, - "connecting": { - "message": "ì—°ê²° 중..." - }, "connectingTo": { "message": "$1ì— ì—°ê²°" }, @@ -278,20 +239,14 @@ "connectingToRinkeby": { "message": "Rinkeby 테스트넷 ì ‘ì† ì¤‘" }, - "connectingToUnknown": { - "message": "알 수 없는 ë„¤íŠ¸ì›Œí¬ ì ‘ì† ì¤‘" + "connectingToLocalhost": { + "message": "로컬호스트 8545ì— ì—°ê²° 중" }, - "connectToLedger": { - "message": "Ledger ì—°ê²°" + "connectingToGoerli": { + "message": "Goerli 테스트 네트워í¬ì— 연결하는 중" }, - "connectToTrezor": { - "message": "Trezor ì—°ê²°" - }, - "continue": { - "message": "계ì†" - }, - "continueToCoinbase": { - "message": "ì½”ì¸ë² ì´ìŠ¤ë¡œ 계ì†í•˜ê¸°" + "continueToWyre": { + "message": "Wyre로 ê³„ì† ì§„í–‰" }, "continueToCoinSwitch": { "message": "ì½”ì¸ ìŠ¤ìœ„ì¹˜ 계ì†í•˜ê¸°" @@ -299,38 +254,20 @@ "contractDeployment": { "message": "컨트랙트 ë°°í¬" }, - "conversionProgress": { - "message": "변환 ì§„í–‰ 중" - }, - "copiedButton": { - "message": "복사ë¨" - }, - "copiedClipboard": { - "message": "í´ë¦½ë³´ë“œì— 복사ë˜ì—ˆìŠµë‹ˆë‹¤" - }, "copiedExclamation": { "message": "복사ë¨!" }, - "copiedSafe": { - "message": "안전한 ê³³ì— ë³µì‚¬í•˜ì˜€ìŠµë‹ˆë‹¤" - }, - "copy": { - "message": "복사" - }, "copyAddress": { "message": "í´ë¦½ë³´ë“œë¡œ 주소 복사" }, - "copyToClipboard": { - "message": "í´ë¦½ë³´ë“œë¡œ 복사" - }, "copyTransactionId": { "message": "트랜잭션 ì•„ì´ë”” 복사" }, "copiedTransactionId": { "message": "트랜잭션 ì•„ì´ë”” 복사ë¨" }, - "copyButton": { - "message": " 복사 " + "copyToClipboard": { + "message": "í´ë¦½ë³´ë“œë¡œ 복사" }, "copyPrivateKey": { "message": "비밀 키입니다 (í´ë¦­í•˜ì—¬ 복사)" @@ -344,31 +281,15 @@ "createAWallet": { "message": "지갑 ìƒì„±í•˜ê¸°" }, - "createDen": { - "message": "ìƒì„±" - }, "createPassword": { "message": "비밀번호 ìƒì„±" }, - "crypto": { - "message": "암호화í", - "description": "거래 유형 (암호화í)" - }, - "currentConversion": { - "message": "현재 통화" - }, "currencyConversion": { "message": "통화 변환" }, "currentLanguage": { "message": "현재 언어" }, - "currentNetwork": { - "message": "현재 네트워í¬" - }, - "currentRpc": { - "message": "현재 RPC" - }, "customGas": { "message": "가스 설정" }, @@ -378,9 +299,6 @@ "customToken": { "message": "ì‚¬ìš©ìž ì •ì˜ í† í°" }, - "customize": { - "message": "맞춤화하기" - }, "customRPC": { "message": "ì‚¬ìš©ìž ì •ì˜ RPC" }, @@ -393,39 +311,21 @@ "defaultNetwork": { "message": "ì´ë”리움 íŠ¸ëžœìž­ì…˜ì˜ ê¸°ë³¸ 네트워í¬ëŠ” ë©”ì¸ë„·ìž…니다." }, - "denExplainer": { - "message": "DENì€ ë¹„ë°€ë²ˆí˜¸ë¡œ 암호화 ëœ ë©”íƒ€ë§ˆìŠ¤í¬ì˜ 저장소입니다." + "delete": { + "message": "ì‚­ì œ" + }, + "deleteAccount": { + "message": "계정 ì‚­ì œ" }, "deposit": { "message": "입금" }, - "depositBTC": { - "message": "ë‹¤ìŒ ì£¼ì†Œë¡œ BTC를 입금해주세요." - }, - "depositEth": { - "message": "ì´ë” 입금하기" - }, "depositEther": { "message": "ì´ë”리움 입금하기" }, - "depositFiat": { - "message": "현금으로 입금하기" - }, - "depositFromAccount": { - "message": "다른 주소ì—서 입금하기" - }, - "depositShapeShift": { - "message": "ShapeShift를 통해 입금하기" - }, - "depositShapeShiftExplainer": { - "message": "다른 암호화í를 가지고 있으면, ê³„ì •ì„ ìƒì„±í•  í•„ìš” ì—†ì´ ë©”íƒ€ë§ˆìŠ¤í¬ ì§€ê°‘ì— ì´ë”ë¦¬ì›€ì„ ë°”ë¡œ 거래하거나 입금할 수 있습니다." - }, "details": { "message": "세부사항" }, - "directDeposit": { - "message": "즉시 입금" - }, "directDepositEther": { "message": "ì´ë” 즉시 입금" }, @@ -453,17 +353,8 @@ "edit": { "message": "수정" }, - "editAccountName": { - "message": "계정 ì´ë¦„ 수정" - }, - "editingTransaction": { - "message": "íŠ¸ëžœìž­ì…˜ì„ ë³€ê²½í•©ë‹ˆë‹¤" - }, - "emailUs": { - "message": "ì €ìžì—게 ë©”ì¼ ë³´ë‚´ê¸°!" - }, - "encryptNewDen": { - "message": "새로운 DENì„ ì•”í˜¸í™”" + "editContact": { + "message": "ì—°ë½ì²˜ 수정" }, "endOfFlowMessage1": { "message": "ì¸ì¦ì„ 통과했습니다 - 시드 êµ¬ë¬¸ì„ ì•ˆì „í•˜ê²Œ 보관하세요. ê·¸ê²ƒì€ ë‹¹ì‹ ì˜ ì˜ë¬´ìž…니다." @@ -489,20 +380,29 @@ "endOfFlowMessage8": { "message": "메타마스í¬ëŠ” ë‹¹ì‹ ì˜ ì‹œë“œ êµ¬ë¬¸ì„ ë³µì›í•´ì¤„ 수 없습니다. ë” ì•Œì•„ë³´ê¸°." }, - "ensNameNotFound": { - "message": "ENS ì´ë¦„ì„ ì°¾ì„ ìˆ˜ 없습니다" + "endOfFlowMessage9": { + "message": "ë” ì•Œì•„ë³´ê¸°." + }, + "endOfFlowMessage10": { + "message": "ëª¨ë‘ ì™„ë£Œ" + }, + "ensRegistrationError": { + "message": "ENS ì´ë¦„ ë“±ë¡ ì˜¤ë¥˜" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "현재 네트워í¬ì—서 ENS ì´ë¦„ì„ ì°¾ì„ ìˆ˜ 없습니다. 주요 ì´ë”리움 네트워í¬ë¡œ 전환해 보세요." + }, + "enterAnAlias": { + "message": "ê°€ëª…ì„ ìž…ë ¥í•˜ì„¸ìš”" }, "enterPassword": { "message": "비밀번호를 입력해주세요" }, - "enterPasswordConfirm": { - "message": "비밀번호를 다시 입력해 주세요" - }, "enterPasswordContinue": { "message": "계ì†í•˜ê¸° 위해 비밀번호 ìž…ë ¥" }, - "eth": { - "message": "ETH" + "ethereumPublicAddress": { + "message": "ì´ë”리움 공개 주소" }, "etherscanView": { "message": "ì´ë”스캔ì—서 계정보기" @@ -510,18 +410,12 @@ "estimatedProcessingTimes": { "message": "ì˜ˆìƒ ì²˜ë¦¬ 시간" }, - "exchangeRate": { - "message": "환율" - }, "expandView": { "message": "í° í™”ë©´ìœ¼ë¡œ 보기" }, "exportPrivateKey": { "message": "ê°œì¸í‚¤ 내보내기" }, - "exportPrivateKeyWarning": { - "message": "ê°œì¸í‚¤ 내보내기는 ìœ„í—˜ì„ ê°ìˆ˜í•´ì•¼ 합니다." - }, "failed": { "message": "실패" }, @@ -533,14 +427,11 @@ }, "fiat": { "message": "FIAT", - "description": "거래 형ì‹" + "description": "Exchange type" }, "fileImportFail": { "message": "파ì¼ì„ 가져올 수 없나요? ì´ê³³ì„ í´ë¦­í•´ì£¼ì„¸ìš”!", - "description": "JSON 파ì¼ë¡œë¶€í„° 계정 가져오기를 ë„와ì¤ë‹ˆë‹¤" - }, - "followTwitter": { - "message": "트위터ì—서 팔로우하세요" + "description": "Helps user import their account from a JSON file" }, "forgetDevice": { "message": "장치 ì—°ê²° í•´ì œ" @@ -548,43 +439,21 @@ "from": { "message": "보내는 ì´" }, - "fromToSame": { - "message": "ë³´ë‚´ê³  받는 주소는 ê°™ì„ ìˆ˜ 없습니다" - }, - "fromShapeShift": { - "message": "ShapeShift로부터" - }, "functionType": { "message": "함수 유형" }, - "gas": { - "message": "가스", - "description": "가스 ê°€ê²©ì˜ ì¤„ìž„" - }, - "gasFee": { - "message": "가스 수수료" - }, "gasLimit": { "message": "가스 한ë„" }, - "gasLimitCalculation": { - "message": "ë„¤íŠ¸ì›Œí¬ ì„±ê³µë¥ ì„ ê¸°ë°˜ìœ¼ë¡œ ì í•©í•œ 가스 한ë„를 계산합니다." - }, "gasLimitInfoModalContent": { "message": "가스 한ë„는 ë‹¹ì‹ ì´ ê¸°êº¼ì´ ì†Œë¹„í•  수 있는 ê°€ìŠ¤ì˜ ìµœëŒ€ 수량입니다." }, - "gasLimitRequired": { - "message": "가스 한ë„ê°€ 필요합니다." - }, "gasLimitTooLow": { "message": "가스 한ë„는 최소 21000 ì´ìƒì´ì–´ì•¼ 합니다." }, "gasUsed": { "message": "ì‚¬ìš©ëœ ê°€ìŠ¤" }, - "generatingSeed": { - "message": "시드 ìƒì„± 중..." - }, "gasPrice": { "message": "가스 가격 (GWEI)" }, @@ -597,21 +466,18 @@ "gasPriceNoDenom": { "message": "가스 가격" }, - "gasPriceCalculation": { - "message": "ë„¤íŠ¸ì›Œí¬ ì„±ê³µë¥ ì„ ê¸°ë°˜ìœ¼ë¡œ ì í•©í•œ 가스 ê°€ê²©ì„ ê³„ì‚°í•©ë‹ˆë‹¤." - }, - "gasPriceRequired": { - "message": "가스 ê°€ê²©ì´ í•„ìš”í•©ë‹ˆë‹¤." + "general": { + "message": "ì¼ë°˜" }, - "generatingTransaction": { - "message": "트랜잭션 ìƒì„± 중" + "generalSettingsDescription": { + "message": "환전, 기본 통화, 언어, 블로키 ì•„ì´ë´í‹°ì½˜" }, "getEther": { "message": "ì´ë” 얻기" }, "getEtherFromFaucet": { "message": "파우셋ì—서 $1ì— ë‹¬í•˜ëŠ” ì´ë”를 얻으세요.", - "description": "ì´ë” íŒŒìš°ì…‹ì— ëŒ€í•œ ë„¤íŠ¸ì›Œí¬ ì´ë¦„ì„ í‘œì‹œí•©ë‹ˆë‹¤" + "description": "Displays network name for Ether faucet" }, "getHelp": { "message": "ë„움ë§" @@ -619,13 +485,6 @@ "getStarted": { "message": "시작하기" }, - "greaterThanMin": { - "message": "$1 ì´ìƒì´ì–´ì•¼ 합니다.", - "description": "10진수 입력으로 hexê°’ ìž…ë ¥ì„ ë„와ì¤ë‹ˆë‹¤" - }, - "happyToSeeYou": { - "message": "We’re happy to see you." - }, "hardware": { "message": "하드웨어" }, @@ -645,33 +504,21 @@ "message": "여기", "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, - "hereList": { - "message": "리스트가 있습니다!!!!" - }, "hexData": { "message": "Hex ë°ì´í„°" }, "hide": { "message": "숨기기" }, - "hideToken": { - "message": "í† í° ìˆ¨ê¸°ê¸°" - }, "hideTokenPrompt": { "message": "í† í° ìˆ¨ê¸°ê¸°?" }, "history": { "message": "히스토리" }, - "howToDeposit": { - "message": "ì–´ë–¤ 방법으로 ì´ë”를 입금하시겠습니까?" - }, - "holdEther": { - "message": "It allows you to hold ether & tokens, and serves as your bridge to decentralized applications." - }, "import": { "message": "가져오기", - "description": "ì„ íƒëœ 파ì¼ë¡œë¶€í„° 계정 가져오기 버튼" + "description": "Button to import an account from a selected file" }, "importAccount": { "message": "계정 가져오기" @@ -682,12 +529,6 @@ "importAccountSeedPhrase": { "message": "시드 구문으로 계정 가져오기" }, - "importAnAccount": { - "message": "계정 가져오기" - }, - "importDen": { - "message": "ê¸°ì¡´ì˜ DEN 가져오기" - }, "importWallet": { "message": "지갑 가져오기" }, @@ -696,17 +537,11 @@ }, "imported": { "message": "가져온 계정", - "description": "ì´ ìƒíƒœëŠ” 해당 ê³„ì •ì´ keyring으로 완전히 ë¡œë“œëœ ìƒíƒœìž„ì„ í‘œì‹œí•©ë‹ˆë‹¤" + "description": "status showing that an account has been fully loaded into the keyring" }, "importUsingSeed": { "message": "계정 시드 구문으로 가져오기" }, - "importWithSeedPhrase": { - "message": "시드 구문 가져오기" - }, - "info": { - "message": "ì •ë³´" - }, "infoHelp": { "message": "ì •ë³´ ë° ë„움ë§" }, @@ -728,37 +563,31 @@ "invalidAddressRecipient": { "message": "수신 주소가 올바르지 않습니다" }, - "invalidGasParams": { - "message": "올바르지 ì•Šì€ ê°€ìŠ¤ 입력값" + "knownAddressRecipient": { + "message": "알려진 계약 주소." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "ETH ë„¤íŠ¸ì›Œí¬ ì•„ë‹˜, 소문ìžë¡œ 설정" }, "invalidInput": { "message": "올바르지 ì•Šì€ ìž…ë ¥ê°’" }, - "invalidRequest": { - "message": "유효하지 ì•Šì€ ìš”ì²­" - }, "invalidRPC": { "message": "올바르지 ì•Šì€ RPC URI" }, + "invalidBlockExplorerURL": { + "message": "올바르지 ì•Šì€ Block Explorer URI" + }, "invalidSeedPhrase": { "message": "ìž˜ëª»ëœ ì‹œë“œ 구문" }, - "jsonFail": { - "message": "ì´ìƒì´ 있습니다. JSON 파ì¼ì´ 올바른 파ì¼ì¸ì§€ 확ì¸í•´ì£¼ì„¸ìš”." - }, "jsonFile": { "message": "JSON 파ì¼", - "description": "ê³„ì •ì„ ê°€ì ¸ì˜¤ê¸° 위한 형ì‹" - }, - "keepTrackTokens": { - "message": "ë©”íƒ€ë§ˆìŠ¤í¬ ê³„ì •ì„ í†µí•´ 구입한 í† í° ê¸°ë¡ì„ ì¶”ì  ë° ë³´ê´€í•©ë‹ˆë‹¤." + "description": "format for importing an account" }, "kovan": { "message": "Kovan 테스트넷" }, - "knowledgeDataBase": { - "message": "ì§€ì‹ ë² ì´ìФ 방문" - }, "max": { "message": "최대" }, @@ -768,10 +597,6 @@ "ledgerAccountRestriction": { "message": "새 ê³„ì •ì„ ì¶”ê°€í•˜ë ¤ë©´ 최소 마지막 ê³„ì •ì„ ì‚¬ìš©í•´ì•¼ 합니다." }, - "lessThanMax": { - "message": "$1 ì´í•˜ì—¬ì•¼í•©ë‹ˆë‹¤.", - "description": "10진수 입력으로 hexê°’ ìž…ë ¥ì„ ë„와ì¤ë‹ˆë‹¤" - }, "letsGoSetUp": { "message": "네, 설정해볼게요!" }, @@ -781,9 +606,6 @@ "links": { "message": "ë§í¬" }, - "limit": { - "message": "한ë„" - }, "liveGasPricePredictions": { "message": "실시간 가스 가격 예측" }, @@ -793,29 +615,23 @@ "loadingTokens": { "message": "í† í° ë¡œë”© 중..." }, + "loadMore": { + "message": "ë” ë§Žì´ ë¡œë”©" + }, "localhost": { "message": "로컬호스트 8545" }, - "login": { - "message": "로그ì¸" - }, - "logout": { + "lock": { "message": "로그아웃" }, - "loose": { - "message": "ëŠìŠ¨í•¨" - }, - "loweCaseWords": { - "message": "시드 단어는 소문ìžë§Œ 가능합니다" - }, "mainnet": { "message": "ì´ë”리움 ë©”ì¸ë„·" }, "memorizePhrase": { "message": "ì´ êµ¬ë¬¸ì„ ê¸°ì–µí•˜ì„¸ìš”." }, - "menu": { - "message": "메뉴" + "memo": { + "message": "메모" }, "message": { "message": "메시지" @@ -823,21 +639,21 @@ "metamaskDescription": { "message": "메타마스í¬ëŠ” ì´ë”ë¦¬ì›€ì„ ìœ„í•œ 안전한 저장소입니다." }, - "metamaskSeedWords": { - "message": "ë©”íƒ€ë§ˆìŠ¤í¬ ì‹œë“œ 단어" - }, "metamaskVersion": { "message": "ë©”íƒ€ë§ˆìŠ¤í¬ ë²„ì „" }, - "min": { - "message": "최소" - }, - "missingYourTokens": { - "message": "ë‹¹ì‹ ì˜ í† í°ì´ ë³´ì´ì§€ 않나요?" + "mobileSyncText": { + "message": "ë³¸ì¸ ì—¬ë¶€ë¥¼ 확ì¸í•˜ê¸° 위해 비밀번호를 입력해 주세요!" }, "myAccounts": { "message": "ë‚´ 계정" }, + "myWalletAccounts": { + "message": "ë‚˜ì˜ ì›”ë › 계정" + }, + "myWalletAccountsDescription": { + "message": "MetaMaskê°€ ìƒì„±í•œ 모든 ê³„ì •ì´ ì´ ì„¹ì…˜ì— ìžë™ìœ¼ë¡œ 추가ë©ë‹ˆë‹¤." + }, "mustSelectOne": { "message": "ì ì–´ë„ í•˜ë‚˜ì˜ í† í°ì„ ì„ íƒí•˜ì„¸ìš”." }, @@ -846,27 +662,35 @@ }, "needImportFile": { "message": "가져올 파ì¼ì„ ì„ íƒí•´ì£¼ì„¸ìš”.", - "description": "사용ìžëŠ” ê³„ì •ì„ ê°€ì ¸ì˜¤ê¸° 위해서 파ì¼ì„ 추가후 ê³„ì† ì§„í–‰í•´ì•¼ 합니다" - }, - "needImportPassword": { - "message": "ì„ íƒëœ 파ì¼ì— 대한 비밀번호를 입력해주세요.", - "description": "ê³„ì •ì„ ê°€ì ¸ì˜¤ê¸° 위해서 비밀번호와 파ì¼ì´ 필요합니다." + "description": "User is important an account and needs to add a file to continue" }, "negativeETH": { "message": "ìŒìˆ˜ê°’ì˜ ì´ë”를 보낼 수 없습니다." }, + "networkName": { + "message": "ë„¤íŠ¸ì›Œí¬ ì´ë¦„" + }, "networks": { "message": "네트워í¬" }, + "networkSettingsDescription": { + "message": "ì‚¬ìš©ìž ì •ì˜ RPC ë„¤íŠ¸ì›Œí¬ ì¶”ê°€ ë° ìˆ˜ì •" + }, "nevermind": { "message": "ìƒê´€ 안 함" }, "newAccount": { "message": "새 계정" }, + "newAccountDetectedDialogMessage": { + "message": "새로운 주소가 ê°ì§€ë습니다! 여기를 í´ë¦­í•´ 주수ë¡ì— 추가하세요." + }, "newAccountNumberName": { "message": "새 계정 $1", - "description": "계정 ìƒì„± 시 ë³¼ 수 있는 새 ê³„ì •ì˜ ê¸°ë³¸ ì´ë¦„" + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "새로운 ì—°ë½ì²˜" }, "newContract": { "message": "새 컨트랙트" @@ -874,12 +698,6 @@ "newPassword": { "message": "새 비밀번호 (최소 8ìž ì´ìƒ)" }, - "newPassword8Chars": { - "message": "새 비밀번호 (최소 8문ìž)" - }, - "newRecipient": { - "message": "받는 사람" - }, "newNetwork": { "message": "새 네트워í¬" }, @@ -889,14 +707,17 @@ "noAlreadyHaveSeed": { "message": "아니요, ì´ë¯¸ 시드 êµ¬ë¬¸ì„ ê°€ì§€ê³  있습니다." }, - "rpcURL": { - "message": "새 RPC 주소" + "protectYourKeys": { + "message": "키를 보호하세요!" }, - "showAdvancedOptions": { - "message": "고급 옵션 보기" + "protectYourKeysMessage1": { + "message": "시드 ë¬¸êµ¬ì— ì£¼ì˜í•˜ì„¸ìš” - MetaMask를 모방하려고 한 웹사ì´íŠ¸ë“¤ì´ ì‹ ê³ ë습니다. MetaMask는 절대로 시드 문구를 묻지 않습니다!" }, - "hideAdvancedOptions": { - "message": "고급 옵션 숨기기" + "protectYourKeysMessage2": { + "message": "시드 문구를 안전하게 유지하세요. 수ìƒí•œ ì ì„ 발견하거나, 웹사ì´íŠ¸ì— í™•ì‹ ì´ ë“¤ì§€ 않으면 support@metamask.io로 ì´ë©”ì¼ì„ ë³´ë‚´ 주세요" + }, + "rpcUrl": { + "message": "새로운 RPC URL" }, "optionalChainId": { "message": "ChainID (ì„ íƒ)" @@ -904,9 +725,6 @@ "optionalSymbol": { "message": "Symbol (ì„ íƒ)" }, - "optionalNickname": { - "message": "Nickname (ì„ íƒ)" - }, "newTotal": { "message": "새 합계" }, @@ -919,23 +737,14 @@ "noAddressForName": { "message": "ì´ ì´ë¦„ì— ëŒ€í•´ 주소가 설정ë˜ì–´ 있지 않습니다." }, - "noDeposits": { - "message": "입금 ë‚´ì—­ì´ ì—†ìŠµë‹ˆë‹¤." - }, "noConversionRateAvailable": { "message": "변환 ë¹„ìœ¨ì„ ì°¾ì„ ìˆ˜ 없습니다" }, - "noTransactionHistory": { - "message": "트랜잭션 기ë¡ì´ 없습니다." - }, "noTransactions": { "message": "íŠ¸ëžœìž­ì…˜ì´ ì—†ìŠµë‹ˆë‹¤" }, - "notFound": { - "message": "ì°¾ì„ ìˆ˜ ì—†ìŒ" - }, - "notStarted": { - "message": "시작 안 ë¨" + "notEnoughGas": { + "message": "가스가 충분하지 않습니다" }, "noWebcamFoundTitle": { "message": "ì›¹ìº ì´ ì—†ìŠµë‹ˆë‹¤" @@ -943,32 +752,12 @@ "noWebcamFound": { "message": "ì»´í“¨í„°ì˜ ì›¹ìº ì„ ì°¾ì„ ìˆ˜ 없습니다. 다시 시ë„해보세요." }, - "oldUI": { - "message": "구버전 UI" - }, - "oldUIMessage": { - "message": "구버전 UI로 변경하셨습니다. 오른쪽 위 드롭다운 메뉴ì—서 새 UI로 변경하실 수 있습니다." - }, - "onlySendToEtherAddress": { - "message": "ì´ë”리움 주소로 ETHë§Œ 송금하세요." - }, - "onlySendTokensToAccountAddress": { - "message": "ì´ë”리움 계정 주소로 $1ë§Œ 보내기.", - "description": "í† í° ì‹¬ë³¼ ë³´ì´ê¸°" - }, - "openInTab": { - "message": "탭으로 열기" - }, - "or": { - "message": "ë˜ëŠ”", - "description": "새 ê³„ì •ì„ ë§Œë“¤ê±°ë‚˜ 가져오기 ì¤‘ì— ì„ íƒí•˜ê¸°" + "ofTextNofM": { + "message": "~ì˜" }, "orderOneHere": { "message": "Trezor í˜¹ì€ Ledger를 구입하고 ìžê¸ˆì„ 콜드 ìŠ¤í† ë¦¬ì§€ì— ì €ìž¥í•©ë‹ˆë‹¤" }, - "origin": { - "message": "Origin" - }, "parameters": { "message": "매개변수" }, @@ -981,29 +770,15 @@ "password": { "message": "비밀번호" }, - "passwordCorrect": { - "message": "비밀번호가 맞는지 확ì¸í•´ì£¼ì„¸ìš”." - }, "passwordsDontMatch": { "message": "비밀번호가 ë§žì§€ 않습니다" }, - "passwordMismatch": { - "message": "비밀번호가 ì¼ì¹˜í•˜ì§€ 않습니다.", - "description": "비밀번호를 ìƒì„±í•˜ëŠ” 과정ì—서 ë‘ ê°œì˜ ìƒˆ 비밀번호 ìž…ë ¥ëž€ì´ ì¼ì¹˜í•˜ì§€ 않습니다" - }, "passwordNotLongEnough": { "message": "비밀번호가 충분히 길지 않습니다" }, - "passwordShort": { - "message": "비밀번호가 짧습니다.", - "description": "비밀번호를 ìƒì„±í•˜ëŠ” 과정ì—서 비밀번호가 짧으면 안전하지 않습니다" - }, "pastePrivateKey": { "message": "ê°œì¸í‚¤ë¥¼ 입력해주세요:", - "description": "ê°œì¸í‚¤ë¡œë¶€í„° ê³„ì •ì„ ê°€ì ¸ì˜¤ëŠ” 것입니다" - }, - "pasteSeed": { - "message": "시드 êµ¬ë¬¸ì„ ì´ê³³ì— 붙여넣어 주세요!" + "description": "For importing an account from a private key" }, "pending": { "message": "펜딩 중" @@ -1011,12 +786,6 @@ "personalAddressDetected": { "message": "ê°œì¸ ì£¼ì†Œê°€ íƒì§€ë¨. í† í° ì»¨íŠ¸ëž™íŠ¸ 주소를 입력하세요." }, - "pleaseReviewTransaction": { - "message": "íŠ¸ëžœìž­ì…˜ì„ ê²€í† í•´ì£¼ì„¸ìš”." - }, - "popularTokens": { - "message": "ì¸ê¸°ìžˆëŠ” 토í°" - }, "prev": { "message": "ì´ì „" }, @@ -1031,7 +800,7 @@ }, "privateKey": { "message": "ê°œì¸í‚¤", - "description": "ì´ í˜•ì‹ì˜ 파ì¼ì„ ì„ íƒí•˜ì—¬ ê³„ì •ì„ ê°€ì ¸ì˜¬ 수 있습니다" + "description": "select this type of file to use to import an account" }, "privateKeyWarning": { "message": "절대 ì´ í‚¤ë¥¼ 노출하지 마십시오. ê°œì¸í‚¤ê°€ 노출ë˜ë©´ 누구나 ë‹¹ì‹ ì˜ ê³„ì •ì—서 ìžì‚°ì„ 빼갈 수 있습니다." @@ -1039,29 +808,20 @@ "privateNetwork": { "message": "프ë¼ì´ë¹— 네트워í¬" }, - "qrCode": { - "message": "QR 코드 보기" - }, "queue": { "message": "í" }, "readdToken": { "message": "옵션 메뉴ì—서 â€œí† í° ì¶”ê°€â€ë¥¼ 눌러서 ì¶”í›„ì— ë‹¤ì‹œ ì´ í† í°ì„ 추가하실 수 있습니다." }, - "readMore": { - "message": "여기서 ë” ë³´ê¸°." - }, - "readMore2": { - "message": "ë” ë³´ê¸°." - }, - "receive": { - "message": "받기" + "recents": { + "message": "최근" }, "recipientAddress": { "message": "받는 주소" }, - "refundAddress": { - "message": "í™˜ë¶ˆë°›ì„ ì£¼ì†Œ" + "recipientAddressPlaceholder": { + "message": "검색, 공개 주소 (0x), ë˜ëŠ” ENS" }, "rejectAll": { "message": "ëª¨ë‘ ê±°ë¶€" @@ -1084,12 +844,18 @@ "resetAccountDescription": { "message": "ê³„ì •ì„ ì´ˆê¸°í™” 하는 ê²½ìš°ì— íŠ¸ëžœìž­ì…˜ 기ë¡ì´ ì‚­ì œë©ë‹ˆë‹¤." }, + "deleteNetwork": { + "message": "네트워í¬ë¥¼ 삭제할까요?" + }, + "deleteNetworkDescription": { + "message": "ì •ë§ë¡œ ì´ ë„¤íŠ¸ì›Œí¬ë¥¼ 삭제하시겠습니까?" + }, + "remindMeLater": { + "message": "ë‚˜ì¤‘ì— ì•Œë ¤ 주세요" + }, "restoreFromSeed": { "message": "ê³„ì •ì„ ë³µêµ¬í•˜ì‹œê² ìŠµë‹ˆê¹Œ?" }, - "restoreVault": { - "message": "저장소 복구" - }, "restoreAccountWithSeed": { "message": "시드 구문으로 계정 복구하기" }, @@ -1099,9 +865,6 @@ "required": { "message": "필요함" }, - "retryWithMoreGas": { - "message": "ë” ë†’ì€ ê°€ìŠ¤ 가격으로 다시 시ë„해주세요" - }, "restore": { "message": "복구" }, @@ -1120,9 +883,6 @@ "revealSeedWordsWarning": { "message": "ì´ ë‹¨ì–´ 모ìŒì€ ë‹¹ì‹ ì˜ ëª¨ë“  ê³„ì •ì„ í›”ì¹˜ëŠ”ë° ì‚¬ìš©í•  수 있습니다." }, - "revert": { - "message": "ë˜ëŒë¦¼" - }, "remove": { "message": "제거" }, @@ -1141,12 +901,8 @@ "ropsten": { "message": "Ropsten 테스트넷" }, - "rpc": { - "message": "ì‚¬ìš©ìž ì •ì˜ RPC" - }, - "sampleAccountName": { - "message": "예) ë‚˜ì˜ ìƒˆ 계정", - "description": "ê° ê³„ì •ì— ëŒ€í•´ì„œ 구별하기 쉬운 ì´ë¦„ì„ ì§€ì •í•˜ì—¬ 사용ìžê°€ 쉽게 ì´í•´í•  수 있게 합니다" + "goerli": { + "message": "Goerli 테스트 네트워í¬" }, "save": { "message": "저장" @@ -1160,13 +916,6 @@ "saveAsCsvFile": { "message": "CSV 파ì¼ë¡œ 저장" }, - "saveAsFile": { - "message": "파ì¼ë¡œ 저장", - "description": "계정 내보내기 절차" - }, - "saveSeedAsFile": { - "message": "시드 단어를 파ì¼ë¡œ 저장하기" - }, "scanInstructions": { "message": "QR 코드를 ì¹´ë©”ë¼ ì•žì— ê°€ì ¸ë‹¤ 놓아주세요" }, @@ -1191,8 +940,11 @@ "secretPhrase": { "message": "12ê°œ 단어로 êµ¬ì„±ëœ ë¹„ë°€ êµ¬ë¬¸ì„ ìž…ë ¥í•˜ì—¬ 저장소를 복구하세요." }, - "secondsShorthand": { - "message": "ì´ˆ" + "securityAndPrivacy": { + "message": "보안 ë° ê°œì¸ ì •ë³´ 보호" + }, + "securitySettingsDescription": { + "message": "ê°œì¸ ì •ë³´ 보호 설정 ë° ì›”ë › 시드 문구" }, "seedPhrasePlaceholder": { "message": "ê° ë‹¨ì–´ë¥¼ 스페ì´ìŠ¤ë¡œ 구분해주세요" @@ -1200,9 +952,6 @@ "seedPhraseReq": { "message": "시드 êµ¬ë¬¸ì€ 12ê°œì˜ ë‹¨ì–´ìž…ë‹ˆë‹¤" }, - "select": { - "message": "ì„ íƒ" - }, "selectCurrency": { "message": "통화 ì„ íƒ" }, @@ -1212,9 +961,6 @@ "selectLocale": { "message": "언어 ì„ íƒ" }, - "selectService": { - "message": "서비스 ì„ íƒ" - }, "selectType": { "message": "í˜•ì‹ ì„ íƒ" }, @@ -1242,9 +988,6 @@ "searchTokens": { "message": "í† í° ê²€ìƒ‰" }, - "selectAnAddress": { - "message": "주소 ì„ íƒ" - }, "selectAnAccount": { "message": "계정 ì„ íƒ" }, @@ -1260,15 +1003,9 @@ "selectPathHelp": { "message": "하단ì—서 Ledger 지갑 ê³„ì •ì„ ì°¾ì§€ 못하겠으면 \"Legacy (MEW / MyCrypto)\" 경로로 바꿔보세요" }, - "sendTokensAnywhere": { - "message": "ì´ë” 계정으로 í† í° ì „ì†¡" - }, "settings": { "message": "설정" }, - "shapeshiftBuy": { - "message": "Shapeshift를 통해서 구매하기" - }, "showAdvancedGasInline": { "message": "고급 가스 제어" }, @@ -1284,9 +1021,6 @@ "showPrivateKeys": { "message": "ê°œì¸í‚¤ 보기" }, - "showQRCode": { - "message": "QR 코드 보기" - }, "showHexData": { "message": "Hex ë°ì´í„° 보기" }, @@ -1302,33 +1036,18 @@ "signed": { "message": "서명ë¨" }, - "signMessage": { - "message": "메시지 서명" - }, "signNotice": { "message": "ì´ ë©”ì‹œì§€ì— ëŒ€í•œ ì„œëª…ì€ ìœ„í—˜í•  수 있습니다.\n 완전히 신뢰할 수 있는 사ì´íЏì—서만 서명해주세요.\n ì•ˆì „ì„ ìœ„í•´ ì¶”í›„ì˜ ë²„ì „ì—서는 ì‚­ì œë  ê¸°ëŠ¥ìž…ë‹ˆë‹¤. " }, "sigRequest": { "message": "서명 요청" }, - "sigRequested": { - "message": "ì„œëª…ì´ ìš”ì²­ë¨" - }, "somethingWentWrong": { "message": "í—‰! 뭔가 잘못ëì–´ìš”." }, - "spaceBetween": { - "message": "단어 사ì´ì—는 공백만 올 수 있습니다" - }, "speedUp": { "message": "ì†ë„ í–¥ìƒ" }, - "speedUpTitle": { - "message": "트랜잭션 ì†ë„ í–¥ìƒí•˜ê¸°" - }, - "speedUpSubtitle": { - "message": "트랜잭션 가스 ê°€ê²©ì„ ì˜¬ë ¤ì„œ 해당 íŠ¸ëžœìž­ì…˜ì— ë®ì–´ì“°ê³  ì†ë„를 빠르게 합니다" - }, "speedUpCancellation": { "message": "취소 ì†ë„ í–¥ìƒ" }, @@ -1338,9 +1057,6 @@ "switchNetworks": { "message": "ë„¤íŠ¸ì›Œí¬ ë³€ê²½" }, - "status": { - "message": "ìƒíƒœ" - }, "stateLogs": { "message": "ìƒíƒœ 로그" }, @@ -1371,20 +1087,38 @@ "storePhrase": { "message": "ì´ êµ¬ë¬¸ì„ 1Passwordê°™ì€ ì•”í˜¸ 관리ìžì— 저장하세요." }, - "submit": { - "message": "제출" - }, "submitted": { "message": "제출ë¨" }, "supportCenter": { "message": "ì§€ì› ì„¼í„°ì— ë°©ë¬¸í•˜ê¸°" }, + "symbol": { + "message": "기호" + }, "symbolBetweenZeroTwelve": { "message": "ì‹¬ë³¼ì€ 0ì—서 12ê°œ 사ì´ì˜ 문ìžì—¬ì•¼ 합니다." }, - "takesTooLong": { - "message": "너무 오래 걸리나요?" + "syncWithMobile": { + "message": "모바ì¼ë¡œ ë™ê¸°í™”" + }, + "syncWithMobileTitle": { + "message": "모바ì¼ê³¼ ë™ê¸°í™”" + }, + "syncWithMobileDesc": { + "message": "ëª¨ë°”ì¼ ê¸°ê¸°ì™€ 계정 ë° ì •ë³´ë¥¼ ë™ê¸°í™”í•  수 있습니다. MetaMask ëª¨ë°”ì¼ ì•±ì„ ì—´ê³ , \"설정\"으로 ê°„ ë‹¤ìŒ \"브ë¼ìš°ì € 확장 프로그램ì—서 ë™ê¸°í™”\"를 누르세요" + }, + "syncWithMobileDescNewUsers": { + "message": "처ìŒìœ¼ë¡œ MetaMask ëª¨ë°”ì¼ ì•±ì„ ì—¬ì‹œëŠ” 경우, ì „í™”ì— ë‚˜ì˜¨ ê³¼ì •ì„ ë”°ë¥´ì„¸ìš”." + }, + "syncWithMobileScanThisCode": { + "message": "MetaMask ëª¨ë°”ì¼ ì•±ìœ¼ë¡œ ì´ ì½”ë“œë¥¼ 스캔하세요" + }, + "syncWithMobileBeCareful": { + "message": "ì´ ì½”ë“œë¥¼ 스캔할 때 ê·€í•˜ì˜ í™”ë©´ì„ ë³´ëŠ” ì‚¬ëžŒì´ ì—†ëŠ” ê²ƒì„ í™•ì¸í•˜ì„¸ìš”" + }, + "syncWithMobileComplete": { + "message": "ë°ì´í„°ê°€ 성공ì ìœ¼ë¡œ ë™ê¸°í™”ë습니다. MetaMask ëª¨ë°”ì¼ ì•±ì„ ì¦ê²ê²Œ 사용하세요!" }, "terms": { "message": "사용 지침" @@ -1401,34 +1135,18 @@ "to": { "message": "받는ì´" }, - "toETHviaShapeShift": { - "message": "ShapeShift를 통해 $1를 ETH로 바꾸기", - "description": "ì‹œìŠ¤í…œì´ ì‹œìž‘í•  ë•Œì— ìž…ê¸ˆ ìœ í˜•ì„ ìž…ë ¥í•´ì¤ë‹ˆë‹¤" - }, "token": { "message": "토í°" }, - "tokenAddress": { - "message": "í† í° ì£¼ì†Œ" - }, "tokenAlreadyAdded": { "message": "토í°ì´ ì´ë¯¸ 추가ë˜ì–´ìžˆìŠµë‹ˆë‹¤." }, - "tokenBalance": { - "message": "현재 í† í° ìž”ì•¡:" - }, "tokenContractAddress": { "message": "í† í° ì»¨íŠ¸ëž™íŠ¸ 주소" }, - "tokenSelection": { - "message": "토í°ì„ 검색하거나 유명한 í† í° ë¦¬ìŠ¤íŠ¸ì—서 ì„ íƒí•˜ì‹œê¸° ë°”ëžë‹ˆë‹¤." - }, "tokenSymbol": { "message": "í† í° ê¸°í˜¸" }, - "tokenWarning1": { - "message": "ë©”íƒ€ë§ˆìŠ¤í¬ ê³„ì •ì„ í†µí•´ 구입한 토í°ì„ ì¶”ì í•©ë‹ˆë‹¤. 다른 계정으로 토í°ì„ 구입한 경우 ì´ê³³ì— 나타나지 않습니다." - }, "total": { "message": "합계" }, @@ -1441,9 +1159,6 @@ "transactionCreated": { "message": "$1ì— ëŒ€í•œ íŠ¸ëžœìž­ì…˜ì´ ìƒì„±ë¨ $2." }, - "transactionWithNonce": { - "message": "트랜잭션 $1" - }, "transactionDropped": { "message": "íŠ¸ëžœìž­ì…˜ì´ ë“œë¡­ë¨ $2." }, @@ -1456,9 +1171,6 @@ "transactionUpdated": { "message": "íŠ¸ëžœìž­ì…˜ì´ ìˆ˜ì •ë¨ $2." }, - "transactionUpdatedGas": { - "message": "$1ì˜ ê°€ìŠ¤ 요금으로 íŠ¸ëžœìž­ì…˜ì´ ìˆ˜ì •ë¨ $2." - }, "transactionErrored": { "message": "트랜잭션 오류 ë°œìƒ." }, @@ -1468,79 +1180,49 @@ "transactionCancelSuccess": { "message": "íŠ¸ëžœìž­ì…˜ì´ ì„±ê³µì ìœ¼ë¡œ ì·¨ì†Œë¨ $2." }, - "transactions": { - "message": "트랜잭션" - }, "transactionError": { "message": "트랜잭션 오류. 컨트랙트 코드ì—서 예외 ë°œìƒ(Exception thrown)." }, + "transactionErrorNoContract": { + "message": "비계약 주소ì—서 ê¸°ëŠ¥ì„ í˜¸ì¶œí•˜ë ¤ê³  합니다." + }, "transactionFee": { "message": "수수료" }, - "transactionMemo": { - "message": "트랜잭션 메모 (ì„ íƒì‚¬í•­)" - }, - "transactionNumber": { - "message": "트랜잭션 번호" - }, "transactionTime": { "message": "트랜잭션 시간" }, "transfer": { "message": "전송" }, + "transferBetweenAccounts": { + "message": "ë‚˜ì˜ ê³„ì • ê°„ ì´ì²´" + }, "transferFrom": { "message": "보내는 ì´" }, - "transfers": { - "message": "전송" - }, - "trezorHardwareWallet": { - "message": "TREZOR 하드웨어 지갑" - }, "troubleTokenBalances": { "message": "í† í° ìž”ì•¡ì„ ê°€ì ¸ì˜¤ëŠ” ë°ì— 문제가 ìƒê²¼ìŠµë‹ˆë‹¤. ë§í¬ì—서 ìƒì„¸ë‚´ìš©ì„ ë³¼ 수 있습니다.", - "description": "í† í° ìž”ì•¡ì„ ë³´ë ¤ë©´ (here) ë§í¬ë¥¼ ë”°ë¼ê°€ì„¸ìš”" + "description": "Followed by a link (here) to view token balances" }, "tryAgain": { "message": "다시 시ë„하세요" }, - "twelveWords": { - "message": "12ê°œì˜ ë‹¨ì–´ëŠ” ë©”íƒ€ë§ˆìŠ¤í¬ ê³„ì •ì„ ë³µêµ¬í•˜ê¸° 위한 유ì¼í•œ 방법입니다.\n안전한 ìž¥ì†Œì— ë³´ê´€í•˜ì‹œê¸° ë°”ëžë‹ˆë‹¤." - }, "typePassword": { "message": "비밀번호를 입력하세요" }, - "uiMigrationAnnouncement": { - "message": "새로운 ë©”íƒ€ë§ˆìŠ¤í¬ UIì— ì˜¤ì‹  ê²ƒì„ í™˜ì˜í•©ë‹ˆë‹¤. UIì— ëŒ€í•œ 피드백 ë˜ëŠ” 기능 ìš”ì²­ì´ ìžˆëŠ” 경우, ë‹¹ì‚¬ì˜ ì§€ì›íŒ€ ë˜ëŠ” GitHubì— ì—°ë½í•´ì£¼ì„¸ìš”." - }, - "uiWelcome": { - "message": "새로운 UIì— ì˜¤ì‹  ê²ƒì„ í™˜ì˜í•©ë‹ˆë‹¤. (Beta)" - }, - "uiWelcomeMessage": { - "message": "새로운 ë©”íƒ€ë§ˆìŠ¤í¬ UI를 사용하고 계십니다. í† í° ì „ì†¡ê³¼ ê°™ì€ ìƒˆ ê¸°ëŠ¥ë“¤ì„ ì‚¬ìš©í•´ë³´ì‹œë©´ì„œ 문제가 있다면 알려주세요." - }, "unapproved": { "message": "허가 안 ë¨" }, - "unavailable": { - "message": "ì´ìš©í•  수 ì—†ìŒ" - }, "units": { "message": "단위" }, "unknown": { "message": "알 수 ì—†ìŒ" }, - "unknownFunction": { - "message": "알 수 없는 함수" - }, "unknownNetwork": { "message": "알 수 없는 프ë¼ì´ë¹— 네트워í¬" }, - "unknownNetworkId": { - "message": "알 수 없는 ë„¤íŠ¸ì›Œí¬ ID" - }, "unknownQrCode": { "message": "오류: QR 코드를 확ì¸í•  수 없습니다" }, @@ -1559,28 +1241,27 @@ "updatedWithDate": { "message": "$1ì— ì—…ë°ì´íЏ ë¨" }, - "uriErrorMsg": { + "urlErrorMsg": { "message": "URI는 HTTP/HTTPS로 시작해야 합니다." }, - "usaOnly": { - "message": "USA ê±°ì£¼ìž í•œì •", - "description": "해당 거래소는 USA 거주ìžì— 한해서만 사용 가능합니다" - }, "usedByClients": { "message": "다양한 í´ë¼ì´ì–¸íЏì—서 사용ë˜ê³  있습니다" }, - "useOldUI": { - "message": "예전 UI 사용" - }, - "validFileImport": { - "message": "가져오기 위해 유효한 파ì¼ì„ ì„ íƒí•´ì•¼ 합니다." - }, - "vaultCreated": { - "message": "저장소가 ìƒì„±ë¨" + "userName": { + "message": "사용ìžì´ë¦„" }, "viewAccount": { "message": "계정 보기" }, + "viewinExplorer": { + "message": "ìµìŠ¤í”Œë¡œëŸ¬ì—서 보기" + }, + "viewContact": { + "message": "ì—°ë½ì²˜ 보기" + }, + "viewOnCustomBlockExplorer": { + "message": "$1ì— ë³´ê¸°" + }, "viewOnEtherscan": { "message": "ì´ë”스캔ì—서 보기" }, @@ -1590,18 +1271,12 @@ "walletSeed": { "message": "지갑 시드값" }, - "warning": { - "message": "경고" - }, "welcomeBack": { "message": "환ì˜í•©ë‹ˆë‹¤!" }, "welcome": { "message": "ë©”íƒ€ë§ˆìŠ¤í¬ Betaì— ì˜¤ì‹  ê²ƒì„ í™˜ì˜í•©ë‹ˆë‹¤" }, - "whatsThis": { - "message": "ì´ê²ƒì€ 무엇ì¸ê°€ìš”?" - }, "writePhrase": { "message": "ì´ êµ¬ë¬¸ì„ ì¢…ì´ì— ì¨ì„œ 안전한 ìž¥ì†Œì— ë³´ê´€í•˜ì„¸ìš”. 만약 ë‹¹ì‹ ì´ ë” ë†’ì€ ìˆ˜ì¤€ì˜ ë³´ì•ˆì„ ì›í•œë‹¤ë©´, ê·¸ê²ƒì„ ì—¬ëŸ¬ ìž¥ì˜ ì¢…ì´ì— ì ì–´ì„œ ê°ê° 2-3ê°œì˜ ë‹¤ë¥¸ ìœ„ì¹˜ì— ë³´ê´€í•˜ì„¸ìš”." }, @@ -1619,5 +1294,8 @@ }, "yourPrivateSeedPhrase": { "message": "ê°œì¸ ì‹œë“œ 구문" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "ê°€ì† ì‹œ 가스 비용 ì—†ìŒ" } } diff --git a/app/_locales/lt/messages.json b/app/_locales/lt/messages.json new file mode 100644 index 000000000000..00d1cdb7e332 --- /dev/null +++ b/app/_locales/lt/messages.json @@ -0,0 +1,1310 @@ +{ + "chartOnlyAvailableEth": { + "message": "Diagramos yra tik „Ethereum“ tinkluose." + }, + "contractInteraction": { + "message": "SutartinÄ— sÄ…veika" + }, + "reject": { + "message": "Atmesti" + }, + "about": { + "message": "Apie" + }, + "aboutSettingsDescription": { + "message": "Versija, palaikymo centras ir kontaktinÄ— informacija" + }, + "acceleratingATransaction": { + "message": "Operacijos paspartinimas naudojantis didesne dujų kaina padidina galimybes, kad ji bus greiÄiau apdorota tinkle, taÄiau tai ne visada garantuojama. " + }, + "accessingYourCamera": { + "message": "Kreipiamasi į kamerÄ…..." + }, + "account": { + "message": "Paskyra" + }, + "accountDetails": { + "message": "Paskyros informacija" + }, + "accountName": { + "message": "Paskyros pavadinimas" + }, + "accountOptions": { + "message": "Paskyros parinktys" + }, + "accountSelectionRequired": { + "message": "Jums reikia pasirinkti paskyrÄ…!" + }, + "activityLog": { + "message": "veiklos žurnalas" + }, + "addNetwork": { + "message": "PridÄ—ti tinklÄ…" + }, + "addRecipient": { + "message": "PridÄ—ti gavÄ—jÄ…" + }, + "advanced": { + "message": "IÅ¡plÄ—stiniai" + }, + "advancedSettingsDescription": { + "message": "Prieigos kÅ«rÄ—jo funkcijos, bÅ«senos žurnalų atsiuntimas, paskyros atstatymas, „testnet“ nustatymas ir pritaikytas RPC" + }, + "advancedOptions": { + "message": "IÅ¡plÄ—stinÄ—s parinktys" + }, + "addToAddressBook": { + "message": "PridÄ—ti į adresų knygelÄ™" + }, + "addToAddressBookModalPlaceholder": { + "message": "pvz., John D." + }, + "addAlias": { + "message": "PridÄ—ti alternatyvųjį vardÄ…" + }, + "addToken": { + "message": "PridÄ—ti žetonÄ…" + }, + "addTokens": { + "message": "PridÄ—ti žetonų" + }, + "addSuggestedTokens": { + "message": "PridÄ—ti siÅ«lomų žetonų" + }, + "addAcquiredTokens": { + "message": "PridÄ—kite žetonus, kuriuos gavote naudodamiesi „MetaMask“" + }, + "amount": { + "message": "Suma" + }, + "appDescription": { + "message": "„Ethereum“ piniginÄ— jÅ«sų narÅ¡yklÄ—je", + "description": "The description of the application" + }, + "appName": { + "message": "„MetaMask“", + "description": "The name of the application" + }, + "approve": { + "message": "Patvirtinti" + }, + "approved": { + "message": "Patvirtinta" + }, + "asset": { + "message": "Turtas" + }, + "attemptingConnect": { + "message": "MÄ—ginama prisijungti prie „blockchain“." + }, + "attemptToCancel": { + "message": "MÄ—ginti atÅ¡aukti?" + }, + "attemptToCancelDescription": { + "message": "Å is mÄ—ginimas negarantuoja, kad jÅ«sų pradinÄ— operacija bus atÅ¡aukta. Jeigu mÄ—ginimas atÅ¡aukti yra sÄ—kmingas, jums bus taikomas pirmiau minÄ—tas operacijos mokestis." + }, + "attributions": { + "message": "Požymiai" + }, + "autoLockTimeLimit": { + "message": "Automatinio atjungimo laikmatis (minutÄ—s)" + }, + "autoLockTimeLimitDescription": { + "message": "Nustatykite laukimo trukmÄ™ minutÄ—mis iki „MetaMask“ automatinio atsijungimo" + }, + "average": { + "message": "Vidurkis" + }, + "back": { + "message": "Grįžti" + }, + "backToAll": { + "message": "Atgal prie visų" + }, + "backupApprovalNotice": { + "message": "Pasidarykite atsarginÄ™ savo slapto atkÅ«rimo kodo kopijÄ…, kad jÅ«sų slaptažodinÄ— ir fondai bÅ«tų saugÅ«s." + }, + "backupApprovalInfo": { + "message": "Å is slaptas kodas reikalingas norint atkurti jÅ«sų slaptažodinÄ™, jeigu pamestumÄ—te savo įrenginį, pamirÅ¡tumÄ—te savo slaptažodį, iÅ¡ naujo įdiegtumÄ—te „MetaMask“, taip pat norint pasiekti slaptažodinÄ™ iÅ¡ kito įrenginio." + }, + "backupNow": { + "message": "Daryti atsarginÄ™ kopijÄ… dabar" + }, + "balance": { + "message": "Likutis" + }, + "balanceOutdated": { + "message": "Likutis gali bÅ«ti pasenÄ™s" + }, + "basic": { + "message": "Bendrieji" + }, + "blockExplorerUrl": { + "message": "Blokuoti narÅ¡yklÄ™" + }, + "blockExplorerView": { + "message": "PeržiÅ«rÄ—ti paskyrÄ… $1", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "„Blockies Identicon“ naudojimas" + }, + "browserNotSupported": { + "message": "JÅ«sų narÅ¡yklÄ— neatpažįstama..." + }, + "builtInCalifornia": { + "message": "„MetaMask“ suprojektuota ir įdiegta Kalifornijoje." + }, + "buyWithWyre": { + "message": "Pirkti ETH su „Wyre“" + }, + "buyWithWyreDescription": { + "message": "„Wyre“ leidžia naudotis kreditine kortele norint įneÅ¡ti ETH tiesiai į jÅ«sų „MetaMask“ paskyrÄ…." + }, + "buyCoinSwitch": { + "message": "Pirkti „CoinSwitch“" + }, + "buyCoinSwitchExplainer": { + "message": "„CoinSwitch“ – tai lengvai pasiekiama vieta keisti per 300 kriptovaliutų geriausiu santykiu." + }, + "bytes": { + "message": "Baitai" + }, + "off": { + "message": "IÅ¡jungta" + }, + "ok": { + "message": "Gerai" + }, + "on": { + "message": "Ä®jungta" + }, + "optionalBlockExplorerUrl": { + "message": "Blokuoti narÅ¡yklÄ—s URL (pasirinktinai)" + }, + "cancel": { + "message": "AtÅ¡aukti" + }, + "cancelAttempt": { + "message": "AtÅ¡aukti mÄ—ginimÄ…" + }, + "cancellationGasFee": { + "message": "Dujų mokesÄio atÅ¡aukimas" + }, + "cancelled": { + "message": "AtÅ¡aukta" + }, + "chainId": { + "message": "GrandinÄ—s ID" + }, + "clickToRevealSeed": { + "message": "SpustelÄ—kite Äia, kad atidengtumÄ—te slaptus žodžius" + }, + "close": { + "message": "Uždaryti" + }, + "chromeRequiredForHardwareWallets": { + "message": "NorÄ—dami prisijungti prie aparatinÄ—s įrangos slaptažodinÄ—s, „MetaMask“ naudokitÄ—s „Google Chrome“ narÅ¡yklÄ—je." + }, + "confirm": { + "message": "Patvirtinti" + }, + "confirmed": { + "message": "Patvirtinta" + }, + "confirmPassword": { + "message": "Patvirtinkite slaptažodį" + }, + "confirmSecretBackupPhrase": { + "message": "Patvirtinkite savo slaptÄ… atsarginÄ™ frazÄ™" + }, + "congratulations": { + "message": "Sveikiname" + }, + "connectHardwareWallet": { + "message": "Susieti aparatinÄ—s įrangos slaptažodinÄ™" + }, + "connect": { + "message": "Prisijungti" + }, + "connectingTo": { + "message": "Jungiamasi prie $1" + }, + "connectingToKovan": { + "message": "Jungiamasi prie „Kovan“ bandomojo tinklo" + }, + "connectingToMainnet": { + "message": "Jungiamasi prie pagrindinio „Ethereum“ tinklo" + }, + "connectingToRopsten": { + "message": "Jungiamasi prie „Ropsten“ bandomojo tinklo" + }, + "connectingToRinkeby": { + "message": "Jungiamasi prie „Rinkeby“ bandomojo tinklo" + }, + "connectingToLocalhost": { + "message": "Jungiamasi prie vietinio serverio 8545" + }, + "connectingToGoerli": { + "message": "Jungiamasi prie „Goerli“ bandomojo tinklo" + }, + "continueToWyre": { + "message": "TÄ™sti su „Wyre“" + }, + "continueToCoinSwitch": { + "message": "TÄ™sti su „CoinSwitch“" + }, + "contractDeployment": { + "message": "Sutarties iÅ¡dÄ—stymas" + }, + "copiedExclamation": { + "message": "Nukopijuota!" + }, + "copyAddress": { + "message": "Kopijuoti adresÄ… į iÅ¡karpinÄ™" + }, + "copyTransactionId": { + "message": "Kopijuoti operacijos ID" + }, + "copiedTransactionId": { + "message": "Nukopijuotas operacijos ID" + }, + "copyToClipboard": { + "message": "Kopijuoti į iÅ¡karpinÄ™" + }, + "copyPrivateKey": { + "message": "Tai yra jÅ«sų asmeninis raktas (spustelÄ—kite, kad nukopijuotumÄ—te)" + }, + "create": { + "message": "Sukurti" + }, + "createAccount": { + "message": "Sukurti paskyrÄ…" + }, + "createAWallet": { + "message": "Sukurti slaptažodinÄ™" + }, + "createPassword": { + "message": "Sukurti slaptažodį" + }, + "currencyConversion": { + "message": "Valiutos keitimas" + }, + "currentLanguage": { + "message": "DabartinÄ— kalba" + }, + "customGas": { + "message": "Pritaikyti dujas" + }, + "customGasSubTitle": { + "message": "Didinant mokestį gali mažėti apdorojimo trukmÄ—, bet tai negarantuojama." + }, + "customToken": { + "message": "Pritaikytas žetonas" + }, + "customRPC": { + "message": "Pritaikytas RPC" + }, + "decimalsMustZerotoTen": { + "message": "Turi bÅ«ti bent 0 skaitmenų po kablelio, bet ne daugiau kaip 36." + }, + "decimal": { + "message": "SkaiÄiai po kablelio" + }, + "defaultNetwork": { + "message": "Numatytasis „Ether“ operacijų tinklas yra pagrindinis tinklas." + }, + "delete": { + "message": "IÅ¡trinti" + }, + "deleteAccount": { + "message": "Å alinti paskyrÄ…" + }, + "deposit": { + "message": "IndÄ—lis" + }, + "depositEther": { + "message": "Ä®neÅ¡ti eterių" + }, + "details": { + "message": "IÅ¡sami informacija" + }, + "directDepositEther": { + "message": "Tiesiogiai įneÅ¡ti eteriai" + }, + "directDepositEtherExplainer": { + "message": "Jeigu jau turite Å¡iek tiek eterių, sparÄiausias bÅ«das gauti eterių į naujÄ… piniginÄ™ yra tiesioginis įnaÅ¡as." + }, + "done": { + "message": "Atlikta" + }, + "downloadGoogleChrome": { + "message": "AtsiunÄiama „Google Chrome“" + }, + "downloadSecretBackup": { + "message": "Atsisiųskite Å¡iÄ… saugos atsarginÄ™ frazÄ™ ir jÄ… saugiai laikykite Å¡ifruotame standžiajame diske arba laikmenoje." + }, + "downloadStateLogs": { + "message": "Atsisiųsti bÅ«senos žurnalus" + }, + "dontHaveAHardwareWallet": { + "message": "NÄ—ra aparatinÄ—s įrangos slaptažodinÄ—s?" + }, + "dropped": { + "message": "Numesta" + }, + "edit": { + "message": "Redaguoti" + }, + "editContact": { + "message": "Taisyti kontaktÄ…" + }, + "endOfFlowMessage1": { + "message": "JÅ«s perÄ—jote testÄ… – laikykite saugiai savo atkÅ«rimo frazÄ™, tai jÅ«sų atsakomybÄ—!" + }, + "endOfFlowMessage2": { + "message": "Patarimai, kaip saugiai laikyti" + }, + "endOfFlowMessage3": { + "message": "Ä®raÅ¡ykite atsarginÄ™ kopijÄ… keliose vietose." + }, + "endOfFlowMessage4": { + "message": "Niekam niekada nepasakykite Å¡ios frazÄ—s." + }, + "endOfFlowMessage5": { + "message": "SaugokitÄ—s informacijos vagių! „MetaMask“ niekada spontaniÅ¡kai neklaus jÅ«sų atkÅ«rimo frazÄ—s." + }, + "endOfFlowMessage6": { + "message": "Jeigu reikia dar kartÄ… padaryti jÅ«sų atkÅ«rimo frazÄ—s kopijÄ…, jÄ… galite rasti pasirinkÄ™ Nuostatos -> Sauga." + }, + "endOfFlowMessage7": { + "message": "Jeigu turite klausimų arba pastebite kÄ… nors įtartino, raÅ¡ykite el. paÅ¡tu support@metamask.io." + }, + "endOfFlowMessage8": { + "message": "„MetaMask“ negali atkurti jÅ«sų atkÅ«rimo frazÄ—s. Sužinokite daugiau." + }, + "endOfFlowMessage9": { + "message": "Sužinokite daugiau." + }, + "endOfFlowMessage10": { + "message": "Viskas atlikta" + }, + "ensRegistrationError": { + "message": "ENS pavadinimo registracijos klaida" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "ENS pavadinimas dabartiniame tinkle nerastas. MÄ—ginkite perjungti į pagrindinį „Ethereum“ tinklÄ…." + }, + "enterAnAlias": { + "message": "Ä®veskite alternatyvųjį vardÄ…" + }, + "enterPassword": { + "message": "Ä®veskite slaptažodį" + }, + "enterPasswordContinue": { + "message": "NorÄ—dami tÄ™sti, įveskite slaptažodį" + }, + "ethereumPublicAddress": { + "message": "„Ethereum“ vieÅ¡asis adresas" + }, + "etherscanView": { + "message": "PeržiÅ«rÄ—ti paskyrÄ… „Etherscan“ programoje" + }, + "estimatedProcessingTimes": { + "message": "Numatomos apdorojimo trukmÄ—s" + }, + "expandView": { + "message": "IÅ¡skleisti rodinį" + }, + "exportPrivateKey": { + "message": "Eksportuoti asmeninį raktÄ…" + }, + "failed": { + "message": "Nepavyko" + }, + "fast": { + "message": "Greitas" + }, + "faster": { + "message": "GreiÄiau" + }, + "fiat": { + "message": "StandartinÄ— valiuta", + "description": "Exchange type" + }, + "fileImportFail": { + "message": "Failo importavimas neveikia? SpustelÄ—kite Äia!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "PamirÅ¡ti šį įrenginį" + }, + "from": { + "message": "Nuo" + }, + "functionType": { + "message": "Funkcijos tipas" + }, + "gasLimit": { + "message": "Dujų apribojimas" + }, + "gasLimitInfoModalContent": { + "message": "Dujų apribojimas yra maksimalus dujų vienetų, kuriuos pageidaujate iÅ¡leisti, skaiÄius." + }, + "gasLimitTooLow": { + "message": "Dujų apribojimas turi bÅ«ti bent 21000" + }, + "gasUsed": { + "message": "Sunaudotos dujos" + }, + "gasPrice": { + "message": "Dujų kaina (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "Dujų kaina ypatingai maža" + }, + "gasPriceInfoModalContent": { + "message": "Dujų kaina nurodo eterių sumÄ…, kuriÄ… pageidaujate sumokÄ—ti už kiekvienÄ… dujų vienetÄ…." + }, + "gasPriceNoDenom": { + "message": "Dujų kaina" + }, + "general": { + "message": "Bendra" + }, + "generalSettingsDescription": { + "message": "Valiutos keitimas, pagrindinÄ— valiuta, kalba, „blockies identicon“" + }, + "getEther": { + "message": "Gauti eterių" + }, + "getEtherFromFaucet": { + "message": "Gaukite eterių iÅ¡ Äiaupo $1", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "Gaukite pagalbos." + }, + "getStarted": { + "message": "Darbo pradžia" + }, + "happyToSeeYou": { + "message": "DžiaugiamÄ—s jus matydami." + }, + "hardware": { + "message": "aparatinÄ— įranga" + }, + "hardwareWalletConnected": { + "message": "AparatinÄ—s įrangos slaptažodinÄ— susieta" + }, + "hardwareWallets": { + "message": "Susieti aparatinÄ—s įrangos slaptažodinÄ™" + }, + "hardwareWalletsMsg": { + "message": "Pasirinkite aparatinÄ—s įrangos slaptažodinÄ™, kuriÄ… pageidaujate naudoti su „MetaTask“" + }, + "havingTroubleConnecting": { + "message": "Kyla problemų susiejant?" + }, + "here": { + "message": "Äia", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hexData": { + "message": "Å eÅ¡ioliktainiai duomenys" + }, + "hide": { + "message": "SlÄ—pti" + }, + "hideTokenPrompt": { + "message": "SlÄ—pti prieigos raktÄ…?" + }, + "history": { + "message": "Istorija" + }, + "import": { + "message": "Importuoti", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "Importuoti paskyrÄ…" + }, + "importAccountMsg": { + "message": "Importuotos paskyros nebus susietos su pirmiau sukurta „MetaMask“ paskyros atkÅ«rimo fraze. Sužinokite daugiau apie importuotas paskyras" + }, + "importAccountSeedPhrase": { + "message": "Importuoti paskyrÄ… su atkÅ«rimo fraze" + }, + "importWallet": { + "message": "Importuoti slaptažodinÄ™" + }, + "importYourExisting": { + "message": "Importuoti turimÄ… piniginÄ™ naudojant 12 žodžių atkÅ«rimo frazÄ™" + }, + "imported": { + "message": "Importuota", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "Importuoti naudojant paskyros atkÅ«rimo frazÄ™" + }, + "infoHelp": { + "message": "Informacija ir žinynas" + }, + "initialTransactionConfirmed": { + "message": "JÅ«sų pradinÄ— operacija patvirtinta tinkle. NorÄ—dami grįžti, spustelÄ—kite „Gerai“." + }, + "insufficientBalance": { + "message": "Nepakankamas likutis." + }, + "insufficientFunds": { + "message": "Nepakanka lėšų." + }, + "insufficientTokens": { + "message": "Nepakanka žetonų." + }, + "invalidAddress": { + "message": "Netinkamas adresas" + }, + "invalidAddressRecipient": { + "message": "GavÄ—jo adresas netinkamas" + }, + "knownAddressRecipient": { + "message": "Žinomas sutarties adresas." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "Ne ETH tinklas, nustatykite į mažąsias raides" + }, + "invalidInput": { + "message": "Netinkama įvestis." + }, + "invalidRPC": { + "message": "Netinkamas RPC URL" + }, + "invalidBlockExplorerURL": { + "message": "Netinkamas Block Explorer URL" + }, + "invalidSeedPhrase": { + "message": "Netinkama atkÅ«rimo frazÄ—" + }, + "jsonFile": { + "message": "JSON failas", + "description": "format for importing an account" + }, + "kovan": { + "message": "„Kovan“ bandomasis tinklas" + }, + "max": { + "message": "Maks." + }, + "learnMore": { + "message": "Sužinokite daugiau" + }, + "ledgerAccountRestriction": { + "message": "PrieÅ¡ įtraukdami naujÄ…, turite pasinaudoti paskutine paskyra." + }, + "letsGoSetUp": { + "message": "Taip, pradÄ—kime!" + }, + "likeToAddTokens": { + "message": "Ar norÄ—tumÄ—te pridÄ—ti Å¡iuos žetonus?" + }, + "links": { + "message": "Nuorodos" + }, + "liveGasPricePredictions": { + "message": "Tiesioginiai dujų kainos spÄ—jimai" + }, + "loading": { + "message": "Ä®keliama..." + }, + "loadingTokens": { + "message": "Ä®keliami žetonai..." + }, + "loadMore": { + "message": "Ä®kelti daugiau" + }, + "localhost": { + "message": "Vietinis serveris 8545" + }, + "lock": { + "message": "Atsijungti" + }, + "mainnet": { + "message": "Pagrindinis „Ethereum“ tinklas" + }, + "memorizePhrase": { + "message": "Ä®siminti Å¡iÄ… frazÄ™." + }, + "memo": { + "message": "pastaba" + }, + "message": { + "message": "PraneÅ¡imas" + }, + "metamaskDescription": { + "message": "Prijungiame jus prie „Ethereum“ ir decentralizuotojo žiniatinklio." + }, + "metamaskVersion": { + "message": "„MetaMask“ versija" + }, + "mobileSyncText": { + "message": "Ä®veskite savo slaptažodį, kad patvirtintumÄ—te, jog tai tikrai jÅ«s!" + }, + "myAccounts": { + "message": "Mano paskyros" + }, + "myWalletAccounts": { + "message": "Mano piniginÄ—s paskyros" + }, + "myWalletAccountsDescription": { + "message": "Visos jÅ«sų „MetaMask“ sukurtos paskyros bus automatiÅ¡kai įtrauktos į šį skyrių." + }, + "mustSelectOne": { + "message": "Turite pasirinkti bent 1 žetonÄ…." + }, + "needEtherInWallet": { + "message": "NorÄ—dami dirbti su decentralizuotomis programomis „MetaMask“, savo piniginÄ—je turite turÄ—ti eterių." + }, + "needImportFile": { + "message": "Turite pasirinkti failÄ…, kurį pageidaujate importuoti.", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "Neigiamų ETH sumų siųsti negalima." + }, + "networkName": { + "message": "Tinklo pavadinimas" + }, + "networks": { + "message": "Tinklai" + }, + "networkSettingsDescription": { + "message": "Ä®traukti ir redaguoti tinkintus RPC tinklus" + }, + "nevermind": { + "message": "Nekreipti dÄ—mesio" + }, + "newAccount": { + "message": "Nauja paskyra" + }, + "newAccountDetectedDialogMessage": { + "message": "Aptiktas naujas adresas! SpustelÄ—kite Äia, kad įtrauktumÄ—te į savo adresų knygelÄ™." + }, + "newAccountNumberName": { + "message": "Paskyra $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "Naujas kontaktas" + }, + "newContract": { + "message": "Nauja sutartis" + }, + "newPassword": { + "message": "Naujas slaptažodis (bent 8 ženklai)" + }, + "newNetwork": { + "message": "Naujas tinklas" + }, + "newToMetaMask": { + "message": "Tik pradedate naudotis „MetaMask“?" + }, + "noAlreadyHaveSeed": { + "message": "Ne, jau turiu atkÅ«rimo frazÄ™." + }, + "protectYourKeys": { + "message": "Apsaugokite savo raktus!" + }, + "protectYourKeysMessage1": { + "message": "Saugokite savo atkÅ«rimo frazÄ™ – gavome praneÅ¡imų apie interneto svetaines, kuriomis bandoma imituoti „MetaMask“. „MetaMask“ niekada nepraÅ¡ys jÅ«sų pateikti savo atkÅ«rimo frazÄ™!" + }, + "protectYourKeysMessage2": { + "message": "Saugokite savo frazÄ™. Jei pastebÄ—jote kažkÄ… įtartino arba nesate tikri dÄ—l svetainÄ—s, raÅ¡ykite mums adresu support@metamask.io" + }, + "rpcUrl": { + "message": "Naujas RPC URL" + }, + "optionalChainId": { + "message": "GrandinÄ—s ID (nebÅ«tinas)" + }, + "optionalSymbol": { + "message": "Simbolis (nebÅ«tinas)" + }, + "newTotal": { + "message": "Nauja bendra suma" + }, + "newTransactionFee": { + "message": "Naujas operacijos mokestis" + }, + "next": { + "message": "Toliau" + }, + "noAddressForName": { + "message": "Å iam pavadinimui nenurodytas adresas." + }, + "noConversionRateAvailable": { + "message": "NÄ—ra keitimo kurso" + }, + "noTransactions": { + "message": "Neturite jokių operacijų" + }, + "notEnoughGas": { + "message": "Nepakanka dujų" + }, + "noWebcamFoundTitle": { + "message": "InternetinÄ— vaizdo kamera nerasta" + }, + "noWebcamFound": { + "message": "JÅ«sų kompiuterio vaizdo kamera nerasta. Bandykite dar kartÄ…." + }, + "ofTextNofM": { + "message": "nuo" + }, + "orderOneHere": { + "message": "Užsisakykite „Trezor“ arba „Ledger“ ir laikykite savo lÄ—Å¡as Å¡altojoje saugykloje" + }, + "origin": { + "message": "KilmÄ—" + }, + "parameters": { + "message": "Parametrai" + }, + "participateInMetaMetrics": { + "message": "Dalyvaukite „MetaMetrics“" + }, + "participateInMetaMetricsDescription": { + "message": "Dalyvaukite „MetaMetrics“ ir padÄ—kite mums tobulinti „MetaMask“" + }, + "password": { + "message": "Slaptažodis" + }, + "passwordsDontMatch": { + "message": "Slaptažodžiai nesutampa" + }, + "passwordNotLongEnough": { + "message": "Slaptažodis per trumpas" + }, + "pastePrivateKey": { + "message": "ÄŒia įklijuokite asmeninio rakto eilutÄ™:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "laukiama patvirtinimo" + }, + "personalAddressDetected": { + "message": "Aptiktas asmeninis adresas. Ä®veskite žetono sutarties adresÄ…." + }, + "prev": { + "message": "PeržiÅ«ra" + }, + "primaryCurrencySetting": { + "message": "PagrindinÄ— valiuta" + }, + "primaryCurrencySettingDescription": { + "message": "RinkitÄ—s vietinÄ™, kad vertÄ—s pirmiausia bÅ«tų rodomos vietine grandinÄ—s valiuta (pvz., ETH). RinkitÄ—s standartinÄ™, kad vertÄ—s pirmiausia bÅ«tų rodomos jÅ«sų pasirinkta standartine valiuta." + }, + "privacyMsg": { + "message": "Privatumo politika" + }, + "privateKey": { + "message": "Asmeninis raktas", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "DÄ—mesio. Niekada neatskleiskite Å¡io rakto kitiems. Bet kuris jÅ«sų asmeninius raktus turintis asmuo gali pavogti bet kokį jÅ«sų paskyroje laikomÄ… turtÄ…." + }, + "privateNetwork": { + "message": "Privatus tinklas" + }, + "queue": { + "message": "EilÄ—" + }, + "readdToken": { + "message": "Šį žetonÄ… galite bet kada galite įtraukti ir vÄ—l, tiesiog savo paskyros parinkÄių meniu nueikite į „Įtraukti žetoną“." + }, + "recents": { + "message": "Naujausi" + }, + "recipientAddress": { + "message": "GavÄ—jo adresas" + }, + "recipientAddressPlaceholder": { + "message": "IeÅ¡ka, vieÅ¡ieji adresai (0x) arba ENS" + }, + "rejectAll": { + "message": "Atmesti viskÄ…" + }, + "rejectTxsN": { + "message": "Atmesti $1 operac." + }, + "rejectTxsDescription": { + "message": "Vienu metu atmesite $1 operac." + }, + "rejected": { + "message": "Atmesta" + }, + "reset": { + "message": "Nustatyti iÅ¡ naujo" + }, + "resetAccount": { + "message": "Atkurti paskyrÄ…" + }, + "resetAccountDescription": { + "message": "AtkÅ«rus paskyrÄ…, jÅ«sų operacijų istorija bus iÅ¡valyta." + }, + "deleteNetwork": { + "message": "Panaikinti tinklÄ…?" + }, + "deleteNetworkDescription": { + "message": "Ar tikrai norite panaikinti šį tinklÄ…?" + }, + "remindMeLater": { + "message": "Priminti vÄ—liau" + }, + "restoreFromSeed": { + "message": "Atkurti paskyrÄ…?" + }, + "restoreAccountWithSeed": { + "message": "Atkurti paskyrÄ… naudojant atkÅ«rimo frazÄ™" + }, + "requestsAwaitingAcknowledgement": { + "message": "patvirtinimo laukianÄios užklausos" + }, + "required": { + "message": "Reikalaujama" + }, + "restore": { + "message": "Atkurti" + }, + "revealSeedWords": { + "message": "Atskleisti atkÅ«rimo žodžius" + }, + "revealSeedWordsTitle": { + "message": "AtkÅ«rimo frazÄ—" + }, + "revealSeedWordsDescription": { + "message": "Jei imsite naudotis kita narÅ¡ykle arba kitu kompiuteriu, Å¡ios atkÅ«rimo frazÄ—s jums reikÄ—s paskyroms pasiekti. Saugokite jÄ… saugioje ir slaptoje vietoje." + }, + "revealSeedWordsWarningTitle": { + "message": "Å ia fraze su niekuo NESIDALINKITE!" + }, + "revealSeedWordsWarning": { + "message": "Å iuos žodžius galima panaudoti visoms jÅ«sų paskyroms pavogti." + }, + "remove": { + "message": "PaÅ¡alinti" + }, + "removeAccount": { + "message": "PaÅ¡alinti paskyrÄ…" + }, + "removeAccountDescription": { + "message": "Å i paskyra bus paÅ¡alinta iÅ¡ jÅ«sų piniginÄ—s. PrieÅ¡ tÄ™sdami įsitikinkite, kad turite Å¡ios importuotos paskyros pradinÄ™ atkÅ«rimo frazÄ™ arba asmeninį raktÄ…. Paskyras importuoti ir vÄ—l susikurti galite paskyros iÅ¡skleidžiamajame meniu." + }, + "readyToConnect": { + "message": "PasirengÄ™ prisijungti?" + }, + "rinkeby": { + "message": "„Rinkeby“ bandomasis tinklas" + }, + "ropsten": { + "message": "„Ropsten“ bandomasis tinklas" + }, + "goerli": { + "message": "„Goerli“ bandomasis tinklas" + }, + "save": { + "message": "IÅ¡saugoti" + }, + "slow": { + "message": "LÄ—tas" + }, + "slower": { + "message": "LÄ—Äiau" + }, + "saveAsCsvFile": { + "message": "Ä®raÅ¡yti kaip CSV failÄ…" + }, + "scanInstructions": { + "message": "Laikykite QR kodÄ… prieÅ¡ais kamerÄ…" + }, + "scanQrCode": { + "message": "Nuskaityti QR kodÄ…" + }, + "search": { + "message": "IeÅ¡koti" + }, + "searchResults": { + "message": "PaieÅ¡kos rezultatai" + }, + "secretBackupPhrase": { + "message": "Slapta atsarginÄ— frazÄ—" + }, + "secretBackupPhraseDescription": { + "message": "JÅ«sų slapta atsarginÄ— frazÄ— leidžia paprastai padaryti paskyros atsarginÄ™ kopijÄ… ir jÄ… atkurti," + }, + "secretBackupPhraseWarning": { + "message": "Ä®SPÄ–JIMAS. Niekada neatskleiskite savo atsarginÄ—s frazÄ—s. Bet kas, žinantis Å¡iÄ… frazÄ™, gali visiems laikams pasiimti jÅ«sų eterius." + }, + "secretPhrase": { + "message": "Savo saugyklai atkurti įveskite slaptÄ… dvylikos žodžių frazÄ™." + }, + "securityAndPrivacy": { + "message": "Sauga ir privatumas" + }, + "securitySettingsDescription": { + "message": "Privatumo nuostatos ir slaptažodinÄ—s atkÅ«rimo frazÄ—" + }, + "seedPhrasePlaceholder": { + "message": "KiekvienÄ… žodį atskirkite viengubu tarpu" + }, + "seedPhraseReq": { + "message": "AtkÅ«rimo frazÄ—s yra 12 žodžių ilgio" + }, + "selectCurrency": { + "message": "Pasirinkite valiutÄ…" + }, + "selectEachPhrase": { + "message": "Pasirinkite kiekvienÄ… frazÄ™, kad patikrintumÄ—te, ar ji tinkama" + }, + "selectLocale": { + "message": "Pasirinkite lokalÄ™" + }, + "selectType": { + "message": "Pasirinkti tipÄ…" + }, + "send": { + "message": "Siųsti" + }, + "sendAmount": { + "message": "Siųsti sumÄ…" + }, + "sendETH": { + "message": "Siųsti ETH" + }, + "sendTokens": { + "message": "Siųsti žetonus" + }, + "sentEther": { + "message": "siųsti eterių" + }, + "sentTokens": { + "message": "iÅ¡siųsti žetonai" + }, + "separateEachWord": { + "message": "KiekvienÄ… žodį atskirkite viengubu tarpu" + }, + "searchTokens": { + "message": "IeÅ¡koti žetonų" + }, + "selectAnAccount": { + "message": "Pasirinkite paskyrÄ…" + }, + "selectAnAccountHelp": { + "message": "Pasirinkite paskyrÄ… peržiÅ«rÄ—ti „MetaMask“" + }, + "selectAHigherGasFee": { + "message": "Pasirinkite didesnį dujų mokestį, kad paspartintumÄ—te savo operacijos apdorojimÄ….*" + }, + "selectHdPath": { + "message": "Pasirinkite HD keliÄ…" + }, + "selectPathHelp": { + "message": "Jeigu toliau nematote savo esamų operacijų sÄ…skaitų, mÄ—ginkite pakeisti kelius į „Legacy (MEW / MyCrypto)“" + }, + "settings": { + "message": "Nustatymai" + }, + "showAdvancedGasInline": { + "message": "IÅ¡plÄ—stiniai dujų valdikliai" + }, + "showAdvancedGasInlineDescription": { + "message": "Pasirinkite tai, kad bÅ«tų rodoma dujų kaina, ir ribokite valdymo elementus tiesiogiai siuntimo ir patvirtinimo ekranuose." + }, + "showFiatConversionInTestnets": { + "message": "Rodyti keitimÄ… „Testnet“" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Pasirinkite tai, kad bÅ«tų rodomas standartinÄ—s valiutos keitimas „Testnet“ programoje" + }, + "showPrivateKeys": { + "message": "Rodyti asmeninius raktus" + }, + "showHexData": { + "message": "Rodyti Å¡eÅ¡ioliktainius duomenis" + }, + "showHexDataDescription": { + "message": "Pasirinkite tai, kad siuntimo ekrane bÅ«tų rodomas Å¡eÅ¡ioliktainių duomenų laukas" + }, + "sign": { + "message": "Prisijunkite" + }, + "signatureRequest": { + "message": "ParaÅ¡o užklausa" + }, + "signed": { + "message": "PasiraÅ¡yta" + }, + "signNotice": { + "message": "PasiraÅ¡ant šį praneÅ¡imÄ… gali bÅ«ti \npavojingų Å¡alutinių efektų. PasiraÅ¡ykite tik praneÅ¡imus iÅ¡ vietų,\nkuriomis visiÅ¡kai pasitikite su visomis savo paskyromis.\nÅ is pavojingas bÅ«das bus paÅ¡alintas ateities versijoje. " + }, + "sigRequest": { + "message": "ParaÅ¡o užklausa" + }, + "somethingWentWrong": { + "message": "Vaje! Kažkas negerai." + }, + "speedUp": { + "message": "Paspartinti" + }, + "speedUpCancellation": { + "message": "Pagreitinti šį atÅ¡aukimÄ…" + }, + "speedUpTransaction": { + "message": "Paspartinti Å¡iÄ… operacijÄ…" + }, + "switchNetworks": { + "message": "Perjungti tinklus" + }, + "stateLogs": { + "message": "BÅ«senos žurnalai" + }, + "stateLogsDescription": { + "message": "BÅ«senos žurnaluose yra jÅ«sų vieÅ¡os paskyros adresų ir iÅ¡siųstų operacijų." + }, + "stateLogError": { + "message": "Klaida gaunant bÅ«senos žurnalus." + }, + "step1HardwareWallet": { + "message": "1. Prijunkite aparatinÄ—s įrangos slaptažodinÄ™" + }, + "step1HardwareWalletMsg": { + "message": "Prijunkite savo aparatinÄ—s įrangos slaptažodinÄ™ tiesiogiai prie savo kompiuterio." + }, + "step2HardwareWallet": { + "message": "2. Pasirinkite paskyrÄ…" + }, + "step2HardwareWalletMsg": { + "message": "Pasirinkite norimÄ… peržiÅ«rÄ—ti sÄ…skaitÄ…. Vienu metu galima rinktis tik vienÄ…." + }, + "step3HardwareWallet": { + "message": "3. PradÄ—kite naudoti decentralizuotas programas ir daugiau!" + }, + "step3HardwareWalletMsg": { + "message": "NaudokitÄ—s savo aparatinÄ—s įrangos paskyra kaip „Ethereum“ paskyra. JunkitÄ—s prie decentralizuotų programų, siųskite eterius, pirkite ir laikykite ERC20 žetonus ir nekeiÄiamus žetonus, tokius kaip „CryptoKitties“." + }, + "storePhrase": { + "message": "Laikykite Å¡iÄ… frazÄ™ slaptažodžių tvarkyklÄ—je kaip 1 slaptažodį." + }, + "submitted": { + "message": "Pateikta" + }, + "supportCenter": { + "message": "Apsilankykite mÅ«sų pagalbos centre" + }, + "symbol": { + "message": "Simbolis" + }, + "symbolBetweenZeroTwelve": { + "message": "Simbolis turi bÅ«ti ne ilgesnis nei 11 simbolių." + }, + "syncWithMobile": { + "message": "Sinchronizuoti su mobiliuoju" + }, + "syncWithMobileTitle": { + "message": "Sinchronizuoti su mobiliuoju" + }, + "syncWithMobileDesc": { + "message": "Galite sinchronizuoti paskyrÄ… ir informacijÄ… su savo mobiliuoju įrenginiu. Atverkite „MetaMask“ mobiliÄ…jÄ… programÄ…, eikite į „Nuostatos“ ir palieskite „Sinchronizuoti iÅ¡ narÅ¡yklÄ—s plÄ—tinio“" + }, + "syncWithMobileDescNewUsers": { + "message": "Jeigu „MetaMask“ mobiliÄ…jÄ… programÄ… atveriate tik pirmÄ… kartÄ…, tiesiog sekite veiksmus telefone." + }, + "syncWithMobileScanThisCode": { + "message": "Nuskaitykite šį kodÄ… su savo „MetaMask“ mobiliÄ…ja programa" + }, + "syncWithMobileBeCareful": { + "message": "PasirÅ«pinkite, kad jums nuskaitant šį kodÄ… niekas nežiÅ«rÄ—tų į jÅ«sų ekranÄ…." + }, + "syncWithMobileComplete": { + "message": "JÅ«sų duomenys sÄ—kmingai sinchronizuoti. MÄ—gaukitÄ—s „MetaMask“ mobiliÄ…ja programa! " + }, + "terms": { + "message": "Naudojimo sÄ…lygos" + }, + "testFaucet": { + "message": "Testuoti ÄiaupÄ…" + }, + "thisWillCreate": { + "message": "Bus sukurta nauja slaptažodinÄ— ir atkÅ«rimo frazÄ—" + }, + "tips": { + "message": "Arbatpinigiai" + }, + "to": { + "message": "Iki" + }, + "token": { + "message": "Žetonas" + }, + "tokenAlreadyAdded": { + "message": "Žetonas jau pridÄ—tas." + }, + "tokenContractAddress": { + "message": "Žetono kontaktinis adresas" + }, + "tokenSymbol": { + "message": "Žetono ženklas" + }, + "total": { + "message": "IÅ¡ viso" + }, + "transaction": { + "message": "operacija" + }, + "transactionConfirmed": { + "message": "Operacijos patvirtinimas $2." + }, + "transactionCreated": { + "message": "Operacija sukurta $2 su $1 verte." + }, + "transactionDropped": { + "message": "Operacija numesta prie$2." + }, + "transactionSubmitted": { + "message": "Operacija pateikta $2 su $1 dujų mokesÄiu." + }, + "transactionResubmitted": { + "message": "Operacija pakartotinai pateikta$2 su iki $1 padidintu dujų mokesÄiu" + }, + "transactionUpdated": { + "message": "Operacija atnaujinta$2." + }, + "transactionErrored": { + "message": "Ä®vyko operacijos klaida" + }, + "transactionCancelAttempted": { + "message": "OperacijÄ… mÄ—ginta atÅ¡aukti $2 su $1 dujų mokesÄiu" + }, + "transactionCancelSuccess": { + "message": "Operacija sÄ—kmingai atÅ¡aukta $2" + }, + "transactionError": { + "message": "Operacijos klaida. Sutarties kodo numetimo iÅ¡imtis." + }, + "transactionErrorNoContract": { + "message": "MÄ—ginama iÅ¡kviesti funkcijÄ… nekontaktiniu adresu." + }, + "transactionFee": { + "message": "Operacijos mokestis" + }, + "transactionTime": { + "message": "Operacijos laikas" + }, + "transfer": { + "message": "Pervesti" + }, + "transferBetweenAccounts": { + "message": "PerkÄ—limas tarp savo paskyrų" + }, + "transferFrom": { + "message": "Pervedimas iÅ¡" + }, + "troubleTokenBalances": { + "message": "Susidurta su sunkumais įkeliant jÅ«sų žetonų likuÄius. Galite juos peržiÅ«rÄ—ti ", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "Bandyti dar kartÄ…" + }, + "typePassword": { + "message": "Ä®veskite savo „MetaMask“ slaptažodį" + }, + "unapproved": { + "message": "Nepatvirtinta" + }, + "units": { + "message": "vienetai" + }, + "unknown": { + "message": "Nežinoma" + }, + "unknownNetwork": { + "message": "Nežinomas privatusis tinklas" + }, + "unknownQrCode": { + "message": "Klaida: negalime identifikuoti Å¡io QR kodo" + }, + "unknownCameraErrorTitle": { + "message": "Vaje! Kažkas negerai..." + }, + "unknownCameraError": { + "message": "Kreipiantis į jÅ«sų kamerÄ… iÅ¡kilo problema. Bandykite dar kartÄ…..." + }, + "unlock": { + "message": "Atrakinti" + }, + "unlockMessage": { + "message": "LaukianÄios decentralizuotos svetainÄ—s" + }, + "updatedWithDate": { + "message": "Atnaujinta $1" + }, + "urlErrorMsg": { + "message": "URI reikia atitinkamo HTTP/HTTPS prieÅ¡dÄ—lio." + }, + "usedByClients": { + "message": "Naudojama daugelio skirtingų klientų" + }, + "userName": { + "message": "Vartotojo vardas" + }, + "viewAccount": { + "message": "ŽiÅ«rÄ—ti paskyrÄ…" + }, + "viewinExplorer": { + "message": "PeržiÅ«rÄ—ti narÅ¡yklÄ—je" + }, + "viewContact": { + "message": "PeržiÅ«rÄ—ti kontaktÄ…" + }, + "viewOnCustomBlockExplorer": { + "message": "PeržiÅ«rÄ—ti $1" + }, + "viewOnEtherscan": { + "message": "PeržiÅ«rÄ—ti „Etherscan“" + }, + "visitWebSite": { + "message": "Apsilankykite mÅ«sų svetainÄ—je" + }, + "walletSeed": { + "message": "SlaptažodinÄ—s atkÅ«rimo frazÄ—" + }, + "welcomeBack": { + "message": "Sveiki sugrįžę!" + }, + "welcome": { + "message": "Sveiki, tai „MetaMask“" + }, + "writePhrase": { + "message": "UžraÅ¡ykite Å¡iÄ… frazÄ™ ant lapelio ir laikykite jÄ… saugioje vietoje. Jeigu pageidaujate dar daugiau saugos, užraÅ¡ykite jÄ… ant kelių lapelių ir 2 ar 3 skirtingose vietose." + }, + "yesLetsTry": { + "message": "Taip, mÄ—ginkime" + }, + "youNeedToAllowCameraAccess": { + "message": "Norint naudotis Å¡ia funkcija, reikia leisti prieigÄ… prie kameros.." + }, + "yourSigRequested": { + "message": "PraÅ¡oma jÅ«sų paraÅ¡o" + }, + "youSign": { + "message": "PasiraÅ¡ote" + }, + "yourPrivateSeedPhrase": { + "message": "JÅ«sų asmeninÄ— atkÅ«rimo frazÄ—" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "Nustatykite nulinÄ™ dujų kainÄ… greitÄ—jant" + } +} diff --git a/app/_locales/lv/messages.json b/app/_locales/lv/messages.json new file mode 100644 index 000000000000..7d2906c49582 --- /dev/null +++ b/app/_locales/lv/messages.json @@ -0,0 +1,1306 @@ +{ + "chartOnlyAvailableEth": { + "message": "Grafiks pieejams vienÄ«gi Ethereum tÄ«klos." + }, + "contractInteraction": { + "message": "LÄ«guma mijiedarbÄ«bas" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "reject": { + "message": "NoraidÄ«t" + }, + "about": { + "message": "Par" + }, + "aboutSettingsDescription": { + "message": "Versija, atbalsta centrs un kontaktinformÄcija" + }, + "acceleratingATransaction": { + "message": "* DarÄ«juma paÄtrinÄÅ¡ana, izmantojot augstÄku Gas cenu, palielina iespÄ“ju, ka tÄ«kls to apstrÄdÄs ÄtrÄk, taÄu tas nav garantÄ“ts." + }, + "accessingYourCamera": { + "message": "Piekļūst kamerai..." + }, + "account": { + "message": "Konts" + }, + "accountDetails": { + "message": "Konta informÄcija" + }, + "accountName": { + "message": "Konta nosaukums" + }, + "accountOptions": { + "message": "Konta opcijas" + }, + "accountSelectionRequired": { + "message": "Jums jÄatlasa konts!" + }, + "activityLog": { + "message": "darbÄ«bu žurnÄls" + }, + "addNetwork": { + "message": "Pievienot tÄ«klu" + }, + "addRecipient": { + "message": "Pievienot saņēmÄ“ju" + }, + "advanced": { + "message": "Papildu" + }, + "advancedSettingsDescription": { + "message": "Piekļūstiet izstrÄdÄtÄju funkcijÄm, lejupielÄdÄ“jiet stÄvokļu žurnÄlus, atiestatiet kontu, iestatiet testa tÄ«klus un pielÄgotos RPC izsaukumus" + }, + "advancedOptions": { + "message": "Papildu opcijas" + }, + "addToAddressBook": { + "message": "Pievienot adreÅ¡u grÄmatai" + }, + "addToAddressBookModalPlaceholder": { + "message": "piemÄ“ram, Džons D." + }, + "addAlias": { + "message": "Pievienot segvÄrdu" + }, + "addToken": { + "message": "Pievienot žetonu" + }, + "addTokens": { + "message": "Pievienot marÄ·ierus" + }, + "addSuggestedTokens": { + "message": "Pievienot ieteiktos marÄ·ierus" + }, + "addAcquiredTokens": { + "message": "Pievienojiet marÄ·ierus, ko ieguvÄt, izmantojot MetaMask" + }, + "amount": { + "message": "Apjoms" + }, + "appDescription": { + "message": "Ethereum maks pÄrlÅ«kÄ", + "description": "The description of the application" + }, + "approve": { + "message": "ApstiprinÄt" + }, + "approved": { + "message": "ApstiprinÄts" + }, + "asset": { + "message": "AktÄ«vs" + }, + "attemptingConnect": { + "message": "Mēģina izveidot savienojumu ar bloku Ä·Ä“di." + }, + "attemptToCancel": { + "message": "Vai mēģinÄt atcelt?" + }, + "attemptToCancelDescription": { + "message": "Å Ä« mēģinÄjuma iesniegÅ¡ana negarantÄ“ sÄkotnÄ“jÄ darÄ«juma atcelÅ¡anu. Ja atcelÅ¡anas mēģinÄjums izdosies, no jums tiks pieprasÄ«ta iepriekÅ¡ norÄdÄ«tÄ darÄ«juma nodeva." + }, + "attributions": { + "message": "AtribÅ«ti" + }, + "autoLockTimeLimit": { + "message": "AutomÄtiskÄs izrakstīšanÄs taimeris (minÅ«tes)" + }, + "autoLockTimeLimitDescription": { + "message": "Iestatiet bezdarbÄ«bas laiku minÅ«tÄ“s, pÄ“c kura MetaMask veiks automÄtisku izrakstīšanu" + }, + "average": { + "message": "VidÄ“ji" + }, + "back": { + "message": "Atpakaļ" + }, + "backToAll": { + "message": "Atgriezties pie visiem" + }, + "backupApprovalNotice": { + "message": "DublÄ“jiet savu slepeno atgūšanas kodu, lai maks un lÄ«dzekļi atrastos drošībÄ." + }, + "backupApprovalInfo": { + "message": "Å is slepenais kods ir nepiecieÅ¡ams, lai atjaunotu jÅ«su maku, ja pazaudÄ“jat ierÄ«ci, aizmirstat paroli, jÄpÄrinstalÄ“ MetaMask vai vÄ“laties piekļūt makam no citas ierÄ«ces." + }, + "backupNow": { + "message": "DublÄ“t tagad" + }, + "balance": { + "message": "Bilance" + }, + "balanceOutdated": { + "message": "Bilance var nebÅ«t aktuÄla" + }, + "basic": { + "message": "Pamata" + }, + "blockExplorerUrl": { + "message": "BloÄ·Ä“t Explorer" + }, + "blockExplorerView": { + "message": "SkatÄ«t kontu $1", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "Izmantot blok indentifikatoru" + }, + "browserNotSupported": { + "message": "JÅ«su pÄrlÅ«kprogramma netiek atbalstÄ«ta..." + }, + "builtInCalifornia": { + "message": "MetaMask ir izstrÄdÄta un izveidota KalifornijÄ." + }, + "buyWithWyre": { + "message": "Pirkt ETH ar Wyre" + }, + "buyWithWyreDescription": { + "message": "Wyre ļauj noguldÄ«t ETH tieÅ¡i jÅ«su MetaMask kontÄ, izmantojot kredÄ«tkarti." + }, + "buyCoinSwitch": { + "message": "Pirkt CoinSwitch" + }, + "buyCoinSwitchExplainer": { + "message": "CoinSwitch ir vienots galamÄ“rÄ·is vairÄk nekÄ 300 kriptovalÅ«tu maiņai, izmantojot labÄko kursu." + }, + "bytes": { + "message": "Baiti" + }, + "off": { + "message": "Izsl." + }, + "ok": { + "message": "Labi" + }, + "on": { + "message": "Iesl." + }, + "optionalBlockExplorerUrl": { + "message": "BloÄ·Ä“t Explorer URL (pÄ“c izvÄ“les)" + }, + "cancel": { + "message": "Atcelt" + }, + "cancelAttempt": { + "message": "Atcelt mēģinÄjumu" + }, + "cancellationGasFee": { + "message": "AtcelÅ¡anas maksÄjums par Gas" + }, + "cancelled": { + "message": "Atcelts" + }, + "chainId": { + "message": "Ķēdes ID" + }, + "clickToRevealSeed": { + "message": "Klikšķiniet Å¡eit, lai skatÄ«tu slepenos vÄrdus" + }, + "close": { + "message": "AizvÄ“rt" + }, + "chromeRequiredForHardwareWallets": { + "message": "MetaMask ir jÄpalaiž pÄrlÅ«kprogrammÄ Google Chrome, lai varÄ“tu pievienot aparatÅ«ras maku." + }, + "confirm": { + "message": "ApstiprinÄt" + }, + "confirmed": { + "message": "ApstiprinÄts" + }, + "confirmPassword": { + "message": "Apstipriniet paroli" + }, + "confirmSecretBackupPhrase": { + "message": "Apstipriniet savu slepeno rezerves frÄzi" + }, + "congratulations": { + "message": "Apsveicam" + }, + "connectHardwareWallet": { + "message": "PieslÄ“gt aparatÅ«ras maku" + }, + "connect": { + "message": "PievienoÅ¡ana" + }, + "connectingTo": { + "message": "PieslÄ“dzas $1" + }, + "connectingToKovan": { + "message": "Savienojas ar Kovan testa tÄ«klu" + }, + "connectingToMainnet": { + "message": "Savienojas ar galveno Ethereum tÄ«klu" + }, + "connectingToRopsten": { + "message": "PieslÄ“dzas Ropsten testa tÄ«klam" + }, + "connectingToRinkeby": { + "message": "PieslÄ“dzas Rinkeby testa tÄ«klam" + }, + "connectingToLocalhost": { + "message": "Savienojas ar vietÄ“jo resursdatoru 8545" + }, + "connectingToGoerli": { + "message": "PieslÄ“dzas Goerli testa tÄ«klam" + }, + "continueToWyre": { + "message": "PÄriet uz Wyre" + }, + "continueToCoinSwitch": { + "message": "Iet uz CoinSwitch" + }, + "contractDeployment": { + "message": "LÄ«gumu pielietoÅ¡ana" + }, + "copiedExclamation": { + "message": "NokopÄ“ts!" + }, + "copyAddress": { + "message": "IekopÄ“t adresi starpliktuvÄ“" + }, + "copyTransactionId": { + "message": "KopÄ“t darÄ«juma ID" + }, + "copiedTransactionId": { + "message": "NokopÄ“tais darÄ«juma ID" + }, + "copyToClipboard": { + "message": "KopÄ“t starpliktuvÄ“" + }, + "copyPrivateKey": { + "message": "Å Ä« ir jÅ«su privÄtÄ atslÄ“ga (noklikšķiniet, lai nokopÄ“tu)" + }, + "create": { + "message": "Izveidot" + }, + "createAccount": { + "message": "Izveidot kontu" + }, + "createAWallet": { + "message": "Izveidot maku" + }, + "createPassword": { + "message": "Izveidot paroli" + }, + "currencyConversion": { + "message": "ValÅ«tas konvertÄcija" + }, + "currentLanguage": { + "message": "PaÅ¡reizÄ“jÄ valodÄ" + }, + "customGas": { + "message": "PielÄgot Gas" + }, + "customGasSubTitle": { + "message": "Nodevas palielinÄÅ¡ana var saÄ«sinÄt apstrÄdes laiku, bet ne garantÄ“ti." + }, + "customToken": { + "message": "PielÄgots marÄ·ieris" + }, + "customRPC": { + "message": "PielÄgots RPC izsaukums" + }, + "decimalsMustZerotoTen": { + "message": "Daļskaitļiem jÄbÅ«t diapazonÄ no 0 lÄ«dz 36." + }, + "decimal": { + "message": "DecimÄldaļu precizitÄte" + }, + "defaultNetwork": { + "message": "Galvenais Ether darÄ«jumu tÄ«kls ir Main Net." + }, + "delete": { + "message": "DzÄ“st" + }, + "deleteAccount": { + "message": "DzÄ“st kontu" + }, + "deposit": { + "message": "Iemaksa" + }, + "depositEther": { + "message": "NoguldÄ«t Ether" + }, + "details": { + "message": "InformÄcija" + }, + "directDepositEther": { + "message": "TieÅ¡Ä Ether iemaksa" + }, + "directDepositEtherExplainer": { + "message": "Ja jums jau ir Ether, tad visÄtrÄk Ether savÄ makÄ varat saņemt ar tieÅ¡o iemaksu." + }, + "done": { + "message": "Pabeigts" + }, + "downloadGoogleChrome": { + "message": "LejupielÄdÄ“t ar Google Chrome" + }, + "downloadSecretBackup": { + "message": "LejupielÄdÄ“jiet Å¡o slepeno atgūšanas frÄzi un glabÄjiet to drošībÄ, Å¡ifrÄ“tÄ ÄrÄ“jÄ cietajÄ diskÄ vai datu nesÄ“jÄ." + }, + "downloadStateLogs": { + "message": "LejupielÄdÄ“t stÄvokļa žurnÄlus" + }, + "dontHaveAHardwareWallet": { + "message": "Nav aparatÅ«ras maka?" + }, + "dropped": { + "message": "Atmests" + }, + "edit": { + "message": "Labot" + }, + "editContact": { + "message": "Rediģēt lÄ«gumu" + }, + "endOfFlowMessage1": { + "message": "JÅ«s izgÄjÄt pÄrbaudi — glabÄjiet atkopÅ¡anas frÄzi drošībÄ, tÄ ir jÅ«su atbildÄ«ba!" + }, + "endOfFlowMessage2": { + "message": "DroÅ¡as glabÄÅ¡anas ieteikumi" + }, + "endOfFlowMessage3": { + "message": "SaglabÄjiet rezerves kopiju vairÄkÄs vietÄs." + }, + "endOfFlowMessage4": { + "message": "Nekad neizpaudiet Å¡o frÄzi citiem cilvÄ“kiem." + }, + "endOfFlowMessage5": { + "message": "Uzmanieties no pikšķerēšanas! MetaMask nekad pÄ“kšņi nelÅ«gs norÄdÄ«t atkopÅ¡anas frÄzi." + }, + "endOfFlowMessage6": { + "message": "Ja nepiecieÅ¡ams atkÄrtoti dublÄ“t atkopÅ¡anas frÄzi, varat to atrast, dodoties uz IestatÄ«jumi -> Drošība." + }, + "endOfFlowMessage7": { + "message": "Ja jums rodas kÄdi jautÄjumi vai pamanÄt ko aizdomÄ«gu, rakstiet uz support@metamask.io." + }, + "endOfFlowMessage8": { + "message": "MetaMask nevar atjaunot jÅ«su atkopÅ¡anas frÄzi. UzzinÄt vairÄk." + }, + "endOfFlowMessage9": { + "message": "UzzinÄt vairÄk." + }, + "endOfFlowMessage10": { + "message": "Pabeigts" + }, + "ensRegistrationError": { + "message": "Kļūda ENS vÄrda reÄ£istrÄcijÄ" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "Å ajÄ tÄ«klÄ ENS nosaukums nav atrasts. Pamēģiniet pÄrslÄ“gties uz galveno Ethereum tÄ«klu." + }, + "enterAnAlias": { + "message": "Ievadiet segvÄrdu" + }, + "enterPassword": { + "message": "Ievadiet paroli" + }, + "enterPasswordContinue": { + "message": "Ievadiet paroli, lai turpinÄtu" + }, + "ethereumPublicAddress": { + "message": "Ethereum publiskÄ adrese" + }, + "etherscanView": { + "message": "SkatÄ«t kontu ar Etherscan" + }, + "estimatedProcessingTimes": { + "message": "AprēķinÄtais apstrÄdes laiks" + }, + "expandView": { + "message": "IzvÄ“rst skatÄ«jumu" + }, + "exportPrivateKey": { + "message": "EksportÄ“t privÄto atslÄ“gu" + }, + "failed": { + "message": "NeizdevÄs" + }, + "fast": { + "message": "Ä€trs" + }, + "faster": { + "message": "Ä€trÄk" + }, + "fileImportFail": { + "message": "Vai faila importēšanas iespÄ“ja nedarbojas? Klikšķiniet Å¡eit!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "Aizmirst Å¡o ierÄ«ci" + }, + "from": { + "message": "No" + }, + "functionType": { + "message": "Funkcijas veids" + }, + "gasLimit": { + "message": "Gas robežvÄ“rtÄ«ba" + }, + "gasLimitInfoModalContent": { + "message": "Gas robežvÄ“rtÄ«ba ir maksimÄlais Gas vienÄ«bu skaits, ko vÄ“laties tÄ“rÄ“t." + }, + "gasLimitTooLow": { + "message": "MinimÄlajai Gas robežvÄ“rtÄ«bai jÄbÅ«t vismaz 21000" + }, + "gasUsed": { + "message": "Izlietotie Gas" + }, + "gasPrice": { + "message": "Gas cena (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "Ä€rkÄrtÄ«gi zema Gas cena" + }, + "gasPriceInfoModalContent": { + "message": "Gas cena norÄda Ether summu, ko vÄ“laties maksÄt par katru Gas vienÄ«bu." + }, + "gasPriceNoDenom": { + "message": "Gas cena" + }, + "general": { + "message": "VispÄrÄ«gi" + }, + "generalSettingsDescription": { + "message": "ValÅ«tas konvertēšana, galvenÄ valÅ«ta, valoda, bloku identifikators" + }, + "getEther": { + "message": "Saņemt Ether" + }, + "getEtherFromFaucet": { + "message": "Vai vÄ“laties $1 iegÅ«t Ether no krÄna?", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "Saņemt palÄ«dzÄ«bu." + }, + "getStarted": { + "message": "SÄkt darbu" + }, + "happyToSeeYou": { + "message": "PriecÄjamies jÅ«s redzÄ“t!" + }, + "hardware": { + "message": "aparatÅ«ra" + }, + "hardwareWalletConnected": { + "message": "AparatÅ«ras maks pieslÄ“gts" + }, + "hardwareWallets": { + "message": "PieslÄ“dziet aparatÅ«ras maku" + }, + "hardwareWalletsMsg": { + "message": "Atlasiet aparatÅ«ras maku lietoÅ¡anai ar MetaMask" + }, + "havingTroubleConnecting": { + "message": "Neizdodas pieslÄ“gties?" + }, + "here": { + "message": "Å¡eit", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hexData": { + "message": "Hex dati" + }, + "hide": { + "message": "SlÄ“pt" + }, + "hideTokenPrompt": { + "message": "PaslÄ“pt žetonu?" + }, + "history": { + "message": "VÄ“sture" + }, + "import": { + "message": "ImportÄ“t", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "ImportÄ“t kontu" + }, + "importAccountMsg": { + "message": "ImportÄ“tie konti netiks piesaistÄ«ti sÄkotnÄ“ji izveidotÄ MetaMask konta atkopÅ¡anas frÄzei. Uzziniet vairÄk par importÄ“tajiem kontiem" + }, + "importAccountSeedPhrase": { + "message": "ImportÄ“t kontu ar atkopÅ¡anas frÄzi" + }, + "importWallet": { + "message": "ImportÄ“t maku" + }, + "importYourExisting": { + "message": "ImportÄ“jiet esoÅ¡o maku, izmantojot 12 vÄrdu atkopÅ¡anas frÄzi" + }, + "imported": { + "message": "ImportÄ“ts", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "ImportÄ“t, izmantojot konta atkopÅ¡anas frÄzi" + }, + "infoHelp": { + "message": "InformÄcija un palÄ«dzÄ«ba" + }, + "initialTransactionConfirmed": { + "message": "JÅ«su sÄkotnÄ“jais darÄ«jums apstiprinÄts tÄ«klÄ. Spiediet OK, lai atgrieztos." + }, + "insufficientBalance": { + "message": "Nepietiekama bilance." + }, + "insufficientFunds": { + "message": "Nepietiek lÄ«dzekļu." + }, + "insufficientTokens": { + "message": "Nepietiek marÄ·ieru." + }, + "invalidAddress": { + "message": "NederÄ«ga adrese" + }, + "invalidAddressRecipient": { + "message": "NederÄ«ga saņēmÄ“ja adrese" + }, + "knownAddressRecipient": { + "message": "ZinÄmÄ lÄ«guma adrese." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "Nav ETH tÄ«kls, iestatÄ«ti mazie burti" + }, + "invalidInput": { + "message": "NederÄ«ga ievadÄ«tÄ vÄ“rtÄ«ba." + }, + "invalidRPC": { + "message": "NederÄ«gs RPC URL" + }, + "invalidBlockExplorerURL": { + "message": "NederÄ«gs Block Explorer URL" + }, + "invalidSeedPhrase": { + "message": "NederÄ«ga atkopÅ¡anas frÄze" + }, + "jsonFile": { + "message": "JSON datne", + "description": "format for importing an account" + }, + "kovan": { + "message": "Kovan testa tÄ«kls" + }, + "max": { + "message": "Maks." + }, + "learnMore": { + "message": "UzzinÄt vairÄk" + }, + "ledgerAccountRestriction": { + "message": "Jums jÄizmanto pÄ“dÄ“jais konts pirms varat pievienot jaunu." + }, + "letsGoSetUp": { + "message": "JÄ, sÄksim iestatīšanu!" + }, + "likeToAddTokens": { + "message": "Vai vÄ“laties pievienot Å¡os marÄ·ierus?" + }, + "links": { + "message": "Saites" + }, + "liveGasPricePredictions": { + "message": "ReÄllaika Gas cenu prognozes" + }, + "loading": { + "message": "Notiek ielÄde..." + }, + "loadingTokens": { + "message": "IelÄdÄ“ marÄ·ierus..." + }, + "loadMore": { + "message": "IelÄdÄ“t vairÄk" + }, + "localhost": { + "message": "Resursdators 8545" + }, + "lock": { + "message": "IzrakstÄ«ties" + }, + "mainnet": { + "message": "Galvenais Ethereum tÄ«kls" + }, + "memorizePhrase": { + "message": "IegaumÄ“jiet Å¡o frÄzi." + }, + "memo": { + "message": "atgÄdinÄjums" + }, + "message": { + "message": "Ziņojums" + }, + "metamaskDescription": { + "message": "Veido savienojumu ar Ethereum un decentralizÄ“to tÄ«mekli." + }, + "metamaskVersion": { + "message": "MetaMask versija" + }, + "mobileSyncText": { + "message": "LÅ«dzu, ievadiet paroli, lai apstiprinÄtu, ka tas esat jÅ«s." + }, + "myAccounts": { + "message": "Mani konti" + }, + "myWalletAccounts": { + "message": "Mana maka konti" + }, + "myWalletAccountsDescription": { + "message": "Visi jÅ«su izveidotie MetaMask konti tiks automÄtiski pievienoti Å¡ajÄ sadaļÄ." + }, + "mustSelectOne": { + "message": "JÄatlasa vismaz 1 marÄ·ieris." + }, + "needEtherInWallet": { + "message": "Lai izmantotu decentralizÄ“tas lietotnes ar MetaMask, jÅ«su makÄ jÄbÅ«t Ether." + }, + "needImportFile": { + "message": "Jums jÄatlasa fails, ko importÄ“t", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "Nav iespÄ“jams nosÅ«tÄ«t negatÄ«vu ETH summu." + }, + "networkName": { + "message": "TÄ«kla nosaukums" + }, + "networks": { + "message": "TÄ«kli" + }, + "networkSettingsDescription": { + "message": "Pievienot un rediģēt pielÄgotos RPC tÄ«klus" + }, + "nevermind": { + "message": "Nav svarÄ«gi" + }, + "newAccount": { + "message": "Jauns konts" + }, + "newAccountDetectedDialogMessage": { + "message": "KonstatÄ“ta jauna adrese. Klikšķiniet Å¡eit, lai pievienotu to adreÅ¡u grÄmatai." + }, + "newAccountNumberName": { + "message": "Konts $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "Jauna kontaktpersona" + }, + "newContract": { + "message": "Jauns lÄ«gums" + }, + "newPassword": { + "message": "Jauna parole (vism. 8 rakstzÄ«mes)" + }, + "newNetwork": { + "message": "Jauns tÄ«kls" + }, + "newToMetaMask": { + "message": "NepazÄ«stat MetaMask?" + }, + "noAlreadyHaveSeed": { + "message": "NÄ“, man jau ir atkopÅ¡anas frÄze" + }, + "protectYourKeys": { + "message": "SargÄjiet savas atslÄ“gas!" + }, + "protectYourKeysMessage1": { + "message": "RÄ«kojieties uzmanÄ«gi ar sÄ“klas frÄzi — saņemti ziņojumi par tÄ«mekļa vietnÄ“m, kas mēģina imitÄ“t MetaMask. MetaMask nekad nelÅ«gs norÄdÄ«t sÄ“klas frÄzi." + }, + "protectYourKeysMessage2": { + "message": "GlabÄjiet frÄzi drošībÄ. Ja kaut kas šķiet aizdomÄ«gs vai neesat pÄrliecinÄti par tÄ«mekļa vietni, rakstiet e-pastu uz support@metamask.io" + }, + "rpcUrl": { + "message": "Jauns RPC URL" + }, + "optionalChainId": { + "message": "ChainID (neobligÄti)" + }, + "optionalSymbol": { + "message": "Simbols (neobligÄti)" + }, + "newTotal": { + "message": "JaunÄ kopsumma" + }, + "newTransactionFee": { + "message": "Jauna darÄ«juma nodeva" + }, + "next": { + "message": "NÄkamais" + }, + "noAddressForName": { + "message": "Å im vÄrdam nav iestatÄ«ta adrese." + }, + "noConversionRateAvailable": { + "message": "Konversijas kurss nav pieejams" + }, + "noTransactions": { + "message": "Jums nav neviena darÄ«juma." + }, + "notEnoughGas": { + "message": "Nepietiek Gas" + }, + "noWebcamFoundTitle": { + "message": "TÄ«mekļa kamera nav atrasta" + }, + "noWebcamFound": { + "message": "JÅ«su datora tÄ«mekļa kamera netika atrasta. LÅ«dzu, mēģiniet vÄ“lreiz." + }, + "ofTextNofM": { + "message": "no" + }, + "orderOneHere": { + "message": "PasÅ«tiet Trezor vai Ledger un glabÄjiet savus lÄ«dzekļus aukstajÄ krÄtuvÄ“" + }, + "origin": { + "message": "Avots" + }, + "parameters": { + "message": "Parametri" + }, + "participateInMetaMetrics": { + "message": "Piedalieties MetaMetrics" + }, + "participateInMetaMetricsDescription": { + "message": "Piedalieties MetaMetrics un palÄ«dziet mums to uzlabot" + }, + "password": { + "message": "Parole" + }, + "passwordsDontMatch": { + "message": "Paroles nesakrÄ«t" + }, + "passwordNotLongEnough": { + "message": "Parole nav pietiekami gara" + }, + "pastePrivateKey": { + "message": "IelÄ«mÄ“jiet privÄtÄs atslÄ“gas rindu Å¡eit:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "gaida" + }, + "personalAddressDetected": { + "message": "KonstatÄ“ta personÄ«gÄ adrese. Ievadiet marÄ·iera lÄ«guma adresi." + }, + "prev": { + "message": "Iepr." + }, + "primaryCurrencySetting": { + "message": "PrimÄrÄ valÅ«ta" + }, + "primaryCurrencySettingDescription": { + "message": "AtlasÄ«t vietÄ“jo, lai piešķirtu attÄ“lotajÄm vÄ“rtÄ«bÄm prioritÄtes Ä·Ä“des vietÄ“jÄ vÄ“rtÄ«bÄ (piemÄ“ram, ETH). Atlasiet Fiat, lai piešķirtu augstÄku prioritÄti vÄ“rtÄ«bÄm jÅ«su atlasÄ«tajÄ fiat valÅ«tÄ." + }, + "privacyMsg": { + "message": "PrivÄtuma politika" + }, + "privateKey": { + "message": "PrivÄtÄ atslÄ“ga", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "BrÄ«dinÄjums! Nekad neizpaudiet Å¡o atslÄ“gu. Ikviens, kuram ir JÅ«su privÄtÄs atslÄ“gas, var nozagt jebkuru jÅ«su kontÄ esoÅ¡o aktÄ«vu." + }, + "privateNetwork": { + "message": "PrivÄtais tÄ«kls" + }, + "queue": { + "message": "Rinda" + }, + "readdToken": { + "message": "JÅ«s varat Å¡o marÄ·ieri iestatÄ«t atpakaļ nÄkotnÄ“, konta opciju izvÄ“lnÄ“ atverot \"Pievienot marÄ·ieri\"." + }, + "recents": { + "message": "Nesenie" + }, + "recipientAddress": { + "message": "SaņēmÄ“ja adrese" + }, + "recipientAddressPlaceholder": { + "message": "Meklēšana, publiskÄ adrese (0x) vai ENS" + }, + "rejectAll": { + "message": "NoraidÄ«t visus" + }, + "rejectTxsN": { + "message": "NoraidÄ«t $1 darÄ«jumus" + }, + "rejectTxsDescription": { + "message": "JÅ«s gatavojaties noraidÄ«t $1 darÄ«jumus." + }, + "rejected": { + "message": "NoraidÄ«ts" + }, + "reset": { + "message": "AtiestatÄ«t" + }, + "resetAccount": { + "message": "AtiestatÄ«t kontu" + }, + "resetAccountDescription": { + "message": "Konta atiestatīšana izdzÄ“sÄ«s darÄ«jumu vÄ“sturi." + }, + "deleteNetwork": { + "message": "DzÄ“st tÄ«klu?" + }, + "deleteNetworkDescription": { + "message": "Vai tieÅ¡Äm vÄ“laties dzÄ“st Å¡o tÄ«klu?" + }, + "remindMeLater": { + "message": "AtgÄdinÄt vÄ“lÄk" + }, + "restoreFromSeed": { + "message": "Atjaunot kontu?" + }, + "restoreAccountWithSeed": { + "message": "Atjaunojiet savu kontu ar atkopÅ¡anas frÄzi" + }, + "requestsAwaitingAcknowledgement": { + "message": "pieprasÄ«jumi, kas gaida apstiprinÄjumu" + }, + "required": { + "message": "NepiecieÅ¡ams" + }, + "restore": { + "message": "Atjaunot" + }, + "revealSeedWords": { + "message": "ParÄdÄ«t atkopÅ¡anas vÄrdus" + }, + "revealSeedWordsTitle": { + "message": "AtkopÅ¡anas frÄze" + }, + "revealSeedWordsDescription": { + "message": "Ja mainÄ«siet pÄrlÅ«ku vai datoru, jÅ«su kontu piekļuvei bÅ«s nepiecieÅ¡ama šī atkopÅ¡anas frÄze. SaglabÄjiet to droÅ¡Ä un slepenÄ vietÄ!" + }, + "revealSeedWordsWarningTitle": { + "message": "NEDALIETIES ar Å¡o frÄzi!" + }, + "revealSeedWordsWarning": { + "message": "Å os vÄrdus var izmantot visu jÅ«su kontu nolaupīšanai." + }, + "remove": { + "message": "Noņemt" + }, + "removeAccount": { + "message": "Konta noņemÅ¡ana" + }, + "removeAccountDescription": { + "message": "Å is darÄ«jums tiks dzÄ“sts no jÅ«su maka. Pirms turpiniet, lÅ«dzu, pÄrliecinieties, ka jums ir šī importÄ“tÄ konta oriÄ£inÄlÄ sÄ“klas frÄze vai privÄtÄ atslÄ“ga. JÅ«s varat importÄ“t vai izveidot kontus vÄ“lreiz, izmantojot konta nolaižamo izvÄ“lni." + }, + "readyToConnect": { + "message": "Vai esat gatavi izveidot savienojumu?" + }, + "rinkeby": { + "message": "Rinkeby testa tÄ«kls" + }, + "ropsten": { + "message": "Ropsten testa tÄ«kls" + }, + "goerli": { + "message": "Goerli testa tÄ«kls" + }, + "save": { + "message": "SaglabÄt" + }, + "slow": { + "message": "LÄ“ns" + }, + "slower": { + "message": "LÄ“nÄk" + }, + "saveAsCsvFile": { + "message": "SaglabÄt kÄ CSV failu" + }, + "scanInstructions": { + "message": "Novietojiet QR kodu kameras priekÅ¡Ä" + }, + "scanQrCode": { + "message": "IeskenÄ“t QR kodu" + }, + "search": { + "message": "MeklÄ“t" + }, + "searchResults": { + "message": "Meklēšanas rezultÄti" + }, + "secretBackupPhrase": { + "message": "SlepenÄ rezerves frÄze" + }, + "secretBackupPhraseDescription": { + "message": "Ar slepeno atgūšanas frÄzi ir vieglÄk dublÄ“t un atjaunot kontu." + }, + "secretBackupPhraseWarning": { + "message": "BRĪDINÄ€JUMS! NekÄdÄ gadÄ«jumÄ neizpaudiet savu rezerves frÄzi. Ikviens, kam pieejama šī frÄze, var uz visiem laikiem pÄrņemt jÅ«su Ether." + }, + "secretPhrase": { + "message": "Ievadiet Å¡eit slepeno divpadsmit vÄrdu frÄzi, lai atjaunotu savu seifu." + }, + "securityAndPrivacy": { + "message": "Drošība un konfidencialitÄte" + }, + "securitySettingsDescription": { + "message": "KonfidencialitÄtes iestatÄ«jumi un maka atkopÅ¡anas frÄze" + }, + "seedPhrasePlaceholder": { + "message": "Atdaliet katru vÄrdu ar vienu atstarpi" + }, + "seedPhraseReq": { + "message": "AtkopÅ¡anas frÄzes ir 12 vÄrdus garas" + }, + "selectCurrency": { + "message": "Atlasiet valÅ«tu" + }, + "selectEachPhrase": { + "message": "LÅ«dzu, atlasiet katru frÄzi, lai pÄrliecinÄtos par tÄs pareizÄ«bu." + }, + "selectLocale": { + "message": "IzvÄ“lieties lokalizÄciju" + }, + "selectType": { + "message": "Atlasiet veidu" + }, + "send": { + "message": "SÅ«tÄ«t" + }, + "sendAmount": { + "message": "NosÅ«tÄ«tÄ summa" + }, + "sendETH": { + "message": "SÅ«tÄ«t ETH" + }, + "sendTokens": { + "message": "NosÅ«tÄ«t marÄ·ierus" + }, + "sentEther": { + "message": "nosÅ«tÄ«tie ether" + }, + "sentTokens": { + "message": "nosÅ«tÄ«tie marÄ·ieri" + }, + "separateEachWord": { + "message": "Atdaliet katru vÄrdu ar vienu atstarpi" + }, + "searchTokens": { + "message": "MeklÄ“t marÄ·ierus" + }, + "selectAnAccount": { + "message": "Atlasiet kontu" + }, + "selectAnAccountHelp": { + "message": "Atlasiet kontu, ko skatÄ«t MetaMask" + }, + "selectAHigherGasFee": { + "message": "Atlasiet lielÄku maksu par Gas, lai paÄtrinÄtu darÄ«juma apstrÄdi.*" + }, + "selectHdPath": { + "message": "AtlasÄ«t HD ceļu" + }, + "selectPathHelp": { + "message": "Ja zemÄk neredzat savus esoÅ¡os žurnÄla kontus, mēģiniet pÄrslÄ“gt ceļus uz \"Legacy (MEW / MyCrypto)\"" + }, + "settings": { + "message": "IestatÄ«jumi" + }, + "showAdvancedGasInline": { + "message": "Papildu Gas vadÄ«klas" + }, + "showAdvancedGasInlineDescription": { + "message": "Atlasiet Å¡o, lai parÄdÄ«tu Gas cenu un ierobežotu kontroles iespÄ“jas tieÅ¡i sÅ«tīšanas un apstiprinÄÅ¡anas ekrÄnos." + }, + "showFiatConversionInTestnets": { + "message": "RÄdÄ«t konversiju testa tÄ«klos" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Atlasiet Å¡o, lai testa tÄ«klos uzrÄdÄ«tu fiat konversiju" + }, + "showPrivateKeys": { + "message": "RÄdÄ«t privÄtÄs atslÄ“gas" + }, + "showHexData": { + "message": "RÄdÄ«t hex datus" + }, + "showHexDataDescription": { + "message": "Atlasiet Å¡o, lai atvÄ“rtu hex datus sÅ«tīšanas ekrÄnÄ" + }, + "sign": { + "message": "ParakstÄ«t" + }, + "signatureRequest": { + "message": "Paraksta pieprasÄ«jums" + }, + "signed": { + "message": "ParakstÄ«ts" + }, + "signNotice": { + "message": "Å Ä« ziņojuma parakstīšana var radÄ«t \nbÄ«stamas blaknes. Parakstiet tikai tÄdus ziņojumus,\nkuriem pilnÄ«bÄ uzticaties ar savu konta informÄciju.\n TurpmÄkajÄs versijÄs šī bÄ«stamÄ metode tiks noņemta. " + }, + "sigRequest": { + "message": "Paraksta pieprasÄ«jums" + }, + "somethingWentWrong": { + "message": "Ak vai! RadÄs problÄ“ma." + }, + "speedUp": { + "message": "PaÄtrinÄt" + }, + "speedUpCancellation": { + "message": "PaÄtrinÄt Å¡o atcelÅ¡anu" + }, + "speedUpTransaction": { + "message": "PaÄtrinÄt Å¡o darÄ«jumu" + }, + "switchNetworks": { + "message": "MainÄ«t tÄ«klus" + }, + "stateLogs": { + "message": "Statusu žurnÄli" + }, + "stateLogsDescription": { + "message": "Statusa žurnÄli ietver publisko kontu adreses un nosÅ«tÄ«tos darÄ«jumus." + }, + "stateLogError": { + "message": "IegÅ«stot statusa žurnÄlus, radÄs kļūda." + }, + "step1HardwareWallet": { + "message": "1. PieslÄ“gt aparatÅ«ras maku" + }, + "step1HardwareWalletMsg": { + "message": "Savienojiet aparatÅ«ras maku tieÅ¡i ar datoru." + }, + "step2HardwareWallet": { + "message": "2. Atlasiet kontu" + }, + "step2HardwareWalletMsg": { + "message": "Atlasiet kontu, kuru vÄ“laties skatÄ«t. VienlaicÄ«gi varat izvÄ“lÄ“ties tikai vienu kontu." + }, + "step3HardwareWallet": { + "message": "3. SÄciet izmantot dApps un citas funkcijas!" + }, + "step3HardwareWalletMsg": { + "message": "Lietojiet aparatÅ«ras kontu lÄ«dzÄ«gi citiem Ethereum kontiem. Pierakstieties dApps, sÅ«tiet Eth, pÄ“rciet un glabÄjiet ERC20 žetonus un neatvietojamos žetonus, piemÄ“ram, CryptoKitties." + }, + "storePhrase": { + "message": "SaglabÄjiet Å¡o frÄzi paroļu pÄrvaldniekÄ, piemÄ“ram, 1Password." + }, + "submitted": { + "message": "Iesniegts" + }, + "supportCenter": { + "message": "ApmeklÄ“jiet mÅ«su Atbalsta centru" + }, + "symbol": { + "message": "Simbols" + }, + "symbolBetweenZeroTwelve": { + "message": "SimbolÄ nedrÄ«kst bÅ«t vairÄk par 11 rakstzÄ«mÄ“m." + }, + "syncWithMobile": { + "message": "SinhronizÄ“t ar tÄlruni" + }, + "syncWithMobileTitle": { + "message": "SinhronizÄ“t ar tÄlruni" + }, + "syncWithMobileDesc": { + "message": "JÅ«s varat sinhronizÄ“t savus kontus un informÄciju ar mobilo ierÄ«ci. Atveriet MetaMask mobilo lietotni, ejiet uz \"IestatÄ«jumi\" un pieskarieties pie \"SinhronizÄ“t no pÄrlÅ«ka paplaÅ¡inÄjuma\"" + }, + "syncWithMobileDescNewUsers": { + "message": "Ja esat pirmoreiz atvÄ“ris MetaMask mobilo lietotni, vienkÄrÅ¡i sekojiet norÄdÄ“m tÄlrunÄ«." + }, + "syncWithMobileScanThisCode": { + "message": "NoskenÄ“jiet Å¡o kodu ar MetaMask mobilo lietotni" + }, + "syncWithMobileBeCareful": { + "message": "PÄrliecinieties, ka neviens cits neskatÄs jÅ«su ekrÄnÄ, kad skenÄ“jat Å¡o kodu." + }, + "syncWithMobileComplete": { + "message": "JÅ«su dati sekmÄ«gi sinhronizÄ“ti. PatÄ«kamu MetaMask mobilÄs lietotnes lietoÅ¡anu!" + }, + "terms": { + "message": "LietoÅ¡anas noteikumi" + }, + "testFaucet": { + "message": "Testa krÄns" + }, + "thisWillCreate": { + "message": "Å Ädi tiks izveidots jauna maks un atkopÅ¡anas frÄze" + }, + "tips": { + "message": "Dzeramnauda" + }, + "to": { + "message": "AdresÄts" + }, + "token": { + "message": "MarÄ·ieris" + }, + "tokenAlreadyAdded": { + "message": "Žetons jau pievienots." + }, + "tokenContractAddress": { + "message": "MarÄ·iera lÄ«guma adrese" + }, + "tokenSymbol": { + "message": "Žetona simbols" + }, + "total": { + "message": "KopÄ" + }, + "transaction": { + "message": "darÄ«jums" + }, + "transactionConfirmed": { + "message": "DarÄ«jums apstiprinÄts $2." + }, + "transactionCreated": { + "message": "DarÄ«jums $1 vÄ“rtÄ«bÄ izveidots $2." + }, + "transactionDropped": { + "message": "DarÄ«jums atmests $2." + }, + "transactionSubmitted": { + "message": "DarÄ«jums iesniegts ar maksu par Gas $1 pie $2." + }, + "transactionResubmitted": { + "message": "DarÄ«jums atkÄrtoti iesniegts ar maksu par Gas, palielinÄtu lÄ«dz $1 pie $2" + }, + "transactionUpdated": { + "message": "DarÄ«jums atjauninÄts $2." + }, + "transactionErrored": { + "message": "DarÄ«jumÄ radusies kļūda." + }, + "transactionCancelAttempted": { + "message": "DarÄ«jums tika mēģinÄts atcelt ar maksÄjumu par Gas $1 pie $2" + }, + "transactionCancelSuccess": { + "message": "DarÄ«jums veiksmÄ«gi atcelts $2" + }, + "transactionError": { + "message": "DarÄ«juma kļūda. LÄ«guma kodÄ uzrÄdÄs izņēmums." + }, + "transactionErrorNoContract": { + "message": "MēģinÄt izsaukt funkciju, izmantojot adresi, kas nav norÄdÄ«ta lÄ«gumÄ." + }, + "transactionFee": { + "message": "DarÄ«juma nodeva" + }, + "transactionTime": { + "message": "DarÄ«juma ilgums" + }, + "transfer": { + "message": "PÄrsÅ«tÄ«t" + }, + "transferBetweenAccounts": { + "message": "PÄrsÅ«tÄ«t starp saviem kontiem" + }, + "transferFrom": { + "message": "NosÅ«tÄ«t no" + }, + "troubleTokenBalances": { + "message": "Mums neizdevÄs ielÄdÄ“t marÄ·ieru bilanci. Varat tos skatÄ«t", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "MēģinÄt vÄ“lreiz" + }, + "typePassword": { + "message": "Ievadiet savu MetaMask paroli" + }, + "unapproved": { + "message": "Nav apstiprinÄts" + }, + "units": { + "message": "vienÄ«bas" + }, + "unknown": { + "message": "NezinÄma" + }, + "unknownNetwork": { + "message": "NezinÄms privÄtais tÄ«kls" + }, + "unknownQrCode": { + "message": "Kļūda: Å¡o QR kodu neizdevÄs identificÄ“t" + }, + "unknownCameraErrorTitle": { + "message": "Ak vai! RadÄs problÄ“ma..." + }, + "unknownCameraError": { + "message": "Mēģinot piekļūt kamerai, radÄs kļūda. LÅ«dzu, mēģiniet vÄ“lreiz..." + }, + "unlock": { + "message": "AtbloÄ·Ä“t" + }, + "unlockMessage": { + "message": "DecentralizÄ“tais tÄ«kls jau gaida" + }, + "updatedWithDate": { + "message": "AtjauninÄts $1" + }, + "urlErrorMsg": { + "message": "URI jÄsÄkas ar atbilstoÅ¡o HTTP/HTTPS priedÄ“kli." + }, + "usedByClients": { + "message": "Izmanto dažÄdi klienti" + }, + "userName": { + "message": "LietotÄjvÄrds" + }, + "viewAccount": { + "message": "SkatÄ«t kontu" + }, + "viewinExplorer": { + "message": "SkatÄ«t Explorer" + }, + "viewContact": { + "message": "SkatÄ«t lÄ«gumu" + }, + "viewOnCustomBlockExplorer": { + "message": "SkatÄ«t $1" + }, + "viewOnEtherscan": { + "message": "SkatÄ«t Etherscan" + }, + "visitWebSite": { + "message": "ApmeklÄ“jiet mÅ«su tÄ«mekļa vietni" + }, + "walletSeed": { + "message": "Maka atkopÅ¡anas frÄze" + }, + "welcomeBack": { + "message": "Ar atgrieÅ¡anos!" + }, + "welcome": { + "message": "Laipni lÅ«gti MetaMask" + }, + "writePhrase": { + "message": "Pierakstiet Å¡o frÄzi uz lapiņas, un noglabÄjiet to droÅ¡Ä vietÄ! Ja vÄ“laties stiprinÄt drošību, pierakstiet to uz vairÄkÄm lapiņÄm un glabÄjiet tÄs 2–3 dažÄdÄs vietÄs." + }, + "yesLetsTry": { + "message": "JÄ, pamēģinÄsim" + }, + "youNeedToAllowCameraAccess": { + "message": "Lai lietotu Å¡o funkciju, jÄdod piekļuve kamerai." + }, + "yourSigRequested": { + "message": "NepiecieÅ¡ams jÅ«su paraksts" + }, + "youSign": { + "message": "JÅ«s parakstÄt" + }, + "yourPrivateSeedPhrase": { + "message": "JÅ«su privÄtÄ atkopÅ¡anas frÄze" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "Gas nulles cena pie paÄtrinÄjuma" + } +} diff --git a/app/_locales/ml/messages.json b/app/_locales/ml/messages.json new file mode 100644 index 000000000000..c898d1dc2c49 --- /dev/null +++ b/app/_locales/ml/messages.json @@ -0,0 +1,143 @@ +{ + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "reject": { + "message": "നിരസികàµà´•àµà´•" + }, + "about": { + "message": "വിവരം" + }, + "account": { + "message": "à´…à´•àµà´•ൗണàµà´Ÿàµ" + }, + "advanced": { + "message": "നൂതനം" + }, + "back": { + "message": "പിനàµà´¨àµ‹à´Ÿàµà´Ÿàµ" + }, + "basic": { + "message": "à´…à´Ÿà´¿à´¸àµà´¥à´¾à´¨à´‚" + }, + "off": { + "message": "ഓഫാകàµà´•àµà´•" + }, + "ok": { + "message": "à´¶à´°à´¿" + }, + "on": { + "message": "ഓൺ ചെയàµà´¯àµà´•" + }, + "cancel": { + "message": "റദàµà´¦à´¾à´•àµà´•ൂ" + }, + "close": { + "message": "അവസാനിപàµà´ªà´¿à´•àµà´•àµà´•" + }, + "confirm": { + "message": "à´¸àµà´¥à´¿à´°àµ€à´•à´°à´¿à´•àµà´•àµà´•" + }, + "connect": { + "message": "കണകàµâ€Œà´±àµà´±àµà´šàµ†à´¯àµà´¯àµà´•" + }, + "copyToClipboard": { + "message": "à´•àµà´²à´¿à´ªàµà´ªàµà´¬àµ‹àµ¼à´¡à´¿à´²àµ‡à´•àµà´•ൠപകർതàµà´¤àµà´•" + }, + "create": { + "message": "സൃഷàµâ€Œà´Ÿà´¿à´•àµà´•àµà´•" + }, + "delete": { + "message": "ഇലàµà´²à´¾à´¤à´¾à´•àµà´•àµà´•" + }, + "details": { + "message": "വിശദാംശങàµà´™àµ¾â€Œ" + }, + "done": { + "message": "പൂർതàµà´¤à´¿à´¯à´¾à´•àµà´•à´¿" + }, + "edit": { + "message": "à´Žà´¡à´¿à´±àµà´±àµà´šàµ†à´¯àµà´¯àµà´•" + }, + "fast": { + "message": "വേഗത" + }, + "forgetDevice": { + "message": "à´ˆ ഉപകരണം മറകàµà´•àµà´•" + }, + "getStarted": { + "message": "ആരംഭികàµà´•ാം" + }, + "hide": { + "message": "മറയàµà´•àµà´•àµà´•" + }, + "history": { + "message": "à´šà´°à´¿à´¤àµà´°à´‚" + }, + "import": { + "message": "ഇറകàµà´•àµà´®à´¤à´¿à´šàµ†à´¯àµà´¯àµà´•", + "description": "Button to import an account from a selected file" + }, + "imported": { + "message": "ഇറകàµà´•àµà´®à´¤à´¿à´šàµ†à´¯àµà´¤àµ", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "loading": { + "message": "ലോഡàµà´šàµ†à´¯àµà´¯àµà´¨àµà´¨àµ..." + }, + "next": { + "message": "à´…à´Ÿàµà´¤àµà´¤à´¤àµ" + }, + "origin": { + "message": "ഉറവിടം" + }, + "password": { + "message": "പാസàµâ€Œà´µàµ‡à´¡àµ" + }, + "queue": { + "message": "à´•àµà´¯àµ‚വിൽ" + }, + "reset": { + "message": "വീണàµà´Ÿàµà´‚ സജàµà´œàµ€à´•à´°à´¿à´•àµà´•àµà´•" + }, + "restore": { + "message": "à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´•àµà´•àµà´•" + }, + "remove": { + "message": "നീകàµà´•ംചെയàµà´¯àµà´•" + }, + "removeAccount": { + "message": "à´…à´•àµà´•ൗണàµà´Ÿàµ നീകàµà´•ംചെയàµà´¯àµ½" + }, + "save": { + "message": "സംരകàµà´·à´¿à´•àµà´•àµà´•" + }, + "slow": { + "message": "പതàµà´•àµà´•െ" + }, + "search": { + "message": "തിരയൂ" + }, + "send": { + "message": "അയയàµâ€Œà´•àµà´•àµà´•" + }, + "settings": { + "message": "à´•àµà´°à´®àµ€à´•രണങàµà´™à´³àµâ€" + }, + "tryAgain": { + "message": "വീണàµà´Ÿàµà´‚ à´¶àµà´°à´®à´¿à´•àµà´•àµà´•" + }, + "unknown": { + "message": "അറിഞàµà´žàµà´•ൂടാതàµà´¤à´¤àµ" + }, + "unlock": { + "message": "à´…à´£àµâ€à´²àµ‹à´•àµà´•ൠചെയàµà´¯àµà´•" + }, + "userName": { + "message": "ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚" + }, + "viewAccount": { + "message": "à´…à´•àµà´•ൗണàµà´Ÿàµ കാണàµà´•" + } +} diff --git a/app/_locales/mr/messages.json b/app/_locales/mr/messages.json new file mode 100644 index 000000000000..ef341f40cea4 --- /dev/null +++ b/app/_locales/mr/messages.json @@ -0,0 +1,143 @@ +{ + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "reject": { + "message": "नाकारा" + }, + "about": { + "message": "बदà¥à¤¦à¤²" + }, + "account": { + "message": "खाते" + }, + "advanced": { + "message": "पà¥à¤°à¤—त" + }, + "back": { + "message": "मागील" + }, + "basic": { + "message": "मूलभूत" + }, + "off": { + "message": "बंद" + }, + "ok": { + "message": "ठीक आहे" + }, + "on": { + "message": "चालू" + }, + "cancel": { + "message": "रदà¥à¤¦ करा" + }, + "close": { + "message": "बंद करा" + }, + "confirm": { + "message": "पà¥à¤·à¥à¤Ÿà¥€ करा" + }, + "connect": { + "message": "कनेकà¥â€à¤Ÿ करा" + }, + "copyToClipboard": { + "message": "कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡à¤µà¤° कॉपी करा" + }, + "create": { + "message": "तयार करा" + }, + "delete": { + "message": "हटवा" + }, + "details": { + "message": "तपशील" + }, + "done": { + "message": "पूरà¥à¤£ à¤à¤¾à¤²à¥‡" + }, + "edit": { + "message": "संपादन" + }, + "fast": { + "message": "जलद" + }, + "forgetDevice": { + "message": "हे डिवà¥à¤¹à¤¾à¤‡à¤¸ विसरा" + }, + "getStarted": { + "message": "पà¥à¤°à¤¾à¤°à¤‚भ करा" + }, + "hide": { + "message": "लपवा" + }, + "history": { + "message": "इतिहास" + }, + "import": { + "message": "इंपोरà¥à¤Ÿ", + "description": "Button to import an account from a selected file" + }, + "imported": { + "message": "आयातीत", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "loading": { + "message": "लोड करीत आहे..." + }, + "next": { + "message": "पà¥à¤¢à¥€à¤²" + }, + "origin": { + "message": "मूळ" + }, + "password": { + "message": "पासवरà¥à¤¡" + }, + "queue": { + "message": "रांग" + }, + "reset": { + "message": "रीसेट करा" + }, + "restore": { + "message": "पà¥à¤¨à¤°à¥à¤¸à¤‚चयित करा" + }, + "remove": { + "message": "काढून टाका" + }, + "removeAccount": { + "message": "खाते काढून टाका" + }, + "save": { + "message": "सेवà¥à¤¹ करा" + }, + "slow": { + "message": "धीमी" + }, + "search": { + "message": "शोधा" + }, + "send": { + "message": "पाठवा" + }, + "settings": { + "message": "सेटिंगà¥à¤œ" + }, + "tryAgain": { + "message": "पà¥à¤¨à¥à¤¹à¤¾ पà¥à¤°à¤¯à¤¤à¥à¤¨ करा" + }, + "unknown": { + "message": "अनोळखी" + }, + "unlock": { + "message": "अनलॉक करा" + }, + "userName": { + "message": "वापरकरà¥à¤¤à¤¾à¤¨à¤¾à¤µ" + }, + "viewAccount": { + "message": "खाते पहा" + } +} diff --git a/app/_locales/ms/messages.json b/app/_locales/ms/messages.json new file mode 100644 index 000000000000..c4d2b538e792 --- /dev/null +++ b/app/_locales/ms/messages.json @@ -0,0 +1,1281 @@ +{ + "chartOnlyAvailableEth": { + "message": "Carta hanya tersedia di rangkaian Ethereum." + }, + "contractInteraction": { + "message": "Interaksi Kontrak" + }, + "reject": { + "message": "Tolak" + }, + "about": { + "message": "Mengenai" + }, + "aboutSettingsDescription": { + "message": "Versi, pusat sokongan, dan maklumat perhubungan" + }, + "acceleratingATransaction": { + "message": "* Mempercepatkan transaksi menggunakan harga gas lebih tinggi akan meningkatkan peluang diproses oleh rangkaian lebih cepat, tetapi ini pun tidak sentiasa dijamin." + }, + "accessingYourCamera": { + "message": "Mengakses kamera anda..." + }, + "account": { + "message": "Akaun" + }, + "accountDetails": { + "message": "Butiran Akaun" + }, + "accountName": { + "message": "Nama Akaun" + }, + "accountOptions": { + "message": "Opsyen Akaun" + }, + "accountSelectionRequired": { + "message": "Anda perlu memilih akaun!" + }, + "activityLog": { + "message": "log aktiviti" + }, + "addNetwork": { + "message": "Tambah Rangkaian" + }, + "addRecipient": { + "message": "Tambah Penerima" + }, + "advanced": { + "message": "Lanjutan" + }, + "advancedSettingsDescription": { + "message": "Akses ciri-ciri pembangun, muat turun Log Keadaan, Set Semula Akaun, sediakan jaringan ujian dan RPC tersuai" + }, + "advancedOptions": { + "message": "Pilihan Lanjutan" + }, + "addToAddressBook": { + "message": "Tambah kepada buku alamat" + }, + "addToAddressBookModalPlaceholder": { + "message": "cth. John D." + }, + "addAlias": { + "message": "Tambah alias" + }, + "addToken": { + "message": "Tambah Token" + }, + "addTokens": { + "message": "Tambah Token" + }, + "addSuggestedTokens": { + "message": "Tambah Token yang Disyorkan" + }, + "addAcquiredTokens": { + "message": "Tambah token yang anda peroleh menggunakan MetaMask" + }, + "amount": { + "message": "Jumlah" + }, + "appDescription": { + "message": "Dompat Ethereum di Pelayar anda", + "description": "The description of the application" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "approve": { + "message": "Luluskan" + }, + "approved": { + "message": "Diluluskan" + }, + "asset": { + "message": "Aset" + }, + "attemptingConnect": { + "message": "Sedang cuba menyambungkan kepada rantaian blok." + }, + "attemptToCancel": { + "message": "Cuba untuk Batalkan?" + }, + "attemptToCancelDescription": { + "message": "Menghantar percubaan ini tidak akan menjamin transaksi asal anda dibatalkan. Jika percubaan pembatalan berjaya, anda akan dikenakan yuran transaksi di atas." + }, + "attributions": { + "message": "Atribusi" + }, + "autoLockTimeLimit": { + "message": "Pemasa Logout Automatik (minit)" + }, + "autoLockTimeLimitDescription": { + "message": "Tetapkan masa melahu dalam minit sebelum MetaMask log keluar secara automatik" + }, + "average": { + "message": "Purata" + }, + "back": { + "message": "Kembali" + }, + "backToAll": { + "message": "Kembali kepada Semua" + }, + "backupApprovalNotice": { + "message": "Sandarkan kod Pemulihan Rahsia anda untuk memastikan dompet dan dana anda sentiasa selamat." + }, + "backupApprovalInfo": { + "message": "Kod rahsia ini diperlukan untuk memulihkan dompet anda sekiranya anda kehilangan peranti anda, terlupa kata laluan anda, perlu memasang semua MetaMask, atau mahu mengakses dompet anda menggunakan peranti lain." + }, + "backupNow": { + "message": "Buat sandaran sekarang" + }, + "balance": { + "message": "Baki" + }, + "balanceOutdated": { + "message": "Baki mungkin lapuk" + }, + "basic": { + "message": "Asas" + }, + "blockExplorerUrl": { + "message": "Sekat Explorer" + }, + "blockExplorerView": { + "message": "Lihat akaun pada $1", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "Gunakan Identicon Blockies" + }, + "browserNotSupported": { + "message": "Pelayar anda tidak disokong..." + }, + "builtInCalifornia": { + "message": "MetaMask direka dan dibina di California." + }, + "buyWithWyre": { + "message": "Beli ETH dengan Wyre" + }, + "buyWithWyreDescription": { + "message": "Wyre membolehkan anda menggunakan kad kredit untuk mendeposit ETH secara terus ke dalam akaun MetaMask anda." + }, + "buyCoinSwitch": { + "message": "Beli di CoinSwitch" + }, + "buyCoinSwitchExplainer": { + "message": "CoinSwitch ialah tempat sehentian untuk menukar lebih daripada 300 mata wang kripto dengan kadar terbaik." + }, + "bytes": { + "message": "Bait" + }, + "off": { + "message": "Matikan" + }, + "on": { + "message": "Hidupkan" + }, + "optionalBlockExplorerUrl": { + "message": "Sekat URL Explorer (pilihan)" + }, + "cancel": { + "message": "Batal" + }, + "cancelAttempt": { + "message": "Batalkan Percubaan" + }, + "cancellationGasFee": { + "message": "Fi Gas Pembatalan" + }, + "cancelled": { + "message": "Dibatalkan" + }, + "chainId": { + "message": "ID Rantaian" + }, + "clickToRevealSeed": { + "message": "Klik di sini untuk mendedahkan perkataan rahsia" + }, + "close": { + "message": "Tutup" + }, + "chromeRequiredForHardwareWallets": { + "message": "Anda perlu menggunakan MetaMask di Google Chrome untuk menyambung kepada Dompet Perkakasan anda." + }, + "confirm": { + "message": "Sahkan" + }, + "confirmed": { + "message": "Disahkan" + }, + "confirmPassword": { + "message": "Sahkan Kata Laluan" + }, + "confirmSecretBackupPhrase": { + "message": "Sahkan Frasa Sandaran Rahsia anda" + }, + "congratulations": { + "message": "Tahniah" + }, + "connectHardwareWallet": { + "message": "Sambungkan Dompet Perkakasan" + }, + "connect": { + "message": "Sambung" + }, + "connectingTo": { + "message": "Menyambungkan kepada $1" + }, + "connectingToKovan": { + "message": "Menyambungkan kepada Rangkaian Ujian Kovan" + }, + "connectingToMainnet": { + "message": "Menyambung kepada Rangkaian Ethereum Utama" + }, + "connectingToRopsten": { + "message": "Menyambungkan kepada Rangkaian Ujian Ropsten" + }, + "connectingToRinkeby": { + "message": "Menyambung kepada Rangkaian Ujian Rinkeby" + }, + "connectingToLocalhost": { + "message": "Menyambung kepada Localhost 8545" + }, + "connectingToGoerli": { + "message": "Menyambung kepada Rangkaian Ujian Goerli" + }, + "continueToWyre": { + "message": "Teruskan ke Wyre" + }, + "continueToCoinSwitch": { + "message": "Teruskan ke CoinSwitch" + }, + "contractDeployment": { + "message": "Penyusunan Kontrak" + }, + "copiedExclamation": { + "message": "Disalin!" + }, + "copyAddress": { + "message": "Salin alamat kepada papan klip" + }, + "copyTransactionId": { + "message": "Salin ID Transaksi" + }, + "copiedTransactionId": { + "message": "ID Transaksi yang Disalin" + }, + "copyToClipboard": { + "message": "Salin ke papan keratan" + }, + "copyPrivateKey": { + "message": "Ini kunci persendirian anda (klik untuk menyalin)" + }, + "create": { + "message": "Cipta" + }, + "createAccount": { + "message": "Cipta Akaun" + }, + "createAWallet": { + "message": "Cipta Dompet" + }, + "createPassword": { + "message": "Cipta Kata Laluan" + }, + "currencyConversion": { + "message": "Penukaran Mata Wang" + }, + "currentLanguage": { + "message": "Bahasa Semasa" + }, + "customGas": { + "message": "Suaikan Gas" + }, + "customGasSubTitle": { + "message": "Meningkatkan fi mungkin akan mengurangkan masa pemprosesan, tetapi ia tidak dijamin." + }, + "customToken": { + "message": "Token Tersuai" + }, + "customRPC": { + "message": "RPC Tersuai" + }, + "decimalsMustZerotoTen": { + "message": "Perpuluhan mestilah sekurang-kurangnya 0, dan tidak melebihi 36." + }, + "decimal": { + "message": "Bilangan Perpuluhan Kejituan" + }, + "defaultNetwork": { + "message": "Rangkaian lalai untuk transaksi Ether ialah Net Utama." + }, + "delete": { + "message": "Padam" + }, + "deleteAccount": { + "message": "Hapus Akaun" + }, + "details": { + "message": "Butiran" + }, + "directDepositEther": { + "message": "Deposit Ether Secara Terus" + }, + "directDepositEtherExplainer": { + "message": "Jika anda sudah mempunyai Ether, cara paling cepat untuk mendapatkan Ether di dompet baru anda ialah dengan deposit langsung." + }, + "done": { + "message": "Selesai" + }, + "downloadGoogleChrome": { + "message": "Muat Turun Google Chrome" + }, + "downloadSecretBackup": { + "message": "Muat turun Frasa Sandaran Rahsia ini dan simpannya secara selamat di dalam medium storan atau cakera keras tersulit luaran." + }, + "downloadStateLogs": { + "message": "Muat Turun Log Keadaan" + }, + "dontHaveAHardwareWallet": { + "message": "Tiada dompet perkakasan?" + }, + "dropped": { + "message": "Jatuh" + }, + "editContact": { + "message": "Edit Kenalan" + }, + "endOfFlowMessage1": { + "message": "Anda telah lulus ujian - simpan frasa benih anda di tempat yang selamat, itu tanggungjawab anda!" + }, + "endOfFlowMessage2": { + "message": "Petua menyimpannya dengan selamat" + }, + "endOfFlowMessage3": { + "message": "Simpan sandaran di beberapa tempat." + }, + "endOfFlowMessage4": { + "message": "Jangan sesekali kongsi frasa ini dengan sesiapa." + }, + "endOfFlowMessage5": { + "message": "Berhati-hati dengan pemancingan data! MetaMask tidak akan sesekali meminta frasa benih anda secara tiba-tiba." + }, + "endOfFlowMessage6": { + "message": "Jika anda perlu membuat sandaran ungkapan benih anda sekali lagi, anda boleh lakukannya melalui Tetapan -> Keselamatan." + }, + "endOfFlowMessage7": { + "message": "JIka anda mempunyai soalan atau melihat sesuatu yang mencurigakan, hantarkan e-mel ke support@metamask.io." + }, + "endOfFlowMessage8": { + "message": "MetaMask tidak dapat memulihkan ungkapan benih anda. Ketahui lebih lanjut." + }, + "endOfFlowMessage9": { + "message": "Ketahui lebih lanjut." + }, + "endOfFlowMessage10": { + "message": "Semua Selesai" + }, + "ensRegistrationError": { + "message": "Ralat dalam pendaftaran nama ENS" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "Nama ENS tidak ditemui di rangkaian semasa. Cuba beralih kepada Rangkaian Ethereum Utama." + }, + "enterAnAlias": { + "message": "Masukkan alias" + }, + "enterPassword": { + "message": "Masukkan kata laluan" + }, + "enterPasswordContinue": { + "message": "Masukkan kata laluan untuk teruskan" + }, + "ethereumPublicAddress": { + "message": "Alamat Awam Ethereum" + }, + "etherscanView": { + "message": "Lihat akaun di Etherscan" + }, + "estimatedProcessingTimes": { + "message": "Masa Pemprosesan yang Dijangka" + }, + "expandView": { + "message": "Kembangkan Paparan" + }, + "exportPrivateKey": { + "message": "Eksport Kekunci Persendirian" + }, + "failed": { + "message": "Gagal" + }, + "fast": { + "message": "Cepat" + }, + "faster": { + "message": "Lebih cepat" + }, + "fileImportFail": { + "message": "Pengimportan fail tidak berfungsi? Klik di sini!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "Lupakan peranti ini" + }, + "from": { + "message": "Daripada" + }, + "functionType": { + "message": "Jenis Fungsi" + }, + "gasLimit": { + "message": "Had Gas" + }, + "gasLimitInfoModalContent": { + "message": "Had gas ialah jumlah maksimum unit gas yang anda sedia belanjakan." + }, + "gasLimitTooLow": { + "message": "Had gas mestilah sekurang-kurangnya 21000" + }, + "gasUsed": { + "message": "Gas Digunakan" + }, + "gasPrice": { + "message": "Harga Gas (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "Harga Gas Teramat Rendah" + }, + "gasPriceInfoModalContent": { + "message": "Harga gas menentukan jumlah Ether yang anda sedia bayar untuk setiap unit gas." + }, + "gasPriceNoDenom": { + "message": "Harga Gas" + }, + "general": { + "message": "Am" + }, + "generalSettingsDescription": { + "message": "Penukaran mata wang, mata wang utama, bahasa, blockies identicon" + }, + "getEther": { + "message": "Dapatkan Ether" + }, + "getEtherFromFaucet": { + "message": "Dapatkan Ether daripada pili untuk $1", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "Dapatkan Bantuan." + }, + "getStarted": { + "message": "Bermula" + }, + "happyToSeeYou": { + "message": "Kami gembira bertemu anda." + }, + "hardware": { + "message": "perkakasan" + }, + "hardwareWalletConnected": { + "message": "Dompet perkakasan disambungkan" + }, + "hardwareWallets": { + "message": "Sambungkan dompet perkakasan" + }, + "hardwareWalletsMsg": { + "message": "Pilih dompet perkakasan yang anda ingin gunakan dengan MetaMask" + }, + "havingTroubleConnecting": { + "message": "Mengalami masalah untuk menyambungkan?" + }, + "here": { + "message": "di sini", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hexData": { + "message": "Data Heks" + }, + "hide": { + "message": "Sembunyikan" + }, + "hideTokenPrompt": { + "message": "Sembunyikan Token?" + }, + "history": { + "message": "Sejarah" + }, + "importAccount": { + "message": "Import Akaun" + }, + "importAccountMsg": { + "message": "Akaun yang diimport tidak akan dikaitkan dengan frasa benih akaun MetaMask asal yang anda cipta. Ketahui lebih lanjut tentang akaun import" + }, + "importAccountSeedPhrase": { + "message": "Import Akaun dengan Frasa Benih" + }, + "importWallet": { + "message": "Import Dompet" + }, + "importYourExisting": { + "message": "Import dompet sedia ada anda menggunakan frasa benih 12 perkataan" + }, + "imported": { + "message": "Diimport", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "Import menggunakan frasa benih akaun" + }, + "infoHelp": { + "message": "Info & Bantuan" + }, + "initialTransactionConfirmed": { + "message": "Transaksi awal anda telah disahkan oleh rangkaian. Klik OK untuk kembali." + }, + "insufficientBalance": { + "message": "Baki tidak mencukupi." + }, + "insufficientFunds": { + "message": "Tidak cukup wang." + }, + "insufficientTokens": { + "message": "Token tidak mencukupi." + }, + "invalidAddress": { + "message": "Alamat tidak sah" + }, + "invalidAddressRecipient": { + "message": "Alamat penerima tidak sah" + }, + "knownAddressRecipient": { + "message": "Alamat kontrak diketahui." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "Bukan rangkaian ETH, tetapkan kepada huruf kecil" + }, + "invalidInput": { + "message": "Input tidak sah." + }, + "invalidRPC": { + "message": "URL RPC tidak sah" + }, + "invalidBlockExplorerURL": { + "message": "URL Block Explorer tidak sah" + }, + "invalidSeedPhrase": { + "message": "Ungkapan benih tidak sah" + }, + "jsonFile": { + "message": "Fail JSON", + "description": "format for importing an account" + }, + "kovan": { + "message": "Rangkaian Ujian Kovan" + }, + "max": { + "message": "Maks" + }, + "learnMore": { + "message": "Maklumat lanjut" + }, + "ledgerAccountRestriction": { + "message": "Anda perlu menggunakan akaun terakhir anda sebelum anda boleh menambah yang baru." + }, + "letsGoSetUp": { + "message": "Ya, mari sediakannya!" + }, + "likeToAddTokens": { + "message": "Adakah anda ingin menambah token ini?" + }, + "links": { + "message": "Pautan" + }, + "liveGasPricePredictions": { + "message": "Ramalan Harga Gas Langsung" + }, + "loading": { + "message": "Memuatkan..." + }, + "loadingTokens": { + "message": "Memuatkan Token..." + }, + "loadMore": { + "message": "Muat Lagi" + }, + "lock": { + "message": "Log keluar" + }, + "mainnet": { + "message": "Rangkaian Ethereum Utama" + }, + "memorizePhrase": { + "message": "Hafal ungkapan ini." + }, + "message": { + "message": "Mesej" + }, + "metamaskDescription": { + "message": "Menyambungkan anda kepada Ethereum dan Web Ternyahpusat." + }, + "metamaskVersion": { + "message": "Versi MetaMask" + }, + "mobileSyncText": { + "message": "Sila masukkan kata laluan anda untuk mengesahkan ini memang anda!" + }, + "myAccounts": { + "message": "Akaun Saya" + }, + "myWalletAccounts": { + "message": "Akaun Dompet Saya" + }, + "myWalletAccountsDescription": { + "message": "Semua akaun ciptaan MetaMask anda akan ditambahkan secara automatik kepada bahagian ini." + }, + "mustSelectOne": { + "message": "Mesti memilih sekurang-kurangnya 1 token." + }, + "needEtherInWallet": { + "message": "Untuk berinteraksi dengan aplikasi ternyahpusat menggunakan MetaMask, anda memerlukan Ether di dalam dompet anda." + }, + "needImportFile": { + "message": "Anda mesti pilih fail untuk diimport.", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "Tidak boleh hantar amaun ETH negatif." + }, + "networkName": { + "message": "Nama Rangkaian" + }, + "networks": { + "message": "Rangkaian" + }, + "networkSettingsDescription": { + "message": "Tambah dan sunting rangkaian RPC tersuai" + }, + "nevermind": { + "message": "Tidak mengapa" + }, + "newAccount": { + "message": "Akaun Baru" + }, + "newAccountDetectedDialogMessage": { + "message": "Alamat baru dikesan! Klik di sini untuk menambah buku alamat anda." + }, + "newAccountNumberName": { + "message": "Akaun $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "Kenalan Baru" + }, + "newContract": { + "message": "Kontrak Baru" + }, + "newPassword": { + "message": "Kata Laluan Baru (min 8 aks)" + }, + "newNetwork": { + "message": "Rangkaian Baru" + }, + "newToMetaMask": { + "message": "Baru mengenali MetaMask?" + }, + "noAlreadyHaveSeed": { + "message": "Tidak, saya sudah pun memiliki frasa benih" + }, + "protectYourKeys": { + "message": "Lindungi Kunci Anda!" + }, + "protectYourKeysMessage1": { + "message": "Berhati-hati dengan ungkapan benih anda — terdapat laporan ada tapak web yang cuba meniru MetaMask. MetaMask tidak sekali-kali akan meminta ungkapan benih anda!" + }, + "protectYourKeysMessage2": { + "message": "Pastikan ungkapan anda selamat. Jika anda melihterlihat at sesuatu yang mencurigakan, atau anda tidak pasti mengenai tapak web tertentu, e-mel kepada support@metamask.io" + }, + "rpcUrl": { + "message": "URL RPC baru" + }, + "optionalChainId": { + "message": "ChainID (pilihan)" + }, + "optionalSymbol": { + "message": "Simbol (pilihan)" + }, + "newTotal": { + "message": "Jumlah Keseluruhan Baru" + }, + "newTransactionFee": { + "message": "Fi Transaksi Baru" + }, + "next": { + "message": "Seterusnya" + }, + "noAddressForName": { + "message": "Tiada alamat yang ditetapkan untuk nama ini." + }, + "noConversionRateAvailable": { + "message": "Tiada Kadar Penukaran yang Tersedia" + }, + "noTransactions": { + "message": "Anda tiada transaksi" + }, + "notEnoughGas": { + "message": "Tidak Cukup Gas" + }, + "noWebcamFoundTitle": { + "message": "Kamera web tidak ditemui" + }, + "noWebcamFound": { + "message": "Webcam komputer anda tidak dijumpai. Sila cuba semula." + }, + "ofTextNofM": { + "message": "daripada" + }, + "orderOneHere": { + "message": "Pesan Trezor atau Ledger dan simpan dana anda di dalam storan sejuk" + }, + "origin": { + "message": "Asal" + }, + "parameters": { + "message": "Parameter" + }, + "participateInMetaMetrics": { + "message": "Sertai MetaMetrics" + }, + "participateInMetaMetricsDescription": { + "message": "Sertai MetaMetrics untuk membantu kami menambah baik MetaMask" + }, + "password": { + "message": "Kata laluan" + }, + "passwordsDontMatch": { + "message": "Kata Laluan Tidak Sepadan" + }, + "passwordNotLongEnough": { + "message": "Kata laluan tidak cukup panjang" + }, + "pastePrivateKey": { + "message": "Tampal rentetan kekunci persendirian anda di sini:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "menunggu" + }, + "personalAddressDetected": { + "message": "Alamat peribadi dikesan. Masukkan alamat kontrak token." + }, + "prev": { + "message": "Sebelumnya" + }, + "primaryCurrencySetting": { + "message": "Mata Wang Utama" + }, + "primaryCurrencySettingDescription": { + "message": "Pilih natif untuk mengutamakan nilai paparan dalam mata wang natif rantaian (cth. ETH). Pilih Fiat untuk mengutamakan nilai paparan dalam mata wang fiat yang anda pilih." + }, + "privacyMsg": { + "message": "Dasar Privasi" + }, + "privateKey": { + "message": "Kekunci Persendirian", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "Amaran: Jangan sekali-kali dedahkan kunci ini. Sesiapa sahaja dengan kunci persendirian anda boleh mencuri sebarang aset yang tersimpan di dalam akaun anda." + }, + "privateNetwork": { + "message": "Rangkaian Persendirian" + }, + "queue": { + "message": "Baris Gilir" + }, + "readdToken": { + "message": "Anda boleh tambah token ini kembali pada masa depan dengan pergi ke \"Tambah token\" di dalam menu pilihan akaun anda." + }, + "recents": { + "message": "Baru-baru ini" + }, + "recipientAddress": { + "message": "Alamat Penerima" + }, + "recipientAddressPlaceholder": { + "message": "Cari, alamat awam (0x), atau ENS" + }, + "rejectAll": { + "message": "Tolak Semua" + }, + "rejectTxsN": { + "message": "Tolak transaksi $1" + }, + "rejectTxsDescription": { + "message": "Anda akan menolak secara kelompok $1 transaksi." + }, + "rejected": { + "message": "Ditolak" + }, + "reset": { + "message": "Tetapkan semula" + }, + "resetAccount": { + "message": "Tetapkan Semula Akaun" + }, + "resetAccountDescription": { + "message": "Menetapkan semula akaun anda akan mengosongkan sejarah transaksi anda." + }, + "deleteNetwork": { + "message": "Padamkan Rangkaian?" + }, + "deleteNetworkDescription": { + "message": "Anda pasti anda ingin padamkan rangkaian ini?" + }, + "remindMeLater": { + "message": "Ingatkan saya nanti" + }, + "restoreFromSeed": { + "message": "Pulihkan akaun?" + }, + "restoreAccountWithSeed": { + "message": "Pulihkan Akaun anda dengan Ungkapan Benih" + }, + "requestsAwaitingAcknowledgement": { + "message": "permintaan menunggu untuk diakui" + }, + "required": { + "message": "Diwajibkan" + }, + "restore": { + "message": "Pulihkan" + }, + "revealSeedWords": { + "message": "Dedahkan Ungkapan Benih" + }, + "revealSeedWordsTitle": { + "message": "Frasa Benih" + }, + "revealSeedWordsDescription": { + "message": "Jika anda pernah menukar pelayar atau berpindah komputer, anda memerlukan ungkapan benih ini untuk mengakses akaun anda. Simpan ungkapan di tempat yang selamat dan rahsia." + }, + "revealSeedWordsWarningTitle": { + "message": "JANGAN berkongsi ungkapan ini dengan orang lain!" + }, + "revealSeedWordsWarning": { + "message": "Perkataan ini boleh digunakan untuk mencuri kesemua akaun anda." + }, + "remove": { + "message": "Alih keluar" + }, + "removeAccount": { + "message": "Alih keluar akaun" + }, + "removeAccountDescription": { + "message": "Akaun ini akan dibuang daripada dompet anda. Sila pastikan anda mempunyai ungkapan benih asal atau kunci persendirian untuk akaun yang diimport ini sebelum meneruskan. Anda boleh import atau cipta akaun semula daripada juntai bawah akaun." + }, + "readyToConnect": { + "message": "Bersedia Menyambung?" + }, + "rinkeby": { + "message": "Rangkaian Ujian Rinkeby" + }, + "ropsten": { + "message": "Rangkaian Ujian Ropsten" + }, + "goerli": { + "message": "Rangkaian Ujian Goerli" + }, + "save": { + "message": "Simpan" + }, + "slow": { + "message": "Perlahan" + }, + "slower": { + "message": "Lebih Perlahan" + }, + "saveAsCsvFile": { + "message": "Simpan sebagai Fail CSV" + }, + "scanInstructions": { + "message": "Bawa kod QR ke hadapan kamera anda" + }, + "scanQrCode": { + "message": "Imbas Kod QR" + }, + "search": { + "message": "Carian" + }, + "searchResults": { + "message": "Hasil Carian" + }, + "secretBackupPhrase": { + "message": "Ungkapan Sandaran Rahsia" + }, + "secretBackupPhraseDescription": { + "message": "Ungkapan rahsia sandaran anda memudahkan membuat sandaran dan memulihkan akaun anda." + }, + "secretBackupPhraseWarning": { + "message": "AMARAN: Jangan sesekali dedahkan frasa sandaran anda. Sesiapa yang memperoleh frasa ini boleh mengambil Ether anda selama-lamanya." + }, + "secretPhrase": { + "message": "Masukkan ungkapan rahsia dua belas perkataan di sini untuk memulihkan kekubah anda." + }, + "securityAndPrivacy": { + "message": "Keselamatan & Privasi" + }, + "securitySettingsDescription": { + "message": "Tetapan privasi dan ungkapan benih dompet" + }, + "seedPhrasePlaceholder": { + "message": "Pisahkan setiap perkataan dengan satu ruang" + }, + "seedPhraseReq": { + "message": "Frasa benih panjangnya 12 patah perkataan" + }, + "selectCurrency": { + "message": "Pilih Mata Wang" + }, + "selectEachPhrase": { + "message": "Sila pilih setiap ungkapan untuk memastikan ia betul." + }, + "selectLocale": { + "message": "Pilih Penempatan" + }, + "selectType": { + "message": "Pilih Jenis" + }, + "send": { + "message": "Hantar" + }, + "sendAmount": { + "message": "Hantar Amaun" + }, + "sendETH": { + "message": "Hantar ETH" + }, + "sendTokens": { + "message": "Hantar Token" + }, + "sentEther": { + "message": "menghantar ether" + }, + "sentTokens": { + "message": "token dihantar" + }, + "separateEachWord": { + "message": "Pisahkan setiap perkataan dengan ruang tunggal" + }, + "searchTokens": { + "message": "Cari Token" + }, + "selectAnAccount": { + "message": "Pilih Akaun" + }, + "selectAnAccountHelp": { + "message": "Pilih akaun untuk dilihat dalam MetaMask" + }, + "selectAHigherGasFee": { + "message": "Pilih yuran gas yang lebih tinggi untuk mempercepatkan pemprosesan transaksi anda.*" + }, + "selectHdPath": { + "message": "Pilih Laluan HD" + }, + "selectPathHelp": { + "message": "Jika anda tidak melihat akaun Ledger sedia ada anda di bawah, cuba tukar laluan kepada \"Legacy (MEW / MyCrypto)\"" + }, + "settings": { + "message": "Tetapan" + }, + "showAdvancedGasInline": { + "message": "Kawalan gas lanjutan" + }, + "showAdvancedGasInlineDescription": { + "message": "Pilih ini untuk menunjukkan harga gas dan kawalan had terus di skrin hantar dan sahkan." + }, + "showFiatConversionInTestnets": { + "message": "Tunjukkan Penukaran di Testnets" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Pilih ini untuk menunjukkan penukaran fiat di Testnets" + }, + "showPrivateKeys": { + "message": "Tunjukkan Kunci Persendirian" + }, + "showHexData": { + "message": "Tunjukkan Data Heks" + }, + "showHexDataDescription": { + "message": "Pilih ini untuk menunjukkan medan data hex pada skrin hantar" + }, + "sign": { + "message": "Tandatangan" + }, + "signatureRequest": { + "message": "Permintaan Tandatangan" + }, + "signed": { + "message": "Ditandatangani" + }, + "signNotice": { + "message": "Menandatangani mesej ini boleh menyebabkan kesan sampingan yang berbahaya. Hanya tandatangan mesej daripada tapak yang anda percayai sepenuhnya dengan seluruh akaun anda. Kaedah berbahaya ini akan dibuang dalam versi akan datang." + }, + "sigRequest": { + "message": "Permintaan Tandatangan" + }, + "somethingWentWrong": { + "message": "Alamak! Ada yang tak kena." + }, + "speedUp": { + "message": "Percepatkan" + }, + "speedUpCancellation": { + "message": "Cepatkan pembatalan ini" + }, + "speedUpTransaction": { + "message": "Percepatkan transaksi ini" + }, + "switchNetworks": { + "message": "Tukar Rangkaian" + }, + "stateLogs": { + "message": "Log Keadaan" + }, + "stateLogsDescription": { + "message": "Log keadaan mengandungi alamat akaun awam anda dan transaksi dihantar." + }, + "stateLogError": { + "message": "Ralat mendapatkan semula log keadaan." + }, + "step1HardwareWallet": { + "message": "1. Sambungkan Dompet Perkakasan" + }, + "step1HardwareWalletMsg": { + "message": "Sambungkan dompet perkakasan anda terus kepada komputer anda." + }, + "step2HardwareWallet": { + "message": "2. Pilih Akaun" + }, + "step2HardwareWalletMsg": { + "message": "Pilih akaun yang anda mahu lihat. Anda hanya boleh memilih satu pada suatu masa." + }, + "step3HardwareWallet": { + "message": "3. Mula menggunakan dApps dan banyak lagi!" + }, + "step3HardwareWalletMsg": { + "message": "Gunakan akaun perkakasan anda sepertimana anda menggunakan akaun Ethereum. Log masuk ke dalam dApps, hantar Eth, beli dan simpan token ERC20 serta token Tidak Mudah Tukar seperti CryptoKitties." + }, + "storePhrase": { + "message": "Simpan ungkapan ini di dalam pengurus kata laluan seperti 1Password." + }, + "submitted": { + "message": "Dihantar" + }, + "supportCenter": { + "message": "Lawat Pusat Sokongan kami" + }, + "symbol": { + "message": "Simbol" + }, + "symbolBetweenZeroTwelve": { + "message": "Simbol mestilah 11 aksara atau kurang." + }, + "syncWithMobile": { + "message": "Segerakkan dengan telefon mudah alih" + }, + "syncWithMobileTitle": { + "message": "Segerakkan dengan mudah alih" + }, + "syncWithMobileDesc": { + "message": "Anda boleh menyegerakkan akaun dan maklumat anda dengan peranti mudah alih anda. Buka ap mudah alih MetaMask, pergi ke \"Tetapan\" dan ketik \"Segerakkan daripada Sambungan Pelayar\"" + }, + "syncWithMobileDescNewUsers": { + "message": "Jika ini kali pertama anda membuka aplikasi mudah alih MetaMask, anda cuma perlu ikuti langkah-langkah di telefon anda." + }, + "syncWithMobileScanThisCode": { + "message": "Imbas kod ini dengan aplikasi mudah alih MetaMask anda" + }, + "syncWithMobileBeCareful": { + "message": "Pastikan tiada orang lain melihat skrin anda ketika anda mengimbas kod ini" + }, + "syncWithMobileComplete": { + "message": "Data anda berjaya disegerakkan. Nikmati aplikasi mudah alih MetaMask!" + }, + "terms": { + "message": "Syarat-syarat Penggunaan" + }, + "testFaucet": { + "message": "Uji Pili" + }, + "thisWillCreate": { + "message": "Ini akan mencipta dompet dan frasa benih baru" + }, + "tips": { + "message": "Tip" + }, + "to": { + "message": "Kepada" + }, + "tokenAlreadyAdded": { + "message": "Token telah pun ditambah." + }, + "tokenContractAddress": { + "message": "Alamat Kontrak Token" + }, + "tokenSymbol": { + "message": "Simbol Token" + }, + "total": { + "message": "Jumlah" + }, + "transaction": { + "message": "transaksi" + }, + "transactionConfirmed": { + "message": "Transaksi disahkan pada $2." + }, + "transactionCreated": { + "message": "Transaksi dicipta dengan nilai $1 pada $2." + }, + "transactionDropped": { + "message": "Transaksi jatuh pada $2." + }, + "transactionSubmitted": { + "message": "Transaksi dihantar dengan fi gas sebanyak $1 pada $2." + }, + "transactionResubmitted": { + "message": "Transaksi dihantar semula dengan fi gas ditingkatkan kepada $1 pada $2." + }, + "transactionUpdated": { + "message": "Transaksi dikemaskini pada $2." + }, + "transactionErrored": { + "message": "Transaksi berdepan ralat." + }, + "transactionCancelAttempted": { + "message": "Pembatalan transaksi dicuba dengan yuran gas sebanyak $1 pada $2" + }, + "transactionCancelSuccess": { + "message": "Transaksi berjaya dibatalkan pada $2" + }, + "transactionError": { + "message": "Ralat Transaksi. Pengecualian diberi dalam kod kontrak." + }, + "transactionErrorNoContract": { + "message": "Cuba memanggil fungsi untuk alamat bukan kontrak." + }, + "transactionFee": { + "message": "Yuran Transaksi" + }, + "transactionTime": { + "message": "Masa Transaksi" + }, + "transfer": { + "message": "Pindah" + }, + "transferBetweenAccounts": { + "message": "Pindahkan antara akaun saya" + }, + "transferFrom": { + "message": "Pindah Daripada" + }, + "troubleTokenBalances": { + "message": "Kami menghadapi masalah memuatkan baki token anda. Anda boleh melihatnya", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "Cuba lagi" + }, + "typePassword": { + "message": "Taip kata laluan MetaMask anda" + }, + "unapproved": { + "message": "Belum Diluluskan" + }, + "units": { + "message": "unit" + }, + "unknown": { + "message": "Tidak diketahui" + }, + "unknownNetwork": { + "message": "Rangkaian Persendirian Tidak Dikenali" + }, + "unknownQrCode": { + "message": "Ralat: Kami tidak dapat mengenal pasti kod QR tersebut" + }, + "unknownCameraErrorTitle": { + "message": "Alamak! Ada yang tak kena...." + }, + "unknownCameraError": { + "message": "Terdapat ralat semasa cuba mengakses kamera anda. Sila cuba sekali lagi..." + }, + "unlock": { + "message": "Buka kunci" + }, + "unlockMessage": { + "message": "Web ternyahpusat menanti" + }, + "updatedWithDate": { + "message": "Dikemaskini $1" + }, + "urlErrorMsg": { + "message": "URI memerlukan awalan HTTP/HTTPS yang sesuai." + }, + "usedByClients": { + "message": "Digunakan oleh pelbagai klien berbeza" + }, + "userName": { + "message": "Nama pengguna" + }, + "viewAccount": { + "message": "Paparkan Akaun" + }, + "viewinExplorer": { + "message": "Lihat di Explorer" + }, + "viewContact": { + "message": "Lihat Kenalan" + }, + "viewOnCustomBlockExplorer": { + "message": "Lihat pada $1" + }, + "viewOnEtherscan": { + "message": "Lihat di Etherscan" + }, + "visitWebSite": { + "message": "Kunjungi laman web kami" + }, + "walletSeed": { + "message": "Benih Dompet" + }, + "welcomeBack": { + "message": "Selamat Kembali!" + }, + "welcome": { + "message": "Selamat datang ke MetaMask" + }, + "writePhrase": { + "message": "Tulis frasa ini di atas kertas dan simpan di tempat yang selamat. JIka anda mahu lebih selamat, tuliskannya di beberapa helai kertas dan simpan setiap satunya di 2 -3 lokasi berbeza." + }, + "yesLetsTry": { + "message": "Ya, mari cuba" + }, + "youNeedToAllowCameraAccess": { + "message": "Anda perlu membenarkan akses kamera untuk menggunakan ciri ini." + }, + "yourSigRequested": { + "message": "Tandatangan anda sedang diminta" + }, + "youSign": { + "message": "Anda menandatangani" + }, + "yourPrivateSeedPhrase": { + "message": "Ungkapan benih peribadi anda" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "Sifar harga gas untuk pencepatan" + } +} diff --git a/app/_locales/nl/messages.json b/app/_locales/nl/messages.json index ade7327deffe..ff4695c93ef2 100644 --- a/app/_locales/nl/messages.json +++ b/app/_locales/nl/messages.json @@ -1,67 +1,13 @@ { - "privacyMode": { - "message": "Privacy-modus" - }, - "privacyModeDescription": { - "message": "Websites moeten toegang vragen om uw accountgegevens te bekijken." - }, - "exposeAccounts": { - "message": "Expose Accounts" - }, - "exposeDescription": { - "message": "Stel accounts vrij op de huidige website. Handig voor legacy dapps." - }, - "confirmExpose": { - "message": "Weet u zeker dat u uw accounts wilt weergeven aan de huidige website?" - }, - "confirmClear": { - "message": "Weet je zeker dat je goedgekeurde websites wilt wissen?" - }, - "clearApprovalDataSuccess": { - "message": "Goedgekeurde websitegegevens zijn met succes gewist." - }, - "approvalData": { - "message": "Goedkeuringsgegevens" - }, - "approvalDataDescription": { - "message": "Goedgekeurde websitegegevens wissen zodat alle sites opnieuw goedkeuring moeten aanvragen." - }, - "clearApprovalData": { - "message": "Gegevens over goedkeuring wissen" - }, - "approve": { - "message": "Goedkeuren" - }, "reject": { "message": "Afwijzen" }, - "providerAPIRequest": { - "message": "Web3 API-aanvraag" - }, - "reviewProviderRequest": { - "message": "Bekijk deze Ethereum API-aanvraag." - }, - "providerRequestInfo": { - "message": "Het onderstaande domein probeert toegang tot de Ethereum API te vragen zodat deze kan communiceren met de Ethereum-blockchain. Controleer altijd eerst of u op de juiste site bent voordat u Ethereum-toegang goedkeurt." - }, - "accept": { - "message": "Aanvaarden" - }, - "account": { - "message": "Account" - }, "accountDetails": { "message": "Accountgegevens" }, "accountName": { "message": "Accountnaam" }, - "address": { - "message": "Adres" - }, - "addCustomToken": { - "message": "Aangepaste token toevoegen" - }, "addToken": { "message": "Voeg token toe" }, @@ -71,16 +17,16 @@ "amount": { "message": "Bedrag" }, - "amountPlusGas": { - "message": "Bedrag + gas" - }, "appDescription": { "message": "Ethereum Browser-extensie", - "description": "De beschrijving van de applicatie" + "description": "The description of the application" }, "appName": { "message": "MetaMask", - "description": "De naam van de applicatie" + "description": "The name of the application" + }, + "approve": { + "message": "Goedkeuren" }, "attemptingConnect": { "message": "Poging om verbinding te maken met blockchain." @@ -88,46 +34,18 @@ "attributions": { "message": "Bevoegdheden" }, - "available": { - "message": "Beschikbaar" - }, "back": { "message": "Terug" }, "balance": { "message": "Balans:" }, - "balances": { - "message": "Je saldo" - }, - "balanceIsInsufficientGas": { - "message": "Onvoldoende saldo voor huidig ​​gastotaal" - }, - "beta": { - "message": "BETA" - }, - "betweenMinAndMax": { - "message": "moet groter zijn dan of gelijk zijn aan $1 en kleiner dan of gelijk aan $2.", - "description": "helper voor het invoeren van hex als decimale invoer" - }, "blockiesIdenticon": { "message": "Gebruik Blockies Identicon" }, - "borrowDharma": { - "message": "Lenen met Dharma (Beta)" - }, "builtInCalifornia": { "message": "MetaMask is ontworpen en gebouwd in Californië." }, - "buy": { - "message": "Kopen" - }, - "buyCoinbase": { - "message": "Koop op Coinbase" - }, - "buyCoinbaseExplainer": { - "message": "Coinbase is 's werelds populairste manier om Bitcoin, Ethereum en Litecoin te kopen en verkopen." - }, "buyCoinSwitch": { "message": "Koop op CoinSwitch" }, @@ -137,60 +55,24 @@ "cancel": { "message": "Annuleer" }, - "classicInterface": { - "message": "Gebruik de klassieke interface" - }, - "clickCopy": { - "message": "Klik om te kopiëren" - }, "confirm": { "message": "Bevestigen" }, - "confirmContract": { - "message": "Contract bevestigen" - }, "confirmPassword": { "message": "bevestig wachtwoord" }, - "confirmTransaction": { - "message": "Bevestig transactie" - }, - "continue": { - "message": "Doorgaan met" - }, - "continueToCoinbase": { - "message": "Ga verder naar Coinbase" - }, "continueToCoinSwitch": { "message": "Ga verder naar CoinSwitch" }, "contractDeployment": { "message": "Contractimplementatie" }, - "conversionProgress": { - "message": "Bezig met conversie" - }, - "copiedButton": { - "message": "gekopieerde" - }, - "copiedClipboard": { - "message": "Gekopieerd naar het klembord" - }, "copiedExclamation": { "message": "Gekopieerde!" }, - "copiedSafe": { - "message": "Ik heb het ergens veilig gekopieerd" - }, - "copy": { - "message": "Kopiëren" - }, "copyToClipboard": { "message": "Kopieer naar klembord" }, - "copyButton": { - "message": " Kopiëren " - }, "copyPrivateKey": { "message": "Dit is uw privésleutel (klik om te kopiëren)" }, @@ -200,25 +82,9 @@ "createAccount": { "message": "Account aanmaken" }, - "createDen": { - "message": "creëren" - }, - "crypto": { - "message": "crypto", - "description": "Ruiltype (cryptocurrencies)" - }, - "currentConversion": { - "message": "Huidige conversie" - }, - "currentNetwork": { - "message": "Huidig ​​netwerk" - }, "customGas": { "message": "Pas Gas aan" }, - "customize": { - "message": "Aanpassen" - }, "customRPC": { "message": "Aangepaste RPC" }, @@ -231,39 +97,12 @@ "defaultNetwork": { "message": "Het standaardnetwerk voor Ether-transacties is Main Net." }, - "denExplainer": { - "message": "Uw DEN is uw wachtwoord-gecodeerde opslag binnen MetaMask." - }, "deposit": { "message": "Storting" }, - "depositBTC": { - "message": "Stort uw BTC op het onderstaande adres:" - }, - "depositEth": { - "message": "Aanbetaling Eth" - }, "depositEther": { "message": "Stort Ether" }, - "depositFiat": { - "message": "Stort met Fiat" - }, - "depositFromAccount": { - "message": "Storten van een ander account" - }, - "depositShapeShift": { - "message": "Stort met ShapeShift" - }, - "depositShapeShiftExplainer": { - "message": "Als u andere cryptocurrencies bezit, kunt u Ether direct in uw MetaMask-portemonnee ruilen en storten. Geen account nodig." - }, - "details": { - "message": "Details" - }, - "directDeposit": { - "message": "Directe storting" - }, "directDepositEther": { "message": "Directe Ether storten" }, @@ -279,123 +118,58 @@ "edit": { "message": "Bewerk" }, - "editAccountName": { - "message": "Bewerk accountnaam" - }, - "emailUs": { - "message": "Email ons!" - }, - "encryptNewDen": { - "message": "Versleutel je nieuwe DEN" - }, "enterPassword": { "message": "Voer wachtwoord in" }, - "enterPasswordConfirm": { - "message": "Voer uw wachtwoord in om te bevestigen" - }, "etherscanView": { "message": "Bekijk account op Etherscan" }, - "exchangeRate": { - "message": "Wisselkoers" - }, "exportPrivateKey": { "message": "Exporteer privésleutel" }, - "exportPrivateKeyWarning": { - "message": "Exporteer privésleutels op eigen risico." - }, "failed": { "message": "mislukt" }, "fiat": { "message": "FIAT", - "description": "Ruiltype" + "description": "Exchange type" }, "fileImportFail": { "message": "Bestandsimport werkt niet? Klik hier!", - "description": "Helpt de gebruiker om zijn account vanuit een JSON-bestand te importeren" - }, - "followTwitter": { - "message": "Volg ons op Twitter" + "description": "Helps user import their account from a JSON file" }, "from": { "message": "Van" }, - "fromToSame": { - "message": "Van en naar adres kan niet hetzelfde zijn" - }, - "fromShapeShift": { - "message": "Van ShapeShift" - }, - "gas": { - "message": "Gas", - "description": "Korte indicatie van gaskosten" - }, - "gasFee": { - "message": "Gas vergoeding" - }, "gasLimit": { "message": "Gaslimiet" }, - "gasLimitCalculation": { - "message": "We berekenen de voorgestelde gaslimiet op basis van succespercentages van het netwerk." - }, - "gasLimitRequired": { - "message": "Gaslimiet vereist" - }, "gasLimitTooLow": { "message": "De gaslimiet moet minstens 21000 zijn" }, - "generatingSeed": { - "message": "Back-up woorden produceren ..." - }, "gasPrice": { "message": "Gasprijs (GWEI)" }, - "gasPriceCalculation": { - "message": "We berekenen de voorgestelde gasprijzen op basis van succespercentages van het netwerk." - }, - "gasPriceRequired": { - "message": "Gasprijs vereist" - }, "getEther": { "message": "Krijg Ether" }, "getEtherFromFaucet": { "message": "Haal Ether uit een kraan voor de $1", - "description": "Geeft de netwerknaam voor Ether-kraan weer" - }, - "greaterThanMin": { - "message": "moet groter zijn dan of gelijk zijn aan $1.", - "description": "helper voor het invoeren van hex als decimale invoer" + "description": "Displays network name for Ether faucet" }, "here": { "message": "hier", - "description": "zoals in -klik hier- voor meer informatie (gaat met troubleTokenBalances)" - }, - "hereList": { - "message": "Hier is een lijst !!!!" + "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, "hide": { "message": "Verbergen" }, - "hideToken": { - "message": "Token verbergen" - }, "hideTokenPrompt": { "message": "Token verbergen?" }, - "howToDeposit": { - "message": "Hoe zou je Ether willen deponeren?" - }, - "holdEther": { - "message": "Hiermee kunt u ether & tokens bewaren en dient u als brug naar gedecentraliseerde applicaties." - }, "import": { "message": "Importeren", - "description": "Knop om een ​​account uit een geselecteerd bestand te importeren" + "description": "Button to import an account from a selected file" }, "importAccount": { "message": "Account importeren" @@ -403,15 +177,9 @@ "importAccountMsg": { "message": " Geïmporteerde accounts worden niet gekoppeld aan de seedphrase van uw oorspronkelijk gemaakte MetaMask-account. Meer informatie over geïmporteerde accounts" }, - "importAnAccount": { - "message": "Importeer een account" - }, - "importDen": { - "message": "Bestaande DEN importeren" - }, "imported": { "message": "geïmporteerde", - "description": "status die aantoont dat een account volledig in de sleutelring is geladen" + "description": "status showing that an account has been fully loaded into the keyring" }, "infoHelp": { "message": "Info en hulp" @@ -428,62 +196,37 @@ "invalidAddressRecipient": { "message": "Het adres van de ontvanger is ongeldig" }, - "invalidGasParams": { - "message": "Ongeldige gasparameters" - }, "invalidInput": { "message": "Ongeldige invoer." }, - "invalidRequest": { - "message": "ongeldig verzoek" - }, "invalidRPC": { "message": "Ongeldige RPC-URI" }, - "jsonFail": { - "message": "Er is iets fout gegaan. Zorg ervoor dat uw JSON-bestand correct is opgemaakt." + "invalidBlockExplorerURL": { + "message": "Ongeldige Block Explorer URI" }, "jsonFile": { "message": "JSON-bestand", - "description": "formaat voor het importeren van een account" + "description": "format for importing an account" }, "kovan": { "message": "Kovan-testnetwerk" }, - "knowledgeDataBase": { - "message": "Bezoek onze Knowledge Base" - }, - "lessThanMax": { - "message": "moet kleiner zijn dan of gelijk zijn aan $1.", - "description": "helper voor het invoeren van hex als decimale invoer" - }, "likeToAddTokens": { "message": "Wil je deze tokens toevoegen?" }, - "limit": { - "message": "Begrenzing" - }, "loading": { "message": "Bezig met laden..." }, "loadingTokens": { "message": "Tokens laden ..." }, - "localhost": { - "message": "Localhost 8545" - }, - "login": { + "unlock": { "message": "Log in" }, - "logout": { + "lock": { "message": "Uitloggen" }, - "loose": { - "message": "Los" - }, - "loweCaseWords": { - "message": "back-up woorden hebben alleen kleine letters" - }, "mainnet": { "message": "Main Netwerk" }, @@ -493,9 +236,6 @@ "metamaskDescription": { "message": "MetaMask is een veilige identiteitskluis voor Ethereum." }, - "min": { - "message": "Minimum" - }, "myAccounts": { "message": "Mijn accounts" }, @@ -507,11 +247,7 @@ }, "needImportFile": { "message": "U moet een bestand selecteren om te importeren.", - "description": "Gebruiker is belangrijk een account en moet een bestand toevoegen om door te gaan" - }, - "needImportPassword": { - "message": "U moet een wachtwoord invoeren voor het geselecteerde bestand.", - "description": "Wachtwoord en bestand nodig om een ​​account te importeren" + "description": "User is important an account and needs to add a file to continue" }, "negativeETH": { "message": "Kan geen negatieve hoeveelheden ETH verzenden." @@ -522,80 +258,34 @@ "newAccount": { "message": "Nieuw account" }, - "newAccountNumberName": { - "message": "Account $1", - "description": "Standaardnaam van de volgende account die moet worden aangemaakt op het scherm voor het maken van een account" - }, "newContract": { "message": "Nieuw contract" }, "newPassword": { "message": "Nieuw wachtwoord (min 8 tekens)" }, - "newRecipient": { - "message": "Nieuwe ontvanger" - }, - "newRPC": { - "message": "Nieuwe RPC-URL" - }, "next": { "message": "volgende" }, "noAddressForName": { "message": "Er is geen adres ingesteld voor deze naam." }, - "noDeposits": { - "message": "Geen aanbetalingen ontvangen" - }, - "noTransactionHistory": { - "message": "Geen transactiegeschiedenis." - }, "noTransactions": { "message": "Geen transacties" }, - "notStarted": { - "message": "Niet begonnen" - }, - "oldUI": { - "message": "Oude gebruikersinterface" - }, - "oldUIMessage": { - "message": "U bent teruggekeerd naar de oude gebruikersinterface. U kunt terugschakelen naar de nieuwe gebruikersinterface via de optie in het vervolgkeuzemenu in de rechterbovenhoek." - }, - "or": { - "message": "of", - "description": "keuze tussen het maken of importeren van een nieuw account" - }, - "passwordCorrect": { - "message": "Zorg ervoor dat uw wachtwoord correct is." - }, - "passwordMismatch": { - "message": "wachtwoorden komen niet overeen", - "description": "bij het maken van het wachtwoord kwamen de twee nieuwe wachtwoordvelden niet overeen" - }, - "passwordShort": { - "message": "wachtwoord niet lang genoeg", - "description": "bij het maken van het wachtwoord is het wachtwoord niet lang genoeg om veilig te zijn" - }, "pastePrivateKey": { "message": "Plak hier uw privésleutelstring:", - "description": "Voor het importeren van een account vanaf een privésleutel" - }, - "pasteSeed": { - "message": "Plak je back-up woorden hier!" + "description": "For importing an account from a private key" }, "personalAddressDetected": { "message": "Persoonlijk adres gedetecteerd. Voer het tokencontractadres in." }, - "pleaseReviewTransaction": { - "message": "Controleer uw transactie." - }, "privacyMsg": { "message": "Privacybeleid" }, "privateKey": { "message": "Prive sleutel", - "description": "selecteer dit type bestand om te gebruiken om een ​​account te importeren" + "description": "select this type of file to use to import an account" }, "privateKeyWarning": { "message": "Waarschuwing: open deze sleutel nooit. Iedereen met uw privésleutels kan stelen van alle items in uw account." @@ -603,27 +293,12 @@ "privateNetwork": { "message": "Prive netwerk" }, - "qrCode": { - "message": "QR-code weergeven" - }, "readdToken": { "message": "U kunt dit token in de toekomst weer toevoegen door naar \"Token toevoegen\" te gaan in het menu met accountopties." }, - "readMore": { - "message": "Lees hier meer." - }, - "readMore2": { - "message": "Lees verder." - }, - "receive": { - "message": "Te ontvangen" - }, "recipientAddress": { "message": "Geadresseerde adres" }, - "refundAddress": { - "message": "Uw teruggave adres" - }, "rejected": { "message": "Verworpen" }, @@ -636,38 +311,21 @@ "required": { "message": "Verplicht" }, - "retryWithMoreGas": { - "message": "Probeer hier opnieuw met een hogere gasprijs" - }, "revealSeedWords": { "message": "Onthul back-up woorden" }, "revealSeedWordsWarning": { "message": "Zorg dat je back-up woorden niet op een openbare plaats bekijkt! Deze woorden kunnen worden gebruikt om al uw accounts opnieuw te genereren (en dus uw account te stelen)." }, - "revert": { - "message": "terugkeren" - }, "rinkeby": { "message": "Rinkeby testnetwerk" }, "ropsten": { "message": "Ropsten testnetwerk" }, - "sampleAccountName": { - "message": "Bijv. Mijn nieuwe account", - "description": "Help de gebruiker begrip te ontwikkelen van het toevoegen van een door mensen leesbare naam aan zijn of haar account" - }, "save": { "message": "Opslaan" }, - "saveAsFile": { - "message": "Sla op als bestand", - "description": "Account export proces" - }, - "saveSeedAsFile": { - "message": "Bewaar back-up woorden als bestand" - }, "search": { "message": "Zoeken" }, @@ -677,15 +335,9 @@ "seedPhraseReq": { "message": "Back-up woorden zijn 12 woorden lang" }, - "select": { - "message": "kiezen" - }, "selectCurrency": { "message": "selecteer valuta" }, - "selectService": { - "message": "Selecteer Service" - }, "selectType": { "message": "Selecteer type" }, @@ -698,26 +350,17 @@ "sendTokens": { "message": "Stuur tokens" }, - "sendTokensAnywhere": { - "message": "Stuur tokens naar iedereen met een Ethereum-account" - }, "settings": { "message": "instellingen" }, - "shapeshiftBuy": { - "message": "Koop met Shapeshift" - }, "showPrivateKeys": { "message": "Privésleutels weergeven" }, - "showQRCode": { - "message": "QR-code weergeven" - }, "sign": { "message": "Teken" }, - "signMessage": { - "message": "Teken bericht" + "signatureRequest": { + "message": "Ondertekeningsverzoek" }, "signNotice": { "message": "Het ondertekenen van dit bericht kan hebben \ngevaarlijke bijwerkingen. Meld alleen berichten van \nsites die u volledig vertrouwt met uw volledige account.\n Deze gevaarlijke methode wordt in een toekomstige versie verwijderd." @@ -725,32 +368,17 @@ "sigRequest": { "message": "Ondertekeningsverzoek" }, - "sigRequested": { - "message": "Handtekening aangevraagd" - }, - "spaceBetween": { - "message": "er kan alleen een spatie tussen woorden zijn" - }, - "status": { - "message": "staat" - }, "stateLogs": { "message": "Staatslogboeken" }, "stateLogsDescription": { "message": "Staatslogboeken bevatten uw openbare accountadressen en verzonden transacties." }, - "submit": { - "message": "voorleggen" - }, "supportCenter": { "message": "Bezoek ons ​​ondersteuningscentrum" }, "symbolBetweenZeroTwelve": { - "message": "Het symbool moet tussen 0 en 12 tekens lang zijn." - }, - "takesTooLong": { - "message": "Duurt te lang?" + "message": "Symbool moet 11 tekens of minder zijn." }, "terms": { "message": "Gebruiksvoorwaarden" @@ -761,105 +389,40 @@ "to": { "message": "Naar" }, - "toETHviaShapeShift": { - "message": "$1 tot ETH via ShapeShift", - "description": "systeem zal het aanbetalingstype invullen bij het begin van het bericht" - }, - "tokenAddress": { - "message": "Token-adres" - }, "tokenAlreadyAdded": { "message": "Token is al toegevoegd." }, - "tokenBalance": { - "message": "Uw tokensaldo is:" - }, - "tokenSelection": { - "message": "Zoek naar tokens of selecteer uit onze lijst met populaire tokens." - }, - "tokenSymbol": { - "message": "Token Symbol" - }, - "tokenWarning1": { - "message": "Houd de tokens bij die je hebt gekocht met je MetaMask-account. Als je tokens met een ander account hebt gekocht, worden die tokens hier niet weergegeven." - }, "total": { "message": "Totaal" }, - "transactions": { - "message": "transacties" - }, - "transactionMemo": { - "message": "Transactiememo (optioneel)" - }, - "transactionNumber": { - "message": "Transactie nummer" - }, - "transfers": { - "message": "transfers" - }, "troubleTokenBalances": { "message": "We hadden problemen bij het laden van uw tokenbalansen. Je kunt ze bekijken", - "description": "Gevolgd door een link (hier) om tegensaldi te bekijken" - }, - "twelveWords": { - "message": "Deze 12 woorden zijn de enige manier om uw MetaMask-accounts te herstellen.\nBewaar ze ergens veilig en geheim." + "description": "Followed by a link (here) to view token balances" }, "typePassword": { "message": "Typ uw wachtwoord" }, - "uiWelcome": { - "message": "Welkom bij de nieuwe gebruikersinterface (bèta)" - }, - "uiWelcomeMessage": { - "message": "U gebruikt nu de nieuwe gebruikersinterface van MetaMask. Kijk rond, probeer nieuwe functies uit zoals het verzenden van tokens en laat ons weten of u problemen ondervindt." - }, - "unavailable": { - "message": "Niet beschikbaar" - }, "unknown": { "message": "Onbekend" }, "unknownNetwork": { "message": "Onbekend privénetwerk" }, - "unknownNetworkId": { - "message": "Onbekende netwerk-ID" - }, - "uriErrorMsg": { + "urlErrorMsg": { "message": "Voor URI's is het juiste HTTP / HTTPS-voorvoegsel vereist." }, - "usaOnly": { - "message": "Alleen in de VS.", - "description": "Het gebruik van deze uitwisseling is beperkt tot mensen in de VS." - }, "usedByClients": { "message": "Gebruikt door verschillende klanten" }, - "useOldUI": { - "message": "Gebruik de oude gebruikersinterface" - }, - "validFileImport": { - "message": "U moet een geldig bestand selecteren om te importeren." - }, - "vaultCreated": { - "message": "Vault gemaakt" - }, "viewAccount": { "message": "Bekijk account" }, "visitWebSite": { "message": "Bezoek onze website" }, - "warning": { - "message": "Waarschuwing" - }, "welcome": { "message": "Welkom bij MetaMask" }, - "whatsThis": { - "message": "Wat is dit?" - }, "yourSigRequested": { "message": "Uw handtekening wordt aangevraagd" }, diff --git a/app/_locales/no/messages.json b/app/_locales/no/messages.json new file mode 100644 index 000000000000..54d2319b9c51 --- /dev/null +++ b/app/_locales/no/messages.json @@ -0,0 +1,1282 @@ +{ + "chartOnlyAvailableEth": { + "message": "Diagram kun tilgjengelig pÃ¥ Ethereum-nettverk." + }, + "contractInteraction": { + "message": "Kontraktssamhandling" + }, + "reject": { + "message": "AvslÃ¥" + }, + "about": { + "message": "Info" + }, + "aboutSettingsDescription": { + "message": "Versjon, brukerstøtte og kontaktinformasjon" + }, + "acceleratingATransaction": { + "message": "* Akselerering av en transaksjon ved Ã¥ bruke en høyere datakraftspris øker sjansene for Ã¥ bli behandlet av nettverket raskere, men det er ikke alltid garantert." + }, + "accessingYourCamera": { + "message": "Oppretter tilgang til kameraet ditt..." + }, + "account": { + "message": "Konto" + }, + "accountDetails": { + "message": "Kontodetaljer" + }, + "accountName": { + "message": "Kontonavn" + }, + "accountOptions": { + "message": "Kontovalg" + }, + "accountSelectionRequired": { + "message": "Du mÃ¥ velge en konto!" + }, + "activityLog": { + "message": "aktivitetshistorikk" + }, + "addNetwork": { + "message": "Legg til nettverk" + }, + "addRecipient": { + "message": "Legg til mottaker " + }, + "advanced": { + "message": "Avansert" + }, + "advancedSettingsDescription": { + "message": "FÃ¥ tilgang til utviklerfunksjoner, last ned tilstandslogger, tilbakestill konto, installer testnett og tilpasset RPC" + }, + "advancedOptions": { + "message": "Avanserte valg" + }, + "addToAddressBook": { + "message": "Legg til adressebok " + }, + "addToAddressBookModalPlaceholder": { + "message": "dvs. John D. " + }, + "addAlias": { + "message": "Legg til alias " + }, + "addToken": { + "message": "Legg til token " + }, + "addTokens": { + "message": "Legg til sjetonger" + }, + "addSuggestedTokens": { + "message": "Legg til foreslÃ¥tte tokener " + }, + "addAcquiredTokens": { + "message": "Legg til sjetongene du har kjøpt med MetaMask" + }, + "amount": { + "message": "Sum" + }, + "appDescription": { + "message": "En Ethereum-lommebok i nettleseren din", + "description": "The description of the application" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "approve": { + "message": "Godkjenn" + }, + "approved": { + "message": "Godkjent" + }, + "asset": { + "message": "Ressurs" + }, + "attemptingConnect": { + "message": "Prøver Ã¥ opprette forbindelse med blokkjede" + }, + "attemptToCancel": { + "message": "Forsøk Ã¥ avbryte" + }, + "attemptToCancelDescription": { + "message": "Ã… sende inn dette forsøket garanterer ikke at den opprinnelige transaksjonen blir kansellert. Hvis kanselleringsforsøket lykkes, vil du bli belastet transaksjonsgebyret ovenfor." + }, + "attributions": { + "message": "Henvisninger" + }, + "autoLockTimeLimit": { + "message": "Timer for automatisk utlogging (minutter) " + }, + "autoLockTimeLimitDescription": { + "message": "Innstill hviletiden i minutter før MetaMask automatisk logger ut" + }, + "average": { + "message": "Gjennomsnitt" + }, + "back": { + "message": "Tilbake" + }, + "backToAll": { + "message": "Tilbake til alt" + }, + "backupApprovalNotice": { + "message": "Sikkerhetskopier den hemmelige gjenopprettingskoden for Ã¥ sikre lommeboken og midlene." + }, + "backupApprovalInfo": { + "message": "Denne hemmelige koden behøves for Ã¥ gjenopprette lommeboken din i tilfelle du mister enheten din, glemmer passordet ditt, trenger Ã¥ re-installere MetaMask, eller ønsker Ã¥ fÃ¥ tilgang til lommeboken din pÃ¥ en annen enhet." + }, + "backupNow": { + "message": "Sikkerhetskopier nÃ¥" + }, + "balance": { + "message": "Saldo " + }, + "balanceOutdated": { + "message": "Saldoen kan utløpe" + }, + "basic": { + "message": "Enkle" + }, + "blockExplorerUrl": { + "message": "Blokkér Explorer" + }, + "blockExplorerView": { + "message": "Se konto pÃ¥ $1", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "Bruk Blockies Identicon" + }, + "browserNotSupported": { + "message": "Nettleseren din støttes ikke ..." + }, + "builtInCalifornia": { + "message": "MetaMask ble bygget og designet i California." + }, + "buyWithWyre": { + "message": "Kjøp ETH med Wyre" + }, + "buyWithWyreDescription": { + "message": "Wyre lar deg bruke et kredittkort for Ã¥ sette inn ETH rett pÃ¥ MetaMask-kontoen din." + }, + "buyCoinSwitch": { + "message": "Kjøp pÃ¥ CoinSwitch " + }, + "buyCoinSwitchExplainer": { + "message": "CoinSwitch er destinasjonen som utveksler mer enn 300 typer kryptovaluta med den beste kursen." + }, + "off": { + "message": "Av" + }, + "ok": { + "message": "OK" + }, + "on": { + "message": "PÃ¥" + }, + "optionalBlockExplorerUrl": { + "message": "Blokker Explorer URL (valgfritt)" + }, + "cancel": { + "message": "Avbryt" + }, + "cancelAttempt": { + "message": "Avbryt forsøk" + }, + "cancellationGasFee": { + "message": "Kansellering gassavgift" + }, + "cancelled": { + "message": "Avbrutt" + }, + "chainId": { + "message": "Blokkjede " + }, + "clickToRevealSeed": { + "message": "Klikk her for Ã¥ vise hemmelige ord " + }, + "close": { + "message": "Lukk" + }, + "chromeRequiredForHardwareWallets": { + "message": "Du mÃ¥ bruke MetaMask pÃ¥ Google Chrome for Ã¥ koble deg til maskinvare-lommeboken." + }, + "confirm": { + "message": "Bekreft" + }, + "confirmed": { + "message": "Bekreftet" + }, + "confirmPassword": { + "message": "Bekreft passord" + }, + "confirmSecretBackupPhrase": { + "message": "Bekreft din hemmelige gjennopprettingsfrase" + }, + "congratulations": { + "message": "Gratulerer " + }, + "connectHardwareWallet": { + "message": "Koble til maskinvarelommebok" + }, + "connect": { + "message": "Koble til" + }, + "connectingTo": { + "message": "Forbinder til $1 " + }, + "connectingToKovan": { + "message": "Kobler til Kovan testnettverk" + }, + "connectingToMainnet": { + "message": "Forbinder med hoved-Ethereumnettverk " + }, + "connectingToRopsten": { + "message": "Kobler til Ropsten testnettverk" + }, + "connectingToRinkeby": { + "message": "Kobler til Rinkeby Test Network " + }, + "connectingToLocalhost": { + "message": "Kobler til lokalvert 8545" + }, + "connectingToGoerli": { + "message": "Oppretter forbindelse med Goerli Test Network" + }, + "continueToWyre": { + "message": "Fortsett til Wyre " + }, + "continueToCoinSwitch": { + "message": "Fortsett med CoinSwitch " + }, + "contractDeployment": { + "message": "Distribusjon av kontrakten" + }, + "copiedExclamation": { + "message": "Kopiert!" + }, + "copyAddress": { + "message": "Kopier adresse til utklippstavlen " + }, + "copyTransactionId": { + "message": "Kopier transaksjons-ID " + }, + "copiedTransactionId": { + "message": "Kopiert transaksjonsidentifikasjon" + }, + "copyToClipboard": { + "message": "Kopiér til utklippstavlen" + }, + "copyPrivateKey": { + "message": "Dette er din private nøkkel (klikk for Ã¥ kopiere)" + }, + "create": { + "message": "Opprett" + }, + "createAccount": { + "message": "Opprett konto" + }, + "createAWallet": { + "message": "Opprett en lommebok" + }, + "createPassword": { + "message": "Opprett passord " + }, + "currencyConversion": { + "message": "Valutakonvertering " + }, + "currentLanguage": { + "message": "NÃ¥værende sprÃ¥k " + }, + "customGas": { + "message": "Tilpass Gass" + }, + "customGasSubTitle": { + "message": "Økt gebyr kan redusere behandlingstiden, men det er ikke garantert." + }, + "customToken": { + "message": "Egendefinert token " + }, + "customRPC": { + "message": "Tilpasset RPC" + }, + "decimalsMustZerotoTen": { + "message": "Desimaler mÃ¥ være minst 0, og ikke flere enn 36." + }, + "decimal": { + "message": "Presisjonsdesimaler" + }, + "defaultNetwork": { + "message": "Standardnettverket for Ether-transaksjoner er Main Net." + }, + "delete": { + "message": "Slett" + }, + "deleteAccount": { + "message": "Slett konto " + }, + "deposit": { + "message": "Innskudd" + }, + "depositEther": { + "message": "Sett inn Ether " + }, + "details": { + "message": "Detaljer" + }, + "directDepositEther": { + "message": "Sett Ether direkte inn" + }, + "directDepositEtherExplainer": { + "message": "Hvis du allerede har noe Ether, er den raskeste mÃ¥ten Ã¥ fÃ¥ Ether i den nye lommeboken din pÃ¥ ved hjelp av direkte innskudd." + }, + "done": { + "message": "Ferdig" + }, + "downloadGoogleChrome": { + "message": "Last ned Google Chrome " + }, + "downloadSecretBackup": { + "message": "Last ned denne hemmelige gjenopprettingsfrasen og lagre den trygt pÃ¥ ekstern, kryptert harddisk eller lagringsmedium." + }, + "downloadStateLogs": { + "message": "Last ned tilstandslogg" + }, + "dontHaveAHardwareWallet": { + "message": "Har du ikke en hardware-lommebok?" + }, + "dropped": { + "message": "Droppet" + }, + "edit": { + "message": "Endre" + }, + "editContact": { + "message": "Rediger kontakt" + }, + "endOfFlowMessage1": { + "message": "Du besto prøven - oppbevar den mnemoniske gjenopprettingsfrasen din pÃ¥ et sikkert sted, det er ditt ansvar! " + }, + "endOfFlowMessage2": { + "message": "Tips om sikker lagring " + }, + "endOfFlowMessage3": { + "message": "Lagre en sikkerhetskopi pÃ¥ flere steder. " + }, + "endOfFlowMessage4": { + "message": "Aldri del frasen med noen." + }, + "endOfFlowMessage5": { + "message": "Vær forsiktig med phishing! MetaMask vil aldri be om den mnemoniske gjenopprettingsfrasen din spontant." + }, + "endOfFlowMessage6": { + "message": "Hvis du trenger Ã¥ sikkerhetskopiere seed-frasen din igjen kan du finne den i Innstillinger -> Sikkerhet." + }, + "endOfFlowMessage7": { + "message": "Hvis du noen gang har spørsmÃ¥l eller ser noe mistenksomt, send e-post til support@metamask.io" + }, + "endOfFlowMessage8": { + "message": "MetaMask klarer ikke Ã¥ gjenopprette den mnemoniske gjenopprettingsfrasen din. Finn ut mer. " + }, + "endOfFlowMessage9": { + "message": "Finn ut mer." + }, + "endOfFlowMessage10": { + "message": "Ferdig" + }, + "ensRegistrationError": { + "message": "Feil i ENS-navneregistrering" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "ENS-navn ikke funnet i det gjeldende nettverket. Prøv Ã¥ bytte til hovednettverket for Ethereum." + }, + "enterAnAlias": { + "message": "Oppgi et alias" + }, + "enterPassword": { + "message": "Skriv inn passord " + }, + "enterPasswordContinue": { + "message": "Skriv inn passord for Ã¥ fortsette" + }, + "ethereumPublicAddress": { + "message": "Ethereum offentlig adresse" + }, + "etherscanView": { + "message": "Vis konto pÃ¥ Etherscan " + }, + "estimatedProcessingTimes": { + "message": "AnslÃ¥tt behandlingstid" + }, + "expandView": { + "message": "Utvid visning" + }, + "exportPrivateKey": { + "message": "Eksporter privat nøkkel" + }, + "failed": { + "message": "Mislyktes" + }, + "fast": { + "message": "Høy" + }, + "faster": { + "message": "Raskere " + }, + "fileImportFail": { + "message": "Virker ikke filimporteringen? Trykk her!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "Glem denne enheten" + }, + "from": { + "message": "Fra " + }, + "functionType": { + "message": "Funksjonstype " + }, + "gasLimit": { + "message": "Datakraftsgrense " + }, + "gasLimitInfoModalContent": { + "message": "Datakraftgrense er det maksimale antall datakraft du er vilig til Ã¥ benytte. " + }, + "gasLimitTooLow": { + "message": "Datakraftsgrense mÃ¥ være minst 21000" + }, + "gasUsed": { + "message": "Brukt datakraft " + }, + "gasPrice": { + "message": "Bensinpris (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "Datakraftspris ekstremt lav " + }, + "gasPriceInfoModalContent": { + "message": "Datakraftpris angir mengden Ether du er villig til Ã¥ betale for hver datakraftenhet." + }, + "gasPriceNoDenom": { + "message": "Datakraft" + }, + "general": { + "message": "Generell" + }, + "generalSettingsDescription": { + "message": "Valutakonvertering, primærvaluta, sprÃ¥k, identifikasjonsblokkering" + }, + "getEther": { + "message": "Skaff Ether " + }, + "getEtherFromFaucet": { + "message": "FÃ¥ Ether fra en kran for $1", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "FÃ¥ hjelp." + }, + "getStarted": { + "message": "Kom i gang" + }, + "happyToSeeYou": { + "message": "Vi er glade for Ã¥ se deg " + }, + "hardware": { + "message": "Maskinvare" + }, + "hardwareWalletConnected": { + "message": "Hardware-lommebok tilkoblet" + }, + "hardwareWallets": { + "message": "Koble til en hardware-lommebok" + }, + "hardwareWalletsMsg": { + "message": "Velg maskinvarelommeboken som du vil bruke med MetaMask" + }, + "havingTroubleConnecting": { + "message": "Har du problemer med Ã¥ koble til?" + }, + "here": { + "message": "her", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hide": { + "message": "Skjul" + }, + "hideTokenPrompt": { + "message": "Skjul sjetonger?" + }, + "history": { + "message": "Logg" + }, + "import": { + "message": "Importer", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "Importér konto" + }, + "importAccountMsg": { + "message": "Importerte kontoer blir ikke tilknyttet den opprinnelig opprettede mnemoniske gjenopprettingsfrasen for MetaMask-kontoen din. Finn ut mer om importerte kontoer" + }, + "importAccountSeedPhrase": { + "message": "Importer en konto med den mnemoniske gjenopprettingsfrasen " + }, + "importWallet": { + "message": "Importér lommebok " + }, + "importYourExisting": { + "message": "Importer din eksisterende lommebok ved Ã¥ bruk en tolvords seed-frase." + }, + "imported": { + "message": "Importert", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "Importer ved hjelp av kontoens mnemoniske gjenopprettingsfrase" + }, + "infoHelp": { + "message": "Informasjon og hjelp" + }, + "initialTransactionConfirmed": { + "message": "Din opprinnelige transaksjon ble bekreftet av nettverket. Klikk OK for Ã¥ gÃ¥ tilbake." + }, + "insufficientBalance": { + "message": "Utilstrekkelig saldo." + }, + "insufficientFunds": { + "message": "Utilstrekkelig med midler." + }, + "insufficientTokens": { + "message": "Utilstrekkelige tokener " + }, + "invalidAddress": { + "message": "Ugyldig adresse" + }, + "invalidAddressRecipient": { + "message": "Mottaksadresse er ugyldig " + }, + "knownAddressRecipient": { + "message": "Kjent kontaktadresse" + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "Ikke ETH-nettverk, bruk smÃ¥ bokstaver" + }, + "invalidInput": { + "message": "Ugyldig inndata " + }, + "invalidRPC": { + "message": "Ugyldig RPC URL" + }, + "invalidBlockExplorerURL": { + "message": "Ugyldig Block Explorer URL" + }, + "invalidSeedPhrase": { + "message": "Ugyldig mnemonisk gjenopprettingsfrase" + }, + "jsonFile": { + "message": "JSON-fil", + "description": "format for importing an account" + }, + "kovan": { + "message": "Kovan testnettverk" + }, + "max": { + "message": "Maks" + }, + "learnMore": { + "message": "Lær mer" + }, + "ledgerAccountRestriction": { + "message": "Du mÃ¥ bruke den siste kontoen din før du kan legge til en ny." + }, + "letsGoSetUp": { + "message": "Ja, la oss komme i gang!" + }, + "likeToAddTokens": { + "message": "Ønsker du Ã¥ legge til disse tokenene" + }, + "links": { + "message": "Lenker " + }, + "liveGasPricePredictions": { + "message": "Prisforutsigelse av datakraft i sanntid" + }, + "loading": { + "message": "Laster inn ..." + }, + "loadingTokens": { + "message": "Laster tokener ..." + }, + "loadMore": { + "message": "Last mer " + }, + "localhost": { + "message": "Lokalvert 8545" + }, + "lock": { + "message": "Logg ut " + }, + "mainnet": { + "message": "Ethereum hovednettverk" + }, + "memorizePhrase": { + "message": "Memorer denne frasen. " + }, + "memo": { + "message": "beskjed" + }, + "message": { + "message": "Melding " + }, + "metamaskDescription": { + "message": "Kobler deg til Ethereum og det desentraliserte nettet." + }, + "metamaskVersion": { + "message": "MetaMask-versjon " + }, + "mobileSyncText": { + "message": "Vennligst skriv inn passordet ditt for Ã¥ bekrefte at det er deg!" + }, + "myAccounts": { + "message": "Mine kontoer " + }, + "myWalletAccounts": { + "message": "mine lommebokkontoer" + }, + "myWalletAccountsDescription": { + "message": "Alle dine opprettede MetaMask-kontoer vil automatisk bli lagt til denne seksjonen. " + }, + "mustSelectOne": { + "message": "MÃ¥ velge minst 1 token. " + }, + "needEtherInWallet": { + "message": "Du mÃ¥ ha Ether i lommeboken din for Ã¥ samhandle med desentraliserte applikasjoner gjennom MateMask." + }, + "needImportFile": { + "message": "Du mÃ¥ velge en fil Ã¥ importere.", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "Kan ikke sende negative beløp av ETH. " + }, + "networkName": { + "message": "Nettverksnavn " + }, + "networks": { + "message": "Nettverk" + }, + "networkSettingsDescription": { + "message": "Legg til og rediger tilpassede RPC-nettverk" + }, + "nevermind": { + "message": "Bare glem det" + }, + "newAccount": { + "message": "Ny konto " + }, + "newAccountDetectedDialogMessage": { + "message": "Ny adresse oppdaget! Klikk her for Ã¥ legge til adresseboken din." + }, + "newAccountNumberName": { + "message": "Konto $1 ", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "Ny kontaktperson" + }, + "newContract": { + "message": "Ny kontaktperson" + }, + "newPassword": { + "message": "Nytt passord (minimum 8 tegn)" + }, + "newNetwork": { + "message": "Nytt nettverk " + }, + "newToMetaMask": { + "message": "Ny pÃ¥ MetaMask? " + }, + "noAlreadyHaveSeed": { + "message": "Nei, jeg har allerede en mnemonisk gjenopprettingsfrase" + }, + "protectYourKeys": { + "message": "Beskytt nøklene dine! " + }, + "protectYourKeysMessage1": { + "message": "Vær forsiktig med den mnemoniske gjenopprettingsfrasen din - det rapporteres om nettsteder som prøver Ã¥ etterligne MetaMask. MetaMask vil aldri be om den mnemoniske gjenopprettingsfrasen din!" + }, + "protectYourKeysMessage2": { + "message": "Oppbevar setningen din trygt. Hvis du ser noe mistenksomt, eller du er usikker pÃ¥ et nettsted, kan du sende en e-post til support@metamask.io" + }, + "rpcUrl": { + "message": "NY RPC-URL " + }, + "optionalChainId": { + "message": "Blokkjede (vagfritt)" + }, + "optionalSymbol": { + "message": "Symbol (valgfritt)" + }, + "newTotal": { + "message": "Ny total" + }, + "newTransactionFee": { + "message": "Ny transaksjonsavgift" + }, + "next": { + "message": "Neste" + }, + "noAddressForName": { + "message": "Ingen adresse har blitt angitt for dette navnet. " + }, + "noConversionRateAvailable": { + "message": "Ingen konverteringsrate tilgjengelig " + }, + "noTransactions": { + "message": "Du har ingen transaksjoner" + }, + "notEnoughGas": { + "message": "Ikke nok bensin" + }, + "noWebcamFoundTitle": { + "message": "Webkamera ikke funnet" + }, + "noWebcamFound": { + "message": "Datamaskinens webkamera ble ikke funnet. Vennligst prøv igjen." + }, + "ofTextNofM": { + "message": "av" + }, + "orderOneHere": { + "message": "Bestill en Trezor eller Ledger og oppbevar midlene dine i kjølerom" + }, + "origin": { + "message": "Opprinnelse" + }, + "parameters": { + "message": "Parametre" + }, + "participateInMetaMetrics": { + "message": "Delta i MetaMetrics " + }, + "participateInMetaMetricsDescription": { + "message": "Delta i MetaMetrics for Ã¥ hjelpe oss med Ã¥ gjøre MetaMask bedre" + }, + "password": { + "message": "Passord" + }, + "passwordsDontMatch": { + "message": "Passordene er ikke like" + }, + "passwordNotLongEnough": { + "message": "Passordet er ikke langt nok" + }, + "pastePrivateKey": { + "message": "Lim inn din private nøkkelstreng her:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "i pÃ¥vente " + }, + "personalAddressDetected": { + "message": "Personlig adresse oppdaget. Skriv inn token-kontraktadressen." + }, + "prev": { + "message": "Tidligere" + }, + "primaryCurrencySetting": { + "message": "Hovedvaluta " + }, + "primaryCurrencySettingDescription": { + "message": "Velg nasjonal for Ã¥ prioritere Ã¥ vise verdier i nasjonal valuta i kjeden (f.eks. ETH). Velg Fiat for Ã¥ prioritere visning av verdier i den valgte fiat-valutaen." + }, + "privacyMsg": { + "message": "Personvernerklæring" + }, + "privateKey": { + "message": "Privat nøkkel", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "Advarsel: aldri gjør kjent denne nøkkelen. Alle som har tilgang til dine private nøkler kan stjele midlene dine som er pÃ¥ konto." + }, + "privateNetwork": { + "message": "Privat nettverk " + }, + "queue": { + "message": "Kø" + }, + "readdToken": { + "message": "Du kan legge til dette tokenet igjen i fremtiden ved Ã¥ gÃ¥ til \"Legg til token\" i menyen for kontoalternativer." + }, + "recents": { + "message": "Nylige" + }, + "recipientAddress": { + "message": "Mottakeradresse" + }, + "recipientAddressPlaceholder": { + "message": "Søk, offentlig adresse (0x) eller ENS" + }, + "rejectAll": { + "message": "Avvis alle" + }, + "rejectTxsN": { + "message": "AvslÃ¥ transaksjoner pÃ¥ $1." + }, + "rejectTxsDescription": { + "message": "Du er i ferd med Ã¥ gruppevis avslÃ¥ transaksjoner pÃ¥ $1." + }, + "rejected": { + "message": "Avvist" + }, + "reset": { + "message": "Tilbakestill" + }, + "resetAccount": { + "message": "Tilbakestill konto" + }, + "resetAccountDescription": { + "message": "Hvis du tilbakestiller kontoen din vil transaksjonshistorien din slettes. " + }, + "deleteNetwork": { + "message": "Slette nettverk? " + }, + "deleteNetworkDescription": { + "message": "Er du sikker pÃ¥ at du vil slette dette nettverket?" + }, + "remindMeLater": { + "message": "Minn meg pÃ¥ dette senere" + }, + "restoreFromSeed": { + "message": "Gjennopprett konto? " + }, + "restoreAccountWithSeed": { + "message": "Gjenopprett konto med frøfrase" + }, + "requestsAwaitingAcknowledgement": { + "message": "forespørsler venter pÃ¥ godkjenning" + }, + "required": { + "message": "PÃ¥krevd " + }, + "restore": { + "message": "Gjenopprett" + }, + "revealSeedWords": { + "message": "Vis frøord" + }, + "revealSeedWordsTitle": { + "message": "Mnemonisk gjenopprettingsfrase" + }, + "revealSeedWordsDescription": { + "message": "Hvis du noen gang bytter nettlesere eller flytter datamaskiner, trenger du denne mnemoniske gjenopprettingsfrasen for Ã¥ fÃ¥ tilgang til kontoene dine. Lagre dem pÃ¥ et trygt og hemmelig sted." + }, + "revealSeedWordsWarningTitle": { + "message": "IKKE del denne frasen med noen! " + }, + "revealSeedWordsWarning": { + "message": "Disse ordene kan brukes for Ã¥ stjele alle kontoene dine. " + }, + "remove": { + "message": "Fjern" + }, + "removeAccount": { + "message": "Fjern konto" + }, + "removeAccountDescription": { + "message": "Denne kontoen blir fjernet fra lommeboken din. Forsikre deg om at du har den originale mnemoniske gjenopprettingsfrasen eller den private nøkkelen for denne importerte kontoen før du fortsetter. Du kan importere eller opprette kontoer igjen fra nedtrekksmenyen." + }, + "readyToConnect": { + "message": "Klar til Ã¥ koble til?" + }, + "rinkeby": { + "message": "Rinkeby testnettverk" + }, + "save": { + "message": "Lagre" + }, + "slow": { + "message": "Lav" + }, + "slower": { + "message": "Saktere" + }, + "saveAsCsvFile": { + "message": "Lagre som CSV-fil " + }, + "scanInstructions": { + "message": "Plasser QR-koden foran kameraet ditt" + }, + "scanQrCode": { + "message": "Skann QR-kode" + }, + "search": { + "message": "Søk" + }, + "searchResults": { + "message": "Søkeresultater" + }, + "secretBackupPhrase": { + "message": "Hemmelig sikkerhetskopifrase " + }, + "secretBackupPhraseDescription": { + "message": "Den hemmelige gjenopprettingsfrasen din gjør det enkelt Ã¥ sikkerhetskopiere og gjenopprette kontoen din." + }, + "secretBackupPhraseWarning": { + "message": "ADVARSEL: Du mÃ¥ aldri avsløre gjenopprettingsfrasen din. Alle som har denne frasen kan ta fra deg Etheren din for alltid." + }, + "secretPhrase": { + "message": "Skriv inn den tolv ord lange frasen her for Ã¥ gjenopprette hvelvet ditt. " + }, + "securityAndPrivacy": { + "message": "Sikkerhet og personvern" + }, + "securitySettingsDescription": { + "message": "Personverninnstillinger og lommebokens mnemoniske gjenopprettingsfrase" + }, + "seedPhrasePlaceholder": { + "message": "Skill hvert ord med ett enkelt mellomrom" + }, + "seedPhraseReq": { + "message": "Mnemoniske gjenopprettingsfraser bestÃ¥r av 12 ord " + }, + "selectCurrency": { + "message": "Velg valuta" + }, + "selectEachPhrase": { + "message": "Velg hver frase for Ã¥ kontrollere at den er riktig." + }, + "selectLocale": { + "message": "Velg plassering" + }, + "selectType": { + "message": "Velg type " + }, + "sendAmount": { + "message": "Send beløp" + }, + "sendTokens": { + "message": "Send tokener" + }, + "sentEther": { + "message": "sendt ether" + }, + "sentTokens": { + "message": "sendte tokener " + }, + "separateEachWord": { + "message": "Del hvert ord med et enkelt mellomrom " + }, + "searchTokens": { + "message": "Søk i sjetonger" + }, + "selectAnAccount": { + "message": "Velg en konto" + }, + "selectAnAccountHelp": { + "message": "Velg konto for Ã¥ vise i MetaMask" + }, + "selectAHigherGasFee": { + "message": "Velg en høyere gassavgift for Ã¥ fremskynde transaksjonsbehandlingen.*" + }, + "selectHdPath": { + "message": "Velg HD-bane" + }, + "selectPathHelp": { + "message": "Hvis du ikke ser de eksisterende Ledger-kontoene nedenfor, kan du prøve Ã¥ bytte baner til «Legacy (MEW/MyCrypto)»" + }, + "settings": { + "message": "Innstillinger" + }, + "showAdvancedGasInline": { + "message": "Avanserte datakraftskontroller" + }, + "showAdvancedGasInlineDescription": { + "message": "Velg dette for Ã¥ vise bensinpris og begrensningskontroller direkte pÃ¥ send- og bekreftskjermbildene." + }, + "showFiatConversionInTestnets": { + "message": "Vis konvertering pÃ¥ Testnets " + }, + "showFiatConversionInTestnetsDescription": { + "message": "Velg dette for Ã¥ vise fiat-konvertering pÃ¥ Testnets" + }, + "showPrivateKeys": { + "message": "Vis private nøkler" + }, + "showHexData": { + "message": "Vis hex data " + }, + "showHexDataDescription": { + "message": "Velg dette for Ã¥ vise hex-datafeltet pÃ¥ sendskjermen" + }, + "sign": { + "message": "Undertegn" + }, + "signatureRequest": { + "message": "Signaturforespørsel" + }, + "signed": { + "message": "Signert" + }, + "signNotice": { + "message": "Signering av denne meldingen kan ha\nfarlige konsekvenser. Signér kun meldinger fra\nnettsteder du stoler fullt og helt pÃ¥ med hele kontoen din. Denne farlige metoden vil bli fjernet i en fremtidig versjon." + }, + "sigRequest": { + "message": "Signaturforespørsel " + }, + "somethingWentWrong": { + "message": "Oisann! Noe gikk galt. " + }, + "speedUp": { + "message": "Øk hastigheten " + }, + "speedUpCancellation": { + "message": "Fremskynd denne kanselleringen" + }, + "speedUpTransaction": { + "message": "Utfør denne transaksjonen hurtigere" + }, + "switchNetworks": { + "message": "Bytt nettverk " + }, + "stateLogs": { + "message": "Tilstandslogg" + }, + "stateLogsDescription": { + "message": "Tilstandslogger inneholder de offentlige kontoadressene og sendte transaksjoner." + }, + "stateLogError": { + "message": "Feil ved henting av tilstandslogger." + }, + "step1HardwareWallet": { + "message": "1. Koble til maskinvarelommebok" + }, + "step1HardwareWalletMsg": { + "message": "Koble hardware-lommebok din direkte til datamaskinen din." + }, + "step2HardwareWallet": { + "message": "2. Velg en konto" + }, + "step2HardwareWalletMsg": { + "message": "Velg den kontoen du ønsker Ã¥ se. Du kan bare velge en av gangen." + }, + "step3HardwareWallet": { + "message": "3. Begynn Ã¥ bruke dApps mer! " + }, + "step3HardwareWalletMsg": { + "message": "Bruk hardware-kontoen din slik du ville gjort med enhver Ethereumkonto. Logg pÃ¥ dApps, send Eth, kjøp og lagre ERC20-tokener og ikke-fungible tokener som CryptoKitties." + }, + "storePhrase": { + "message": "Lagre denne frasen i en passordbehandler slik som 1Password." + }, + "submitted": { + "message": "Sendt inn" + }, + "supportCenter": { + "message": "Besøk brukerstøtte" + }, + "symbolBetweenZeroTwelve": { + "message": "Symbolet mÃ¥ være 11 tegn eller færre." + }, + "syncWithMobile": { + "message": "Synkroniser med mobil " + }, + "syncWithMobileTitle": { + "message": "Synkronisér med mobil" + }, + "syncWithMobileDesc": { + "message": "Du kan synkronisere kontoene og informasjonen din med den mobile enheten din. Ã…pne mobilappen for MetaMask, gÃ¥ til \"Innstillinger\" og trykk pÃ¥ \"Synkronisering fra nettleserutvidelse\"" + }, + "syncWithMobileDescNewUsers": { + "message": "Hvis du Ã¥pner mobilappen for MetaMask for første gang, følger du bare trinnene pÃ¥ telefonen." + }, + "syncWithMobileScanThisCode": { + "message": "Skann denne koden med din mobilapp for MetaMask" + }, + "syncWithMobileBeCareful": { + "message": "Pass pÃ¥ at ingen andre ser pÃ¥ skjermen din mens du skanner denne koden " + }, + "syncWithMobileComplete": { + "message": "Dataene dine er blitt synkronisert med suksess. Kos deg med mobilappen for MetaMask!" + }, + "terms": { + "message": "BrukervilkÃ¥r" + }, + "testFaucet": { + "message": "Testkran" + }, + "thisWillCreate": { + "message": "Dette vil opprette en ny lommebok og mnemonisk gjenopprettingsfrase" + }, + "to": { + "message": "Til " + }, + "token": { + "message": "Token " + }, + "tokenAlreadyAdded": { + "message": "Tokenet har allerede blitt lagt til." + }, + "tokenContractAddress": { + "message": "Token-kontraktadresse " + }, + "tokenSymbol": { + "message": "Token-symbol" + }, + "total": { + "message": "Totalt" + }, + "transaction": { + "message": "transaksjon" + }, + "transactionConfirmed": { + "message": "Transaksjon bekreftet pÃ¥ $2." + }, + "transactionCreated": { + "message": "Transaksjon opprettet med en verdi pÃ¥ $1 og $2. " + }, + "transactionDropped": { + "message": "Transaksjonen falt pÃ¥ $2." + }, + "transactionSubmitted": { + "message": "Transaksjon sendt med datakraftavgift pÃ¥ $1 til $2." + }, + "transactionResubmitted": { + "message": "Transaksjonen som ble sendt inn igjen med bensinavgift økte til $1 pÃ¥ $2" + }, + "transactionUpdated": { + "message": "Transaksjonen oppdatert pÃ¥ $2." + }, + "transactionErrored": { + "message": "Det oppsto en feil under transaksjonen." + }, + "transactionCancelAttempted": { + "message": "Kansellering av transaksjon forsøkt med en $1 gassavgift pÃ¥ $2." + }, + "transactionCancelSuccess": { + "message": "Transaksjon vellykket avbrutt pÃ¥ $2 " + }, + "transactionError": { + "message": "Transaksjonsfeil. Unntak kastet i kontraktskode." + }, + "transactionErrorNoContract": { + "message": "Prøver Ã¥ kontakte en funksjon pÃ¥ en adresse uten kontrakt." + }, + "transactionFee": { + "message": "Transaksjonsavgift" + }, + "transactionTime": { + "message": "Transaksjonstid" + }, + "transfer": { + "message": "Overfør" + }, + "transferBetweenAccounts": { + "message": "Overfør mellom kontoene mine" + }, + "transferFrom": { + "message": "Overfør fra" + }, + "troubleTokenBalances": { + "message": "Vi hadde problemer med Ã¥ laste inn sjetongsaldoen din. Du kan se dem", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "Prøv igjen" + }, + "typePassword": { + "message": "Skriv inn MetaMask-passordet" + }, + "unapproved": { + "message": "Ikke godkjent " + }, + "units": { + "message": "enheter " + }, + "unknown": { + "message": "Ukjent" + }, + "unknownNetwork": { + "message": "Ukjent privat nettverk" + }, + "unknownQrCode": { + "message": "Feil: Vi kunne ikke gjenkjenne denne QR-koden" + }, + "unknownCameraErrorTitle": { + "message": "Oisann! Noe gikk galt.... " + }, + "unknownCameraError": { + "message": "Det oppsto en feil under forsøket pÃ¥ Ã¥ fÃ¥ tilgang til kameraet ditt. Vær sÃ¥ snill og prøv pÃ¥ nytt..." + }, + "unlock": { + "message": "LÃ¥s opp" + }, + "unlockMessage": { + "message": "Det desentraliserte internett venter deg" + }, + "updatedWithDate": { + "message": "Oppdatert $1" + }, + "urlErrorMsg": { + "message": "URI-er krever det aktuelle HTTP/HTTPS-prefikset." + }, + "usedByClients": { + "message": "Brukt av en rekke forskjellige klienter" + }, + "userName": { + "message": "Brukernavn" + }, + "viewAccount": { + "message": "Se konto" + }, + "viewinExplorer": { + "message": "Se i Explorer" + }, + "viewContact": { + "message": "Se kontrakt" + }, + "viewOnCustomBlockExplorer": { + "message": "Vis ved $1 " + }, + "viewOnEtherscan": { + "message": "Vis pÃ¥ Etherscan " + }, + "visitWebSite": { + "message": "Besøk nettsiden vÃ¥r " + }, + "walletSeed": { + "message": "Lommebok med mnemonisk gjenopprettingsfrase" + }, + "welcomeBack": { + "message": "Velkommen tilbake!" + }, + "welcome": { + "message": "Velkommen til MetaMask" + }, + "writePhrase": { + "message": "Skriv denne frasen pÃ¥ et papir og oppbevar pÃ¥ et sikkert sted. Hvis du vil ha enda mer sikkerhet, kan du skrive det ned pÃ¥ flere papirbiter og oppbevare hver pÃ¥ 2 - 3 forskjellige steder." + }, + "yesLetsTry": { + "message": "Ja, la oss prøve" + }, + "youNeedToAllowCameraAccess": { + "message": "Du mÃ¥ gi kameratilgang for Ã¥ bruke denne funksjonen." + }, + "yourSigRequested": { + "message": "Det bes om signaturen din " + }, + "youSign": { + "message": "Du signerer" + }, + "yourPrivateSeedPhrase": { + "message": "Din private frøfrase" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "Null bensinpris for fremskynding" + } +} diff --git a/app/_locales/ph/messages.json b/app/_locales/ph/messages.json index c8cde27f6cde..63245a297637 100644 --- a/app/_locales/ph/messages.json +++ b/app/_locales/ph/messages.json @@ -1,33 +1,7 @@ { - "privacyMode": { - "message": "Mode ng Privacy" - }, - "privacyModeDescription": { - "message": "Dapat humiling ng access ang mga website upang tingnan ang impormasyon ng iyong account." - }, - "exposeAccounts": { - "message": "Ilantad ang Mga Account" - }, - "exposeDescription": { - "message": "Ilantad ang mga account sa kasalukuyang website. Kapaki-pakinabang para sa mga dapps ng legacy." - }, - "confirmExpose": { - "message": "Sigurado ka bang gusto mong ilantad ang iyong mga account sa kasalukuyang website?" - }, - "confirmClear": { - "message": "Sigurado ka bang gusto mong i-clear ang mga naaprubahang website?" - }, - "clearApprovalDataSuccess": { - "message": "Matagumpay na na-clear ang data ng aprubadong website." - }, - "approvalData": { - "message": "Data ng Pag-apruba" - }, - "approvalDataDescription": { - "message": "I-clear ang naaprubahang data ng website upang ang lahat ng site ay dapat humiling muli ng pag-apruba" - }, - "clearApprovalData": { - "message": "Tanggalin ang data ng pag-apruba" + "appName": { + "message": "MetaMask", + "description": "The name of the application" }, "approve": { "message": "Aprubahan" @@ -35,81 +9,31 @@ "reject": { "message": "Tanggihan" }, - "providerAPIRequest": { - "message": "Kahilingan sa Web3 API" - }, - "reviewProviderRequest": { - "message": "Mangyaring suriin ang kahilingan sa Ethereum API na ito." - }, - "providerRequestInfo": { - "message": "Ang domain na nakalista sa ibaba ay sinusubukang humiling ng access sa Ethereum API upang maaari itong makipag-ugnayan sa Ethereum blockchain. Laging i-double check na ikaw ay nasa tamang site bago aprubahan ang Ethereum access." - }, - "accept": { - "message": "Tanggapin" - }, - "account": { - "message": "Account" - }, "accountDetails": { "message": "Detalye ng Account" }, "accountName": { "message": "Pangalan ng Account" }, - "address": { - "message": "Address" - }, "addToken": { "message": "Magdagdag ng Token" }, "amount": { "message": "Halaga" }, - "amountPlusGas": { - "message": "Halaga + Gas" - }, "appDescription": { "message": "Ethereum Browser Extension", "description": "Ang deskripsyon ng application" }, - "appName": { - "message": "MetaMask", - "description": "Ang pangalan ng application" - }, "attemptingConnect": { "message": "Sinusubukang kumonekta sa blockchain." }, - "available": { - "message": "Magagamit" - }, "back": { "message": "Bumalik" }, "balance": { "message": "Balanse:" }, - "balanceIsInsufficientGas": { - "message": "Kulang ang balanse para sa kasalukuyang gas total" - }, - "beta": { - "message": "BETA" - }, - "betweenMinAndMax": { - "message": "dapat mas malaki o katumbas ng $1 at mas mababa o katumbas ng $2.", - "description": "helper para sa pag-input ng hex bilang decimal input" - }, - "borrowDharma": { - "message": "Humiram sa Dharma (Beta)" - }, - "buy": { - "message": "Bumili" - }, - "buyCoinbase": { - "message": "Bumili sa Coinbase" - }, - "buyCoinbaseExplainer": { - "message": "Ang Coinbase ang pinakasikat na paraan upang bumili at magbenta ng Bitcoin, Ethereum, at Litecoin sa buong mundo." - }, "buyCoinSwitch": { "message": "Bumili sa CoinSwitch" }, @@ -119,51 +43,24 @@ "cancel": { "message": "Kanselahin" }, - "clickCopy": { - "message": "I-click upang Makopya" - }, "confirm": { "message": "Tiyakin" }, - "confirmContract": { - "message": "Tiyakin ang Contract" - }, "confirmPassword": { "message": "Tiyakin ang Password" }, - "confirmTransaction": { - "message": "Tiyakin ang Transaksyon" - }, - "continueToCoinbase": { - "message": "Magpatuloy sa Coinbase" - }, "continueToCoinSwitch": { "message": "Magpatuloy sa CoinSwitch" }, "contractDeployment": { "message": "Pag-deploy ng Contract" }, - "conversionProgress": { - "message": "Isinasagawa ang conversion" - }, - "copiedButton": { - "message": "Kinopya" - }, - "copiedClipboard": { - "message": "Kinopya sa Clipboard" - }, "copiedExclamation": { "message": "Kinopya!" }, - "copy": { - "message": "Kinopya" - }, "copyToClipboard": { "message": "Kinopya sa clipboard" }, - "copyButton": { - "message": " Kinopya " - }, "copyPrivateKey": { "message": "Ito ang iyong private key (i-click upang makopya)" }, @@ -173,58 +70,21 @@ "createAccount": { "message": "Gumawa ng Account" }, - "createDen": { - "message": "Gumawa" - }, - "crypto": { - "message": "Crypto", - "description": "Type ng exchange (cryptocurrencies)" - }, "customGas": { "message": "I-customize ang Gas" }, - "customize": { - "message": "I-customize" - }, - "customRPC": { - "message": "Custom RPC" - }, "defaultNetwork": { "message": "Ang default network para sa Ether transactions ay ang Main Net." }, - "denExplainer": { - "message": "Ang iyong DEN ang nagsisilbing password-encrypted storage mo sa loob ng MetaMask." - }, "deposit": { "message": "Deposito" }, - "depositBTC": { - "message": "I-deposito ang iyong BTC sa address na ito:" - }, - "depositEth": { - "message": "I-deposito ang Eth" - }, "depositEther": { "message": "I-deposito ang Ether" }, - "depositFiat": { - "message": "I-deposito ang Fiat" - }, - "depositFromAccount": { - "message": "I-deposito mula sa ibang account" - }, - "depositShapeShift": { - "message": "I-deposito gamit ang ShapeShift" - }, - "depositShapeShiftExplainer": { - "message": "Kung ikaw ay nagmamay-ari ng iba pang cryptocurrencies, pwede kang mag-trade at mag-deposito ng Ether diretso sa iyong MetaMask wallet. Hindi mo na kailangan ng account." - }, "details": { "message": "Detalye" }, - "directDeposit": { - "message": "Direktang Deposito" - }, "directDepositEther": { "message": "Direktang I-deposito ang Ether" }, @@ -237,27 +97,15 @@ "edit": { "message": "I-edit" }, - "editAccountName": { - "message": "I-edit ang Pangalang ng Account" - }, - "encryptNewDen": { - "message": "I-encrypt ang iyong bagong DEN" - }, "enterPassword": { "message": "I-enter ang password" }, "etherscanView": { "message": "Tingnan ang account sa Etherscan" }, - "exchangeRate": { - "message": "Exchange Rate" - }, "exportPrivateKey": { "message": "I-export ang Private Key" }, - "exportPrivateKeyWarning": { - "message": "I-export ang private keys at intindihin ang panganib na kasama nito." - }, "failed": { "message": "Nabigo" }, @@ -272,37 +120,9 @@ "from": { "message": "Mula sa" }, - "fromShapeShift": { - "message": "Mula sa ShapeShift" - }, - "gas": { - "message": "Gas", - "description": "Maikling indikasyon ng gas cost" - }, - "gasFee": { - "message": "Gas Fee" - }, - "gasLimit": { - "message": "Gas Limit" - }, - "gasLimitCalculation": { - "message": "Kinalkula namin ang iminungkahing gas limit base sa network success rates." - }, - "gasLimitRequired": { - "message": "Kailangan ang Gas Limit" - }, "gasLimitTooLow": { "message": "Ang gas limit ay hindi dabat bababa sa 21000" }, - "gasPrice": { - "message": "Gas Price (GWEI)" - }, - "gasPriceCalculation": { - "message": "Kinalkula namin ang iminungkahing gas prices base sa network success rates." - }, - "gasPriceRequired": { - "message": "Kailangan ang Gas Price" - }, "getEther": { "message": "Kumuha ng Ether" }, @@ -310,26 +130,16 @@ "message": "Kumuha ng Ether mula sa faucet para sa $1", "description": "Ipinapakita ang pangalan ng network para sa Ether faucet" }, - "greaterThanMin": { - "message": "dapat mas malaki o katumbas ng $1.", - "description": "helper para sa pag-input ng hex bilang decimal input" - }, "here": { "message": "i-click ito", "description": "tulad ng -i-click dito- para sa mas maraming impormasyon (kasama ng troubleTokenBalances)" }, - "hide": { + "hide": { "message": "Itago" }, - "hideToken": { - "message": "Itago ang Token" - }, "hideTokenPrompt": { "message": "Itago ang Token?" }, - "howToDeposit": { - "message": "Paano mo gustong mag-deposito ng Ether?" - }, "import": { "message": "I-import", "description": "Button para i-import ang account mula sa napiling file" @@ -337,12 +147,6 @@ "importAccount": { "message": "I-import ang Account" }, - "importAnAccount": { - "message": "I-import ang account" - }, - "importDen": { - "message": "I-import ang Existing DEN" - }, "imported": { "message": "Na-import na", "description": "status na nagpapakita na ang account ay lubos na na-load sa keyring" @@ -353,53 +157,18 @@ "invalidAddress": { "message": "Invalid ang address" }, - "invalidGasParams": { - "message": "Invalid ang Gas Parameters" - }, "invalidInput": { "message": "Invalid ang input." }, - "invalidRequest": { - "message": "Invalid ang Request" - }, - "jsonFile": { - "message": "JSON File", - "description": "format para sa pag-import ng account" - }, - "kovan": { - "message": "Kovan Test Network" - }, - "lessThanMax": { - "message": "dapat mas mababa o katumbas ng $1.", - "description": "helper para sa pag-input ng hex bilang decimal input" - }, - "limit": { - "message": "Limitasyon" - }, "loading": { "message": "Naglo-load..." }, "loadingTokens": { "message": "Naglo-load ang Tokens..." }, - "localhost": { - "message": "Localhost 8545" - }, - "logout": { - "message": "Log out" - }, - "loose": { - "message": "Loose" - }, - "mainnet": { - "message": "Main Ethereum Network" - }, "message": { "message": "Mensahe" }, - "min": { - "message": "Minimum" - }, "myAccounts": { "message": "Aking mga Account" }, @@ -410,205 +179,73 @@ "message": "Dapat kang pumili ng file para i-import.", "description": "Ang user ay nag-iimport ng account at kailangan magdagdag ng file upang tumuloy" }, - "needImportPassword": { - "message": "Dapat mong i-enter ang password para sa napiling file.", - "description": "Password at file na kailangan upang ma-import ang account" - }, - "networks": { - "message": "Networks" - }, "newAccount": { "message": "Bagong Account" }, - "newAccountNumberName": { - "message": "Account $1", - "description": "Ang default na pangalan ng susunod na account na gagawin sa create account screen" - }, "newContract": { "message": "Bagong Contract" }, "newPassword": { "message": "Bagong Password (min 8 chars)" }, - "newRecipient": { - "message": "Bagong Recipient" - }, "next": { "message": "Sunod" }, "noAddressForName": { "message": "Walang naka-set na address para sa pangalang ito." }, - "noDeposits": { - "message": "Walang natanggap na mga deposito" - }, - "noTransactionHistory": { - "message": "Walang kasaysayan ng transaksyon." - }, "noTransactions": { "message": "Walang mga Transaksyon" }, - "notStarted": { - "message": "Hindi Sinimulan" - }, - "oldUI": { - "message": "Lumang UI" - }, - "oldUIMessage": { - "message": "Ikaw ay bumalik sa lumang UI. Maaari kang bumalik sa bagong UI mula sa isang opsyon sa dropdown menu na matatagpuan sa bandang taas at kanan." - }, - "or": { - "message": "o", - "description": "Pagpili sa pagitan ng paggawa of pag-import ng bagong account" - }, - "passwordMismatch": { - "message": "hindi nagtugma ang mga password", - "description": "Sa proseso ng paggawa ng password, ang dalawang password fields ay hindi nagtugma" - }, - "passwordShort": { - "message": "hindi sapat ang haba ng password", - "description": "Sa proseso ng paggawa ng password, ang password ay hindi in password creation process, hind sapat ang haba ng password upang maging ligtas" - }, "pastePrivateKey": { "message": "I-paste dito ang iyong private key string:", "description": "Para sa pag-import ng account mula sa private key" }, - "pasteSeed": { - "message": "I-paste dito ang iyong seed phrase!" - }, - "pleaseReviewTransaction": { - "message": "Mangyaring suriin ang iyong transaksyon." - }, - "privateKey": { - "message": "Private Key", - "description": "Piliin ang ganitong type ng file upang gamitin sa pag-import ng account" - }, "privateKeyWarning": { "message": "Babala: Huwag sabihin sa kahit na sino ang key na ito. Maaring makuha at manakaw ng sinumang nakakaalam ng iyong private key ang mga assets sa iyong account." }, "privateNetwork": { "message": "Pribadong Network" }, - "qrCode": { - "message": "Ipakita ang QR Code" - }, "readdToken": { "message": "Upang muling idagdag ang token na ito, pumunta sa “Magdagdag ng Token†sa options menu ng iyong account." }, - "readMore": { - "message": "Alamin ang iba pang impormasyon dito." - }, - "receive": { - "message": "Tanggapin" - }, "recipientAddress": { "message": "Address ng Tatanggap" }, - "refundAddress": { - "message": "Ang Iyong Refund Address" - }, "rejected": { "message": "Tinanggihan" }, "required": { "message": "Kailangan" }, - "retryWithMoreGas": { - "message": "Muling subukan ng may mas mataas na gas price dito" - }, - "revert": { - "message": "Ibalik" - }, - "rinkeby": { - "message": "Rinkeby Test Network" - }, - "ropsten": { - "message": "Ropsten Test Network" - }, - "sampleAccountName": { - "message": "Halimbawa: Ang aking bagong account", - "description": "Tulungan ang user na intindihin ang konsepto ng pagdagdag ng human-readable name sa kanilang account" - }, "save": { "message": "I-save" }, - "saveAsFile": { - "message": "I-save bilang File", - "description": "Proseso sa pag-export ng Account" - }, - "selectService": { - "message": "Piliin ang Service" - }, "send": { "message": "Magpadala" }, "sendTokens": { "message": "Magpadala ng Tokens" }, - "sendTokensAnywhere": { - "message": "Magpadala ng Tokens sa sinumang may Ethereum account" - }, "settings": { "message": "Mga Setting" }, - "shapeshiftBuy": { - "message": "Bumili gamit ang Shapeshift" - }, "showPrivateKeys": { "message": "Ipakita ang Private Keys" }, - "showQRCode": { - "message": "Ipakita ang QR Code" - }, "sign": { "message": "I-sign" }, - "signMessage": { - "message": "I-sign ang mensahe" - }, "signNotice": { "message": "Ang pag-sign ng mensaheng ito ay maaring magdulot ng mapanganib na epekto. I-sign lamang ang mga mensahe mula sa mga site na pinagkakatiwalaan mo ng iyong account. Ang mapanganib na paraang ito ay aalisin sa isa sa mga susunod na bersyon. " }, "sigRequest": { "message": "Hiling na Signature" }, - "sigRequested": { - "message": "Hiniling ang Signature" - }, - "status": { - "message": "Istado" - }, - "submit": { - "message": "I-submit" - }, - "takesTooLong": { - "message": "Masyadong matagal?" - }, - "testFaucet": { - "message": "Test Faucet" - }, - "to": { - "message": "To" - }, - "toETHviaShapeShift": { - "message": "$1 sa ETH sa pamamagitan ng ShapeShift", - "description": "Pupunan ng system ang deposit type sa simula ng mensahe" - }, - "tokenBalance": { - "message": "Ang iyong Token Balance ay:" - }, "total": { "message": "Kabuuan" }, - "transactionMemo": { - "message": "Memo ng transaksyon (opsyonal)" - }, - "transactionNumber": { - "message": "Numero ng Transaksyon" - }, - "transfers": { - "message": "Mga Inilipat" - }, "troubleTokenBalances": { "message": "Nagkaroon kami ng problema sa paglo-load ng iyong mga balanseng token. Tingnan ito dito ", "description": "Susundan ng link (dito) para tingnan ang token balances" @@ -616,40 +253,18 @@ "typePassword": { "message": "I-type ang iyong Password" }, - "uiWelcome": { - "message": "Maligayang pagdating sa Bagong UI (Beta)" - }, - "uiWelcomeMessage": { - "message": "Ginagamit mo na ngayon ang bagong MetaMask UI. I-explore at subukan ang mga bagong features tulad ng pagpapadala ng mga token, at ipaalam sa amin kung mayroon kang anumang mga isyu." - }, - "unavailable": { - "message": "Hindi Magagamit" - }, "unknown": { "message": "Hindi Alam" }, "unknownNetwork": { "message": "Hindi Alam ang Pribadong Network" }, - "unknownNetworkId": { - "message": "Hindi alam ang network ID" - }, - "usaOnly": { - "message": "USA lamang", - "description": "Ang paggamit ng exchange na ito ay limitado sa mga tao sa loob ng Estados Unidos" - }, "usedByClients": { "message": "Ginagamit ng iba't ibang mga clients" }, "viewAccount": { "message": "Tingnan ang Account" }, - "warning": { - "message": "Babala" - }, - "whatsThis": { - "message": "Ano ito?" - }, "yourSigRequested": { "message": "Hinihiling ang iyong signature" }, diff --git a/app/_locales/pl/messages.json b/app/_locales/pl/messages.json index 868ab0cae7c1..b057d1642ee4 100644 --- a/app/_locales/pl/messages.json +++ b/app/_locales/pl/messages.json @@ -1,6 +1,21 @@ { - "accept": { - "message": "Akceptacja" + "chartOnlyAvailableEth": { + "message": "Wykres dostÄ™pny tylko w sieciach Ethereum" + }, + "contractInteraction": { + "message": "Interakcja z kontraktem" + }, + "reject": { + "message": "Odrzuć" + }, + "about": { + "message": "Informacje" + }, + "aboutSettingsDescription": { + "message": "Wersja, centrum wsparcia i dane kontaktowe" + }, + "acceleratingATransaction": { + "message": "* Przyspieszenie transakcji poprzez zastosowanie wyższej ceny gazu zwiÄ™ksza szanse na jej szybsze przetworzenie przez sieć, jednak skuteczność tej operacji nie jest gwarantowana." }, "accessingYourCamera": { "message": "Uruchamianie kamery..." @@ -14,14 +29,38 @@ "accountName": { "message": "Nazwa konta" }, + "accountOptions": { + "message": "Opcje konta" + }, "accountSelectionRequired": { "message": "Należy wybrać konto!" }, - "address": { - "message": "Adres" + "activityLog": { + "message": "dziennik aktywnoÅ›ci" }, - "addCustomToken": { - "message": "Dodaj token" + "addNetwork": { + "message": "Dodaj sieć" + }, + "addRecipient": { + "message": "Dodaj odbiorcÄ™" + }, + "advanced": { + "message": "Zaawansowane" + }, + "advancedSettingsDescription": { + "message": "DostÄ™p do funkcji programisty, pobieranie dzienników stanu, resetowanie konta, konfigurowanie sieci testowych i niestandardowe RPC" + }, + "advancedOptions": { + "message": "Opcje zaawansowane" + }, + "addToAddressBook": { + "message": "Dodaj do książki adresowej" + }, + "addToAddressBookModalPlaceholder": { + "message": "np. John D." + }, + "addAlias": { + "message": "Dodaj alias" }, "addToken": { "message": "Dodaj token" @@ -38,16 +77,13 @@ "amount": { "message": "Ilość" }, - "amountPlusGas": { - "message": "Ilość + gaz" - }, "appDescription": { "message": "Wtyczka przeglÄ…darki do Ethereum", - "description": "Opis aplikacji" + "description": "The description of the application" }, "appName": { "message": "MetaMask", - "description": "Nazwa aplikacji" + "description": "The name of the application" }, "approve": { "message": "Zatwierdź" @@ -55,72 +91,111 @@ "approved": { "message": "Zatwierdzone" }, + "asset": { + "message": "SkÅ‚adnik aktywów" + }, "attemptingConnect": { "message": "Próba połączenia z blockchainem." }, + "attemptToCancel": { + "message": "Podjąć próbÄ™ anulowania?" + }, + "attemptToCancelDescription": { + "message": "Wykonanie tego dziaÅ‚ania nie gwarantuje, że pierwotna transakcja zostanie anulowana. JeÅ›li próba anulowania siÄ™ powiedzie, zostaniesz obciążony opÅ‚atÄ… transakcyjnÄ… wskazanÄ… powyżej." + }, "attributions": { "message": "Atrybuty" }, - "available": { - "message": "DostÄ™pne" + "autoLockTimeLimit": { + "message": "Czas automatycznego wylogowania (w minutach)" + }, + "autoLockTimeLimitDescription": { + "message": "Ustaw czas bezczynnoÅ›ci w minutach, po którym MetaMask wyloguje CiÄ™ automatycznie" + }, + "average": { + "message": "Åšrednia" }, "back": { "message": "Wstecz" }, + "backToAll": { + "message": "Wróć do wszystkich" + }, + "backupApprovalNotice": { + "message": "Utwórz kopiÄ™ zapasowÄ… tajnego kodu odzyskiwania, aby zapewnić bezpieczeÅ„stwo swojego portfela i Å›rodków." + }, + "backupApprovalInfo": { + "message": "Ten tajny kod jest wymagany do odzyskania portfela w przypadku zgubienia urzÄ…dzenia, zapomnienia hasÅ‚a, ponownego zainstalowania MetaMask lub potrzeby uzyskania dostÄ™pu do portfela na innym urzÄ…dzeniu." + }, + "backupNow": { + "message": "Utwórz kopiÄ™ zapasowÄ…" + }, "balance": { "message": "Ilość Å›rodków" }, - "balances": { - "message": "Ilość tokenów" + "balanceOutdated": { + "message": "Saldo może być nieaktualne" }, - "balanceIsInsufficientGas": { - "message": "NiewystarczajÄ…ca ilość Å›rodków na opÅ‚atÄ™ za gaz" + "basic": { + "message": "Podstawy" }, - "beta": { - "message": "BETA" + "blockExplorerUrl": { + "message": "PrzeglÄ…daj blok" }, - "betweenMinAndMax": { - "message": "musi być wiÄ™ksze lub równe $1 i mniejsze lub równe $2,", - "description": "pomoc przy wpisywaniu hex jako dane dziesiÄ™tne" + "blockExplorerView": { + "message": "WyÅ›wietl konto w $1", + "description": "$1 replaced by URL for custom block explorer" }, "blockiesIdenticon": { "message": "Użyj Blockies Identicon" }, - "borrowDharma": { - "message": "Pożycz z Dharma (Beta)" - }, "browserNotSupported": { "message": "Twoja przeglÄ…darka nie jest obsÅ‚ugiwana..." }, "builtInCalifornia": { "message": "MetaMask zostaÅ‚ zaprojektowany i stworzony w Kaliforni." }, - "buy": { - "message": "Kup" + "buyWithWyre": { + "message": "Kup ETH poprzez Wyre" + }, + "buyWithWyreDescription": { + "message": "DziÄ™ki Wyre możesz użyć karty kredytowej, aby wpÅ‚acić ETH bezpoÅ›rednio na swoje konto MetaMask." }, - "buyCoinbase": { - "message": "Kup na Coinbase" + "buyCoinSwitch": { + "message": "Kup w CoinSwitch" }, - "buyCoinbaseExplainer": { - "message": "Coinbase to najpopularniejszy sposób na kupno i sprzedaż Bitcoin, Ethereum i Litecoin." + "buyCoinSwitchExplainer": { + "message": "CoinSwitch to miejsce, w którym możesz wymieniać ponad 300 kryptowalut po najlepszym kursie." }, "bytes": { "message": "Bajty" }, - "ok": { - "message": "Ok" + "off": { + "message": "WyÅ‚." + }, + "on": { + "message": "Włączone" + }, + "optionalBlockExplorerUrl": { + "message": "Adres URL przeglÄ…darki Å‚aÅ„cucha bloków (opcjonalnie)" }, "cancel": { "message": "Anuluj" }, - "classicInterface": { - "message": "Użyj klasycznego interfejsu" + "cancelAttempt": { + "message": "Anuluj próbÄ™" }, - "clickCopy": { - "message": "Kliknij żeby skopiować" + "cancellationGasFee": { + "message": "OpÅ‚ata za gaz za anulowanie" }, - "clickToAdd": { - "message": "Przycisnij $1, aby dodać go do swojego konta" + "cancelled": { + "message": "Anulowano" + }, + "chainId": { + "message": "Identyfikator Å‚aÅ„cucha" + }, + "clickToRevealSeed": { + "message": "Kliknij tutaj, aby odkryć tajne sÅ‚owa" }, "close": { "message": "Zamknij" @@ -134,14 +209,14 @@ "confirmed": { "message": "Potwierdzone" }, - "confirmContract": { - "message": "Zatwierdź kontrakt" - }, "confirmPassword": { "message": "Potwierdź hasÅ‚o" }, - "confirmTransaction": { - "message": "Potwierdź transakcjÄ™" + "confirmSecretBackupPhrase": { + "message": "Potwierdź swojÄ… tajnÄ… frazÄ™ zapasowÄ…" + }, + "congratulations": { + "message": "Gratulacje" }, "connectHardwareWallet": { "message": "Podłącz portfel sprzÄ™towy" @@ -149,54 +224,51 @@ "connect": { "message": "Połącz" }, - "connecting": { - "message": "ÅÄ…czenie..." + "connectingTo": { + "message": "ÅÄ…czenie z $1" }, - "connectToLedger": { - "message": "Połącz z Ledger" + "connectingToKovan": { + "message": "ÅÄ…czenie z sieciÄ… testowÄ… Kovan" + }, + "connectingToMainnet": { + "message": "ÅÄ…czenie z głównÄ… sieciÄ… Ethereum" }, - "connectToTrezor": { - "message": "Połącz z Trezor" + "connectingToRopsten": { + "message": "ÅÄ…czenie z sieciÄ… testowÄ… Ropsten" }, - "continue": { - "message": "Kontynuuj" + "connectingToRinkeby": { + "message": "ÅÄ…czenie z sieciÄ… testowÄ… Rinkeby" }, - "continueToCoinbase": { - "message": "Przejdź do Coinbase" + "connectingToLocalhost": { + "message": "Połączono z serwerem lokalnym 8545" }, - "contractDeployment": { - "message": "Uruchomienie kontraktu" + "connectingToGoerli": { + "message": "ÅÄ…czenie z sieciÄ… testowÄ… Goerli" }, - "conversionProgress": { - "message": "Przeliczanie w toku" + "continueToWyre": { + "message": "Przejdź do Wyre" }, - "copiedButton": { - "message": "Skopiowane" + "continueToCoinSwitch": { + "message": "Przejdź do CoinSwitch" }, - "copiedClipboard": { - "message": "Skopiowane do schowka" + "contractDeployment": { + "message": "Uruchomienie kontraktu" }, "copiedExclamation": { "message": "Skopiowane!" }, - "copiedSafe": { - "message": "SkopiowaÅ‚em to w bezpieczne miejsce" - }, - "copy": { - "message": "Skopiuj" - }, - "copyContractAddress": { - "message": "Skopiuj adres kontaktowy" - }, "copyAddress": { "message": "Skopiuj adres do schowka" }, + "copyTransactionId": { + "message": "Kopiuj identyfikator transakcji" + }, + "copiedTransactionId": { + "message": "Skopiowano identyfikator transakcji" + }, "copyToClipboard": { "message": "Skopiuj do schowka" }, - "copyButton": { - "message": " Skopiuj " - }, "copyPrivateKey": { "message": "To jest Twój prywatny klucz (kliknij żeby skopiować)" }, @@ -206,28 +278,27 @@ "createAccount": { "message": "Utwórz konto" }, - "createDen": { - "message": "Utwórz" + "createAWallet": { + "message": "Utwórz portfel" }, - "crypto": { - "message": "Krypto", - "description": "Tym platformy wymiany (kryptowaluty)" + "createPassword": { + "message": "Utwórz hasÅ‚o" }, - "currentConversion": { - "message": "Obecny kurs" + "currencyConversion": { + "message": "Przeliczanie walut" }, - "currentNetwork": { - "message": "Bieżąca sieć" + "currentLanguage": { + "message": "Obecny jÄ™zyk" }, "customGas": { "message": "Ustaw gaz" }, + "customGasSubTitle": { + "message": "ZwiÄ™kszenie opÅ‚aty może skrócić czas przetwarzania transakcji, ale nie jest to gwarantowane." + }, "customToken": { "message": "WÅ‚asny token" }, - "customize": { - "message": "Ustaw" - }, "customRPC": { "message": "WÅ‚asne RPC" }, @@ -240,39 +311,21 @@ "defaultNetwork": { "message": "DomyÅ›lna sieć dla Eteru to Main Net." }, - "denExplainer": { - "message": "Twój DEN to chroniony hasÅ‚em schowek w MetaMasku." + "delete": { + "message": "UsuÅ„" + }, + "deleteAccount": { + "message": "UsuÅ„ konto" }, "deposit": { "message": "Zdeponuj" }, - "depositBTC": { - "message": "Zdeponuj swoje BTC na poniższy adres:" - }, - "depositEth": { - "message": "Zdeponuj Eth" - }, "depositEther": { "message": "Zdeponuj Eter" }, - "depositFiat": { - "message": "Zdeponuj w Fiat" - }, - "depositFromAccount": { - "message": "Zdeponuj z innego konta" - }, - "depositShapeShift": { - "message": "Zdeponuj przez ShapeShift" - }, - "depositShapeShiftExplainer": { - "message": "JeÅ›li posiadasz inne kryptowaluty, możesz nimi handlować i deponować Eter bezpoÅ›rednio do swojego portfela MetaMask. Nie trzeba żadnego konta." - }, "details": { "message": "Szczegóły" }, - "directDeposit": { - "message": "BezpoÅ›redni depozyt" - }, "directDepositEther": { "message": "Zdeponuj Eter bezpoÅ›rednio" }, @@ -285,6 +338,9 @@ "downloadGoogleChrome": { "message": "ÅšciÄ…gnij Google Chrome" }, + "downloadSecretBackup": { + "message": "Pobierz swojÄ… tajnÄ… frazÄ™ zapasowÄ… i przechowuj jÄ… bezpiecznie na zaszyfrowanym zewnÄ™trznym dysku twardym lub noÅ›niku pamiÄ™ci masowej." + }, "downloadStateLogs": { "message": "ZaÅ‚aduj logi stanów" }, @@ -297,44 +353,62 @@ "edit": { "message": "Edytuj" }, - "editAccountName": { - "message": "Edytuj nazwÄ™ konta" + "editContact": { + "message": "Edytuj kontakt" + }, + "endOfFlowMessage1": { + "message": "ZaliczyÅ‚eÅ› test – zabezpiecz swojÄ… frazÄ™ seed, to Twoja odpowiedzialność!" + }, + "endOfFlowMessage2": { + "message": "Wskazówki dotyczÄ…ce bezpiecznego przechowywania" + }, + "endOfFlowMessage3": { + "message": "Zapisz kopiÄ™ zapasowÄ… w wielu miejscach." + }, + "endOfFlowMessage4": { + "message": "Nigdy nie udostÄ™pniaj nikomu tej frazy." + }, + "endOfFlowMessage5": { + "message": "Uważaj na phishing! MetaMask nigdy spontanicznie nie poprosi CiÄ™ o podanie frazy seed." + }, + "endOfFlowMessage6": { + "message": "JeÅ›li zajdzie konieczność ponownego wykonania kopii zapasowej frazy seed, znajdziesz jÄ… w Ustawieniach -> Zabezpieczenia." + }, + "endOfFlowMessage7": { + "message": "JeÅ›li masz jakieÅ› pytania lub zauważysz coÅ› podejrzanego, wyÅ›lij e-mail na adres support@metamask.io." + }, + "endOfFlowMessage8": { + "message": "MetaMask nie może odzyskać Twojej frazy seed. Dowiedz siÄ™ wiÄ™cej." + }, + "endOfFlowMessage9": { + "message": "Dowiedz siÄ™ wiÄ™cej." }, - "editingTransaction": { - "message": "Dokonaj zmian w swojej transakcji" + "endOfFlowMessage10": { + "message": "Wszystko gotowe" }, - "emailUs": { - "message": "Napisz do nas!" + "ensRegistrationError": { + "message": "Błąd w rejestracji nazwy ENS" }, - "encryptNewDen": { - "message": "Zaszyfruj swój nowy DEN" + "ensNotFoundOnCurrentNetwork": { + "message": "Nazwa ENS nie zostaÅ‚a znaleziona w bieżącej sieci. Spróbuj przełączyć siÄ™ na GłównÄ… sieć Ethereum." }, - "ensNameNotFound": { - "message": "Nie znaleziono nazwy ENS" + "enterAnAlias": { + "message": "Wpisz alias" }, "enterPassword": { "message": "Wpisz hasÅ‚o" }, - "enterPasswordConfirm": { - "message": "Wpisz hasÅ‚o żeby potwierdzić" - }, "enterPasswordContinue": { "message": "Podaj hasÅ‚o żeby kontynuować" }, - "parameters": { - "message": "Parametry" - }, - "passwordNotLongEnough": { - "message": "HasÅ‚o jest za krótkie" - }, - "passwordsDontMatch": { - "message": "HasÅ‚a sÄ… niezgodne" + "ethereumPublicAddress": { + "message": "Adres publiczny Ethereum" }, "etherscanView": { "message": "Zobacz konto na Etherscan" }, - "exchangeRate": { - "message": "Kurs wymiany" + "estimatedProcessingTimes": { + "message": "Szacunkowy czas przetwarzania" }, "expandView": { "message": "RozwiÅ„ widok" @@ -342,22 +416,22 @@ "exportPrivateKey": { "message": "Eksportuj klucz prywatny" }, - "exportPrivateKeyWarning": { - "message": "Eksportujesz prywatne klucze na wÅ‚asne ryzyko." - }, "failed": { "message": "Nie udaÅ‚o siÄ™" }, + "fast": { + "message": "Szybko" + }, + "faster": { + "message": "Szybciej" + }, "fiat": { "message": "FIAT", - "description": "Rodzaj wymiany" + "description": "Exchange type" }, "fileImportFail": { "message": "Importowanie pliku nie dziaÅ‚a? Kliknij tutaj!", - "description": "Wspomaga użytkowników przy importowaniu ich konta z pliku JSON" - }, - "followTwitter": { - "message": "Åšledź nas na Twitterze" + "description": "Helps user import their account from a JSON file" }, "forgetDevice": { "message": "UsuÅ„ to urzÄ…dzenie." @@ -365,62 +439,54 @@ "from": { "message": "Z" }, - "fromToSame": { - "message": "Adresy Z i Do nie mogÄ… być identyczne" - }, - "fromShapeShift": { - "message": "Z ShapeShift" - }, "functionType": { "message": "Typ funkcji" }, - "gas": { - "message": "Gaz", - "description": "Krótkie oznaczenie kosztu gazu" - }, - "gasFee": { - "message": "OpÅ‚ata za gaz" - }, "gasLimit": { "message": "Limit gazu" }, - "gasLimitCalculation": { - "message": "Obliczamy sugerowany limit gazu na podstawie danych z transakcji w sieci." - }, - "gasLimitRequired": { - "message": "Limit gazu jest wymagany" + "gasLimitInfoModalContent": { + "message": "Limit gazu to maksymalna ilość jednostek gazu, którÄ… jesteÅ› skÅ‚onny użyć w transakcji." }, "gasLimitTooLow": { "message": "Limit gazu musi wynosić co najmniej 21000" }, - "generatingSeed": { - "message": "Generowanie seed..." + "gasUsed": { + "message": "Użyty gaz" }, "gasPrice": { "message": "Cena gazu (GWEI)" }, - "gasPriceCalculation": { - "message": "Obliczamy ceny gazu na podstawie danych z transakcji w sieci." + "gasPriceExtremelyLow": { + "message": "Bardzo niska cena gazu" + }, + "gasPriceInfoModalContent": { + "message": "Cena gazu to ilość kryptowaluty Ether, którÄ… jesteÅ› gotów zapÅ‚acić za każdÄ… jednostkÄ™ gazu." }, - "gasPriceRequired": { - "message": "Wymagana cena gazu" + "gasPriceNoDenom": { + "message": "Cena gazu" }, - "generatingTransaction": { - "message": "Generowanie transakcji" + "general": { + "message": "Ogólne" + }, + "generalSettingsDescription": { + "message": "Przeliczanie walut, waluta podstawowa, jÄ™zyk, ikona (identicon) Blockies" }, "getEther": { "message": "ZdobÄ…dź Eter" }, "getEtherFromFaucet": { "message": "ZdobÄ…dź Eter ze źródÅ‚a za $1", - "description": "WyÅ›wietla nazwÄ™ sieci dla źródÅ‚a Eteru" + "description": "Displays network name for Ether faucet" }, "getHelp": { "message": "Po pomoc." }, - "greaterThanMin": { - "message": "musi być wiÄ™ksze lub równe $1.", - "description": "pomoc przy wpisywaniu hex jako dane dziesiÄ™tne" + "getStarted": { + "message": "Rozpocznij" + }, + "happyToSeeYou": { + "message": "Cieszymy siÄ™, że tu jesteÅ›." }, "hardware": { "message": "sprzÄ™t" @@ -439,10 +505,7 @@ }, "here": { "message": "tutaj", - "description": "jak w -kliknij tutaj- po wiÄ™cej informacji (połączone z troubleTokenBalances)" - }, - "hereList": { - "message": "Oto lista!!!" + "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, "hexData": { "message": "Dane Hex" @@ -450,24 +513,15 @@ "hide": { "message": "Schowaj" }, - "hideToken": { - "message": "Schowaj token" - }, "hideTokenPrompt": { "message": "Schować token?" }, "history": { "message": "Historia" }, - "howToDeposit": { - "message": "Jak chcesz zdeponować Eter?" - }, - "holdEther": { - "message": "Umożliwia przechowywanie eteru i tokenów oraz sÅ‚uży jako łącznik do zdecentralizowanych aplikacji." - }, "import": { "message": "Importuj", - "description": "Przycisk do importowania konta z wybranego pliku." + "description": "Button to import an account from a selected file" }, "importAccount": { "message": "Importuj konto" @@ -475,15 +529,18 @@ "importAccountMsg": { "message": " Importowane konta nie bÄ™dÄ… powiÄ…zane z TwojÄ… pierwotnÄ… frazÄ… seed MetaMask. Dowiedz siÄ™ wiÄ™cej o importowaniu kont " }, - "importAnAccount": { - "message": "Importuj konto" + "importAccountSeedPhrase": { + "message": "Zaimportuj konto za pomocÄ… frazy seed" }, - "importDen": { - "message": "Importuj istniejÄ…ce DEN" + "importWallet": { + "message": "Importuj portfel" + }, + "importYourExisting": { + "message": "Zaimportuj istniejÄ…cy portfel, wprowadzajÄ…c 12 słów frazy seed" }, "imported": { "message": "Zaimportowane", - "description": "status pokazujÄ…cy, że konto zostaÅ‚o w peÅ‚ni zaÅ‚adowane na keyring" + "description": "status showing that an account has been fully loaded into the keyring" }, "importUsingSeed": { "message": "Importuj przy pomocy frazy seed konta" @@ -494,6 +551,9 @@ "initialTransactionConfirmed": { "message": "Twoja transakcja zostaÅ‚a potwierdzona w sieci. Kliknij OK żeby wrócić." }, + "insufficientBalance": { + "message": "NiewystarczajÄ…ce saldo." + }, "insufficientFunds": { "message": "NiewystarczajÄ…ce Å›rodki." }, @@ -506,37 +566,31 @@ "invalidAddressRecipient": { "message": "NieprawidÅ‚owy adres odbiorcy" }, - "invalidGasParams": { - "message": "NieprawidÅ‚owe parametry gazu" + "knownAddressRecipient": { + "message": "Znany adres kontraktu." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "To nie jest sieć ETH, zmieÅ„ na maÅ‚e litery" }, "invalidInput": { "message": "NieprawidÅ‚owe dane." }, - "invalidRequest": { - "message": "NieprawidÅ‚owe zapytanie" - }, "invalidRPC": { "message": "NieprawidÅ‚owe RPC URI" }, + "invalidBlockExplorerURL": { + "message": "NieprawidÅ‚owe Block Explorer URI" + }, "invalidSeedPhrase": { "message": "NieprawidÅ‚owa fraza seed" }, - "jsonFail": { - "message": "CoÅ› poszÅ‚o nie tak. Upewnij siÄ™, że plik JSON jest prawidÅ‚owo sformatowany." - }, "jsonFile": { "message": "Plik JSON", - "description": "formatuj do importowania konta" - }, - "keepTrackTokens": { - "message": "Monitoruj stan tokenów kupionych przy pomocy konta MetaMask." + "description": "format for importing an account" }, "kovan": { "message": "Sieć testowa Kovan" }, - "knowledgeDataBase": { - "message": "Sprawdź naszÄ… BazÄ™ wiedzy." - }, "max": { "message": "Maks." }, @@ -546,9 +600,8 @@ "ledgerAccountRestriction": { "message": "Musisz użyć swojego poprzedniego konta zanim dodasz kolejne." }, - "lessThanMax": { - "message": "musi być mniejsze lub równe $1.", - "description": "pomoc przy wpisywaniu hex jako dane dziesiÄ™tne" + "letsGoSetUp": { + "message": "Tak, zacznijmy od poczÄ…tku!" }, "likeToAddTokens": { "message": "Czy chcesz dodać te tokeny?" @@ -556,8 +609,8 @@ "links": { "message": "ÅÄ…cza" }, - "limit": { - "message": "Limit" + "liveGasPricePredictions": { + "message": "Przewidywanie ceny gazu na żywo" }, "loading": { "message": "Åadowanie..." @@ -565,26 +618,20 @@ "loadingTokens": { "message": "Åadowanie tokenów..." }, + "loadMore": { + "message": "ZaÅ‚aduj wiÄ™cej" + }, "localhost": { "message": "Serwer lokalny 8545" }, - "login": { - "message": "Zaloguj siÄ™" - }, - "logout": { + "lock": { "message": "Wyloguj siÄ™" }, - "loose": { - "message": "Porzuć" - }, - "loweCaseWords": { - "message": "sÅ‚owa seed mogÄ… być pisane wyłącznie maÅ‚ymi literami" - }, "mainnet": { "message": "Główna sieć Ethereum" }, - "menu": { - "message": "Menu" + "memorizePhrase": { + "message": "ZapamiÄ™taj tÄ™ frazÄ™." }, "message": { "message": "Wiadomość" @@ -592,18 +639,21 @@ "metamaskDescription": { "message": "MetaMask to bezpieczny portfel dla Ethereum." }, - "metamaskSeedWords": { - "message": "SÅ‚owa Seed MetaMask" - }, - "min": { - "message": "Minimum" + "metamaskVersion": { + "message": "Wersja MetaMask" }, - "missingYourTokens": { - "message": "Nie widzisz swoich token?" + "mobileSyncText": { + "message": "Wpisz hasÅ‚o, aby potwierdzić, że to Ty!" }, "myAccounts": { "message": "Moje konta" }, + "myWalletAccounts": { + "message": "Moja konta portfeli" + }, + "myWalletAccountsDescription": { + "message": "Wszystkie Twoje konta utworzone w MetaMask zostanÄ… automatycznie dodane do tej sekcji." + }, "mustSelectOne": { "message": "Należy wybrać co najmniej 1 token." }, @@ -612,27 +662,35 @@ }, "needImportFile": { "message": "Musisz wybrać plik do zaimportowania.", - "description": "Użytkownik importuje konto i musi dodać plik, żeby kontynuować" - }, - "needImportPassword": { - "message": "Musisz podać hasÅ‚o dla wybranego pliku.", - "description": "HasÅ‚o i plik niezbÄ™dne do zaimportowania konta" + "description": "User is important an account and needs to add a file to continue" }, "negativeETH": { "message": "Nie można wysÅ‚ać ujemnych iloÅ›ci ETH." }, + "networkName": { + "message": "Nazwa sieci" + }, "networks": { "message": "Sieci" }, + "networkSettingsDescription": { + "message": "Dodawaj i edytuj niestandardowe sieci RPC" + }, "nevermind": { "message": "Nie ważne" }, "newAccount": { "message": "Nowe konto" }, + "newAccountDetectedDialogMessage": { + "message": "Wykryto nowy adres! Kliknij tutaj, aby dodać go do książki adresowej." + }, "newAccountNumberName": { "message": "Konto $1", - "description": "Automatyczna nazwa kolejnego konta utworzonego w widoku Utwórz konto" + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "Nowy kontakt" }, "newContract": { "message": "Nowy kontrakt" @@ -640,11 +698,38 @@ "newPassword": { "message": "Nowe hasÅ‚o (min. 8 znaków)" }, - "newRecipient": { - "message": "Nowy odbiorca" + "newNetwork": { + "message": "Nowa sieć" + }, + "newToMetaMask": { + "message": "Pierwszy raz w MetaMask?" }, - "newRPC": { - "message": "Nowy RPC URL" + "noAlreadyHaveSeed": { + "message": "Nie, mam już frazÄ™ seed" + }, + "protectYourKeys": { + "message": "ChroÅ„ swoje klucze!" + }, + "protectYourKeysMessage1": { + "message": "Traktuj swojÄ… frazÄ™ seed z ostrożnoÅ›ciÄ… – zgÅ‚aszano nam przypadki stron internetowych, które podajÄ… siÄ™ za MetaMask. MetaMask nigdy nie poprosi CiÄ™ o podanie frazy seed!" + }, + "protectYourKeysMessage2": { + "message": "Przechowuj frazÄ™ z zachowaniem zasad bezpieczeÅ„stwa. JeÅ›li zauważysz coÅ› podejrzanego lub nie masz pewnoÅ›ci co do strony internetowej, wyÅ›lij e-mail na adres support@metamask.io" + }, + "rpcUrl": { + "message": "Nowy adres URL RPC" + }, + "optionalChainId": { + "message": "Identyfikator Å‚aÅ„cucha (opcjonalnie)" + }, + "optionalSymbol": { + "message": "Symbol (opcjonalnie)" + }, + "newTotal": { + "message": "Nowa suma" + }, + "newTransactionFee": { + "message": "Nowa opÅ‚ata transakcyjna" }, "next": { "message": "Dalej" @@ -652,23 +737,14 @@ "noAddressForName": { "message": "Nie wybrano żadnego adresu dla tej nazwy." }, - "noDeposits": { - "message": "Brak otrzymanych depozytów" - }, "noConversionRateAvailable": { "message": "Brak kursu waluty" }, - "noTransactionHistory": { - "message": "Brak historii transakcji." - }, "noTransactions": { "message": "Nie ma transakcji" }, - "notFound": { - "message": "Nie znaleziono" - }, - "notStarted": { - "message": "Nie rozpoczÄ™to" + "notEnoughGas": { + "message": "Za maÅ‚o gazu" }, "noWebcamFoundTitle": { "message": "Nie znaleziono kamery" @@ -676,42 +752,36 @@ "noWebcamFound": { "message": "Twoja kamera nie zostaÅ‚a znaleziona. Spróbuj ponownie." }, - "oldUI": { - "message": "Stary interfejs" - }, - "oldUIMessage": { - "message": "WróciÅ‚eÅ› do starego interfejsu. Możesz włączyć nowy interfejs przez opcje w rozwijanym menu w prawym górnym rogu." + "ofTextNofM": { + "message": "z" }, - "openInTab": { - "message": "Otwórz w zakÅ‚adce" - }, - "or": { - "message": "lub", - "description": "wybór miÄ™dzy tworzeniem i importowaniem nowego konta" + "orderOneHere": { + "message": "Zamów Trezor lub Ledger i trzymaj swoje Å›rodki w portfelu sprzÄ™towym." }, "origin": { "message": "Pochodzenie" }, + "parameters": { + "message": "Parametry" + }, + "participateInMetaMetrics": { + "message": "Weź udziaÅ‚ w MetaMetrics" + }, + "participateInMetaMetricsDescription": { + "message": "Weź udziaÅ‚ w MetaMetrics, aby pomóc nam ulepszyć MetaMask" + }, "password": { "message": "HasÅ‚o" }, - "passwordCorrect": { - "message": "Upewnij siÄ™, że Twoje hasÅ‚o jest poprawne." - }, - "passwordMismatch": { - "message": "hasÅ‚a nie sÄ… takie same", - "description": "podczas tworzenia hasÅ‚a, tekst w dwóch polach haseÅ‚ nie byÅ‚ taki sam" + "passwordsDontMatch": { + "message": "HasÅ‚a sÄ… niezgodne" }, - "passwordShort": { - "message": "hasÅ‚o za krótkie", - "description": "podczas tworzenia hasÅ‚a, hasÅ‚o nie jest bezpieczne, ponieważ nie jest wystarczajÄ…co dÅ‚ugie" + "passwordNotLongEnough": { + "message": "HasÅ‚o jest za krótkie" }, "pastePrivateKey": { "message": "Tutaj wklej swój prywatny klucz:", - "description": "Do importowania konta z prywatnego klucza" - }, - "pasteSeed": { - "message": "Tutaj wklej swojÄ… frazÄ™ seed!" + "description": "For importing an account from a private key" }, "pending": { "message": "oczekiwanie" @@ -719,21 +789,21 @@ "personalAddressDetected": { "message": "Wykryto osobisty adres. Wprowadź adres kontraktu tokenów." }, - "pleaseReviewTransaction": { - "message": "ProszÄ™, sprawdź transakcjÄ™." - }, - "popularTokens": { - "message": "Popularne tokeny" - }, "prev": { "message": "Poprzednie" }, + "primaryCurrencySetting": { + "message": "Waluta podstawowa" + }, + "primaryCurrencySettingDescription": { + "message": "Wybierz walutÄ™ natywnÄ…, aby preferować wyÅ›wietlanie wartoÅ›ci w walucie natywnej Å‚aÅ„cucha (np. ETH). Wybierz walutÄ™ fiat, aby preferować wyÅ›wietlanie wartoÅ›ci w wybranej przez siebie walucie fiat." + }, "privacyMsg": { "message": "Polityka prywatnoÅ›ci" }, "privateKey": { "message": "Klucz prywatny", - "description": "wybierz ten typ pliku żeby importować konto" + "description": "select this type of file to use to import an account" }, "privateKeyWarning": { "message": "Uwaga: Nie ujawniaj nikomu tego klucza. Ktokolwiek posiadajÄ…cy Twoje prywatne klucze może użyć Å›rodków znajdujÄ…cych siÄ™ na Twoim koncie." @@ -741,35 +811,35 @@ "privateNetwork": { "message": "Sieć prywatna" }, - "qrCode": { - "message": "Pokaż kod QR" - }, "queue": { "message": "Kolejka" }, "readdToken": { "message": "Możesz później ponownie dodać ten token poprzez \"Dodaj token\" w opcjach menu swojego konta." }, - "readMore": { - "message": "Dowiedz siÄ™ wiÄ™cej tutaj." - }, - "readMore2": { - "message": "Dowiedz siÄ™ wiÄ™cej." - }, - "receive": { - "message": "Otrzymaj" + "recents": { + "message": "Ostatnie" }, "recipientAddress": { "message": "Adres odbiorcy" }, - "refundAddress": { - "message": "Twój adres na zwroty" + "recipientAddressPlaceholder": { + "message": "Szukaj, adres publiczny (0x) lub ENS" + }, + "rejectAll": { + "message": "Odrzuć wszystkie" + }, + "rejectTxsN": { + "message": "Odrzuć transakcje ($1)" + }, + "rejectTxsDescription": { + "message": "Zamierzasz odrzucić wiele ($1) transakcji jednoczeÅ›nie." }, "rejected": { "message": "Odrzucone" }, "reset": { - "message": "Reset" + "message": "Resetuj" }, "resetAccount": { "message": "Resetuj konto" @@ -777,24 +847,27 @@ "resetAccountDescription": { "message": "Zresetowanie konta wyczyÅ›ci TwojÄ… historiÄ™ transakcji." }, + "deleteNetwork": { + "message": "Usunąć sieć?" + }, + "deleteNetworkDescription": { + "message": "Czy na pewno chcesz usunąć tÄ™ sieć?" + }, + "remindMeLater": { + "message": "Przypomnij mi później" + }, "restoreFromSeed": { "message": "Przywrócić konto?" }, - "restoreVault": { - "message": "Przywróć schowek" - }, "restoreAccountWithSeed": { "message": "Przywróć konto frazÄ… seed" }, + "requestsAwaitingAcknowledgement": { + "message": "wnioski oczekujÄ…ce na zatwierdzenie" + }, "required": { "message": "Wymagane" }, - "retryWithMoreGas": { - "message": "Spróbuj ponownie z wiÄ™kszÄ… cenÄ… gazu" - }, - "walletSeed": { - "message": "Seed portfela" - }, "restore": { "message": "Przywróć" }, @@ -813,9 +886,6 @@ "revealSeedWordsWarning": { "message": "Te sÅ‚owa mogÄ… być użyte żeby ukraść Twoje konta." }, - "revert": { - "message": "Wycofaj" - }, "remove": { "message": "usuÅ„" }, @@ -834,49 +904,26 @@ "ropsten": { "message": "Sieć testowa Ropsten" }, - "rpc": { - "message": "Indywidualne RPC" - }, - "currentRpc": { - "message": "Obecne RPC" - }, - "connectingToMainnet": { - "message": "ÅÄ…czenie z głównÄ… sieciÄ… Ethereum" - }, - "connectingToRopsten": { - "message": "ÅÄ…czenie z sieciÄ… testowÄ… Ropsten" - }, - "connectingToKovan": { - "message": "ÅÄ…czenie z sieciÄ… testowÄ… Kovan" - }, - "connectingToRinkeby": { - "message": "ÅÄ…czenie z sieciÄ… testowÄ… Rinkeby" - }, - "connectingToUnknown": { - "message": "ÅÄ…czenie z nieznanÄ… sieciÄ…" - }, - "sampleAccountName": { - "message": "Np. Moje nowe konto", - "description": "Umożliwia użytkownikom zrozumieć ideÄ™ dodawania wÅ‚asnej nazwy to ich konta" + "goerli": { + "message": "Sieć testowa Goerli" }, "save": { "message": "Zapisz" }, - "speedUpTitle": { - "message": "Przyspiesz transakcjÄ™" + "slow": { + "message": "Powoli" }, - "speedUpSubtitle": { - "message": "ZwiÄ™ksz cenÄ™ gazu żeby nadpisać i przyspieszyć transakcjÄ™" + "slower": { + "message": "Wolniej" }, "saveAsCsvFile": { "message": "Zapisz jako plik CSV" }, - "saveAsFile": { - "message": "Zapisz jako", - "description": "Proces eksportu konta" + "scanInstructions": { + "message": "Umieść kod QR na wprost kamery" }, - "saveSeedAsFile": { - "message": "Zapisz sÅ‚owa seed jako plik" + "scanQrCode": { + "message": "Skanuj kod QR" }, "search": { "message": "Szukaj" @@ -884,29 +931,38 @@ "searchResults": { "message": "Wyniki wyszukiwania" }, + "secretBackupPhrase": { + "message": "Tajna fraza zapasowa" + }, + "secretBackupPhraseDescription": { + "message": "Twoja tajna fraza zapasowa uÅ‚atwia tworzenie kopii zapasowych i przywracanie konta." + }, + "secretBackupPhraseWarning": { + "message": "OSTRZEÅ»ENIE: Nigdy nie ujawniaj swojej frazy zapasowej. Każdy, kto pozna tÄ™ frazÄ™, może bezpowrotnie odebrać Ci kryptowalutÄ™ Ether." + }, "secretPhrase": { "message": "Å»eby otworzyć schowek, wpisz tutaj swojÄ… frazÄ™ dwunastu słów." }, - "showHexData": { - "message": "Pokaż dane hex" + "securityAndPrivacy": { + "message": "BezpieczeÅ„stwo i prywatność" }, - "showHexDataDescription": { - "message": "Wybierz to żeby pokazać pole danych hex na ekranie wysyÅ‚ania" + "securitySettingsDescription": { + "message": "Ustawienia prywatnoÅ›ci i fraza seed portfela" }, - "newPassword8Chars": { - "message": "Nowe hasÅ‚o (min. 8 znaków)" + "seedPhrasePlaceholder": { + "message": "Oddziel sÅ‚owa pojedynczÄ… spacjÄ…" }, "seedPhraseReq": { "message": "Frazy seed majÄ… 12 słów" }, - "select": { - "message": "Wybierz" - }, "selectCurrency": { "message": "Wybierz walutÄ™" }, - "selectService": { - "message": "Wybierz usÅ‚ugÄ™" + "selectEachPhrase": { + "message": "Wybierz każdÄ… frazÄ™, aby upewnić siÄ™, że jest poprawna." + }, + "selectLocale": { + "message": "Wybierz lokalizacjÄ™" }, "selectType": { "message": "Wybierz rodzaj" @@ -914,6 +970,9 @@ "send": { "message": "WyÅ›lij" }, + "sendAmount": { + "message": "WyÅ›lij kwotÄ™" + }, "sendETH": { "message": "WyÅ›lij ETH" }, @@ -929,78 +988,47 @@ "separateEachWord": { "message": "Oddziel sÅ‚owa pojedynczÄ… spacjÄ…" }, - "onlySendToEtherAddress": { - "message": "Na adres Ethereum wysyÅ‚aj tylko ETH." - }, - "onlySendTokensToAccountAddress": { - "message": "WyÅ›lij tylko $1 na adres konta Ethereum.", - "description": "wyÅ›wietla symbol tokena" - }, - "orderOneHere": { - "message": "Zamów Trezor lub Ledger i trzymaj swoje Å›rodki w portfelu sprzÄ™towym." - }, - "outgoing": { - "message": "WychodzÄ…ce" - }, "searchTokens": { "message": "Szukaj tokenów" }, - "selectAnAddress": { - "message": "Wybierz adres" - }, "selectAnAccount": { "message": "Wybierz konto" }, "selectAnAccountHelp": { "message": "Wybierz konto do przeglÄ…dania w MetaMask" }, + "selectAHigherGasFee": { + "message": "Wybierz wyższÄ… opÅ‚atÄ™ za gaz, aby przyspieszyć przetwarzanie transakcji.*" + }, "selectHdPath": { "message": "Wybierz Å›cieżkÄ™ HD" }, "selectPathHelp": { "message": "JeÅ›li nie widzisz poniżej swoich kont Ledger, spróbuj przełączyć siÄ™ na \"Legacy (MEW / MyCrypto)\"" }, - "sendTokensAnywhere": { - "message": "WyÅ›lij tokeny do kogoÅ› z adresem Ethereum" - }, "settings": { "message": "Ustawienia" }, - "step1HardwareWallet": { - "message": "1. Podłącz portfel sprzÄ™towy" - }, - "step1HardwareWalletMsg": { - "message": "Połącz swój portfel sprzÄ™towy z komputerem." - }, - "step2HardwareWallet": { - "message": "2. Wybierz konto" - }, - "step2HardwareWalletMsg": { - "message": "Wybierz konto, które chcesz przeglÄ…dać. Możesz wybrać tylko jedno konto w danym momencie." - }, - "step3HardwareWallet": { - "message": "3. Zacznij używać dystrybuowanych aplikacji (dApps) i wiele wiÄ™cej!" - }, - "step3HardwareWalletMsg": { - "message": "Używaj swojego konta sprzÄ™towego tak, jak używasz jakiegokolwiek konta z Ethereum. Loguj siÄ™ do dystrybuowanych aplikacji (dApps), wysyÅ‚aj Eth, kupuj i przechowaj tokeny ERC20 i niewymienne tokeny, jak np. CryptoKitties." + "showAdvancedGasInline": { + "message": "Zaawansowana kontrola gazu" }, - "info": { - "message": "Info" - }, - "scanInstructions": { - "message": "Umieść kod QR na wprost kamery" + "showAdvancedGasInlineDescription": { + "message": "Wybierz tÄ™ opcjÄ™, aby móc zmienić cenÄ™ i limit gazu bezpoÅ›rednio na ekranach wysyÅ‚ania i potwierdzania." }, - "scanQrCode": { - "message": "Skanuj kod QR" + "showFiatConversionInTestnets": { + "message": "Pokaż przeliczanie w sieciach testowych" }, - "shapeshiftBuy": { - "message": "Kup w ShapeShift" + "showFiatConversionInTestnetsDescription": { + "message": "Wybierz tÄ™ opcjÄ™, aby wyÅ›wietlać przeliczanie waluty fiat w sieciach testowych" }, "showPrivateKeys": { "message": "Pokaż prywatne klucze" }, - "showQRCode": { - "message": "Pokaż kod QR" + "showHexData": { + "message": "Pokaż dane hex" + }, + "showHexDataDescription": { + "message": "Wybierz to żeby pokazać pole danych hex na ekranie wysyÅ‚ania" }, "sign": { "message": "Podpisz" @@ -1011,23 +1039,26 @@ "signed": { "message": "Podpisane" }, - "signMessage": { - "message": "Podpisz wiadomość" - }, "signNotice": { "message": "Podpisanie tej wiadomoÅ›ci może mieć \nniebezpieczne skutki uboczne. Podpisuj wiadomoÅ›ci \ntylko ze stron, którym chcesz udostÄ™pnić swoje konto.\nTa niebezpieczna metoda bÄ™dzie usuniÄ™ta w przyszÅ‚ych wersjach. " }, "sigRequest": { "message": "ProÅ›ba o podpis" }, - "sigRequested": { - "message": "Podpis wymagany" + "somethingWentWrong": { + "message": "Ups! CoÅ› poszÅ‚o nie tak." + }, + "speedUp": { + "message": "PrzyÅ›piesz" }, - "spaceBetween": { - "message": "miÄ™dzy sÅ‚owami może być tylko pojedyncza spacja" + "speedUpCancellation": { + "message": "PrzyÅ›piesz anulowanie" }, - "status": { - "message": "Status" + "speedUpTransaction": { + "message": "PrzyÅ›piesz transakcjÄ™" + }, + "switchNetworks": { + "message": "ZmieÅ„ sieci" }, "stateLogs": { "message": "Logi stanów" @@ -1038,8 +1069,26 @@ "stateLogError": { "message": "Błąd podczas pobierania logów stanów." }, - "submit": { - "message": "WyÅ›lij" + "step1HardwareWallet": { + "message": "1. Podłącz portfel sprzÄ™towy" + }, + "step1HardwareWalletMsg": { + "message": "Połącz swój portfel sprzÄ™towy z komputerem." + }, + "step2HardwareWallet": { + "message": "2. Wybierz konto" + }, + "step2HardwareWalletMsg": { + "message": "Wybierz konto, które chcesz przeglÄ…dać. Możesz wybrać tylko jedno konto w danym momencie." + }, + "step3HardwareWallet": { + "message": "3. Zacznij używać dystrybuowanych aplikacji (dApps) i wiele wiÄ™cej!" + }, + "step3HardwareWalletMsg": { + "message": "Używaj swojego konta sprzÄ™towego tak, jak używasz jakiegokolwiek konta z Ethereum. Loguj siÄ™ do dystrybuowanych aplikacji (dApps), wysyÅ‚aj Eth, kupuj i przechowaj tokeny ERC20 i niewymienne tokeny, jak np. CryptoKitties." + }, + "storePhrase": { + "message": "Przechowuj tÄ™ frazÄ™ w menedżerze haseÅ‚, takim jak 1Password." }, "submitted": { "message": "WysÅ‚ane" @@ -1048,10 +1097,28 @@ "message": "Odwiedź nasze Centrum Pomocy" }, "symbolBetweenZeroTwelve": { - "message": "Symbol musi mieć od 0 do 12 znaków." + "message": "Symbol musi mieć maksymalnie 11 znaków." + }, + "syncWithMobile": { + "message": "Synchronizuj z telefonem" + }, + "syncWithMobileTitle": { + "message": "Synchronizuj z telefonem" }, - "takesTooLong": { - "message": "Trwa zbyt dÅ‚ugo?" + "syncWithMobileDesc": { + "message": "Możesz synchronizować swoje konta i informacje z urzÄ…dzeniem mobilnym. Otwórz aplikacjÄ™ mobilnÄ… MetaMask, przejdź do „Ustawień†i wybierz opcjÄ™ „Synchronizuj z rozszerzeniem przeglÄ…darkiâ€." + }, + "syncWithMobileDescNewUsers": { + "message": "JeÅ›li po raz pierwszy otwierasz aplikacjÄ™ MetaMask Mobile, postÄ™puj zgodnie z instrukcjami w telefonie." + }, + "syncWithMobileScanThisCode": { + "message": "Zeskanuj ten kod za pomocÄ… aplikacji mobilnej MetaMask" + }, + "syncWithMobileBeCareful": { + "message": "Upewnij siÄ™, że nikt inny nie patrzy na Twój ekran podczas skanowania tego kodu" + }, + "syncWithMobileComplete": { + "message": "Twoje dane zostaÅ‚y zsynchronizowane. MiÅ‚ego korzystania z aplikacji mobilnej MetaMask!" }, "terms": { "message": "Regulamin" @@ -1059,95 +1126,100 @@ "testFaucet": { "message": "ŹródÅ‚o testowego ETH" }, - "to": { - "message": "Do" - }, - "toETHviaShapeShift": { - "message": "$1 na ETH przez ShapeShift", - "description": "system uzupeÅ‚ni typ depozytu na poczÄ…tku wiadomoÅ›ci" + "thisWillCreate": { + "message": "Utworzony zostanie nowy portfel i fraza seed" }, - "token": { - "message": "Token" + "tips": { + "message": "Napiwki" }, - "tokenAddress": { - "message": "Adres tokena" + "to": { + "message": "Do" }, "tokenAlreadyAdded": { "message": "Token jest już dodany." }, - "tokenBalance": { - "message": "Liczba Twoich tokenów:" - }, - "tokenSelection": { - "message": "Szukaj tokenów lub wybierz z naszej listy popularnych tokenów." + "tokenContractAddress": { + "message": "Adres kontraktu tokena" }, "tokenSymbol": { "message": "Symbol tokena" }, - "tokenWarning1": { - "message": "Monitoruj stan tokenów kupionych przy pomocy konta MetaMask. JeÅ›li masz tokeny kupione przy pomocy innych kont, nie pojawiÄ… siÄ™ tutaj." - }, "total": { "message": "Suma" }, - "transactions": { - "message": "transakcje" + "transaction": { + "message": "transakcja" + }, + "transactionConfirmed": { + "message": "Transakcja zostaÅ‚a potwierdzona o $2." + }, + "transactionCreated": { + "message": "Transakcja o wartoÅ›ci $1 zostaÅ‚a utworzona o $2." + }, + "transactionDropped": { + "message": "Transakcja odrzucona – $2." + }, + "transactionSubmitted": { + "message": "Transakcja wykonana z opÅ‚atÄ… za gaz w wysokoÅ›ci $1 – $2." + }, + "transactionResubmitted": { + "message": "Transakcja wysÅ‚ana ponownie z opÅ‚atÄ… za gaz podwyższonÄ… do $1 – $2" + }, + "transactionUpdated": { + "message": "Transakcja zaktualizowana – $2." + }, + "transactionErrored": { + "message": "WystÄ…piÅ‚ błąd podczas wykonywania transakcji." + }, + "transactionCancelAttempted": { + "message": "PodjÄ™to próbÄ™ anulowania transakcji z opÅ‚atÄ… za gaz w wysokoÅ›ci $1 – $2" + }, + "transactionCancelSuccess": { + "message": "Transakcja zostaÅ‚a anulowana pomyÅ›lnie – $2" }, "transactionError": { "message": "Błąd transakcji. WyjÄ…tek w kodzie kontraktu." }, - "transactionMemo": { - "message": "Memo transakcji (opcjonalnie)" + "transactionErrorNoContract": { + "message": "Próba wywoÅ‚ania funkcji na adresie, który nie jest adresem kontraktu." + }, + "transactionFee": { + "message": "OpÅ‚ata transakcyjna" }, - "transactionNumber": { - "message": "Numer transakcji" + "transactionTime": { + "message": "Czas transakcji" }, "transfer": { "message": "Przelew" }, - "transfers": { - "message": "Przelewy" + "transferBetweenAccounts": { + "message": "Przelew miÄ™dzy moimi kontami" }, - "trezorHardwareWallet": { - "message": "SprzÄ™towy portfel TREZOR" + "transferFrom": { + "message": "Przelew z" }, "troubleTokenBalances": { "message": "WystÄ…piÅ‚ problem z zaÅ‚adowaniem informacji o Twoich tokenach. Można je zobaczyć ", - "description": "Z linkiem (tutaj) do informacji o stanie tokenów" + "description": "Followed by a link (here) to view token balances" }, "tryAgain": { "message": "Spróbuj ponownie" }, - "twelveWords": { - "message": "Tych 12 słów to jedyny sposób, żeby odzyskać konta w MetaMasku. Zapisz je w bezpiecznym miejscu." - }, "typePassword": { "message": "Wpisz hasÅ‚o" }, - "uiWelcome": { - "message": "Witamy w nowym interfejsie (Beta)" - }, - "uiWelcomeMessage": { - "message": "Używasz teraz nowego interfejsu MetaMask." - }, "unapproved": { "message": "Niezatwierdzone" }, - "unavailable": { - "message": "NiedostÄ™pne" + "units": { + "message": "jednostki" }, "unknown": { "message": "Nieznane" }, - "unknownFunction": { - "message": "Nieznana funkcja" - }, "unknownNetwork": { "message": "Nieznana sieć prywatna" }, - "unknownNetworkId": { - "message": "Nieznane sieciowe ID" - }, "unknownQrCode": { "message": "Błąd: nie mogliÅ›my odczytać tego kodu QR" }, @@ -1163,36 +1235,38 @@ "unlockMessage": { "message": "Zdecentralizowana sieć oczekuje" }, - "uriErrorMsg": { - "message": "URI wymaga prawidÅ‚owego prefiksu HTTP/HTTPS." + "updatedWithDate": { + "message": "Zaktualizowano $1" }, - "usaOnly": { - "message": "Tylko USA", - "description": "Ta platforma wymiany jest dostÄ™pna tylko dla osób mieszkajÄ…cych w USA" + "urlErrorMsg": { + "message": "URI wymaga prawidÅ‚owego prefiksu HTTP/HTTPS." }, "usedByClients": { "message": "Używany przez różnych klientów" }, - "useOldUI": { - "message": "Przełącz na stary interfejs" - }, - "validFileImport": { - "message": "Należy wybrać prawidÅ‚owy plik do zaimportowania." - }, - "vaultCreated": { - "message": "Schowek utworzony" + "userName": { + "message": "Nazwa użytkownika" }, "viewAccount": { "message": "Zobacz konto" }, + "viewinExplorer": { + "message": "WyÅ›wietl w przeglÄ…darce" + }, + "viewContact": { + "message": "WyÅ›wietl kontakt" + }, + "viewOnCustomBlockExplorer": { + "message": "WyÅ›wietl w $1" + }, "viewOnEtherscan": { "message": "Zobacz na Etherscan" }, "visitWebSite": { "message": "Odwiedź naszÄ… stronÄ™" }, - "warning": { - "message": "Uwaga" + "walletSeed": { + "message": "Seed portfela" }, "welcomeBack": { "message": "Witaj z powrotem!" @@ -1200,8 +1274,11 @@ "welcome": { "message": "Witaj w MetaMask" }, - "whatsThis": { - "message": "Co to jest?" + "writePhrase": { + "message": "Zapisz tÄ™ frazÄ™ na kartce papieru i przechowuj w bezpiecznym miejscu. JeÅ›li chcesz zapewnić jeszcze wiÄ™ksze bezpieczeÅ„stwo, zapisz jÄ… na kilku kartkach i przechowuj w 2-3 różnych miejscach." + }, + "yesLetsTry": { + "message": "Tak, spróbuj" }, "youNeedToAllowCameraAccess": { "message": "Å»eby użyć tej opcji należy podłączyć kamerÄ™" @@ -1214,5 +1291,8 @@ }, "yourPrivateSeedPhrase": { "message": "Twoja prywatna fraza seed" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "Przyspieszenie z zerowÄ… cenÄ… gazu" } } diff --git a/app/_locales/pt/messages.json b/app/_locales/pt/messages.json index 5724bce88aaf..c3e710345cdf 100644 --- a/app/_locales/pt/messages.json +++ b/app/_locales/pt/messages.json @@ -1,52 +1,7 @@ { - "privacyMode": { - "message": "Modo de privacidade" - }, - "privacyModeDescription": { - "message": "Os sites devem solicitar acesso para visualizar as informações da sua conta." - }, - "exposeAccounts": { - "message": "Expor contas" - }, - "exposeDescription": { - "message": "Exponha contas ao site atual. Útil para dapps herdados." - }, - "confirmExpose": { - "message": "Tem certeza de que deseja expor suas contas ao site atual?" - }, - "confirmClear": { - "message": "Tem certeza de que deseja limpar sites aprovados?" - }, - "clearApprovalDataSuccess": { - "message": "Dados aprovados do website foram limpos com sucesso." - }, - "approvalData": { - "message": "Dados de aprovação" - }, - "approvalDataDescription": { - "message": "Limpe os dados aprovados do website para que todos os sites solicitem aprovação novamente." - }, - "clearApprovalData": { - "message": "Limpar dados de aprovação" - }, - "approve": { - "message": "Aprovar" - }, "reject": { "message": "Rejeitar" }, - "providerAPIRequest": { - "message": "Solicitação de API do Web3" - }, - "reviewProviderRequest": { - "message": "Por favor, revise esta solicitação da API da Ethereum." - }, - "providerRequestInfo": { - "message": "O domínio listado abaixo está tentando solicitar acesso à API Ethereum para que ele possa interagir com o blockchain Ethereum. Sempre verifique se você está no site correto antes de aprovar o acesso à Ethereum." - }, - "accept": { - "message": "Aceitar" - }, "account": { "message": "Conta" }, @@ -56,12 +11,6 @@ "accountName": { "message": "Nome da Conta" }, - "address": { - "message": "Endereço" - }, - "addCustomToken": { - "message": "Adicionar token customizada" - }, "addToken": { "message": "Adicionar Token" }, @@ -71,16 +20,16 @@ "amount": { "message": "Valor" }, - "amountPlusGas": { - "message": "Valor + Gas" - }, "appDescription": { "message": "Extensão para o browser de Ethereum", - "description": "A descrição da aplicação" + "description": "The description of the application" }, "appName": { "message": "MetaMask", - "description": "Nome da aplicação" + "description": "The name of the application" + }, + "approve": { + "message": "Aprovar" }, "attemptingConnect": { "message": "A tentar ligar à blockchain." @@ -88,46 +37,18 @@ "attributions": { "message": "Atribuições" }, - "available": { - "message": "Disponível" - }, "back": { "message": "Voltar" }, "balance": { "message": "Saldo:" }, - "balances": { - "message": "O meu saldo" - }, - "balanceIsInsufficientGas": { - "message": "Saldo insuficiente para a quantidade de gas total" - }, - "beta": { - "message": "BETA" - }, - "betweenMinAndMax": { - "message": "tem de ser maior ou igual a $1 e menor ou igual a $2.", - "description": "ajuda para introduzir hexadecimal como decimal" - }, "blockiesIdenticon": { "message": "Usar Blockies Identicon" }, - "borrowDharma": { - "message": "Pedir Empréstimo Com Dharma (Beta)" - }, "builtInCalifornia": { "message": "MetaMask é desenhada e construída na California." }, - "buy": { - "message": "Comprar" - }, - "buyCoinbase": { - "message": "Comprar no Coinbase" - }, - "buyCoinbaseExplainer": { - "message": "Coinbase é a forma mais conhecida para comprar e vender Bitcoin, Ethereum, e Litecoin." - }, "buyCoinSwitch": { "message": "Comprar no CoinSwitch" }, @@ -137,60 +58,24 @@ "cancel": { "message": "Cancelar" }, - "classicInterface": { - "message": "Utilizar interface clássico" - }, - "clickCopy": { - "message": "Carregue para copiar" - }, "confirm": { "message": "Confirmar" }, - "confirmContract": { - "message": "Confirmar Contrato" - }, "confirmPassword": { "message": "Confirmar Palavra-passe" }, - "confirmTransaction": { - "message": "Confirmar Transação" - }, - "continue": { - "message": "Continuar" - }, - "continueToCoinbase": { - "message": "Continuar para o Coinbase" - }, "continueToCoinSwitch": { "message": "Continuar para o CoinSwitch" }, "contractDeployment": { "message": "Distribuição do Contrato" }, - "conversionProgress": { - "message": "Conversão em progresso" - }, - "copiedButton": { - "message": "Copiado" - }, - "copiedClipboard": { - "message": "Copiado para a Ãrea de Transferência" - }, "copiedExclamation": { "message": "Copiado!" }, - "copiedSafe": { - "message": "Já copiei para um lugar seguro" - }, - "copy": { - "message": "Copiar" - }, "copyToClipboard": { "message": "Copiar para o clipboard" }, - "copyButton": { - "message": " Copiar " - }, "copyPrivateKey": { "message": "Esta é a sua chave privada (carregue para copiar)" }, @@ -200,25 +85,9 @@ "createAccount": { "message": "Criar Conta" }, - "createDen": { - "message": "Criar" - }, - "crypto": { - "message": "Cripto", - "description": "Tipo de câmbio (criptomoedas)" - }, - "currentConversion": { - "message": "Taxa de Conversão Atual" - }, - "currentNetwork": { - "message": "Rede Atual" - }, "customGas": { "message": "Customizar Gas" }, - "customize": { - "message": "Customizar" - }, "customRPC": { "message": "Customizar RPC" }, @@ -231,39 +100,15 @@ "defaultNetwork": { "message": "A rede pré definida para transações em Ether é a Main Net." }, - "denExplainer": { - "message": " DEN é o armazenamento encriptado da sua palavra-passe no MetaMask." - }, "deposit": { "message": "Depósito" }, - "depositBTC": { - "message": "Deposite as suas BTC no endereço abaixo:" - }, - "depositEth": { - "message": "Depositar Eth" - }, "depositEther": { "message": "Depositar Ether" }, - "depositFiat": { - "message": "Depositar moeda fiduciária" - }, - "depositFromAccount": { - "message": "Depositar de outra conta" - }, - "depositShapeShift": { - "message": "Depositar com ShapeShift" - }, - "depositShapeShiftExplainer": { - "message": "Se tem criptomoedas, pode trocar e depositar Ether diretamente na sua carteira MetaMask. Não precisa de conta." - }, "details": { "message": "Detalhes" }, - "directDeposit": { - "message": "Depósito Direto" - }, "directDepositEther": { "message": "Depositar Diretamente Ether" }, @@ -279,123 +124,58 @@ "edit": { "message": "Editar" }, - "editAccountName": { - "message": "Editar Nome da Conta" - }, - "emailUs": { - "message": "Fale connosco!" - }, - "encryptNewDen": { - "message": "Encripte o seu novo DEN" - }, "enterPassword": { "message": "Introduza palavra-passe" }, - "enterPasswordConfirm": { - "message": "Introduza a sua palavra-passe para confirmar" - }, "etherscanView": { "message": "Ver conta no Etherscan" }, - "exchangeRate": { - "message": "Taxa de Câmbio" - }, "exportPrivateKey": { "message": "Exportar Chave Privada" }, - "exportPrivateKeyWarning": { - "message": "Exportar chaves privadas por sua conta e risco." - }, "failed": { "message": "Falhou" }, "fiat": { "message": "FIAT", - "description": "Tipo de câmbio" + "description": "Exchange type" }, "fileImportFail": { "message": "A importação de ficheiro não está a funcionar? Carregue aqui!", - "description": "Ajuda usuários a importar as suas contas a partir de um ficheiro JSON" - }, - "followTwitter": { - "message": "Siga-nos no Twitter" + "description": "Helps user import their account from a JSON file" }, "from": { "message": "De" }, - "fromToSame": { - "message": "Endereços De e Para não podem ser iguais" - }, - "fromShapeShift": { - "message": "De ShapeShift" - }, - "gas": { - "message": "Gas", - "description": "Indicação breve do custo de gas" - }, - "gasFee": { - "message": "Taxa de Gas" - }, "gasLimit": { "message": "Limite de Gas" }, - "gasLimitCalculation": { - "message": "Calculamos o limite sugerido do gas com base nas taxas de sucesso da rede." - }, - "gasLimitRequired": { - "message": "Limite de Gas Necessário" - }, "gasLimitTooLow": { "message": "Limite de Gas deve ser no mínimo 21000" }, - "generatingSeed": { - "message": "A gerar Seed..." - }, "gasPrice": { "message": "Preço Gas (GWEI)" }, - "gasPriceCalculation": { - "message": "Calculamos o gas sugerido com base nas taxas de sucesso da rede." - }, - "gasPriceRequired": { - "message": "Preço Gas Necessário" - }, "getEther": { "message": "Obter Ether" }, "getEtherFromFaucet": { "message": "Obter Ether de um faucet por $1", - "description": "Mostra nome da rede para faucet de Ether" - }, - "greaterThanMin": { - "message": "tem de ser maior ou igual a $1.", - "description": "ajuda para introduzir hexadecimal como decimal" + "description": "Displays network name for Ether faucet" }, "here": { "message": "aqui", - "description": "como -clicar aqui- para mais informações (associado a troubleTokenBalances)" - }, - "hereList": { - "message": "Aqui está uma lista!!!!" + "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, "hide": { "message": "Ocultar" }, - "hideToken": { - "message": "Ocultar Token" - }, "hideTokenPrompt": { "message": "Ocultar Token?" }, - "howToDeposit": { - "message": "Como gostaria de depositar Ether?" - }, - "holdEther": { - "message": "Permite ter ether & tokens, e serve como uma ponte para aplicações descentralizadas." - }, "import": { "message": "Importar", - "description": "Botão para importar uma conta de um ficheiro selecionado" + "description": "Button to import an account from a selected file" }, "importAccount": { "message": "Importar Conta" @@ -403,15 +183,9 @@ "importAccountMsg": { "message": "Contas importadas não irão ser associadas com a frase seed da conta criada originalmente pelo MetaMask. Saiba mais sobre contas importadas." }, - "importAnAccount": { - "message": "Importar uma conta" - }, - "importDen": { - "message": "Importar DEN Existente" - }, "imported": { "message": "Importado", - "description": "estado para mostrar que uma conta foi totalmente carregada para o keyring" + "description": "status showing that an account has been fully loaded into the keyring" }, "infoHelp": { "message": "Informação & Ajuda" @@ -428,62 +202,37 @@ "invalidAddressRecipient": { "message": "O endereço do destinatário é inválido " }, - "invalidGasParams": { - "message": "Parâmetros para o Gas Inválidos" - }, "invalidInput": { "message": "Campo inválido." }, - "invalidRequest": { - "message": "Pedido Inválido" - }, "invalidRPC": { "message": "RPC URI Inválido" }, - "jsonFail": { - "message": "Ocorreu um erro. Por favor confirme que o seu ficheiro JSON está devidamente formatado." + "invalidBlockExplorerURL": { + "message": "Block Explorer URI Inválido" }, "jsonFile": { "message": "Ficheiro JSON", - "description": "Formatar para importar uma conta" + "description": "format for importing an account" }, "kovan": { "message": "Rede de Teste Kovan" }, - "knowledgeDataBase": { - "message": "Visite o nosso Centro de Conhecimento" - }, - "lessThanMax": { - "message": "tem de ser menor ou igual a $1.", - "description": "ajuda para introduzir hexadecimal como decimal" - }, "likeToAddTokens": { "message": "Gostaria de adicionar estes tokens?" }, - "limit": { - "message": "Limite" - }, "loading": { "message": "A carregar..." }, "loadingTokens": { "message": "A carregar Tokens..." }, - "localhost": { - "message": "Localhost 8545" - }, - "login": { + "unlock": { "message": "Entrar" }, - "logout": { + "lock": { "message": "Sair" }, - "loose": { - "message": "Vago" - }, - "loweCaseWords": { - "message": "palavras da seed apenas têm caracteres minúsculos" - }, "mainnet": { "message": "Rede Principal de Ethereum" }, @@ -493,9 +242,6 @@ "metamaskDescription": { "message": "O MetaMask é um lugar seguro para guardar a sua identidade em em Ethereum." }, - "min": { - "message": "Mínimo" - }, "myAccounts": { "message": "As minhas contas" }, @@ -507,11 +253,7 @@ }, "needImportFile": { "message": "Deve selecionar um ficheiro para importar.", - "description": "O utilizador deve adicionar um ficheiro para continuar" - }, - "needImportPassword": { - "message": "Deve introduzir uma palavra-passe para o ficheiro selecionado.", - "description": "Palavra-passe e ficheiro necessários para importar uma conta" + "description": "User is important an account and needs to add a file to continue" }, "negativeETH": { "message": "Não é possível enviar valores negativos de ETH." @@ -524,7 +266,7 @@ }, "newAccountNumberName": { "message": "Conta $1", - "description": "Nome padrão da próxima conta a ser criado em Criar Conta" + "description": "Default name of next account to be created on create account screen" }, "newContract": { "message": "Contrato Novo" @@ -532,70 +274,28 @@ "newPassword": { "message": "Nova Palavra-passe (min 8 caracteres)" }, - "newRecipient": { - "message": "Recipiente Novo" - }, - "newRPC": { - "message": "Novo RPC URL" - }, "next": { "message": "Próximo" }, "noAddressForName": { "message": "Nenhum endereço foi estabelecido para este nome." }, - "noDeposits": { - "message": "Sem depósitos recebidos" - }, - "noTransactionHistory": { - "message": "Sem histórico de transações." - }, "noTransactions": { "message": "Sem Transações" }, - "notStarted": { - "message": "Não Iniciado" - }, - "oldUI": { - "message": "UI Antigo" - }, - "oldUIMessage": { - "message": "Voltou para o UI antigo. Pode reverter para o Novo UI através da opção no menu do topo direito." - }, - "or": { - "message": "ou", - "description": "opção entre criar ou importar uma nova conta" - }, - "passwordCorrect": { - "message": "Por favor confirme que a sua palavra-passe esteja correta." - }, - "passwordMismatch": { - "message": "as palavras-passe não coincidem", - "description": "no processo de criação da palavra-passe, as duas palavras-passe não coincidiram" - }, - "passwordShort": { - "message": "palavra-passe deve ser mais comprida", - "description": "no processo de criação da palavra-passe, a palavra-apasse não é longa o suficiente para ser segura" - }, "pastePrivateKey": { "message": "Cole aqui a sua chave privada:", - "description": "Para importar uma conta através da chave privada" - }, - "pasteSeed": { - "message": "Cole aqui a sua frase seed!" + "description": "For importing an account from a private key" }, "personalAddressDetected": { "message": "Endereço pessoal detectado. Introduza o endereço do contrato do token." }, - "pleaseReviewTransaction": { - "message": "Por favor reveja a sua transação." - }, "privacyMsg": { "message": "Política de Privacidade" }, "privateKey": { "message": "Chave Privada", - "description": "Selecione este tipo de ficheiro para importar uma conta" + "description": "select this type of file to use to import an account" }, "privateKeyWarning": { "message": "Atenção: Nunca revele esta chave. Qualquer pessoa com acesso à sua chave privada pode roubar os bens que esta contém." @@ -603,27 +303,12 @@ "privateNetwork": { "message": "Rede Privada" }, - "qrCode": { - "message": "Mostrar Código QR" - }, "readdToken": { "message": "Pode adicionar este token de novo clicando na opção “Adicionar token†no menu de opções da sua conta." }, - "readMore": { - "message": "Ler mais aqui." - }, - "readMore2": { - "message": "Ler mais." - }, - "receive": { - "message": "Receber" - }, "recipientAddress": { "message": "Endereço do Destinatário" }, - "refundAddress": { - "message": "O seu endereço de reembolso" - }, "rejected": { "message": "Rejeitado" }, @@ -636,38 +321,21 @@ "required": { "message": "Necessário" }, - "retryWithMoreGas": { - "message": "Tentar novamente com um preço mais elevado aqui" - }, "revealSeedWords": { "message": "Revelar Palavras Seed" }, "revealSeedWordsWarning": { "message": "Não revele as palavras seed num espaço público! Estas palavras podem ser usadas para roubar todas as suas contas." }, - "revert": { - "message": "Reverter" - }, "rinkeby": { "message": "Rede de Teste Rinkeby" }, "ropsten": { "message": "Rede de Teste Ropsten" }, - "sampleAccountName": { - "message": "Ex. A minha conta nova", - "description": "Ajuda o utilizador a perceber o conceito de adicionar um nome legível à sua conta" - }, "save": { "message": "Guardar" }, - "saveAsFile": { - "message": "Guardar como Ficheiro", - "description": "Processo de exportação de conta" - }, - "saveSeedAsFile": { - "message": "Guardar Palavras Seed como um Ficheiro" - }, "search": { "message": "Procurar" }, @@ -677,15 +345,9 @@ "seedPhraseReq": { "message": "seed phrases are 12 words long" }, - "select": { - "message": "Selecionar" - }, "selectCurrency": { "message": "Selecionar Moeda" }, - "selectService": { - "message": "Selecionar Serviço" - }, "selectType": { "message": "Selecionar Tipo" }, @@ -698,26 +360,17 @@ "sendTokens": { "message": "Enviar Tokens" }, - "sendTokensAnywhere": { - "message": "Enviar Tokens para qualquer pessoa com uma conta Ethereum" - }, "settings": { "message": "Definições" }, - "shapeshiftBuy": { - "message": "Comprar com Shapeshift" - }, "showPrivateKeys": { "message": "Mostrar Chaves Privadas" }, - "showQRCode": { - "message": "Mostrar Código QR" - }, "sign": { "message": "Assinar" }, - "signMessage": { - "message": "Assinar Mensagem" + "signatureRequest": { + "message": "Pedido de Assinatura" }, "signNotice": { "message": "Assinar esta mensagem pode ter \nefeitos laterais perigosos. Apenas assine mensagens de sites que \ntotalmente confia com a sua conta total.\n Este método perigoso será removido numa versão posterior." @@ -725,32 +378,17 @@ "sigRequest": { "message": "Pedido de Assinatura" }, - "sigRequested": { - "message": "Assinatura Pedida" - }, - "spaceBetween": { - "message": "só pode haver um espaço entre palavras" - }, - "status": { - "message": "Estado" - }, "stateLogs": { "message": "Registos de Estado" }, "stateLogsDescription": { "message": "Registo de estado podem conter o seu endereço e transações enviadas da sua conta pública." }, - "submit": { - "message": "Submeter" - }, "supportCenter": { "message": "Visitar o nosso Centro de Suporte" }, "symbolBetweenZeroTwelve": { - "message": "Símbolo deve conter entre 0 e 12 characters." - }, - "takesTooLong": { - "message": "A demorar muito?" + "message": "O símbolo deve ter 11 caracteres ou menos." }, "terms": { "message": "Termos de Uso" @@ -761,105 +399,40 @@ "to": { "message": "Para" }, - "toETHviaShapeShift": { - "message": "$1 para ETH via ShapeShift", - "description": "o sistema irá preencher o tipo de depósito no início da mensagem" - }, - "tokenAddress": { - "message": "Endereço do Token" - }, "tokenAlreadyAdded": { "message": "Token já foi adicionado." }, - "tokenBalance": { - "message": "O seu balanço é:" - }, - "tokenSelection": { - "message": "Procure por tokens ou seleccione da nossa lista de tokens populares." - }, "tokenSymbol": { "message": "Símbolo do Token" }, - "tokenWarning1": { - "message": "Registe os tokens que comprou com a sua conta MetaMask. Se comprou tokens utilizando uma conta diferente, esses tokens não irão aparecer aqui." - }, - "total": { - "message": "Total" - }, - "transactions": { - "message": "transações" - }, - "transactionMemo": { - "message": "Notas da transação (opcional)" - }, - "transactionNumber": { - "message": "Número da Transação" - }, - "transfers": { - "message": "Transferências" - }, "troubleTokenBalances": { "message": "Tivemos um problema a carregar o balanço dos seus tokens. Pode vê-los em ", - "description": "Seguido de um link (aqui) para ver o balanço dos seus tokens" - }, - "twelveWords": { - "message": "Estas 12 palavras são a única forma de recuperar as suas contas na MetaMask.\nGuarde-as num local seguro e secreto." + "description": "Followed by a link (here) to view token balances" }, "typePassword": { "message": "Digite a sua Palavra-passe" }, - "uiWelcome": { - "message": "Bem-vindo ao seu Novo UI (Beta)" - }, - "uiWelcomeMessage": { - "message": "Está agora a usar o novo UI da MetaMask. Dê uma vista de olhos, experimenta as novas funcionalidades como enviar tokens e diga-nos se tiver algum problema." - }, - "unavailable": { - "message": "Indisponível" - }, "unknown": { "message": "Desconhecido" }, "unknownNetwork": { "message": "Rede Privada Desconhecida" }, - "unknownNetworkId": { - "message": "Identificador da rede desconhecido" - }, - "uriErrorMsg": { + "urlErrorMsg": { "message": "Links requerem o prefixo HTTP/HTTPS apropriado." }, - "usaOnly": { - "message": "Só nos EUA", - "description": "Usar esta taxa de câmbio está limitado a pessoas residentes nos EUA" - }, "usedByClients": { "message": "Utilizado por vários tipos de clientes" }, - "useOldUI": { - "message": "Utilizar UI antigo" - }, - "validFileImport": { - "message": "Deve selecionar um ficheiro válido para importar." - }, - "vaultCreated": { - "message": "Cofre Criado" - }, "viewAccount": { "message": "Ver Conta" }, "visitWebSite": { "message": "Visite o nosso site" }, - "warning": { - "message": "Aviso" - }, "welcome": { "message": "Bem-vindo ao MetaMask" }, - "whatsThis": { - "message": "O que é isto?" - }, "yourSigRequested": { "message": "A sua assinatura está a ser pedida" }, diff --git a/app/_locales/pt_BR/messages.json b/app/_locales/pt_BR/messages.json new file mode 100644 index 000000000000..2eda26024885 --- /dev/null +++ b/app/_locales/pt_BR/messages.json @@ -0,0 +1,1292 @@ +{ + "chartOnlyAvailableEth": { + "message": "Tabela disponível apenas em redes de Ethereum." + }, + "contractInteraction": { + "message": "Interação do Contrato" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "reject": { + "message": "Rejeitar" + }, + "about": { + "message": "Sobre" + }, + "aboutSettingsDescription": { + "message": "Versão, centro de apoio e informações de contato" + }, + "acceleratingATransaction": { + "message": "* Acelerar uma transação usando um preço de gás mais alto aumenta suas chances de a rede processá-la de forma mais rápida, mas isso nem sempre é garantido." + }, + "accessingYourCamera": { + "message": "Acessando a sua câmera..." + }, + "account": { + "message": "Conta" + }, + "accountDetails": { + "message": "Detalhes da Conta" + }, + "accountName": { + "message": "Nome da Conta" + }, + "accountOptions": { + "message": "Opções da Conta" + }, + "accountSelectionRequired": { + "message": "Você precisa selecionar uma conta!" + }, + "activityLog": { + "message": "registro de atividade" + }, + "addNetwork": { + "message": "Adicionar Rede" + }, + "addRecipient": { + "message": "Adicionar Destinatário" + }, + "advanced": { + "message": "Avançado" + }, + "advancedSettingsDescription": { + "message": "Acesse recursos do desenvolvedor, baixe registros de estado, redefina a conta, configure testnets e personalize RPC" + }, + "advancedOptions": { + "message": "Opções avançadas" + }, + "addToAddressBook": { + "message": "Adicionar à lista de endereços" + }, + "addToAddressBookModalPlaceholder": { + "message": "Exemplo: John D." + }, + "addAlias": { + "message": "Adicionar pseudônimo" + }, + "addToken": { + "message": "Adicionar token" + }, + "addTokens": { + "message": "Adicionar Tokens" + }, + "addSuggestedTokens": { + "message": "Adicionar Tokens Sugeridos" + }, + "addAcquiredTokens": { + "message": "Adicione os tokens que você adquiriu usando o MetaMask" + }, + "amount": { + "message": "Valor" + }, + "appDescription": { + "message": "Uma Carteira Ethereum no seu Navegador", + "description": "The description of the application" + }, + "approve": { + "message": "Aprovar" + }, + "approved": { + "message": "Aprovado" + }, + "asset": { + "message": "Ativo" + }, + "attemptingConnect": { + "message": "Tentando se conectar à blockchain." + }, + "attemptToCancel": { + "message": "Tentar Cancelar?" + }, + "attemptToCancelDescription": { + "message": "Enviar esta tentativa não garante que sua transação original será cancelada. Se a tentativa de cancelamento for bem-sucedida, será feita uma cobrança pela taxa de transação acima." + }, + "attributions": { + "message": "Atribuições" + }, + "autoLockTimeLimit": { + "message": "Temporizador de Logout Automático (minutos)" + }, + "autoLockTimeLimitDescription": { + "message": "Defina o tempo de inatividade em minutos antes de o MetaMask fazer logout automaticamente" + }, + "average": { + "message": "Média" + }, + "back": { + "message": "Voltar" + }, + "backToAll": { + "message": "Voltar para Todos" + }, + "backupApprovalNotice": { + "message": "Faça backup de seu Código Secreto de Recuperação para manter sua carteira e seus fundos em segurança." + }, + "backupApprovalInfo": { + "message": "Esse código secreto é necessário para recuperar sua carteira, caso você perca seu dispositivo, esqueça sua senha, precise reinstalar o MetaMask ou queira acessar sua carteira em outro dispositivo." + }, + "backupNow": { + "message": "Fazer backup agora" + }, + "balance": { + "message": "Saldo" + }, + "balanceOutdated": { + "message": "O saldo pode estar desatualizado" + }, + "basic": { + "message": "Básicas" + }, + "blockExplorerView": { + "message": "Ver conta em $1", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "Usar o Identicon de Blocos" + }, + "browserNotSupported": { + "message": "Seu navegador não é compatível..." + }, + "builtInCalifornia": { + "message": "O MetaMask foi projetado e desenvolvido na Califórnia." + }, + "buyWithWyre": { + "message": "Comprar ETH com Wyre" + }, + "buyWithWyreDescription": { + "message": "O Wyre permite que você utilize um cartão de crédito para depositar ETH direto na sua conta do MetaMask." + }, + "buyCoinSwitch": { + "message": "Compre no CoinSwitch" + }, + "buyCoinSwitchExplainer": { + "message": "O CoinSwitch é o destino único para trocar mais de 300 criptomoedas com a melhor taxa." + }, + "off": { + "message": "Desativado" + }, + "ok": { + "message": "OK" + }, + "on": { + "message": "Ativado" + }, + "optionalBlockExplorerUrl": { + "message": "URL exploradora de blocos (opcional)" + }, + "cancel": { + "message": "Cancelar" + }, + "cancelAttempt": { + "message": "Tentativa de cancelamento" + }, + "cancellationGasFee": { + "message": "Tarifa de Gas de cancelamento" + }, + "cancelled": { + "message": "Cancelado" + }, + "chainId": { + "message": "ID da Cadeia" + }, + "clickToRevealSeed": { + "message": "Clique aqui para revelar as palavras secretas" + }, + "close": { + "message": "Fechar" + }, + "chromeRequiredForHardwareWallets": { + "message": "Você precisa usar o MetaMask no Google Chrome para se conectar à sua Carteira de Hardware." + }, + "confirm": { + "message": "Confirmar" + }, + "confirmed": { + "message": "Confirmado" + }, + "confirmPassword": { + "message": "Confirmar Senha" + }, + "confirmSecretBackupPhrase": { + "message": "Confirme sua Frase de Backup Secreta" + }, + "congratulations": { + "message": "Parabéns" + }, + "connectHardwareWallet": { + "message": "Conectar hardware de carteira" + }, + "connect": { + "message": "Conectar-se" + }, + "connectingTo": { + "message": "Conectando a $1" + }, + "connectingToKovan": { + "message": "Conectando-se à Rede de Testes Kovan" + }, + "connectingToMainnet": { + "message": "Conectando à rede principal Etherum" + }, + "connectingToRopsten": { + "message": "Conectando à Rede de Testes Ropsten" + }, + "connectingToRinkeby": { + "message": "Conectando-se à rede de teste Rinkeby" + }, + "connectingToLocalhost": { + "message": "Conectando ao Localhost 8545" + }, + "connectingToGoerli": { + "message": "Conectando à Rede de Teste da Goerli" + }, + "continueToWyre": { + "message": "Continuar para Wyre" + }, + "continueToCoinSwitch": { + "message": "Continuar para CoinSwitch" + }, + "contractDeployment": { + "message": "Implantação de Contrato" + }, + "copiedExclamation": { + "message": "Copiado!" + }, + "copyAddress": { + "message": "Copiar endereço para a área de transferência" + }, + "copyTransactionId": { + "message": "Copiar ID de transação" + }, + "copiedTransactionId": { + "message": "ID da Transação Copiado" + }, + "copyToClipboard": { + "message": "Copiar para a área de transferência" + }, + "copyPrivateKey": { + "message": "Esta é sua chave particular (clique para copiar)" + }, + "create": { + "message": "Criar" + }, + "createAccount": { + "message": "Criar Conta" + }, + "createAWallet": { + "message": "Crie uma Carteira" + }, + "createPassword": { + "message": "Criar Senha" + }, + "currencyConversion": { + "message": "Conversão de moeda" + }, + "currentLanguage": { + "message": "Idioma Atual" + }, + "customGas": { + "message": "Customizar Gas" + }, + "customGasSubTitle": { + "message": "Aumentar a tarifa pode diminuir o tempo de processamento, mas não é garantido." + }, + "customToken": { + "message": "Token Personalizado" + }, + "customRPC": { + "message": "RPC Personalizada" + }, + "decimalsMustZerotoTen": { + "message": "Os decimais devem ter pelo menos 0 e no máximo 36." + }, + "decimal": { + "message": "Decimais de precisão" + }, + "defaultNetwork": { + "message": "A rede-padrão para transações de Ether é a Rede Principal." + }, + "delete": { + "message": "Excluir" + }, + "deleteAccount": { + "message": "Excluir Conta" + }, + "deposit": { + "message": "Depósito" + }, + "depositEther": { + "message": "Depositar Ether" + }, + "details": { + "message": "Detalhes" + }, + "directDepositEther": { + "message": "Depositar Ether Diretamente" + }, + "directDepositEtherExplainer": { + "message": "Se você já tem Ether, a forma mais rápida de colocá-lo em sua nova carteira é o depósito direto." + }, + "done": { + "message": "Concluído" + }, + "downloadGoogleChrome": { + "message": "Baixar Google Chrome" + }, + "downloadSecretBackup": { + "message": "Baixe esta frase secreta de backup e mantenha-a armazenada com segurança em um HD externo criptografado ou outro meio de armazenamento." + }, + "downloadStateLogs": { + "message": "Baixar Registros de Estado" + }, + "dontHaveAHardwareWallet": { + "message": "Não tem uma carteira física?" + }, + "dropped": { + "message": "Reduzido" + }, + "edit": { + "message": "Editar" + }, + "editContact": { + "message": "Editar Contato" + }, + "endOfFlowMessage1": { + "message": "Você passou no teste — mantenha sua frase semente segura, a responsabilidade é sua!" + }, + "endOfFlowMessage2": { + "message": "Dicas para armazená-lo com segurança" + }, + "endOfFlowMessage3": { + "message": "Salvar um backup em múltiplos lugares." + }, + "endOfFlowMessage4": { + "message": "Nunca compartilhe a frase com ninguém." + }, + "endOfFlowMessage5": { + "message": "Cuidado com o phishing! O MetaMask nunca solicitará espontaneamente sua frase semente." + }, + "endOfFlowMessage6": { + "message": "Se precisar fazer backup de sua frase-semente de novo, acesse Configurações -> Segurança." + }, + "endOfFlowMessage7": { + "message": "Caso você tenha alguma dúvida ou veja algo suspeito, envie um e-mail para support@metamask.io." + }, + "endOfFlowMessage8": { + "message": "O MetaMask não pode recuperar sua frase semente. Saiba mais." + }, + "endOfFlowMessage9": { + "message": "Saiba mais." + }, + "endOfFlowMessage10": { + "message": "Pronto" + }, + "ensRegistrationError": { + "message": "Erro ao registrar nome de ENS" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "Nome de ENS não encontrado na rede atual. Experimente alternar para a Rede Principal de Ethereum." + }, + "enterAnAlias": { + "message": "Digite um pseudônimo" + }, + "enterPassword": { + "message": "Digite a senha" + }, + "enterPasswordContinue": { + "message": "Insira a senha para continuar" + }, + "ethereumPublicAddress": { + "message": "Endereço Público do Ethereum" + }, + "etherscanView": { + "message": "Ver conta no Etherscan" + }, + "estimatedProcessingTimes": { + "message": "Tempos de Processamento Estimados" + }, + "expandView": { + "message": "Expandir Visualização" + }, + "exportPrivateKey": { + "message": "Exportar Chave Privada" + }, + "failed": { + "message": "Falha" + }, + "fast": { + "message": "Rápido" + }, + "faster": { + "message": "Mais rápido" + }, + "fiat": { + "message": "Ordem", + "description": "Exchange type" + }, + "fileImportFail": { + "message": "A importação de arquivo não está funcionando? Clique aqui!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "Esquecer este dispositivo" + }, + "from": { + "message": "De" + }, + "functionType": { + "message": "Tipo de Função" + }, + "gasLimit": { + "message": "Limite de Gás" + }, + "gasLimitInfoModalContent": { + "message": "O limite de gás é a quantidade máxima de unidades de gás que você está disposto a gastar." + }, + "gasLimitTooLow": { + "message": "O limite de Gas deve ser de pelo menos 21000" + }, + "gasUsed": { + "message": "Gas usado" + }, + "gasPrice": { + "message": "Preço do Gás (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "Preço de Gas extremamente baixo" + }, + "gasPriceInfoModalContent": { + "message": "O preço do gás especifica a quantidade de Ether que você está disposto a pagar por cada unidade de gás." + }, + "gasPriceNoDenom": { + "message": "Preço do Gás" + }, + "general": { + "message": "Geral" + }, + "generalSettingsDescription": { + "message": "Conversão de moeda, moeda primária, idioma, identicon de blocos" + }, + "getEther": { + "message": "Obter Ether" + }, + "getEtherFromFaucet": { + "message": "Obtenha Ether em uma torneira para $1", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "Obtenha Ajuda." + }, + "getStarted": { + "message": "Primeiros passos" + }, + "happyToSeeYou": { + "message": "Estamos felizes em vê-lo." + }, + "hardware": { + "message": "física" + }, + "hardwareWalletConnected": { + "message": "Carteira física conectada" + }, + "hardwareWallets": { + "message": "Conecte uma carteira física" + }, + "hardwareWalletsMsg": { + "message": "Selecione um hardware que gostaria de utilizar com o MetaMask" + }, + "havingTroubleConnecting": { + "message": "Está tendo dificuldade para se conectar?" + }, + "here": { + "message": "aqui", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hexData": { + "message": "Dados Hexadecimais" + }, + "hide": { + "message": "Ocultar" + }, + "hideTokenPrompt": { + "message": "Esconder token?" + }, + "history": { + "message": "Histórico" + }, + "import": { + "message": "Importar", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "Importar Conta" + }, + "importAccountMsg": { + "message": "As contas importadas não serão associadas à sua frase-semente da conta MetaMask criada originalmente. Saiba mais sobre contas importadas" + }, + "importAccountSeedPhrase": { + "message": "Importar uma Conta com Frase-semente" + }, + "importWallet": { + "message": "Importar Carteira" + }, + "importYourExisting": { + "message": "Importe sua carteira existente usando uma frase-semente de 12 palavras" + }, + "imported": { + "message": "Importado", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "Importe usando a seed phrase da conta" + }, + "infoHelp": { + "message": "Informações e ajuda" + }, + "initialTransactionConfirmed": { + "message": "Sua transação inicial foi confirmada pela rede. Clique em OK para voltar." + }, + "insufficientBalance": { + "message": "Saldo insuficiente." + }, + "insufficientFunds": { + "message": "Fundos insuficientes." + }, + "insufficientTokens": { + "message": "Tokens insuficientes." + }, + "invalidAddress": { + "message": "Endereço inválido" + }, + "invalidAddressRecipient": { + "message": "O endereço do destinatário é inválido" + }, + "knownAddressRecipient": { + "message": "Endereço do contrato conhecido." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "Se não for rede ETH, defina para minúsculas" + }, + "invalidInput": { + "message": "Entrada inválida." + }, + "invalidRPC": { + "message": "URL de RPC inválida" + }, + "invalidBlockExplorerURL": { + "message": "URL de Block Explorer inválida" + }, + "invalidSeedPhrase": { + "message": "Frase semente inválida" + }, + "jsonFile": { + "message": "Arquivo JSON", + "description": "format for importing an account" + }, + "kovan": { + "message": "Rede de Testes Kovan" + }, + "max": { + "message": "Máx." + }, + "learnMore": { + "message": "Saber mais" + }, + "ledgerAccountRestriction": { + "message": "Você precisa usar sua última conta antes de adicionar uma nova." + }, + "letsGoSetUp": { + "message": "Sim, vamos configurar!" + }, + "likeToAddTokens": { + "message": "Deseja adicionar esses tokens?" + }, + "liveGasPricePredictions": { + "message": "Previsões de Preços de Gás Ao Vivo" + }, + "loading": { + "message": "Carregando..." + }, + "loadingTokens": { + "message": "Carregando Tokens..." + }, + "loadMore": { + "message": "Carregar Mais" + }, + "lock": { + "message": "Sair" + }, + "mainnet": { + "message": "Rede Ethereum Principal" + }, + "memorizePhrase": { + "message": "Memorize esta frase." + }, + "memo": { + "message": "memorando" + }, + "message": { + "message": "Mensagem" + }, + "metamaskDescription": { + "message": "Conectando você ao Ethereum e à Web Descentralizada." + }, + "metamaskVersion": { + "message": "Versão do MetaMask" + }, + "mobileSyncText": { + "message": "Insira sua senha para confirmar que é você!" + }, + "myAccounts": { + "message": "Minhas Contas" + }, + "myWalletAccounts": { + "message": "Contas da Minha Carteira" + }, + "myWalletAccountsDescription": { + "message": "Todas as suas contas criadas no MetaMask serão automaticamente adicionadas a esta seção." + }, + "mustSelectOne": { + "message": "É preciso selecionar pelo menos 1 token." + }, + "needEtherInWallet": { + "message": "Para interagir com aplicações descentralizadas usando o MetaMask, você precisará de Ether na sua carteira." + }, + "needImportFile": { + "message": "Você deve selecionar um arquivo para importar.", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "Não é possível enviar quantias negativas de ETH." + }, + "networkName": { + "message": "Nome da Rede" + }, + "networks": { + "message": "Redes" + }, + "networkSettingsDescription": { + "message": "Adicionar e editar redes de RPC personalizadas" + }, + "nevermind": { + "message": "Nem pensar" + }, + "newAccount": { + "message": "Nova conta" + }, + "newAccountDetectedDialogMessage": { + "message": "Novo endereço detectado! Clique aqui para adicioná-lo à sua lista de endereços." + }, + "newAccountNumberName": { + "message": "Conta $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "Novo Contato" + }, + "newContract": { + "message": "Novo Contrato" + }, + "newPassword": { + "message": "Nova Senha (mín. 8 car.)" + }, + "newNetwork": { + "message": "Nova Rede" + }, + "newToMetaMask": { + "message": "Novo no MetaMask?" + }, + "noAlreadyHaveSeed": { + "message": "Não, eu já tenho uma frase semente" + }, + "protectYourKeys": { + "message": "Proteja as suas chaves!" + }, + "protectYourKeysMessage1": { + "message": "Tome cuidado com sua frase semente — houve relatos de sites que tentam imitar o MetaMask. O MetaMask nunca pedirá sua frase semente!" + }, + "protectYourKeysMessage2": { + "message": "Mantenha a sua frase segura. Se você vir algo esquisito ou está inseguro quanto a um site, envie um e-mail para support@metamask.io" + }, + "rpcUrl": { + "message": "Nova URL RPC" + }, + "optionalChainId": { + "message": "ChainID (opcional)" + }, + "optionalSymbol": { + "message": "Símbolo (opcional)" + }, + "newTotal": { + "message": "Total Novo" + }, + "newTransactionFee": { + "message": "Nova Taxa de Transação" + }, + "next": { + "message": "Próxima" + }, + "noAddressForName": { + "message": "Nenhum endereço foi definido para este nome." + }, + "noConversionRateAvailable": { + "message": "Nenhuma Taxa de Conversão Disponível" + }, + "noTransactions": { + "message": "Você não tem transações" + }, + "notEnoughGas": { + "message": "Sem Gás Suficiente" + }, + "noWebcamFoundTitle": { + "message": "Webcam não encontrada" + }, + "noWebcamFound": { + "message": "A webcam de seu computador não foi encontrada. Tente novamente." + }, + "ofTextNofM": { + "message": "de" + }, + "orderOneHere": { + "message": "Peça uma Trezor ou Ledger e guarde seus fundos off-line" + }, + "origin": { + "message": "Origem" + }, + "parameters": { + "message": "Parâmetros" + }, + "participateInMetaMetrics": { + "message": "Participar do MetaMetrics" + }, + "participateInMetaMetricsDescription": { + "message": "Participe do MetaMetrics para nos ajudar a tornar o MetaMask melhor" + }, + "password": { + "message": "Senha" + }, + "passwordsDontMatch": { + "message": "As Senhas Não Correspondem" + }, + "passwordNotLongEnough": { + "message": "A senha não é longa o suficiente" + }, + "pastePrivateKey": { + "message": "Cole a string de sua chave particular aqui:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "pendente" + }, + "personalAddressDetected": { + "message": "Endereço pessoal detectado. Insira o endereço de contrato do token." + }, + "prev": { + "message": "Anterior" + }, + "primaryCurrencySetting": { + "message": "Moeda Principal" + }, + "primaryCurrencySettingDescription": { + "message": "Selecione \"Nativa\" para priorizar a exibição de valores na moeda nativa da cadeia (por exemplo, ETH). Selecione \"Fiat\" para priorizar a exibição de valores na moeda fiduciária selecionada." + }, + "privacyMsg": { + "message": "Política de Privacidade" + }, + "privateKey": { + "message": "Chave Privada", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "Aviso: nunca divulgue esta chave. Qualquer pessoa com suas chaves privadas pode roubar quaisquer ativos mantidos em sua conta." + }, + "privateNetwork": { + "message": "Rede Particular" + }, + "queue": { + "message": "Fila" + }, + "readdToken": { + "message": "Você pode adicionar esse token novamente no futuro acessando \"Adicionar token\" no menu de opções da sua conta." + }, + "recents": { + "message": "Recentes" + }, + "recipientAddress": { + "message": "Endereço do Destinatário" + }, + "recipientAddressPlaceholder": { + "message": "Buscar, endereço público (0x) ou ENS" + }, + "rejectAll": { + "message": "Recusar tudo" + }, + "rejectTxsN": { + "message": "Rejeitar transações de $1" + }, + "rejectTxsDescription": { + "message": "Você está prestes a rejeitar várias transações de $1." + }, + "rejected": { + "message": "Rejeitado" + }, + "reset": { + "message": "Redefinir" + }, + "resetAccount": { + "message": "Redefinir Conta" + }, + "resetAccountDescription": { + "message": "Restabelecer a sua conta limpará todo o seu histórico de transações." + }, + "deleteNetwork": { + "message": "Excluir Rede?" + }, + "deleteNetworkDescription": { + "message": "Tem certeza de que deseja excluir esta rede?" + }, + "remindMeLater": { + "message": "Lembre-me mais tarde" + }, + "restoreFromSeed": { + "message": "Restaurar conta?" + }, + "restoreAccountWithSeed": { + "message": "Restaurar sua conta com a frase semente" + }, + "requestsAwaitingAcknowledgement": { + "message": "solicitações aguardando confirmação" + }, + "required": { + "message": "Obrigatório" + }, + "restore": { + "message": "Restaurar" + }, + "revealSeedWords": { + "message": "Revelar Palavras-semente" + }, + "revealSeedWordsTitle": { + "message": "Frase Semente" + }, + "revealSeedWordsDescription": { + "message": "Se você mudar de navegador ou computador, precisará dessa frase semente para acessar suas contas. Salve-as em algum lugar seguro e secreto." + }, + "revealSeedWordsWarningTitle": { + "message": "NÃO compartilhe esta frase com ninguém!" + }, + "revealSeedWordsWarning": { + "message": "Essas palavras podem ser usadas para roubar todas as suas contas." + }, + "remove": { + "message": "Remover" + }, + "removeAccount": { + "message": "Remover conta" + }, + "removeAccountDescription": { + "message": "Esta conta será removida de sua carteira. Verifique se você tem a frase-semente original ou a chave particular desta conta importada antes de continuar. Você pode importar ou criar contas novamente no menu suspenso da conta." + }, + "readyToConnect": { + "message": "Pronto para Conectar?" + }, + "rinkeby": { + "message": "Rede de Testes Rinkeby" + }, + "ropsten": { + "message": "Rede de Testes Ropsten" + }, + "goerli": { + "message": "Rede de teste Goerli" + }, + "save": { + "message": "Salvar" + }, + "slow": { + "message": "Lento" + }, + "slower": { + "message": "Mais lento" + }, + "saveAsCsvFile": { + "message": "Salvar como Arquivo CSV" + }, + "scanInstructions": { + "message": "Posicione o código QR em frente à sua câmera" + }, + "scanQrCode": { + "message": "Capturar Código QR" + }, + "search": { + "message": "Pesquisar" + }, + "searchResults": { + "message": "Resultados da Pesquisa" + }, + "secretBackupPhrase": { + "message": "Frase Secreta de Backup" + }, + "secretBackupPhraseDescription": { + "message": "Sua frase de backup secreta facilita o backup e a restauração de sua conta." + }, + "secretBackupPhraseWarning": { + "message": "ATENÇÃO: Nunca revele sua frase de backup a ninguém. Qualquer pessoa com essa frase pode obter seu Ether para sempre." + }, + "secretPhrase": { + "message": "Digite sua frase secreta de doze palavras aqui para restaurar seu cofre." + }, + "securityAndPrivacy": { + "message": "Segurança & Privacidade" + }, + "securitySettingsDescription": { + "message": "Configurações de privacidade e frase-semente da carteira" + }, + "seedPhrasePlaceholder": { + "message": "Separe cada palavra com um único espaço" + }, + "seedPhraseReq": { + "message": "As frases-semente têm 12 palavras" + }, + "selectCurrency": { + "message": "Selecione a Moeda" + }, + "selectEachPhrase": { + "message": "Selecione cada frase para se certificar de que esteja correta." + }, + "selectLocale": { + "message": "Selecionar Local" + }, + "selectType": { + "message": "Selecione o Tipo" + }, + "send": { + "message": "Enviar" + }, + "sendAmount": { + "message": "Enviar Quantia" + }, + "sendETH": { + "message": "Enviar ETH" + }, + "sendTokens": { + "message": "Enviar Tokens" + }, + "sentEther": { + "message": "ether enviado" + }, + "sentTokens": { + "message": "tokens enviados" + }, + "separateEachWord": { + "message": "Separe cada palavra com um único espaço" + }, + "searchTokens": { + "message": "Pesquisar Tokens" + }, + "selectAnAccount": { + "message": "Selecione uma Conta" + }, + "selectAnAccountHelp": { + "message": "Selecione a conta para ver no MetaMask" + }, + "selectAHigherGasFee": { + "message": "Selecione uma taxa de gás mais alta para acelerar o processamento de sua transação.*" + }, + "selectHdPath": { + "message": "Selecione o caminho no HD" + }, + "selectPathHelp": { + "message": "Se não conseguir ver as contas da Ledger existentes abaixo, experimente alternar os caminhos para \"Legacy (MEW / MyCrypto)\"" + }, + "settings": { + "message": "Configurações" + }, + "showAdvancedGasInline": { + "message": "Controles de gás avançados" + }, + "showAdvancedGasInlineDescription": { + "message": "Selecione para exibir o preço do gás e limitar os controles diretamente nas telas de envio e de confirmação." + }, + "showFiatConversionInTestnets": { + "message": "Mostrar conversão em testnets" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Selecione isso para mostrar a conversão de ordem nas Testnets" + }, + "showPrivateKeys": { + "message": "Mostrar Chaves Privadas" + }, + "showHexData": { + "message": "Exibir Dados Hexadecimais" + }, + "showHexDataDescription": { + "message": "Selecione isto para mostrar o campo de dados hexadecimais na tela de envio" + }, + "sign": { + "message": "Assinar" + }, + "signatureRequest": { + "message": "Solicitação de assinatura" + }, + "signed": { + "message": "Assinado" + }, + "signNotice": { + "message": "Assinar esta mensagem pode ter\nefeitos colaterais perigosos. Somente assine mensagens de sites que você confie totalmente com a sua conta inteira.\nEsse método perigoso será removido em uma futura versão." + }, + "sigRequest": { + "message": "Solicitação de Assinatura" + }, + "somethingWentWrong": { + "message": "Opa! Algo deu errado." + }, + "speedUp": { + "message": "Acelerar" + }, + "speedUpCancellation": { + "message": "Acelere este cancelamento" + }, + "speedUpTransaction": { + "message": "Acelerar esta transação" + }, + "switchNetworks": { + "message": "Alternar Redes" + }, + "stateLogs": { + "message": "Registros de Estado" + }, + "stateLogsDescription": { + "message": "Os registros de estado contêm seus endereços de conta pública e transações enviadas." + }, + "stateLogError": { + "message": "Erro ao recuperar registros de estado." + }, + "step1HardwareWallet": { + "message": "1. Conectar Carteira Física" + }, + "step1HardwareWalletMsg": { + "message": "Conecte sua carteira de hardware diretamente ao seu computador." + }, + "step2HardwareWallet": { + "message": "2. Selecione uma Conta" + }, + "step2HardwareWalletMsg": { + "message": "Selecione a conta que você deseja ver. Você só pode escolher uma por vez." + }, + "step3HardwareWallet": { + "message": "3. Comece a usar dApps e muito mais!" + }, + "step3HardwareWalletMsg": { + "message": "Use sua conta física como faria com qualquer conta de Ethereum. Faça login em dApps, envie Eth, compre e guarde tokens ERC20 e Tokens Não Fungíveis, como CryptoKitties." + }, + "storePhrase": { + "message": "Guarde esta frase em um gerenciador de senhas como o 1Password." + }, + "submitted": { + "message": "Enviado" + }, + "supportCenter": { + "message": "Visite nosso Centro de Apoio" + }, + "symbol": { + "message": "Símbolo" + }, + "symbolBetweenZeroTwelve": { + "message": "O símbolo deve ter 11 caracteres ou menos." + }, + "syncWithMobile": { + "message": "Sincronizar com o celular" + }, + "syncWithMobileTitle": { + "message": "Sincronizar com o celular" + }, + "syncWithMobileDesc": { + "message": "Você pode sincronizar suas contas e informações com seu dispositivo móvel. Abra o aplicativo móvel MetaMask, vá em \"Configurações\" e toque em \"Sincronizar da Extensão do Navegador\"" + }, + "syncWithMobileDescNewUsers": { + "message": "Se você acabou de abrir o aplicativo MetaMask Mobile pela primeira vez, basta seguir os passos no seu telefone." + }, + "syncWithMobileScanThisCode": { + "message": "Digitalize este código com o seu app móvel do MetaMask" + }, + "syncWithMobileBeCareful": { + "message": "Certifique-se de que ninguém mais esteja olhando para sua tela ao digitalizar esse código" + }, + "syncWithMobileComplete": { + "message": "Seus dados foram sincronizados com sucesso. Aproveite o aplicativo MetaMask!" + }, + "terms": { + "message": "Termos de Uso" + }, + "testFaucet": { + "message": "Torneira de Testes" + }, + "thisWillCreate": { + "message": "Isso criará uma nova carteira e frase-semente" + }, + "tips": { + "message": "Doações" + }, + "to": { + "message": "Para" + }, + "tokenAlreadyAdded": { + "message": "O token já foi adicionado." + }, + "tokenContractAddress": { + "message": "Endereço do Contrato do Token" + }, + "tokenSymbol": { + "message": "Símbolo de Token" + }, + "transaction": { + "message": "transação" + }, + "transactionConfirmed": { + "message": "Transação confirmada a $2." + }, + "transactionCreated": { + "message": "Transação criada com valor de $1 a $2." + }, + "transactionDropped": { + "message": "Transação reduzida em $2." + }, + "transactionSubmitted": { + "message": "Transação enviada com taxa de gás de $1 a $2." + }, + "transactionResubmitted": { + "message": "Transação realizada novamente com tarifa de Gas aumentada de $1 para $2" + }, + "transactionUpdated": { + "message": "Transação atualizada às $2." + }, + "transactionErrored": { + "message": "A transação encontrou um erro." + }, + "transactionCancelAttempted": { + "message": "Tentativa de cancelamento da transação feita com taxa de gás de $1 a $2" + }, + "transactionCancelSuccess": { + "message": "Transação cancelada com sucesso em $2" + }, + "transactionError": { + "message": "Erro de Transação. Exceção lançada no código do contrato." + }, + "transactionErrorNoContract": { + "message": "Tentando chamar uma função em um endereço que não faz parte do contrato." + }, + "transactionFee": { + "message": "Taxa de Transação" + }, + "transactionTime": { + "message": "Hora da Transação" + }, + "transfer": { + "message": "Transferir" + }, + "transferBetweenAccounts": { + "message": "Transferir entre minhas contas" + }, + "transferFrom": { + "message": "Transferir de" + }, + "troubleTokenBalances": { + "message": "Tivemos dificuldade para carregar seus saldos de token. Você pode vê-los", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "Tentar novamente" + }, + "typePassword": { + "message": "Digite sua senha do MetaMask" + }, + "unapproved": { + "message": "Desaprovado" + }, + "units": { + "message": "unidades" + }, + "unknown": { + "message": "Desconhecido" + }, + "unknownNetwork": { + "message": "Rede Privada Desconhecida" + }, + "unknownQrCode": { + "message": "Erro: Não foi possível identificar esse código QR" + }, + "unknownCameraErrorTitle": { + "message": "Ooops! Algo deu errado...." + }, + "unknownCameraError": { + "message": "Ocorreu um erro ao tentar acessar sua câmera. Tente novamente..." + }, + "unlock": { + "message": "Desbloquear" + }, + "unlockMessage": { + "message": "A rede descentralizada está esperando" + }, + "updatedWithDate": { + "message": "$1 atualizado" + }, + "urlErrorMsg": { + "message": "URIs exigem o devido prefixo HTTP/HTTPS." + }, + "usedByClients": { + "message": "Usado por uma variedade de clientes" + }, + "userName": { + "message": "Nome de usuário" + }, + "viewAccount": { + "message": "Visualizar conta" + }, + "viewinExplorer": { + "message": "Visualizar no Explorer" + }, + "viewContact": { + "message": "Ver Contato" + }, + "viewOnCustomBlockExplorer": { + "message": "Ver em $1" + }, + "viewOnEtherscan": { + "message": "Ver no Etherscan" + }, + "visitWebSite": { + "message": "Visite nosso site" + }, + "walletSeed": { + "message": "Semente da Carteira" + }, + "welcomeBack": { + "message": "Bem-vindo de volta!" + }, + "welcome": { + "message": "Bem-vindo ao MetaMask" + }, + "writePhrase": { + "message": "Escreva esta frase em um papel e guarde-o em um lugar seguro. Se quiser ainda mais segurança, anote-a em vários papéis diferentes e guarde-os em 2 ou 3 lugares diferentes." + }, + "yesLetsTry": { + "message": "Sim, vamos tentar" + }, + "youNeedToAllowCameraAccess": { + "message": "Você precisa conceder acesso à câmera para usar esse recurso." + }, + "yourSigRequested": { + "message": "Sua assinatura está sendo solicitada" + }, + "youSign": { + "message": "Você está assinando" + }, + "yourPrivateSeedPhrase": { + "message": "Sua frase-semente particular" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "Preço de Gas zero na agilização" + } +} diff --git a/app/_locales/pt_PT/messages.json b/app/_locales/pt_PT/messages.json new file mode 100644 index 000000000000..65914966fbc6 --- /dev/null +++ b/app/_locales/pt_PT/messages.json @@ -0,0 +1,171 @@ +{ + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "reject": { + "message": "Rejeitar" + }, + "about": { + "message": "Acerca de" + }, + "account": { + "message": "Conta" + }, + "advanced": { + "message": "Avançadas" + }, + "amount": { + "message": "Quantia" + }, + "back": { + "message": "Anterior" + }, + "basic": { + "message": "Básico" + }, + "off": { + "message": "Desativado" + }, + "ok": { + "message": "OK" + }, + "on": { + "message": "Ativado" + }, + "cancel": { + "message": "Cancelar" + }, + "close": { + "message": "Fechar" + }, + "confirm": { + "message": "Confirmar" + }, + "connect": { + "message": "Ligar" + }, + "copiedExclamation": { + "message": "Copiado!" + }, + "copyToClipboard": { + "message": "Copiar para a área de transferência" + }, + "create": { + "message": "Criar" + }, + "delete": { + "message": "Eliminar" + }, + "deposit": { + "message": "Depósito" + }, + "details": { + "message": "Detalhes" + }, + "done": { + "message": "Concluído" + }, + "edit": { + "message": "Editar" + }, + "endOfFlowMessage9": { + "message": "Obtenha mais informações." + }, + "fast": { + "message": "Rápido" + }, + "forgetDevice": { + "message": "Esquecer este dispositivo" + }, + "getStarted": { + "message": "Começar" + }, + "here": { + "message": "aqui", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hide": { + "message": "Ocultar" + }, + "history": { + "message": "Histórico" + }, + "import": { + "message": "Importar", + "description": "Button to import an account from a selected file" + }, + "imported": { + "message": "Importado", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "learnMore": { + "message": "Aprenda mais" + }, + "loading": { + "message": "A carregar..." + }, + "next": { + "message": "Seguinte" + }, + "origin": { + "message": "Origem" + }, + "password": { + "message": "Palavra-passe" + }, + "privacyMsg": { + "message": "Política de Privacidade" + }, + "queue": { + "message": "Fila" + }, + "reset": { + "message": "Repor" + }, + "restore": { + "message": "Restaurar" + }, + "remove": { + "message": "Remover" + }, + "removeAccount": { + "message": "Remover conta" + }, + "save": { + "message": "Guardar" + }, + "slow": { + "message": "Lento" + }, + "search": { + "message": "Pesquisar" + }, + "send": { + "message": "Enviar" + }, + "settings": { + "message": "Definições" + }, + "tips": { + "message": "Doações" + }, + "tryAgain": { + "message": "Tentar novamente" + }, + "unknown": { + "message": "Desconhecido" + }, + "unlock": { + "message": "Desbloquear" + }, + "userName": { + "message": "Nome de utilizador" + }, + "viewAccount": { + "message": "Ver Conta" + }, + "welcomeBack": { + "message": "Bem-vindo de volta!" + } +} diff --git a/app/_locales/ro/messages.json b/app/_locales/ro/messages.json new file mode 100644 index 000000000000..96e94f9f4685 --- /dev/null +++ b/app/_locales/ro/messages.json @@ -0,0 +1,1291 @@ +{ + "chartOnlyAvailableEth": { + "message": "Grafic disponibil numai pe reÈ›elele Ethereum." + }, + "contractInteraction": { + "message": "InteracÈ›iune contract" + }, + "reject": { + "message": "RespingeÈ›i" + }, + "about": { + "message": "Despre" + }, + "aboutSettingsDescription": { + "message": "Versiune, centru de asistență È™i date de contact" + }, + "acceleratingATransaction": { + "message": "* Accelerarea unei tranzacÈ›ii folosind un preÈ› în gas mai mare îi creÈ™te È™ansele de a fi procesată mai rapid de reÈ›ea, însă acest lucru nu este garantat întotdeauna." + }, + "accessingYourCamera": { + "message": "Se accesează camera dvs..." + }, + "account": { + "message": "Cont" + }, + "accountDetails": { + "message": "Detalii cont" + }, + "accountName": { + "message": "Numele contului" + }, + "accountOptions": { + "message": "OpÈ›iuni cont" + }, + "accountSelectionRequired": { + "message": "Trebuie să selectaÈ›i un cont!" + }, + "activityLog": { + "message": "jurnal activitate" + }, + "addNetwork": { + "message": "AdăugaÈ›i reÈ›ea" + }, + "addRecipient": { + "message": "AdăugaÈ›i destinatarul" + }, + "advanced": { + "message": "Avansate" + }, + "advancedSettingsDescription": { + "message": "AccesaÈ›i funcÈ›ii pentru dezvoltatori, descărcaÈ›i Jurnale de stare, resetaÈ›i contul, configuraÈ›i reÈ›ele de test È™i RPC personalizat" + }, + "advancedOptions": { + "message": "OpÈ›iuni avansate" + }, + "addToAddressBook": { + "message": "AdăugaÈ›i în agendă" + }, + "addToAddressBookModalPlaceholder": { + "message": "de ex. John D." + }, + "addAlias": { + "message": "Adăugare alias" + }, + "addToken": { + "message": "Adăugare simbol" + }, + "addTokens": { + "message": "AdăugaÈ›i token-uri" + }, + "addSuggestedTokens": { + "message": "AdăugaÈ›i indicativele sugerate" + }, + "addAcquiredTokens": { + "message": "AdăugaÈ›i token-urile pe care le-aÈ›i achiziÈ›ionat folosind MetaMask" + }, + "amount": { + "message": "Sumă" + }, + "appDescription": { + "message": "Un portofel Ethereum în browserul dvs.", + "description": "The description of the application" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "approve": { + "message": "AprobaÈ›i" + }, + "approved": { + "message": "Aprobat" + }, + "asset": { + "message": "Activ" + }, + "attemptingConnect": { + "message": "Se încearcă conectarea la blockchain." + }, + "attemptToCancel": { + "message": "ÃŽncercaÈ›i să anulaÈ›i?" + }, + "attemptToCancelDescription": { + "message": "Trimiterea acestei încercări nu garantează că tranzacÈ›ia dvs. originală va fi anulată. Dacă încercarea de anulare va reuÈ™i, vi se va percepe taxa tranzacÈ›iei de mai sus." + }, + "attributions": { + "message": "AtribuÈ›ii" + }, + "autoLockTimeLimit": { + "message": "Temporizator deconectare automată (minute)" + }, + "autoLockTimeLimitDescription": { + "message": "SetaÈ›i perioada de inactivitate în minute înainte ca MetaMask să se deconecteze automat" + }, + "average": { + "message": "Mediu" + }, + "back": { + "message": "ÃŽnapoi" + }, + "backToAll": { + "message": "ÃŽnapoi la toate" + }, + "backupApprovalNotice": { + "message": "CreaÈ›i o copie de rezervă a codului de recuperare secret pentru a vă menÈ›ine portofelul È™i fondurile în siguranță." + }, + "backupApprovalInfo": { + "message": "Acest cod secret este necesar pentru recuperarea portofelului în cazul în care pierdeÈ›i dispozitivul, uitaÈ›i parola, trebuie să reinstalaÈ›i MetaMask sau vreÈ›i să accesaÈ›i portofelul de pe alt dispozitiv." + }, + "backupNow": { + "message": "CreaÈ›i o copie de rezervă acum" + }, + "balance": { + "message": "Sold" + }, + "balanceOutdated": { + "message": "Se poate ca soldul să nu fie actualizat" + }, + "basic": { + "message": "De bază" + }, + "blockExplorerUrl": { + "message": "Explorator blocuri" + }, + "blockExplorerView": { + "message": "Vizualizare cont la $1", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "FoloseÈ™te Blockies Identicon" + }, + "browserNotSupported": { + "message": "Browserul dvs. nu este compatibil..." + }, + "builtInCalifornia": { + "message": "MetaMask este concepută È™i creată în California." + }, + "buyWithWyre": { + "message": "CumpăraÈ›i ETH cu Wyre" + }, + "buyWithWyreDescription": { + "message": "Wyre vă permite să folosiÈ›i un card de credit pentru a depune ETH direct în contul dvs. MetaMask." + }, + "buyCoinSwitch": { + "message": "CumpăraÈ›i pe CoinSwitch" + }, + "buyCoinSwitchExplainer": { + "message": "CoinSwitch este destinaÈ›ia unică pentru a schimba peste 300 de cripto monede la cele mai bune cursuri." + }, + "bytes": { + "message": "OcteÈ›i" + }, + "off": { + "message": "Oprit" + }, + "ok": { + "message": "OK" + }, + "on": { + "message": "Activat" + }, + "optionalBlockExplorerUrl": { + "message": "URL explorator bloc (opÈ›ional)" + }, + "cancel": { + "message": "Anulare" + }, + "cancelAttempt": { + "message": "Anulare încercare" + }, + "cancellationGasFee": { + "message": "Taxă de anulare în gaz" + }, + "cancelled": { + "message": "Anulat" + }, + "chainId": { + "message": "ID lanÈ›" + }, + "clickToRevealSeed": { + "message": "FaceÈ›i clic aici pentru a arăta cuvintele secrete" + }, + "close": { + "message": "ÃŽnchide" + }, + "chromeRequiredForHardwareWallets": { + "message": "Trebuie să folosiÈ›i MetaMask în Google Chrome pentru a vă conecta la portofelul hardware." + }, + "confirm": { + "message": "ConfirmaÈ›i" + }, + "confirmed": { + "message": "Confirmat" + }, + "confirmPassword": { + "message": "Confirmare parolă" + }, + "confirmSecretBackupPhrase": { + "message": "ConfirmaÈ›i expresia dvs. secretă de rezervă" + }, + "congratulations": { + "message": "Felicitări" + }, + "connectHardwareWallet": { + "message": "Conectare portofel hardware" + }, + "connect": { + "message": "Conectează-te" + }, + "connectingTo": { + "message": "Se conectează la $1" + }, + "connectingToKovan": { + "message": "Se conectează la reÈ›eaua de test Kovan" + }, + "connectingToMainnet": { + "message": "Se conectează la reÈ›eaua Ethereum principală" + }, + "connectingToRopsten": { + "message": "Se conectează la reÈ›eaua de test Ropsten" + }, + "connectingToRinkeby": { + "message": "Se conectează la ReÈ›eaua de test Rinkeby" + }, + "connectingToLocalhost": { + "message": "Se conectează la localhost 8545" + }, + "connectingToGoerli": { + "message": "Se conectează la reÈ›eaua de test Goerli" + }, + "continueToWyre": { + "message": "ContinuaÈ›i la Wyre" + }, + "continueToCoinSwitch": { + "message": "Continuare către CoinSwitch" + }, + "contractDeployment": { + "message": "Implementarea contractului" + }, + "copiedExclamation": { + "message": "Copiat!" + }, + "copyAddress": { + "message": "Copiere adresă în clipboard" + }, + "copyTransactionId": { + "message": "CopiaÈ›i ID-ul tranzacÈ›iei" + }, + "copiedTransactionId": { + "message": "ID-ul tranzacÈ›iei a fost copiat" + }, + "copyToClipboard": { + "message": "CopiaÈ›i în clipboard" + }, + "copyPrivateKey": { + "message": "Aceasta este cheia dumneavoastră privată (clic pentru a copia)" + }, + "create": { + "message": "CreaÈ›i" + }, + "createAccount": { + "message": "CreaÈ›i cont" + }, + "createAWallet": { + "message": "CreaÈ›i un portofel" + }, + "createPassword": { + "message": "Creare parolă" + }, + "currencyConversion": { + "message": "Schimb valutar" + }, + "currentLanguage": { + "message": "Limba actuală" + }, + "customGas": { + "message": "ParticularizaÈ›i Gas" + }, + "customGasSubTitle": { + "message": "CreÈ™terea taxei poate reduce timpii de procesare, dar acest lucru nu este garantat." + }, + "customToken": { + "message": "Token personalizat" + }, + "customRPC": { + "message": "RPC particularizat" + }, + "decimalsMustZerotoTen": { + "message": "Zecimalele trebuie să fie cel puÈ›in 0, dar nu peste 36." + }, + "decimal": { + "message": "Zecimale de precizie" + }, + "defaultNetwork": { + "message": "ReÈ›eaua implicită pentru tranzacÈ›iile cu Ether este Main Net." + }, + "delete": { + "message": "Șterge" + }, + "deleteAccount": { + "message": "ȘtergeÈ›i cont" + }, + "deposit": { + "message": "Depunere" + }, + "depositEther": { + "message": "DepuneÈ›i Ether" + }, + "details": { + "message": "Detalii" + }, + "directDepositEther": { + "message": "DepuneÈ›i direct Ether" + }, + "directDepositEtherExplainer": { + "message": "Dacă deja aveÈ›i Ether, cel mai rapid mod de a avea Ether în portofelul nou prin depunere directă." + }, + "done": { + "message": "Efectuat" + }, + "downloadGoogleChrome": { + "message": "Descărcare Google Chrome" + }, + "downloadSecretBackup": { + "message": "DescărcaÈ›i această expresie secretă de rezervă È™i păstraÈ›i-o în siguranță pe o unitate de disc sau un mediu de stocare criptat." + }, + "downloadStateLogs": { + "message": "DescărcaÈ›i jurnalele de stare" + }, + "dontHaveAHardwareWallet": { + "message": "Nu aveÈ›i portofel hardware?" + }, + "dropped": { + "message": "Pierdut" + }, + "edit": { + "message": "Editează" + }, + "editContact": { + "message": "EditaÈ›i contact" + }, + "endOfFlowMessage1": { + "message": "AÈ›i trecut testul – păstraÈ›i expresia sursă în siguranță, este răspunderea dvs.!" + }, + "endOfFlowMessage2": { + "message": "Sfaturi despre stocarea în siguranță" + }, + "endOfFlowMessage3": { + "message": "Salvează o copie de siguranță în mai multe locuri." + }, + "endOfFlowMessage4": { + "message": "Nu comunicaÈ›i niciodată fraza cuiva." + }, + "endOfFlowMessage5": { + "message": "AveÈ›i grijă la phishing! MetaMask nu vă va cere niciodată în mod spontan expresia sursă." + }, + "endOfFlowMessage6": { + "message": "Dacă trebuie să vă salvaÈ›i din nou fraza seed, puteÈ›i să o găsiÈ›i în Setări -> Securitate." + }, + "endOfFlowMessage7": { + "message": "Dacă aveÈ›i întrebări sau vedeÈ›i ceva suspect, trimiteÈ›i un e-mail la support@metamask.io." + }, + "endOfFlowMessage8": { + "message": "MetaMask nu vă poate recupera expresia sursă. AflaÈ›i mai multe." + }, + "endOfFlowMessage9": { + "message": "AflaÈ›i mai multe." + }, + "endOfFlowMessage10": { + "message": "Gata" + }, + "ensRegistrationError": { + "message": "Eroare la înregistrarea numelui ENS" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "Numele ENS nu s-a găsit pe reÈ›eaua curentă. ÃŽncercaÈ›i să comutaÈ›i la ReÈ›eaua Ethereum principală." + }, + "enterAnAlias": { + "message": "IntroduceÈ›i un alias" + }, + "enterPassword": { + "message": "IntroduceÈ›i parola" + }, + "enterPasswordContinue": { + "message": "IntroduceÈ›i parola pentru a continua" + }, + "ethereumPublicAddress": { + "message": "Adresa publică Ethereum" + }, + "etherscanView": { + "message": "Vizualizare cont pe Etherscan" + }, + "estimatedProcessingTimes": { + "message": "Timpi estimativi de procesare" + }, + "expandView": { + "message": "ExtindeÈ›i vizualizarea" + }, + "exportPrivateKey": { + "message": "ExportaÈ›i cheia privată" + }, + "failed": { + "message": "EÈ™uat" + }, + "fast": { + "message": "Rapid" + }, + "faster": { + "message": "Mai repede" + }, + "fileImportFail": { + "message": "Importarea fiÈ™ierului nu funcÈ›ionează? DaÈ›i clic aici!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "Uită dispozitivul" + }, + "from": { + "message": "De la" + }, + "functionType": { + "message": "Tip funcÈ›ie" + }, + "gasLimit": { + "message": "Limită gas" + }, + "gasLimitInfoModalContent": { + "message": "Limita gaz este numărul maxim de unități de gaz pe care sunteÈ›i dispus(ă) să le cheltuiÈ›i." + }, + "gasLimitTooLow": { + "message": "Limita de gaz trebuie să fie de cel puÈ›in 21.000" + }, + "gasUsed": { + "message": "Suma gaz folosită" + }, + "gasPrice": { + "message": "PreÈ› gas (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "PreÈ›ul gaz este foarte scăzut" + }, + "gasPriceInfoModalContent": { + "message": "PreÈ›ul în gas indică suma Ether pe care doriÈ›i să o plătiÈ›i pentru fiecare unitate gas." + }, + "gasPriceNoDenom": { + "message": "PreÈ› gas" + }, + "generalSettingsDescription": { + "message": "Schimb valutar, moneda principală, limba, blockies identicon" + }, + "getEther": { + "message": "ObÈ›ineÈ›i Ether" + }, + "getEtherFromFaucet": { + "message": "ObÈ›ineÈ›i Ether de la un robinet pentru $1", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "ObÈ›ineÈ›i ajutor." + }, + "getStarted": { + "message": "ÃŽncepe" + }, + "happyToSeeYou": { + "message": "Ne pare bine să vă vedem." + }, + "hardwareWalletConnected": { + "message": "Portofelul hardware a fost conectat" + }, + "hardwareWallets": { + "message": "ConectaÈ›i un portofel hardware" + }, + "hardwareWalletsMsg": { + "message": "SelectaÈ›i un portofel hardware pe care doriÈ›i să îl folosiÈ›i cu MetaMask" + }, + "havingTroubleConnecting": { + "message": "AveÈ›i probleme cu conectarea?" + }, + "here": { + "message": "aici", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hexData": { + "message": "Date hexazecimale" + }, + "hide": { + "message": "Ascunde" + }, + "hideTokenPrompt": { + "message": "Ascunde simbol?" + }, + "history": { + "message": "Istoric" + }, + "import": { + "message": "Importă", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "Importare cont" + }, + "importAccountMsg": { + "message": "Conturile importate nu vor fi asociate cu seedphrase-ul contului dumneavoastră MetaMask creat iniÈ›ial. AflaÈ›i mai multe despre conturile importate" + }, + "importAccountSeedPhrase": { + "message": "ImportaÈ›i un cont cu fraza seed" + }, + "importWallet": { + "message": "ImportaÈ›i portofel" + }, + "importYourExisting": { + "message": "ImportaÈ›i portofelul existent folosind o frază seed de 12 cuvinte" + }, + "imported": { + "message": "Importate", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "Importare folosind fraza iniÈ›ială a contului" + }, + "infoHelp": { + "message": "InformaÈ›ii È™i ajutor" + }, + "initialTransactionConfirmed": { + "message": "TranzacÈ›ia iniÈ›ială a fost confirmată de reÈ›ea. Clic pe OK pentru a reveni." + }, + "insufficientBalance": { + "message": "Sold insuficient." + }, + "insufficientFunds": { + "message": "Fonduri insuficiente." + }, + "insufficientTokens": { + "message": "Tokenuri insuficiente." + }, + "invalidAddress": { + "message": "Adresă nevalidă" + }, + "invalidAddressRecipient": { + "message": "Adresa destinatarului nu este validă" + }, + "knownAddressRecipient": { + "message": "Adresa cunoscută din contract." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "Nu este reÈ›ea ETH, setaÈ›i pe minuscule" + }, + "invalidInput": { + "message": "Intrare nevalidă." + }, + "invalidRPC": { + "message": "URL RPC nevalid" + }, + "invalidBlockExplorerURL": { + "message": "URL Block Explorer nevalid" + }, + "invalidSeedPhrase": { + "message": "Expresie sursă nevalidă" + }, + "jsonFile": { + "message": "FiÈ™ier JSON", + "description": "format for importing an account" + }, + "kovan": { + "message": "ReÈ›ea de test Kovan" + }, + "max": { + "message": "Maximum" + }, + "learnMore": { + "message": "AflaÈ›i mai multe" + }, + "ledgerAccountRestriction": { + "message": "Trebuie să folosiÈ›i ultimul cont înainte să adăugaÈ›i altul." + }, + "letsGoSetUp": { + "message": "Da, hai să configurăm!" + }, + "likeToAddTokens": { + "message": "AdăugaÈ›i aceste indicative?" + }, + "links": { + "message": "Link-uri" + }, + "liveGasPricePredictions": { + "message": "PredicÈ›ii live de preÈ› în gas" + }, + "loading": { + "message": "Se încarcă…" + }, + "loadingTokens": { + "message": "Se încarcă token-urile..." + }, + "loadMore": { + "message": "ÃŽncărcaÈ›i mai multe" + }, + "lock": { + "message": "DeconectaÈ›i-vă" + }, + "mainnet": { + "message": "ReÈ›eaua Ethereum principală" + }, + "memorizePhrase": { + "message": "MemoraÈ›i această expresie." + }, + "memo": { + "message": "notă" + }, + "message": { + "message": "Mesaj" + }, + "metamaskDescription": { + "message": "Vă conectăm la Ethereum È™i la Internetul descentralizat." + }, + "metamaskVersion": { + "message": "Versiune MetaMask" + }, + "mobileSyncText": { + "message": "Vă rugăm introduceÈ›i parola pentru a vă confirma identitatea!" + }, + "myAccounts": { + "message": "Conturile mele" + }, + "myWalletAccounts": { + "message": "Conturi My Wallet" + }, + "myWalletAccountsDescription": { + "message": "Toate conturile dvs. create pe MetaMask vor fi adăugate automat la această secÈ›iune." + }, + "mustSelectOne": { + "message": "Trebuie să selectaÈ›i cel puÈ›in 1 simbol." + }, + "needEtherInWallet": { + "message": "Pentru a interacÈ›iona cu aplicaÈ›iile descentralizate prin intermediul MetaMask, trebuie să aveÈ›i Ether în portofel." + }, + "needImportFile": { + "message": "Trebuie să selectaÈ›i un fiÈ™ier pentru importare.", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "Nu se pot trimite sume negative de ETH." + }, + "networkName": { + "message": "Numele reÈ›elei" + }, + "networks": { + "message": "ReÈ›ele" + }, + "networkSettingsDescription": { + "message": "AdăugaÈ›i È™i editaÈ›i reÈ›elele RPC particularizate" + }, + "nevermind": { + "message": "Nu mai contează" + }, + "newAccount": { + "message": "Cont nou" + }, + "newAccountDetectedDialogMessage": { + "message": "A fost detectată o adresă nouă! FaceÈ›i clic aici pentru a o adăuga în agenda dvs." + }, + "newAccountNumberName": { + "message": "Cont $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "Contact nou" + }, + "newContract": { + "message": "Contract nou" + }, + "newPassword": { + "message": "Parola Nouă (minimum 8 caractere)" + }, + "newNetwork": { + "message": "ReÈ›ea nouă" + }, + "newToMetaMask": { + "message": "Nefamiliarizat cu MetaMask?" + }, + "noAlreadyHaveSeed": { + "message": "Nu, am deja o expresie sursă" + }, + "protectYourKeys": { + "message": "ProtejaÈ›i-vă cheile!" + }, + "protectYourKeysMessage1": { + "message": "AveÈ›i grijă cu expresia dvs. sursă – au existat raportări despre site-uri web care încearcă să imite MetaMask. MetaMask nu vă va cere niciodată expresia sursă!" + }, + "protectYourKeysMessage2": { + "message": "AveÈ›i grijă de fraza dvs. Dacă vedeÈ›i ceva care este în neregulă sau aveÈ›i dubii cu privire la un site, trimiteÈ›i un mesaj la support@metamask.io" + }, + "rpcUrl": { + "message": "URL RPC nou" + }, + "optionalChainId": { + "message": "ChainID (opÈ›ional)" + }, + "optionalSymbol": { + "message": "Simbol (opÈ›ional)" + }, + "newTotal": { + "message": "Total nou" + }, + "newTransactionFee": { + "message": "Taxă nouă de tranzacÈ›ie" + }, + "next": { + "message": "ÃŽnainte" + }, + "noAddressForName": { + "message": "Nu a fost configurată nicio adresă pentru acest nume." + }, + "noConversionRateAvailable": { + "message": "Nici o rată de conversie disponibilă" + }, + "noTransactions": { + "message": "Nu aveÈ›i tranzacÈ›ii" + }, + "notEnoughGas": { + "message": "Gas insuficient" + }, + "noWebcamFoundTitle": { + "message": "Camera web nu a fost găsită" + }, + "noWebcamFound": { + "message": "Webcam-ul computerului dvs. nu a fost găsit. Vă rugăm să încercaÈ›i din nou." + }, + "ofTextNofM": { + "message": "din" + }, + "orderOneHere": { + "message": "ComandaÈ›i Trezor sau Ledger È™i È›ineÈ›i-vă fondurile la rece" + }, + "origin": { + "message": "Origine" + }, + "parameters": { + "message": "Parametri" + }, + "participateInMetaMetrics": { + "message": "ParticipaÈ›i la MetaMetrics" + }, + "participateInMetaMetricsDescription": { + "message": "AlăturaÈ›i-vă MetaMetrics pentru a ne ajuta să îmbunătățim MetaMask." + }, + "password": { + "message": "Parolă" + }, + "passwordsDontMatch": { + "message": "Parolele nu se potrivesc" + }, + "passwordNotLongEnough": { + "message": "Parola nu este suficient de lungă" + }, + "pastePrivateKey": { + "message": "LipiÈ›i aici È™irul de chei private:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "în aÈ™teptare" + }, + "personalAddressDetected": { + "message": "A fost detectată o adresă personală. IntroduceÈ›i adresa de contract indicativ." + }, + "prev": { + "message": "Ant" + }, + "primaryCurrencySetting": { + "message": "Moneda principală" + }, + "primaryCurrencySettingDescription": { + "message": "SelectaÈ›i nativ pentru a prioritiza valorile afiÈ™ate în moneda nativă a lanÈ›ului (ex. ETH). SelectaÈ›i Fiat pentru a prioritiza valorile afiÈ™ate în moneda selectată fiat." + }, + "privacyMsg": { + "message": "Politica de ConfidenÈ›ialitate" + }, + "privateKey": { + "message": "Cheie privată", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "Avertisment: nu dezvăluiÈ›i niciodată această cheie. Oricine are cheile dvs. private poate fura orice activ din contul dvs." + }, + "privateNetwork": { + "message": "ReÈ›ea privată" + }, + "queue": { + "message": "Coadă" + }, + "readdToken": { + "message": "PuteÈ›i adăuga din nou acest indicativ în viitor accesând „AdăugaÈ›i indicativ†din meniul de opÈ›iuni al contului dvs." + }, + "recents": { + "message": "Recente" + }, + "recipientAddress": { + "message": "Adresă destinatar" + }, + "recipientAddressPlaceholder": { + "message": "Căutare, adresa publică (0x) sau ENS" + }, + "rejectAll": { + "message": "Respingere toate" + }, + "rejectTxsN": { + "message": "RespingeÈ›i $1 (de) tranzacÈ›ii" + }, + "rejectTxsDescription": { + "message": "SunteÈ›i pe cale să respingeÈ›i în grup $1 (de) tranzacÈ›ii." + }, + "rejected": { + "message": "Respins" + }, + "reset": { + "message": "Resetează" + }, + "resetAccount": { + "message": "Resetare cont" + }, + "resetAccountDescription": { + "message": "Resetarea contului va duce la È™tergerea istoricului tranzacÈ›iilor dvs." + }, + "deleteNetwork": { + "message": "ȘtergeÈ›i reÈ›eaua?" + }, + "deleteNetworkDescription": { + "message": "Sigur vreÈ›i să È™tergeÈ›i această reÈ›ea?" + }, + "remindMeLater": { + "message": "ReaminteÈ™te-mi mai târziu" + }, + "restoreFromSeed": { + "message": "RestabiliÈ›i contul?" + }, + "restoreAccountWithSeed": { + "message": "RestauraÈ›i-vă contul folosind fraza iniÈ›ială" + }, + "requestsAwaitingAcknowledgement": { + "message": "solicitări care aÈ™teaptă să fie confirmate" + }, + "required": { + "message": "Obligatoriu" + }, + "restore": { + "message": "RestabileÈ™te" + }, + "revealSeedWords": { + "message": "Arată cuvintele din seed" + }, + "revealSeedWordsTitle": { + "message": "Expresie sursă" + }, + "revealSeedWordsDescription": { + "message": "Dacă schimbaÈ›i vreodată browserele sau vă mutaÈ›i la alt computer, veÈ›i avea nevoie de această expresie sursă pentru a vă accesa conturile. SalvaÈ›i-o într-un loc sigur È™i secret." + }, + "revealSeedWordsWarningTitle": { + "message": "NU împărtășiÈ›i această expresie nimănui!" + }, + "revealSeedWordsWarning": { + "message": "Aceste cuvinte pot fi folosite pentru a vă fura toate conturile." + }, + "remove": { + "message": "Elimină" + }, + "removeAccount": { + "message": "EliminaÈ›i contul" + }, + "removeAccountDescription": { + "message": "Acest cont va fi eliminat din portofelul dvs. ÃŽnainte de a continua, vă rugăm să vă asiguraÈ›i că aveÈ›i expresia seed iniÈ›ială sau cheia privată pentru acest cont importat. PuteÈ›i importa sau crea conturi din nou din meniul derulant al contului." + }, + "readyToConnect": { + "message": "Gata de conectare?" + }, + "rinkeby": { + "message": "ReÈ›ea test Rinkeby" + }, + "ropsten": { + "message": "ReÈ›ea de testare Ropsten" + }, + "goerli": { + "message": "ReÈ›ea de test Goerli" + }, + "save": { + "message": "Salvează" + }, + "slow": { + "message": "Lent" + }, + "slower": { + "message": "Mai încet" + }, + "saveAsCsvFile": { + "message": "SalvaÈ›i ca fiÈ™ier CSV " + }, + "scanInstructions": { + "message": "AÈ™ezaÈ›i codul QR în faÈ›a camerei" + }, + "scanQrCode": { + "message": "ScanaÈ›i codul QR" + }, + "search": { + "message": "Caută" + }, + "searchResults": { + "message": "Rezultate căutare" + }, + "secretBackupPhrase": { + "message": "Expresia secretă de rezervă" + }, + "secretBackupPhraseDescription": { + "message": "Expresia dvs. secretă de rezervă înlesneÈ™te crearea unei copii de rezervă a contului dvs. È™i restabilirea acestuia." + }, + "secretBackupPhraseWarning": { + "message": "ATENÈšIE: Nu dezvăluiÈ›i niciodată expresia dvs. de rezervă. Oricine are această expresie vă poate lua Ether-ul pentru totdeauna." + }, + "secretPhrase": { + "message": "IntroduceÈ›i aici expresia dvs. secretă din 12 cuvinte pentru a restabili seiful." + }, + "securityAndPrivacy": { + "message": "Securitate È™i confidenÈ›ialitate" + }, + "securitySettingsDescription": { + "message": "Setările de confidenÈ›ialitate È™i fraza seed a portofelului" + }, + "seedPhrasePlaceholder": { + "message": "DespărÈ›iÈ›i fiecare cuvânt cu un spaÈ›iu" + }, + "seedPhraseReq": { + "message": "Expresiile seed sunt lungi de 12 cuvinte" + }, + "selectCurrency": { + "message": "SelectaÈ›i moneda" + }, + "selectEachPhrase": { + "message": "Vă rugăm să selectaÈ›i fiecare expresie pentru a vă asigura că este corectă." + }, + "selectLocale": { + "message": "AlegeÈ›i setările regionale" + }, + "selectType": { + "message": "SelectaÈ›i tipul" + }, + "send": { + "message": "Trimite" + }, + "sendAmount": { + "message": "Suma trimisă" + }, + "sendETH": { + "message": "Trimitere ETH" + }, + "sendTokens": { + "message": "TrimiteÈ›i indicative" + }, + "sentEther": { + "message": "trimiteÈ›i ether" + }, + "sentTokens": { + "message": "tokenuri trimise" + }, + "separateEachWord": { + "message": "DespărÈ›iÈ›i fiecare cuvânt cu un spaÈ›iu" + }, + "searchTokens": { + "message": "CăutaÈ›i token-uri" + }, + "selectAnAccount": { + "message": "SelectaÈ›i un cont" + }, + "selectAnAccountHelp": { + "message": "SelectaÈ›i contul de vizualizat în MetaMask" + }, + "selectAHigherGasFee": { + "message": "SelectaÈ›i o taxă gas mai mare pentru a accelera procesarea tranzacÈ›iei.*" + }, + "selectHdPath": { + "message": "Selectare cale HD" + }, + "selectPathHelp": { + "message": "Dacă nu vedeÈ›i mai jos conturile dvs. Ledger existente, încercaÈ›i să comutaÈ›i calea la „Legacy (MEW / MyCrypto)â€" + }, + "settings": { + "message": "Setări" + }, + "showAdvancedGasInline": { + "message": "Controale avansate pentru gas" + }, + "showAdvancedGasInlineDescription": { + "message": "SelectaÈ›i aceasta pentru a arăta preÈ›ul gasului È™i comenzile de limitare direct pe ecranele de trimitere È™i confirmare." + }, + "showFiatConversionInTestnets": { + "message": "AfiÈ™ează conversiile pe reÈ›elele de test (testnets)" + }, + "showFiatConversionInTestnetsDescription": { + "message": "SelectaÈ›i pentru a afiÈ™a conversia fiat pe Testnets" + }, + "showPrivateKeys": { + "message": "AfiÈ™aÈ›i cheile private" + }, + "showHexData": { + "message": "Arată datele hex" + }, + "showHexDataDescription": { + "message": "SelectaÈ›i această opÈ›iune pentru a arăta câmpul de date hexazecimale în ecranul de trimitere." + }, + "sign": { + "message": "SemnaÈ›i" + }, + "signatureRequest": { + "message": "Cerere semnătură" + }, + "signed": { + "message": "Semnat" + }, + "signNotice": { + "message": "Semnarea acestui mesaj poate avea efecte secundare periculoase. SemnaÈ›i mesajele numai de pe site-urile în care aveÈ›i încredere deplină să vă acceseze întregul cont. Această metodă periculoasă va fi eliminată într-o versiune viitoare." + }, + "sigRequest": { + "message": "Solicitare de semnătură" + }, + "somethingWentWrong": { + "message": "Hopa! A apărut o eroare." + }, + "speedUp": { + "message": "AcceleraÈ›i" + }, + "speedUpCancellation": { + "message": "AcceleraÈ›i această anulare" + }, + "speedUpTransaction": { + "message": "AcceleraÈ›i această tranzacÈ›ie" + }, + "switchNetworks": { + "message": "SchimbaÈ›i reÈ›elele" + }, + "stateLogs": { + "message": "Jurnale de stare" + }, + "stateLogsDescription": { + "message": "Jurnalele de stare conÈ›in adresele contului dvs. public È™i tranzacÈ›iile trimise." + }, + "stateLogError": { + "message": "Eroare la recuperarea înregistrărilor de stare." + }, + "step1HardwareWallet": { + "message": "1. ConectaÈ›i portofel hardware" + }, + "step1HardwareWalletMsg": { + "message": "ConectaÈ›i portofelul hardware direct la computer." + }, + "step2HardwareWallet": { + "message": "2. SelectaÈ›i un cont" + }, + "step2HardwareWalletMsg": { + "message": "SelectaÈ›i contul pe care vreÈ›i să îl vizualizaÈ›i. PuteÈ›i alege doar câte unul odată." + }, + "step3HardwareWallet": { + "message": "3. ÃŽncepeÈ›i să folosiÈ›i dApps È™i altele!" + }, + "step3HardwareWalletMsg": { + "message": "FolosiÈ›i-vă contul hardware la fel ca pe orice cont Ethereum. ConectaÈ›i-vă la dApps, trimiteÈ›i Eth, cumpăraÈ›i È™i stocaÈ›i tokenuri ERC20 È™i tokenuri non-fungibile precum CryptoKitties." + }, + "storePhrase": { + "message": "PăstraÈ›i această expresie într-un program de gestionare a parolelor cum ar fi 1Password." + }, + "submitted": { + "message": "Trimis" + }, + "supportCenter": { + "message": "AccesaÈ›i centrul de asistență" + }, + "symbol": { + "message": "Simbol" + }, + "symbolBetweenZeroTwelve": { + "message": "Simbolul trebuie să fie de 11 caractere sau mai puÈ›in." + }, + "syncWithMobile": { + "message": "SincronizaÈ›i cu dispozitivul mobil" + }, + "syncWithMobileTitle": { + "message": "SincronizaÈ›i cu mobilul" + }, + "syncWithMobileDesc": { + "message": "Vă puteÈ›i sincroniza conturile È™i informaÈ›iile cu dispozitivul dvs. mobil. DeschideÈ›i aplicaÈ›ia mobilă MetaMask, mergeÈ›i la „Setări†și atingeÈ›i „Sincronizare de la extensia de browserâ€" + }, + "syncWithMobileDescNewUsers": { + "message": "Dacă deschideÈ›i aplicaÈ›ia pentru mobil MetaMask pentru prima oară, urmaÈ›i paÈ™ii afiÈ™aÈ›i pe telefonul dvs." + }, + "syncWithMobileScanThisCode": { + "message": "ScanaÈ›i acest cod folosind aplicaÈ›ia dvs. mobilă MetaMask" + }, + "syncWithMobileBeCareful": { + "message": "AsiguraÈ›i-vă că nimeni altcineva nu poate vedea ecranul dvs. când scanaÈ›i acest cod" + }, + "syncWithMobileComplete": { + "message": "Datele dvs. au fost sincronizate cu succes. BucuraÈ›i-vă de aplicaÈ›ia mobilă MetaMask!" + }, + "terms": { + "message": "Termeni È™i condiÈ›ii" + }, + "testFaucet": { + "message": "Robinet de testare" + }, + "thisWillCreate": { + "message": "Această acÈ›iune va crea un nou portofel È™i o nouă fraza iniÈ›ială." + }, + "tips": { + "message": "Cadouri băneÈ™ti" + }, + "to": { + "message": "Către" + }, + "token": { + "message": "Indicativ" + }, + "tokenAlreadyAdded": { + "message": "Token-ul a fost adăugat deja." + }, + "tokenContractAddress": { + "message": "Adresa din contractul de token" + }, + "tokenSymbol": { + "message": "Simbol token" + }, + "transaction": { + "message": "tranzacÈ›ie" + }, + "transactionConfirmed": { + "message": "TranzacÈ›ie confirmată la $2." + }, + "transactionCreated": { + "message": "TranzacÈ›ie creată cu o valoare de $1 la $2." + }, + "transactionDropped": { + "message": "TranzacÈ›ie abandonată la $2." + }, + "transactionSubmitted": { + "message": "TranzacÈ›ia a fost trimisă, cu o taxă gas de $1 la $2." + }, + "transactionResubmitted": { + "message": "TranzacÈ›ia a fost redepusă cu taxa gaz majorată de la $1 la $2" + }, + "transactionUpdated": { + "message": "TranzacÈ›ie actualizată la $2." + }, + "transactionErrored": { + "message": "TranzacÈ›ia a întâlnit o eroare." + }, + "transactionCancelAttempted": { + "message": "Tentativă de anulare a tranzacÈ›iei cu o taxă gas de $1 la $2" + }, + "transactionCancelSuccess": { + "message": "TranzacÈ›ia a fost anulată cu succes la $2" + }, + "transactionError": { + "message": "Eroare de tranzacÈ›ie. ExcepÈ›ie lansată în codul contractului." + }, + "transactionErrorNoContract": { + "message": "Se încearcă apelarea unei funcÈ›ii pe o adresă non-contract." + }, + "transactionFee": { + "message": "Taxa tranzacÈ›iei" + }, + "transactionTime": { + "message": "Ora tranzacÈ›iei" + }, + "transferBetweenAccounts": { + "message": "Transferă între conturile mele" + }, + "transferFrom": { + "message": "TransferaÈ›i de la" + }, + "troubleTokenBalances": { + "message": "Am avut dificultăți cu încărcarea soldurilor dvs. de tokenuri. Le puteÈ›i vizualiza", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "ÃŽncearcă din nou" + }, + "typePassword": { + "message": "ScrieÈ›i parola dvs. pentru MetaMask" + }, + "unapproved": { + "message": "Neaprobat" + }, + "units": { + "message": "unități" + }, + "unknown": { + "message": "Necunoscută" + }, + "unknownNetwork": { + "message": "ReÈ›ea privată necunoscută" + }, + "unknownQrCode": { + "message": "Eroare: Acel cod QR nu a putut fi identificat" + }, + "unknownCameraErrorTitle": { + "message": "Hopa! A apărut o eroare..." + }, + "unknownCameraError": { + "message": "A survenit o eroare la accesarea camerei. ÃŽncercaÈ›i din nou..." + }, + "unlock": { + "message": "Deblochează" + }, + "unlockMessage": { + "message": "Web-ul descentralizat aÈ™teaptă" + }, + "updatedWithDate": { + "message": "Actualizat $1" + }, + "urlErrorMsg": { + "message": "URL necesită prefixul potrivit HTTP/HTTPS." + }, + "usedByClients": { + "message": "Folosit de diverÈ™i clienÈ›i" + }, + "userName": { + "message": "Nume utilizator" + }, + "viewAccount": { + "message": "AfiÈ™aÈ›i contul" + }, + "viewinExplorer": { + "message": "Vizualizare în Explorator" + }, + "viewContact": { + "message": "Vizualizare contact" + }, + "viewOnCustomBlockExplorer": { + "message": "VizualizaÈ›i la $1" + }, + "viewOnEtherscan": { + "message": "VizualizaÈ›i pe Etherscan" + }, + "visitWebSite": { + "message": "AccesaÈ›i site-ul nostru" + }, + "walletSeed": { + "message": "Sursă portofel" + }, + "welcomeBack": { + "message": "Bine ai revenit!" + }, + "welcome": { + "message": "Bun venit la MetaMask" + }, + "writePhrase": { + "message": "ScrieÈ›i această expresie pe o bucată de hârtie È™i păstraÈ›i-o într-un loc sigur. Dacă vreÈ›i È™i mai multă securitate, notaÈ›i-o pe mai multe bucăți de hârtie È™i păstraÈ›i-le în 2 - 3 locuri diferite." + }, + "yesLetsTry": { + "message": "Da, să încercăm" + }, + "youNeedToAllowCameraAccess": { + "message": "Trebuie să permiteÈ›i accesul la cameră pentru a folosi această funcÈ›ie." + }, + "yourSigRequested": { + "message": "Semnătura dvs. este solicitată" + }, + "youSign": { + "message": "SemnaÈ›i" + }, + "yourPrivateSeedPhrase": { + "message": "Expresia dvs. seed privată" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "PreÈ› gas zero la accelerare" + } +} diff --git a/app/_locales/ru/messages.json b/app/_locales/ru/messages.json index e56441186cee..24ea1aa245f1 100644 --- a/app/_locales/ru/messages.json +++ b/app/_locales/ru/messages.json @@ -1,52 +1,7 @@ { - "privacyMode": { - "message": "Режим конфиденциальноÑти" - }, - "privacyModeDescription": { - "message": "Веб-Ñайты должны запрашивать доÑтуп Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра информации об учетной запиÑи." - }, - "exposeAccounts": { - "message": "Открыть Ñчета" - }, - "exposeDescription": { - "message": "Выводить Ñчета на текущий веб-Ñайт. Полезно Ð´Ð»Ñ Ñтарых dapps." - }, - "confirmExpose": { - "message": "Ð’Ñ‹ уверены, что хотите открыть Ñвои аккаунты на текущем веб-Ñайте?" - }, - "confirmClear": { - "message": "Ð’Ñ‹ уверены, что хотите очиÑтить утвержденные веб-Ñайты?Tem certeza de que deseja limpar sites aprovados?" - }, - "clearApprovalDataSuccess": { - "message": "Утвержденные данные веб-Ñайта уÑпешно удалены." - }, - "approvalData": { - "message": "Данные об утверждении" - }, - "approvalDataDescription": { - "message": "ОчиÑтите утвержденные данные веб-Ñайта, чтобы вÑе Ñайты Ñнова запроÑили подтверждение." - }, - "clearApprovalData": { - "message": "Четкие данные об утверждении" - }, - "approve": { - "message": "Одобрить" - }, "reject": { "message": "Отклонить" }, - "providerAPIRequest": { - "message": "Ð—Ð°Ð¿Ñ€Ð¾Ñ API Web3" - }, - "reviewProviderRequest": { - "message": "ПроÑмотрите Ñтот Ð·Ð°Ð¿Ñ€Ð¾Ñ API Ethereum." - }, - "providerRequestInfo": { - "message": "Домен, указанный ниже, пытаетÑÑ Ð·Ð°Ð¿Ñ€Ð¾Ñить доÑтуп к API-интерфейÑу Ethereum, чтобы он мог взаимодейÑтвовать Ñ Ð±Ð»Ð¾ÐºÑ‡ÐµÐ¹Ð½Ð¾Ð¼ Ethereum. Ð’Ñегда проверÑйте, что вы находитеÑÑŒ на правильном Ñайте, прежде чем одобрÑть доÑтуп к веб-Ñайту." - }, - "accept": { - "message": "ПринÑть" - }, "account": { "message": "Счет" }, @@ -56,12 +11,6 @@ "accountName": { "message": "Ðазвание Ñчета" }, - "address": { - "message": "ÐдреÑ" - }, - "addCustomToken": { - "message": "Добавить пользовательÑкий токен" - }, "addToken": { "message": "Добавить токен" }, @@ -71,9 +20,6 @@ "amount": { "message": "Сумма" }, - "amountPlusGas": { - "message": "Сумма + газ" - }, "appDescription": { "message": "РаÑширение браузера Ð´Ð»Ñ Ethereum", "description": "The description of the application" @@ -82,6 +28,9 @@ "message": "MetaMask", "description": "The name of the application" }, + "approve": { + "message": "Одобрить" + }, "approved": { "message": "Одобрена" }, @@ -91,46 +40,18 @@ "attributions": { "message": "ÐтрибуциÑ" }, - "available": { - "message": "ДоÑтупный" - }, "back": { "message": "Ðазад" }, "balance": { "message": "БаланÑ:" }, - "balances": { - "message": "Ваш баланÑ" - }, - "balanceIsInsufficientGas": { - "message": "ÐедоÑтаточный Ð±Ð°Ð»Ð°Ð½Ñ Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ объема газа" - }, - "beta": { - "message": "BETA" - }, - "betweenMinAndMax": { - "message": "должно быть больше или равно $1 и меньше или равно $2.", - "description": "helper for inputting hex as decimal input" - }, "blockiesIdenticon": { "message": "ИÑпользовать Blockies Identicon" }, - "borrowDharma": { - "message": "ВзÑть в долг на Dharma (Beta)" - }, "builtInCalifornia": { "message": "MetaMask Ñпроектирован и разработан в Калифорнии." }, - "buy": { - "message": "Купить" - }, - "buyCoinbase": { - "message": "Купить на Coinbase" - }, - "buyCoinbaseExplainer": { - "message": "Биржа Coinbase – Ñто наиболее популÑрный ÑпоÑоб купить или продать Bitcoin, Ethereum и Litecoin." - }, "buyCoinSwitch": { "message": "Купить на CoinSwitch" }, @@ -143,32 +64,26 @@ "cancel": { "message": "Отмена" }, - "classicInterface": { - "message": "ИÑпользовать клаÑÑичеÑкий интерфейÑ" - }, - "clickCopy": { - "message": "Ðажмите, чтобы Ñкопировать" - }, "confirm": { "message": "Подтвердить" }, "confirmed": { "message": "Подтверждена" }, - "confirmContract": { - "message": "Подтвердить контракт" - }, "confirmPassword": { "message": "Подтвердите пароль" }, - "confirmTransaction": { - "message": "Подтвердить транзакцию" + "connectingToKovan": { + "message": "Соединение Ñ Ñ‚ÐµÑтовой Ñетью Kovan" }, - "continue": { - "message": "Продолжить" + "connectingToMainnet": { + "message": "Соединение Ñ Ð¾Ñновной Ñетью Ethereum" }, - "continueToCoinbase": { - "message": "Продолжить в Coinbase" + "connectingToRopsten": { + "message": "Соединение Ñ Ñ‚ÐµÑтовой Ñетью Ropsten" + }, + "connectingToRinkeby": { + "message": "Соединение Ñ Ñ‚ÐµÑтовой Ñетью Rinkeby" }, "continueToCoinSwitch": { "message": "Продолжить в CoinSwitch" @@ -176,30 +91,12 @@ "contractDeployment": { "message": "Развертывание контракта" }, - "conversionProgress": { - "message": "ВыполнÑетÑÑ ÐºÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð°Ñ†Ð¸Ñ" - }, - "copiedButton": { - "message": "Скопировано" - }, - "copiedClipboard": { - "message": "Скопировано в буфер обмена" - }, "copiedExclamation": { "message": "Скопировано!" }, - "copiedSafe": { - "message": "Я Ñкопировал Ñто в безопаÑное меÑто" - }, - "copy": { - "message": "Скопировать" - }, "copyToClipboard": { "message": "Скопировать в буфер обмена" }, - "copyButton": { - "message": " Скопировать " - }, "copyPrivateKey": { "message": "Это ваш закрытый ключ (нажмите, чтобы Ñкопировать)" }, @@ -209,31 +106,18 @@ "createAccount": { "message": "Создать Ñчет" }, - "createDen": { - "message": "Создать" - }, - "crypto": { - "message": "Криптовалюта", - "description": "Exchange type (cryptocurrencies)" - }, - "currentConversion": { - "message": "Ð¢ÐµÐºÑƒÑ‰Ð°Ñ ÐºÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð°Ñ†Ð¸Ñ" - }, - "currentNetwork": { - "message": "Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ñеть" - }, "customGas": { "message": "ÐаÑтроить газ" }, "customToken": { "message": "ПользовательÑкий токен" }, - "customize": { - "message": "ÐаÑтроить" - }, "customRPC": { "message": "ПользовательÑкий RPC" }, + "dataBackupFoundInfo": { + "message": "Ðекоторые данные вашей учетной запиÑи были ÑкÑпортированы во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰ÐµÐ¹ уÑтановки MetaMask. Это может включать ваши наÑтройки, контакты и токены. Ð’Ñ‹ хотите импортировать Ñти данные ÑейчаÑ?" + }, "decimalsMustZerotoTen": { "message": "КоличеÑтво деÑÑтичных разрÑдов должно быть минимум 0 и макÑимум 36." }, @@ -243,39 +127,15 @@ "defaultNetwork": { "message": "ОÑÐ½Ð¾Ð²Ð½Ð°Ñ Ñеть Ethereum – Ñто Ñеть по умолчанию Ð´Ð»Ñ Ether транзакций." }, - "denExplainer": { - "message": "DEN – Ñто зашифрованное паролем хранилище внутри MetaMask." - }, "deposit": { "message": "Пополнить" }, - "depositBTC": { - "message": "Отправьте ваш BTC на Ð°Ð´Ñ€ÐµÑ Ð½Ð¸Ð¶Ðµ:" - }, - "depositEth": { - "message": "Пополнить Eth" - }, "depositEther": { "message": "Пополнить Ether" }, - "depositFiat": { - "message": "Пополнить деньгами" - }, - "depositFromAccount": { - "message": "Пополнить Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð³Ð¾ Ñчета" - }, - "depositShapeShift": { - "message": "Пополнить через ShapeShift" - }, - "depositShapeShiftExplainer": { - "message": "ЕÑли у Ð²Ð°Ñ ÐµÑть другие криптовалюты, вы можете торговать и пополнÑть Ether напрÑмую в ваш MetaMask кошелек. Ðет необходимоÑти в Ñчете." - }, "details": { "message": "Детали" }, - "directDeposit": { - "message": "ПрÑмое пополнение" - }, "directDepositEther": { "message": "ПрÑмое пополнение Ether" }, @@ -294,33 +154,15 @@ "edit": { "message": "Редактировать" }, - "editAccountName": { - "message": "Редактировать название Ñчета" - }, - "emailUs": { - "message": "СвÑжитеÑÑŒ Ñ Ð½Ð°Ð¼Ð¸ по Ñлектронной почте!" - }, - "encryptNewDen": { - "message": "Зашифровать ваш новый DEN" - }, "enterPassword": { "message": "Введите пароль" }, - "enterPasswordConfirm": { - "message": "Введите ваш пароль Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ" - }, "etherscanView": { "message": "ПроÑмотреть Ñчет на Etherscan" }, - "exchangeRate": { - "message": "Обменный курÑ" - }, "exportPrivateKey": { "message": "ЭкÑпортировать закрытый ключ" }, - "exportPrivateKeyWarning": { - "message": "Ð’Ñ‹ ÑкÑпортируете закрытые ключи на Ñвой Ñтрах и риÑк." - }, "failed": { "message": "Ðеудачна" }, @@ -332,49 +174,18 @@ "message": "Ðе работает импорт файла? Ðажмите тут!", "description": "Helps user import their account from a JSON file" }, - "followTwitter": { - "message": "Читайте Ð½Ð°Ñ Ð² Twitter" - }, "from": { "message": "Отправитель" }, - "fromToSame": { - "message": "ÐÐ´Ñ€ÐµÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÐµÐ»Ñ Ð¸ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ могут быть одинаковыми" - }, - "fromShapeShift": { - "message": "Из ShapeShift" - }, - "gas": { - "message": "Газ", - "description": "Short indication of gas cost" - }, - "gasFee": { - "message": "КомиÑÑÐ¸Ñ Ð·Ð° газ" - }, "gasLimit": { "message": "Лимит газа" }, - "gasLimitCalculation": { - "message": "Мы раÑчитываем предлагаемый лимит газа на оÑновании уÑпешных Ñтавок в Ñети." - }, - "gasLimitRequired": { - "message": "УÑтановите лимит газа" - }, "gasLimitTooLow": { "message": "Лимит газа должен быть как минимум 21000" }, - "generatingSeed": { - "message": "Генерируем фразу..." - }, "gasPrice": { "message": "Цена за газ (GWEI)" }, - "gasPriceCalculation": { - "message": "Мы раÑчитываем предлагаемые цены за газ на оÑновании уÑпешных Ñтавок в Ñети." - }, - "gasPriceRequired": { - "message": "УÑтановите ÑтоимоÑть газа" - }, "getEther": { "message": "Получить Ether" }, @@ -382,32 +193,16 @@ "message": "Получить Ether из крана Ð´Ð»Ñ $1", "description": "Displays network name for Ether faucet" }, - "greaterThanMin": { - "message": "должно быть больше или равно $1.", - "description": "helper for inputting hex as decimal input" - }, "here": { "message": "тут", "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, - "hereList": { - "message": "Вот ÑпиÑок!!!!" - }, "hide": { "message": "Скрыть" }, - "hideToken": { - "message": "Скрыть токен" - }, "hideTokenPrompt": { "message": "Скрыть токен?" }, - "howToDeposit": { - "message": "Как бы вы хотели пополнить Ether?" - }, - "holdEther": { - "message": "ПозволÑет вам хранить ether и токены и Ñлужит в качеÑтве моÑта в децентрализированные приложениÑ." - }, "import": { "message": "Импортировать", "description": "Button to import an account from a selected file" @@ -418,12 +213,6 @@ "importAccountMsg": { "message": " Импортированные Ñчета не будут аÑÑоциированы Ñ Ð²Ð°ÑˆÐµÐ¹ ключевой фразой, Ñозданной MetaMask. Узнать больше про импорт Ñчетов " }, - "importAnAccount": { - "message": "Импортировать аккаунт" - }, - "importDen": { - "message": "Импортировать ÑущеÑтвующий DEN" - }, "imported": { "message": "Импортирован", "description": "status showing that an account has been fully loaded into the keyring" @@ -443,74 +232,43 @@ "invalidAddressRecipient": { "message": "Ðеверный Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ" }, - "invalidGasParams": { - "message": "Ðеверные параметры газа" - }, "invalidInput": { "message": "Ðеверный ввод." }, - "invalidRequest": { - "message": "Ðеверный запроÑ" - }, "invalidRPC": { "message": "Ðеверный RPC URI" }, - "jsonFail": { - "message": "Что-то пошло не так. УбедитеÑÑŒ, что ваш JSON файл правильно отформатирован." + "invalidBlockExplorerURL": { + "message": "Ðеверный Block Explorer URI" }, "jsonFile": { "message": "JSON файл", "description": "format for importing an account" }, - "keepTrackTokens": { - "message": "Следите за купленными вами токенами Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ аккаунта MetaMask." - }, "kovan": { "message": "ТеÑÑ‚Ð¾Ð²Ð°Ñ Ñеть Kovan" }, - "knowledgeDataBase": { - "message": "ПоÑмотрите нашу Базу Знаний" - }, "max": { "message": "МакÑимум" }, "learnMore": { "message": "Узнать больше." }, - "lessThanMax": { - "message": "должно быть меньше или равно $1.", - "description": "helper for inputting hex as decimal input" - }, "likeToAddTokens": { "message": "Ð’Ñ‹ хотите добавить Ñти токены?" }, "links": { "message": "СÑылки" }, - "limit": { - "message": "Лимит" - }, "loading": { "message": "Загрузка..." }, "loadingTokens": { "message": "Загрузка токенов..." }, - "localhost": { - "message": "Localhost 8545" - }, - "login": { - "message": "Вход" - }, - "logout": { + "lock": { "message": "Выход" }, - "loose": { - "message": "ÐеÑвÑзанный" - }, - "loweCaseWords": { - "message": "ÐºÐ»ÑŽÑ‡ÐµÐ²Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° может Ñодержать только Ñимволы нижнего региÑтра" - }, "mainnet": { "message": "ОÑÐ½Ð¾Ð²Ð½Ð°Ñ Ñеть Ethereum" }, @@ -520,9 +278,6 @@ "metamaskDescription": { "message": "MetaMask – безопаÑный кошелек Ð´Ð»Ñ Ethereum." }, - "min": { - "message": "Минимум" - }, "myAccounts": { "message": "Мои Ñчета" }, @@ -536,10 +291,6 @@ "message": "Ð’Ñ‹ должны выбрать файл Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð°.", "description": "User is important an account and needs to add a file to continue" }, - "needImportPassword": { - "message": "Ð’Ñ‹ должны ввеÑти пароль Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð³Ð¾ файла.", - "description": "Password and file needed to import an account" - }, "negativeETH": { "message": "Ðевозможно отправить отрицательную Ñумму ETH." }, @@ -559,67 +310,22 @@ "newPassword": { "message": "Ðовый пароль (мин. 8 Ñимволов)" }, - "newRecipient": { - "message": "Ðовый получатель" - }, - "newRPC": { - "message": "Ðовый RPC URL" - }, "next": { "message": "Далее" }, "noAddressForName": { "message": "Дла Ñтого Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ уÑтановлен адреÑ." }, - "noDeposits": { - "message": "ÐŸÐ¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½Ðµ получены" - }, - "noTransactionHistory": { - "message": "Ðет иÑтории транзакций." - }, "noTransactions": { "message": "Ðет транзакций" }, - "notStarted": { - "message": "Ðе запущен" - }, - "oldUI": { - "message": "Ð¡Ñ‚Ð°Ñ€Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа" - }, - "oldUIMessage": { - "message": "Ð’Ñ‹ вернулиÑÑŒ к Ñтарой верÑии интерфейÑа пользователÑ. Ð’Ñ‹ можете переключитьÑÑ Ð½Ð° новую Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ опции выпадающего меню в правом верхнем углу." - }, - "or": { - "message": "или", - "description": "choice between creating or importing a new account" - }, - "passwordCorrect": { - "message": "УбедитеÑÑŒ, что ваш пароль верный." - }, - "passwordMismatch": { - "message": "пароли не Ñовпадают", - "description": "in password creation process, the two new password fields did not match" - }, - "passwordShort": { - "message": "пароль недоÑтаточно длинный", - "description": "in password creation process, the password is not long enough to be secure" - }, "pastePrivateKey": { "message": "Ð’Ñтавьте ваш закрытый ключ тут:", "description": "For importing an account from a private key" }, - "pasteSeed": { - "message": "Ð’Ñтавьте вашу ключевую фразу!" - }, "personalAddressDetected": { "message": "Обнаружен перÑональный адреÑ. Введите Ð°Ð´Ñ€ÐµÑ ÐºÐ¾Ð½Ñ‚Ñ€Ð°ÐºÑ‚Ð° токена." }, - "pleaseReviewTransaction": { - "message": "Проверьте транзакцию." - }, - "popularTokens": { - "message": "ПопулÑрные токены" - }, "privacyMsg": { "message": "Политика конфиденциальноÑти" }, @@ -633,27 +339,12 @@ "privateNetwork": { "message": "ЧаÑÑ‚Ð½Ð°Ñ Ñеть" }, - "qrCode": { - "message": "Показать QR-код" - }, "readdToken": { "message": "Ð’Ñ‹ можете в будущем добавить обратно Ñтот токен, выбрав пункт меню “Добавить токенâ€." }, - "readMore": { - "message": "Узнать больше тут." - }, - "readMore2": { - "message": "Узнать больше." - }, - "receive": { - "message": "Получить" - }, "recipientAddress": { "message": "ÐÐ´Ñ€ÐµÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ" }, - "refundAddress": { - "message": "Ваш Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‚Ð° ÑредÑтв" - }, "rejected": { "message": "Отклонена" }, @@ -663,86 +354,36 @@ "restoreFromSeed": { "message": "ВоÑÑтановить из ключевой фразы" }, - "restoreVault": { - "message": "ВоÑÑтановить кошелек" - }, "required": { "message": "ОбÑзательное поле" }, - "retryWithMoreGas": { - "message": "Повторите попытку Ñ Ð±Ð¾Ð»ÑŒÑˆÐµÐ¹ ценой за газRetry with a higher gas price here" - }, - "walletSeed": { - "message": "ÐšÐ»ÑŽÑ‡ÐµÐ²Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° кошелька" - }, "revealSeedWords": { "message": "Показать ключевую фразу" }, "revealSeedWordsWarning": { "message": "Ðе воÑÑтанавливайте ключевую фразу в общеÑтвенном меÑте! Она может быть иÑпользована Ð´Ð»Ñ ÐºÑ€Ð°Ð¶Ð¸ вÑех ваших Ñчетов." }, - "revert": { - "message": "ВоÑÑтановить" - }, "rinkeby": { "message": "ТеÑÑ‚Ð¾Ð²Ð°Ñ Ñеть Rinkeby" }, "ropsten": { "message": "ТеÑÑ‚Ð¾Ð²Ð°Ñ Ñеть Ropsten" }, - "currentRpc": { - "message": "Current RPC" - }, - "connectingToMainnet": { - "message": "Соединение Ñ Ð¾Ñновной Ñетью Ethereum" - }, - "connectingToRopsten": { - "message": "Соединение Ñ Ñ‚ÐµÑтовой Ñетью Ropsten" - }, - "connectingToKovan": { - "message": "Соединение Ñ Ñ‚ÐµÑтовой Ñетью Kovan" - }, - "connectingToRinkeby": { - "message": "Соединение Ñ Ñ‚ÐµÑтовой Ñетью Rinkeby" - }, - "connectingToUnknown": { - "message": "Соединение Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑтной Ñетью" - }, - "sampleAccountName": { - "message": "Ðапример, Мой новый Ñчет", - "description": "Help user understand concept of adding a human-readable name to their account" - }, "save": { "message": "Сохранить" }, - "saveAsFile": { - "message": "Сохранить в виде файла", - "description": "Account export process" - }, - "saveSeedAsFile": { - "message": "Сохранить ключевую фразу в виде файла" - }, "search": { "message": "ПоиÑк" }, "secretPhrase": { "message": "Введите вашу ключевую фразу из 12 Ñлов, чтобы воÑÑтановить кошелек." }, - "newPassword8Chars": { - "message": "Ðовый пароль (мин. 8 Ñимволов)" - }, "seedPhraseReq": { "message": "ключевые фразы имеют длину 12 Ñлов" }, - "select": { - "message": "Выбрать" - }, "selectCurrency": { "message": "Выберите валюту" }, - "selectService": { - "message": "Выберите ÑервиÑ" - }, "selectType": { "message": "Выберите тип" }, @@ -755,54 +396,30 @@ "sendTokens": { "message": "Отправить токены" }, - "onlySendToEtherAddress": { - "message": "ОтправлÑйте ETH только на Ethereum адреÑа." - }, "searchTokens": { "message": "ПоиÑк токенов" }, - "sendTokensAnywhere": { - "message": "Отправить токены любому, у кого еÑть Ñчет Ethereum" - }, "settings": { "message": "ÐаÑтройки" }, - "info": { - "message": "ИнформациÑ" - }, - "shapeshiftBuy": { - "message": "Купить через Shapeshift" - }, "showPrivateKeys": { "message": "Показать закрытые ключи" }, - "showQRCode": { - "message": "Показать QR-код" - }, "sign": { "message": "ПодпиÑÑŒ" }, + "signatureRequest": { + "message": "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñи" + }, "signed": { "message": "ПодпиÑана" }, - "signMessage": { - "message": "ПодпиÑать Ñообщение" - }, "signNotice": { "message": "ПодпиÑÑŒ Ñтого ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ иметь \nопаÑные побочные Ñффекты. ПодпиÑывайте только ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ \nÑ Ñайтов, которым вы полноÑтью доверÑете Ñвой аккаунт. Этот опаÑный метод будет удален в будущей верÑии." }, "sigRequest": { "message": "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñи" }, - "sigRequested": { - "message": "ПодпиÑÑŒ запрошена" - }, - "spaceBetween": { - "message": "между Ñловами может быть только пробел" - }, - "status": { - "message": "СтатуÑ" - }, "stateLogs": { "message": "Журнал ÑоÑтоÑниÑ" }, @@ -812,9 +429,6 @@ "stateLogError": { "message": "Ошибка при получении журнала ÑоÑтоÑниÑ." }, - "submit": { - "message": "Отправить" - }, "submitted": { "message": "Отправлена" }, @@ -822,10 +436,7 @@ "message": "Перейти в наш Центр поддержки" }, "symbolBetweenZeroTwelve": { - "message": "Символ должен быть от 0 до 12 Ñимволов." - }, - "takesTooLong": { - "message": "Слишком долго?" + "message": "Символ должен быть не более 11 Ñимволов." }, "terms": { "message": "УÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ" @@ -836,112 +447,897 @@ "to": { "message": "Получатель" }, - "toETHviaShapeShift": { - "message": "$1 в ETH через ShapeShift", - "description": "system will fill in deposit type in start of message" - }, - "tokenAddress": { - "message": "ÐÐ´Ñ€ÐµÑ Ñ‚Ð¾ÐºÐµÐ½Ð°" - }, "tokenAlreadyAdded": { "message": "Токен уже был добавлен." }, - "tokenBalance": { - "message": "Ð‘Ð°Ð»Ð°Ð½Ñ Ð²Ð°ÑˆÐ¸Ñ… токенов:" - }, - "tokenSelection": { - "message": "Поищите токен или выберите из нашего ÑпиÑка популÑрных токенов." - }, "tokenSymbol": { "message": "Символ токена" }, - "tokenWarning1": { - "message": "ОтÑлеживаютÑÑ Ñ‚Ð¾ÐºÐµÐ½Ñ‹, купленные на Ñчет в MetaMask. ЕÑли вы купили токены, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ Ñчет, такие токены не будут тут отображены." - }, "total": { "message": "Ð’Ñего" }, - "transactions": { - "message": "транзакции" - }, - "transactionMemo": { - "message": "Транзакционные данные (необÑзательный)" - }, - "transactionNumber": { - "message": "Ðомер транзакции" - }, - "transfers": { - "message": "Переводы" - }, "troubleTokenBalances": { "message": "Возникли проблемы при загрузке баланÑов токенов. Ð’Ñ‹ можете поÑмотреть их ", "description": "Followed by a link (here) to view token balances" }, - "twelveWords": { - "message": "Эти 12 Ñлов ÑвлÑÑŽÑ‚ÑÑ ÐµÐ´Ð¸Ð½Ñтвенной возможноÑтью воÑÑтановить ваши Ñчета в MetaMask.\nСохраните из в надежном Ñекретном меÑте." - }, "typePassword": { "message": "Введите пароль" }, - "uiWelcome": { - "message": "Ðовый Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ (Beta)" - }, - "uiWelcomeMessage": { - "message": "Теперь вы иÑпользуете новый Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ MetaMask. ОÑмотритеÑÑŒ, попробуйте новые функции, например, отправить токены и, еÑли возникнут проблемы, Ñообщите нам." - }, "unapproved": { "message": "Ðе одобрена" }, - "unavailable": { - "message": "ÐедоÑтупный" - }, "unknown": { "message": "ÐеизвеÑтно" }, "unknownNetwork": { "message": "ÐеизвеÑÑ‚Ð½Ð°Ñ Ñ‡Ð°ÑÑ‚Ð½Ð°Ñ Ñеть" }, - "unknownNetworkId": { - "message": "ÐеизвеÑтный идентификатор Ñети" - }, - "uriErrorMsg": { + "urlErrorMsg": { "message": "Ð”Ð»Ñ URI требуетÑÑ ÑоответÑтвующий Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ HTTP/HTTPS." }, - "usaOnly": { - "message": "Только СШÐ", - "description": "Using this exchange is limited to people inside the USA" - }, "usedByClients": { "message": "ИÑпользуетÑÑ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð½Ñ‹Ð¼Ð¸ клиентами" }, - "useOldUI": { - "message": "ИÑпользовать Ñтарый Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" - }, - "validFileImport": { - "message": "Вам нужно выбрать правильный файл Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð°." - }, - "vaultCreated": { - "message": "Кошелек был Ñоздан" - }, "viewAccount": { "message": "ПоÑмотреть Ñчет" }, "visitWebSite": { "message": "Перейти на наш Ñайт" }, - "warning": { - "message": "Предупреждение" + "walletSeed": { + "message": "ÐšÐ»ÑŽÑ‡ÐµÐ²Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° кошелька" }, "welcome": { "message": "Добро пожаловать в MetaMask" }, - "whatsThis": { - "message": "Что Ñто?" - }, "yourSigRequested": { "message": "ЗапрашиваетÑÑ Ð²Ð°ÑˆÐ° подпиÑÑŒ" }, "youSign": { "message": "Ð’Ñ‹ подпиÑываете" + }, + "chartOnlyAvailableEth": { + "message": "Диаграмма доÑтупна только в ÑетÑÑ… Ethereum." + }, + "contractInteraction": { + "message": "ВзаимодейÑтвие Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð°ÐºÑ‚Ð¾Ð¼" + }, + "about": { + "message": "О наÑ" + }, + "aboutSettingsDescription": { + "message": "О выпуÑке, поддержка и контакты" + }, + "acceleratingATransaction": { + "message": "* Увеличение цены газа повышает шанÑÑ‹ на более быÑтрую обработку в Ñети, но Ñто не гарантируетÑÑ." + }, + "accessingYourCamera": { + "message": "ДоÑтуп к вашей камере ..." + }, + "accountOptions": { + "message": "ÐаÑтройки аккаунта" + }, + "accountSelectionRequired": { + "message": "Вам необходимо выбрать учетную запиÑÑŒ!" + }, + "activityLog": { + "message": "Журнал Ñобытий" + }, + "addNetwork": { + "message": "Добавить Ñеть" + }, + "addRecipient": { + "message": "Добавить получателÑ" + }, + "advanced": { + "message": "Продвинутый" + }, + "advancedSettingsDescription": { + "message": "Получите доÑтуп к функциÑм разработчика, журналу Ñобытий, ÑброÑу учетной запиÑи, наÑтройке теÑтовых Ñетей и пользовательÑкий RPC." + }, + "advancedOptions": { + "message": "РаÑширенные наÑтройки" + }, + "addToAddressBook": { + "message": "Добавить в адреÑную книгу" + }, + "addToAddressBookModalPlaceholder": { + "message": "например, Джон Д." + }, + "addAlias": { + "message": "Добавить пÑевдоним" + }, + "addSuggestedTokens": { + "message": "Добавить предложенные токены" + }, + "addAcquiredTokens": { + "message": "Добавьте токены, которые вы приобрели Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ MetaMask" + }, + "asset": { + "message": "Ðктив" + }, + "attemptToCancel": { + "message": "ПопытатьÑÑ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ?" + }, + "attemptToCancelDescription": { + "message": "Отправка Ñтой попытки не гарантирует отмену вашей первоначальной транзакции. ЕÑли попытка отмены окажетÑÑ ÑƒÑпешной комиÑÑÐ¸Ñ Ð·Ð° иÑходную транзакцию будет возвращена." + }, + "autoLockTimeLimit": { + "message": "Таймер автоматичеÑкого выхода из кошелька (минуты)" + }, + "autoLockTimeLimitDescription": { + "message": "УÑтановите Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾ÑÑ‚Ð¾Ñ Ð² минутах, прежде чем MetaMask автоматичеÑки заблокирует кошелек" + }, + "average": { + "message": "Средний" + }, + "backToAll": { + "message": "Ðа главную" + }, + "backupApprovalNotice": { + "message": "Сделайте резервную копию Ñекретного кода воÑÑтановлениÑ, чтобы Ñохранить Ñвой кошелек и ÑредÑтва в безопаÑноÑти." + }, + "backupApprovalInfo": { + "message": "Этот Ñекретный код необходим Ð´Ð»Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ кошелька в Ñлучае, еÑли вы потерÑете Ñвое уÑтройÑтво, забудете пароль, придетÑÑ Ð¿ÐµÑ€ÐµÑƒÑтановить MetaMask или захотите получить доÑтуп к Ñвоему кошельку на другом уÑтройÑтве." + }, + "backupNow": { + "message": "Создать копию ÑейчаÑ" + }, + "balanceOutdated": { + "message": "Ð‘Ð°Ð»Ð°Ð½Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть уÑтаревшим" + }, + "basic": { + "message": "Базовый" + }, + "blockExplorerUrl": { + "message": "Блок-ÑкÑплорер" + }, + "blockExplorerView": { + "message": "ПоÑмотреть аккаунт на $1" + }, + "browserNotSupported": { + "message": "Ваш браузер не поддерживаетÑÑ..." + }, + "buyWithWyre": { + "message": "Купить ETH на Wyre" + }, + "buyWithWyreDescription": { + "message": "Wyre позволÑет вам покупать ETH иÑпользую кредитную карту, прÑмо на ваш Ñчет в MetaMask." + }, + "bytes": { + "message": "Байт" + }, + "off": { + "message": "Откл" + }, + "on": { + "message": "Вкл" + }, + "optionalBlockExplorerUrl": { + "message": "URL блок-ÑкÑплорера (необÑзательно)" + }, + "cancelAttempt": { + "message": "Попытка отмены транзакции" + }, + "cancellationGasFee": { + "message": "КомиÑÑÐ¸Ñ Ð·Ð° газ на отмену" + }, + "cancelled": { + "message": "Отменена" + }, + "chainId": { + "message": "ID Ñети" + }, + "clickToRevealSeed": { + "message": "Ðажмите здеÑÑŒ, чтобы показать Ñекретную фразу (Ñид)" + }, + "close": { + "message": "Закрыть" + }, + "chromeRequiredForHardwareWallets": { + "message": "Вам необходимо иÑпользовать MetaMask в Google Chrome, чтобы подключитьÑÑ Ðº Ñвоему аппаратному кошельку." + }, + "confirmSecretBackupPhrase": { + "message": "Подтвердите вашу резервную Ñекретную фразу" + }, + "congratulations": { + "message": "ПоздравлÑÑŽ!" + }, + "connectHardwareWallet": { + "message": "Подключите аппаратный кошелек" + }, + "connect": { + "message": "ПодключитьÑÑ" + }, + "connectingTo": { + "message": "Подключение к $1" + }, + "connectingToLocalhost": { + "message": "Подключение к Localhost:8545" + }, + "connectingToGoerli": { + "message": "Подключение к теÑтовой Ñети Goerli" + }, + "continueToWyre": { + "message": "Продолжить на Wyre" + }, + "copyAddress": { + "message": "Скопировать Ð°Ð´Ñ€ÐµÑ Ð² буфер обмена" + }, + "copyTransactionId": { + "message": "Скопировать идентификатор транзакции" + }, + "copiedTransactionId": { + "message": "Идентификатор транзакции Ñкопирован" + }, + "createAWallet": { + "message": "Создать кошелек" + }, + "createPassword": { + "message": "Придумайте пароль" + }, + "currencyConversion": { + "message": "ÐšÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð°Ñ†Ð¸Ñ Ð²Ð°Ð»ÑŽÑ‚Ñ‹" + }, + "currentLanguage": { + "message": "Текущий Ñзык" + }, + "customGasSubTitle": { + "message": "Увеличение платы может Ñократить Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸, но Ñто не гарантируетÑÑ." + }, + "delete": { + "message": "Удалить" + }, + "deleteAccount": { + "message": "Удалить аккаунт" + }, + "downloadGoogleChrome": { + "message": "Скачать Google Chrome" + }, + "downloadSecretBackup": { + "message": "Загрузите Ñекретную резервную фразу и Ñохраните ее в безопаÑном меÑте на внешнем зашифрованном жеÑтком диÑке или ином ноÑителе." + }, + "dontHaveAHardwareWallet": { + "message": "Ðет аппаратного кошелька?" + }, + "editContact": { + "message": "Изменить контакт" + }, + "endOfFlowMessage1": { + "message": "Ð’Ñ‹ прошли теÑтирование - ÑохранÑйте Ñвою иÑходную фразу в безопаÑноÑти, Ñто ваша ответÑтвенноÑть!" + }, + "endOfFlowMessage2": { + "message": "Советы по безопаÑному хранению активов" + }, + "endOfFlowMessage3": { + "message": "Сохраните резервную копию в неÑкольких меÑтах." + }, + "endOfFlowMessage4": { + "message": "Ðикогда не делиÑÑŒ фразой ни Ñ ÐºÐµÐ¼." + }, + "endOfFlowMessage5": { + "message": "Будьте оÑторожны Ñ Ñ„Ð¸ÑˆÐ¸Ð½Ð³Ð¾Ð¼! MetaMask никогда не будет Ñамопроизвольно запрашивать вашу начальную фразу." + }, + "endOfFlowMessage6": { + "message": "ЕÑли вам нужно Ñнова Ñоздать резервную копию иÑходной фразы, вы можете найти ее в «ÐаÑтройки» -> «БезопаÑноÑть»." + }, + "endOfFlowMessage7": { + "message": "ЕÑли у Ð²Ð°Ñ ÐµÑть вопроÑÑ‹ или вы видите что-то подозрительное, пишите на support@metamask.io." + }, + "endOfFlowMessage8": { + "message": "MetaMask не может воÑÑтановить вашу начальную фразу. Узнать больше." + }, + "endOfFlowMessage9": { + "message": "Узнать больше" + }, + "endOfFlowMessage10": { + "message": "Завершено" + }, + "ensRegistrationError": { + "message": "Ошибка в региÑтрации имени ENS" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "Ð˜Ð¼Ñ ENS не найдено в текущей Ñети. Попробуйте переключитьÑÑ Ð½Ð° оÑновную Ñеть Ethereum" + }, + "enterAnAlias": { + "message": "Введите алиаÑ" + }, + "enterPasswordContinue": { + "message": "Введите пароль Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ" + }, + "ethereumPublicAddress": { + "message": "Публичный Ð°Ð´Ñ€ÐµÑ Ethereum" + }, + "estimatedProcessingTimes": { + "message": "Ожидаемое Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸" + }, + "expandView": { + "message": "Развернуть" + }, + "fast": { + "message": "БыÑтро" + }, + "faster": { + "message": "БыÑтрее" + }, + "forgetDevice": { + "message": "Забыть уÑтройÑтво" + }, + "functionType": { + "message": "Тип функции" + }, + "gasLimitInfoModalContent": { + "message": "Лимит газа - Ñто макÑимальное количеÑтво единиц газа, которое вы готовы потратить." + }, + "gasUsed": { + "message": "Газа иÑпользовано" + }, + "gasPriceExtremelyLow": { + "message": "Цена на газ Ñлишком низкаÑ" + }, + "gasPriceInfoModalContent": { + "message": "Цена на газ указывает количеÑтво Ñфира, которое вы готовы платить за каждую единицу газа." + }, + "gasPriceNoDenom": { + "message": "Цена на газ" + }, + "general": { + "message": "ОÑновное" + }, + "generalSettingsDescription": { + "message": "ÐšÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð°Ñ†Ð¸Ñ Ð²Ð°Ð»ÑŽÑ‚Ñ‹, оÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð²Ð°Ð»ÑŽÑ‚Ð°, Ñзык, идентификаторы блоков" + }, + "getHelp": { + "message": "Получить помощь." + }, + "getStarted": { + "message": "Ðачать" + }, + "happyToSeeYou": { + "message": "Мы рады видеть ваÑ." + }, + "hardware": { + "message": "Ðппаратные кошельки" + }, + "hardwareWalletConnected": { + "message": "Ðппаратный кошелек подключен" + }, + "hardwareWallets": { + "message": "Подключите аппаратный кошелек" + }, + "hardwareWalletsMsg": { + "message": "Выберите аппаратный кошелек, который вы хотите иÑпользовать Ñ MetaMask" + }, + "havingTroubleConnecting": { + "message": "Возникли проблемы Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸ÐµÐ¼?" + }, + "hexData": { + "message": "ШеÑтнадцатеричные данные" + }, + "history": { + "message": "ИÑториÑ" + }, + "importAccountSeedPhrase": { + "message": "Импортировать аккаунт Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñекретной фразы (Ñида)" + }, + "importWallet": { + "message": "Импортировать кошелек" + }, + "importYourExisting": { + "message": "Импортируйте ÑущеÑтвующий кошелек, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñекретную фразу из 12 Ñлов" + }, + "importUsingSeed": { + "message": "Импортировать иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñекретную фразу (Ñид)" + }, + "initialTransactionConfirmed": { + "message": "Ваша Ð¿ÐµÑ€Ð²Ð¾Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð±Ñ‹Ð»Ð° подтверждена Ñетью. Ðажмите OK, чтобы вернутьÑÑ." + }, + "insufficientBalance": { + "message": "ÐедоÑтаточный баланÑ." + }, + "knownAddressRecipient": { + "message": "ИзвеÑтный Ð°Ð´Ñ€ÐµÑ ÐºÐ¾Ð½Ñ‚Ñ€Ð°ÐºÑ‚Ð°" + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "ÐÐ´Ñ€ÐµÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ принадлежит Ñети Eth" + }, + "invalidSeedPhrase": { + "message": "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ñ„Ñ€Ð°Ð·Ð°" + }, + "ledgerAccountRestriction": { + "message": "Вам нужно иÑпользовать Ñвой поÑледний аккаунт, прежде чем вы Ñможете добавить новый." + }, + "letsGoSetUp": { + "message": "Да, давайте приÑтупим!" + }, + "liveGasPricePredictions": { + "message": "Прогноз цены газа в режиме реального времени" + }, + "loadMore": { + "message": "Загрузить еще" + }, + "memorizePhrase": { + "message": "Запомните Ñту фразу." + }, + "memo": { + "message": "Мнемотик" + }, + "metamaskVersion": { + "message": "ВерÑÐ¸Ñ MetaMask" + }, + "mobileSyncText": { + "message": "ПожалуйÑта, введите ваш пароль, чтобы подтвердить, что Ñто вы!" + }, + "myWalletAccounts": { + "message": "Мои кошельки" + }, + "myWalletAccountsDescription": { + "message": "Ð’Ñе ваши учетные запиÑи, Ñозданные в MetaMask, будут автоматичеÑки добавлены в Ñтот раздел." + }, + "networkName": { + "message": "Ð˜Ð¼Ñ Ñети" + }, + "networkSettingsDescription": { + "message": "Добавить и редактировать пользовательÑкие Ñети RPC" + }, + "nevermind": { + "message": "Ðе берите в голову" + }, + "newAccountDetectedDialogMessage": { + "message": "Обнаружен новый адреÑ. Ðажмите здеÑÑŒ, чтобы добавить в вашу адреÑную книгу." + }, + "newContact": { + "message": "Ðовый контакт" + }, + "newNetwork": { + "message": "ÐÐ¾Ð²Ð°Ñ Ñеть" + }, + "newToMetaMask": { + "message": "Впервые в MetaMask?" + }, + "noAlreadyHaveSeed": { + "message": "Ðет, у Ð¼ÐµÐ½Ñ ÑƒÐ¶Ðµ еÑть Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ñ„Ñ€Ð°Ð·Ð°" + }, + "protectYourKeys": { + "message": "Защитите Ñвои ключи!" + }, + "protectYourKeysMessage1": { + "message": "Будьте оÑторожны Ñ Ð¸Ñходной фразой - были ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ Ñайтах, которые пытаютÑÑ Ð¿Ð¾Ð´Ñ€Ð°Ð¶Ð°Ñ‚ÑŒ MetaMask. MetaMask никогда не запрашивает Ñекретную фразу (Ñид)!" + }, + "protectYourKeysMessage2": { + "message": "Держите вашу фразу в безопаÑноÑти. ЕÑли вы видите что-то подозрительное или ÑомневаетеÑÑŒ в веб-Ñайте, напишите support@metamask.io" + }, + "rpcUrl": { + "message": "Ðовый RPC URL" + }, + "optionalChainId": { + "message": "ID Ñети (необÑзательно)" + }, + "optionalSymbol": { + "message": "Символ (необÑзательно)" + }, + "newTotal": { + "message": "Итого" + }, + "newTransactionFee": { + "message": "Плата за новую транзакцию" + }, + "noConversionRateAvailable": { + "message": "КурÑÑ‹ валют недоÑтупны" + }, + "noThanks": { + "message": "Ðет, ÑпаÑибо" + }, + "notEnoughGas": { + "message": "Ðе хватает газа" + }, + "noWebcamFoundTitle": { + "message": "Веб-камера не найдена" + }, + "noWebcamFound": { + "message": "Веб-камера вашего компьютера не была найдена. ПожалуйÑта, попробуйте еще раз." + }, + "ofTextNofM": { + "message": "из" + }, + "orderOneHere": { + "message": "Закажите Trezor или Ledger и храните Ñвои ÑредÑтва в холодном кошельке" + }, + "origin": { + "message": "проиÑхождениÑ" + }, + "parameters": { + "message": "параметры" + }, + "participateInMetaMetrics": { + "message": "УчаÑтвовать в MetaMetrics" + }, + "participateInMetaMetricsDescription": { + "message": "УчаÑтвуйте в MetaMetrics, чтобы помочь нам Ñделать MetaMask лучше" + }, + "password": { + "message": "Пароль" + }, + "passwordsDontMatch": { + "message": "Пароли не Ñовпадают" + }, + "passwordNotLongEnough": { + "message": "Пароль недоÑтаточно длинный" + }, + "pending": { + "message": "Ð’ обработке" + }, + "prev": { + "message": "ПредыдущаÑ" + }, + "primaryCurrencySetting": { + "message": "ОÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð²Ð°Ð»ÑŽÑ‚Ð°" + }, + "primaryCurrencySettingDescription": { + "message": "Выберите «СобÑтвенный», чтобы уÑтановить приоритет Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñумм в валюте Ñети(например, ETH).выберите Фиат, чтобы уÑтановить приоритет Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ð¹ в выбранной вами фиатной валюте." + }, + "queue": { + "message": "Очередь" + }, + "recents": { + "message": "Ðедавние" + }, + "recipientAddressPlaceholder": { + "message": "ПоиÑк, публичный Ð°Ð´Ñ€ÐµÑ (0x)или ENS" + }, + "rejectAll": { + "message": "Отклонить вÑе" + }, + "rejectTxsN": { + "message": "Отклонить транзакции $1" + }, + "rejectTxsDescription": { + "message": "Ð’Ñ‹ ÑобираетеÑÑŒ отклонить $1 транзакций" + }, + "reset": { + "message": "СброÑ" + }, + "resetAccountDescription": { + "message": "Ð¡Ð±Ñ€Ð¾Ñ Ð²Ð°ÑˆÐµÐ¹ учетной запиÑи очиÑтит вашу иÑторию транзакций." + }, + "deleteNetwork": { + "message": "Удалить Ñеть?" + }, + "deleteNetworkDescription": { + "message": "Ð’Ñ‹ уверены, что хотите удалить Ñту Ñеть?" + }, + "remindMeLater": { + "message": "Ðапомнить позже" + }, + "restoreAccountWithSeed": { + "message": "ВоÑÑтановите Ñвой аккаунт Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñекретной фразы" + }, + "restoreWalletPreferences": { + "message": "Были найдены данные ÑкÑпортированные от $1. Ð’Ñ‹ желаете воÑÑтановить наÑтройки вашего кошелька?", + "description": "$1 is the date at which the data was backed up" + }, + "requestsAwaitingAcknowledgement": { + "message": "запроÑÑ‹, ожидающие подтверждениÑ" + }, + "restore": { + "message": "ВоÑÑтановить" + }, + "revealSeedWordsTitle": { + "message": "Сид-фраза" + }, + "revealSeedWordsDescription": { + "message": "ЕÑли вы когда-либо менÑете браузеры или перемещаете компьютеры, вам понадобитÑÑ Ñта Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° Ð´Ð»Ñ Ð´Ð¾Ñтупа к вашим учетным запиÑÑм. Сохраните их где-нибудь в безопаÑном хранилище." + }, + "revealSeedWordsWarningTitle": { + "message": "ÐЕ делитеÑÑŒ Ñтой фразой ни Ñ ÐºÐµÐ¼!" + }, + "remove": { + "message": "Удалить" + }, + "removeAccount": { + "message": "Удалить учетную запиÑÑŒ" + }, + "removeAccountDescription": { + "message": "Эта ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ будет удалена из вашего кошелька. Прежде чем продолжить, убедитеÑÑŒ, что у Ð²Ð°Ñ ÐµÑть иÑÑ…Ð¾Ð´Ð½Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° или закрытый ключ Ð´Ð»Ñ Ñтой импортированной учетной запиÑи. Ð’Ñ‹ можете импортировать или Ñоздать учетные запиÑи Ñнова из раÑкрывающегоÑÑ ÑпиÑка." + }, + "readyToConnect": { + "message": "Готовы подключитьÑÑ?" + }, + "goerli": { + "message": "ТеÑÑ‚Ð¾Ð²Ð°Ñ Ñеть Goerli" + }, + "slow": { + "message": "Медленно" + }, + "slower": { + "message": "Медленнее" + }, + "saveAsCsvFile": { + "message": "Сохранить как файл CSV" + }, + "scanInstructions": { + "message": "ПомеÑтите QR-код перед вашей камерой" + }, + "scanQrCode": { + "message": "Сканировать QR-код" + }, + "searchResults": { + "message": "Результат поиÑка" + }, + "secretBackupPhrase": { + "message": "Ð ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ñекретной фразы" + }, + "secretBackupPhraseDescription": { + "message": "Ваша ÑÐµÐºÑ€ÐµÑ‚Ð½Ð°Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° облегчает резервное копирование и воÑÑтановление вашей учетной запиÑи." + }, + "secretBackupPhraseWarning": { + "message": "Ð’ÐИМÐÐИЕ. Ðикогда не раÑкрывайте Ñвою резервную фразу. Любой, у кого еÑть Ñта фраза, может завладеть вашими ÑредÑтвами безвозвратно" + }, + "securityAndPrivacy": { + "message": "БезопаÑноÑть и конфиденциальноÑть" + }, + "securitySettingsDescription": { + "message": "ÐаÑтройки конфиденциальноÑти и фраза кошелька" + }, + "seedPhrasePlaceholder": { + "message": "РазделÑйте каждое Ñлово одним пробелом" + }, + "selectEachPhrase": { + "message": "ПожалуйÑта, выберите каждую фразу, чтобы убедитьÑÑ, что она правильнаÑ." + }, + "selectLocale": { + "message": "Выберите Ñзык" + }, + "sendAmount": { + "message": "Отправить Ñумму" + }, + "sentEther": { + "message": "Отправить Ether" + }, + "sentTokens": { + "message": "Отправленные токены" + }, + "separateEachWord": { + "message": "РазделÑйте каждое Ñлово одним пробелом" + }, + "selectAnAccount": { + "message": "Выберите аккаунт" + }, + "selectAnAccountHelp": { + "message": "Выберите учетную запиÑÑŒ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра в MetaMask" + }, + "selectAHigherGasFee": { + "message": "УÑтановите более выÑокую плату за газ, чтобы уÑкорить обработку вашей транзакции.*" + }, + "selectHdPath": { + "message": "Выберите HD путь" + }, + "selectPathHelp": { + "message": "ЕÑли вы не видите Ñвои ÑущеÑтвующие учетные запиÑи Ledger ниже, попробуйте sw" + }, + "showAdvancedGasInline": { + "message": "Продвинутый контроль газа" + }, + "showAdvancedGasInlineDescription": { + "message": "Выберите Ñтот параметр, чтобы отобразить параметры ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ñ†ÐµÐ½Ñ‹ и лимита газа непоÑредÑтвенно на Ñкранах отправки и подтверждениÑ." + }, + "showFiatConversionInTestnets": { + "message": "Конвертировать Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² теÑтовых ÑетÑÑ…" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Выберите Ñто, чтобы отобразить конвертацию в фиат в теÑтовых ÑетÑÑ…" + }, + "showHexData": { + "message": "Показать HEX-значение" + }, + "showHexDataDescription": { + "message": "Выберите Ñто, чтобы показать шеÑтнадцатеричное поле данных на Ñкране отправки" + }, + "somethingWentWrong": { + "message": "ОпÑ! Что-то пошло не так." + }, + "speedUp": { + "message": "УÑкорить" + }, + "speedUpCancellation": { + "message": "УÑкорить отмену транзакции" + }, + "speedUpTransaction": { + "message": "УÑкорить Ñту транзакцию" + }, + "switchNetworks": { + "message": "Переключить Ñети" + }, + "step1HardwareWallet": { + "message": "1. Подключите аппаратный кошелек" + }, + "step1HardwareWalletMsg": { + "message": "Подключите аппаратный кошелек напрÑмую к компьютеру." + }, + "step2HardwareWallet": { + "message": "2. Выберите учетную запиÑÑŒ" + }, + "step2HardwareWalletMsg": { + "message": "Выберите учетную запиÑÑŒ, которую вы хотите проÑмотреть. Ð’Ñ‹ можете выбрать только один за раз." + }, + "step3HardwareWallet": { + "message": "3. Ðачните иÑпользовать dApps и многое другое!" + }, + "step3HardwareWalletMsg": { + "message": "ИÑпользуйте Ñвою учетную запиÑÑŒ аппаратного обеÑпечениÑ, как и любую учетную запиÑÑŒ Ethereum. Войдите в dApps, отправьте Eth, купите и Ñохраните токены ERC20 и уникальные токены, такие как CryptoKitties." + }, + "storePhrase": { + "message": "Сохраните Ñту фразу в менеджере паролей, например 1Password." + }, + "symbol": { + "message": "Символ" + }, + "syncWithMobile": { + "message": "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ Ð¼Ð¾Ð±Ð¸Ð»ÑŒÐ½Ñ‹Ð¼" + }, + "syncWithMobileTitle": { + "message": "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ Ð¼Ð¾Ð±Ð¸Ð»ÑŒÐ½Ñ‹Ð¼" + }, + "syncWithMobileDesc": { + "message": "Ð’Ñ‹ можете Ñинхронизировать Ñвои учетные запиÑи и информацию Ñ Ð²Ð°ÑˆÐ¸Ð¼ мобильным уÑтройÑтвом. Откройте мобильное приложение MetaMask, перейдите в «ÐаÑтройки» и нажмите «Синхронизировать Ñ Ñ€Ð°Ñширением браузера»." + }, + "syncWithMobileDescNewUsers": { + "message": "ЕÑли вы впервые открываете приложение MetaMask Mobile, проÑто Ñледуйте инÑтрукциÑм на телефоне." + }, + "syncWithMobileScanThisCode": { + "message": "Сканируйте Ñтот код Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ мобильного Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ MetaMask." + }, + "syncWithMobileBeCareful": { + "message": "УбедитеÑÑŒ, что никто не Ñмотрит на ваш Ñкран при Ñканировании Ñтого кода" + }, + "syncWithMobileComplete": { + "message": "Ваши данные были уÑпешно Ñинхронизированы. ÐаÑлаждайтеÑÑŒ мобильным приложением MetaMask!" + }, + "thisWillCreate": { + "message": "Это ÑоздаÑÑ‚ новый кошелек и начальную фразу" + }, + "tips": { + "message": "ПодÑказки" + }, + "token": { + "message": "Токен" + }, + "tokenContractAddress": { + "message": "ÐÐ´Ñ€ÐµÑ ÐºÐ¾Ð½Ñ‚Ñ€Ð°ÐºÑ‚Ð° токена" + }, + "transaction": { + "message": "ТранзакциÑ" + }, + "transactionConfirmed": { + "message": "Сделка подтверждена на $2." + }, + "transactionCreated": { + "message": "Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ñоздана Ñо значением $1 в $2." + }, + "transactionDropped": { + "message": "Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð¾Ñ‚Ð±Ñ€Ð¾ÑˆÐµÐ½Ð° $2." + }, + "transactionSubmitted": { + "message": "Сделка подана Ñ Ð¾Ð¿Ð»Ð°Ñ‚Ð¾Ð¹ за газ в размере 1$ за 2$." + }, + "transactionResubmitted": { + "message": "ÐŸÐ¾Ð²Ñ‚Ð¾Ñ€Ð½Ð°Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ñ Ð¿Ð»Ð°Ñ‚Ð¾Ð¹ за газ увеличена до 1$ за 2$." + }, + "transactionUpdated": { + "message": "Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð° до $2." + }, + "transactionErrored": { + "message": "Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»Ð°ÑÑŒ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹." + }, + "transactionCancelAttempted": { + "message": "ПредпринÑта попытка отмены транзакции при оплате за бензин в размере 1$ за 2$" + }, + "transactionCancelSuccess": { + "message": "Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ ÑƒÑпешно отменена $2" + }, + "transactionError": { + "message": "Ошибка транзакции. ИÑключение, указанное в коде контракта." + }, + "transactionErrorNoContract": { + "message": "Попытка вызова функции у адреÑа не ÑвлÑющегоÑÑ ÐºÐ¾Ð½Ñ‚Ñ€Ð°ÐºÑ‚Ð¾Ð¼." + }, + "transactionFee": { + "message": "КомиÑÑÐ¸Ñ Ð½Ð° перевод" + }, + "transactionTime": { + "message": "Ð’Ñ€ÐµÐ¼Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸" + }, + "transfer": { + "message": "ПеревеÑти" + }, + "transferBetweenAccounts": { + "message": "Перевод между моими аккаунтами" + }, + "transferFrom": { + "message": "Перевод из" + }, + "tryAgain": { + "message": "Попробуйте Ñнова" + }, + "units": { + "message": "единицы" + }, + "unknownQrCode": { + "message": "Ошибка. Мы не Ñмогли идентифицировать Ñтот QR-код" + }, + "unknownCameraErrorTitle": { + "message": "Ой! Что-то пошло не так...." + }, + "unknownCameraError": { + "message": "При попытке доÑтупа к камере произошла ошибка. ПожалуйÑта, попробуйте еще раз..." + }, + "unlock": { + "message": "Разблокировать" + }, + "unlockMessage": { + "message": "Ð”ÐµÑ†ÐµÐ½Ñ‚Ñ€Ð°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñеть ждет" + }, + "updatedWithDate": { + "message": "Обновлено $1" + }, + "userName": { + "message": "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" + }, + "viewinExplorer": { + "message": "ПроÑмотреть в блок-Ñкплорере" + }, + "viewContact": { + "message": "ПроÑмотреть контракт" + }, + "viewOnCustomBlockExplorer": { + "message": "ПоÑмотреть на $1" + }, + "viewOnEtherscan": { + "message": "ПоÑмотреть на Etherscan" + }, + "welcomeBack": { + "message": "Рад видеть Ð²Ð°Ñ Ñнова!" + }, + "writePhrase": { + "message": "Ðапишите Ñту фразу на лиÑте бумаги и храните в надежном меÑте. ЕÑли вы хотите еще большей безопаÑноÑти, запишите Ñто на неÑкольких лиÑтах бумаги и храните каждый в 2 - 3 разных меÑтах." + }, + "yesLetsTry": { + "message": "Да, давайте начнем" + }, + "youNeedToAllowCameraAccess": { + "message": "Ð’Ñ‹ должны разрешить доÑтуп к камере, чтобы иÑпользовать Ñту функцию." + }, + "yourPrivateSeedPhrase": { + "message": "Ваша Ñид-фраза" + }, + "decryptRequest": { + "message": "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ñ€Ð°Ñшифровки" + }, + "decrypt": { + "message": "РаÑшифровать" + }, + "decryptMessageNotice": { + "message": "Ð”Ð»Ñ $1 необходимо прочитать Ñто Ñообщение, чтобы завершить Ваше дейÑтвие", + "description": "$1 is website or dapp name" + }, + "decryptMetamask": { + "message": "РаÑшифровать Ñообщение" + }, + "decryptCopy": { + "message": "Скопировать раÑшифрованное Ñообщение" + }, + "decryptInlineError": { + "message": "Это Ñообщение не может быть дешифровано из-за ошибки: $1", + "description": "$1 is error message" + }, + "provide": { + "message": "ПредоÑтавить" + }, + "encryptionPublicKeyRequest": { + "message": "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ ключа шифрованиÑ" + }, + "encryptionPublicKeyNotice": { + "message": "$1 запрашивает ваш открытый ключ шифрованиÑ. По ÑоглаÑованию, Ñтот Ñайт Ñможет Ñоздавать Ð´Ð»Ñ Ð’Ð°Ñ Ð·Ð°ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð½Ñ‹Ðµ ÑообщениÑ.", + "description": "$1 is website or dapp name" } } diff --git a/app/_locales/sk/messages.json b/app/_locales/sk/messages.json index f98de674bf5f..285e4375d3df 100644 --- a/app/_locales/sk/messages.json +++ b/app/_locales/sk/messages.json @@ -1,66 +1,66 @@ { - "privacyMode": { - "message": "Režim súkromia" + "chartOnlyAvailableEth": { + "message": "Graf je k dispozícii iba v sieÅ¥ach Ethereum." }, - "privacyModeDescription": { - "message": "Webové stránky musia požiadaÅ¥ o prístup k zobrazeniu informácií o vaÅ¡om úÄte." + "contractInteraction": { + "message": "Zmluvná interakcia" }, - "exposeAccounts": { - "message": "Vystavte úÄty" + "reject": { + "message": "Odmítnout" }, - "exposeDescription": { - "message": "Vystavte úÄty na aktuální webové stránky. UžiteÄné pro starší dappy." + "about": { + "message": "Informácie" }, - "confirmExpose": { - "message": "Opravdu chcete své úÄty vystavit na stávajícím webu?" + "aboutSettingsDescription": { + "message": "Verzia, centrum podpory a kontaktné informácie" }, - "confirmClear": { - "message": "Naozaj chcete vymazaÅ¥ schválené webové stránky?" + "acceleratingATransaction": { + "message": "*Urýchlenie transakcie pomocou vyššej ceny za GAS zvyÅ¡uje Å¡ance na rýchlejÅ¡ie spracovanie v sieti, nie je to vÅ¡ak vždy zaruÄené." }, - "clearApprovalDataSuccess": { - "message": "Schválené údaje webových stránek byly úspěšnÄ› zruÅ¡eny." + "accessingYourCamera": { + "message": "Prístupuje k fotoaparátu..." }, - "approvalData": { - "message": "Údaje o schválení" + "account": { + "message": "ÚÄet" }, - "approvalDataDescription": { - "message": "Vymažte schválené údaje webových stránek, aby vÅ¡echny weby znovu požádaly o schválení." + "accountDetails": { + "message": "Detaily úÄtu" }, - "clearApprovalData": { - "message": "Jasné údaje o schválení" + "accountName": { + "message": "Název úÄtu" }, - "approve": { - "message": "Schválit" + "accountOptions": { + "message": "Možnosti úÄtu" }, - "reject": { - "message": "Odmítnout" + "accountSelectionRequired": { + "message": "Musíte si vybraÅ¥ úÄet!" }, - "providerAPIRequest": { - "message": "Požadavek API Ethereum" + "activityLog": { + "message": "protokol aktivity" }, - "reviewProviderRequest": { - "message": "PÅ™eÄtÄ›te si prosím tuto žádost API Ethereum." + "addNetwork": { + "message": "PridaÅ¥ sieÅ¥" }, - "providerRequestInfo": { - "message": "Níže uvedená doména se pokouší požádat o přístup k API Ethereum, aby mohla komunikovat s blokádou Ethereum. PÅ™ed schválením přístupu Ethereum vždy zkontrolujte, zda jste na správném místÄ›." + "addRecipient": { + "message": "PridaÅ¥ príjemcu" }, - "accept": { - "message": "PÅ™ijmout" + "advanced": { + "message": "Rozšírené" }, - "account": { - "message": "ÚÄet" + "advancedSettingsDescription": { + "message": "Získajte prístup k vývojárskym funkciám, sÅ¥ahujte si Stavové denníky, resetujte úÄet, nastavujte testovacie siete a vlastné RPC" }, - "accountDetails": { - "message": "Detaily úÄtu" + "advancedOptions": { + "message": "Rozšírené nastavenia" }, - "accountName": { - "message": "Název úÄtu" + "addToAddressBook": { + "message": "PridaÅ¥ do adresára" }, - "address": { - "message": "Adresa" + "addToAddressBookModalPlaceholder": { + "message": "napr. Ján D." }, - "addCustomToken": { - "message": "PÅ™idat vlastní token" + "addAlias": { + "message": "PridaÅ¥ alias" }, "addToken": { "message": "PÅ™idat token" @@ -68,12 +68,15 @@ "addTokens": { "message": "PÅ™idat tokeny" }, + "addSuggestedTokens": { + "message": "PridaÅ¥ navrhované tokeny" + }, + "addAcquiredTokens": { + "message": "Pridajte tokeny, ktoré ste získali pomocou MetaMask" + }, "amount": { "message": "Částka" }, - "amountPlusGas": { - "message": "Částka + palivo" - }, "appDescription": { "message": "Ethereum rozšíření prohlížeÄe", "description": "The description of the application" @@ -82,66 +85,117 @@ "message": "MetaMask", "description": "The name of the application" }, + "approve": { + "message": "Schválit" + }, "approved": { "message": "Schváleno" }, "attemptingConnect": { "message": "Pokouším se pÅ™ipojit k blockchainu." }, + "attemptToCancel": { + "message": "Pokus o zruÅ¡enie?" + }, + "attemptToCancelDescription": { + "message": "Odoslanie tohto pokusu nezaruÄuje, že vaÅ¡a pôvodná transakcia bude zruÅ¡ená. Ak je pokus o zruÅ¡enie úspeÅ¡ný, naúÄtujeme vám vyššie uvedený transakÄný poplatok." + }, "attributions": { "message": "Zásluhy" }, - "available": { - "message": "Dostupné" + "autoLockTimeLimit": { + "message": "ÄŒasovaÄ automatického odhlásenia (minúty)" + }, + "autoLockTimeLimitDescription": { + "message": "Nastavte Äas neÄinnosti v minútach skôr, než sa MetaMask automaticky odhlási" + }, + "average": { + "message": "Priemerný" }, "back": { "message": "ZpÄ›t" }, + "backToAll": { + "message": "Späť na vÅ¡etko" + }, + "backupApprovalNotice": { + "message": "Zálohujte si svoj tajný kód na obnovenie, aby bola vaÅ¡a peňaženka a prostriedky bezpeÄné." + }, + "backupApprovalInfo": { + "message": "Tento tajný kód je potrebný na obnovenie peňaženky v prípade straty zariadenia, zabudnutia hesla, preinÅ¡talovania MetaMask alebo prístupu k peňaženke na inom zariadení." + }, + "backupNow": { + "message": "ZálohovaÅ¥ teraz" + }, "balance": { "message": "Zůstatek:" }, - "balances": { - "message": "Zůstatek tokenu" + "balanceOutdated": { + "message": "Zostatok môže byÅ¥ neaktuálny" }, - "balanceIsInsufficientGas": { - "message": "Nedostatek prostÅ™edků pro aktuální množství paliva" + "basic": { + "message": "Základné" }, - "beta": { - "message": "BETA" - }, - "betweenMinAndMax": { - "message": "musí být vÄ›tší nebo roven $1 a menší nebo roven $2.", - "description": "helper for inputting hex as decimal input" + "blockExplorerView": { + "message": "ZobraziÅ¥ úÄet na $1", + "description": "$1 replaced by URL for custom block explorer" }, "blockiesIdenticon": { "message": "Použít Blockies Identicon" }, - "borrowDharma": { - "message": "PújÄit si pÅ™es Dharma (Beta)" + "browserNotSupported": { + "message": "Váš prehliadaÄ nie je podporovaný..." }, "builtInCalifornia": { "message": "MetaMask je navržen a vytvoÅ™en v Kalifornii." }, - "buy": { - "message": "Koupit" + "buyWithWyre": { + "message": "Kúpte ETH s Wyre" + }, + "buyWithWyreDescription": { + "message": "Wyre vám umožňuje použiÅ¥ kreditnú kartu na vloženie depozitu ETH priamo na váš úÄet MetaMask." }, - "buyCoinbase": { - "message": "Nákup na Coinbase" + "buyCoinSwitch": { + "message": "KúpiÅ¥ na CoinSwitch" }, - "buyCoinbaseExplainer": { - "message": "Coinbase je svÄ›tovÄ› nejoblíbenÄ›jší místo k nákupu a prodeji bitcoinu, etherea nebo litecoinu." + "buyCoinSwitchExplainer": { + "message": "CoinSwitch je jedno miesto, kde si môžete vymieňaÅ¥ viac ako 300 kryptomien za najlepÅ¡iu cenu." }, - "ok": { - "message": "Ok" + "bytes": { + "message": "Bajty" + }, + "off": { + "message": "Vypnuté" + }, + "on": { + "message": "Zapnuté" + }, + "optionalBlockExplorerUrl": { + "message": "BlokovaÅ¥ URL Explorera (voliteľné)" }, "cancel": { "message": "ZruÅ¡it" }, - "classicInterface": { - "message": "Použít klasické rozhraní" + "cancelAttempt": { + "message": "ZruÅ¡iÅ¥ pokus" + }, + "cancellationGasFee": { + "message": "Storno poplatok za GAS" + }, + "cancelled": { + "message": "ZruÅ¡ený" }, - "clickCopy": { - "message": "Kliknutím zkopírovat" + "chainId": { + "message": "ID reÅ¥azca" + }, + "clickToRevealSeed": { + "message": "Kliknutím sem odkryjete tajné slová" + }, + "close": { + "message": "ZavrieÅ¥" + }, + "chromeRequiredForHardwareWallets": { + "message": "Ak sa chcete pripojiÅ¥ k svojej hardvérovej peňaženke, musíte v Google Chrome použiÅ¥ MetaMask." }, "confirm": { "message": "Potvrdit" @@ -149,48 +203,66 @@ "confirmed": { "message": "Potvrzeno" }, - "confirmContract": { - "message": "Potvrdit kontrakt" - }, "confirmPassword": { "message": "Potvrdit heslo" }, - "confirmTransaction": { - "message": "Potvrdit transakci" + "confirmSecretBackupPhrase": { + "message": "PotvrÄte svoju tajnú backup frázu" }, - "continue": { - "message": "PokraÄovat" + "congratulations": { + "message": "Blahoželáme" }, - "continueToCoinbase": { - "message": "PÅ™ejít na Coinbase" + "connectHardwareWallet": { + "message": "PripojiÅ¥ hardvérovú peňaženku" }, - "contractDeployment": { - "message": "Nasazení kontraktu" + "connect": { + "message": "Pripojenie" }, - "conversionProgress": { - "message": "Provádí se pÅ™evod" + "connectingTo": { + "message": "Pripája sa k $1" }, - "copiedButton": { - "message": "Zkopírováno" + "connectingToKovan": { + "message": "PÅ™ipojuji se k Kovan Test Network" }, - "copiedClipboard": { - "message": "Zkopírováno do schránky" + "connectingToMainnet": { + "message": "PÅ™ipojuji se k Main Ethereum Network" + }, + "connectingToRopsten": { + "message": "PÅ™ipojuji se k Ropsten Test Network" + }, + "connectingToRinkeby": { + "message": "PÅ™ipojuji se k Rinkeby Test Network" + }, + "connectingToLocalhost": { + "message": "Pripája sa k Localhost 8545" + }, + "connectingToGoerli": { + "message": "Pripája sa k testovacej sieti Goerli" + }, + "continueToWyre": { + "message": "PokraÄovaÅ¥ na Wyre" + }, + "continueToCoinSwitch": { + "message": "PokraÄovaÅ¥ na CoinSwitch" + }, + "contractDeployment": { + "message": "Nasazení kontraktu" }, "copiedExclamation": { "message": "Zkopírováno!" }, - "copiedSafe": { - "message": "Zkopíroval jsem to na bezpeÄné místo" + "copyAddress": { + "message": "KopírovaÅ¥ adresu do schránky" + }, + "copyTransactionId": { + "message": "KopírovaÅ¥ ID transakcie" }, - "copy": { - "message": "Kopírovat" + "copiedTransactionId": { + "message": "Kopírované ID transakcie" }, "copyToClipboard": { "message": "Kopírovat do schránky" }, - "copyButton": { - "message": " Kopírovat " - }, "copyPrivateKey": { "message": "Toto je váš privátní klÃ­Ä (kliknutím zkopírujte)" }, @@ -200,28 +272,27 @@ "createAccount": { "message": "VytvoÅ™it úÄet" }, - "createDen": { - "message": "VytvoÅ™it" + "createAWallet": { + "message": "VytvoriÅ¥ Peňaženku" }, - "crypto": { - "message": "Krypto", - "description": "Exchange type (cryptocurrencies)" + "createPassword": { + "message": "VytvoriÅ¥ heslo" }, - "currentConversion": { - "message": "Aktuální pÅ™evod" + "currencyConversion": { + "message": "PrepoÄet meny" }, - "currentNetwork": { - "message": "Aktuální síť" + "currentLanguage": { + "message": "Aktuálny jazyk" }, "customGas": { "message": "Nastavit palivo" }, + "customGasSubTitle": { + "message": "Zvýšenie poplatku môže skrátiÅ¥ dobu spracovania, nie je to vÅ¡ak zaruÄené." + }, "customToken": { "message": "Vlastní token" }, - "customize": { - "message": "Nastavit" - }, "customRPC": { "message": "Vlastní RPC" }, @@ -234,39 +305,21 @@ "defaultNetwork": { "message": "Výchozí síť pro Etherové transakce je Main Net." }, - "denExplainer": { - "message": "Váš DEN je heslem Å¡ifrované uložiÅ¡tÄ› v MetaMasku." + "delete": { + "message": "OdstrániÅ¥" + }, + "deleteAccount": { + "message": "ZmazaÅ¥ úÄet" }, "deposit": { "message": "Vklad" }, - "depositBTC": { - "message": "Vložte BTC na níže uvedenou adresu:" - }, - "depositEth": { - "message": "Vložit Eth" - }, "depositEther": { "message": "Vložit Ether" }, - "depositFiat": { - "message": "Vklad s fiat mÄ›nou" - }, - "depositFromAccount": { - "message": "Vložte z jiného úÄtu" - }, - "depositShapeShift": { - "message": "Vklad pÅ™es ShapeShift" - }, - "depositShapeShiftExplainer": { - "message": "Pokud vlastníte jiné kryptomÄ›ny, můžete je smÄ›nit Ether a vložit ho přímo do peněženky MetaMask. Bez založení úÄtu." - }, "details": { "message": "Podrobnosti" }, - "directDeposit": { - "message": "Přímý vklad" - }, "directDepositEther": { "message": "Vložit Ether přímo" }, @@ -276,51 +329,96 @@ "done": { "message": "Hotovo" }, + "downloadGoogleChrome": { + "message": "StiahnuÅ¥ Google Chrome" + }, + "downloadSecretBackup": { + "message": "Stiahnite si túto tajnú backup frázu a uložte ju bezpeÄne na externý Å¡ifrovaný pevný disk alebo pamäťové médium." + }, "downloadStateLogs": { "message": "Stáhnout stavové protokoly" }, + "dontHaveAHardwareWallet": { + "message": "Nemáte hardvérovú peňaženku?" + }, "dropped": { "message": "ZruÅ¡eno" }, "edit": { "message": "Upravit" }, - "editAccountName": { - "message": "Upravit název úÄtu" + "editContact": { + "message": "UpraviÅ¥ kontakt" + }, + "endOfFlowMessage1": { + "message": "ÚspeÅ¡ne ste preÅ¡li testom – uchovávajte svoju seed frázu v bezpeÄí. Je to vaÅ¡a zodpovednosÅ¥!" + }, + "endOfFlowMessage2": { + "message": "Tipy na bezpeÄné uloženie" + }, + "endOfFlowMessage3": { + "message": "Uložte zálohu na viacerých miestach." + }, + "endOfFlowMessage4": { + "message": "Nikdy nezdieľajte frázu s niekým iným." + }, + "endOfFlowMessage5": { + "message": "Dávajte pozor na phishing! MetaMask nikdy nebude spontánne požadovaÅ¥ vaÅ¡u seed frázu." + }, + "endOfFlowMessage6": { + "message": "Ak potrebujete backup frázu znova zálohovaÅ¥, nájdete ju v Äasti Nastavenia -> ZabezpeÄenie." }, - "emailUs": { - "message": "NapiÅ¡te nám e-mail!" + "endOfFlowMessage7": { + "message": "Ak budete maÅ¥ nejaké otázky alebo nieÄo zaujímavé, poÅ¡lite email na support@metamask.io." }, - "encryptNewDen": { - "message": "ZaÅ¡ifrujte svůj nový DEN" + "endOfFlowMessage8": { + "message": "MetaMask nemôže obnoviÅ¥ vaÅ¡u seed frázu. ZistiÅ¥ viac." + }, + "endOfFlowMessage9": { + "message": "DozvedieÅ¥ sa viac." + }, + "endOfFlowMessage10": { + "message": "VÅ¡etko vykonané" + }, + "ensRegistrationError": { + "message": "Chyba pri registrácii názvu ENS" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "Názov ENS sa nenaÅ¡iel v aktuálnej sieti. Skúste sa prepnúť na hlavnú sieÅ¥ Ethereum." + }, + "enterAnAlias": { + "message": "ZadaÅ¥ alias" }, "enterPassword": { "message": "Zadejte heslo" }, - "enterPasswordConfirm": { - "message": "Zadejte heslo k potvrzení" - }, - "passwordNotLongEnough": { - "message": "Heslo není dost dlouhé" + "enterPasswordContinue": { + "message": "PokraÄujte zadaním hesla" }, - "passwordsDontMatch": { - "message": "Hesla nejsou stejná" + "ethereumPublicAddress": { + "message": "Verejná adresa Ethereum" }, "etherscanView": { "message": "ProhlédnÄ›te si úÄet na Etherscan" }, - "exchangeRate": { - "message": "SmÄ›nný kurz" + "estimatedProcessingTimes": { + "message": "Odhadovaný Äas spracovania" + }, + "expandView": { + "message": "RozbaliÅ¥ zobrazenie" }, "exportPrivateKey": { "message": "Exportovat privátní klíÄ" }, - "exportPrivateKeyWarning": { - "message": "Exportujte privátní klÃ­Ä na vlastní riziko." - }, "failed": { "message": "Neúspěšné" }, + "fast": { + "message": "Rýchle" + }, + "faster": { + "message": "RýchlejÅ¡ie" + }, "fiat": { "message": "FIAT", "description": "Exchange type" @@ -329,48 +427,44 @@ "message": "Import souboru nefunguje? KliknÄ›te sem!", "description": "Helps user import their account from a JSON file" }, - "followTwitter": { - "message": "Sledujte nás na Twitteru" + "forgetDevice": { + "message": "Zabudnúť toto zariadenie" }, "from": { "message": "Od" }, - "fromToSame": { - "message": "Adresy odesílatele a příjemce nemohou být stejné" - }, - "fromShapeShift": { - "message": "Z ShapeShift" - }, - "gas": { - "message": "Palivo", - "description": "Short indication of gas cost" - }, - "gasFee": { - "message": "Poplatek za palivo" + "functionType": { + "message": "Typ funkcie" }, "gasLimit": { "message": "Limit paliva" }, - "gasLimitCalculation": { - "message": "PoÄítáme doporuÄený limit paliva na základÄ› úspěšnosti v síti." - }, - "gasLimitRequired": { - "message": "Limit paliva je povinný" + "gasLimitInfoModalContent": { + "message": "Limit GAS je maximálne množstvo jednotiek GAS, ktoré ste ochotní minúť." }, "gasLimitTooLow": { "message": "Limit paliva musí být alespoň 21000" }, - "generatingSeed": { - "message": "Generuji klíÄovou frázi..." + "gasUsed": { + "message": "GAS použitý" }, "gasPrice": { "message": "Cena paliva (GWEI)" }, - "gasPriceCalculation": { - "message": "PoÄítáme doporuÄenou cenu paliva na základÄ› úspěšnosti v síti." + "gasPriceExtremelyLow": { + "message": "Cena za GAS je mimoriadne nízka" + }, + "gasPriceInfoModalContent": { + "message": "Cena za GAS urÄuje množstvo Ether, ktoré ste ochotní zaplatiÅ¥ za každú jednotku GAS." + }, + "gasPriceNoDenom": { + "message": "Cena GAS" + }, + "general": { + "message": "VÅ¡eobecne" }, - "gasPriceRequired": { - "message": "Cena paliva je povinná" + "generalSettingsDescription": { + "message": "Prevod mien, primárna mena, jazyk, identifikácia blokov" }, "getEther": { "message": "Získejte Ether" @@ -379,35 +473,42 @@ "message": "Získejte Ether z faucetu za $1.", "description": "Displays network name for Ether faucet" }, - "greaterThanMin": { - "message": "musí být vÄ›tší nebo roven $1.", - "description": "helper for inputting hex as decimal input" + "getHelp": { + "message": "Získajte pomoc." + }, + "getStarted": { + "message": "ZaÄaÅ¥" + }, + "happyToSeeYou": { + "message": "Sme radi, že vás vidíme." + }, + "hardware": { + "message": "hardvér" + }, + "hardwareWalletConnected": { + "message": "Hardvérová peňaženka je pripojená" + }, + "hardwareWallets": { + "message": "PripojiÅ¥ hardvérovú peňaženku" + }, + "hardwareWalletsMsg": { + "message": "Vyberte hardvérovú peňaženku, ktorú chcete používaÅ¥ s MetaMask" + }, + "havingTroubleConnecting": { + "message": "Máte problémy s pripojením?" }, "here": { "message": "zde", "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, - "hereList": { - "message": "Tady je seznam!!!!" - }, "hide": { "message": "Skrýt" }, - "hideToken": { - "message": "Skrýt token" - }, "hideTokenPrompt": { "message": "Skrýt token?" }, - "howToDeposit": { - "message": "Jakým způsobem chcete vložit Ether?" - }, - "holdEther": { - "message": "Dovoluje vám držet ether a tokeny a slouží jako most k decentralizovaným aplikacím." - }, - "import": { - "message": "Import", - "description": "Button to import an account from a selected file" + "history": { + "message": "História" }, "importAccount": { "message": "Import úÄtu" @@ -415,19 +516,31 @@ "importAccountMsg": { "message": "Importované úÄty nebudou spojeny s vaší původní MetaMaskovou klíÄovou frází. ZjistÄ›te více o importovaných úÄtech " }, - "importAnAccount": { - "message": "Import úÄtu" + "importAccountSeedPhrase": { + "message": "ImportovaÅ¥ úÄet so seed frázou" }, - "importDen": { - "message": "Import existujícího DEN" + "importWallet": { + "message": "ImportovaÅ¥ Peňaženku" + }, + "importYourExisting": { + "message": "Importujte svoju existujúcu peňaženku pomocou 12-slovnej seed frázy" }, "imported": { "message": "Importováno", "description": "status showing that an account has been fully loaded into the keyring" }, + "importUsingSeed": { + "message": "ImportovaÅ¥ pomocou seed frázy úÄtu" + }, "infoHelp": { "message": "Informace a nápovÄ›da" }, + "initialTransactionConfirmed": { + "message": "SieÅ¥ potvrdila vaÅ¡u iniciálnu transakciu. Ak sa chcete vrátiÅ¥ späť, kliknite na OK." + }, + "insufficientBalance": { + "message": "NedostatoÄný zostatok." + }, "insufficientFunds": { "message": "Nedostatek finanÄních prostÅ™edků." }, @@ -440,43 +553,36 @@ "invalidAddressRecipient": { "message": "Adresa příjemce je neplatná" }, - "invalidGasParams": { - "message": "Neplatná parametry paliva" + "knownAddressRecipient": { + "message": "Známe kontaktné adresy." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "Nie sieÅ¥ ETH, nastaviÅ¥ malé písmená" }, "invalidInput": { "message": "Neplatný vstup." }, - "invalidRequest": { - "message": "Neplatný požadavek" - }, "invalidRPC": { "message": "Neplatné RPC URI" }, - "jsonFail": { - "message": "NÄ›co se pokazilo. Prosím, ujistÄ›te se, že váš JSON soubor má správný formát." + "invalidBlockExplorerURL": { + "message": "Neplatné Block Explorer URI" + }, + "invalidSeedPhrase": { + "message": "Neplatná seed fráza" }, "jsonFile": { "message": "JSON soubor", "description": "format for importing an account" }, - "keepTrackTokens": { - "message": "Udržujte si záznamy o tokenech, které jste koupili s úÄtem v MetaMasku." - }, - "kovan": { - "message": "Kovan Test Network" - }, - "knowledgeDataBase": { - "message": "NavÅ¡tivte naÅ¡i Knowledge Base" - }, - "max": { - "message": "Max" - }, "learnMore": { "message": "ZjistÄ›te více." }, - "lessThanMax": { - "message": "musí být menší nebo roven $1.", - "description": "helper for inputting hex as decimal input" + "ledgerAccountRestriction": { + "message": "Skôr ako budete môcÅ¥ pridaÅ¥ nový úÄet, musíte použiÅ¥ svoj posledný úÄet." + }, + "letsGoSetUp": { + "message": "Ãno, poÄme to nastaviÅ¥!" }, "likeToAddTokens": { "message": "Chcete pÅ™idat tyto tokeny?" @@ -484,8 +590,8 @@ "links": { "message": "Odkazy" }, - "limit": { - "message": "Limit" + "liveGasPricePredictions": { + "message": "PredpoveÄ cien GAS naživo" }, "loading": { "message": "NaÄítám..." @@ -493,23 +599,14 @@ "loadingTokens": { "message": "NaÄítám tokeny..." }, - "localhost": { - "message": "Localhost 8545" + "loadMore": { + "message": "NaÄítaÅ¥ viac" }, - "login": { - "message": "PÅ™ihlásit" - }, - "logout": { + "lock": { "message": "Odhlásit" }, - "loose": { - "message": "Nevázané" - }, - "loweCaseWords": { - "message": "slova klíÄové fráze mají pouze malá písmena" - }, - "mainnet": { - "message": "Main Ethereum Network" + "memorizePhrase": { + "message": "Zapamätajte si túto frázu." }, "message": { "message": "Zpráva" @@ -517,12 +614,21 @@ "metamaskDescription": { "message": "MetaMask je bezpeÄný osobní trezor pro Ethereum." }, - "min": { - "message": "Minimum" + "metamaskVersion": { + "message": "Verzia MetaMask" + }, + "mobileSyncText": { + "message": "Zadajte svoje heslo a potvrÄte, že ste to vy!" }, "myAccounts": { "message": "Moje úÄty" }, + "myWalletAccounts": { + "message": "ÚÄty v Mojej peňaženke" + }, + "myWalletAccountsDescription": { + "message": "Do tejto sekcie sa automaticky pridajú vÅ¡etky vaÅ¡e úÄty vytvorené pomocou MetaMask." + }, "mustSelectOne": { "message": "Musíte zvolit aspoň 1 token." }, @@ -533,89 +639,139 @@ "message": "Musíte zvolit soubor k importu.", "description": "User is important an account and needs to add a file to continue" }, - "needImportPassword": { - "message": "Musíte zadat heslo pro zvolený soubor.", - "description": "Password and file needed to import an account" - }, "negativeETH": { "message": "Nelze odeslat zápornou Äástku ETH." }, + "networkName": { + "message": "Názov siete" + }, "networks": { "message": "SítÄ›" }, + "networkSettingsDescription": { + "message": "PridaÅ¥ a upraviÅ¥ vlastné siete RPC" + }, + "nevermind": { + "message": "Nevadí" + }, "newAccount": { "message": "Nový úÄet" }, + "newAccountDetectedDialogMessage": { + "message": "Bola zistená nová adresa! Kliknite sem a pridajte ju do svojho adresára." + }, "newAccountNumberName": { "message": "ÚÄet $1", "description": "Default name of next account to be created on create account screen" }, + "newContact": { + "message": "Nový kontakt" + }, "newContract": { "message": "Nový kontrakt" }, "newPassword": { "message": "Nové heslo (min 8 znaků)" }, - "newRecipient": { - "message": "Nový příjemce" + "newNetwork": { + "message": "Nová sieÅ¥" + }, + "newToMetaMask": { + "message": "Ste noví na MetaMask?" }, - "newRPC": { + "noAlreadyHaveSeed": { + "message": "Nie, už mám seed frázu" + }, + "protectYourKeys": { + "message": "Chráňte si svoje kľúÄe!" + }, + "protectYourKeysMessage1": { + "message": "Pri seed fráze buÄte opatrní – vyskytli sa správy o webových stránkach, ktoré sa snažia napodobniÅ¥ MetaMask. MetaMask nikdy nebude žiadaÅ¥ vaÅ¡u seed frázu!" + }, + "protectYourKeysMessage2": { + "message": "Držte svoju frázu v bezpeÄí. Ak zbadáte nieÄo podozrivé alebo si nie ste istí webom, poÅ¡lite email na adresu support@metamask.io" + }, + "rpcUrl": { "message": "Nová RPC URL" }, + "optionalChainId": { + "message": "ChainID (voliteľné)" + }, + "optionalSymbol": { + "message": "Symbol (voliteľné)" + }, + "newTotal": { + "message": "Nový súÄet" + }, + "newTransactionFee": { + "message": "Nový poplatok za transakciu" + }, "next": { "message": "Další" }, "noAddressForName": { "message": "Pro toto jméno nebyla nastavena žádná adresa." }, - "noDeposits": { - "message": "Žádný vklad" - }, - "noTransactionHistory": { - "message": "Žádná historie transakcí." + "noConversionRateAvailable": { + "message": "Nie je k dispozícii žiadna sadzba konverzie" }, "noTransactions": { "message": "Žádné transakce" }, - "notStarted": { - "message": "NezaÄalo" + "notEnoughGas": { + "message": "Nedostatok GAS" + }, + "noWebcamFoundTitle": { + "message": "Webová kamera sa nenaÅ¡la" + }, + "noWebcamFound": { + "message": "Webová kamera vášho poÄítaÄa sa nenaÅ¡la. Skúste znova." }, - "oldUI": { - "message": "Staré rozhraní" + "ofTextNofM": { + "message": "z" }, - "oldUIMessage": { - "message": "Vrátili jste se ke starému rozhraní. Můžete pÅ™epnout na nové rozhraní v nastavení v pravém horním menu." + "orderOneHere": { + "message": "Objednajte si Trezor alebo Hlavnú knihu a uschovajte svoje prostriedky v sklade" }, - "or": { - "message": "nebo", - "description": "choice between creating or importing a new account" + "origin": { + "message": "Pôvod" }, - "passwordCorrect": { - "message": "UjistÄ›te se, že je vaÅ¡e heslo správnÄ›." + "parameters": { + "message": "Parametre" }, - "passwordMismatch": { - "message": "hesla nesouhlasí", - "description": "in password creation process, the two new password fields did not match" + "participateInMetaMetrics": { + "message": "ZúÄastnite sa na MetaMetrics" }, - "passwordShort": { - "message": "heslo je krátké", - "description": "in password creation process, the password is not long enough to be secure" + "participateInMetaMetricsDescription": { + "message": "ZúÄastnite sa na MetaMetrics a pomôžte nám vylepÅ¡iÅ¥ MetaMask" + }, + "password": { + "message": "Heslo" + }, + "passwordsDontMatch": { + "message": "Hesla nejsou stejná" + }, + "passwordNotLongEnough": { + "message": "Heslo není dost dlouhé" }, "pastePrivateKey": { "message": "Vložte zde svůj privátní klíÄ:", "description": "For importing an account from a private key" }, - "pasteSeed": { - "message": "Svou klíÄovou frázi vložte zde!" + "pending": { + "message": "prebieha" }, "personalAddressDetected": { "message": "Detekována osobní adresa. Zadejte adresu kontraktu tokenu." }, - "pleaseReviewTransaction": { - "message": "Zkontrolujte si transakci." + "prev": { + "message": "Predchádzajúce" + }, + "primaryCurrencySetting": { + "message": "Primárna mena" }, - "popularTokens": { - "message": "Oblíbené tokeny" + "primaryCurrencySettingDescription": { + "message": "Vyberte natívne, ak chcete priorizovaÅ¥ zobrazovanie hodnôt v natívnej mene reÅ¥azca (napr. ETH). Ak chcete priorizovaÅ¥ zobrazovanie hodnôt vo svojej vybranej mene fiat, zvoľte možnosÅ¥ Fiat." }, "privacyMsg": { "message": "Zásady ochrany osobních údajů" @@ -630,121 +786,152 @@ "privateNetwork": { "message": "Soukromá síť" }, - "qrCode": { - "message": "Ukázat QR kód" + "queue": { + "message": "Poradie" }, "readdToken": { "message": "Tento token můžete v budoucnu pÅ™idat zpÄ›t s „PÅ™idat token“ v nastavení úÄtu." }, - "readMore": { - "message": "PÅ™eÄtÄ›te si více zde." - }, - "readMore2": { - "message": "PÅ™eÄtÄ›te si více." - }, - "receive": { - "message": "Obrdžet" + "recents": { + "message": "Posledné" }, "recipientAddress": { "message": "Adresa příjemce" }, - "refundAddress": { - "message": "Adresa pro vrácení penÄ›z" + "recipientAddressPlaceholder": { + "message": "VyhľadávaÅ¥ verejnú adresu (0x) alebo ENS" + }, + "rejectAll": { + "message": "OdmietnuÅ¥ vÅ¡etko" + }, + "rejectTxsN": { + "message": "OdmietnuÅ¥ $1 transakcie " + }, + "rejectTxsDescription": { + "message": " Chystáte sa hromadne odmietnuÅ¥ $1 transakcie." }, "rejected": { "message": "Odmítnuto" }, + "reset": { + "message": "ResetovaÅ¥" + }, "resetAccount": { "message": "Resetovat úÄet" }, + "resetAccountDescription": { + "message": "Pri obnovení úÄtu sa vymaže história transakcií." + }, + "deleteNetwork": { + "message": "OdstrániÅ¥ sieÅ¥?" + }, + "deleteNetworkDescription": { + "message": "Naozaj chcete túto sieÅ¥ odstrániÅ¥?" + }, + "remindMeLater": { + "message": "Pripomenúť neskôr" + }, "restoreFromSeed": { "message": "Obnovit z seed fráze" }, - "restoreVault": { - "message": "Obnovit trezor" + "restoreAccountWithSeed": { + "message": "ObnoviÅ¥ úÄet pomocou seed frázy" + }, + "requestsAwaitingAcknowledgement": { + "message": "žiadosti Äakajúce na potvrdenie" }, "required": { "message": "Povinné" }, - "retryWithMoreGas": { - "message": "Opakujte s vyšší cenou paliva" - }, - "walletSeed": { - "message": "KlíÄová fráze peněženky" + "restore": { + "message": "ObnoviÅ¥" }, "revealSeedWords": { "message": "Zobrazit slova klíÄové fráze" }, - "revealSeedWordsWarning": { - "message": "Nebnovujte slova klíÄové fráze na veÅ™ejnosti! Tato slova mohou být použita k odcizení veÅ¡kerých vyaÅ¡ich úÄtů." + "revealSeedWordsTitle": { + "message": "Seed fráza" }, - "revert": { - "message": "Zvrátit" + "revealSeedWordsDescription": { + "message": "Ak niekedy zmeníte prehliadaÄ alebo presuniete poÄítaÄe, budete potrebovaÅ¥ túto seed frázu na prístup k svojim úÄtom. Uložte ich niekde v bezpeÄí a v tajnosti." }, - "rinkeby": { - "message": "Rinkeby Test Network" + "revealSeedWordsWarningTitle": { + "message": "Túto frázu s nikým NEZDIEĽAJTE!" }, - "ropsten": { - "message": "Ropsten Test Network" + "revealSeedWordsWarning": { + "message": "Nebnovujte slova klíÄové fráze na veÅ™ejnosti! Tato slova mohou být použita k odcizení veÅ¡kerých vyaÅ¡ich úÄtů." }, - "currentRpc": { - "message": "SouÄasné RPC" + "remove": { + "message": "OdstrániÅ¥" }, - "connectingToMainnet": { - "message": "PÅ™ipojuji se k Main Ethereum Network" + "removeAccount": { + "message": "OdstrániÅ¥ úÄet" }, - "connectingToRopsten": { - "message": "PÅ™ipojuji se k Ropsten Test Network" + "removeAccountDescription": { + "message": "Tento úÄet bude odstránený z vaÅ¡ej peňaženky. Skôr ako budete pokraÄovaÅ¥, skontrolujte, Äi máte pre tento importovaný úÄet pôvodnú seed frázu alebo súkromný kľúÄ. Z rozbaľovacieho menu úÄtu môžete znova importovaÅ¥ alebo vytvoriÅ¥ úÄty." }, - "connectingToKovan": { - "message": "PÅ™ipojuji se k Kovan Test Network" - }, - "connectingToRinkeby": { - "message": "PÅ™ipojuji se k Rinkeby Test Network" + "readyToConnect": { + "message": "Pripravení na pripojenie?" }, - "connectingToUnknown": { - "message": "PÅ™ipojuji se k neznámé síti" - }, - "sampleAccountName": { - "message": "NapÅ™. můj nový úÄet", - "description": "Help user understand concept of adding a human-readable name to their account" + "goerli": { + "message": "Testovacia sieÅ¥ Goerli" }, "save": { "message": "Uložit" }, - "reprice_title": { - "message": "ZmÄ›nit cenu transakce" + "slow": { + "message": "Pomalé" + }, + "slower": { + "message": "Pomalší" }, - "reprice_subtitle": { - "message": "NavyÅ¡te cenu paliva ve snaze k pÅ™epsání a urychlení vyší transakce" + "saveAsCsvFile": { + "message": "UložiÅ¥ ako súbor CSV" }, - "saveAsFile": { - "message": "Uložit do souboru", - "description": "Account export process" + "scanInstructions": { + "message": "Umiestnite QR kód pred kameru" }, - "saveSeedAsFile": { - "message": "Uložit slova klíÄové fráze do souboru" + "scanQrCode": { + "message": "SkenovaÅ¥ QR kód" }, "search": { "message": "Hledat" }, + "searchResults": { + "message": "Výsledky vyhľadávania" + }, + "secretBackupPhrase": { + "message": "Tajná backup fráza" + }, + "secretBackupPhraseDescription": { + "message": "VaÅ¡a tajná backup fráza uľahÄuje zálohovanie a obnovenie vášho úÄtu." + }, + "secretBackupPhraseWarning": { + "message": "UPOZORNENIE: Nikdy nezverejňujte svoju backup frázu. Každý, kto má túto frázu, môže navždy vziaÅ¥ váš Ether." + }, "secretPhrase": { "message": "Zadejte svých 12 slov tajné fráze k obnovení trezoru." }, - "newPassword8Chars": { - "message": "Nové heslo (min 8 znaků)" + "securityAndPrivacy": { + "message": "BezpeÄnosÅ¥ a súkromie" + }, + "securitySettingsDescription": { + "message": "Nastavenia súkromia a seed fráza peňaženky" + }, + "seedPhrasePlaceholder": { + "message": "Každé slovo oddeľte jednou medzerou" }, "seedPhraseReq": { "message": "klíÄové fráze mají 12 slov" }, - "select": { - "message": "Vybrat" - }, "selectCurrency": { "message": "Vybrat mÄ›nu" }, - "selectService": { - "message": "Vybrat službu" + "selectEachPhrase": { + "message": "Vyberte každú frázu, aby ste sa uistili, že je správna." + }, + "selectLocale": { + "message": "VybraÅ¥ miestne nastavenia" }, "selectType": { "message": "Vybrat typ" @@ -752,59 +939,95 @@ "send": { "message": "Odeslat" }, + "sendAmount": { + "message": "PoslaÅ¥ sumu" + }, "sendETH": { "message": "Odeslat ETH" }, "sendTokens": { "message": "Odeslat tokeny" }, - "onlySendToEtherAddress": { - "message": "Posílejte jen ETH na Ethereum adresu." + "sentEther": { + "message": "poslaný ether" + }, + "sentTokens": { + "message": "poslané tokeny" + }, + "separateEachWord": { + "message": "Každé slovo oddeľte jednou medzerou" }, "searchTokens": { "message": "Hledat tokeny" }, - "sendTokensAnywhere": { - "message": "Posílejte tokeny komukoli s Ethereum úÄtem" + "selectAnAccount": { + "message": "VybraÅ¥ úÄet" + }, + "selectAnAccountHelp": { + "message": "Vyberte úÄet, ktorý chcete zobraziÅ¥ v MetaMask" + }, + "selectAHigherGasFee": { + "message": "Ak chcete urýchliÅ¥ spracovanie transakcie, vyberte vyšší poplatok GAS.*" + }, + "selectHdPath": { + "message": "Vyberte cestu HD" + }, + "selectPathHelp": { + "message": "Ak nevidíte svoje existujúce úÄty v Hlavnej knihe dole, skúste prepnúť cesty na „Odkaz (MEW/MyCrypto)“" }, "settings": { "message": "Nastavení" }, - "info": { - "message": "Informace" + "showAdvancedGasInline": { + "message": "PokroÄilé ovládacie prvky GAS" + }, + "showAdvancedGasInlineDescription": { + "message": "Vyberte túto možnosÅ¥ vtedy, keÄ chcete priamo na obrazovke odosielania a potvrdenia zobraziÅ¥ ceny za GAS a ovládacie prvky limitov." }, - "shapeshiftBuy": { - "message": "Nakoupit na ShapeShift" + "showFiatConversionInTestnets": { + "message": "ZobraziÅ¥ konverziu na Testnets" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Vyberte túto voľbu, ak chcete zobraziÅ¥ konverziu fiat na Testnets" }, "showPrivateKeys": { "message": "Zobrazit privátní klíÄe" }, - "showQRCode": { - "message": "Zobrazit QR kód" + "showHexData": { + "message": "ZobraziÅ¥ údaje Hex" + }, + "showHexDataDescription": { + "message": "Vyberte toto, ak chcete, aby sa na obrazovke odosielania zobrazilo hex dátové pole" }, "sign": { "message": "Podepsat" }, + "signatureRequest": { + "message": "Požadavek podpisu" + }, "signed": { "message": "Podepsáno" }, - "signMessage": { - "message": "Podepsat zprávu" - }, "signNotice": { "message": "Podepsání zprávy může mít \nnebezpeÄný vedlejší uÄinek. Podepisujte zprávy pouze ze \nstránek, kterým plnÄ› důvěřujete celým svým úÄtem.\n Tato nebezpeÄná metoda bude odebrána v budoucí verzi. " }, "sigRequest": { "message": "Požadavek podpisu" }, - "sigRequested": { - "message": "Požádáno o podpis" + "somethingWentWrong": { + "message": "Och! NieÄo zlyhalo." + }, + "speedUp": { + "message": "ZrýchliÅ¥" }, - "spaceBetween": { - "message": "mezi slovy může být pouze mezera" + "speedUpCancellation": { + "message": "Urýchlite toto zruÅ¡enie" }, - "status": { - "message": "Stav" + "speedUpTransaction": { + "message": "UrýchliÅ¥ túto transakciu" + }, + "switchNetworks": { + "message": "Prepnúť siete" }, "stateLogs": { "message": "Stavové protokoly" @@ -815,8 +1038,26 @@ "stateLogError": { "message": "Chyba bÄ›hem získávání stavových protokolů." }, - "submit": { - "message": "Odeslat" + "step1HardwareWallet": { + "message": "1. PripojiÅ¥ hardvérovú peňaženku" + }, + "step1HardwareWalletMsg": { + "message": "Pripojte hardvérovú peňaženku priamo k poÄítaÄu." + }, + "step2HardwareWallet": { + "message": "2. VybraÅ¥ úÄet" + }, + "step2HardwareWalletMsg": { + "message": "Vyberte úÄet, ktorý chcete zobraziÅ¥. Naraz si môžete vybraÅ¥ iba jeden." + }, + "step3HardwareWallet": { + "message": "3. ZaÄaÅ¥ používaÅ¥ dApps a ÄalÅ¡ie!" + }, + "step3HardwareWalletMsg": { + "message": "Použite svoj hardvérový úÄet, ako keby ste použili akýkoľvek úÄet Ethereum. Prihláste sa do Dapps, poÅ¡lite Eth, nakupujte a ukladajte tokeny ERC20 a nezameniteľné tokeny ako CryptoKitties." + }, + "storePhrase": { + "message": "Túto frázu uložte do správcu hesiel ako 1Password." }, "submitted": { "message": "Odesláno" @@ -827,8 +1068,26 @@ "symbolBetweenZeroTwelve": { "message": "Symbol musí být mezi 0 a 12 znaky." }, - "takesTooLong": { - "message": "Trvá to dlouho?" + "syncWithMobile": { + "message": "Synchronizácia s mobilom" + }, + "syncWithMobileTitle": { + "message": "Synchronizácia s mobilom" + }, + "syncWithMobileDesc": { + "message": "Svoje úÄty a informácie môžete synchronizovaÅ¥ so svojim mobilným zariadením. Otvorte mobilnú aplikáciu MetaMask, prejdite na „Nastavenia“ a kliknite na „SynchronizovaÅ¥ z rozšírenia prehliadaÄa“." + }, + "syncWithMobileDescNewUsers": { + "message": "Ak otvoríte mobilnú aplikáciu MetaMask prvýkrát, postupujte podľa pokynov v telefóne." + }, + "syncWithMobileScanThisCode": { + "message": "Naskenujte tento kód pomocou mobilnej aplikácie MetaMask" + }, + "syncWithMobileBeCareful": { + "message": "Pri skenovaní tohto kódu sa uistite, že sa nikto iný nedíva na vaÅ¡u obrazovku" + }, + "syncWithMobileComplete": { + "message": "VaÅ¡e údaje boli úspeÅ¡ne synchronizované. Užite si mobilnú aplikáciu MetaMask!" }, "terms": { "message": "Podmínky použití" @@ -836,70 +1095,93 @@ "testFaucet": { "message": "Testovací faucet" }, - "to": { - "message": "Komu" + "thisWillCreate": { + "message": "Týmto sa vytvorí nová peňaženka a seed fráza" }, - "toETHviaShapeShift": { - "message": "$1 na ETH pÅ™es ShapeShift", - "description": "system will fill in deposit type in start of message" + "tips": { + "message": "Príspevky" }, - "tokenAddress": { - "message": "Adresa tokenu" + "to": { + "message": "Komu" }, "tokenAlreadyAdded": { "message": "Token byl už pÅ™idán." }, - "tokenBalance": { - "message": "Váš zůstatek tokenu je:" - }, - "tokenSelection": { - "message": "Vyhledejte token nebo je vyberte z naÅ¡eho seznamu oblíbených tokenů." + "tokenContractAddress": { + "message": "Kontaktná adresa tokenu" }, "tokenSymbol": { "message": "Symbol tokenu" }, - "tokenWarning1": { - "message": "MÄ›jte pÅ™ehled o tokenech, které jste koupili s úÄtem MetaMasku. Pokud jste koupili tokeny s jiným úÄtem, tyto tokeny se zde nezobrazí." - }, "total": { "message": "Celkem" }, - "transactions": { - "message": "transakce" + "transaction": { + "message": "transakcia" + }, + "transactionConfirmed": { + "message": "Transakcia potvrdená na $2." + }, + "transactionCreated": { + "message": "Transakcia bola vytvorená s hodnotou $1 na $2." + }, + "transactionDropped": { + "message": "Transakcia klesla na $2." + }, + "transactionSubmitted": { + "message": "Transakcia bola odoslaná s poplatkom za GAS z $1 na $2." + }, + "transactionResubmitted": { + "message": "Transakcia znovu odoslaná s poplatkom za GAS zvýšeným na $1 na $2" + }, + "transactionUpdated": { + "message": "Transakcia bola aktualizovaná na $2." + }, + "transactionErrored": { + "message": "Pri transakcii sa vyskytla chyba." + }, + "transactionCancelAttempted": { + "message": "Pokus o zruÅ¡enie transakcie s poplatkom GAS z $1 na $2" + }, + "transactionCancelSuccess": { + "message": "Transakcia bola úspeÅ¡ne zruÅ¡ená na $2" }, "transactionError": { "message": "Chyba transakce. Vyhozena výjimka v kódu kontraktu." }, - "transactionMemo": { - "message": "Poznámka transakce (nepovinné)" + "transactionErrorNoContract": { + "message": "Pokúša sa zavolaÅ¥ funkciu na nezmluvnú adresu." }, - "transactionNumber": { - "message": "Číslo transakce" + "transactionFee": { + "message": "Poplatok za transakciu" }, - "transfers": { - "message": "PÅ™evody" + "transactionTime": { + "message": "ÄŒas transakcie" + }, + "transfer": { + "message": "Prevod" + }, + "transferBetweenAccounts": { + "message": "Prevod medzi mojimi úÄtami" + }, + "transferFrom": { + "message": "Presun z" }, "troubleTokenBalances": { "message": "MÄ›li jsme problém s naÄtením vaÅ¡ich tokenových zůstatků. Můžete je vidÄ›t ", "description": "Followed by a link (here) to view token balances" }, - "twelveWords": { - "message": "TÄ›chto 12 slov je jedinou možností, jak obnovit MetaMask úÄet. \nUložte je na bezpeÄné a neveÅ™ejné místo." + "tryAgain": { + "message": "SkúsiÅ¥ znova" }, "typePassword": { "message": "Zadejte své heslo" }, - "uiWelcome": { - "message": "Vítejte v novém rozhraní (Beta)" - }, - "uiWelcomeMessage": { - "message": "Používáte nyní nové rozhraní MetaMasku. RozhlédnÄ›te se kolem, vyzkouÅ¡ejte nové funkce, jako jsou zasílání tokenů, a dejte nám vÄ›dÄ›t, pokud narazíte na problém." - }, "unapproved": { "message": "Neschváleno" }, - "unavailable": { - "message": "Nedostupné" + "units": { + "message": "jednotky" }, "unknown": { "message": "Neznámé" @@ -907,47 +1189,79 @@ "unknownNetwork": { "message": "Neznámá soukromá síť" }, - "unknownNetworkId": { - "message": "Neznámé ID sítÄ›" + "unknownQrCode": { + "message": "Chyba: Kód QR sa nepodarilo identifikovaÅ¥" }, - "uriErrorMsg": { - "message": "URI vyžadují korektní HTTP/HTTPS prefix." + "unknownCameraErrorTitle": { + "message": "Och! NieÄo zlyhalo..." }, - "usaOnly": { - "message": "jen v USA", - "description": "Using this exchange is limited to people inside the USA" + "unknownCameraError": { + "message": "Pri pokuse o prístup k fotoaparátu sa vyskytla chyba. Skúste znova..." }, - "usedByClients": { - "message": "Používána různými klienty" + "unlock": { + "message": "Odomknúť" }, - "useOldUI": { - "message": "Použijte staré rozhraní" + "unlockMessage": { + "message": "Decentralizovaný web Äaká" }, - "validFileImport": { - "message": "Musíte vybrat validní soubor k importu." + "updatedWithDate": { + "message": "Aktualizované $1" }, - "vaultCreated": { - "message": "Trezor vytvoÅ™en" + "urlErrorMsg": { + "message": "URI vyžadují korektní HTTP/HTTPS prefix." + }, + "usedByClients": { + "message": "Používána různými klienty" + }, + "userName": { + "message": "Meno používateľa" }, "viewAccount": { "message": "Zobrazit úÄet" }, + "viewinExplorer": { + "message": "ZobraziÅ¥ v Exploreri" + }, + "viewContact": { + "message": "ZobraziÅ¥ kontakt" + }, + "viewOnCustomBlockExplorer": { + "message": "ZobraziÅ¥ na $1" + }, + "viewOnEtherscan": { + "message": "ZobraziÅ¥ na Etherscan" + }, "visitWebSite": { "message": "NavÅ¡tivte naÅ¡i stránku" }, - "warning": { - "message": "Varování" + "walletSeed": { + "message": "KlíÄová fráze peněženky" + }, + "welcomeBack": { + "message": "Vitajte späť!" }, - "welcomeBeta": { - "message": "Vítejte v MetaMask Beta" + "welcome": { + "message": "Vitajte v MetaMask" }, - "whatsThis": { - "message": "Co to je?" + "writePhrase": { + "message": "Túto frázu si zapíšte na papier a uložte na bezpeÄnom mieste. Kvôli vyššej bezpeÄnosti si ho môžete napísaÅ¥ na niekoľko papierov a uložiÅ¥ na 2 – 3 rôzne miesta." + }, + "yesLetsTry": { + "message": "Ãno, skúsme to" + }, + "youNeedToAllowCameraAccess": { + "message": "Ak chcete používaÅ¥ túto funkciu, musíte povoliÅ¥ prístup k fotoaparátu." }, "yourSigRequested": { "message": "Je vyžadován váš podpis" }, "youSign": { "message": "Podepisujete" + }, + "yourPrivateSeedPhrase": { + "message": "VaÅ¡a súkromná seed fráza" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "Nulová cena za GAS pri zrýchlení" } } diff --git a/app/_locales/sl/messages.json b/app/_locales/sl/messages.json index d04ba1ee7f76..c5659aaa6c6b 100644 --- a/app/_locales/sl/messages.json +++ b/app/_locales/sl/messages.json @@ -1,51 +1,18 @@ { - "privacyMode": { - "message": "Zasebnostni naÄin" - }, - "privacyModeDescription": { - "message": "Spletne strani morajo zahtevati dovoljenje za ogled podatkov o vaÅ¡em raÄunu." - }, - "privacyNotice": { - "message": "Obvestilo o zasebnosti" - }, - "exposeAccounts": { - "message": "Razkrij raÄune" - }, - "exposeDescription": { - "message": "Razkrij raÄune trenutni spletni strani. PriporoÄeno za starejÅ¡e dApps." - }, - "confirmExpose": { - "message": "Ste prepriÄani da želite razkriti raÄune trenutni spletni strani?" - }, - "confirmClear": { - "message": "Ste prepriÄani da želite poÄistiti odobrene spletne strani?" + "chartOnlyAvailableEth": { + "message": "Grafikon na voljo le v glavnih omrežjih." }, "contractInteraction": { "message": "Interakcija s pogodbo" }, - "clearApprovalDataSuccess": { - "message": "Odobrene spletne strani uspeÅ¡no poÄiÅ¡Äene." - }, - "approvalData": { - "message": "Podatki o odobritvi" - }, - "approvalDataDescription": { - "message": "PoÄistite seznam odobrenih spletnih strani, tako da bodo morale ponovno zahtevati odobritev." - }, - "clearApprovalData": { - "message": "PoÄisti podatke o odobritvi" - }, - "providerAPIRequest": { - "message": "Zahteva za Ethereum API" - }, - "reviewProviderRequest": { - "message": "Preglejte zahtevo za Ethereum API." + "reject": { + "message": "Zavrni" }, - "providerRequestInfo": { - "message": "Domena zahteva dostop do verige blokov in ogled vaÅ¡ega raÄuna. Pred potrditvjo vedno preverite ali ste na želeni spletni strani." + "about": { + "message": "O možnostih" }, - "accept": { - "message": "Potrdi" + "aboutSettingsDescription": { + "message": "RazliÄica, center za podporo in podatki za stik" }, "acceleratingATransaction": { "message": "* PospeÅ¡itev transakcije z viÅ¡jo gas ceno poveÄa njene možnosti za hitrejÅ¡o obdelavo v omrežju, vendar ni vedno zagotovljena." @@ -71,14 +38,29 @@ "activityLog": { "message": "dnevnik dejavnosti" }, - "address": { - "message": "Naslov" + "addNetwork": { + "message": "Dodaj omrežje" + }, + "addRecipient": { + "message": "Dodaj prejemnika" + }, + "advanced": { + "message": "Napredno" + }, + "advancedSettingsDescription": { + "message": "Dostopite do funkcij razvijalca, prenesite dnevnike držav, ponastavite raÄun, nastavite testne mreže in RPC po meri" }, "advancedOptions": { "message": "Napredne možnosti" }, - "addCustomToken": { - "message": "Dodaj žeton po meri" + "addToAddressBook": { + "message": "Dodaj stik v imenik" + }, + "addToAddressBookModalPlaceholder": { + "message": "npr. Jaka N." + }, + "addAlias": { + "message": "Dodaj vzdevek" }, "addToken": { "message": "Dodaj žeton" @@ -92,18 +74,9 @@ "addAcquiredTokens": { "message": "Dodaj žetone pridobljene z MetaMask" }, - "advanced": { - "message": "Napredno" - }, "amount": { "message": "Znesek" }, - "amountPlusGas": { - "message": "Znesek + Gas" - }, - "amountPlusTxFee": { - "message": "Znesek + TX Fee" - }, "appDescription": { "message": "Denarnica za Ethereum v brskalniku", "description": "The description of the application" @@ -118,6 +91,9 @@ "approved": { "message": "Potrjeno" }, + "asset": { + "message": "Sredstva" + }, "attemptingConnect": { "message": "Povezovanje z verigo blokov ..." }, @@ -130,8 +106,11 @@ "attributions": { "message": "Dodelitve" }, - "available": { - "message": "Na voljo" + "autoLockTimeLimit": { + "message": "ÄŒasovnik za samodejno odjavo (minute)" + }, + "autoLockTimeLimitDescription": { + "message": "Nastavite, po koliko minutah mirovanja naj se MetaMask samodejno odjavi" }, "average": { "message": "PovpreÄje" @@ -139,90 +118,69 @@ "back": { "message": "Nazaj" }, - "backupPhraseConfirmation": { - "message": "Potrdite vaÅ¡o tajno varnostno kopijo" - }, - "backupPhraseSelect": { - "message": "Izberite vsako besedo, da se prepriÄate, da je pravilna." - }, - "backupPhraseReveal": { - "message": "Kliknite tukaj, da razkrijete skrivne besede" + "backToAll": { + "message": "Nazaj na vse" }, - "backupPhraseTitle": { - "message": "Skrivna rezervna fraza" + "backupApprovalNotice": { + "message": "Varnostno kopirajte kodo Secret Recovery, da ohranite denarnico in sredstva varna." }, - "backupPhraseInfo": { - "message": "VaÅ¡a skrivna rezervna fraza omogoÄa preprosto varnostno kopiranje in obnovitev raÄuna." + "backupApprovalInfo": { + "message": "Ta skrivna koda je potrebna za obnovitev denarnice, Äe izgubite napravo, pozabite geslo, ponovno namestite MetaMask ali želite dostopati do denarnice v drugi napravi." }, - "backupPhraseWarning": { - "message": "OPOZORILO: Nikoli ne razkrijte varnostne fraze. Vsakdo s to frazo lahko vzame vaÅ¡ Ether za vedno." - }, - "backupPhraseTip1": { - "message": "Shranite to frazo v upravitelja gesel, na primer 1Password." - }, - "backupPhraseTip2": { - "message": "Ta stavek napiÅ¡ite na list papirja in ga shranite na varno mesto. ÄŒe želite Å¡e veÄ varnosti, jo zapiÅ¡ite na veÄ listov papirja in shranite na od 2 do 3 razliÄnih mestih." - }, - "backupPhraseTip3": { - "message": "Zapomnite si to frazo." - }, - "backupPhraseDownload": { - "message": "Prenesite varnostno kopijo" - }, - "backupPhraseStore": { - "message": "in jo shranite na zunanji Å¡ifrirani trdi disk ali medij za shranjevanje." + "backupNow": { + "message": "Varnostno kopiraj zdaj" }, "balance": { "message": "Znesek" }, - "balances": { - "message": "Znesek žetonov" - }, - "balanceIsInsufficientGas": { - "message": "Nezadnosten znesek za trenutni gas" + "balanceOutdated": { + "message": "Stanje morda ni posodobljeno" }, "basic": { "message": "Osnovno" }, - "beta": { - "message": "BETA" + "blockExplorerUrl": { + "message": "Blokiraj Explorer" }, - "betweenMinAndMax": { - "message": "mora biti veÄji ali enak $1 in manjÅ¡i ali enak $1.", - "description": "helper for inputting hex as decimal input" + "blockExplorerView": { + "message": "Ogled raÄuna na  $1 ", + "description": "$1 replaced by URL for custom block explorer" }, "blockiesIdenticon": { "message": "Uporabi identifikacijo Blockies" }, - "borrowDharma": { - "message": "Izposoja z Dharma (Beta)" - }, "browserNotSupported": { "message": "VaÅ¡ brskalnik ni podptrt ..." }, "builtInCalifornia": { "message": "MetaMask je zasnovan in ustvarjen v Kaliforniji." }, - "buy": { - "message": "Kupi" + "buyWithWyre": { + "message": "Kupi ETH z Wyre" }, - "buyCoinbase": { - "message": "Kupi na Coinbase" + "buyWithWyreDescription": { + "message": "Wyre vam omogoÄa, da s kreditno kartico nakažete ETH neposredno na svoj raÄun MetaMask." }, - "buyCoinbaseExplainer": { - "message": "Coinbase je najpopularnejÅ¡i naÄun za kupovanje in prodajo bitcoinov, ethereuma, in litecoina." + "buyCoinSwitch": { + "message": "Kupi na CoinSwitch" + }, + "buyCoinSwitchExplainer": { + "message": "CoinSwitch je destinacija na enem mestu za izmenjavo veÄ kot 300 kriptokotovitev po najboljÅ¡i hitrosti." }, "bytes": { "message": "Bajti" }, + "off": { + "message": "Izklopljeno" + }, "ok": { "message": "V redu" }, - "buyCoinSwitch": { - "message": "Kupi na CoinSwitch" + "on": { + "message": "Vklopljeno" }, - "buyCoinSwitchExplainer": { - "message": "CoinSwitch je destinacija na enem mestu za izmenjavo veÄ kot 300 kriptokotovitev po najboljÅ¡i hitrosti." + "optionalBlockExplorerUrl": { + "message": "Blokiraj URL Explorerja (poljubno)" }, "cancel": { "message": "PrekliÄi" @@ -236,17 +194,11 @@ "cancelled": { "message": "Preklicano" }, - "cancelN": { - "message": "PrekliÄi vseh $1 transakcij" - }, - "classicInterface": { - "message": "Uporabi klasiÄni vmesnik" - }, - "clickCopy": { - "message": "Kliknite za kopiranje" + "chainId": { + "message": "ID verige" }, - "clickToAdd": { - "message": "Kliknite na $1 za dodajo v vaÅ¡ raÄun" + "clickToRevealSeed": { + "message": "Kliknite tukaj, Äe želite razkriti skrivne besede" }, "close": { "message": "Zapri" @@ -257,20 +209,17 @@ "confirm": { "message": "Potrdi" }, - "confirmationTime": { - "message": "ÄŒas potrditve (sec)" - }, "confirmed": { "message": "Potrjeno" }, - "confirmContract": { - "message": "Potrdi pogodbo" - }, "confirmPassword": { "message": "Potrdi geslo" }, - "confirmTransaction": { - "message": "Potrdi transakcijo" + "confirmSecretBackupPhrase": { + "message": "Potrdite svoje skrivno geslo za varnostno kopiranje " + }, + "congratulations": { + "message": "ÄŒestitamo" }, "connectHardwareWallet": { "message": "Poveži strojno denarnico" @@ -278,9 +227,6 @@ "connect": { "message": "Poveži" }, - "connecting": { - "message": "Povezovanje ..." - }, "connectingTo": { "message": "Povezovanje na $1" }, @@ -296,20 +242,14 @@ "connectingToRinkeby": { "message": "Povezovanje na testno omrežje Rinkeby" }, - "connectingToUnknown": { - "message": "Povezovanje na neznano omrežje" - }, - "connectToLedger": { - "message": "Poveži z Ledger" + "connectingToLocalhost": { + "message": "Povezovanje na lokalnega gostitelja 8545 " }, - "connectToTrezor": { - "message": "Poveži z Trezor" + "connectingToGoerli": { + "message": "Povezovanje na testno omrežje Goerli" }, - "continue": { - "message": "Nadaljuj" - }, - "continueToCoinbase": { - "message": "Nadaljuj na Coinbase" + "continueToWyre": { + "message": "Nadaljuj na Wyre" }, "continueToCoinSwitch": { "message": "Nadaljuj na CoinSwitch" @@ -317,33 +257,21 @@ "contractDeployment": { "message": "Ustvarjanje pogodbe" }, - "conversionProgress": { - "message": "Pretvorba v teku" - }, - "copiedButton": { - "message": "Kopirano" - }, - "copiedClipboard": { - "message": "Kopirano v odložiÅ¡Äe!" - }, "copiedExclamation": { "message": "Kopirano!" }, - "copiedSafe": { - "message": "Prilepil sem ga na varno" - }, - "copy": { - "message": "Kopiraj" - }, "copyAddress": { "message": "Kopiraj naslov v odložiÅ¡Äe" }, + "copyTransactionId": { + "message": "Kopiraj ID transakcije" + }, + "copiedTransactionId": { + "message": "ID transakcije skopirana" + }, "copyToClipboard": { "message": "Kopiraj v odložiÅ¡Äe" }, - "copyButton": { - "message": " Kopiraj " - }, "copyPrivateKey": { "message": "To je vaÅ¡ zesebni kljuÄ (kliknite za kopiranje)" }, @@ -353,28 +281,18 @@ "createAccount": { "message": "Ustvari raÄun" }, - "createDen": { - "message": "Ustvari" + "createAWallet": { + "message": "Ustvari denarnico" }, "createPassword": { "message": "Ustvari geslo" }, - "crypto": { - "message": "Kripto", - "description": "Exchange type (cryptocurrencies)" - }, - "currentConversion": { - "message": "Trenutna pretvorba" + "currencyConversion": { + "message": "Pretvorba valute" }, "currentLanguage": { "message": "Trenutni jezik" }, - "currentNetwork": { - "message": "Trenutno omrežje" - }, - "currentRpc": { - "message": "Trenutni RPC" - }, "customGas": { "message": "Prilagodi gas" }, @@ -384,9 +302,6 @@ "customToken": { "message": "Žeton po meri" }, - "customize": { - "message": "Prilagodi" - }, "customRPC": { "message": "RPC po meri" }, @@ -399,39 +314,21 @@ "defaultNetwork": { "message": "Privzeto omrežje za transkacije je glavno omrežje." }, - "denExplainer": { - "message": "VaÅ¡ DEN je z geslom Å¡ifrirana shramba v MetaMask." + "delete": { + "message": "IzbriÅ¡i" + }, + "deleteAccount": { + "message": "IzbriÅ¡i raÄun" }, "deposit": { "message": "VplaÄaj" }, - "depositBTC": { - "message": "VplaÄajte vaÅ¡ BTC na spodnji naslov:" - }, - "depositEth": { - "message": "VplaÄilo ETH" - }, "depositEther": { "message": "VplaÄilo ethra" }, - "depositFiat": { - "message": "VplaÄilo s klasiÄnimi valutami" - }, - "depositFromAccount": { - "message": "VplaÄilo iz drugega raÄuna" - }, - "depositShapeShift": { - "message": "VplaÄilo z ShapeShift" - }, - "depositShapeShiftExplainer": { - "message": "ÄŒe imate druge kriptovalute, lahko Ether vplaÄate neposredno v MetaMask. Brez raÄunov." - }, "details": { "message": "Podrobnosti" }, - "directDeposit": { - "message": "Neposredno vplaÄilo" - }, "directDepositEther": { "message": "Neposredno vplaÄilo ehera" }, @@ -444,6 +341,9 @@ "downloadGoogleChrome": { "message": "Prenesi Google Chrome" }, + "downloadSecretBackup": { + "message": " Prenesite to skrivno geslo za varnostno kopiranje in jo varno hranite na Å¡ifriranem zunanjem trdem disku ali mediju za shranjevanje podatkov." + }, "downloadStateLogs": { "message": "Prenesi dnevnike state" }, @@ -456,32 +356,56 @@ "edit": { "message": "Uredi" }, - "editAccountName": { - "message": "Uredi ime raÄuna" + "editContact": { + "message": "Uredi stik" + }, + "endOfFlowMessage1": { + "message": "Opravili ste test - vaÅ¡e geslo seed phrase je vaÅ¡a odgovornost - skrbno pazite nanj!" + }, + "endOfFlowMessage2": { + "message": "Nasveti za varno shranjevanje" + }, + "endOfFlowMessage3": { + "message": "Shranite varnostno kopijo na razliÄnih krajih." }, - "editingTransaction": { - "message": "Uredite transakcijo" + "endOfFlowMessage4": { + "message": "Nikoli nikomur ne razkrijte svojega gesla seed phrase." + }, + "endOfFlowMessage5": { + "message": "Pazite na lažno predstavljanje! MetaMask nikoli ne bo spontano zaprosil za vaÅ¡e geslo seed phrase." + }, + "endOfFlowMessage6": { + "message": "ÄŒe morate ponovno varnostno kopirati vaÅ¡e geslo seed phrase, ga najdete v Nastavitve -> Varnost." + }, + "endOfFlowMessage7": { + "message": "ÄŒe imate kakrÅ¡na koli vpraÅ¡anja ali opazite kaj sumljivega, nam piÅ¡ite na support@metamask.io." + }, + "endOfFlowMessage8": { + "message": "MetaMask ne more obnoviti vaÅ¡ega gesla seed phrase. VeÄ informacij." + }, + "endOfFlowMessage9": { + "message": "VeÄ o tem" + }, + "endOfFlowMessage10": { + "message": "KonÄano" }, - "emailUs": { - "message": "PiÅ¡ite nam!" + "ensRegistrationError": { + "message": "Napaka pri registraciji imena ENS" }, - "encryptNewDen": { - "message": "Å ifrirajte vaÅ¡ DEN" + "ensNotFoundOnCurrentNetwork": { + "message": "Imena ENS v trenutnem omrežju ni mogoÄe najti. Poskusite preklopiti na glavno omrežje Ethereum." }, - "ensNameNotFound": { - "message": "Ime ENS ni najdeno" + "enterAnAlias": { + "message": "Vnesite vzdevek" }, "enterPassword": { "message": "Vnesite geslo" }, - "enterPasswordConfirm": { - "message": "Potrdite geslo" - }, "enterPasswordContinue": { "message": "Za nadaljevanje vnesite geslo" }, - "eth": { - "message": "ETH" + "ethereumPublicAddress": { + "message": "Javni naslov Ethereum" }, "etherscanView": { "message": "Poglej raÄun na Etherscan" @@ -489,18 +413,12 @@ "estimatedProcessingTimes": { "message": "Predviden Äas obdelave" }, - "exchangeRate": { - "message": "Menjalni teÄaj" - }, "expandView": { "message": "RazÅ¡iri pogled" }, "exportPrivateKey": { "message": "Izvozi zasebni kljuÄ" }, - "exportPrivateKeyWarning": { - "message": "Izvoz zasebnega kljuÄa na lastno odgovornost." - }, "failed": { "message": "Ni uspelo" }, @@ -510,12 +428,6 @@ "faster": { "message": "HitrejÅ¡i" }, - "fastest": { - "message": "NajhitrejÅ¡i" - }, - "feeChartTitle": { - "message": "Live Transaction Fee Predictions" - }, "fiat": { "message": "KlasiÄne", "description": "Exchange type" @@ -524,39 +436,17 @@ "message": "Uvoz z datoteko ne deluje? Kliknite tukaj!", "description": "Helps user import their account from a JSON file" }, - "followTwitter": { - "message": "Sledite nam na Twitterju" - }, "forgetDevice": { "message": "Pozabi to napravo" }, "from": { "message": "Od" }, - "fromToSame": { - "message": "Naslova poÅ¡iljatelja in prejemnika ne smeta biti enaka" - }, - "fromShapeShift": { - "message": "Od ShapeShift" - }, "functionType": { "message": "Vrsta funkcije" }, - "gas": { - "message": "Gas", - "description": "Short indication of gas cost" - }, - "gasFee": { - "message": "Gas Fee" - }, - "gasLimit": { - "message": "Gas Limit" - }, - "gasLimitCalculation": { - "message": "PriporoÄen gas limit je izraÄunan glede na omrežje." - }, - "gasLimitRequired": { - "message": "Gas limit je zahtevan" + "gasLimitInfoModalContent": { + "message": "Omejitev plina je najveÄja koliÄina enot plina, ki ste jo pripravljeni porabiti." }, "gasLimitTooLow": { "message": "Gas limit mora biti vsaj 21000" @@ -564,26 +454,23 @@ "gasUsed": { "message": "Uporabljen gas" }, - "generatingSeed": { - "message": "Ustvarjenje seed ..." - }, "gasPrice": { "message": "Gas price (GWEI)" }, "gasPriceExtremelyLow": { "message": "Gas Price zelo nizkek" }, + "gasPriceInfoModalContent": { + "message": "Cena plina doloÄa koliÄino etra, ki ste ga pripravljeni plaÄati za vsako enoto plina." + }, "gasPriceNoDenom": { "message": "Gas price" }, - "gasPriceCalculation": { - "message": "PriporoÄen gas price je izraÄunan glede na omrežje." - }, - "gasPriceRequired": { - "message": "Gas price je zahtevan" + "general": { + "message": "SploÅ¡no" }, - "generatingTransaction": { - "message": "Ustvarjanje transakcije" + "generalSettingsDescription": { + "message": "Pretvorba valut, primarna valuta, jezik, identifikacija Blockies" }, "getEther": { "message": "Pridobi Ether" @@ -592,12 +479,11 @@ "message": "Pridobite Ether iz fauceta za $1", "description": "Displays network name for Ether faucet" }, - "getHelp": { - "message": "Get Help." + "getStarted": { + "message": "ZaÄnite" }, - "greaterThanMin": { - "message": "mora biti veÄji ali enak $1.", - "description": "helper for inputting hex as decimal input" + "happyToSeeYou": { + "message": "Veseli nas, da ste nas spet obiskali." }, "hardware": { "message": "strojna" @@ -618,30 +504,15 @@ "message": "tukaj", "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, - "hereList": { - "message": "Tukaj je seznam!!!!" - }, - "hexData": { - "message": "Hex Data" - }, "hide": { "message": "Skrij" }, - "hideToken": { - "message": "Skrij žeton" - }, "hideTokenPrompt": { "message": "Skrijem žeton?" }, "history": { "message": "Zgodovina" }, - "howToDeposit": { - "message": "Kako želite vplaÄati Ether?" - }, - "holdEther": { - "message": "OmogoÄa vam shranjevanje ethra in žetonov ter povezovanje decentraliziranih aplikacij." - }, "import": { "message": "Uvoz", "description": "Button to import an account from a selected file" @@ -652,11 +523,14 @@ "importAccountMsg": { "message": " Uvoženi raÄuna ne bodo povezani s prvotnim seed phase. Preberite veÄ o uvoženih raÄunih " }, - "importAnAccount": { - "message": "IUvozi raÄun" + "importAccountSeedPhrase": { + "message": "Uvoz raÄuna z geslom seed phrase" + }, + "importWallet": { + "message": "Uvozi denarnico" }, - "importDen": { - "message": "Uvozi DEN" + "importYourExisting": { + "message": "Uvozite svojo obstojeÄo denarnico s pomoÄjo 12-besednega gesla seed phrase" }, "imported": { "message": "Uvoženo", @@ -665,9 +539,6 @@ "importUsingSeed": { "message": "Uvozi z seed phase" }, - "info": { - "message": "Info" - }, "infoHelp": { "message": "Info & PomoÄ" }, @@ -689,49 +560,39 @@ "invalidAddressRecipient": { "message": "Neveljaven nasklov prejemnika" }, - "invalidGasParams": { - "message": "Neveljavne gas nastavitve" + "knownAddressRecipient": { + "message": "Znan naslov pogodbe." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "Ni omrežja ETH, nastavljene so male Ärke" }, "invalidInput": { "message": "Neveljaven vnos." }, - "invalidRequest": { - "message": "Neveljavna zahteva" - }, "invalidRPC": { "message": "Neveljaven RPC URL" }, + "invalidBlockExplorerURL": { + "message": "Neveljaven Block Explorer URL" + }, "invalidSeedPhrase": { "message": "Neveljavna seed phrase" }, - "jsonFail": { - "message": "Nekaj je bilo narobe. PrepriÄajte se, da je datoteka JSON pravilno oblikovana." - }, "jsonFile": { "message": "Datoteka JSON", "description": "format for importing an account" }, - "keepTrackTokens": { - "message": "Sledite žetonom, ki ste jih pridobili z MetaMask." - }, "kovan": { "message": "Testno omrežje Kovan" }, - "knowledgeDataBase": { - "message": "ObiÅ¡Äite naÅ¡o pomoÄ" - }, - "max": { - "message": "Max" - }, "learnMore": { "message": "Preberite veÄ" }, "ledgerAccountRestriction": { "message": "Za dodajanje novega raÄuna morate uporabiti zadnji raÄun." }, - "lessThanMax": { - "message": "mora biti manjÅ¡i ali enak $1.", - "description": "helper for inputting hex as decimal input" + "letsGoSetUp": { + "message": "Lotimo se nastavitev!" }, "likeToAddTokens": { "message": "Želite dodati te žetone?" @@ -739,9 +600,6 @@ "links": { "message": "Povezave" }, - "limit": { - "message": "Meja" - }, "liveGasPricePredictions": { "message": "Napovedi o gas price" }, @@ -751,26 +609,20 @@ "loadingTokens": { "message": "Nalaganje žetonov ..." }, - "localhost": { - "message": "Localhost 8545" - }, - "login": { - "message": "Prijava" + "loadMore": { + "message": "Naloži veÄ" }, - "logout": { + "lock": { "message": "Odjava" }, - "loose": { - "message": "Loose" - }, - "loweCaseWords": { - "message": "seed words lahko vsebujejo samo male Ärke" - }, "mainnet": { "message": "Glavno omrežje" }, - "menu": { - "message": "Meni" + "memorizePhrase": { + "message": "Zapomnite si geslo seed phrase" + }, + "memo": { + "message": "okrožnica" }, "message": { "message": "SporoÄilo" @@ -778,24 +630,21 @@ "metamaskDescription": { "message": "MetaMask je varen identitetni sklad za Ethereum." }, - "metamaskSeedWords": { - "message": "Seed Words" - }, "metamaskVersion": { "message": "RazliÄica" }, - "min": { - "message": "Najmanj" - }, - "missingYourTokens": { - "message": "Ne vidite vaÅ¡ih žetonov?" - }, - "minutesShorthand": { - "message": "Min" + "mobileSyncText": { + "message": "Vnesite geslo in potrdite, da ste to vi." }, "myAccounts": { "message": "Moji raÄuni" }, + "myWalletAccounts": { + "message": "Moji raÄuni Denarnice" + }, + "myWalletAccountsDescription": { + "message": "Vsi vaÅ¡i raÄuni, ustvarjeni v MetaMasku, bodo samodejno dodani v ta razdelek." + }, "mustSelectOne": { "message": "Izbran mora biti vsaj 1 žeton." }, @@ -806,49 +655,60 @@ "message": "Za uvoz morate izbrati datoteko.", "description": "User is important an account and needs to add a file to continue" }, - "needImportPassword": { - "message": "Za izbrano datoteko morate vnesti geslo.", - "description": "Password and file needed to import an account" - }, "negativeETH": { "message": "Negativnih zneskov ETH ni mogoÄe poslati." }, + "networkName": { + "message": "Ime omrežja" + }, "networks": { "message": "Omrežja" }, + "networkSettingsDescription": { + "message": "Dodajte in uredite omrežja RPC po meri" + }, "nevermind": { "message": "Pozabi" }, "newAccount": { "message": "Nov raÄun" }, + "newAccountDetectedDialogMessage": { + "message": "Zaznan je nov naslov! Kliknite tukaj, da ga dodate v svoj imenik." + }, "newAccountNumberName": { "message": "RaÄun $1", "description": "Default name of next account to be created on create account screen" }, + "newContact": { + "message": "Nov stik" + }, "newContract": { "message": "Nova pogodba" }, "newPassword": { "message": "Novo geslo (min 8 znakov)" }, - "newPassword8Chars": { - "message": "Novo geslo (min 8 znakov)" - }, - "newRecipient": { - "message": "Nov prejemnik" - }, "newNetwork": { "message": "Novo omrežje" }, - "rpcURL": { - "message": "Nov RPC URL" + "newToMetaMask": { + "message": "Ste novi na MetaMask?" + }, + "noAlreadyHaveSeed": { + "message": "Ne, hvala, že imam seed phrase" }, - "showAdvancedOptions": { - "message": "Pokaži napredne možnosti" + "protectYourKeys": { + "message": "Varujte svoje kljuÄe!" }, - "hideAdvancedOptions": { - "message": "Skrij napredne možnosti" + "protectYourKeysMessage1": { + "message": "Bodite previdni in svoj seed phrase skrbno varujte - obstajajo poroÄila o spletnih mestih, ki poskuÅ¡ajo posnemati MetaMask. MetaMask nikoli ne bo zahteval vaÅ¡ega gesla seed phrase!" + }, + "protectYourKeysMessage2": { + "message": "Hranite svoj seed phrase. ÄŒe opazite sumljivo delovanje ali niste prepriÄani ali je doloÄeno spletno mesto varno, nam piÅ¡ite na support@metamask.io" + }, + "rpcUrl": { + "message": "Nov URL RPC" }, "optionalChainId": { "message": "ChainID (nezahtevano)" @@ -856,9 +716,6 @@ "optionalSymbol": { "message": "Simbol (nezahtevano)" }, - "optionalNickname": { - "message": "Ime (nezahtevano)" - }, "newTotal": { "message": "Novo skupno" }, @@ -871,23 +728,14 @@ "noAddressForName": { "message": "Za to ime ni naslovov." }, - "noDeposits": { - "message": "Prejetih ni niÄ vplaÄil" - }, "noConversionRateAvailable": { "message": "Menjalni teÄaj ni na voljo" }, - "noTransactionHistory": { - "message": "Ni zgodovine transakcij." - }, "noTransactions": { "message": "Nimate transakcij" }, - "notFound": { - "message": "Ni najdeno" - }, - "notStarted": { - "message": "Ni zaÄeto" + "notEnoughGas": { + "message": "Ni dovolj plina" }, "noWebcamFoundTitle": { "message": "Spletna kamera ni najdena" @@ -895,25 +743,8 @@ "noWebcamFound": { "message": "Spletna kamera ni najdena. Poskusite znova kasneje." }, - "oldUI": { - "message": "Star UI" - }, - "oldUIMessage": { - "message": "Vrnili ste se v star uporabniÅ¡ki vmesnik. V novega se lahko vrnete z možnostjo v spustnem meniju v zgornjem desnem kotu." - }, - "onlySendToEtherAddress": { - "message": "Na Ethereum naslov poÅ¡ljute samo ETH." - }, - "onlySendTokensToAccountAddress": { - "message": "Na Ethereum naslov poÅ¡ljute samo $1.", - "description": "displays token symbol" - }, - "openInTab": { - "message": "Odpri v zavihku" - }, - "or": { - "message": "ali", - "description": "choice between creating or importing a new account" + "ofTextNofM": { + "message": "od" }, "orderOneHere": { "message": "NaroÄite Trezor ali Ledger i n zavarujte svoje premoženje s strojno denarnico" @@ -921,57 +752,34 @@ "origin": { "message": "Izvor" }, - "outgoing": { - "message": "Odhodni" - }, "parameters": { "message": "Parametri" }, - "originalTotal": { - "message": "Izvirna vsota" + "participateInMetaMetrics": { + "message": "Sodelujte v MetaMetrics" + }, + "participateInMetaMetricsDescription": { + "message": "Sodelujte v MetaMetrics in nam pomagajte izboljÅ¡ati MetaMask" }, "password": { "message": "Geslo" }, - "passwordCorrect": { - "message": "PrepriÄajte se, da je geslo pravilno." - }, "passwordsDontMatch": { "message": "Gesli se ne ujemata" }, - "passwordMismatch": { - "message": "gesli se ne ujemata", - "description": "in password creation process, the two new password fields did not match" - }, "passwordNotLongEnough": { "message": "Geslo ni dovolj dolgo" }, - "passwordShort": { - "message": "geslo ni dovolj dolgo", - "description": "in password creation process, the password is not long enough to be secure" - }, "pastePrivateKey": { "message": "Tukaj prilepite vaÅ¡ zasebni kljuÄ:", "description": "For importing an account from a private key" }, - "pasteSeed": { - "message": "Tukaj prilepite seed phase!" - }, "pending": { "message": "v obdelavi" }, "personalAddressDetected": { "message": "Zaznan je osebni naslov. Vnesite naslov pogodbe žetona." }, - "phishingWarning": { - "message": "Opozorilo o lažnem predstavljanju" - }, - "pleaseReviewTransaction": { - "message": "Preglejte vaÅ¡o transakcijo." - }, - "popularTokens": { - "message": "Priljubljeni žetoni" - }, "prev": { "message": "Prej" }, @@ -994,32 +802,20 @@ "privateNetwork": { "message": "Zasebno omrežje" }, - "qrCode": { - "message": "Prikaži QR kodo" - }, "queue": { "message": "ÄŒakalna vrsta" }, "readdToken": { "message": "Ta žeton lahko dodate tudi kasneje z uporabo gumba “Dodaj žeton†v možnostih vaÅ¡ega raÄuna." }, - "readMore": { - "message": "Tukaj preberite veÄ." - }, - "readMore2": { - "message": "Preberite veÄ." - }, - "receive": { - "message": "Prejmi" + "recents": { + "message": "Nedavno" }, "recipientAddress": { "message": "Prejemnikov naslov" }, - "refundAddress": { - "message": "Naslov za vraÄilo." - }, - "reject": { - "message": "Zavrni" + "recipientAddressPlaceholder": { + "message": "Iskanje, javni naslov (0x) ali ENS" }, "rejectAll": { "message": "Zavrni vse" @@ -1042,30 +838,33 @@ "resetAccountDescription": { "message": "Ponastavljanje raÄuna bo izbrisalo zgodovino transakcij." }, + "deleteNetwork": { + "message": "IzbriÅ¡em to omrežje?" + }, + "deleteNetworkDescription": { + "message": "Ali ste prepriÄani, da želite izbrisati to omrežje?" + }, + "remindMeLater": { + "message": "Opomni me pozneje" + }, "restoreFromSeed": { "message": "Obnovim raÄun?" }, - "restoreVault": { - "message": "Obnovi shrambo" - }, "restoreAccountWithSeed": { "message": "Obnovi raÄun z seed phrase" }, + "requestsAwaitingAcknowledgement": { + "message": "zahteve, ki Äakajo na potrditev" + }, "required": { "message": "Zahtevano" }, - "retryWithMoreGas": { - "message": "Poskusite z veÄjim gas price" - }, "restore": { "message": "Obnovi" }, "revealSeedWords": { "message": "Razkrij seed words" }, - "revealSeedWordsTitle": { - "message": "Seed Phrase" - }, "revealSeedWordsDescription": { "message": "ÄŒe želite zamenjati brskalnik ali raÄunalnik, potrebujete vaÅ¡ seed phase za dostop do raÄuna. Shranite ga na varno skrito mesto." }, @@ -1075,9 +874,6 @@ "revealSeedWordsWarning": { "message": "S temi besedami lahko kdorkoli ukrade vse vaÅ¡e raÄune." }, - "revert": { - "message": "Obnovi" - }, "remove": { "message": "izbriÅ¡i" }, @@ -1096,12 +892,8 @@ "ropsten": { "message": "Testno omrežje Ropsten" }, - "rpc": { - "message": "RPC po meri" - }, - "sampleAccountName": { - "message": "npr. Moj raÄun", - "description": "Help user understand concept of adding a human-readable name to their account" + "goerli": { + "message": "Testno omrežje Goerli" }, "save": { "message": "Shrani" @@ -1115,13 +907,6 @@ "saveAsCsvFile": { "message": "Shrani kot CSV datoteko" }, - "saveAsFile": { - "message": "Shrani kot datoteko", - "description": "Account export process" - }, - "saveSeedAsFile": { - "message": "Shrani seed words kot datoteko" - }, "scanInstructions": { "message": "Postavite QR kodo pred vaÅ¡o kamero" }, @@ -1134,30 +919,39 @@ "searchResults": { "message": "Rezultati iskanja" }, + "secretBackupPhrase": { + "message": "Skrivno geslo za varnostno kopiranje" + }, + "secretBackupPhraseDescription": { + "message": "VaÅ¡e skrivno geslo za varnostno kopiranje olajÅ¡a varnostno kopiranje in obnovitev raÄuna." + }, + "secretBackupPhraseWarning": { + "message": "OPOZORILO: Nikoli nikomur ne razkrijte varnostne kopije. Kdorkoli lahko tem geslom vedno prevzame vaÅ¡ Ether." + }, "secretPhrase": { "message": "Vnesite vaÅ¡ih dvanajst besed za obnovitev vaÅ¡ih raÄunov." }, - "secondsShorthand": { - "message": "Sec" + "securityAndPrivacy": { + "message": "Varnost in zasebnost" + }, + "securitySettingsDescription": { + "message": "Nastavitve zasebnosti in geslo za denarnico seed phrase " + }, + "seedPhrasePlaceholder": { + "message": "Vsako besedo loÄite z enim presledkom" }, "seedPhraseReq": { "message": "Seed phrase mora biti dolg 12 besed" }, - "seedPhraseAlert": { - "message": "Opozorilo o seed phrase" - }, - "select": { - "message": "Izberi" - }, "selectCurrency": { "message": "Izberi valuto" }, + "selectEachPhrase": { + "message": "Izberite vsako geslo ter se prepriÄajte, da je pravilno." + }, "selectLocale": { "message": "Izberi jezik" }, - "selectService": { - "message": "Izberi storitev" - }, "selectType": { "message": "Izberi vrsto" }, @@ -1185,9 +979,6 @@ "searchTokens": { "message": "Iskanje žetonov" }, - "selectAnAddress": { - "message": "Izberi naslov" - }, "selectAnAccount": { "message": "Izberi raÄun" }, @@ -1203,21 +994,24 @@ "selectPathHelp": { "message": "ÄŒe obstojeÄih Ledger ne vidite, poskusite izbrati \"Legacy (MEW / MyCrypto)\"" }, - "sendTokensAnywhere": { - "message": "PoÅ¡ljite žetone komurkoli z Ethereum naslovom" - }, "settings": { "message": "Nastavitve" }, - "shapeshiftBuy": { - "message": "Kupi z Shapeshift" + "showAdvancedGasInline": { + "message": "Napredno krmiljenje plina" + }, + "showAdvancedGasInlineDescription": { + "message": "Izberite to možnost, Äe želite prikazati ceno plina in omejiti nadzor neposredno na zaslonih za poÅ¡iljanje in potrditev." + }, + "showFiatConversionInTestnets": { + "message": "Pokažite pretvorbo na testnih omrežjih" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Izberite to možnost, Äe želite prikazati pretvorbo klasiÄnih valut na preskusnih omrežjih" }, "showPrivateKeys": { "message": "Pokaži zasebni kljuÄ" }, - "showQRCode": { - "message": "Pokaži QR kodo" - }, "showHexData": { "message": "Pokaži Hex Data" }, @@ -1233,33 +1027,18 @@ "signed": { "message": "Podpisano" }, - "signMessage": { - "message": "PodpiÅ¡i sporoÄilo" - }, "signNotice": { "message": "To podpisovanje lahko povzroÄi \nnevarne stranske uÄinke. Podpisujte samo sporoÄila \nstrani, ki jim zaupate s svojim celotnim raÄunom.\n Ta nevarna funkcija bo odstranjena v prihodnji razliÄici. " }, "sigRequest": { "message": "Zahteva za podpis" }, - "sigRequested": { - "message": "Podpis zahtevan" - }, "somethingWentWrong": { "message": "Oops! Nekaj je Å¡lo narobe." }, - "spaceBetween": { - "message": "med besedami je lahko samo presledek" - }, "speedUp": { "message": "pospeÅ¡i" }, - "speedUpTitle": { - "message": "PospeÅ¡i transakcijo" - }, - "speedUpSubtitle": { - "message": "PoveÄajte gas prise za pospeÅ¡itev transakcije" - }, "speedUpCancellation": { "message": "PospeÅ¡ite preklic" }, @@ -1269,9 +1048,6 @@ "switchNetworks": { "message": "Preklop omrežja" }, - "status": { - "message": "Status" - }, "stateLogs": { "message": "State dnevniki" }, @@ -1299,8 +1075,8 @@ "step3HardwareWalletMsg": { "message": "Uporabite strojno denarnico kot katerikoli drug Ethereum raÄun. Prijavite se v dApps, poÅ¡ljite Ether in ERC20 žetone in žetone kot CryptoKitties." }, - "submit": { - "message": "Potrdi" + "storePhrase": { + "message": "To geslo shranite v upravitelja gesel, kot je 1Password." }, "submitted": { "message": "Potrjeno" @@ -1308,11 +1084,32 @@ "supportCenter": { "message": "ObiÅ¡Äite naÅ¡e srediÅ¡Äe za podporo" }, + "symbol": { + "message": "Simbol" + }, "symbolBetweenZeroTwelve": { - "message": "Simbol mora imeti med 0 in 12 znakov." + "message": "Simbol mora biti najveÄ 11 znakov ali manj." }, - "takesTooLong": { - "message": "Trava predolgo?" + "syncWithMobile": { + "message": "Sinhroniziraj z mobilnimi telefonom" + }, + "syncWithMobileTitle": { + "message": "Sinhroniziraj z mobilnimi telefonom" + }, + "syncWithMobileDesc": { + "message": "RaÄune in podatke lahko sinhronizirate s svojo mobilno napravo. Odprite mobilno aplikacijo MetaMask, pojdite na \"Nastavitve\" in tapnite \"Sinhroniziraj z razÅ¡iritvijo brskalnika\"" + }, + "syncWithMobileDescNewUsers": { + "message": "ÄŒe ste sedaj prviÄ odprli aplikacijo MetaMask Mobile, samo sledite korakom v telefonu." + }, + "syncWithMobileScanThisCode": { + "message": "Skenirajte to kodo z mobilno aplikacijo MetaMask" + }, + "syncWithMobileBeCareful": { + "message": "Ko skenirate to kodo, naj nihÄe ne kuka na vaÅ¡ zaslon" + }, + "syncWithMobileComplete": { + "message": "VaÅ¡i podatki so uspeÅ¡no sinhronizirani. Uživajte v mobilni aplikaciji MetaMask!" }, "terms": { "message": "Pogoji uporabe" @@ -1320,37 +1117,27 @@ "testFaucet": { "message": "Testni faucet" }, + "thisWillCreate": { + "message": "S tem korakom boste ustvarili novo denarnico in geslo seed phrase" + }, "tips": { "message": "Nasveti" }, "to": { "message": "Za" }, - "toETHviaShapeShift": { - "message": "$1 v ETH prek ShapeShift", - "description": "system will fill in deposit type in start of message" - }, "token": { "message": "Žeton" }, - "tokenAddress": { - "message": "Naslov žetona" - }, "tokenAlreadyAdded": { "message": "Žeton je bil že dodan." }, - "tokenBalance": { - "message": "VaÅ¡ znesek žetonov je:" - }, - "tokenSelection": { - "message": "IÅ¡Äite žetone ali pa jih izberite iz seznama priljubljenih." + "tokenContractAddress": { + "message": "Naslov pogodbe žetona" }, "tokenSymbol": { "message": "Simbol žetona" }, - "tokenWarning1": { - "message": "Sledite žetonom, ki ste jih kupili z MetaMask metamask raÄunom. ÄŒe ste jih kupili drugje, ne bodo prikazani tukaj." - }, "total": { "message": "Skupno" }, @@ -1363,9 +1150,6 @@ "transactionCreated": { "message": "Transakcija z vrednostjo $1 ustvarjena na $2." }, - "transactionWithNonce": { - "message": "Transakcija $1" - }, "transactionDropped": { "message": "Transakcija na $2 preklicana." }, @@ -1378,9 +1162,6 @@ "transactionUpdated": { "message": "Transakcija na $2 spremenjena." }, - "transactionUpdatedGas": { - "message": "Transakcija spremenjena z gas price $1 na $2." - }, "transactionErrored": { "message": "Napaka pri transakciji." }, @@ -1390,9 +1171,6 @@ "transactionCancelSuccess": { "message": "Transakcija je bila uspeÅ¡no preklicana na $2" }, - "transactions": { - "message": "transakcije" - }, "transactionError": { "message": "Napaka pri transakciji. Izjema sprožena v kodi pogodbe." }, @@ -1402,27 +1180,18 @@ "transactionFee": { "message": "Transakcijska provizija" }, - "transactionMemo": { - "message": "Opomba transakcije (nezahtevano)" - }, - "transactionNumber": { - "message": "Å tevilka transakcije" - }, "transactionTime": { "message": "Transakcijski Äas" }, "transfer": { "message": "Prenesi" }, + "transferBetweenAccounts": { + "message": "Prenos med mojimi raÄuni" + }, "transferFrom": { "message": "Prenesi od" }, - "transfers": { - "message": "Prenosi" - }, - "trezorHardwareWallet": { - "message": "Strojna denarnica TREZOR" - }, "troubleTokenBalances": { "message": "ÄŒe imate težave pri ogledu zneskov žetonov si jih lahko ogledate ", "description": "Followed by a link (here) to view token balances" @@ -1430,48 +1199,21 @@ "tryAgain": { "message": "Poskusi znova" }, - "twelveWords": { - "message": "Edini naÄin za obnovitev MetaMask raÄuna, je teh 12 besed.\nShranite jih na varno in skrivno mesto." - }, "typePassword": { "message": "Vnesite vaÅ¡e MetaMask geslo" }, - "uiWelcome": { - "message": "DobrodoÅ¡li v nov UI (Beta)" - }, - "uiWelcomeMessage": { - "message": "Uporabljate nov uporabniÅ¡ki vmesnik." - }, "unapproved": { "message": "Neodobreno" }, - "unavailable": { - "message": "Ni na voljo" - }, "units": { "message": "enote" }, - "uniqueImageTitle": { - "message": "VaÅ¡a edinstvena slika raÄuna" - }, - "uniqueImageBodyText1": { - "message": "Ta slika je bila programsko ustvarjena z vaÅ¡o novo Å¡tevilko raÄuna." - }, - "uniqueImageBodyText2": { - "message": "To sliko boste videli vsakiÄ, ko boste morali potrditi transakcijo." - }, "unknown": { "message": "Neznano" }, - "unknownFunction": { - "message": "Neznana funkcija" - }, "unknownNetwork": { "message": "Neznano zasebno omrežje" }, - "unknownNetworkId": { - "message": "Neznan ID omrežja" - }, "unknownQrCode": { "message": "Napaka: Te QR kode ni bilo mogoÄe prepoznati" }, @@ -1490,48 +1232,41 @@ "updatedWithDate": { "message": "Posodobljeno $1" }, - "uriErrorMsg": { + "urlErrorMsg": { "message": "URI zahtevajo ustrezno HTTP/HTTPS predpono." }, - "usaOnly": { - "message": "Samo za ZDA", - "description": "Using this exchange is limited to people inside the USA" - }, "usedByClients": { "message": "Uporabljen s strani veÄih razliÄnih odjemalcev" }, - "useOldUI": { - "message": "Uporabi star UI" - }, - "validFileImport": { - "message": "Za uvoz morate izbrati pravilno datoteko." - }, - "vaultCreated": { - "message": "RaÄun je ustvarjen" + "userName": { + "message": "UporabniÅ¡ko ime" }, "viewAccount": { "message": "Poglej raÄun" }, + "viewinExplorer": { + "message": "Ogled v Explorerju" + }, + "viewContact": { + "message": "Ogled stika" + }, + "viewOnCustomBlockExplorer": { + "message": "Ogled na $1 " + }, "viewOnEtherscan": { "message": "Poglej na Etherscan" }, "visitWebSite": { "message": "ObiÅ¡Äite naÅ¡o spletno stran" }, - "walletSeed": { - "message": "Wallet Seed" - }, - "warning": { - "message": "Opozorilo" - }, "welcomeBack": { "message": "DobrodoÅ¡li nazaj!" }, "welcome": { "message": "DobrodoÅ¡li v MetaMask" }, - "whatsThis": { - "message": "Kaj je to?" + "writePhrase": { + "message": "To frazo napiÅ¡ite na papir in shranite na varnem mestu. ÄŒe želite Å¡e veÄjo varnost, si jo zapiÅ¡ite na veÄ kosov papirja in shranite na dveh ali treh razliÄnih lokacijah." }, "yesLetsTry": { "message": "Pa poskusimo" @@ -1549,6 +1284,6 @@ "message": "VaÅ¡ zasebni seed phrase" }, "zeroGasPriceOnSpeedUpError": { - "message":"NiÄelni gas price na pospeÅ¡itvi" + "message": "NiÄelni gas price na pospeÅ¡itvi" } } diff --git a/app/_locales/sr/messages.json b/app/_locales/sr/messages.json new file mode 100644 index 000000000000..468b55d6cc8b --- /dev/null +++ b/app/_locales/sr/messages.json @@ -0,0 +1,1295 @@ +{ + "chartOnlyAvailableEth": { + "message": "Grafikon dostupan jedino na mrežama Ethereum." + }, + "contractInteraction": { + "message": "Ugovorna interakcija" + }, + "reject": { + "message": "Одбиј" + }, + "about": { + "message": "ОÑновни подаци" + }, + "aboutSettingsDescription": { + "message": "Verzija, centar za podrÅ¡ku i podaci za kontakt" + }, + "acceleratingATransaction": { + "message": "* Time Å¡to se ubrzava transakcija koristeći veću gas cenu, povećavaju se Å¡anse da se procesuira brže od strane mreže, ali to nije uvek zagarantovano." + }, + "accessingYourCamera": { + "message": "Pristupa se vaÅ¡oj kameri..." + }, + "account": { + "message": "налог" + }, + "accountDetails": { + "message": "Detalji naloga" + }, + "accountName": { + "message": "Ime naloga" + }, + "accountOptions": { + "message": "Opcije naloga" + }, + "accountSelectionRequired": { + "message": "Potrebno je da izaberete nalog!" + }, + "activityLog": { + "message": "dnevnik aktivnosti" + }, + "addNetwork": { + "message": "Dodajte mrežu" + }, + "addRecipient": { + "message": "Dodaj primaoca" + }, + "advanced": { + "message": "Ðапредне опције" + }, + "advancedSettingsDescription": { + "message": "Pristupite funkcijama za programere, preuzmite državne evidencije, resetujte nalog, postavite testne mreže i prilagoÄ‘eni RPC" + }, + "advancedOptions": { + "message": "Dodatne opcije" + }, + "addToAddressBook": { + "message": "Dodaj u adresar" + }, + "addToAddressBookModalPlaceholder": { + "message": "npr. John D." + }, + "addAlias": { + "message": "Dodaj pseudonim" + }, + "addToken": { + "message": "Dodaj token" + }, + "addTokens": { + "message": "Dodaj tokene" + }, + "addSuggestedTokens": { + "message": "Dodajte sugerisane tokene" + }, + "addAcquiredTokens": { + "message": "Dodajte steÄene tokene koristeći MetaMask." + }, + "amount": { + "message": "Iznos" + }, + "appDescription": { + "message": "Ethereum novÄanik u vaÅ¡em pregledaÄu", + "description": "The description of the application" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "approve": { + "message": "Odobrite" + }, + "approved": { + "message": "Odobreno" + }, + "asset": { + "message": "Sredstva" + }, + "attemptingConnect": { + "message": "PokuÅ¡ava da se poveže na lanac blokova" + }, + "attemptToCancel": { + "message": "PokuÅ¡avate da otkažete?" + }, + "attemptToCancelDescription": { + "message": "Slanje ovog pokuÅ¡aja ne garantuje da će prvobitna transakcija biti otkazana. Ako je pokuÅ¡aj otkazivanja uspeÅ¡an, biće vam naplaćena provizija koja je navedena gore." + }, + "attributions": { + "message": "Atribucije" + }, + "autoLockTimeLimit": { + "message": "Tajmer za automatsko odjavljivanje (u minutama)" + }, + "autoLockTimeLimitDescription": { + "message": "Podesite vreme mirovanja u minutima pre nego Å¡to se MetaMask automatski odjavi. " + }, + "average": { + "message": "ProseÄno" + }, + "back": { + "message": "Ðазад" + }, + "backToAll": { + "message": "Povratak na Sve" + }, + "backupApprovalNotice": { + "message": "Napravite rezervnu kopiju tajnog kôda za oporavak da bi vaÅ¡ novÄanik i sredstva bili bezbedni." + }, + "backupApprovalInfo": { + "message": "Potreban je tajni kôd za oporavak vaÅ¡eg novÄanika u sluÄaju da izgubite ureÄ‘aj, zaboravite lozinku, morate ponovo da instalirate MetaMask ili želite da pristupite novÄaniku sa drugog ureÄ‘aja." + }, + "backupNow": { + "message": "Napravite rezervu sad" + }, + "balance": { + "message": "Bilans" + }, + "balanceOutdated": { + "message": "Saldo je možda zastario" + }, + "basic": { + "message": "ОÑновна" + }, + "blockExplorerUrl": { + "message": "Blok istraživaÄ" + }, + "blockExplorerView": { + "message": "Pogledajte nalog za $1", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "Koristite „Blockies Identiconâ€" + }, + "browserNotSupported": { + "message": "VaÅ¡ pregledaÄ nije podržan..." + }, + "builtInCalifornia": { + "message": "MetaMask je dizajniran i izgraÄ‘en u Kaliforniji." + }, + "buyWithWyre": { + "message": "Kupite ETH preko servisa Wyre" + }, + "buyWithWyreDescription": { + "message": "Wyre vam dozvoljava da koristite kreditnu karticu kako biste deponovali ETH pravo na vaÅ¡ MetaMask nalog." + }, + "buyCoinSwitch": { + "message": "Kupujte na CoinSwitch" + }, + "buyCoinSwitchExplainer": { + "message": "CoinSwitch je odrediÅ¡te gde na jednom mestu možete razmeniti viÅ¡e od 300 kripto valuta po najboljem kursu." + }, + "bytes": { + "message": "Bajtovi" + }, + "off": { + "message": "IskljuÄi" + }, + "ok": { + "message": "U redu" + }, + "on": { + "message": "Укључено" + }, + "optionalBlockExplorerUrl": { + "message": "Blokirajte URL Explorer-a (opciono)" + }, + "cancel": { + "message": "Otkaži" + }, + "cancelAttempt": { + "message": "Otkaži pokuÅ¡aj" + }, + "cancellationGasFee": { + "message": "Otkazivanje gas naknade" + }, + "cancelled": { + "message": "Otkazano" + }, + "clickToRevealSeed": { + "message": "Kliknite ovde kako biste otkrili tajne reÄi" + }, + "close": { + "message": "Затвори" + }, + "chromeRequiredForHardwareWallets": { + "message": "Da biste se povezali sa VaÅ¡im hardverskim novÄanikom morate da koristite MetaMask na Google Chrome-u." + }, + "confirm": { + "message": "Потврди" + }, + "confirmed": { + "message": "PotvrÄ‘eno" + }, + "confirmPassword": { + "message": "Potvrdite lozinku" + }, + "confirmSecretBackupPhrase": { + "message": "Potvrdite svoju tajnu frazu za rezervnu kopiju" + }, + "congratulations": { + "message": "ÄŒestitamo" + }, + "connectHardwareWallet": { + "message": "Povežite Hardverski novÄanik" + }, + "connect": { + "message": "Повезивање" + }, + "connectingTo": { + "message": "Povezuje se na $1" + }, + "connectingToKovan": { + "message": "Povezuje se na test mrežu Kovan" + }, + "connectingToMainnet": { + "message": "Povezuje se na glavnu Ethereum mrežu" + }, + "connectingToRopsten": { + "message": "Povezuje se na Ropsten Test mrežu" + }, + "connectingToRinkeby": { + "message": "Poezivanje na Rinkeby Test mrežu" + }, + "connectingToLocalhost": { + "message": "Povezuje se na lokalnog hosta 8545" + }, + "connectingToGoerli": { + "message": "Povezuje se sa test mrežom Goerli " + }, + "continueToWyre": { + "message": "Nastavite ka Wyre" + }, + "continueToCoinSwitch": { + "message": "Nastavi na CoinSwitch" + }, + "contractDeployment": { + "message": "Primena ugovora" + }, + "copiedExclamation": { + "message": "Kopirano!" + }, + "copyAddress": { + "message": "Kopirajte adresu u ostavu" + }, + "copyTransactionId": { + "message": "Kopirajte identifikacioni broj transakcije" + }, + "copiedTransactionId": { + "message": "Kopiran identifikator transakcije" + }, + "copyToClipboard": { + "message": "Копирај у меморију" + }, + "copyPrivateKey": { + "message": "Ovo je vaÅ¡ privatni kljuÄ (kliknite kako biste ga kopirali)" + }, + "create": { + "message": "Ðаправи" + }, + "createAccount": { + "message": "Kreirajte nalog" + }, + "createAWallet": { + "message": "Napravi novÄanik" + }, + "createPassword": { + "message": "Kreirajte lozinku" + }, + "currencyConversion": { + "message": "Konverzija valuta" + }, + "currentLanguage": { + "message": "Trenutni jezik" + }, + "customGas": { + "message": "Prilagodi gas" + }, + "customGasSubTitle": { + "message": "PovecÌanje naknade može smanjiti vreme obrade, ali to nije zagarantovano." + }, + "customToken": { + "message": "PrilagoÄ‘eni token" + }, + "customRPC": { + "message": "KorisniÄki definisan RPC" + }, + "decimalsMustZerotoTen": { + "message": "Decimalni broj mora biti najmanje 0, a ne vecÌi od 36." + }, + "decimal": { + "message": "Decimale preciznosti" + }, + "defaultNetwork": { + "message": "Podrazumevana mreža za Ether transakcije je Main Net." + }, + "delete": { + "message": "Избриши" + }, + "deleteAccount": { + "message": "ObriÅ¡i nalog" + }, + "deposit": { + "message": "Depozit" + }, + "depositEther": { + "message": "Dajte depozit Ether-u" + }, + "details": { + "message": "Детаљи" + }, + "directDepositEther": { + "message": "Direktno deponujte Ether" + }, + "directDepositEtherExplainer": { + "message": "Ako već imate neki Ether, najbrži naÄin da preuzmete Ether u svoj novi novÄanik jeste direktnim deponovanjem." + }, + "done": { + "message": "Gotovo" + }, + "downloadGoogleChrome": { + "message": "Preuzmi Google Chrome" + }, + "downloadSecretBackup": { + "message": "Preuzmi ovu tajnu rezervnu kopiju fraze i Äuvaj je bezbedno skladiÅ¡tenu na eksternom Å¡ifrovanom Ävrstom disku ili skladiÅ¡tu." + }, + "downloadStateLogs": { + "message": "Preuzmite dnevnike stanja" + }, + "dontHaveAHardwareWallet": { + "message": "Nemate hardverski novÄanik?" + }, + "dropped": { + "message": "IspuÅ¡teno" + }, + "edit": { + "message": "Измени" + }, + "editContact": { + "message": "Izmeni kontakt" + }, + "endOfFlowMessage1": { + "message": "ProÅ¡li ste test - Äuvajte svoju frazu poÄetnih vrednosti, to je vaÅ¡a odgovornost!" + }, + "endOfFlowMessage2": { + "message": "Saveti za sigurno skladiÅ¡tenje" + }, + "endOfFlowMessage3": { + "message": "SaÄuvajte rezervnu kopiju na viÅ¡e mesta." + }, + "endOfFlowMessage4": { + "message": "Nikada ne delite frazu ni sa kim." + }, + "endOfFlowMessage5": { + "message": "ÄŒuvajte se pecanja (kraÄ‘e podataka)! MetaMask nikad neće spontano tražiti vaÅ¡u Å¡ifru za oporavak naloga (seed phrase)." + }, + "endOfFlowMessage6": { + "message": "Ako treba ponovo da izradite rezervnu kopiju svoje poÄetne fraze, možete je pronacÌi u Postavke -> Bezbednost." + }, + "endOfFlowMessage7": { + "message": "Ako imate bilo kakvih pitanja ili primetite neÅ¡to sumnjivo, poÅ¡aljite e-poruku na support@metamask.io." + }, + "endOfFlowMessage8": { + "message": "MetaMask ne može da oporavi vaÅ¡u poÄetnu frazu. Saznajte viÅ¡e." + }, + "endOfFlowMessage9": { + "message": "Saznajte viÅ¡e." + }, + "endOfFlowMessage10": { + "message": "Sve je gotovo" + }, + "ensRegistrationError": { + "message": "GreÅ¡ka u registraciji ENS imena." + }, + "ensNotFoundOnCurrentNetwork": { + "message": "ENS ime nije naÄ‘eno na trenutnoj mreži. Probajte da se prebacite na glavnu Ethereum mrežu." + }, + "enterAnAlias": { + "message": "Unesite pseudonim" + }, + "enterPassword": { + "message": "Unesite lozinku" + }, + "enterPasswordContinue": { + "message": "Unesite lozinku kako biste nastavili" + }, + "ethereumPublicAddress": { + "message": "Ethereum javna adresa" + }, + "etherscanView": { + "message": "Pogledajte raÄun na Etherscan-u" + }, + "estimatedProcessingTimes": { + "message": "Procenjeno vreme za obradu" + }, + "expandView": { + "message": "ProÅ¡irite prikaz" + }, + "exportPrivateKey": { + "message": "Izvezite privatni kljuÄ" + }, + "failed": { + "message": "NeuspeÅ¡no" + }, + "fast": { + "message": "Брзо" + }, + "faster": { + "message": "Brže" + }, + "fiat": { + "message": "Dekret", + "description": "Exchange type" + }, + "fileImportFail": { + "message": "Uvoz datoteke ne radi? Kliknite ovde!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "Заборави овај уређај" + }, + "from": { + "message": "Od" + }, + "functionType": { + "message": "Tip funkcije" + }, + "gasLimit": { + "message": "Limit gasa" + }, + "gasLimitInfoModalContent": { + "message": "Granica gasa je maksimalni iznos jedinica gasa koje ste voljni da potroÅ¡ite." + }, + "gasLimitTooLow": { + "message": "Limit za gas mora da bude najmanje 21 000" + }, + "gasUsed": { + "message": "Korišćen gas" + }, + "gasPrice": { + "message": "Cena gasa (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "Cena gasa izuzetno niska" + }, + "gasPriceInfoModalContent": { + "message": "Cena gasa odreÄ‘uje koliÄinu Ethera koju ste spremni da platite za svaku jedinicu gasa." + }, + "gasPriceNoDenom": { + "message": "Cena gas-a" + }, + "general": { + "message": "OpÅ¡te" + }, + "generalSettingsDescription": { + "message": "Konverzija valuta, primarna valuta, jezik, blockies identicon" + }, + "getEther": { + "message": "Nabavite Ether" + }, + "getEtherFromFaucet": { + "message": "Preuzmite Ether sa slavine za $1", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "Potražite pomoć." + }, + "getStarted": { + "message": "Започнимо" + }, + "happyToSeeYou": { + "message": "Drago nam je da vas vidimo." + }, + "hardware": { + "message": "hardver" + }, + "hardwareWalletConnected": { + "message": "Hardverski novÄanik je povezan" + }, + "hardwareWallets": { + "message": "Povežite hardverski novÄanik" + }, + "hardwareWalletsMsg": { + "message": "Izaberite hardverski novÄanik koji biste voleli da koristite sa MetaMask-om" + }, + "havingTroubleConnecting": { + "message": "Da li imate problem sa povezivanjem?" + }, + "here": { + "message": "ovde", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hexData": { + "message": "Heksadecimalni podaci" + }, + "hide": { + "message": "Сакриј" + }, + "hideTokenPrompt": { + "message": "Da li želite da sakrijete token?" + }, + "history": { + "message": "ИÑторија" + }, + "import": { + "message": "Uvoz", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "Uvezite nalog" + }, + "importAccountMsg": { + "message": "Uvezeni nalozi neće biti povezani sa poÄetnom frazom koju ste prvobitno kreirali za MetaMask nalog. Saznajte viÅ¡e o uvezenim nalozima." + }, + "importAccountSeedPhrase": { + "message": "Uvezi raÄun sa frazom poÄetnih vrednosti" + }, + "importWallet": { + "message": "Uvezite novÄanik" + }, + "importYourExisting": { + "message": "Uvezite vaÅ¡ postojeći novÄanik koristeći seed frazu sa 12 reÄi" + }, + "imported": { + "message": "Увезени", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "Uvezite koristeći Å¡ifru za oporavak naloga (seed phrase)" + }, + "infoHelp": { + "message": "Info i pomoć" + }, + "initialTransactionConfirmed": { + "message": "VaÅ¡u poÄetnu transakciju je potvrdila mreža. Kliknite OK da biste se vratili." + }, + "insufficientBalance": { + "message": "Nedovoljno sredstava." + }, + "insufficientFunds": { + "message": "Nedovoljna sredstva." + }, + "insufficientTokens": { + "message": "Nedovoljno tokena." + }, + "invalidAddress": { + "message": "Nevažeća adresa" + }, + "invalidAddressRecipient": { + "message": "Adresa primaoca nije važecÌa" + }, + "knownAddressRecipient": { + "message": "Poznata adresa ugovora." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "Nije ETH mreža, podeÅ¡eno na mala slova" + }, + "invalidInput": { + "message": "Nevažeći unos." + }, + "invalidRPC": { + "message": "Nevažeći RPC URL" + }, + "invalidBlockExplorerURL": { + "message": "Nevažeći Block Explorer URL" + }, + "invalidSeedPhrase": { + "message": "Nevažeća seed fraza" + }, + "jsonFile": { + "message": "JSON datoteka", + "description": "format for importing an account" + }, + "kovan": { + "message": "Kovan test mreža" + }, + "max": { + "message": "Maksimum" + }, + "learnMore": { + "message": "NauÄi viÅ¡e" + }, + "ledgerAccountRestriction": { + "message": "Treba da koristite svoj poslednji nalog pre nego Å¡to budete mogli da dodate novi." + }, + "letsGoSetUp": { + "message": "Da, hajde da sve podesimo!" + }, + "likeToAddTokens": { + "message": "Želite li da dodate ove tokene?" + }, + "links": { + "message": "Veze" + }, + "liveGasPricePredictions": { + "message": "PredviÄ‘anja cene gasa uživo" + }, + "loading": { + "message": "Учитава Ñе..." + }, + "loadingTokens": { + "message": "UÄitavanje tokena..." + }, + "loadMore": { + "message": "UÄitati viÅ¡e" + }, + "lock": { + "message": "Odjavi se" + }, + "mainnet": { + "message": "Glavna Ethereum mreža" + }, + "memorizePhrase": { + "message": "Zapamtite ovaj izraz." + }, + "message": { + "message": "Poruka" + }, + "metamaskDescription": { + "message": "Povezivanje na Ethereum i decentralizovani veb." + }, + "metamaskVersion": { + "message": "MetaMask verzija" + }, + "mobileSyncText": { + "message": "Molimo vas unesite Å¡ifru kako biste potvrdili da ste to vi!" + }, + "myAccounts": { + "message": "Moji nalozi" + }, + "myWalletAccounts": { + "message": "Moji nalozi novÄanika" + }, + "myWalletAccountsDescription": { + "message": "Svi vaÅ¡i nalozi kreirani u aplikaciji MetaMask biće automatski dodati u ovaj deo." + }, + "mustSelectOne": { + "message": "Morate izabrati najmanje 1 token." + }, + "needEtherInWallet": { + "message": "Da biste stupili u interakciju sa decentralizovanim aplikacijama koristeći MetaMask, biće vam potreban Ether u vaÅ¡em novÄaniku." + }, + "needImportFile": { + "message": "Morate izabrati fajl koji ćete uvesti.", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "Ne možete poslati negativan iznos ETH." + }, + "networkName": { + "message": "Ime mreže" + }, + "networks": { + "message": "Mreže" + }, + "networkSettingsDescription": { + "message": "Dodajte i uredite prilagoÄ‘ene RPC mreže" + }, + "nevermind": { + "message": "Nema veze" + }, + "newAccount": { + "message": "Nov nalog" + }, + "newAccountDetectedDialogMessage": { + "message": "Otkrivena je nova adresa! Kliknite ovde da biste je dodali u VaÅ¡ adresar." + }, + "newAccountNumberName": { + "message": "Nalog $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "Novi kontakt" + }, + "newContract": { + "message": "Novi ugovor" + }, + "newPassword": { + "message": "Nova lozinka (minimalno 8 karaktera)" + }, + "newNetwork": { + "message": "Nova mreža" + }, + "newToMetaMask": { + "message": "Novi ste u MetaMask-u?" + }, + "noAlreadyHaveSeed": { + "message": "Ne, vecÌ imam frazu poÄetnih vrednosti" + }, + "protectYourKeys": { + "message": "ZaÅ¡titite svoje kljuÄeve!" + }, + "protectYourKeysMessage1": { + "message": "Budite pažljivi sa vaÅ¡om seed frazom - bilo je izveÅ¡taja o veb lokacijama koje pokuÅ¡avaju da imitiraju MetaMask. MetaMask nikada necÌe tražiti vaÅ¡u seed frazu!" + }, + "protectYourKeysMessage2": { + "message": "ÄŒuvajte svoju frazu. Ako primetite neÅ¡to sumnjivo, ili niste sigurni u vezi veb lokacije, poÅ¡aljite e-poruku na upport@metamask.io" + }, + "rpcUrl": { + "message": "Novi RPC URL" + }, + "optionalChainId": { + "message": "ChainID (opciono)" + }, + "optionalSymbol": { + "message": "Simbol (opciono)" + }, + "newTotal": { + "message": "Novi zbir" + }, + "newTransactionFee": { + "message": "Nova naknada za transakcije" + }, + "next": { + "message": "Даље" + }, + "noAddressForName": { + "message": "Za ovo ime nije podeÅ¡ena adresa." + }, + "noConversionRateAvailable": { + "message": "Nije dostupan kurs za konverziju" + }, + "noTransactions": { + "message": "Nemate transakcije" + }, + "notEnoughGas": { + "message": "Nema dovoljno gasa" + }, + "noWebcamFoundTitle": { + "message": "Nije naÄ‘ena veb kamera" + }, + "noWebcamFound": { + "message": "Nije pronaÄ‘ena veb kamera na vaÅ¡em kompjuteru. Molimo vas pokuÅ¡ajte ponovo." + }, + "ofTextNofM": { + "message": "od" + }, + "orderOneHere": { + "message": "NaruÄite Trezor ili Ledger i Äuvajte svoja sredstva u hladnom skladiÅ¡tu" + }, + "origin": { + "message": "Извор" + }, + "parameters": { + "message": "Parametri" + }, + "participateInMetaMetrics": { + "message": "UÄestvujte u MetaMetrics" + }, + "participateInMetaMetricsDescription": { + "message": "UÄestvujte u MetaMetrics da biste nam pomogli da poboljÅ¡amo MetaMask." + }, + "password": { + "message": "Лозинка" + }, + "passwordsDontMatch": { + "message": "Å ifre se ne poklapaju" + }, + "passwordNotLongEnough": { + "message": "Lozinka nije dovoljno dugaÄka." + }, + "pastePrivateKey": { + "message": "Ovde nalepite vaÅ¡ niz privatnog kljuÄa", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "u toku" + }, + "personalAddressDetected": { + "message": "Otkrivena je liÄna adresa. Unesite adresu token ugovora." + }, + "prev": { + "message": "Prethodno" + }, + "primaryCurrencySetting": { + "message": "Primarna valuta" + }, + "primaryCurrencySettingDescription": { + "message": "Izaberite primarnu da biste postavili prioritete u prikazivanju vrednosti u primarnoj valuti lanca (npr. ETH). Izaberite Fiat da biste postavili prioritete u prikazivanju vrednosti u vaÅ¡oj izabranoj fiat valuti." + }, + "privacyMsg": { + "message": "Smernice za privatnost" + }, + "privateKey": { + "message": "Privatni kljuÄ", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "Upozorenje: Nikada ne otkrivajte ovaj kljuÄ. Svako sa vaÅ¡im privatnim kljuÄevima može ukrasti bilo koju imovinu na vaÅ¡em nalogu." + }, + "privateNetwork": { + "message": "Privatna mreža" + }, + "queue": { + "message": "Ред" + }, + "readdToken": { + "message": "U buducÌnosti možete vratiti ovaj token tako Å¡to cÌete otvoriti „Dodaj token“ u meniju opcija vaÅ¡eg naloga." + }, + "recents": { + "message": "SkoraÅ¡nje" + }, + "recipientAddress": { + "message": "Adresa primaoca" + }, + "recipientAddressPlaceholder": { + "message": "Pretraga, javna adresa (0x) ili ENS" + }, + "rejectAll": { + "message": "Odbacite sve" + }, + "rejectTxsN": { + "message": "Odbijte transakcije od $1" + }, + "rejectTxsDescription": { + "message": "Upravo ćete odbaciti sve transakcije od $1." + }, + "rejected": { + "message": "Odbijeno" + }, + "reset": { + "message": "РеÑетуј" + }, + "resetAccount": { + "message": "Ponovo postavi nalog" + }, + "resetAccountDescription": { + "message": "Resetovanje vaÅ¡eg naloga će obrisati istoriju transakcija." + }, + "deleteNetwork": { + "message": "Da li želite da obriÅ¡ete mrežu?" + }, + "deleteNetworkDescription": { + "message": "Da li ste sigurni da želite da izbriÅ¡ete ovu mrežu?" + }, + "remindMeLater": { + "message": "Podseti me kasnije" + }, + "restoreFromSeed": { + "message": "Obnoviti nalog?" + }, + "restoreAccountWithSeed": { + "message": "Povratite svoj nalog uz pomoć seed fraze" + }, + "requestsAwaitingAcknowledgement": { + "message": "zahtevi koji Äekaju da budu potvrÄ‘eni" + }, + "required": { + "message": "Obavezno" + }, + "restore": { + "message": "Поново отвори" + }, + "revealSeedWords": { + "message": "Otkrivanje poÄetnih reÄi" + }, + "revealSeedWordsTitle": { + "message": "Seed fraza" + }, + "revealSeedWordsDescription": { + "message": "Ukoliko ikad promenite pregledaÄ ili kompjuter, trebaće vam ova Å¡ifra za oporavak naloga (seed phrase) kako biste pristupili svojim nalozima. ÄŒuvajte je na bezbednom i tajnom mestu." + }, + "revealSeedWordsWarningTitle": { + "message": "NE delite ovu frazu ni sa kim!" + }, + "revealSeedWordsWarning": { + "message": "Ove reÄi se mogu iskoristiti za kraÄ‘u svih vaÅ¡ih naloga." + }, + "remove": { + "message": "Уклони" + }, + "removeAccount": { + "message": "Уклањање налога" + }, + "removeAccountDescription": { + "message": "Uklonićemo ovaj nalog iz vaÅ¡eg novÄanika. Pre nego Å¡to nastavite, proverite da li za ovaj uvezeni nalog imate originalnu poÄetnu frazu ili privatni kljuÄ. Ponovo možete da uvezete ili kreirate naloge izborom iz padajućeg menija na nalogu." + }, + "readyToConnect": { + "message": "Spremni za povezivanje?" + }, + "rinkeby": { + "message": "Rinkeby test mreža" + }, + "ropsten": { + "message": "Test mreža Ropsten" + }, + "goerli": { + "message": "Test mreža Goerli " + }, + "save": { + "message": "Сачувај" + }, + "slow": { + "message": "Споро" + }, + "slower": { + "message": "Sporije" + }, + "saveAsCsvFile": { + "message": "SaÄuvajte u formi CSV datoteke" + }, + "scanInstructions": { + "message": "Stavite QR kod ispred vaÅ¡e kamere" + }, + "scanQrCode": { + "message": "Skenirajte QR kod" + }, + "search": { + "message": "Претражи" + }, + "searchResults": { + "message": "Rezultati pretrage" + }, + "secretBackupPhrase": { + "message": "Tajna rezervna kopija fraze" + }, + "secretBackupPhraseDescription": { + "message": "VaÅ¡a tajna fraza za rezervnu kopiju olakÅ¡ava pravljenje rezervne kopije i vraćanje naloga u prethodno stanje." + }, + "secretBackupPhraseWarning": { + "message": "UPOZORENJE: Nikada ne otkrivajte svoju rezervnu frazu. Svako sa ovom frazom može zauvek da Vam uzme VaÅ¡ Ether." + }, + "secretPhrase": { + "message": "Unesite ovde svoj tajni izraz od dvanaest reÄi kako biste povratili svoj trezor." + }, + "securityAndPrivacy": { + "message": "Bezbednost i privatnost" + }, + "securitySettingsDescription": { + "message": "PodeÅ¡avanja privatnosti i novÄanik fraze poÄetnih vrednosti" + }, + "seedPhrasePlaceholder": { + "message": "Odvojite svaku reÄ jednim razmakom" + }, + "seedPhraseReq": { + "message": "Å ifre za oporavak naloga (seed phrases) imaju 12 reÄi" + }, + "selectCurrency": { + "message": "Izaberite valutu" + }, + "selectEachPhrase": { + "message": "Molimo vas izaberite svaki izraz kako biste proverili da je taÄan." + }, + "selectLocale": { + "message": "Izaberite lokalni standard" + }, + "selectType": { + "message": "Izaberite tip" + }, + "send": { + "message": "Пошаљи" + }, + "sendAmount": { + "message": "PoÅ¡aljite iznos" + }, + "sendETH": { + "message": "PoÅ¡alji ETH" + }, + "sendTokens": { + "message": "PoÅ¡alji tokene" + }, + "sentEther": { + "message": "ether je poslat" + }, + "sentTokens": { + "message": "poslati tokeni" + }, + "separateEachWord": { + "message": "Razdvojite svaku reÄ jednim mestom razmaka" + }, + "searchTokens": { + "message": "Pretražite tokene" + }, + "selectAnAccount": { + "message": "Izaberite nalog" + }, + "selectAnAccountHelp": { + "message": "Izaberite nalog za prikaz u MetaMask-u" + }, + "selectAHigherGasFee": { + "message": "Izaberite veću vrednost gas naknade da biste ubrzali procesuiranje vaÅ¡e transakcije.*" + }, + "selectHdPath": { + "message": "Izaberite HD Path" + }, + "selectPathHelp": { + "message": "Ako ne vidite svoje postojecÌe Ledger naloge dole, pokuÅ¡ajte prebaciti putanje na „Legacy (MEW / MyCrypto)â€" + }, + "settings": { + "message": "PodeÅ¡avanja" + }, + "showAdvancedGasInline": { + "message": "Napredne kontrole gasa" + }, + "showAdvancedGasInlineDescription": { + "message": "Izaberite ovo kako biste prikazali cenu gasa i kontrole limita direktno na ekranima za slanje i potvrÄ‘ivanje." + }, + "showFiatConversionInTestnets": { + "message": "Prikažite konverzije na Testnet" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Izaberite ovo za prikaz konverzije dekretnog novca (fiat) na test mrežama." + }, + "showPrivateKeys": { + "message": "Prikažite privatne kljuÄeve" + }, + "showHexData": { + "message": "Prikaži Hex podatke" + }, + "showHexDataDescription": { + "message": "Izaberite ovo da bi se pokazalo polje sa hex podacima na „PoÅ¡alji†ekranu " + }, + "sign": { + "message": "PotpiÅ¡ite" + }, + "signatureRequest": { + "message": "Zahtev za potpis" + }, + "signed": { + "message": "Potpisan" + }, + "signNotice": { + "message": "Potpisivanje ove poruke može imati \nopasne neželjene efekte. Potpisujte samo poruke sa \nsajtova u koje imate potpuno poverenje u pogledu svog naloga.\n Ovaj opasan metod će biti uklonjen u budućoj verziji." + }, + "sigRequest": { + "message": "Zahtev za potpisom" + }, + "somethingWentWrong": { + "message": "Ups! NeÅ¡to nije u redu." + }, + "speedUp": { + "message": "Ubrzajte" + }, + "speedUpCancellation": { + "message": "Ubrzajte ovo otkazivanje" + }, + "speedUpTransaction": { + "message": "Ubrzajte ovu transakciju" + }, + "switchNetworks": { + "message": "Prebacivanje mreže" + }, + "stateLogs": { + "message": "Državne evidencije" + }, + "stateLogsDescription": { + "message": "Dnevnici stanja sadrže adrese vaÅ¡ih javnih naloga i poslatih transakcija." + }, + "stateLogError": { + "message": "GreÅ¡ka u preuzimanju evidencija stanja" + }, + "step1HardwareWallet": { + "message": "1. Poveži hardverski novÄanik" + }, + "step1HardwareWalletMsg": { + "message": "Povežite svoj hardverski novÄanik direktno sa kompjuterom." + }, + "step2HardwareWallet": { + "message": "2. Izaberite nalog" + }, + "step2HardwareWalletMsg": { + "message": "Izaberite nalog koji želite da pogledatee. Možete izabrati samo po jedan nalog." + }, + "step3HardwareWallet": { + "message": "3. PoÄnite da koristite dApps i joÅ¡ mnogo toga!" + }, + "step3HardwareWalletMsg": { + "message": "Koristite nalog na vaÅ¡em hardveru isto onako kako biste koristili bilo koji Ethereum nalog. Prijavite se na dApps, Å¡aljite Eth, kupujte i skladiÅ¡tite ERC20 tokene i nezamenljive tokene poput CryptoKitties." + }, + "storePhrase": { + "message": "ÄŒuvajte ovaj izraz u menadžeru Å¡ifri kao Å¡to je 1Password." + }, + "submitted": { + "message": "ProsleÄ‘eno" + }, + "supportCenter": { + "message": "Posetite naÅ¡ centar za podrÅ¡ku" + }, + "symbol": { + "message": "Simbol" + }, + "symbolBetweenZeroTwelve": { + "message": "Simbol mora biti 11 znakova ili manje." + }, + "syncWithMobile": { + "message": "Sinhronizacija sa mobilnim telefonom" + }, + "syncWithMobileTitle": { + "message": "Sinhronizujte sa mobilnim ureÄ‘ajem" + }, + "syncWithMobileDesc": { + "message": "Možete sinhronizovati vaÅ¡e naloge i informacije sa svojim mobilnim ureÄ‘ajem. Otvorite mobilnu aplikaciju MetaMask, idite na \"PodeÅ¡avanja\" i pritisnite \"Sinhronizuj iz ekstenzije za pregledaÄ\"" + }, + "syncWithMobileDescNewUsers": { + "message": "Ako prvi put otvorite aplikaciju MetaMask Mobile, samo sledite korake u svom telefonu." + }, + "syncWithMobileScanThisCode": { + "message": "Skenirajte ovaj kod uz pomoć svoje MetaMask mobilne aplikacije" + }, + "syncWithMobileBeCareful": { + "message": "Obratite pažnju da niko drugi ne gleda u vaÅ¡ ekran kad skenirate ovaj kod" + }, + "syncWithMobileComplete": { + "message": "VaÅ¡i podaci su uspeÅ¡no sinhronizovani. Uživajte u mobilnoj aplikaciji MetaMask!" + }, + "terms": { + "message": "Uslovi korišćenja" + }, + "thisWillCreate": { + "message": "Ovo će kreirati novi novÄanik i seed frazu" + }, + "tips": { + "message": "Donacije" + }, + "to": { + "message": "Za" + }, + "tokenAlreadyAdded": { + "message": "Token je već dodat." + }, + "tokenContractAddress": { + "message": "Adresa ugovora tokena" + }, + "tokenSymbol": { + "message": "Simbol tokena" + }, + "total": { + "message": "Ukupno" + }, + "transaction": { + "message": "transakcija" + }, + "transactionConfirmed": { + "message": "Transakcija je potvrÄ‘ena na $2." + }, + "transactionCreated": { + "message": "Transakcija je kreirana sa vrednošću od $1 na $2." + }, + "transactionDropped": { + "message": "Transakcija je pala na $2." + }, + "transactionSubmitted": { + "message": "Transakcija je podneÅ¡ena sa gas naknadom od $1 na $2." + }, + "transactionResubmitted": { + "message": "Transakcija je ponovo prosleÄ‘ena sa naknadom za gas povećanom sa $1 na $2" + }, + "transactionUpdated": { + "message": "Transakcija je ažurirana na $2." + }, + "transactionErrored": { + "message": "Transakcija je naiÅ¡la na greÅ¡ku" + }, + "transactionCancelAttempted": { + "message": "PokuÅ¡ano je otkazivanje transakcije sa naknadom za gas od $1 do $2" + }, + "transactionCancelSuccess": { + "message": "Transakcija je uspeÅ¡no otkazana sa $2" + }, + "transactionError": { + "message": "GreÅ¡ka prilikom transakcije. Izuzetak ubaÄen u kod ugovora." + }, + "transactionErrorNoContract": { + "message": "PokuÅ¡avamo da pozovemo funkciju preko ne-ugovorne adrese." + }, + "transactionFee": { + "message": "Provizija" + }, + "transactionTime": { + "message": "Vreme transakcije" + }, + "transfer": { + "message": "Prenos" + }, + "transferBetweenAccounts": { + "message": "Prenos izmeÄ‘u mojih naloga" + }, + "transferFrom": { + "message": "Prebacite iz" + }, + "troubleTokenBalances": { + "message": "Imali smo problema sa uÄitavanjem bilansa VaÅ¡ih tokena. Možete ih pogledati", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "Пробај поново" + }, + "typePassword": { + "message": "Ukucajte svoju MetaMask Å¡ifru" + }, + "unapproved": { + "message": "Neodobren" + }, + "units": { + "message": "jedinice" + }, + "unknown": { + "message": "Ðепознато" + }, + "unknownNetwork": { + "message": "Nepoznata privatna mreža" + }, + "unknownQrCode": { + "message": "GreÅ¡ka: nismo uspeli da identifikujemo taj QR kod" + }, + "unknownCameraErrorTitle": { + "message": "Ups! NeÅ¡to nije u redu..." + }, + "unknownCameraError": { + "message": "DoÅ¡lo je do greÅ¡ke prilikom pristupanja vaÅ¡oj kameri. PokuÅ¡ajte ponovo..." + }, + "unlock": { + "message": "Откључај" + }, + "unlockMessage": { + "message": "Decentralizovani veb Äeka" + }, + "updatedWithDate": { + "message": "Ažuriran $1" + }, + "urlErrorMsg": { + "message": "URI-ovi zahtevaju odgovarajucÌi prefiks HTTP / HTTPS." + }, + "usedByClients": { + "message": "Koristi ga veliki broj razliÄitih klijenata" + }, + "userName": { + "message": "КориÑничко име" + }, + "viewAccount": { + "message": "Прикажи налог" + }, + "viewinExplorer": { + "message": "Pogledati u Explorer-u" + }, + "viewContact": { + "message": "Pogledaj kontakt" + }, + "viewOnCustomBlockExplorer": { + "message": "Pogledaj na $1" + }, + "viewOnEtherscan": { + "message": "Pogledaj na Etherscan-u" + }, + "visitWebSite": { + "message": "Posetite naÅ¡u veb lokaciju" + }, + "walletSeed": { + "message": "Å ifra za oporavak novÄanika" + }, + "welcomeBack": { + "message": "Dobro doÅ¡li nazad!" + }, + "welcome": { + "message": "Dobro doÅ¡li na MetaMask" + }, + "writePhrase": { + "message": "NapiÅ¡ite ovaj izraz na parÄetu papira i stavite ga na bezbedno mesto. Ukoliko želite joÅ¡ viÅ¡e sigurnosti, zapiÅ¡ite ga na viÅ¡e komada papira i svaki stavite na 2-3 razliÄita mesta." + }, + "yesLetsTry": { + "message": "Da, pokuÅ¡ajmo." + }, + "youNeedToAllowCameraAccess": { + "message": "Za upotrebu ove funkcije morate omogucÌiti pristup kameri." + }, + "yourSigRequested": { + "message": "Zahteva se vaÅ¡ potpis" + }, + "youSign": { + "message": "Vi potpisujete" + }, + "yourPrivateSeedPhrase": { + "message": "VaÅ¡a privatna Å¡ifra za oporavak naloga (seed phrase)" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "Nulta cena gasa ubrzava" + } +} diff --git a/app/_locales/sv/messages.json b/app/_locales/sv/messages.json new file mode 100644 index 000000000000..3cc07877f5fb --- /dev/null +++ b/app/_locales/sv/messages.json @@ -0,0 +1,1285 @@ +{ + "chartOnlyAvailableEth": { + "message": "Tabellen är endast tillgänglig pÃ¥ Ethereum-nätverk." + }, + "contractInteraction": { + "message": "Kontraktinteraktion" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "reject": { + "message": "Avvisa" + }, + "about": { + "message": "Om" + }, + "aboutSettingsDescription": { + "message": "Version, supportcenter och kontaktinformation" + }, + "acceleratingATransaction": { + "message": "* Att snabba upp en överföring genom att använda ett högre gaspris ökar chanserna för att överföringen ska hanteras snabbare av nätverket, men det är inte en garanti." + }, + "accessingYourCamera": { + "message": "Begär Ã¥tkomst till din kamera..." + }, + "account": { + "message": "Konto" + }, + "accountDetails": { + "message": "Kontodetaljer" + }, + "accountName": { + "message": "Kontonamn" + }, + "accountOptions": { + "message": "Kontoalternativ" + }, + "accountSelectionRequired": { + "message": "Du mÃ¥ste välja ett konto!" + }, + "activityLog": { + "message": "aktivitetslogg" + }, + "addNetwork": { + "message": "Lägg till nätverk" + }, + "addRecipient": { + "message": "Lägg till mottagare" + }, + "advanced": { + "message": "Avancerat" + }, + "advancedSettingsDescription": { + "message": "Ã…tkomst till verktyg för utvecklare, ladda ner loggar, Ã¥terställ konto, upprätta testnätverk och skräddarsy RPC" + }, + "advancedOptions": { + "message": "Avancerade alternativ" + }, + "addToAddressBook": { + "message": "Lägg till i adressbok" + }, + "addToAddressBookModalPlaceholder": { + "message": "exempelvis John D." + }, + "addAlias": { + "message": "Lägg till alias" + }, + "addToken": { + "message": "Lägg till token" + }, + "addTokens": { + "message": "Lägg till tokens" + }, + "addSuggestedTokens": { + "message": "Lägg till föreslagna tokens" + }, + "addAcquiredTokens": { + "message": "Lägg till de tokens du har skaffat med MetaMask" + }, + "amount": { + "message": "Belopp" + }, + "appDescription": { + "message": "En Ethereum-plÃ¥nbok i din webbläsare", + "description": "The description of the application" + }, + "approve": { + "message": "Godkänn" + }, + "approved": { + "message": "Godkänt" + }, + "asset": { + "message": "TillgÃ¥ng" + }, + "attemptingConnect": { + "message": "Försöker ansluta till blockkedja." + }, + "attemptToCancel": { + "message": "Vill du försöka att avbryta?" + }, + "attemptToCancelDescription": { + "message": "Att godkänna detta avbrytningsförsök garanterar inte att din ursprungliga överföring avbryts. Om avbrytningsförsöket lyckas kommer du att debiteras överföringsavgiften som nämns ovan." + }, + "attributions": { + "message": "Tillskrivningar" + }, + "autoLockTimeLimit": { + "message": "Timer för automatisk utloggning (minuter)" + }, + "autoLockTimeLimitDescription": { + "message": "Ställ in efter hur lÃ¥ng tids inaktivitet som MetaMask automatiskt loggar ut" + }, + "average": { + "message": "Genomsnitt" + }, + "back": { + "message": "BakÃ¥t" + }, + "backToAll": { + "message": "Tillbaka till Alla" + }, + "backupApprovalNotice": { + "message": "Säkerhetskopiera din hemliga Ã¥terställningskod för att se till att din plÃ¥nbok och dina tillgÃ¥ngar är säkra." + }, + "backupApprovalInfo": { + "message": "Den hemliga koden krävs för att komma Ã¥t din plÃ¥nbok ifall du tappar bort din enhet, glömmer ditt lösenord, behöver installera om MetaMask eller om du vill komma Ã¥t din plÃ¥nbok pÃ¥ en annan enhet." + }, + "backupNow": { + "message": "Säkerhetskopiera nu" + }, + "balance": { + "message": "Saldo" + }, + "balanceOutdated": { + "message": "Saldot kanske inte är uppdaterat" + }, + "basic": { + "message": "Grunder" + }, + "blockExplorerUrl": { + "message": "Blockera Utforskaren" + }, + "blockExplorerView": { + "message": "Visa konto pÃ¥ $1", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "Använd Blockies Identicon" + }, + "browserNotSupported": { + "message": "Din webbläsare stöds inte..." + }, + "builtInCalifornia": { + "message": "MetaMask är skapat och utformat i Kalifornien." + }, + "buyWithWyre": { + "message": "Köp ETH med Wyre" + }, + "buyWithWyreDescription": { + "message": "Wyre lÃ¥ter dig använda ett kreditkort för att sätta in ETH direkt pÃ¥ ditt MetaMask-konto." + }, + "buyCoinSwitch": { + "message": "Köp pÃ¥ CoinSwitch" + }, + "buyCoinSwitchExplainer": { + "message": "CoinSwitch är allt-i-ett-platsen för att växla mer än 300 kryptovalutor till bästa kurs." + }, + "off": { + "message": "Av" + }, + "ok": { + "message": "OK" + }, + "on": { + "message": "PÃ¥" + }, + "optionalBlockExplorerUrl": { + "message": "Block Explorer URL (valfritt)" + }, + "cancel": { + "message": "Avbryt" + }, + "cancelAttempt": { + "message": "Avbryt försök" + }, + "cancellationGasFee": { + "message": "Gasavgift för avbrytning" + }, + "cancelled": { + "message": "Avbruten" + }, + "clickToRevealSeed": { + "message": "Klicka här för att visa hemliga ord" + }, + "close": { + "message": "Stäng" + }, + "chromeRequiredForHardwareWallets": { + "message": "Du mÃ¥ste använda MetaMask pÃ¥ Google Chrome för att ansluta till din hÃ¥rdvaruplÃ¥nbok." + }, + "confirm": { + "message": "Bekräfta" + }, + "confirmed": { + "message": "Bekräftat" + }, + "confirmPassword": { + "message": "Bekräfta lösenord" + }, + "confirmSecretBackupPhrase": { + "message": "Bekräfta din hemliga backup-fras" + }, + "congratulations": { + "message": "Gratulerar" + }, + "connectHardwareWallet": { + "message": "Anslut hÃ¥rdvaruplÃ¥nbok" + }, + "connect": { + "message": "Ansluta" + }, + "connectingTo": { + "message": "Ansluter till $1" + }, + "connectingToKovan": { + "message": "Ansluter till Kovans testnätverk" + }, + "connectingToMainnet": { + "message": "Koppla till Ethereums huvudnätverk" + }, + "connectingToRopsten": { + "message": "Ansluter till Ropsten Test Network" + }, + "connectingToRinkeby": { + "message": "Ansluter till Rinkeby Test Network" + }, + "connectingToLocalhost": { + "message": "Ansluter till Localhost 8545" + }, + "connectingToGoerli": { + "message": "Ansluter till Goerli Test Network" + }, + "continueToWyre": { + "message": "Fortsätt till Wyre" + }, + "continueToCoinSwitch": { + "message": "Fortsätt till CoinSwitch" + }, + "contractDeployment": { + "message": "Kontraktplacering" + }, + "copiedExclamation": { + "message": "Kopierades!" + }, + "copyAddress": { + "message": "Kopiera adress till urklipp" + }, + "copyTransactionId": { + "message": "Kopiera transaktions-ID" + }, + "copiedTransactionId": { + "message": "Kopierade transaktions-ID" + }, + "copyToClipboard": { + "message": "Kopiera till Urklipp" + }, + "copyPrivateKey": { + "message": "Det här är din privata nyckel (klicka för att kopiera)" + }, + "create": { + "message": "Skapa" + }, + "createAccount": { + "message": "Skapa konto" + }, + "createAWallet": { + "message": "Skapa en plÃ¥nbok" + }, + "createPassword": { + "message": "Skapa lösenord" + }, + "currencyConversion": { + "message": "Valutaomvandling" + }, + "currentLanguage": { + "message": "Aktuellt sprÃ¥k" + }, + "customGas": { + "message": "Anpassa gas" + }, + "customGasSubTitle": { + "message": "Att öka avgiften kan minska behandlingstiden, men det är inte garanterat att göra det." + }, + "customToken": { + "message": "Anpassad token" + }, + "customRPC": { + "message": "Anpassad RPC" + }, + "decimalsMustZerotoTen": { + "message": "Decimalerna mÃ¥ste vara minst 0 och inte över 36." + }, + "decimal": { + "message": "Decimalprecision" + }, + "defaultNetwork": { + "message": "Standardnätverket för Ether-transaktioner är Main Net." + }, + "delete": { + "message": "Radera" + }, + "deleteAccount": { + "message": "Radera konto" + }, + "deposit": { + "message": "Deposition" + }, + "depositEther": { + "message": "Sätt in Ether" + }, + "details": { + "message": "Info" + }, + "directDepositEther": { + "message": "Sätt in Ether direkt" + }, + "directDepositEtherExplainer": { + "message": "Om du redan har Ether är det snabbaste sättet att fÃ¥ Ether i din nya plÃ¥nbok att göra en direktinsättning." + }, + "done": { + "message": "Klart" + }, + "downloadGoogleChrome": { + "message": "Ladda ner Google Chrome" + }, + "downloadSecretBackup": { + "message": "Ladda ner den hemliga Ã¥terställningsfrasen och förvara den säkert pÃ¥ en extern, krypterad hÃ¥rdskriva eller lagringsmedia." + }, + "downloadStateLogs": { + "message": "Ladda ner statusloggar" + }, + "dontHaveAHardwareWallet": { + "message": "Har du inte en hÃ¥rdvaruplÃ¥nbok?" + }, + "dropped": { + "message": "Tappad" + }, + "edit": { + "message": "Redigera" + }, + "editContact": { + "message": "Redigera kontakt" + }, + "endOfFlowMessage1": { + "message": "Du klarade testet. HÃ¥ll din seed phrase hemlig, den är pÃ¥ ditt ansvar!" + }, + "endOfFlowMessage2": { + "message": "Tips pÃ¥ säker förvaring" + }, + "endOfFlowMessage3": { + "message": "Spara en backup pÃ¥ flera ställen." + }, + "endOfFlowMessage4": { + "message": "Dela aldrig frasen med nÃ¥gon." + }, + "endOfFlowMessage5": { + "message": "Se upp för nätfiske! MetaMask kommer aldrig att oväntat frÃ¥ga om din seed phrase." + }, + "endOfFlowMessage6": { + "message": "Om du behöver säkerhetskopiera din nyckelfras igen, kan du hitta den i Inställningar -> Säkerhet" + }, + "endOfFlowMessage7": { + "message": "Om du har frÃ¥gor eller ser nÃ¥got misstänksamt, skicka ett e-postmeddelande till support@metamask.io." + }, + "endOfFlowMessage8": { + "message": "MetaMask kan inte Ã¥terställa din seedphrase. Läs mer." + }, + "endOfFlowMessage9": { + "message": "Lär dig mer." + }, + "endOfFlowMessage10": { + "message": "Allt klart" + }, + "ensRegistrationError": { + "message": "Fel i ENS-namnregistrering" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "ENS-namnet hittades inte i det aktuella nätverket. Prova att byta till Main Ethereum Network." + }, + "enterAnAlias": { + "message": "Ange ett alias" + }, + "enterPassword": { + "message": "Ange lösenord" + }, + "enterPasswordContinue": { + "message": "Ange lösenord för att fortsätta" + }, + "ethereumPublicAddress": { + "message": "Ethereum offentlig adress" + }, + "etherscanView": { + "message": "Visa konto pÃ¥ Etherscan" + }, + "estimatedProcessingTimes": { + "message": "Uppskattade behandlingstider" + }, + "expandView": { + "message": "Expandera vy" + }, + "exportPrivateKey": { + "message": "Exportera privat nyckel" + }, + "failed": { + "message": "Misslyckades" + }, + "fast": { + "message": "Snabb" + }, + "faster": { + "message": "Snabbare" + }, + "fileImportFail": { + "message": "Fungerar inte filimporten? Klicka här!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "Glöm den här enheten" + }, + "from": { + "message": "FrÃ¥n" + }, + "functionType": { + "message": "Funktionstyp" + }, + "gasLimit": { + "message": "Gasgräns" + }, + "gasLimitInfoModalContent": { + "message": "Gasgräns innebär det maximala antalet gasenheter som du är villig att spendera." + }, + "gasLimitTooLow": { + "message": "Gasgräns mÃ¥ste vara minst 21 000" + }, + "gasUsed": { + "message": "Gas använd" + }, + "gasPrice": { + "message": "Gas-pris (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "Gaspris extremt lÃ¥gt" + }, + "gasPriceInfoModalContent": { + "message": "Gaspriset anger den summa Ether som du är villig att betala för varje gasenhet." + }, + "gasPriceNoDenom": { + "message": "Gaspris" + }, + "general": { + "message": "Allmänt" + }, + "generalSettingsDescription": { + "message": "Valutaomvandling, primär valuta, sprÃ¥k" + }, + "getEther": { + "message": "Skaffa Ether" + }, + "getEtherFromFaucet": { + "message": "FÃ¥ Ether frÃ¥n en kran för $1", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "FÃ¥ hjälp." + }, + "getStarted": { + "message": "Komma igÃ¥ng" + }, + "happyToSeeYou": { + "message": "Vi är glada att se dig." + }, + "hardware": { + "message": "hÃ¥rdvara" + }, + "hardwareWalletConnected": { + "message": "HÃ¥rdvaruplÃ¥nbok ansluten" + }, + "hardwareWallets": { + "message": "Anslut en hÃ¥rdvaruplÃ¥nbok" + }, + "hardwareWalletsMsg": { + "message": "Välj en hÃ¥rdvaruplÃ¥nbok som du vill använda med MetaMask" + }, + "havingTroubleConnecting": { + "message": "Har du problem att ansluta?" + }, + "here": { + "message": "här", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hexData": { + "message": "Hex-data" + }, + "hide": { + "message": "Dölj" + }, + "hideTokenPrompt": { + "message": "Göm token?" + }, + "history": { + "message": "Historik" + }, + "import": { + "message": "Importera", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "Importera konto" + }, + "importAccountMsg": { + "message": "Importerade konton kommer inte att kopplas till din ursprungligen skapade seedphrase för ditt MetaMask-konto. Läs mer om importerade konton" + }, + "importAccountSeedPhrase": { + "message": "Importera konto med" + }, + "importWallet": { + "message": "Importera plÃ¥nbok" + }, + "importYourExisting": { + "message": "Importera din existerande plÃ¥nbok med hjälp av en 12 ord lÃ¥ng seedfras" + }, + "imported": { + "message": "Importerade", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "Importera med kontots seedfras" + }, + "infoHelp": { + "message": "Info och hjälp" + }, + "initialTransactionConfirmed": { + "message": "Din initiala transaktion har bekräftats av nätverket. Klicka pÃ¥ OK för att gÃ¥ tillbaka." + }, + "insufficientBalance": { + "message": "Otillräcklig balans." + }, + "insufficientFunds": { + "message": "Otillräckliga medel." + }, + "insufficientTokens": { + "message": "Otillräckliga tokens." + }, + "invalidAddress": { + "message": "Ogiltig adress" + }, + "invalidAddressRecipient": { + "message": "Mottagarens adress är ogiltig" + }, + "knownAddressRecipient": { + "message": "Känd kontraktadress." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "Ej ETH-nätverk, ange med smÃ¥ bokstäver" + }, + "invalidInput": { + "message": "Ogiltigt input." + }, + "invalidRPC": { + "message": "Ogiltig RPC-URL" + }, + "invalidBlockExplorerURL": { + "message": "Ogiltig Block Explorer URL" + }, + "invalidSeedPhrase": { + "message": "Ogiltig" + }, + "jsonFile": { + "message": "JSON-fil", + "description": "format for importing an account" + }, + "kovan": { + "message": "Kovan testnätverk" + }, + "max": { + "message": "Maximalt" + }, + "learnMore": { + "message": "Läs mer" + }, + "ledgerAccountRestriction": { + "message": "Du mÃ¥ste använda ditt senaste konto innan du kan lägga till ett nytt." + }, + "letsGoSetUp": { + "message": "Ja, kör igÃ¥ng!" + }, + "likeToAddTokens": { + "message": "Vill du lägga till dessa tokens?" + }, + "links": { + "message": "Länkar" + }, + "liveGasPricePredictions": { + "message": "Liveuppdaterad gaspris-förutsägelser" + }, + "loading": { + "message": "Läser in..." + }, + "loadingTokens": { + "message": "Laddar tokens..." + }, + "loadMore": { + "message": "Ladda mer" + }, + "lock": { + "message": "Logga ut" + }, + "mainnet": { + "message": "Ethereums huvudnätverk" + }, + "memorizePhrase": { + "message": "Memorera denna fras." + }, + "message": { + "message": "Meddelande" + }, + "metamaskDescription": { + "message": "Ansluter dig mot Ethereum och den decentraliserade webben." + }, + "metamaskVersion": { + "message": "MetaMask-version" + }, + "mobileSyncText": { + "message": "Var vänlig ange ditt lösenord för att bekräfta att det är du!" + }, + "myAccounts": { + "message": "Mina konton" + }, + "myWalletAccounts": { + "message": "Mina plÃ¥nbokskonton" + }, + "myWalletAccountsDescription": { + "message": "Alla dina MetaMask-skapade konton läggs automatiskt till i denna avdelning." + }, + "mustSelectOne": { + "message": "Minst 1 token mÃ¥ste väljas." + }, + "needEtherInWallet": { + "message": "För att interagera med decentraliserade applikationer med MetaMask behöver du Ether i din plÃ¥nbok." + }, + "needImportFile": { + "message": "Du mÃ¥ste välja en fil att importera.", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "Kan inte skicka negativa summor av ETH." + }, + "networkName": { + "message": "Nätverksnamn" + }, + "networks": { + "message": "Nätverk" + }, + "networkSettingsDescription": { + "message": "Lägg till och redigera RPC-nätverk" + }, + "nevermind": { + "message": "Strunt i det" + }, + "newAccount": { + "message": "Nytt konto" + }, + "newAccountDetectedDialogMessage": { + "message": "Ny adress upptäckt! Klicka här för att lägga till i din adressbok." + }, + "newAccountNumberName": { + "message": "Konto $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "Ny kontakt" + }, + "newContract": { + "message": "Nytt kontrakt" + }, + "newPassword": { + "message": "Nytt lösenord (minst 8 tecken)" + }, + "newNetwork": { + "message": "Nytt nätverk" + }, + "newToMetaMask": { + "message": "Ny pÃ¥ MetaMask?" + }, + "noAlreadyHaveSeed": { + "message": "Nej, jag har redan en seed phrase" + }, + "protectYourKeys": { + "message": "Skydda dina nycklar!" + }, + "protectYourKeysMessage1": { + "message": "Var försiktig med din seedfras — det har rapporterats om hemsidor som försöker imitera MetaMask. MetaMask kommer aldrig frÃ¥ga efter din seedfras!" + }, + "protectYourKeysMessage2": { + "message": "HÃ¥ll din fras i säkert förvar. Om du ser nÃ¥got misstänksamt eller om du är osäker pÃ¥ en hemsida, skicka ett e-postmeddelande till support@metamask.io." + }, + "rpcUrl": { + "message": "Ny RPC-URL" + }, + "optionalChainId": { + "message": "ChainID (frivilligt)" + }, + "optionalSymbol": { + "message": "Symbol (frivillig)" + }, + "newTotal": { + "message": "Ny totalsumma" + }, + "newTransactionFee": { + "message": "Ingen transaktionsavgift" + }, + "next": { + "message": "Nästa" + }, + "noAddressForName": { + "message": "Inga adresser har angetts för detta namn." + }, + "noConversionRateAvailable": { + "message": "Ingen omräkningskurs tillgänglig" + }, + "noTransactions": { + "message": "Du har inga överföringar" + }, + "notEnoughGas": { + "message": "Inte tillräckligt med gas" + }, + "noWebcamFoundTitle": { + "message": "Webbkamera hittades ej" + }, + "noWebcamFound": { + "message": "Din dators webbkamera hittades inte. Vänligen försök igen." + }, + "ofTextNofM": { + "message": "av" + }, + "orderOneHere": { + "message": "Beställ en Trezor eller Ledger och hÃ¥ll dina medel pÃ¥ is" + }, + "origin": { + "message": "Ursprung" + }, + "parameters": { + "message": "Parametrar" + }, + "participateInMetaMetrics": { + "message": "Delta i MetaMetrics" + }, + "participateInMetaMetricsDescription": { + "message": "Delta i MetaMetrics för att hjälpa oss göra MetaMask bättre" + }, + "password": { + "message": "Lösenord" + }, + "passwordsDontMatch": { + "message": "Lösenorden matchar inte" + }, + "passwordNotLongEnough": { + "message": "Lösenordet är inte tillräckligt lÃ¥ngt" + }, + "pastePrivateKey": { + "message": "Klistra in din privata nyckel här:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "väntar" + }, + "personalAddressDetected": { + "message": "Personlig adress upptäckt. Ange kontraktadress för token." + }, + "prev": { + "message": "FöregÃ¥ende" + }, + "primaryCurrencySetting": { + "message": "Primär valuta" + }, + "primaryCurrencySettingDescription": { + "message": "Välj native för att prioritera visning av värden i den ursprungliga valutan i kedjan (t.ex. ETH). Välj Fiat för att prioritera visning av värden i din valda fiatvaluta." + }, + "privacyMsg": { + "message": "Integritetspolicy" + }, + "privateKey": { + "message": "Privat nyckel", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "Varning: Avslöja aldrig denna nyckel. Med dina privata nycklar kan vem som helst stjäla tillgÃ¥ngarna pÃ¥ ditt konto." + }, + "privateNetwork": { + "message": "Privat nätverk" + }, + "queue": { + "message": "Utskriftskö" + }, + "readdToken": { + "message": "Du kan lägga till denna token i framtiden genom att välja \"Lägg till token\" i kontots alternativmeny." + }, + "recents": { + "message": "Senaste" + }, + "recipientAddress": { + "message": "Mottagaradress" + }, + "recipientAddressPlaceholder": { + "message": "Sök, allmän adress (0x) eller ENS" + }, + "rejectAll": { + "message": "Neka alla" + }, + "rejectTxsN": { + "message": "Neka överföringar pÃ¥ $1" + }, + "rejectTxsDescription": { + "message": "Du hÃ¥ller pÃ¥ att massneka överföringar pÃ¥ $1." + }, + "rejected": { + "message": "Nekad" + }, + "reset": { + "message": "Ã…terställ" + }, + "resetAccount": { + "message": "Ã…terställ konto" + }, + "resetAccountDescription": { + "message": "Ã…terställning av ditt konto rensar din transaktionshistorik" + }, + "deleteNetwork": { + "message": "Radera nätverk?" + }, + "deleteNetworkDescription": { + "message": "Är du säker pÃ¥ att du vill ta bort detta nätverk?" + }, + "remindMeLater": { + "message": "PÃ¥minn mig senare" + }, + "restoreFromSeed": { + "message": "Ã…terställ konto?" + }, + "restoreAccountWithSeed": { + "message": "Ã…terställ ditt konto med seedphrase" + }, + "requestsAwaitingAcknowledgement": { + "message": "anrop som väntar pÃ¥ godkännande" + }, + "required": { + "message": "Krävs" + }, + "restore": { + "message": "Ã…terställ" + }, + "revealSeedWords": { + "message": "Visa seed-ord" + }, + "revealSeedWordsTitle": { + "message": "Seed phrase" + }, + "revealSeedWordsDescription": { + "message": "Om du nÃ¥gonsin byter webbläsare eller dator kommer du behöva denna" + }, + "revealSeedWordsWarningTitle": { + "message": "DELA INTE frasen med nÃ¥gon!" + }, + "revealSeedWordsWarning": { + "message": "De här orden kan användas för att stjäla alla dina konton." + }, + "remove": { + "message": "Ta bort" + }, + "removeAccount": { + "message": "Ta bort konto" + }, + "removeAccountDescription": { + "message": "Detta konto kommer att avlägsnas frÃ¥n din plÃ¥nbok. Säkerställ att du har din ursprungliga seed phrase eller den privata nyckeln till detta importerade konto innan du fortsätter. Du kan importera eller skapa konton igen via kontots rullgardinsmeny." + }, + "readyToConnect": { + "message": "Redo att ansluta?" + }, + "rinkeby": { + "message": "Rinkeby testnätverk" + }, + "ropsten": { + "message": "Ropsten testnätverk" + }, + "goerli": { + "message": "Goerli testnätverk" + }, + "save": { + "message": "Spara" + }, + "slow": { + "message": "LÃ¥ngsamt" + }, + "slower": { + "message": "LÃ¥ngsammare" + }, + "saveAsCsvFile": { + "message": "Spara som CSV-fil" + }, + "scanInstructions": { + "message": "Placera QR-koden framför din kamera" + }, + "scanQrCode": { + "message": "Skanna QR-koden" + }, + "search": { + "message": "Sök" + }, + "searchResults": { + "message": "Sökresultat" + }, + "secretBackupPhrase": { + "message": "Hemlig Ã¥terställningsfras" + }, + "secretBackupPhraseDescription": { + "message": "Din hemliga backup-fras gör det enkelt att säkerhetskopiera och Ã¥terställa ditt konto." + }, + "secretBackupPhraseWarning": { + "message": "VARNING: avslöja aldrig din backup-fras. NÃ¥gon som känner till denna fras kan ta dina Ether för alltid." + }, + "secretPhrase": { + "message": "Ange din tolv ord lÃ¥nga hemliga fras här för att Ã¥terställa ditt valv." + }, + "securityAndPrivacy": { + "message": "Säkerhet och integritet" + }, + "securitySettingsDescription": { + "message": "Sekretessinställningar och plÃ¥nbokens seedfras" + }, + "seedPhrasePlaceholder": { + "message": "Separera varje ord med ett enda mellanslag." + }, + "seedPhraseReq": { + "message": "Nyckelfraser är 12 ord lÃ¥nga." + }, + "selectCurrency": { + "message": "Välj valuta" + }, + "selectEachPhrase": { + "message": "Välj varje fras för att säkerställa att den är korrekt." + }, + "selectLocale": { + "message": "Välj plats" + }, + "selectType": { + "message": "Välj typ" + }, + "send": { + "message": "Skicka" + }, + "sendAmount": { + "message": "Skicka belopp" + }, + "sendETH": { + "message": "Skicka ETH" + }, + "sendTokens": { + "message": "Skicka tokens" + }, + "sentEther": { + "message": "skickat ether" + }, + "sentTokens": { + "message": "skickade tokens" + }, + "separateEachWord": { + "message": "Lägg in ett mellanslag mellan varje ord" + }, + "searchTokens": { + "message": "Sök tokens" + }, + "selectAnAccount": { + "message": "Välj ett konto" + }, + "selectAnAccountHelp": { + "message": "Välj konto att visa i MetaMask" + }, + "selectAHigherGasFee": { + "message": "Välj en högre bränsleavgift för att accelerera transaktionsprocessen.*" + }, + "selectHdPath": { + "message": "Välj HD-sökväg" + }, + "selectPathHelp": { + "message": "Om du inte ser dina befintliga Ledger-konton nedan, prova att byta sökväg till \"Legacy (MEW / MyCrypto)\"" + }, + "settings": { + "message": "Inställningar" + }, + "showAdvancedGasInline": { + "message": "Avancerade gaskontroller" + }, + "showAdvancedGasInlineDescription": { + "message": "Välj detta för att visa gas-pris och gränskontroller direkt pÃ¥ skicka och bekräfta-skärmarna." + }, + "showFiatConversionInTestnets": { + "message": "Visa omvandling pÃ¥ testnätverk" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Välj denna för att visa fiatomvandlingar pÃ¥ Testnätverk" + }, + "showPrivateKeys": { + "message": "Visa privata nycklar" + }, + "showHexData": { + "message": "Visa hex-information" + }, + "showHexDataDescription": { + "message": "Välj detta för att visa hex-datafältet pÃ¥ sändarskärmen" + }, + "sign": { + "message": "Signera" + }, + "signatureRequest": { + "message": "Signaturbegäran" + }, + "signed": { + "message": "Signerat" + }, + "signNotice": { + "message": "Att signera det här meddelandet kan fÃ¥ farliga följder. Signera endast meddelanden frÃ¥n sidor du vÃ¥gar anförtro hela ditt konto Ã¥t. Den här farliga metoden kommer att avlägsnas i kommande versioner." + }, + "sigRequest": { + "message": "SignaturförfrÃ¥gan" + }, + "somethingWentWrong": { + "message": "Hoppsan! NÃ¥got gick fel." + }, + "speedUp": { + "message": "Snabba upp" + }, + "speedUpCancellation": { + "message": "Snabba upp denna avbokning" + }, + "speedUpTransaction": { + "message": "Snabba upp den här transaktionen" + }, + "switchNetworks": { + "message": "Växla nätverk" + }, + "stateLogs": { + "message": "Statushistorik" + }, + "stateLogsDescription": { + "message": "Statusloggar innehÃ¥ller dina publika kontoadresser och skickade transaktioner." + }, + "stateLogError": { + "message": "Fel vid inhämtande av statusloggar." + }, + "step1HardwareWallet": { + "message": "1. Anslut hÃ¥rdvaruplÃ¥nbok" + }, + "step1HardwareWalletMsg": { + "message": "Koppla din hÃ¥rdvaruplÃ¥nbok direkt till din dator" + }, + "step2HardwareWallet": { + "message": "2. Välj ett konto" + }, + "step2HardwareWalletMsg": { + "message": "Välj det konto du vill visa. Du kan bara välja ett Ã¥t gÃ¥ngen." + }, + "step3HardwareWallet": { + "message": "3. Börja använda dApps och mer!" + }, + "step3HardwareWalletMsg": { + "message": "Använd ditt hÃ¥rdvarukonto som du skulle använda andra Ethereum-konton. Logga in i dAppar, skicka ETH, köp och förvara ERC20-tokens och Non-Fungible tokens som CryptoKitties." + }, + "storePhrase": { + "message": "Lagra denna fras i en lösenordshanterare sÃ¥som 1Password." + }, + "submitted": { + "message": "Inskickat" + }, + "supportCenter": { + "message": "Besök vÃ¥rt supportcenter" + }, + "symbolBetweenZeroTwelve": { + "message": "Symbolen mÃ¥ste vara 11 tecken eller färre." + }, + "syncWithMobile": { + "message": "Synka med mobil" + }, + "syncWithMobileTitle": { + "message": "Synka med mobil" + }, + "syncWithMobileDesc": { + "message": "Du kan nu synka dina konton och din information med din mobil-enhet. Öppna MetaMasks mobil-app, gÃ¥ till \"Inställningar\" och tryck pÃ¥ \"Synka frÃ¥n webbläsartillägg\"" + }, + "syncWithMobileDescNewUsers": { + "message": "Om du öppnar MetaMask mobilapplikation för första gÃ¥ngen behöver du bara följa stegen som visas i telefonen." + }, + "syncWithMobileScanThisCode": { + "message": "Skanna den här koden med din MetaMask mobilapplikation" + }, + "syncWithMobileBeCareful": { + "message": "Försäkra dig om att ingen tittar pÃ¥ din skärm när du skannar denna kod" + }, + "syncWithMobileComplete": { + "message": "Din data har nu synkats. Ha det sÃ¥ kul med MetaMasks mobil-app!" + }, + "terms": { + "message": "Användarvillkor" + }, + "testFaucet": { + "message": "Test-faucet" + }, + "thisWillCreate": { + "message": "Detta kommer att skapa en ny plÃ¥nbok och seed phrase" + }, + "tips": { + "message": "Donationer" + }, + "to": { + "message": "Till" + }, + "tokenAlreadyAdded": { + "message": "Token har redan lagts till." + }, + "tokenContractAddress": { + "message": "Kontraktsadress för token" + }, + "tokenSymbol": { + "message": "Token-symbol" + }, + "transaction": { + "message": "överföring" + }, + "transactionConfirmed": { + "message": "Transaktionen bekräftad pÃ¥ $2." + }, + "transactionCreated": { + "message": "Transaktion skapad med ett värde pÃ¥ $1 pÃ¥ $2." + }, + "transactionDropped": { + "message": "Transaktionen avbruten vid $2." + }, + "transactionSubmitted": { + "message": "Överföring angedd med gasavgift pÃ¥ $1 vid $2." + }, + "transactionResubmitted": { + "message": "Transaktion skickad igen med gas-avgift ökad till $1 pÃ¥ $2" + }, + "transactionUpdated": { + "message": "Transaktionen uppdaterades $2." + }, + "transactionErrored": { + "message": "Transaktionen pÃ¥träffade ett fel." + }, + "transactionCancelAttempted": { + "message": "Överföringsavbrott har försökt göras med gasavgift pÃ¥ $1 vid $2" + }, + "transactionCancelSuccess": { + "message": "Överföringen avbröts vid $2" + }, + "transactionError": { + "message": "Överföringsfel. Undantag i kontraktskoden." + }, + "transactionErrorNoContract": { + "message": "Försöker Ã¥beropa en funktion pÃ¥ en icke-kontraktsadress." + }, + "transactionFee": { + "message": "Transaktionsavgift" + }, + "transactionTime": { + "message": "Transaktionstid" + }, + "transfer": { + "message": "Överföring" + }, + "transferBetweenAccounts": { + "message": "Överför mellan mina konton" + }, + "transferFrom": { + "message": "Överför frÃ¥n" + }, + "troubleTokenBalances": { + "message": "Vi hade problem med att ladda dina token-saldon. Du kan se dem", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "Försök igen" + }, + "typePassword": { + "message": "Ange ditt MetaMask-lösenord" + }, + "unapproved": { + "message": "Inte godkänd" + }, + "units": { + "message": "enheter" + }, + "unknown": { + "message": "okänt" + }, + "unknownNetwork": { + "message": "Okänt privatnätverk" + }, + "unknownQrCode": { + "message": "Fel: Vi kunde inte identifiera denna QR-kod" + }, + "unknownCameraErrorTitle": { + "message": "Hoppsan! NÃ¥got gick fel..." + }, + "unknownCameraError": { + "message": "Ett fel inträffade när din kamera försökte användas. Försök igen..." + }, + "unlock": { + "message": "LÃ¥s upp" + }, + "unlockMessage": { + "message": "Den decentraliserade webben väntar" + }, + "updatedWithDate": { + "message": "Uppdaterat $1" + }, + "urlErrorMsg": { + "message": "URI:er kräver lämpligt HTTP/HTTPS-prefix." + }, + "usedByClients": { + "message": "Används av mÃ¥nga olika klienter" + }, + "userName": { + "message": "Användarnamn" + }, + "viewAccount": { + "message": "Visa konto" + }, + "viewinExplorer": { + "message": "Visa i Utforskaren" + }, + "viewContact": { + "message": "Visa kontakt" + }, + "viewOnCustomBlockExplorer": { + "message": "Visa vid $1" + }, + "viewOnEtherscan": { + "message": "Visa pÃ¥ Etherscan" + }, + "visitWebSite": { + "message": "Besök vÃ¥r hemsida" + }, + "walletSeed": { + "message": "PlÃ¥nboksseed" + }, + "welcomeBack": { + "message": "Välkommen tillbaka!" + }, + "welcome": { + "message": "Välkommen till MetaMask" + }, + "writePhrase": { + "message": "Skriv ner den här frasen pÃ¥ ett papper och förvara den pÃ¥ en säker plats. Om du vill ha större säkerhet skriver du ner den pÃ¥ flera papperslappar och förvarar dem pÃ¥ tvÃ¥ eller tre olika platser." + }, + "yesLetsTry": { + "message": "Ja, lÃ¥t oss försöka" + }, + "youNeedToAllowCameraAccess": { + "message": "Du mÃ¥ste tillÃ¥ta Ã¥tkomst till kameran för att använda den här funktionen." + }, + "yourSigRequested": { + "message": "En begäran om din signatur har skickats" + }, + "youSign": { + "message": "Du signerar" + }, + "yourPrivateSeedPhrase": { + "message": "Din privata seedphrase" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "Inget gaspris vid uppsnabbning" + } +} diff --git a/app/_locales/sw/messages.json b/app/_locales/sw/messages.json new file mode 100644 index 000000000000..aa0c03cd9b9b --- /dev/null +++ b/app/_locales/sw/messages.json @@ -0,0 +1,1288 @@ +{ + "chartOnlyAvailableEth": { + "message": "Zogoa inapatikana kwenye mitandao ya Ethereum pekee." + }, + "contractInteraction": { + "message": "Mwingiliono wa Mkataba" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "reject": { + "message": "Kataa" + }, + "about": { + "message": "Kuhusu" + }, + "aboutSettingsDescription": { + "message": "Toleo, kituo cha msaada, na taarifa za mawasiliano" + }, + "acceleratingATransaction": { + "message": "*Kuwezesha muamala kwa kutumia bei ya juu ya gesi huongeza uwezekano wake wa kushughulikiwa na mtandao haraka, lakini hauhakikishiwi siku zote." + }, + "accessingYourCamera": { + "message": "Kufikia kamera yako..." + }, + "account": { + "message": "Akaunti" + }, + "accountDetails": { + "message": "Maelezo ya Akaunti" + }, + "accountName": { + "message": "Jina la Akaunti" + }, + "accountOptions": { + "message": "Machaguo ya Akaunti" + }, + "accountSelectionRequired": { + "message": "Unatakiwa kuchagua akaunti!" + }, + "activityLog": { + "message": "kumbukumbu ya shughuli" + }, + "addNetwork": { + "message": "Ongeza Mtandao" + }, + "addRecipient": { + "message": "Ongeza Mpokeaji" + }, + "advanced": { + "message": "Mipangilio ya kina" + }, + "advancedSettingsDescription": { + "message": "Vipengele vya idhini ya msanidi, Kumbukumbu za Hali ya kupakua, Kufuta Akaunti, mitando ya majaribio ya kuweka mipangilio na RPC maalumu" + }, + "advancedOptions": { + "message": "Machaguo ya Juu" + }, + "addToAddressBook": { + "message": "Ongeza kwenye kitabu cha anwani" + }, + "addToAddressBookModalPlaceholder": { + "message": "k.m John D." + }, + "addAlias": { + "message": "Ongeza jina jingine" + }, + "addToken": { + "message": "Ongeza Kianzio" + }, + "addTokens": { + "message": "Ongeza Vianzio" + }, + "addSuggestedTokens": { + "message": "Ongeza Vianzio Vilivyopendekezwa" + }, + "addAcquiredTokens": { + "message": "Ongeza vianzio ulivyopata kwa kutumia MetaMask" + }, + "amount": { + "message": "Kiasi" + }, + "appDescription": { + "message": "Waleti ya Ethereum kwenye Kivinjari chako", + "description": "The description of the application" + }, + "approve": { + "message": "Idhinisha" + }, + "approved": { + "message": "Imeidhinishwa" + }, + "asset": { + "message": "Rasilimali" + }, + "attemptingConnect": { + "message": "Inajaribu kuunganisha kwenye blockchain." + }, + "attemptToCancel": { + "message": "Unajaribu Kubatilisha?" + }, + "attemptToCancelDescription": { + "message": "Kuwasilisha jaribio hili hakukuhakikishii muamala wako wa awali utabatilishwa. Ikiwa jaribio la kuffuta litafanikiwa, utatozwa ada ya muamala hapo juu." + }, + "attributions": { + "message": "Sifa" + }, + "autoLockTimeLimit": { + "message": "Kihesabu Muda wa Kuondoka Kwenye Akaunti Kiotomatiki (dakika)" + }, + "autoLockTimeLimitDescription": { + "message": "Weka muda katika dakika kabla MetaMask haijaondoa kwenye akaunti kiotomatiki." + }, + "average": { + "message": "Wastani" + }, + "back": { + "message": "Nyuma" + }, + "backToAll": { + "message": "Rudi kwenye Zote" + }, + "backupApprovalNotice": { + "message": "Hifadhi msimbo wa Siri wa Kurejesha data ili kuweka salama waleti yako na fedha." + }, + "backupApprovalInfo": { + "message": "Msimbo huu wa siri unahitajika ili kurejesha waleti yako ikitokea umepoteza kifaa chako, umesahau nenosiri lako, umelazimika kusakinisha MetaMask, au unataka kufikia waleti yako kwenye kifaa kingine." + }, + "backupNow": { + "message": "Hifadhi sasa" + }, + "balance": { + "message": "Salio" + }, + "balanceOutdated": { + "message": "Salio linaweza kuwa limepitwa na wakati" + }, + "basic": { + "message": "Msingi" + }, + "blockExplorerView": { + "message": "Tazama akaunti kwenye $1", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "Tumia Blockies Identicon" + }, + "browserNotSupported": { + "message": "Kivinjari chaku hakiwezeshwi..." + }, + "builtInCalifornia": { + "message": "MetaMask imeundwa na kutengenezwa California." + }, + "buyWithWyre": { + "message": "Nunua ETH kwa kutumia Wyre" + }, + "buyWithWyreDescription": { + "message": "Wyre inakuwezesha kutumia kadi ya benki kuweka ETH moja kwa moja kwenye akaunti yako ya MetaMask." + }, + "buyCoinSwitch": { + "message": "Nunua kwenye CoinSwitch" + }, + "buyCoinSwitchExplainer": { + "message": "CoinSwitch ni kituo cha kubadilisha fedha za kidijitali zaidi ya 300 kwa bei nzuri kabisa." + }, + "off": { + "message": "Kimezimwa" + }, + "ok": { + "message": "Sawa" + }, + "on": { + "message": "Imewashwa" + }, + "optionalBlockExplorerUrl": { + "message": "URL ya Block Explorer URL (hiari)" + }, + "cancel": { + "message": "Ghairi" + }, + "cancelAttempt": { + "message": "Jaribio la Kubatilisha" + }, + "cancellationGasFee": { + "message": "Ada ya Kubatilisha Gesi" + }, + "cancelled": { + "message": "Imebatilishwa" + }, + "chainId": { + "message": "Utambulisho wa Mnyororo" + }, + "clickToRevealSeed": { + "message": "Bofya hapa ili uonyeshe maneno ya siri" + }, + "close": { + "message": "Funga" + }, + "chromeRequiredForHardwareWallets": { + "message": "Unapaswa kutumia MetaMask kwenye Google Chrome ili kuungnisha kwenye Waleti yako ya Programu Maunzi." + }, + "confirm": { + "message": "Thibitisha" + }, + "confirmed": { + "message": "Imethibitishwa" + }, + "confirmPassword": { + "message": "Thibitisha Nenosiri" + }, + "confirmSecretBackupPhrase": { + "message": "Thibitisha Kirai chako cha Siri cha Kuhifadhi Data" + }, + "congratulations": { + "message": "Hongera" + }, + "connectHardwareWallet": { + "message": "Unganisha Waleti ya Programu Maunzi" + }, + "connect": { + "message": "Unganisha" + }, + "connectingTo": { + "message": "Inaunganisha kwenye $1" + }, + "connectingToKovan": { + "message": "Inaunganisha kwenye Mtandao wa Majaribio wa Kovan" + }, + "connectingToMainnet": { + "message": "Inaunganisha kwenye Mtandao Mkuu wa Ethereum" + }, + "connectingToRopsten": { + "message": "Inaunganisha kwenye Mtandao wa Majaribio wa Ropsten" + }, + "connectingToRinkeby": { + "message": "Inaunganisha kwenye Mtandao wa Majaribio wa Rinkeby" + }, + "connectingToLocalhost": { + "message": "Inaunganisha kwenye Localhost 8545" + }, + "connectingToGoerli": { + "message": "Inaunganisha kwenye Mtandao wa Majaribio wa Goerli" + }, + "continueToWyre": { + "message": "Endelea kwenye Wyre" + }, + "continueToCoinSwitch": { + "message": "Endelea kwenye CoinSwitch" + }, + "contractDeployment": { + "message": "Kutoa Mkataba" + }, + "copiedExclamation": { + "message": "Imenakiliwa!" + }, + "copyAddress": { + "message": "Nakili anwani kwenye ubao wa kunakilia" + }, + "copyTransactionId": { + "message": "Nakili Utambulisho wa Muamala" + }, + "copiedTransactionId": { + "message": "Imenakili Utambulisho wa Muamala" + }, + "copyToClipboard": { + "message": "Nakili kwenye ubao wa kunakili" + }, + "copyPrivateKey": { + "message": "Huu ni ufunguo wako wa kibinafsi (bofya ili unakili)" + }, + "create": { + "message": "Unda" + }, + "createAccount": { + "message": "Fungua Akaunti" + }, + "createAWallet": { + "message": "Fungua Waleti" + }, + "createPassword": { + "message": "Unda Nenosiri" + }, + "currencyConversion": { + "message": "Ubadilishaji Fedha" + }, + "currentLanguage": { + "message": "Lugha ya Sasa" + }, + "customGas": { + "message": "Weka Mipangilio ya Gesi Upendavyo" + }, + "customGasSubTitle": { + "message": "Ada iliyoongezeka inaweza kupunguza muda wa uchakataji, lakini haihakikishwi." + }, + "customToken": { + "message": "Kianzio Maalumu" + }, + "customRPC": { + "message": "RPC Maalumu" + }, + "decimalsMustZerotoTen": { + "message": "Desimali zinapaswa kuwa angalau 0, na si zaidi ya 36." + }, + "decimal": { + "message": "Desimali za Usahihi" + }, + "defaultNetwork": { + "message": "Mtandao chaguomsingi wa miamala ya Ether ni Main Net." + }, + "delete": { + "message": "Futa" + }, + "deleteAccount": { + "message": "Futa Akaunti" + }, + "deposit": { + "message": "Fedha zilizopo kwenye akaunti" + }, + "depositEther": { + "message": "Weka Ether" + }, + "details": { + "message": "Maelezo" + }, + "directDepositEther": { + "message": "Weka Ether Moja kwa Moja" + }, + "directDepositEtherExplainer": { + "message": "Ikiwa tayari una sarafu kadhaa za Ether, njia rahisi ya kupata Ether kwenye waleti yako mpya kupitia kuweka moja kwa moja." + }, + "done": { + "message": "Imekamilika" + }, + "downloadGoogleChrome": { + "message": "Pakua Google chrome" + }, + "downloadSecretBackup": { + "message": "Pakuwa Kirai hiki cha Hifadhi Mbadala ya Siri na na kitunze kwa usalama kwenye kihifadhi cha nje chenye neneosiri au kifaa cha kuhifadhia." + }, + "downloadStateLogs": { + "message": "Pakua Kumbukumbu za Hali" + }, + "dontHaveAHardwareWallet": { + "message": "Huna waleti ya programu maunzi?" + }, + "dropped": { + "message": "Imedondoshwa" + }, + "edit": { + "message": "Badilisha" + }, + "editContact": { + "message": "Hariri Mawasiliano" + }, + "endOfFlowMessage1": { + "message": "Umefaulu jaribio - weka kirai chako cha kuanzia mahali salama, ni wajibu wako!" + }, + "endOfFlowMessage2": { + "message": "Dondoo kuhusu kukihifadhi salama" + }, + "endOfFlowMessage3": { + "message": "Hifadhi hifadhimbadala kwenye maeneo kadhaa." + }, + "endOfFlowMessage4": { + "message": "Kamwe usimpatia mtu yeye kirai hicho." + }, + "endOfFlowMessage5": { + "message": "Kuwa makini na walaghai! MetaMask kamwe haitakuomba kirai chako kianzio." + }, + "endOfFlowMessage6": { + "message": "Ikiwa unataka kuhifadhi tena kwa njia mbadla kirai chako kianzio, unaweza kukipata kwenye Mipangilio -> Usalama." + }, + "endOfFlowMessage7": { + "message": "Ikiwa una maswali au umeona kitu ambacho ni cha ulaghai, tuma barua pepe support@metamask.io." + }, + "endOfFlowMessage8": { + "message": "MetaMask haiwezi kurejesha kirai chako kianzio. Pata maelezo ziadi." + }, + "endOfFlowMessage9": { + "message": "Jifunze zaidi." + }, + "endOfFlowMessage10": { + "message": "Yote Imekamilika" + }, + "ensRegistrationError": { + "message": "Hitilafu imetokea kwenye usajili wa jina la ENS" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "Jina la ENS halipatikani kwenye mtandao wa sasa. Jaribu kuhamia kwenye Mtandao Mkuu wa Ethereum." + }, + "enterAnAlias": { + "message": "Ingiza majina mengine" + }, + "enterPassword": { + "message": "Ingiza nenosiri" + }, + "enterPasswordContinue": { + "message": "Ingiza nenosiri ili uendelee" + }, + "ethereumPublicAddress": { + "message": "Anwani ya Umma ya Ethereum" + }, + "etherscanView": { + "message": "Tazama akaunti kwenye Etherscan" + }, + "estimatedProcessingTimes": { + "message": "Muda wa Kuchakata Uliokadiriwa" + }, + "expandView": { + "message": "Panua Mwonekano" + }, + "exportPrivateKey": { + "message": "Panua Mwonekano" + }, + "failed": { + "message": "Imeshindwa" + }, + "fast": { + "message": "Haraka" + }, + "faster": { + "message": "Ingiza" + }, + "fileImportFail": { + "message": "Kuhamisha faili hakufanyi kazi? Bofya hapa!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "Ondoa kifaa hiki" + }, + "from": { + "message": "Kutoka" + }, + "functionType": { + "message": "Aina ya Shughuli" + }, + "gasLimit": { + "message": "Kikomo cha Gesi" + }, + "gasLimitInfoModalContent": { + "message": "Ukomo wa gesi ni kiwango cha juu kabisa cha cha vizio vya gesi ambavyo upo tayari kutumia." + }, + "gasLimitTooLow": { + "message": "Kikomo cha gesi kinapaswa kua angalau 21000" + }, + "gasUsed": { + "message": "Gesi iliyotumika" + }, + "gasPrice": { + "message": "Pata Bei (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "Bei ya Gesi Ipo Chini Kupita Kiasi" + }, + "gasPriceInfoModalContent": { + "message": "Bei ya gesi hubainisha kiwango cha Ether ambacho upo radhi kulipia kila kizio cha gesi." + }, + "gasPriceNoDenom": { + "message": "Bei ya Gesi" + }, + "general": { + "message": "Jumla" + }, + "generalSettingsDescription": { + "message": "Ubadilishaji wa fedha, sarafu ya msingi, lugha, blockies identicon" + }, + "getEther": { + "message": "Pata Ether" + }, + "getEtherFromFaucet": { + "message": "Pata Ether kutoka kwenye mfereji $1", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "Pata Msaada" + }, + "getStarted": { + "message": "Anza" + }, + "happyToSeeYou": { + "message": "Tuna furaha kukuona" + }, + "hardware": { + "message": "programu maunzi" + }, + "hardwareWalletConnected": { + "message": "Waleti ya programu maunzi imeunganishwa" + }, + "hardwareWallets": { + "message": "Unganisha waleti ya programu maunzi" + }, + "hardwareWalletsMsg": { + "message": "Chagua waleti ya programu maunzi ambayo ungependa kutumia kwenye MetaMask" + }, + "havingTroubleConnecting": { + "message": "Je, unapata shida kuunganisha?" + }, + "here": { + "message": "hapa", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hide": { + "message": "Ficha" + }, + "hideTokenPrompt": { + "message": "Ungependa Kianzio?" + }, + "history": { + "message": "Historia" + }, + "import": { + "message": "Ingiza", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "Ingiza Akaunti" + }, + "importAccountMsg": { + "message": "Akaunti zilizoingizwa hazitahusishwa na kirai chako cha kianzio cha akaunti ya MetaMask iliyoundwa awali. Pata maelezo zaidi kuhusu akaunti zilizoingizwa" + }, + "importAccountSeedPhrase": { + "message": "Hamisha Akaunti kwa kutumia Kirai Kianzio" + }, + "importWallet": { + "message": "Hamisha Waleti" + }, + "importYourExisting": { + "message": "Hamisha waleti iliyopo kwa kutumia kirai kianzio cha maneno 12" + }, + "imported": { + "message": "Zilizoingizwa", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "Hamisha kwa kutumia kirai kianzio cha akaunti" + }, + "infoHelp": { + "message": "Taarifa & Msaada" + }, + "initialTransactionConfirmed": { + "message": "Muamala wako wa awali ulithibitishwa na mtandao. Bofya SWA ili urudi nyuma." + }, + "insufficientBalance": { + "message": "Salio halitoshi." + }, + "insufficientFunds": { + "message": "Fedha haitoshi." + }, + "insufficientTokens": { + "message": "Vianzio havitoshi." + }, + "invalidAddress": { + "message": "Awani si halali" + }, + "invalidAddressRecipient": { + "message": "Anwani ya mpokeaji si halali" + }, + "knownAddressRecipient": { + "message": "Anwani za mkataba zinazofahamika." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "Kwa mtandao wa ETH, weka herufi ndogo" + }, + "invalidInput": { + "message": "Maandii si sahihi." + }, + "invalidRPC": { + "message": "RPC URL batili" + }, + "invalidBlockExplorerURL": { + "message": "Block Explorer URL batili" + }, + "invalidSeedPhrase": { + "message": "Kirai kianzio batili" + }, + "jsonFile": { + "message": "Faili la JSON", + "description": "format for importing an account" + }, + "kovan": { + "message": "Mtandao wa Majaribio wa Kovan" + }, + "learnMore": { + "message": "Jifunze zaidi" + }, + "ledgerAccountRestriction": { + "message": "Unapaswa kutumia akaunti yako ya mwisho kabla hujaongeza mpya." + }, + "letsGoSetUp": { + "message": "Ndiyo, hebu tuweke mipangilio!" + }, + "likeToAddTokens": { + "message": "Je, ungependa kuongeza vianzio hivi?" + }, + "links": { + "message": "Viungo" + }, + "liveGasPricePredictions": { + "message": "Utabiri wa moja kwa moja wa Bei ya Gesi" + }, + "loading": { + "message": "Inapakia..." + }, + "loadingTokens": { + "message": "Inapakia Vianzio..." + }, + "loadMore": { + "message": "Pak zAIDI" + }, + "lock": { + "message": "Toka kwenye akaunti" + }, + "mainnet": { + "message": "Mtandao Mkuu wa Ethereum" + }, + "memorizePhrase": { + "message": "Kariri kirai hiki" + }, + "message": { + "message": "Ujumbe" + }, + "metamaskDescription": { + "message": "Kukuunganisha kwenye Ethereum na Wavutiu Uliotawanywa." + }, + "metamaskVersion": { + "message": "Toleo la MetaMask" + }, + "mobileSyncText": { + "message": "Tafadhali ingiza nenosiri lako ili kuthibitisha kuwa ni wewe!" + }, + "myAccounts": { + "message": "Akaunti zangu" + }, + "myWalletAccounts": { + "message": "Akaunti angu za Waleti" + }, + "myWalletAccountsDescription": { + "message": "Akaunti zako zote za MetaMask zilizofunguliwa zitaongezwa kiotomatiki kwenye sehemu hii." + }, + "mustSelectOne": { + "message": "Lazima uchague angalau kianzio 1." + }, + "needEtherInWallet": { + "message": "Ili kuingiliana na programu zilizosambazwa kwa kutumia MetaMask, utahitaji kuwa na Ether kwenye waleti yako." + }, + "needImportFile": { + "message": "Unapaswa kuchagua faili la kuhamisha.", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "Haiwezi kutuma viwango hasi vya ETH." + }, + "networkName": { + "message": "Jina la mtandao" + }, + "networks": { + "message": "Mitandao" + }, + "networkSettingsDescription": { + "message": "Ongeza na hariri mitandao maalumu ya RPC" + }, + "nevermind": { + "message": "Usijali" + }, + "newAccount": { + "message": "Akaunti Mpya" + }, + "newAccountDetectedDialogMessage": { + "message": "Anwani mpya zimegunduliwa! Bofya hapa ili uongeze kitabu chako cha anwani." + }, + "newAccountNumberName": { + "message": "Akaunti $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "Mawasiliano Mapya" + }, + "newContract": { + "message": "Mkataba Mpya" + }, + "newPassword": { + "message": "Nenosiri Jipya (kiwango cha chini herufi 8)" + }, + "newNetwork": { + "message": "Mtandao Mpya" + }, + "newToMetaMask": { + "message": "MetaMask mpya?" + }, + "noAlreadyHaveSeed": { + "message": "Hapana, tayari nini kirai cha kuanzia" + }, + "protectYourKeys": { + "message": "Linda Funguo Zako!" + }, + "protectYourKeysMessage1": { + "message": "Kuwa mwangalifu na kirai kianzio chako - kumekuwa na taarifa za tovuti ambazo zinajaribu kuiga MetaMask. MetaMask kamwe haitakuomba kirai kianzio chako!" + }, + "protectYourKeysMessage2": { + "message": "Weka salama kirai kianzio chako. Ikiwa unaona kitu cha kilaghai, au huna uhakika na tovuti fulani, tuma barua pepe kwenda support@metamask.io" + }, + "rpcUrl": { + "message": "RPC URL mpya" + }, + "optionalChainId": { + "message": "Utambulisho wa Mnyororo (hiari)" + }, + "optionalSymbol": { + "message": "Ishara (hiari)" + }, + "newTotal": { + "message": "Jumla Mpya" + }, + "newTransactionFee": { + "message": "Ada Mpya ya Muamala" + }, + "next": { + "message": "Inayofuata" + }, + "noAddressForName": { + "message": "Hakuna anwani iliyoundwa kwa jina hili." + }, + "noConversionRateAvailable": { + "message": "Hakuna Kiwango cha Ubadilishaji" + }, + "noTransactions": { + "message": "Huna miamala." + }, + "notEnoughGas": { + "message": "Hakuna Gesi ya Kutosha" + }, + "noWebcamFoundTitle": { + "message": "Kamera haipatikanai" + }, + "noWebcamFound": { + "message": "Kamera yako ya kumpyuta haikupatikana. Tafadhali jaribu tena." + }, + "ofTextNofM": { + "message": "ya" + }, + "orderOneHere": { + "message": "Agiza Trezor au Leja na weka fedha zako kwenye ifadhi ya baridi" + }, + "origin": { + "message": "Asili" + }, + "parameters": { + "message": "Vigezo" + }, + "participateInMetaMetrics": { + "message": "Shiriki katika MetaMetrics" + }, + "participateInMetaMetricsDescription": { + "message": "Shiriki katika MetaMetrics ili kutusaidia kufanya MetaMask kuwa bora zaidi" + }, + "password": { + "message": "Nenosiri" + }, + "passwordsDontMatch": { + "message": "Manenosiri hayawiani" + }, + "passwordNotLongEnough": { + "message": "Nenosiri si refu vya kutosha" + }, + "pastePrivateKey": { + "message": "Bandika uzi wako wa ufunguo binafsi hapa:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "inasubiri" + }, + "personalAddressDetected": { + "message": "Anwani binafsi imegunduliwa. Weka anwani ya mkataba ya kianzio." + }, + "prev": { + "message": "Hakiki" + }, + "primaryCurrencySetting": { + "message": "Sarafu ya Msingi" + }, + "primaryCurrencySettingDescription": { + "message": "Chagua mzawa ili kuweka kipaumbele kuonyesha thamani kwenye sarafu mzawa ya mnyororo (k.m ETH). Chagua Fiat ili uwelke kipaumbale kuonyesha thamani kwenye sarafu yako ya fiat uliyoichagua." + }, + "privacyMsg": { + "message": "Sera ya Faragha" + }, + "privateKey": { + "message": "Ufunguo Binafsi", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "Onyo: Kamwe usifichue ufunguo huu. Mtu yeyote mwenye funguo zako binafsi anaweza kuiba rasilimali yoyote iliyopo kwenye akaunti yako." + }, + "privateNetwork": { + "message": "Mtandao Binafsi" + }, + "queue": { + "message": "Foleni" + }, + "readdToken": { + "message": "Unaweza kuongeza tena kianzio hiki hapo baadaye kwa kwenda kwenye \"Ongeza kianzio\" kwenye machaguo yako ya menyu ya akaunti." + }, + "recents": { + "message": "Za hivi karibuni" + }, + "recipientAddress": { + "message": "Anwani ya Mpokeaji" + }, + "recipientAddressPlaceholder": { + "message": "Tafuta, anwani za umma (0x), au ENS" + }, + "rejectAll": { + "message": "Kataa Zote" + }, + "rejectTxsN": { + "message": "Kataa $1 miamala" + }, + "rejectTxsDescription": { + "message": "Unakaribia kukataa miamala $1kwa mafungu." + }, + "rejected": { + "message": "Imekataliwa" + }, + "reset": { + "message": "Weka upya" + }, + "resetAccount": { + "message": "Futa Akaunti" + }, + "resetAccountDescription": { + "message": "Kufuta Akaunti yako kutafuta histori ya akaunti yako." + }, + "deleteNetwork": { + "message": "Futa Mtandao?" + }, + "deleteNetworkDescription": { + "message": "Una uhakika unataka kufuta mtandao huu?" + }, + "remindMeLater": { + "message": "Nikumbushe baadaye" + }, + "restoreFromSeed": { + "message": "Rejesha akaunti?" + }, + "restoreAccountWithSeed": { + "message": "Rejesha Akaunti yako kwa kutumia Kirai Kianzio." + }, + "requestsAwaitingAcknowledgement": { + "message": "maombi yanasubiriwa kutambuliwa" + }, + "required": { + "message": "Inahitajika" + }, + "restore": { + "message": "Rejesha" + }, + "revealSeedWords": { + "message": "Onyesha Maneno ya Kianzio" + }, + "revealSeedWordsTitle": { + "message": "Kiari Kianzio" + }, + "revealSeedWordsDescription": { + "message": "Ikiwa utabadilisha kisakuzi au kuhamisha kompyuta, utahitaji kirai hiki kianzio ili kufikia akaunti zako. Vihifadhi mahali fulani ambapo ni salamana pa siri." + }, + "revealSeedWordsWarningTitle": { + "message": "USISHIRIKI kirai hiki na mtu yeyote!" + }, + "revealSeedWordsWarning": { + "message": "Maneno haya yanaweza kutumika kuiba akanti zako zote." + }, + "remove": { + "message": "Ondoa" + }, + "removeAccount": { + "message": "Ondoa akaunti" + }, + "removeAccountDescription": { + "message": "Akaunti hii itaondolewa kwenye waleti yako. Tafadhali hakikisha una kirai kianzio cha asili au ufunguo binafsi kwa akaunti hii iliyohamishwa kabla ya kuendelea. Unaweza kuhamisha au kufungua akaunti tena kutoka kwenye menyu ya akaunti." + }, + "readyToConnect": { + "message": "Uko tayari Kuunganisha?" + }, + "rinkeby": { + "message": "Mtandao wa Majaribio wa Rinkeby" + }, + "ropsten": { + "message": "Mtandao wa Majaribio wa Ropsten" + }, + "goerli": { + "message": "Mtandao wa Majaribio wa Goerli" + }, + "save": { + "message": "Hifadhi" + }, + "slow": { + "message": "Polepole" + }, + "slower": { + "message": "Taratibu" + }, + "saveAsCsvFile": { + "message": "Hifadhi kama Faili la CSV" + }, + "scanInstructions": { + "message": "Weka msimbo wa QR mbele ya kamera yako" + }, + "scanQrCode": { + "message": "Kagua Msimbo wa QR" + }, + "search": { + "message": "Tafuta" + }, + "searchResults": { + "message": "Matokeo ya Utafutaji" + }, + "secretBackupPhrase": { + "message": "Kirai cha Siri cha Hifadhi Mbadala" + }, + "secretBackupPhraseDescription": { + "message": "Kirai chako cha siri cha hifadhi mbadala kinafanya iwe rahisi kuhifadhi kwa njia mbadala na kurejesha akaunti yako." + }, + "secretBackupPhraseWarning": { + "message": "ONYO: Kamwe usiweke wazi kirai chako cha hifadhi mbadala. Mtu yeyote mwenye kirai hiki anaweza kuchukua Ether yako daima." + }, + "secretPhrase": { + "message": "Ingiza hapa kirai chako cha siri cha maneno kumi na mawili ili urejeshe vault yako." + }, + "securityAndPrivacy": { + "message": "Ulinzi na Faragha" + }, + "securitySettingsDescription": { + "message": "Mipangilio ya Faragha na kirai kianzio cha waleti" + }, + "seedPhrasePlaceholder": { + "message": "Tenganisha kila neno kwa nafasi moja" + }, + "seedPhraseReq": { + "message": "Virai vianzio vina urefu wa maneno 12" + }, + "selectCurrency": { + "message": "Chagua Sarafu" + }, + "selectEachPhrase": { + "message": "Tafadhali chagua kila kirai ili kuhakikisha kuwa hii ni sahihi." + }, + "selectLocale": { + "message": "Chagua Lugha" + }, + "selectType": { + "message": "Chagua Aina" + }, + "send": { + "message": "Tuma" + }, + "sendAmount": { + "message": "Tuma Kiasi" + }, + "sendETH": { + "message": "Tuma ETH" + }, + "sendTokens": { + "message": "Tuma Vianzio" + }, + "sentEther": { + "message": "ether iliyotumwa" + }, + "sentTokens": { + "message": "vianzio vilivyotumwa" + }, + "separateEachWord": { + "message": "Tenganisha kila neno kwa nafasi moja" + }, + "searchTokens": { + "message": "Tafuta Vianzio" + }, + "selectAnAccount": { + "message": "Chagua Akaunti" + }, + "selectAnAccountHelp": { + "message": "Chagua akaunti kuangalia kwenye MetaMask" + }, + "selectAHigherGasFee": { + "message": "Chagua ada ya juu ya gesi ili kuharakisha uchakataji wa muamala wako.*" + }, + "selectHdPath": { + "message": "Chagua Njia ya HD" + }, + "selectPathHelp": { + "message": "Ikiwa huoni akaunti zako za Leja za sasa hapa chini, charibu kubadilisha njia kwenda \"Legacy (MEW / MyCrypto)\"  " + }, + "settings": { + "message": "Mipangilio" + }, + "showAdvancedGasInline": { + "message": "Udhibiti wa juu wa gesi" + }, + "showAdvancedGasInlineDescription": { + "message": "Chagua hii ili uonyeshe bei ya gesi na punguza vidhibiti moja kwa moja kwenye skrini za tuma na thibitisha." + }, + "showFiatConversionInTestnets": { + "message": "Onyesha Ubadilishaji kwenye Testnets" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Chagua hii ili uonyeshe ubadilishaji wa fiat kwenye Testnets" + }, + "showPrivateKeys": { + "message": "Onyesha Fungo Binafsi" + }, + "showHexData": { + "message": "Onyesha Data za Hex" + }, + "showHexDataDescription": { + "message": "Chagua hii ili uonyeshe sehemu ya data ya hex kwenye skrini ya tuma" + }, + "sign": { + "message": "Ingia kwenye akaunti" + }, + "signatureRequest": { + "message": "Ombi la Saini" + }, + "signed": { + "message": "Imesainiwa" + }, + "signNotice": { + "message": "Kusaini ujumbe huu kunaweza kuwa \nmadhara hatari. Saini ujumbe kutoka kwenye\ntovuti unazoziamini kabisa na akaunti yako yote tu.\nNjia hii ya hatari itaondolewa kwenye toleo la baadaye." + }, + "sigRequest": { + "message": "Ombi la Saini" + }, + "somethingWentWrong": { + "message": "Ayaa! Hitilafu fulani imetokea." + }, + "speedUp": { + "message": "Ongeza Kasi" + }, + "speedUpCancellation": { + "message": "Ongeza kasi ya ubatilishaji huu" + }, + "speedUpTransaction": { + "message": "Ongeza kasi ya muamala huu" + }, + "switchNetworks": { + "message": "Badilisha mitandao" + }, + "stateLogs": { + "message": "Kumbukumbu za Hali" + }, + "stateLogsDescription": { + "message": "Kumbukumbu za hali zinajumusiha anwani zako za akaunti za umma na miamala iliyotumwa." + }, + "stateLogError": { + "message": "Hitilafu imetokea kurejesha kumbukumbu za hali." + }, + "step1HardwareWallet": { + "message": "1. Unganisha Programu Maunzi ya Waleti" + }, + "step1HardwareWalletMsg": { + "message": "Unganisha programu maunzi yako ya waleti moja kwa moja kwenye kompyuta yako." + }, + "step2HardwareWallet": { + "message": "2. Chagua Akaunto" + }, + "step2HardwareWalletMsg": { + "message": "Chagua akaunti unayotaka kutazama. Unaweza kuchagua moja tu kwa wakati mmoja." + }, + "step3HardwareWallet": { + "message": "3. Anza kutumia dApps na zaidi!" + }, + "step3HardwareWalletMsg": { + "message": "Tumia akaunti yako ya programu maunzi kama ambavyo ungetumia kwa akaunti ya Ethereum. Ingia kwenye dApps, tuma Eth, nunua na hifadhi vianzio vya ERC20 na Vianzio visivyobadilishika kama vile CryptoKitties." + }, + "storePhrase": { + "message": "Hifadhi kirai hiki kwenye kidhibiti nenosiri kama vile 1Password." + }, + "submitted": { + "message": "Imewasilishwa" + }, + "supportCenter": { + "message": "Tembelea Kituo chetu cha Usaidizi" + }, + "symbol": { + "message": "Ishara" + }, + "symbolBetweenZeroTwelve": { + "message": "Alama lazima iwe na herufi 11 au chache." + }, + "syncWithMobile": { + "message": "Oanisha na simu" + }, + "syncWithMobileTitle": { + "message": "Oanisha na simu" + }, + "syncWithMobileDesc": { + "message": "Unaweza kuoanisha akaunti zako na taarifa kwa kifaa chako cha simu ya mkononi. Fungua programu ya simu ya MetaMask, kisha nenda kwenye \"Mipangilio\" na bofya kwenye \"Oanisha kutoka kwenye Kiendelezi cha Kivinjari\"" + }, + "syncWithMobileDescNewUsers": { + "message": "Ikiwa ndio umefungua tu programu ya simu ya MetaMask kwa mara ya kwanza, fuata hatua kwenye simu yako." + }, + "syncWithMobileScanThisCode": { + "message": "Kagua msimbo huu kwa kutumia programu yako ya simu ya MetaMask" + }, + "syncWithMobileBeCareful": { + "message": "Hakikisha hakuna mtu mwingine anayeangalia kwenye skrini yako unapokuwa unakagua msimbo huu." + }, + "syncWithMobileComplete": { + "message": "Umefanikiwa kuoanisha data yako. Furahia programu yako ya simu ya MetaMask!" + }, + "terms": { + "message": "Masharti ya Matumizi" + }, + "testFaucet": { + "message": "Mfereji wa Jaribio" + }, + "thisWillCreate": { + "message": "Hatua hiiitaunda waleti mpya na kirai kianzio" + }, + "tips": { + "message": "Michango" + }, + "to": { + "message": "Kwenda" + }, + "token": { + "message": "Kianzio" + }, + "tokenAlreadyAdded": { + "message": "Kianzio kimeongezwa tyari" + }, + "tokenContractAddress": { + "message": "Anwani ya Mkataba ya Kianzio" + }, + "tokenSymbol": { + "message": "Ishara ya Kianzio" + }, + "total": { + "message": "Jumla" + }, + "transaction": { + "message": "muamala" + }, + "transactionConfirmed": { + "message": "Muamala umethibitishwa mnamo $2." + }, + "transactionCreated": { + "message": "Muamala umeanzishwa kwa thamani ya $1 mnamo$2." + }, + "transactionDropped": { + "message": "Muamala umedondoswa mnamo $2." + }, + "transactionSubmitted": { + "message": "Muamala umewasilishwa ukiwa na ada ya gesi ya$1 mnamo $2." + }, + "transactionResubmitted": { + "message": "Muamala umewasilishwa tena ukiwa na ada ya gesi iliyoongezeka hadi $1 manamo $2" + }, + "transactionUpdated": { + "message": "Muamala umesasishwa mnamo $2." + }, + "transactionErrored": { + "message": "Muamala umepata hitilafu." + }, + "transactionCancelAttempted": { + "message": "Jaribio la kubatilisha muamala ukiwa na ada ya gesi ya $1 mnamo $2" + }, + "transactionCancelSuccess": { + "message": "Muamala umefanikiwa kubatilishwa mnamo $2" + }, + "transactionError": { + "message": "Hitilafu ya muamala. Kighairi kimerushwa kwenye msimbo wa mkataba." + }, + "transactionErrorNoContract": { + "message": "Inajaribu kuita shughuli kwenye anwani isiyo ya mkataba." + }, + "transactionFee": { + "message": "Ada ya Muamala" + }, + "transactionTime": { + "message": "Muda wa Muamala" + }, + "transfer": { + "message": "Kutuma" + }, + "transferBetweenAccounts": { + "message": "Kutuma baina ya akaunti zangu" + }, + "transferFrom": { + "message": "Tuma Kutoka" + }, + "troubleTokenBalances": { + "message": "Tulipata shida kupakia salio lako la kianzio. Unaweza kuliona", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "Jaribu tena" + }, + "typePassword": { + "message": "Andika nenosiri lako la MetaMask" + }, + "unapproved": { + "message": "Haijaidhinishwa" + }, + "units": { + "message": "vizio" + }, + "unknown": { + "message": "Haijulikani" + }, + "unknownNetwork": { + "message": "Mtandao Binafsi Usiojulikana" + }, + "unknownQrCode": { + "message": "Hitilafu: Hatukuweza kubainisha msimbo huo wa QR" + }, + "unknownCameraErrorTitle": { + "message": "Ayaa! Hitilafu fulani imetokea..." + }, + "unknownCameraError": { + "message": "Kulikuwa na hitilafu wakati wa kujaribu kufikia kamera yako. Tafadhali jaribu tena..." + }, + "unlock": { + "message": "Fungua" + }, + "unlockMessage": { + "message": "Wavuti uliotenganishwa unasubiri" + }, + "updatedWithDate": { + "message": "Imesasishwa $1" + }, + "urlErrorMsg": { + "message": "URI huhitaji kiambishi sahihi cha HTTP/HTTPS." + }, + "usedByClients": { + "message": "Hutumiwa na wateja mbalimbali" + }, + "userName": { + "message": "Jina la mtumiaji" + }, + "viewAccount": { + "message": "Angalia Akaunti" + }, + "viewinExplorer": { + "message": "Tazama kwenye Explorer" + }, + "viewContact": { + "message": "Tazama Mawasiliano" + }, + "viewOnCustomBlockExplorer": { + "message": "Tazama kwenye $1" + }, + "viewOnEtherscan": { + "message": "Tazama kwenye Etherscan" + }, + "visitWebSite": { + "message": "Tembelea Tovuti yetu" + }, + "walletSeed": { + "message": "Kianzio cha Waleti" + }, + "welcomeBack": { + "message": "Karibu Tena!" + }, + "welcome": { + "message": "Karibu kwenye MetaMask" + }, + "writePhrase": { + "message": "Andika kirai hiki kwenye karatasi na kihifadhi kwenye sehemu salama. Ikiwa unahitaji usalama zaidi, andika kwenye vipande kadhaa vya karatasi na tunza kila kimoja kwenye maeneo tofauti 2-3. " + }, + "yesLetsTry": { + "message": "Ndiyo, ngoja tujaribu" + }, + "youNeedToAllowCameraAccess": { + "message": "Unapaswa kuruhusu kamera ili utumie kipengele hiki." + }, + "yourSigRequested": { + "message": "Saini yako inaombwa" + }, + "youSign": { + "message": "Unasaini" + }, + "yourPrivateSeedPhrase": { + "message": "Kirai chako kianzio cha binafsi" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "Bei ya gesi sifuri kwenye kuongeza kasi" + } +} diff --git a/app/_locales/ta/messages.json b/app/_locales/ta/messages.json new file mode 100644 index 000000000000..fd849f557b9b --- /dev/null +++ b/app/_locales/ta/messages.json @@ -0,0 +1,574 @@ +{ + "approve": { + "message": "ஒபà¯à®ªà¯à®¤à®²à¯" + }, + "reject": { + "message": "நிராகரி" + }, + "account": { + "message": "கணகà¯à®•à¯" + }, + "accountDetails": { + "message": "கணகà¯à®•௠விவரஙà¯à®•ளà¯" + }, + "accountName": { + "message": "கணகà¯à®•ின௠பெயரà¯" + }, + "addToken": { + "message": "டோகà¯à®•னைச௠சேரà¯" + }, + "addTokens": { + "message": "டோகà¯à®•னà¯à®•ளைச௠சேரà¯" + }, + "amount": { + "message": "தொகை" + }, + "appDescription": { + "message": "எதெரியà¯à®®à¯ பிரௌசர௠நீடà¯à®Ÿà®¿à®ªà¯à®ªà¯", + "description": "பயனà¯à®ªà®¾à®Ÿà¯à®Ÿà®¿à®©à¯ விளகà¯à®•à®®à¯" + }, + "appName": { + "message": "மேடமஸà¯à®•௠", + "description": "பயனà¯à®ªà®¾à®Ÿà¯à®Ÿà®¿à®©à¯ பெயரà¯" + }, + "approved": { + "message": "à®…à®™à¯à®•ீகரிகà¯à®•பà¯à®ªà®Ÿà¯à®Ÿ" + }, + "attemptingConnect": { + "message": "இணைகà¯à®• à®®à¯à®¯à®±à¯à®šà®¿ செயà¯à®• பà¯à®³à®¾à®•à¯à®šà¯ˆà®©à¯" + }, + "attributions": { + "message": "பணà¯à®ªà¯à®•ளà¯à®®à¯" + }, + "back": { + "message": "à®®à¯à®¨à¯à®¤à¯ˆà®¯ பகà¯à®•à®®à¯" + }, + "balance": { + "message": "இரà¯à®ªà¯à®ªà¯:" + }, + "blockiesIdenticon": { + "message": "பà¯à®³à®¾à®•à¯à®•ிஸ௠à®à®Ÿà¯†à®©à¯à®Ÿà®¿à®•ோன௠பயனà¯à®ªà®¾à®Ÿà¯à®Ÿà¯" + }, + "builtInCalifornia": { + "message": "மேடமஸà¯à®•௠வடிவமைகà¯à®•பà¯à®ªà®Ÿà¯à®Ÿà¯ கலிபோரà¯à®©à®¿à®¯à®¾à®µà®¿à®²à¯ கடà¯à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯." + }, + "buyCoinSwitch": { + "message": "நாணயம௠ஸà¯à®µà®¿à®Ÿà¯à®šà®¿à®²à¯ வாஙà¯à®•வà¯à®®à¯" + }, + "buyCoinSwitchExplainer": { + "message": "சிறநà¯à®¤ விகிததà¯à®¤à®¿à®²à¯ 300 கà¯à®•à¯à®®à¯ அதிகமான cryptocurrencies ஠பரிமாறிகà¯à®•ொளà¯à®³ ஒர௠நாணயமாறà¯à®±à¯ இலகà¯à®•௠நாணயம௠ஸà¯à®µà®¿à®Ÿà¯à®šà¯ ஆகà¯à®®à¯." + }, + "ok": { + "message": "சரி" + }, + "cancel": { + "message": "ரதà¯à®¤à¯ செயà¯" + }, + "confirm": { + "message": "உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯" + }, + "confirmed": { + "message": "உறà¯à®¤à®¿" + }, + "confirmPassword": { + "message": "கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®•" + }, + "continueToCoinSwitch": { + "message": "நாணயம௠மாறாமல௠தொடரà¯à®•" + }, + "contractDeployment": { + "message": "ஒபà¯à®ªà®¨à¯à®¤ வரிசைபà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯" + }, + "copiedExclamation": { + "message": "நகலெடà¯à®•à¯à®•பà¯à®ªà®Ÿà¯à®Ÿà®©!" + }, + "copyToClipboard": { + "message": "கிளிபà¯à®ªà¯‡à®¾à®°à¯à®Ÿà¯à®•à¯à®•௠நகலெடà¯" + }, + "copyPrivateKey": { + "message": "இத௠உஙà¯à®•ள௠தனிபà¯à®ªà®Ÿà¯à®Ÿ விசை (நகலெடà¯à®•à¯à®• கிளிக௠செயà¯à®¯à®µà¯à®®à¯)" + }, + "create": { + "message": "உரà¯à®µà®¾à®•à¯à®•à¯" + }, + "createAccount": { + "message": "உஙà¯à®•ள௠கணகà¯à®•ை தà¯à®µà®™à¯à®•à¯à®™à¯à®•ளà¯" + }, + "customGas": { + "message": "எரிவாயà¯à®µà¯ˆà®¤à¯ தனிபà¯à®ªà®¯à®©à®¾à®•à¯à®•à¯à®™à¯à®•ளà¯" + }, + "customToken": { + "message": "தனிபà¯à®ªà®¯à®©à¯ டோகà¯à®•னà¯" + }, + "customRPC": { + "message": "விரà¯à®ªà¯à®ª RPC à®" + }, + "decimalsMustZerotoTen": { + "message": "தசமஙà¯à®•ள௠கà¯à®±à¯ˆà®¨à¯à®¤à®ªà®Ÿà¯à®šà®®à¯ 0, மறà¯à®±à¯à®®à¯ 36 கà¯à®•௠மேல௠இரà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯." + }, + "decimal": { + "message": "தà¯à®²à¯à®²à®¿à®¯à®¤à¯à®¤à®¿à®©à¯ à®®à¯à®Ÿà®¿à®µà¯" + }, + "defaultNetwork": { + "message": "எதிர௠பரிவரà¯à®¤à¯à®¤à®©à¯ˆà®•ளà¯à®•à¯à®•ான à®®à¯à®©à¯à®©à®¿à®°à¯à®ªà¯à®ªà¯ வலையமைபà¯à®ªà¯ à®®à¯à®¤à®©à¯à®®à¯ˆ நிகரமாகà¯à®®à¯." + }, + "deposit": { + "message": "வைபà¯à®ªà¯à®¤à¯à®¤à¯†à®¾à®•ை" + }, + "depositEther": { + "message": "வைபà¯à®ªà¯à®¤à¯à®¤à¯†à®¾à®•ை எதிர௠" + }, + "details": { + "message": "விவரஙà¯à®•ளà¯" + }, + "directDepositEther": { + "message": "நேரடியாக வைபà¯à®ªà¯à®¤à¯à®¤à¯Šà®•ை" + }, + "directDepositEtherExplainer": { + "message": "நீஙà¯à®•ள௠à®à®±à¯à®•னவே à®à®¤à¯†à®°à¯ இரà¯à®¨à¯à®¤à®¾à®²à¯, நேரடி வைபà¯à®ªà¯ மூலம௠உஙà¯à®•ள௠பà¯à®¤à®¿à®¯ பணபà¯à®ªà¯ˆà®¯à®¿à®²à¯ ஈதà¯à®¤à®°à¯ பெற விரைவான வழி." + }, + "done": { + "message": "à®®à¯à®Ÿà®¿à®¨à¯à®¤à®¤à¯" + }, + "downloadStateLogs": { + "message": "மாநில பதிவà¯à®•ள௠பதிவிறகà¯à®•" + }, + "dropped": { + "message": "நீகà¯à®•பà¯à®ªà®Ÿà¯à®Ÿà®¾à®°à¯" + }, + "edit": { + "message": "திரà¯à®¤à¯à®¤à¯" + }, + "enterPassword": { + "message": "கடவà¯à®šà¯à®šà¯†à®¾à®²à¯à®²à¯ˆ உளà¯à®³à®¿à®Ÿà®µà¯à®®à¯" + }, + "passwordNotLongEnough": { + "message": "கடவà¯à®šà¯à®šà¯Šà®²à¯ போதாதà¯" + }, + "passwordsDontMatch": { + "message": "கடவà¯à®šà¯à®šà¯Šà®±à¯à®•ள௠பொரà¯à®¨à¯à®¤à®¾à®¤à¯‡" + }, + "etherscanView": { + "message": "Etherscan கணகà¯à®•ைப௠பாரà¯à®•à¯à®•வà¯à®®à¯" + }, + "exportPrivateKey": { + "message": "தனியார௠விசை à® à®à®±à¯à®±à¯à®®à®¤à®¿ செயà¯à®•" + }, + "failed": { + "message": "தோலà¯à®µà®¿" + }, + "fiat": { + "message": "FIAT", + "description": "பரிமாறà¯à®± வகை" + }, + "fileImportFail": { + "message": "கோபà¯à®ªà¯ இறகà¯à®•à¯à®®à®¤à®¿ வேலை செயà¯à®¯à®µà®¿à®²à¯à®²à¯ˆà®¯à®¾? இஙà¯à®•ே கிளிக௠செயà¯à®¯à®µà¯à®®à¯!", + "description": "JSON கோபà¯à®ªà®¿à®²à¯ பயனர௠கணகà¯à®•ை தஙà¯à®•ள௠கணகà¯à®•ை இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®¯ உதவà¯à®•ிறதà¯" + }, + "from": { + "message": "இரà¯à®¨à¯à®¤à¯" + }, + "gasLimit": { + "message": "எரிவாய௠வரமà¯à®ªà¯" + }, + "gasLimitTooLow": { + "message": "எரிவாய௠வரமà¯à®ªà¯ கà¯à®±à¯ˆà®¨à¯à®¤à®¤à¯ 21000 ஆக இரà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯" + }, + "gasPrice": { + "message": "எரிவாய௠விலை (GWEI)" + }, + "getEther": { + "message": "ஈதà¯à®¤à®°à¯ கிடைகà¯à®•à¯à®®à¯" + }, + "getEtherFromFaucet": { + "message": "$ 1 கà¯à®•௠ஒர௠கà¯à®´à®¾à®¯à¯ இரà¯à®¨à¯à®¤à¯ ஈதர௠கிடைகà¯à®•à¯à®®à¯$1", + "description": "ஈதà¯à®¤à®°à¯ கà¯à®´à®¾à®¯à¯ à®à®¨à¯à®¤à¯ பிணைய பெயர௠காடà¯à®Ÿà¯à®•ிறதà¯" + }, + "here": { + "message": "இஙà¯à®•ே", + "description": "இஙà¯à®•ே-கிளிக௠செயà¯à®¯à®µà¯à®®à¯- மேலà¯à®®à¯ தகவலà¯à®•à¯à®•௠(troubleTokenBalances செலà¯à®•ிறதà¯)" + }, + "hide": { + "message": "மறை" + }, + "hideTokenPrompt": { + "message": "டோகà¯à®•னை மறை?" + }, + "import": { + "message": "இறகà¯à®•à¯à®®à®¤à®¿ செயà¯", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "கணகà¯à®•ை இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®•" + }, + "importAccountMsg": { + "message": " இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ கணகà¯à®•௠உஙà¯à®•ள௠மà¯à®¤à®²à®¿à®²à¯ உரà¯à®µà®¾à®•à¯à®•பà¯à®ªà®Ÿà¯à®Ÿ மெடà¯à®Ÿà®¾à®®à®¾à®¸à¯à®•௠கணகà¯à®•௠விதை மூலம௠தொடரà¯à®ªà¯à®Ÿà¯ˆà®¯à®¤à®¾à®• இரà¯à®•à¯à®•ாதà¯. இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ கணகà¯à®•à¯à®•ள௠பறà¯à®±à®¿ மேலà¯à®®à¯ அறிக " + }, + "imported": { + "message": "இறகà¯à®•à¯à®®à®¤à®¿à®¯à®¾à®©à®¤à¯", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "infoHelp": { + "message": "தகவல௠மறà¯à®±à¯à®®à¯ உதவி" + }, + "insufficientFunds": { + "message": "போதà¯à®®à®¾à®© பணம௠இலà¯à®²à¯ˆ." + }, + "insufficientTokens": { + "message": "போதà¯à®®à®¾à®© டோகà¯à®•னà¯à®•ளà¯." + }, + "invalidAddress": { + "message": "தவறான à®®à¯à®•வரி" + }, + "invalidAddressRecipient": { + "message": "பெறà¯à®¨à®°à¯ à®®à¯à®•வரி தவறானதà¯" + }, + "invalidInput": { + "message": "தவறான உளà¯à®³à¯€à®Ÿà¯.." + }, + "invalidRPC": { + "message": "தவறான RPC URI" + }, + "invalidBlockExplorerURL": { + "message": "தவறான Block Explorer URI" + }, + "jsonFile": { + "message": "JSON கோபà¯à®ªà¯", + "description": "ஒர௠கணகà¯à®•ை இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®¯ வடிவமைகà¯à®•பà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯" + }, + "kovan": { + "message": "கோவன௠டெஸà¯à®Ÿà¯ நெடà¯à®µà¯Šà®°à¯à®•à¯" + }, + "max": { + "message": "மேகà¯à®¸à¯" + }, + "learnMore": { + "message": "மேலà¯à®®à¯ அறிக" + }, + "likeToAddTokens": { + "message": "இநà¯à®¤ டோகà¯à®•னà¯à®•ளைச௠சேரà¯à®•à¯à®• விரà¯à®®à¯à®ªà¯à®•ிறீரà¯à®•ளா?" + }, + "links": { + "message": "இணைபà¯à®ªà¯à®•ளà¯" + }, + "loading": { + "message": "à®à®±à¯à®±à¯à®•ிறதà¯â€¦" + }, + "loadingTokens": { + "message": "டோகà¯à®•னà¯à®•ளை à®à®±à¯à®±à¯à®•ிறத௠..." + }, + "localhost": { + "message": "லோகà¯à®•ல௠ஹோஸà¯à®Ÿà¯ 8545" + }, + "lock": { + "message": "வெளியேறà¯" + }, + "mainnet": { + "message": "à®®à¯à®¤à®©à¯à®®à¯ˆ எதெரியà¯à®®à¯ நெடà¯à®µà¯Šà®°à¯à®•à¯" + }, + "message": { + "message": "செயà¯à®¤à®¿" + }, + "metamaskDescription": { + "message": "மேடமஸà¯à®•௠எனà¯à®ªà®¤à¯ ஒர௠பாதà¯à®•ாபà¯à®ªà®¾à®© அடையாள வாலà¯à®Ÿà¯ எதெரியà¯à®®à¯" + }, + "myAccounts": { + "message": "எனத௠கணகà¯à®•à¯à®•ளà¯" + }, + "mustSelectOne": { + "message": "கà¯à®±à¯ˆà®¨à¯à®¤à®¤à¯ 1 டோகà¯à®•னை தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯." + }, + "needEtherInWallet": { + "message": "மேடமஸà¯à®•௠஠பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿ பரவலாகà¯à®•பà¯à®ªà®Ÿà¯à®Ÿ பயனà¯à®ªà®¾à®Ÿà¯à®•ளà¯à®Ÿà®©à¯ தொடரà¯à®ªà¯ கொளà¯à®³, உஙà¯à®•ள௠பணபà¯à®ªà®°à®¿à®®à®¾à®±à¯à®±à®¤à¯à®¤à®¿à®²à¯ ஈதர௠தேவை." + }, + "needImportFile": { + "message": "இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®¯ ஒர௠கோபà¯à®ªà¯ˆ நீஙà¯à®•ள௠தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯.", + "description": "பயனர௠ஒர௠கணகà¯à®•௠மà¯à®•à¯à®•ியம௠மறà¯à®±à¯à®®à¯ தொடர ஒர௠கோபà¯à®ªà¯ சேரà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯" + }, + "negativeETH": { + "message": "ETH எதிரà¯à®®à®±à¯ˆ அளவà¯à®•ளை அனà¯à®ªà¯à®ª à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯." + }, + "networks": { + "message": "நெடà¯à®µà¯†à®¾à®°à¯à®•à¯à®¸à¯" + }, + "newAccount": { + "message": "பà¯à®¤à®¿à®¯ கணகà¯à®•à¯" + }, + "newAccountNumberName": { + "message": "கணகà¯à®•௠$ 1", + "description": "கணகà¯à®•௠கணகà¯à®•ை உரà¯à®µà®¾à®•à¯à®•à¯à®µà®¤à®±à¯à®•௠அடà¯à®¤à¯à®¤ கணகà¯à®•ின௠இயலà¯à®ªà¯à®¨à®¿à®²à¯ˆ பெயர௠உரà¯à®µà®¾à®•à¯à®•பà¯à®ªà®Ÿà¯à®®à¯" + }, + "newContract": { + "message": "பà¯à®¤à®¿à®¯ ஒபà¯à®ªà®¨à¯à®¤à®®à¯" + }, + "newPassword": { + "message": "பà¯à®¤à®¿à®¯ கடவà¯à®šà¯à®šà¯Šà®²à¯ (min 8 எழà¯à®¤à¯à®¤à¯à®•ளà¯)" + }, + "next": { + "message": "அடà¯à®¤à¯à®¤à®¤à¯" + }, + "noAddressForName": { + "message": "இநà¯à®¤ பெயரà¯à®•à¯à®•ான à®®à¯à®•வரி அமைகà¯à®•பà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ." + }, + "noTransactions": { + "message": "பரிவரà¯à®¤à¯à®¤à®©à¯ˆà®•ள௠இலà¯à®²à¯ˆ" + }, + "pastePrivateKey": { + "message": "இஙà¯à®•ே உஙà¯à®•ள௠தனிபà¯à®ªà®Ÿà¯à®Ÿ விசை சரதà¯à®¤à¯ˆ ஒடà¯à®Ÿà¯à®•:", + "description": "ஒர௠தனிபà¯à®ªà®Ÿà¯à®Ÿ விசை ஒர௠கணகà¯à®•ை இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®¯" + }, + "personalAddressDetected": { + "message": "தனிபà¯à®ªà®Ÿà¯à®Ÿ à®®à¯à®•வரி கணà¯à®Ÿà®±à®¿à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯. டோகà¯à®•ன௠ஒபà¯à®ªà®¨à¯à®¤ à®®à¯à®•வரியை உளà¯à®³à®¿à®Ÿà®µà¯à®®à¯." + }, + "privacyMsg": { + "message": "தனியà¯à®°à®¿à®®à¯ˆ கொளà¯à®•ை" + }, + "privateKey": { + "message": "தனிபà¯à®ªà®Ÿà¯à®Ÿ விசை", + "description": "ஒர௠கணகà¯à®•ை இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤ இநà¯à®¤ வகை கோபà¯à®ªà¯ˆ தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯à®•à¯à®•வà¯à®®à¯" + }, + "privateKeyWarning": { + "message": "எசà¯à®šà®°à®¿à®•à¯à®•ை: இநà¯à®¤ விசையை எபà¯à®ªà¯‹à®¤à¯à®®à¯ வெளியிட வேணà¯à®Ÿà®¾à®®à¯. உஙà¯à®•ள௠தனிபà¯à®ªà®Ÿà¯à®Ÿ விசைகளைக௠கொணà¯à®Ÿ எவரà¯à®®à¯ உஙà¯à®•ள௠கணகà¯à®•ில௠உளà¯à®³ எநà¯à®¤ சொதà¯à®¤à¯à®•à¯à®•ளையà¯à®®à¯ திரà¯à®Ÿà®²à®¾à®®à¯." + }, + "privateNetwork": { + "message": "தனியார௠நெடà¯à®µà¯Šà®°à¯à®•à¯" + }, + "readdToken": { + "message": "உஙà¯à®•ள௠கணகà¯à®•௠விரà¯à®ªà¯à®ªà®™à¯à®•ள௠மெனà¯à®µà®¿à®²à¯ \"டோகà¯à®•னைச௠சேரà¯\" எனà¯à®ªà®¤à®©à¯ மூலம௠நீஙà¯à®•ள௠எதிரà¯à®•ாலதà¯à®¤à®¿à®²à¯ இநà¯à®¤ டோகà¯à®•னை மீணà¯à®Ÿà¯à®®à¯ சேரà¯à®•à¯à®•லாமà¯." + }, + "recipientAddress": { + "message": "பெறà¯à®¨à®°à¯ à®®à¯à®•வரி" + }, + "rejected": { + "message": "நிராகரிகà¯à®•பà¯à®ªà®Ÿà¯à®Ÿà®¤à¯" + }, + "resetAccount": { + "message": "கணகà¯à®•ை மீடà¯à®Ÿà®®à¯ˆ" + }, + "restoreFromSeed": { + "message": "விதை வாகà¯à®•ியதà¯à®¤à®¿à®²à®¿à®°à¯à®¨à¯à®¤à¯ மீடà¯à®•வà¯à®®à¯" + }, + "required": { + "message": "தேவையான" + }, + "walletSeed": { + "message": "வாலà¯à®Ÿà¯ விதை" + }, + "revealSeedWords": { + "message": "விதை வாரà¯à®¤à¯à®¤à¯ˆà®•ள௠வெளிபà¯à®ªà®Ÿà¯à®¤à¯à®¤" + }, + "revealSeedWordsWarning": { + "message": "உஙà¯à®•ள௠விதை வாரà¯à®¤à¯à®¤à¯ˆà®•ள௠ஒர௠பொத௠இடதà¯à®¤à®¿à®²à¯ மீடà¯à®• வேணà¯à®Ÿà®¾à®®à¯! உஙà¯à®•ள௠எலà¯à®²à®¾ கணகà¯à®•à¯à®•ளையà¯à®®à¯ திரà¯à®Ÿ இநà¯à®¤ வாரà¯à®¤à¯à®¤à¯ˆà®•ள௠பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà®²à®¾à®®à¯." + }, + "rinkeby": { + "message": "ரிஙà¯à®•ெபà¯à®¯ டெஸà¯à®Ÿà¯ நெடà¯à®µà¯Šà®°à¯à®•à¯" + }, + "ropsten": { + "message": "ரொபà¯à®¸à¯à®Ÿà¯†à®©à¯ டெஸà¯à®Ÿà¯ நெடà¯à®µà¯Šà®°à¯à®•à¯" + }, + "connectingToMainnet": { + "message": "à®®à¯à®•à¯à®•ிய எதெரியà¯à®®à¯ நெடà¯à®µà¯Šà®°à¯à®•௠இணைகà¯à®•à¯à®®à¯" + }, + "connectingToRopsten": { + "message": "ரொபà¯à®¸à¯à®Ÿà¯†à®©à¯ டெஸà¯à®Ÿà¯ நெடà¯à®µà¯Šà®°à¯à®•à¯à®•à¯à®Ÿà®©à¯ இணைகà¯à®•ிறதà¯" + }, + "connectingToKovan": { + "message": "கோவன௠டெஸà¯à®Ÿà¯ நெடà¯à®µà¯Šà®°à¯à®•à¯à®•à¯à®Ÿà®©à¯ இணைதà¯à®¤à®²à¯" + }, + "connectingToRinkeby": { + "message": "ரிஙà¯à®•ெபà¯à®¯ டெஸà¯à®Ÿà¯ நெடà¯à®µà¯Šà®°à¯à®•à¯à®•à¯à®Ÿà®©à¯ இணைகà¯à®•ிறதà¯" + }, + "save": { + "message": "சேமி" + }, + "search": { + "message": "தேடலà¯" + }, + "secretPhrase": { + "message": "உஙà¯à®•ள௠பெடà¯à®Ÿà®•தà¯à®¤à¯ˆ மீடà¯à®Ÿà¯†à®Ÿà¯à®ªà¯à®ªà®¤à®±à¯à®•ாக இஙà¯à®•ே உஙà¯à®•ள௠ரகசிய பனà¯à®©à®¿à®°à®£à¯à®Ÿà¯ வாரà¯à®¤à¯à®¤à¯ˆ சொறà¯à®±à¯Šà®Ÿà®°à¯ˆ உளà¯à®³à®¿à®Ÿà®µà¯à®®à¯." + }, + "seedPhraseReq": { + "message": "விதை வாகà¯à®•ியஙà¯à®•ள௠12 வாரà¯à®¤à¯à®¤à¯ˆà®•ள௠நீணà¯à®Ÿà®µà¯ˆ" + }, + "selectCurrency": { + "message": "நாணயதà¯à®¤à¯ˆà®¤à¯ தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯" + }, + "selectType": { + "message": "வகை தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯" + }, + "send": { + "message": "அனà¯à®ªà¯à®ªà¯" + }, + "sendETH": { + "message": "ETH ஠அனà¯à®ªà¯à®ªà¯" + }, + "sendTokens": { + "message": "டோகà¯à®•னà¯à®•ளை அனà¯à®ªà¯à®ªà®µà¯à®®à¯" + }, + "searchTokens": { + "message": "தேடல௠டோகà¯à®•னà¯à®¸à¯" + }, + "settings": { + "message": "அமைபà¯à®ªà¯à®•ளà¯" + }, + "showPrivateKeys": { + "message": "தனிபà¯à®ªà®Ÿà¯à®Ÿ விசைகளைக௠காணà¯à®ªà®¿" + }, + "sign": { + "message": "உளà¯à®¨à¯à®´à¯ˆ" + }, + "signed": { + "message": "கையொபà¯à®ªà®®à®¿à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿ" + }, + "signNotice": { + "message": "இநà¯à®¤ செயà¯à®¤à®¿à®¯à®¿à®²à¯ கையொபà¯à®ªà®®à®¿à®Ÿà®²à®¾à®®à¯ \nஆபதà¯à®¤à®¾à®© பகà¯à®• விளைவà¯à®•ள௠இரà¯à®•à¯à®•லாமà¯. \n உஙà¯à®•ள௠மொதà¯à®¤ கணகà¯à®•ில௠மà¯à®´à¯à®®à¯ˆà®¯à®¾à®• நமà¯à®ªà®•à¯à®•ூடிய தளஙà¯à®•ளில௠செயà¯à®¤à®¿à®•ளை மடà¯à®Ÿà¯à®®à¯‡ கையொபà¯à®ªà®®à®¿à®Ÿà¯à®™à¯à®•ளà¯. \n இநà¯à®¤ ஆபதà¯à®¤à®¾à®© à®®à¯à®±à¯ˆ எதிரà¯à®•ால பதிபà¯à®ªà®¿à®²à¯ அகறà¯à®±à®ªà¯à®ªà®Ÿà¯à®®à¯." + }, + "sigRequest": { + "message": "கையொபà¯à®ªà®®à¯ கோரிகà¯à®•ை" + }, + "stateLogs": { + "message": "மாநில பதிவà¯à®•ளà¯" + }, + "stateLogsDescription": { + "message": "மாநில பதிவà¯à®•ள௠உஙà¯à®•ள௠பொத௠கணகà¯à®•௠மà¯à®•வரிகள௠மறà¯à®±à¯à®®à¯ பரிமாறà¯à®±à®™à¯à®•ளை அனà¯à®ªà¯à®ªà®¿à®¯à¯à®³à¯à®³à®©." + }, + "stateLogError": { + "message": "மாநில பதிவà¯à®•ளை மீடà¯à®Ÿà¯†à®Ÿà¯à®ªà¯à®ªà®¤à®¿à®²à¯ பிழை." + }, + "submitted": { + "message": "சமரà¯à®ªà¯à®ªà®¿à®•à¯à®•பà¯à®ªà®Ÿà¯à®Ÿà®¤à¯" + }, + "supportCenter": { + "message": "எஙà¯à®•ள௠ஆதரவ௠மையதà¯à®¤à¯ˆà®ªà¯ பாரà¯à®µà¯ˆà®¯à®¿à®Ÿà®µà¯à®®à¯" + }, + "symbolBetweenZeroTwelve": { + "message": "கசினà¯à®©à®®à¯ 11 எழà¯à®¤à¯à®¤à¯à®•à¯à®•ள௠அலà¯à®²à®¤à¯ கà¯à®±à¯ˆà®µà®¾à®• இரà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯." + }, + "terms": { + "message": "பயனà¯à®ªà®¾à®Ÿà¯à®Ÿà¯ விதிமà¯à®±à¯ˆà®•ளை" + }, + "testFaucet": { + "message": "சோதனை கà¯à®´à®¾à®¯à¯" + }, + "to": { + "message": "பெறà¯à®¨à®°à¯" + }, + "tokenAlreadyAdded": { + "message": "டோகà¯à®•ன௠à®à®±à¯à®•னவே சேரà¯à®•à¯à®•பà¯à®ªà®Ÿà¯à®Ÿà®¤à¯." + }, + "tokenSymbol": { + "message": "டோகà¯à®•ன௠சினà¯à®©à®®à¯" + }, + "total": { + "message": "மொதà¯à®¤" + }, + "transactionError": { + "message": "பரிவரà¯à®¤à¯à®¤à®©à¯ˆ பிழை. விதிமà¯à®±à¯ˆ ஒபà¯à®ªà®¨à¯à®¤à®¤à¯à®¤à®¿à®²à¯ விதிவிலகà¯à®•à¯." + }, + "troubleTokenBalances": { + "message": "உஙà¯à®•ள௠டோகà¯à®•ன௠நிலà¯à®µà¯ˆà®•ளை à®à®±à¯à®±à¯à®µà®¤à®¿à®²à¯ சிகà¯à®•ல௠à®à®±à¯à®ªà®Ÿà¯à®Ÿà®¤à¯. நீஙà¯à®•ள௠அவரà¯à®•ளை பாரà¯à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à¯à®®à¯.", + "description": "டோகà¯à®•ன௠நிலà¯à®µà¯ˆà®•ளை காண ஒர௠இணைபà¯à®ªà¯ (இஙà¯à®•ே) தொடரà¯à®¨à¯à®¤à¯" + }, + "typePassword": { + "message": "உஙà¯à®•ள௠கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ தடà¯à®Ÿà®šà¯à®šà¯ செயà¯à®¯à®µà¯à®®à¯" + }, + "unapproved": { + "message": "à®…à®™à¯à®•ீகரிகà¯à®•பà¯à®ªà®Ÿà®¾à®¤" + }, + "unknown": { + "message": "தெரியவிலà¯à®²à¯ˆ" + }, + "unknownNetwork": { + "message": "அறியபà¯à®ªà®Ÿà®¾à®¤ தனியார௠நெடà¯à®µà¯Šà®°à¯à®•à¯" + }, + "urlErrorMsg": { + "message": "URI கள௠சரியான HTTP / HTTPS à®®à¯à®©à¯à®©à¯Šà®Ÿà¯à®Ÿà¯ தேவை." + }, + "usedByClients": { + "message": "பலà¯à®µà¯‡à®±à¯ வாடிகà¯à®•ையாளரà¯à®•ள௠பலà¯à®µà¯‡à®±à¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿à®¯" + }, + "viewAccount": { + "message": "கணகà¯à®•ைப௠பாரà¯" + }, + "visitWebSite": { + "message": "எஙà¯à®•ள௠வலைதà¯à®¤à®³à®¤à¯à®¤à¯ˆà®ªà¯ பாரà¯à®µà¯ˆà®¯à®¿à®Ÿà®µà¯à®®à¯" + }, + "welcome": { + "message": "மெடà¯à®Ÿà®¾à®®à®¾à®¸à¯à®•௠பீடà¯à®Ÿà®¾à®µà¯à®•à¯à®•௠வரà¯à®•" + }, + "yourSigRequested": { + "message": "உஙà¯à®•ள௠கையொபà¯à®ªà®®à¯ கோரபà¯à®ªà®Ÿà¯à®•ிறதà¯" + }, + "youSign": { + "message": "நீஙà¯à®•ள௠கையெழà¯à®¤à¯à®¤à®¿à®Ÿà¯à®•ிறீரà¯à®•ளà¯" + }, + "about": { + "message": "அறிமà¯à®•à®®à¯" + }, + "advanced": { + "message": "மேமà¯à®ªà®Ÿà¯à®Ÿà®µà¯ˆ" + }, + "basic": { + "message": "அடிபà¯à®ªà®Ÿà¯ˆ" + }, + "off": { + "message": "ஆஃபà¯" + }, + "on": { + "message": "இயகà¯à®•à¯" + }, + "close": { + "message": "மூடà¯" + }, + "connect": { + "message": "இணை" + }, + "delete": { + "message": "நீகà¯à®•à¯" + }, + "fast": { + "message": "வேகமான" + }, + "forgetDevice": { + "message": "இநà¯à®¤à®šà¯ சாதனதà¯à®¤à¯ˆ அகறà¯à®±à¯" + }, + "getStarted": { + "message": "தொடஙà¯à®•à¯à®•" + }, + "history": { + "message": "வரலாறà¯" + }, + "origin": { + "message": "அசலà¯" + }, + "password": { + "message": "கடவà¯à®šà¯à®šà¯Šà®²à¯" + }, + "queue": { + "message": "வரிசை" + }, + "reset": { + "message": "மீடà¯à®Ÿà®®à¯ˆ" + }, + "restore": { + "message": "மீடà¯à®Ÿà®®à¯ˆ" + }, + "remove": { + "message": "அகறà¯à®±à¯" + }, + "removeAccount": { + "message": "கணகà¯à®•ை அகறà¯à®±à¯à®•" + }, + "slow": { + "message": "மெதà¯à®µà®¾à®©" + }, + "tryAgain": { + "message": "மீணà¯à®Ÿà¯à®®à¯ à®®à¯à®¯à®²à¯à®•" + }, + "unlock": { + "message": "பூடà¯à®Ÿà¯ˆà®¤à¯ திற" + }, + "userName": { + "message": "பயனரà¯à®ªà¯†à®¯à®°à¯" + } +} diff --git a/app/_locales/te/messages.json b/app/_locales/te/messages.json new file mode 100644 index 000000000000..2df11217d5a7 --- /dev/null +++ b/app/_locales/te/messages.json @@ -0,0 +1,143 @@ +{ + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "reject": { + "message": "తిరసà±à°•à°°à°¿à°‚à°šà±" + }, + "about": { + "message": "à°—à±à°°à°¿à°‚à°šà°¿" + }, + "account": { + "message": "ఖాతా" + }, + "advanced": { + "message": "ఆధà±à°¨à°¿à°•" + }, + "back": { + "message": "వెనà±à°•à°•à±" + }, + "basic": { + "message": "à°ªà±à°°à°¾à°¥à°®à°¿à°•à°‚" + }, + "off": { + "message": "ఆఫౠఅయà±à°¯à°¿à°‚ది" + }, + "ok": { + "message": "సరే" + }, + "on": { + "message": "ఆనౠచేయి" + }, + "cancel": { + "message": "à°°à°¦à±à°¦à± చెయà±à°¯à°¿" + }, + "close": { + "message": "మూసివేయి" + }, + "confirm": { + "message": "నిరà±à°§à°¾à°°à°¿à°‚à°šà±" + }, + "connect": { + "message": "కనెకà±à°Ÿà± చేయండి" + }, + "copyToClipboard": { + "message": "à°•à±à°²à°¿à°ªà±â€Œà°¬à±‹à°°à±à°¡à±â€Œà°•ౠకాపీ చేయి" + }, + "create": { + "message": "సృషà±à°Ÿà°¿à°‚à°šà±" + }, + "delete": { + "message": "తొలగించà±" + }, + "details": { + "message": "వివరాలà±" + }, + "done": { + "message": "పూరà±à°¤à°¯à°¿à°‚ది" + }, + "edit": { + "message": "సవరించà±" + }, + "fast": { + "message": "వేగంగా" + }, + "forgetDevice": { + "message": "à°ˆ పరికరానà±à°¨à°¿ విసà±à°®à°°à°¿à°‚à°šà±" + }, + "getStarted": { + "message": "à°ªà±à°°à°¾à°°à°‚à°­à°¿à°‚à°šà°‚à°¡à°¿" + }, + "hide": { + "message": "దాచిపెటà±à°Ÿà±" + }, + "history": { + "message": "à°šà°°à°¿à°¤à±à°°" + }, + "import": { + "message": "దిగà±à°®à°¤à°¿ చెయà±à°¯à°¿", + "description": "Button to import an account from a selected file" + }, + "imported": { + "message": "దిగà±à°®à°¤à°¿ à°…à°¯à±à°¯à°¿à°‚ది", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "loading": { + "message": "లోడౠఅవà±à°¤à±‹à°‚ది..." + }, + "next": { + "message": "తదà±à°ªà°°à°¿" + }, + "origin": { + "message": "మూలం" + }, + "password": { + "message": "పాసà±â€Œà°µà°°à±à°¡à±" + }, + "queue": { + "message": "à°•à±à°°à°® వరà±à°¸" + }, + "reset": { + "message": "రీసెటౠచేయి" + }, + "restore": { + "message": "à°ªà±à°¨à°°à±à°¦à±à°§à°°à°¿à°‚à°šà±" + }, + "remove": { + "message": "తీసివేయి" + }, + "removeAccount": { + "message": "ఖాతానౠతీసివేయి" + }, + "save": { + "message": "సేవౠచేయి" + }, + "slow": { + "message": "నెమà±à°®à°¦à°¿à°—à°¾" + }, + "search": { + "message": "శోధించà±" + }, + "send": { + "message": "పంపà±" + }, + "settings": { + "message": "సెటà±à°Ÿà°¿à°‚à°—à±â€Œà°²à±" + }, + "tryAgain": { + "message": "మళà±à°²à±€ à°ªà±à°°à°¯à°¤à±à°¨à°¿à°‚à°šà±" + }, + "unknown": { + "message": "తెలియదà±" + }, + "unlock": { + "message": "à°…à°¨à±â€Œà°²à°¾à°•ౠచెయà±à°¯à°¿" + }, + "userName": { + "message": "యూజరà±â€Œà°ªà±‡à°°à±" + }, + "viewAccount": { + "message": "ఖాతానౠవీకà±à°·à°¿à°‚à°šà°‚à°¡à°¿" + } +} diff --git a/app/_locales/th/messages.json b/app/_locales/th/messages.json index a49cf31ad604..eacf2f961e50 100644 --- a/app/_locales/th/messages.json +++ b/app/_locales/th/messages.json @@ -1,51 +1,9 @@ { - "privacyMode": { - "message": "โหมดความเป็นส่วนตัว" - }, - "privacyModeDescription": { - "message": "เว็บไซต์ต้องขอเข้าถึงเพื่อดูข้อมูลบัà¸à¸Šà¸µà¸‚องคุณ" - }, - "exposeAccounts": { - "message": "เปิดเผยบัà¸à¸Šà¸µ" - }, - "exposeDescription": { - "message": "เปิดเผยบัà¸à¸Šà¸µà¹„ปยังเว็บไซต์ปัจจุบัน มีประโยชน์สำหรับ dapps à¹à¸šà¸šà¹€à¸”ิม" - }, - "confirmExpose": { - "message": "คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸«à¸£à¸·à¸­à¹„ม่ว่าต้องà¸à¸²à¸£à¹€à¸›à¸´à¸”เผยบัà¸à¸Šà¸µà¸‚องคุณไปยังเว็บไซต์ปัจจุบัน" - }, - "confirmClear": { - "message": "คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸«à¸£à¸·à¸­à¹„ม่ว่าต้องà¸à¸²à¸£à¸¥à¹‰à¸²à¸‡à¹€à¸§à¹‡à¸šà¹„ซต์ที่ผ่านà¸à¸²à¸£à¸­à¸™à¸¸à¸¡à¸±à¸•ิ" - }, - "clearApprovalDataSuccess": { - "message": "อนุมัติข้อมูลเว็บไซต์ที่ได้รับอนุมัติà¹à¸¥à¹‰à¸§" - }, - "approvalData": { - "message": "ข้อมูลà¸à¸²à¸£à¸­à¸™à¸¸à¸¡à¸±à¸•ิ" - }, - "approvalDataDescription": { - "message": "ล้างข้อมูลเว็บไซต์ที่ได้รับà¸à¸²à¸£à¸­à¸™à¸¸à¸¡à¸±à¸•ิเพื่อให้ทุà¸à¹„ซต์ต้องขออนุมัติอีà¸à¸„รั้ง" - }, - "clearApprovalData": { - "message": "ล้างข้อมูลà¸à¸²à¸£à¸­à¸™à¸¸à¸¡à¸±à¸•ิ" - }, - "approve": { - "message": "อนุมัติ" - }, "reject": { "message": "ปà¸à¸´à¹€à¸ªà¸˜" }, - "providerAPIRequest": { - "message": "คำขอ Web3 API" - }, - "reviewProviderRequest": { - "message": "โปรดอ่านคำขอ Ethereum API นี้" - }, - "providerRequestInfo": { - "message": "โดเมนที่à¹à¸ªà¸”งด้านล่างà¸à¸³à¸¥à¸±à¸‡à¸žà¸¢à¸²à¸¢à¸²à¸¡à¸‚อเข้าถึง API ของ Ethereum เพื่อให้สามารถโต้ตอบà¸à¸±à¸šà¸šà¸¥à¹‡à¸­à¸„ Ethereum ได้ ตรวจสอบว่าคุณอยู่ในไซต์ที่ถูà¸à¸•้องà¸à¹ˆà¸­à¸™à¸—ี่จะอนุมัติà¸à¸²à¸£à¹€à¸‚้าถึง Ethereum เสมอ" - }, - "accept": { - "message": "ยอมรับ" + "about": { + "message": "เà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸š" }, "account": { "message": "บัà¸à¸Šà¸µ" @@ -56,12 +14,6 @@ "accountName": { "message": "ชื่อบัà¸à¸Šà¸µ" }, - "address": { - "message": "à¹à¸­à¸”เดรส" - }, - "addCustomToken": { - "message": "เพิ่มโทเค็นด้วยตัวเอง" - }, "addToken": { "message": "เพิ่มโทเค็น" }, @@ -71,9 +23,6 @@ "amount": { "message": "จำนวน" }, - "amountPlusGas": { - "message": "จำนวน + à¹à¸à¹Šà¸ª" - }, "appDescription": { "message": "ส่วนขยายเบราว์เซอร์สำหรับอีเธอเรียม", "description": "The description of the application" @@ -82,84 +31,71 @@ "message": "MetaMask", "description": "The name of the application" }, + "approve": { + "message": "อนุมัติ" + }, "attemptingConnect": { "message": "à¸à¸³à¸¥à¸±à¸‡à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อà¸à¸±à¸šà¸šà¸¥à¹‡à¸­à¸à¹€à¸Šà¸™" }, "attributions": { "message": "อ้างถึง" }, - "available": { - "message": "ว่าง" - }, "back": { "message": "à¸à¸¥à¸±à¸š" }, + "backupApprovalNotice": { + "message": "à¹à¸šà¹‡à¸„อัพโค้ดà¸à¸¹à¹‰à¸„ืนลับของคุณเพื่อรัà¸à¸©à¸² Wallet à¹à¸¥à¸°à¹€à¸‡à¸´à¸™à¹ƒà¸«à¹‰à¸›à¸¥à¸­à¸”ภัย" + }, "balance": { "message": "ยอดคงเหลือ:" }, - "balances": { - "message": "ยอดคงเหลือของคุณ" - }, - "balanceIsInsufficientGas": { - "message": "ยอดคงเหลือไม่พอสำหรับจ่ายค่าà¹à¸à¹Šà¸ªà¸—ั้งหมด" - }, - "beta": { - "message": "เบต้า" - }, - "betweenMinAndMax": { - "message": "ต้องมาà¸à¸à¸§à¹ˆà¸²à¸«à¸£à¸·à¸­à¹€à¸—่าà¸à¸±à¸š $1 à¹à¸¥à¸°à¸™à¹‰à¸­à¸¢à¸à¸§à¹ˆà¸²à¸«à¸£à¸·à¸­à¹€à¸—่าà¸à¸±à¸š $2", - "description": "helper for inputting hex as decimal input" - }, "blockiesIdenticon": { "message": "ใช้งาน Blockies Identicon" }, - "borrowDharma": { - "message": "ยืมด้วย Dharma (เบต้า)" - }, "builtInCalifornia": { "message": "MetaMask ออà¸à¹à¸šà¸šà¹à¸¥à¸°à¸žà¸±à¸’นาที่à¹à¸„ลิฟอร์เนีย" }, - "buy": { - "message": "ซื้อ" - }, - "buyCoinbase": { - "message": "ซื้อด้วย Coinbase" - }, - "buyCoinbaseExplainer": { - "message": "Coinbase เป็นà¹à¸«à¸¥à¹ˆà¸‡à¸‹à¸·à¹‰à¸­à¸‚ายบิตคอยน์ไลท์คอยน์à¹à¸¥à¸°à¸­à¸µà¹€à¸˜à¸­à¹€à¸£à¸µà¸¢à¸¡à¸—ี่ได้รับความนิยมสูงสุดในโลà¸" - }, "buyCoinSwitch": { "message": "ซื้อด้วย CoinSwitch" }, "buyCoinSwitchExplainer": { "message": "CoinSwitch เป็นจุดหมายปลายทางà¹à¸šà¸šà¸„รบวงจรในà¸à¸²à¸£à¹à¸¥à¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸ªà¸à¸¸à¸¥à¹€à¸‡à¸´à¸™à¸¡à¸²à¸à¸à¸§à¹ˆà¸² 300 ครั้งในอัตราที่ดีที่สุด" }, + "on": { + "message": "เปิด" + }, "cancel": { "message": "ยà¸à¹€à¸¥à¸´à¸" }, - "classicInterface": { - "message": "ใช้หน้าตาà¹à¸šà¸šà¹€à¸à¹ˆà¸²" + "cancellationGasFee": { + "message": "ค่าธรรมเนียม Gas à¸à¸²à¸£à¸¢à¸à¹€à¸¥à¸´à¸" }, - "clickCopy": { - "message": "à¸à¸”เพื่อคัดลอà¸" + "chromeRequiredForHardwareWallets": { + "message": "คุณต้องใช้ MetaMask บน Google Chrome เพื่อเชื่อมต่อà¸à¸±à¸š Hardware Wallet ของคุณ" }, "confirm": { "message": "ยืนยัน" }, - "confirmContract": { - "message": "ยืนยันสัà¸à¸à¸²" - }, "confirmPassword": { "message": "ยืนยันรหัสผ่าน" }, - "confirmTransaction": { - "message": "ยืนยันà¸à¸²à¸£à¸—ำรายà¸à¸²à¸£à¸˜à¸¸à¸£à¸à¸£à¸£à¸¡" + "confirmSecretBackupPhrase": { + "message": "ยืนยัน Phrase à¹à¸šà¹‡à¸„อัพลับของคุณ" + }, + "congratulations": { + "message": "ยินดีด้วย" + }, + "connectingTo": { + "message": "เชื่อมต่อà¸à¸±à¸š $1" }, - "continue": { - "message": "ทำต่อไป" + "connectingToMainnet": { + "message": "เชื่อมต่อà¸à¸±à¸šà¹€à¸„รือข่าย Ethereum หลัà¸" }, - "continueToCoinbase": { - "message": "ไปที่ Coinbase" + "connectingToRopsten": { + "message": "เชื่อมต่อà¸à¸±à¸šà¹€à¸„รือข่ายทดสอบ Ropsten" + }, + "continueToWyre": { + "message": "ไปที่ Wyre" }, "continueToCoinSwitch": { "message": "ไปที่ CoinSwitch" @@ -167,30 +103,12 @@ "contractDeployment": { "message": "à¸à¸²à¸£à¸•ิดตั้งสัà¸à¸à¸²" }, - "conversionProgress": { - "message": "à¸à¸³à¸¥à¸±à¸‡à¸”ำเนินà¸à¸²à¸£à¹à¸›à¸¥à¸‡à¸«à¸™à¹ˆà¸§à¸¢" - }, - "copiedButton": { - "message": "คัดลอà¸à¹à¸¥à¹‰à¸§" - }, - "copiedClipboard": { - "message": "คัดลอà¸à¹„ปที่คลิบบอร์ดà¹à¸¥à¹‰à¸§" - }, "copiedExclamation": { "message": "คัดลอà¸à¹à¸¥à¹‰à¸§!" }, - "copiedSafe": { - "message": "ฉันได้คัดลอà¸à¹€à¸à¹‡à¸šà¹„ว้ในที่ปลอดภัยเรียบร้อยà¹à¸¥à¹‰à¸§" - }, - "copy": { - "message": "คัดลอà¸" - }, "copyToClipboard": { "message": "คัดลอà¸à¹„ปคลิปบอร์ด" }, - "copyButton": { - "message": " คัดลอภ" - }, "copyPrivateKey": { "message": "นี่คือคีย์ส่วนตัวของคุณ(à¸à¸”เพื่อคัดลอà¸)" }, @@ -200,24 +118,17 @@ "createAccount": { "message": "สร้างบัà¸à¸Šà¸µ" }, - "createDen": { - "message": "สร้าง" - }, - "crypto": { - "message": "คริปโต", - "description": "Exchange type (cryptocurrencies)" + "createAWallet": { + "message": "สร้าง Wallet" }, - "currentConversion": { - "message": "อัตราà¹à¸¥à¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™" - }, - "currentNetwork": { - "message": "เครือข่ายปัจจุบัน" + "currencyConversion": { + "message": "à¸à¸²à¸£à¹à¸›à¸¥à¸‡à¸ªà¸à¸¸à¸¥à¹€à¸‡à¸´à¸™" }, "customGas": { "message": "à¸à¸³à¸«à¸™à¸”ค่าà¹à¸à¹‡à¸ªà¹€à¸­à¸‡" }, - "customize": { - "message": "à¸à¸³à¸«à¸™à¸”ค่าเอง" + "customGasSubTitle": { + "message": "à¸à¸²à¸£à¹€à¸žà¸´à¹ˆà¸¡à¸„่าธรรมเนียมอาจลดเวลาดำเนินà¸à¸²à¸£ à¹à¸•่à¸à¹‡à¹„ม่à¹à¸™à¹ˆà¹€à¸ªà¸¡à¸­à¹„ป" }, "customRPC": { "message": "à¸à¸³à¸«à¸™à¸”ค่า RPC เอง" @@ -231,39 +142,18 @@ "defaultNetwork": { "message": "ค่าเริ่มต้นของเครือข่ายสำหรับทำรายà¸à¸²à¸£à¸˜à¸¸à¸£à¸à¸£à¸£à¸¡à¸­à¸µà¹€à¸˜à¸­à¸£à¹Œà¸„ือ Main Net" }, - "denExplainer": { - "message": "DEN ของคุณคือตัวเà¸à¹‡à¸šà¸‚้อมูลที่เข้ารหัสไว้ด้วยรหัสผ่านของคุณภายใน MetaMask " + "delete": { + "message": "ลบ" }, "deposit": { "message": "à¸à¸²à¸" }, - "depositBTC": { - "message": "à¸à¸²à¸à¸šà¸´à¸•คอยน์ของคุณไปที่à¹à¸­à¸”เดรสด้านล่างนี้:" - }, - "depositEth": { - "message": "à¸à¸²à¸£à¸à¸²à¸à¸­à¸µà¹€à¸˜à¸­à¸£à¹Œ" - }, "depositEther": { "message": "à¸à¸²à¸£à¸à¸²à¸à¸­à¸µà¹€à¸˜à¸­à¸£à¹Œ" }, - "depositFiat": { - "message": "à¸à¸²à¸à¸”้วยเงินตรา" - }, - "depositFromAccount": { - "message": "à¸à¸²à¸à¸ˆà¸²à¸à¸šà¸±à¸à¸Šà¸µà¸­à¸·à¹ˆà¸™" - }, - "depositShapeShift": { - "message": "à¸à¸²à¸à¸”้วย ShapeShift" - }, - "depositShapeShiftExplainer": { - "message": "ถ้ามีเงินสà¸à¸¸à¸¥à¸­à¸·à¹ˆà¸™à¸­à¸¢à¸¹à¹ˆà¸à¹‡à¸ªà¸²à¸¡à¸²à¸£à¸–à¹à¸¥à¸à¹€à¸‡à¸´à¸™à¹à¸¥à¸°à¸à¸²à¸à¹€à¸›à¹‡à¸™à¸­à¸µà¹€à¸˜à¸­à¸£à¹Œà¹„ด้โดยตรงเข้าà¸à¸£à¸°à¹€à¸›à¹‹à¸² MetaMask ได้เลยไม่ต้องสมัครบัà¸à¸Šà¸µ" - }, "details": { "message": "รายละเอียด" }, - "directDeposit": { - "message": "à¸à¸²à¸à¸•รง" - }, "directDepositEther": { "message": "à¸à¸²à¸à¸­à¸µà¹€à¸˜à¸­à¸£à¹Œà¹‚ดยตรง" }, @@ -273,42 +163,51 @@ "done": { "message": "เสร็จสิ้น" }, + "downloadSecretBackup": { + "message": "ดาวน์โหลด Phrase à¹à¸šà¹‡à¸„อัพลับนี้à¹à¸¥à¸°à¹€à¸à¹‡à¸šà¸£à¸±à¸à¸©à¸²à¹„ว้ให้ปลอดภัยในฮาร์ดดิสà¸à¹Œà¸«à¸£à¸·à¸­à¸­à¸¸à¸›à¸à¸£à¸“์เà¸à¹‡à¸šà¸‚้อมูลภายนอà¸à¸—ี่มีà¸à¸²à¸£à¹€à¸‚้ารหัส" + }, "downloadStateLogs": { "message": "ดาวน์โหลดล็อà¸à¸ªà¸–านะ" }, + "dontHaveAHardwareWallet": { + "message": "ไม่มี Hardware Wallet ใช่ไหม" + }, "edit": { "message": "à¹à¸à¹‰à¹„ข" }, - "editAccountName": { - "message": "à¹à¸à¹‰à¹„ขชื่อบัà¸à¸Šà¸µ" + "editContact": { + "message": "à¹à¸à¹‰à¹„ขผู้ติดต่อ" + }, + "endOfFlowMessage1": { + "message": "คุณผ่านà¸à¸²à¸£à¸—ดสอบà¹à¸¥à¹‰à¸§ à¸à¸£à¸¸à¸“ารับผิดชอบในà¸à¸²à¸£à¸£à¸±à¸à¸©à¸² Seed Phrase ให้ปลอดภัย" }, - "emailUs": { - "message": "อีเมลหาเรา!" + "endOfFlowMessage5": { + "message": "โปรดระวังฟิชชิ่ง MetaMask จะไม่ขอ Seed Phrase ของคุณโดยไม่มีà¸à¸²à¸£à¹à¸ˆà¹‰à¸‡à¸¥à¹ˆà¸§à¸‡à¸«à¸™à¹‰à¸²à¹€à¸¥à¸¢" }, - "encryptNewDen": { - "message": "เข้ารหัส DEN ของคุณ" + "endOfFlowMessage9": { + "message": "เรียนรู้เพิ่มเติม" }, "enterPassword": { "message": "ใส่รหัสผ่าน" }, - "enterPasswordConfirm": { - "message": "ใส่รหัสผ่านอีà¸à¸„รั้งเพื่อยืนยัน" - }, "etherscanView": { "message": "ดูบัà¸à¸Šà¸µà¸šà¸™ Etherscan" }, - "exchangeRate": { - "message": "อัตราà¹à¸¥à¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™" + "expandView": { + "message": "ขยายมุมมอง" }, "exportPrivateKey": { "message": "ส่งออà¸à¸„ีย์ส่วนตัว" }, - "exportPrivateKeyWarning": { - "message": "ส่งออà¸à¸„ีย์ส่วนตัวโดยคุณรับความเสี่ยงเอง" - }, "failed": { "message": "ล้มเหลว" }, + "fast": { + "message": "เร็ว" + }, + "faster": { + "message": "เร็วขึ้น" + }, "fiat": { "message": "เงินตรา", "description": "Exchange type" @@ -317,48 +216,20 @@ "message": "นำเข้าไฟล์ไม่สำเหร็จ à¸à¸”ที่นี่!", "description": "Helps user import their account from a JSON file" }, - "followTwitter": { - "message": "ติดตามเราบนทวิตเตอร์" - }, "from": { "message": "จาà¸" }, - "fromToSame": { - "message": "à¹à¸­à¸”เดรสที่ส่งà¸à¸±à¸šà¸—ี่รับจะต้องไม่ไช่อันเดียวà¸à¸±à¸™" - }, - "fromShapeShift": { - "message": "จาภShapeShift" - }, - "gas": { - "message": "à¹à¸à¹‡à¸ª", - "description": "Short indication of gas cost" - }, - "gasFee": { - "message": "ค่าà¹à¸à¹Šà¸ª" - }, "gasLimit": { "message": "วงเงินà¹à¸à¹‡à¸ª" }, - "gasLimitCalculation": { - "message": "เราà¹à¸™à¸°à¸™à¸³à¸§à¸‡à¹€à¸‡à¸´à¸™à¹à¸à¹‡à¸ªà¸•ามความสำเร็จบนเครือข่าย" - }, - "gasLimitRequired": { - "message": "ต้องà¸à¸³à¸«à¸™à¸”วงเงินà¹à¸à¹‡à¸ª" - }, "gasLimitTooLow": { "message": "วงเงินà¹à¸à¹‡à¸ªà¸•้องอย่างน้อย 21000" }, - "generatingSeed": { - "message": "à¸à¸³à¸¥à¸±à¸‡à¸ªà¸£à¹‰à¸²à¸‡à¸Šà¸µà¸”..." - }, "gasPrice": { "message": "ราคาà¹à¸à¹Šà¸ª (GWEI)" }, - "gasPriceCalculation": { - "message": "เราà¹à¸™à¸°à¸™à¸³à¸£à¸²à¸„าà¹à¸à¹‡à¸ªà¸•ามความสำเร็จบนเครือข่าย" - }, - "gasPriceRequired": { - "message": "ต้องมีราคาà¹à¸à¹Šà¸ª" + "general": { + "message": "ทั่วไป" }, "getEther": { "message": "รับอีเธอร์" @@ -367,32 +238,16 @@ "message": "รับอีเธอร์ที่ปล่อยจาภ$1", "description": "Displays network name for Ether faucet" }, - "greaterThanMin": { - "message": "ต้องมาà¸à¸à¸§à¹ˆà¸²à¸«à¸£à¸·à¸­à¹€à¸—่าà¸à¸±à¸š $1.", - "description": "helper for inputting hex as decimal input" - }, "here": { "message": "ที่นี่", "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, - "hereList": { - "message": "รายà¸à¸²à¸£à¸­à¸¢à¸¹à¹ˆà¸—ี่นี่!!!!" - }, "hide": { "message": "ซ่อน" }, - "hideToken": { - "message": "ซ่อนโทเค็น" - }, "hideTokenPrompt": { "message": "ซ่อนโทเค็นหรือไม่?" }, - "howToDeposit": { - "message": "คุณต้องà¸à¸²à¸£à¸à¸²à¸à¸­à¸µà¹€à¸˜à¸­à¸£à¹Œà¸­à¸¢à¹ˆà¸²à¸‡à¹„ร?" - }, - "holdEther": { - "message": "ช่วยคุณถืออีเทอร์à¹à¸¥à¸°à¹‚ทเค็นà¹à¸¥à¸°à¸—ำหน้าที่เป็นสะพานเชื่อมต่อà¸à¸±à¸šà¹à¸­à¸žà¸žà¸¥à¸´à¹€à¸„ชันà¹à¸šà¸šà¸à¸£à¸°à¸ˆà¸²à¸¢" - }, "import": { "message": "นำเข้า", "description": "Button to import an account from a selected file" @@ -403,12 +258,6 @@ "importAccountMsg": { "message": "บัà¸à¸Šà¸µà¸—ี่นำเข้าจะไม่ถูà¸à¸£à¸§à¸¡à¸à¸±à¸šà¸šà¸±à¸à¸Šà¸µà¸—ี่สร้างด้วยคำเเริ่มต้นบนเมต้ามาร์สในตอนà¹à¸£à¸ เรียนรู้เพิ่มเติมเà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸šà¸šà¸±à¸à¸Šà¸µà¸—ี่นำเข้า" }, - "importAnAccount": { - "message": "นำเข้าบัà¸à¸Šà¸µ" - }, - "importDen": { - "message": "นำเข้า DEN ที่มีอยู่à¹à¸¥à¹‰à¸§" - }, "imported": { "message": "นำเข้าเรียบร้อย", "description": "status showing that an account has been fully loaded into the keyring" @@ -428,20 +277,17 @@ "invalidAddressRecipient": { "message": "à¹à¸­à¸”à¹à¸”รสผู้รับไม่ถูà¸à¸•้อง" }, - "invalidGasParams": { - "message": "ตั้งค่าà¹à¸à¹Šà¸ªà¹„ม่ถูà¸à¸•้อง" + "invalidAddressRecipientNotEthNetwork": { + "message": "ไม่ใช่เครือข่าย ETH ตั้งเป็นตัวพิมพ์เล็à¸" }, "invalidInput": { "message": "อินพุทไม่ถูà¸à¸•้อง" }, - "invalidRequest": { - "message": "คำร้องขอไม่ถูà¸à¸•้อง" - }, "invalidRPC": { "message": "RPC URI ไม่ถูà¸à¸•้อง" }, - "jsonFail": { - "message": "เà¸à¸´à¸”บางอย่างผิดพลาด โปรดตรวจสอบว่าไฟล์ JSON ของคุณมีรูปà¹à¸šà¸šà¸—ี่ถูà¸à¸•้อง." + "invalidBlockExplorerURL": { + "message": "Block Explorer URI ไม่ถูà¸à¸•้อง" }, "jsonFile": { "message": "ไฟล์ JSON", @@ -450,40 +296,21 @@ "kovan": { "message": "เครือข่ายทดสอบ Kovan" }, - "knowledgeDataBase": { - "message": "ไปที่คลังความรู้ของเรา" - }, - "lessThanMax": { - "message": "ต้องน้อยà¸à¸§à¹ˆà¸²à¸«à¸£à¸·à¸­à¹€à¸—่าà¸à¸±à¸š $1.", - "description": "helper for inputting hex as decimal input" + "learnMore": { + "message": "เรียนรู้เพิ่มเติม" }, "likeToAddTokens": { "message": "คุณต้องà¸à¸²à¸£à¹€à¸žà¸´à¹ˆà¸¡à¹‚ทเค็นเหล่านี้หรือไม่?" }, - "limit": { - "message": "ข้อจำà¸à¸±à¸”" - }, "loading": { "message": "à¸à¸³à¸¥à¸±à¸‡à¹‚หลด..." }, "loadingTokens": { "message": "à¸à¸³à¸¥à¸±à¸‡à¹‚หลดโทเค็น..." }, - "localhost": { - "message": "Localhost 8545" - }, - "login": { - "message": "เข้าสู่ระบบ" - }, - "logout": { + "lock": { "message": "ออà¸à¸ˆà¸²à¸à¸£à¸°à¸šà¸š" }, - "loose": { - "message": "อิสระ" - }, - "loweCaseWords": { - "message": "à¸à¸¥à¸¸à¹ˆà¸¡à¸„ำชีดมีเพียงตัวพิมพ์เล็à¸à¹€à¸—่านั้น" - }, "mainnet": { "message": "เครือข่าย Main Net" }, @@ -493,9 +320,6 @@ "metamaskDescription": { "message": "MetaMask คือที่เà¸à¹‡à¸šà¸•ัวตนนิรภัยสำหรับอีเธอเรียม" }, - "min": { - "message": "ขั้นต่ำ" - }, "myAccounts": { "message": "บัà¸à¸Šà¸µà¸‚องฉัน" }, @@ -509,19 +333,21 @@ "message": "คุณต้องเลือà¸à¹„ฟล์ที่จะนำเข้า", "description": "User is important an account and needs to add a file to continue" }, - "needImportPassword": { - "message": "คุณต้องป้อนรหัสผ่านสำหรับไฟล์ที่เลือà¸", - "description": "Password and file needed to import an account" - }, "negativeETH": { "message": "ไม่สามารถส่งอีเธอร์เป็นจำนวนติดลบได้" }, "networks": { "message": "เครือข่าย" }, + "networkSettingsDescription": { + "message": "เพิ่มà¹à¸¥à¸°à¹à¸à¹‰à¹„ขเครือข่าย RPC à¹à¸šà¸šà¸à¸³à¸«à¸™à¸”เอง" + }, "newAccount": { "message": "บัà¸à¸Šà¸µà¹ƒà¸«à¸¡à¹ˆ" }, + "newAccountDetectedDialogMessage": { + "message": "ตรวจพบที่อยู่ใหม่! คลิà¸à¸—ี่นี่เพื่อเพิ่มลงในสมุดที่อยู่ของคุณ" + }, "newAccountNumberName": { "message": "บัà¸à¸Šà¸µ $1", "description": "Default name of next account to be created on create account screen" @@ -532,11 +358,11 @@ "newPassword": { "message": "รหัสผ่านใหม่(ขั้นต่ำ 8 ตัวอัà¸à¸©à¸£)" }, - "newRecipient": { - "message": "ผู้รับใหม่" + "newToMetaMask": { + "message": "เพิ่งเริ่มใช้ MetaMask?" }, - "newRPC": { - "message": "RPC URL ใหม่" + "newTransactionFee": { + "message": "ค่าธรรมเนียมธุรà¸à¸£à¸£à¸¡à¹ƒà¸«à¸¡à¹ˆ" }, "next": { "message": "ถัดไป" @@ -544,52 +370,19 @@ "noAddressForName": { "message": "ยังไม่มีà¹à¸­à¸”à¹à¸”รสไหนตั้งในชื่อนี้" }, - "noDeposits": { - "message": "ไม่มีเงินà¸à¸²à¸à¹€à¸‚้ามา" - }, - "noTransactionHistory": { - "message": "ไม่มีรายà¸à¸²à¸£à¸˜à¸¸à¸£à¸à¸£à¸£à¸¡à¹ƒà¸™à¸­à¸”ีต" - }, "noTransactions": { "message": "ยังไม่มีรายà¸à¸²à¸£à¸˜à¸¸à¸£à¸à¸£à¸£à¸¡" }, - "notStarted": { - "message": "ยังไม่เริ่ม" - }, - "oldUI": { - "message": "หน้าตาà¹à¸šà¸šà¹€à¸à¹ˆà¸²" - }, - "oldUIMessage": { - "message": "คุณได้เปลี่ยนเป็นหน้าตาà¹à¸šà¸šà¹€à¸à¹ˆà¸²à¹à¸¥à¹‰à¸§ คุณสามารถเปลี่ยนเป็นหน้าตาà¹à¸šà¸šà¹ƒà¸«à¸¡à¹ˆà¹„ด้โดยไปที่ตัวเลือà¸à¸•รงเมนูมุมขวาบน" - }, - "or": { - "message": "หรือ", - "description": "choice between creating or importing a new account" - }, - "passwordCorrect": { - "message": "โปรดตรวจสอบว่ารหัสผ่านของคุณถูà¸à¸•้อง" - }, - "passwordMismatch": { - "message": "รหัสผ่านไม่ตรงà¸à¸±à¸™", - "description": "in password creation process, the two new password fields did not match" - }, - "passwordShort": { - "message": "รหัสผ่านไม่ยาวพอ", - "description": "in password creation process, the password is not long enough to be secure" + "participateInMetaMetricsDescription": { + "message": "เข้าร่วมใน MetaMetrics เพื่อช่วยเราในà¸à¸²à¸£à¸žà¸±à¸’นา MetaMask" }, "pastePrivateKey": { "message": "วางคีย์ส่วนตัวของคุณที่นี่:", "description": "For importing an account from a private key" }, - "pasteSeed": { - "message": "วางคำชีดของคุณที่นี่!" - }, "personalAddressDetected": { "message": "ตรวจพบà¹à¸­à¸”à¹à¸”รสส่วนตัวà¹à¸¥à¹‰à¸§ ใส่à¹à¸­à¸”à¹à¸”รสสัà¸à¸à¸²à¹‚ทเค็น" }, - "pleaseReviewTransaction": { - "message": "โปรดตรวจสอบธุรà¸à¸£à¸£à¸¡à¸‚องคุณ" - }, "privacyMsg": { "message": "นโยบายสความเป็นส่วนตัว" }, @@ -603,70 +396,47 @@ "privateNetwork": { "message": "เครือข่ายส่วนตัว" }, - "qrCode": { - "message": "à¹à¸ªà¸”ง QR Code" - }, "readdToken": { "message": "คุณสามารถเพิ่มโทเค็นนี้ในอนาคตได้โดยไปที่ “เพิ่มโทเค็น†ในเมนูตัวเลือà¸à¸šà¸±à¸à¸Šà¸µà¸‚องคุณ" }, - "readMore": { - "message": "อ่านเพิ่มเติมที่นี่" - }, - "readMore2": { - "message": "อ่านเพิ่มเติม" - }, - "receive": { - "message": "รับ" - }, "recipientAddress": { "message": "à¹à¸­à¸”à¹à¸”รสผู้รับ" }, - "refundAddress": { - "message": "à¹à¸­à¸”à¹à¸”รสสำหรับà¸à¸²à¸£à¸„ืนเงินของคุณ" - }, "rejected": { "message": "ถูà¸à¸›à¸à¸´à¹€à¸ªà¸˜" }, "resetAccount": { "message": "รีเซ็ตบัà¸à¸Šà¸µ" }, + "deleteNetwork": { + "message": "ลบเครือข่าย?" + }, + "remindMeLater": { + "message": "เตือนฉันภายหลัง" + }, "restoreFromSeed": { "message": "à¸à¸¹à¹‰à¸„ืนจาà¸à¸à¸¥à¸¸à¹ˆà¸¡à¸„ำชีด" }, "required": { "message": "จำเป็น" }, - "retryWithMoreGas": { - "message": "ลองใหม่ด้วยราคาà¹à¸à¹Šà¸ªà¸—ี่สูงà¸à¸§à¹ˆà¸²à¸™à¸µà¹‰à¸—ี่นี่" - }, "revealSeedWords": { "message": "เปิดเผยà¸à¸¥à¸¸à¹ˆà¸¡à¸„ำชีด" }, "revealSeedWordsWarning": { "message": "อย่าเปิดเผยคำà¸à¸¥à¸¸à¹ˆà¸¡à¸„ำชีดของคุณในที่สาธารณะ! คำเหล่านี้สามารถใช้เพื่อขโมยบัà¸à¸Šà¸µà¸—ั้งหมดของคุณ" }, - "revert": { - "message": "ย้อนà¸à¸¥à¸±à¸š" - }, "rinkeby": { "message": "เครือข่ายทดสอบ Rinkeby" }, "ropsten": { "message": "เครือข่ายทดสอบ Ropsten" }, - "sampleAccountName": { - "message": "เช่น บัà¸à¸Šà¸µà¹€à¸®à¸‡à¹€à¸®à¸‡à¸‚องฉัน", - "description": "Help user understand concept of adding a human-readable name to their account" - }, "save": { "message": "บันทึà¸" }, - "saveAsFile": { - "message": "บันทึà¸à¹€à¸›à¹‡à¸™à¹„ฟล์", - "description": "Account export process" - }, - "saveSeedAsFile": { - "message": "บันทึà¸à¸à¸¥à¸¸à¹ˆà¸¡à¸„ำชีดเป็นไฟล์" + "slower": { + "message": "ช้าลง" }, "search": { "message": "ค้นหา" @@ -677,47 +447,47 @@ "seedPhraseReq": { "message": "à¸à¸¥à¸¸à¹ˆà¸¡à¸„ำชีดมีความยาว 12 คำ" }, - "select": { - "message": "เลือà¸" - }, "selectCurrency": { "message": "เลือà¸à¸ªà¸à¸¸à¸¥à¹€à¸‡à¸´à¸™" }, - "selectService": { - "message": "เลือà¸à¸šà¸£à¸´à¸à¸²à¸£" - }, "selectType": { "message": "เลือà¸à¸›à¸£à¸°à¹€à¸ à¸—" }, "send": { "message": "ส่ง" }, + "sendAmount": { + "message": "ส่งจำนวนเงินนี้" + }, "sendETH": { "message": "ส่งอีเธอร์" }, "sendTokens": { "message": "ส่งโทเค็น" }, - "sendTokensAnywhere": { - "message": "ส่งโทเค็นไปให้ทุà¸à¸„นที่มีบัà¸à¸Šà¸µà¸­à¸µà¹€à¸˜à¸­à¹€à¸£à¸µà¸¢à¸¡" + "selectAnAccount": { + "message": "เลือà¸à¸šà¸±à¸à¸Šà¸µ" + }, + "selectHdPath": { + "message": "เลือà¸à¹€à¸ªà¹‰à¸™à¸—าง HD" }, "settings": { "message": "à¸à¸²à¸£à¸•ั้งค่า" }, - "shapeshiftBuy": { - "message": "ซื้อด้วย Shapeshift" + "showAdvancedGasInline": { + "message": "à¸à¸²à¸£à¸„วบคุม Gas ขั้นสูง" }, "showPrivateKeys": { "message": "à¹à¸ªà¸”งคีย์ส่วนตัว" }, - "showQRCode": { - "message": "à¹à¸ªà¸”ง QR Code" - }, "sign": { "message": "เซ็นชื่อ" }, - "signMessage": { - "message": "เซ็นชื่อในข้อความ" + "signatureRequest": { + "message": "ขอลายเซ็น" + }, + "signed": { + "message": "ลงชื่อà¹à¸¥à¹‰à¸§" }, "signNotice": { "message": "à¸à¸²à¸£à¹€à¸‹à¹‡à¸™à¸Šà¸·à¹ˆà¸­à¹ƒà¸™à¸‚้อความนี้อาจจะเป็นอันตรายได้ \nเซ็นชื่อเฉพาะข้อความจาà¸à¹à¸«à¸¥à¹ˆà¸‡à¸—ี่คุณไว้วางใจได้จริง ๆ เท่านั้น \nวิธีที่อันตรายนี้จะถูà¸à¸¥à¸šà¸­à¸­à¸à¹ƒà¸™à¸­à¸™à¸²à¸„ต" @@ -725,14 +495,8 @@ "sigRequest": { "message": "ขอลายเซ็น" }, - "sigRequested": { - "message": "ขอลายเซ็นà¹à¸¥à¹‰à¸§" - }, - "spaceBetween": { - "message": "มีช่องว่างได้เพียงตัวเดียวระหว่างคำเท่านั้น" - }, - "status": { - "message": "สถานะ" + "switchNetworks": { + "message": "เปลี่ยนเครือข่าย" }, "stateLogs": { "message": "บันทึà¸à¸‚องสถานะ" @@ -740,17 +504,29 @@ "stateLogsDescription": { "message": "บันทึà¸à¸‚องสถานะประà¸à¸­à¸šà¸”้วยà¹à¸­à¸”à¹à¸”รสสาธารณะà¹à¸¥à¸°à¸˜à¸¸à¸£à¸à¸£à¸£à¸¡à¸—ี่ส่ง" }, - "submit": { - "message": "ตà¸à¸¥à¸‡" + "step1HardwareWallet": { + "message": "1. เชื่อมต่อ Hardware Wallet" + }, + "step2HardwareWallet": { + "message": "2. เลือà¸à¸šà¸±à¸à¸Šà¸µ" + }, + "step3HardwareWalletMsg": { + "message": "ใช้บัà¸à¸Šà¸µà¸®à¸²à¸£à¹Œà¸”à¹à¸§à¸£à¹Œà¸‚องคุณเช่นเดียวà¸à¸±à¸šà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸à¸±à¸šà¸šà¸±à¸à¸Šà¸µ Ethereum ล็อà¸à¸­à¸´à¸™à¹€à¸‚้าสู่ dApp ส่ง Eth ซื้อà¹à¸¥à¸°à¹€à¸à¹‡à¸šà¹‚ทเคน ERC20 à¹à¸¥à¸°à¹‚ทเคนà¹à¸šà¸š Non-Fungible เช่น CryptoKitties" + }, + "storePhrase": { + "message": "เà¸à¹‡à¸š Phrase นี้ในตัวจัดà¸à¸²à¸£à¸£à¸«à¸±à¸ªà¸œà¹ˆà¸²à¸™ เช่น 1Password" }, "supportCenter": { "message": "ไปที่ศูนย์สนับสนุนของเรา" }, + "symbol": { + "message": "เครื่องหมาย" + }, "symbolBetweenZeroTwelve": { - "message": "สัà¸à¸¥à¸±à¸à¸©à¸“์ต้องมีความยาวตั้งà¹à¸•่ 0 ถึง 12 อัà¸à¸‚ระ" + "message": "สัà¸à¸¥à¸±à¸à¸©à¸“์จะต้องมีความยาว 11 ตัวอัà¸à¸©à¸£" }, - "takesTooLong": { - "message": "ใช้เวลานานเà¸à¸´à¸™à¹„ปใช่หรือไม่?" + "syncWithMobileComplete": { + "message": "ซิงค์ข้อมูลของคุณเรียบร้อยà¹à¸¥à¹‰à¸§ ใช้à¹à¸­à¸ž MetaMask ให้สนุà¸à¸™à¸°!" }, "terms": { "message": "ข้อตà¸à¸¥à¸‡à¹ƒà¸™à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™" @@ -758,108 +534,64 @@ "testFaucet": { "message": "ตัวà¹à¸ˆà¸à¸ˆà¹ˆà¸²à¸¢à¹€à¸žà¸·à¹ˆà¸­à¸à¸²à¸£à¸—ดสอบ" }, + "thisWillCreate": { + "message": "สิ่งนี้จะสร้าง Wallet à¹à¸¥à¸° Seed Phrase ใหม่" + }, "to": { "message": "ถึง" }, - "toETHviaShapeShift": { - "message": "$1 เป็นอีเธอร์โดย ShapeShift", - "description": "system will fill in deposit type in start of message" - }, - "tokenAddress": { - "message": "à¹à¸­à¸”à¹à¸”รสโทเค็น" - }, "tokenAlreadyAdded": { "message": "โทเคนได้ถูà¸à¹€à¸žà¸´à¹ˆà¸¡à¹„ปà¹à¸¥à¹‰à¸§" }, - "tokenBalance": { - "message": "ยอดโทเค็นคงเหลือของคุณคือ:" - }, - "tokenSelection": { - "message": "ค้นหาโทเค็นหรือเลือà¸à¸ˆà¸²à¸à¸£à¸²à¸¢à¸à¸²à¸£à¹‚ทเค็นยอดนิยมของเรา" - }, "tokenSymbol": { "message": "สัà¸à¸¥à¸±à¸à¸©à¸“์ประจำตัว" }, - "tokenWarning1": { - "message": "ติดตามโทเค็นที่คุณซื้อด้วยบัà¸à¸Šà¸µ MetaMask ของคุณ หาà¸à¸„ุณซื้อโทเค็นโดยใช้บัà¸à¸Šà¸µà¸­à¸·à¹ˆà¸™à¹‚ทเค็นเหล่านั้นจะไม่ปราà¸à¸à¸—ี่นี่" - }, "total": { "message": "รวม" }, - "transactions": { - "message": "ธุรà¸à¸£à¸£à¸¡" + "transactionDropped": { + "message": "ธุรà¸à¸£à¸£à¸¡à¸–ูà¸à¸¢à¸à¹€à¸¥à¸´à¸à¹€à¸¡à¸·à¹ˆà¸­ $2" }, - "transactionMemo": { - "message": "บันทึà¸à¸Šà¹ˆà¸§à¸¢à¸ˆà¸³à¸‚องà¸à¸²à¸£à¸—ำธุรà¸à¸£à¸£à¸¡ (ไม่บังคับ)" + "transactionCancelSuccess": { + "message": "ยà¸à¹€à¸¥à¸´à¸à¸˜à¸¸à¸£à¸à¸£à¸£à¸¡à¹€à¸£à¸µà¸¢à¸šà¸£à¹‰à¸­à¸¢à¹à¸¥à¹‰à¸§à¹€à¸¡à¸·à¹ˆà¸­ $2" }, - "transactionNumber": { - "message": "หมายเลขธุรà¸à¸£à¸£à¸¡" - }, - "transfers": { - "message": "โอน" + "transferBetweenAccounts": { + "message": "โอนระหว่างบัà¸à¸Šà¸µà¸‚องฉัน" }, "troubleTokenBalances": { "message": "เรามีปัà¸à¸«à¸²à¹ƒà¸™à¸à¸²à¸£à¹‚หลดยอดโทเค็นคงเหลือของคุณ คุณสามารถดูได้ที่นี่", "description": "Followed by a link (here) to view token balances" }, - "twelveWords": { - "message": "à¸à¸¥à¸¸à¹ˆà¸¡à¸„ำ 12 คำเหล่านี้เป็นวิธีเดียวที่จะà¸à¸¹à¹‰à¸„ืนบัà¸à¸Šà¸µ MetaMask ของคุณ \n à¸à¸£à¸¸à¸“าเà¸à¹‡à¸šà¹„ว้ในที่ปลอดภัยà¹à¸¥à¸°à¹€à¸à¹‡à¸šà¹€à¸›à¹‡à¸™à¸„วามลับ" - }, "typePassword": { "message": "พิมพ์รหัสผ่านของคุณ" }, - "uiWelcome": { - "message": "ยินดีต้อนรับสู่หน้าตาใหม่ (เบต้า)" - }, - "uiWelcomeMessage": { - "message": "ขณะนี้คุณใช้งาน MetaMask หน้าตาใหม่à¹à¸¥à¹‰à¸§ ลองใช้ความสามรถใหม่ ๆ เช่นà¸à¸²à¸£à¸ªà¹ˆà¸‡à¹‚ทเค็นà¹à¸¥à¸°à¸«à¸²à¸à¸žà¸šà¸›à¸±à¸à¸«à¸²à¸à¸£à¸¸à¸“าà¹à¸ˆà¹‰à¸‡à¹ƒà¸«à¹‰à¹€à¸£à¸²à¸—ราบ" - }, - "unavailable": { - "message": "ใช้งานไม่ได้" - }, "unknown": { "message": "ไม่รู้จัà¸" }, "unknownNetwork": { "message": "ไม่รู้จัà¸à¹€à¸„รือข่ายส่วนตัว" }, - "unknownNetworkId": { - "message": "ไม่รู้จัà¸à¸«à¸¡à¸²à¸¢à¹€à¸¥à¸‚เครือข่าย" + "unlock": { + "message": "ปลดล็อà¸" }, - "uriErrorMsg": { - "message": "URI ต้องมีคำนำหน้าเป็น HTTP หรือ HTTPS" + "updatedWithDate": { + "message": "อัปเดต $1 à¹à¸¥à¹‰à¸§" }, - "usaOnly": { - "message": "ในสหรัà¸à¸­à¹€à¸¡à¸£à¸´à¸à¸²à¹€à¸—่านั้น", - "description": "Using this exchange is limited to people inside the USA" + "urlErrorMsg": { + "message": "URI ต้องมีคำนำหน้าเป็น HTTP หรือ HTTPS" }, "usedByClients": { "message": "ถูà¸à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¹‚ดยหลายไคลเอนท์" }, - "useOldUI": { - "message": "ใช้หน้าตาเà¸à¹ˆà¸²" - }, - "validFileImport": { - "message": "คุณต้องเลือà¸à¹„ฟล์ที่ถูà¸à¸•้องเพื่อนำเข้า" - }, - "vaultCreated": { - "message": "สร้างตู้เซฟà¹à¸¥à¹‰à¸§" - }, "viewAccount": { "message": "ดูบัà¸à¸Šà¸µ" }, "visitWebSite": { "message": "เยี่ยมชมเว็บไซต์ของเรา" }, - "warning": { - "message": "คำเตือน" - }, "welcome": { "message": "ยินดีต้อนรับสู่ MetaMask เบต้า" }, - "whatsThis": { - "message": "นี่คืออะไร?" - }, "yourSigRequested": { "message": "ลายเซ็นของคุณà¸à¸³à¸¥à¸±à¸‡à¹„ด้รับà¸à¸²à¸£à¸£à¹‰à¸­à¸‡à¸‚อ" }, diff --git a/app/_locales/tml/messages.json b/app/_locales/tml/messages.json deleted file mode 100644 index 2f883b26b69c..000000000000 --- a/app/_locales/tml/messages.json +++ /dev/null @@ -1,962 +0,0 @@ -{ - "privacyMode": { - "message": "தனியà¯à®°à®¿à®®à¯ˆ à®®à¯à®±à¯ˆ" - }, - "privacyModeDescription": { - "message": "உஙà¯à®•ள௠கணகà¯à®•à¯à®¤à¯ தகவலை பாரà¯à®µà¯ˆà®¯à®¿à®Ÿ வலைதà¯à®¤à®³à®™à¯à®•ள௠அணà¯à®•லைக௠கோர வேணà¯à®Ÿà¯à®®à¯." - }, - "exposeAccounts": { - "message": "கணகà¯à®•à¯à®•ளை à®…à®®à¯à®ªà®²à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®™à¯à®•ளà¯" - }, - "exposeDescription": { - "message": "தறà¯à®ªà¯‹à®¤à¯ˆà®¯ இணையதளதà¯à®¤à®¿à®±à¯à®•௠கணகà¯à®•à¯à®•ளை à®…à®®à¯à®ªà®²à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®™à¯à®•ளà¯. மரபண௠டாபà¯à®¸à¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤." - }, - "confirmExpose": { - "message": "நிசà¯à®šà®¯à®®à®¾à®• உஙà¯à®•ள௠கணகà¯à®•à¯à®•ளை தறà¯à®ªà¯‹à®¤à¯ˆà®¯ இணையதà¯à®¤à®³à®¤à¯à®¤à®¿à®²à¯ à®…à®®à¯à®ªà®²à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤ விரà¯à®®à¯à®ªà¯à®•ிறீரà¯à®•ளா?" - }, - "confirmClear": { - "message": "à®…à®™à¯à®•ீகரிகà¯à®•பà¯à®ªà®Ÿà¯à®Ÿ வலைதà¯à®¤à®³à®™à¯à®•ளை நிசà¯à®šà®¯à®®à®¾à®• நீகà¯à®• விரà¯à®®à¯à®ªà¯à®•ிறீரà¯à®•ளா?" - }, - "clearApprovalDataSuccess": { - "message": "à®…à®™à¯à®•ீகரிகà¯à®•பà¯à®ªà®Ÿà¯à®Ÿ வலைதà¯à®¤à®³ தரவ௠வெறà¯à®±à®¿à®•ரமாக அழிகà¯à®•பà¯à®ªà®Ÿà¯à®Ÿà®¤à¯." - }, - "approvalData": { - "message": "ஒபà¯à®ªà¯à®¤à®²à¯ தரவà¯" - }, - "approvalDataDescription": { - "message": "à®…à®™à¯à®•ீகரிகà¯à®•பà¯à®ªà®Ÿà¯à®Ÿ வலைதà¯à®¤à®³ தரவை அழிகà¯à®•வà¯à®®à¯, அனைதà¯à®¤à¯ தளஙà¯à®•ளà¯à®®à¯ ஒபà¯à®ªà¯à®¤à®²à¯ மீணà¯à®Ÿà¯à®®à¯ கோர வேணà¯à®Ÿà¯à®®à¯." - }, - "clearApprovalData": { - "message": "ஒபà¯à®ªà¯à®¤à®²à¯ தரவை அழி" - }, - "approve": { - "message": "ஒபà¯à®ªà¯à®¤à®²à¯" - }, - "reject": { - "message": "நிராகரி" - }, - "providerAPIRequest": { - "message": "Web3 API கோரிகà¯à®•ை" - }, - "reviewProviderRequest": { - "message": "இநà¯à®¤ வலை 3 API கோரிகà¯à®•ையை மதிபà¯à®ªà®¾à®¯à¯à®µà¯ செயà¯à®¯à®µà¯à®®à¯." - }, - "providerRequestInfo": { - "message": "கீழே படà¯à®Ÿà®¿à®¯à®²à®¿à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³ டொமைன௠Web3 à®à®ªà®¿à® அணà¯à®•லைக௠கோரà¯à®µà®¤à®±à¯à®•௠மà¯à®¯à®±à¯à®šà®¿à®•à¯à®•ிறதà¯, எனவே இத௠Ethereum blockchain உடன௠தொடரà¯à®ªà¯ கொளà¯à®³ à®®à¯à®Ÿà®¿à®¯à¯à®®à¯. Web3 அணà¯à®•à¯à®®à¯à®±à¯ˆà®¯à¯ˆ à®…à®™à¯à®•ீகரிபà¯à®ªà®¤à®±à¯à®•௠மà¯à®©à¯ சரியான தளதà¯à®¤à®¿à®²à¯ இரà¯à®ªà¯à®ªà®¤à¯ˆ எபà¯à®ªà¯‹à®¤à¯à®®à¯ இரà¯à®®à¯à®±à¯ˆ சரிபாரà¯à®•à¯à®•வà¯à®®à¯." - }, - "accept": { - "message": "à®à®±à¯à®•வà¯à®®à¯" - }, - "account": { - "message": "கணகà¯à®•à¯" - }, - "accountDetails": { - "message": "கணகà¯à®•௠விவரஙà¯à®•ளà¯" - }, - "accountName": { - "message": "கணகà¯à®•ின௠பெயரà¯" - }, - "address": { - "message": "à®®à¯à®•வரி" - }, - "addCustomToken": { - "message": "தனிபà¯à®ªà®¯à®©à¯ டோகà¯à®•னைச௠சேரà¯à®•à¯à®•வà¯à®®à¯" - }, - "addToken": { - "message": "டோகà¯à®•னைச௠சேரà¯" - }, - "addTokens": { - "message": "டோகà¯à®•னà¯à®•ளைச௠சேரà¯" - }, - "amount": { - "message": "தொகை" - }, - "amountPlusGas": { - "message": "தொகை + எரிவாயà¯" - }, - "appDescription": { - "message": "எதெரியà¯à®®à¯ பிரௌசர௠நீடà¯à®Ÿà®¿à®ªà¯à®ªà¯", - "description": "பயனà¯à®ªà®¾à®Ÿà¯à®Ÿà®¿à®©à¯ விளகà¯à®•à®®à¯" - }, - "appName": { - "message": "மேடமஸà¯à®•௠", - "description": "பயனà¯à®ªà®¾à®Ÿà¯à®Ÿà®¿à®©à¯ பெயரà¯" - }, - "approved": { - "message": "à®…à®™à¯à®•ீகரிகà¯à®•பà¯à®ªà®Ÿà¯à®Ÿ" - }, - "attemptingConnect": { - "message": "இணைகà¯à®• à®®à¯à®¯à®±à¯à®šà®¿ செயà¯à®• பà¯à®³à®¾à®•à¯à®šà¯ˆà®©à¯" - }, - "attributions": { - "message": "பணà¯à®ªà¯à®•ளà¯à®®à¯" - }, - "available": { - "message": "கிடைகà¯à®•à¯à®®à¯" - }, - "back": { - "message": "மீணà¯à®Ÿà¯à®®à¯" - }, - "balance": { - "message": "இரà¯à®ªà¯à®ªà¯:" - }, - "balances": { - "message": "உஙà¯à®•ள௠இரà¯à®ªà¯à®ªà¯" - }, - "balanceIsInsufficientGas": { - "message": "நடபà¯à®ªà¯ வாய௠மொதà¯à®¤à®®à¯ போதà¯à®®à®¾à®© சமநிலை" - }, - "beta": { - "message": "பீடà¯à®Ÿà®¾" - }, - "betweenMinAndMax": { - "message": "$ 1 கà¯à®•à¯à®®à¯ அதிகமாகவà¯à®®à¯ அலà¯à®²à®¤à¯ $ 2 கà¯à®•௠சமமாகவà¯à®®à¯ இரà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯.", - "description": "ஹெகà¯à®¸à¯ உளà¯à®³à¯€à®Ÿà¯ தசம உளà¯à®³à¯€à®Ÿà¯ என உதவி" - }, - "blockiesIdenticon": { - "message": "பà¯à®³à®¾à®•à¯à®•ிஸ௠à®à®Ÿà¯†à®©à¯à®Ÿà®¿à®•ோன௠பயனà¯à®ªà®¾à®Ÿà¯à®Ÿà¯" - }, - "borrowDharma": { - "message": "தரà¯à®®à®¤à¯à®¤à¯à®Ÿà®©à¯ கடன௠வாஙà¯à®•à¯à®™à¯à®•ள௠(பீடà¯à®Ÿà®¾)" - }, - "builtInCalifornia": { - "message": "மேடமஸà¯à®•௠வடிவமைகà¯à®•பà¯à®ªà®Ÿà¯à®Ÿà¯ கலிபோரà¯à®©à®¿à®¯à®¾à®µà®¿à®²à¯ கடà¯à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯." - }, - "buy": { - "message": "வாஙà¯à®•" - }, - "buyCoinbase": { - "message": "கோஇனà¯à®ªà®šà¯‡ வாஙà¯à®•வà¯à®®à¯" - }, - "buyCoinbaseExplainer": { - "message": "கோஇனà¯à®ªà®šà¯‡ பிறகாயà¯à®©à¯ , எதெரியà¯à®®à¯ மறà¯à®±à¯à®®à¯ ளிடà¯à®Ÿà®šà¯‹à®©à¯ வாஙà¯à®• மறà¯à®±à¯à®®à¯ விறà¯à®• உலகின௠மிகவà¯à®®à¯ பிரபலமான வழி" - }, - "buyCoinSwitch": { - "message": "நாணயம௠ஸà¯à®µà®¿à®Ÿà¯à®šà®¿à®²à¯ வாஙà¯à®•வà¯à®®à¯" - }, - "buyCoinSwitchExplainer": { - "message": "சிறநà¯à®¤ விகிததà¯à®¤à®¿à®²à¯ 300 கà¯à®•à¯à®®à¯ அதிகமான cryptocurrencies ஠பரிமாறிகà¯à®•ொளà¯à®³ ஒர௠நாணயமாறà¯à®±à¯ இலகà¯à®•௠நாணயம௠ஸà¯à®µà®¿à®Ÿà¯à®šà¯ ஆகà¯à®®à¯." - }, - "ok": { - "message": "சரி" - }, - "cancel": { - "message": "ரதà¯à®¤à¯" - }, - "classicInterface": { - "message": "கிளாசிக௠இடைமà¯à®•தà¯à®¤à¯ˆà®ªà¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®µà¯à®®à¯" - }, - "clickCopy": { - "message": "நகலெடà¯à®•à¯à®• கிளிக௠செயà¯à®¯à®µà¯à®®à¯" - }, - "confirm": { - "message": "உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®µà¯à®®à¯" - }, - "confirmed": { - "message": "உறà¯à®¤à®¿" - }, - "confirmContract": { - "message": "ஒபà¯à®ªà®¨à¯à®¤à®¤à¯à®¤à¯ˆ உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®•" - }, - "confirmPassword": { - "message": "கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®•" - }, - "confirmTransaction": { - "message": "பரிவரà¯à®¤à¯à®¤à®©à¯ˆ உறà¯à®¤à®¿à®ªà®Ÿà¯à®¤à¯à®¤à®µà¯à®®à¯" - }, - "continue": { - "message": "தொடரà¯à®¨à¯à®¤à¯" - }, - "continueToCoinbase": { - "message": "கோஇனà¯à®ªà®šà¯‡ à®à®¤à¯ தொடரவà¯à®®à¯" - }, - "continueToCoinSwitch": { - "message": "நாணயம௠மாறாமல௠தொடரà¯à®•" - }, - "contractDeployment": { - "message": "ஒபà¯à®ªà®¨à¯à®¤ வரிசைபà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯" - }, - "conversionProgress": { - "message": "மாறà¯à®±à®®à¯ à®®à¯à®©à¯à®©à¯‡à®±à¯à®±à®®à¯" - }, - "copiedButton": { - "message": "நகலெடà¯à®•à¯à®•பà¯à®ªà®Ÿà¯à®Ÿà®©" - }, - "copiedClipboard": { - "message": "கிளிபà¯à®ªà¯‹à®°à¯à®Ÿà¯à®•à¯à®•௠நகலெடà¯à®•à¯à®•பà¯à®ªà®Ÿà¯à®Ÿà®¤à¯" - }, - "copiedExclamation": { - "message": "நகலெடà¯à®•à¯à®•பà¯à®ªà®Ÿà¯à®Ÿà®©!" - }, - "copiedSafe": { - "message": "நான௠எஙà¯à®•ாவத௠பாதà¯à®•ாபà¯à®ªà®¾à®• நகலெடà¯à®¤à¯à®¤à®¿à®°à¯à®•à¯à®•ிறேனà¯" - }, - "copy": { - "message": "நகலà¯" - }, - "copyToClipboard": { - "message": "கிளிபà¯à®ªà¯‹à®°à¯à®Ÿà¯à®•à¯à®•௠நகலெடà¯à®•à¯à®•பà¯à®ªà®Ÿà¯à®Ÿà®¤à¯" - }, - "copyButton": { - "message": " நகல௠" - }, - "copyPrivateKey": { - "message": "இத௠உஙà¯à®•ள௠தனிபà¯à®ªà®Ÿà¯à®Ÿ விசை (நகலெடà¯à®•à¯à®• கிளிக௠செயà¯à®¯à®µà¯à®®à¯)" - }, - "create": { - "message": "உரà¯à®µà®¾à®•à¯à®•வà¯à®®à¯" - }, - "createAccount": { - "message": "உஙà¯à®•ள௠கணகà¯à®•ை தà¯à®µà®™à¯à®•à¯à®™à¯à®•ளà¯" - }, - "createDen": { - "message": "உரà¯à®µà®¾à®•à¯à®•வà¯à®®à¯" - }, - "crypto": { - "message": "கிரிபà¯à®Ÿà¯‹", - "description": "பரிமாறà¯à®± வகை (கிரிபà¯à®Ÿà¯‹à®šà¯à®°à¯à®°à¯†à®©à¯à®šà®¿à®¸à¯)" - }, - "currentConversion": { - "message": "தறà¯à®ªà¯‹à®¤à¯ˆà®¯ மாறà¯à®±à®®à¯" - }, - "currentNetwork": { - "message": "தறà¯à®ªà¯‹à®¤à¯ˆà®¯ நெடà¯à®µà¯Šà®°à¯à®•à¯" - }, - "customGas": { - "message": "எரிவாயà¯à®µà¯ˆà®¤à¯ தனிபà¯à®ªà®¯à®©à®¾à®•à¯à®•à¯à®™à¯à®•ளà¯" - }, - "customToken": { - "message": "தனிபà¯à®ªà®¯à®©à¯ டோகà¯à®•னà¯" - }, - "customize": { - "message": "தனிபà¯à®ªà®¯à®©à®¾à®•à¯à®•லாமà¯" - }, - "customRPC": { - "message": "விரà¯à®ªà¯à®ª RPC à®" - }, - "decimalsMustZerotoTen": { - "message": "தசமஙà¯à®•ள௠கà¯à®±à¯ˆà®¨à¯à®¤à®ªà®Ÿà¯à®šà®®à¯ 0, மறà¯à®±à¯à®®à¯ 36 கà¯à®•௠மேல௠இரà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯." - }, - "decimal": { - "message": "தà¯à®²à¯à®²à®¿à®¯à®¤à¯à®¤à®¿à®©à¯ à®®à¯à®Ÿà®¿à®µà¯" - }, - "defaultNetwork": { - "message": "எதிர௠பரிவரà¯à®¤à¯à®¤à®©à¯ˆà®•ளà¯à®•à¯à®•ான à®®à¯à®©à¯à®©à®¿à®°à¯à®ªà¯à®ªà¯ வலையமைபà¯à®ªà¯ à®®à¯à®¤à®©à¯à®®à¯ˆ நிகரமாகà¯à®®à¯." - }, - "denExplainer": { - "message": "உஙà¯à®•ள௠DEN எனà¯à®ªà®¤à¯ உஙà¯à®•ள௠கடவà¯à®šà¯à®šà¯Šà®²à¯-மறைகà¯à®±à®¿à®¯à®¾à®•à¯à®•பà¯à®ªà®Ÿà¯à®Ÿ சேமிபà¯à®ªà®•ம௠மெடà¯à®Ÿà®¾à®®à®¾à®¸à¯à®•à¯à®•ிறà¯à®•à¯à®³à¯." - }, - "deposit": { - "message": "வைபà¯à®ªà¯à®¤à¯à®¤à¯†à®¾à®•ை" - }, - "depositBTC": { - "message": "கீழே உஙà¯à®•ள௠மà¯à®•வரிகà¯à®•௠உஙà¯à®•ள௠BTC வைபà¯à®ªà¯‹à®®à¯:" - }, - "depositEth": { - "message": "வைபà¯à®ªà¯à®¤à¯à®¤à¯†à®¾à®•ை எத௠" - }, - "depositEther": { - "message": "வைபà¯à®ªà¯à®¤à¯à®¤à¯†à®¾à®•ை எதிர௠" - }, - "depositFiat": { - "message": "ஃபியட௠உடன௠வைபà¯à®ªà¯" - }, - "depositFromAccount": { - "message": "மறà¯à®±à¯Šà®°à¯ கணகà¯à®•ிலிரà¯à®¨à¯à®¤à¯ வைபà¯à®ªà¯" - }, - "depositShapeShift": { - "message": "ShapeShift உடன௠வைபà¯à®ªà¯" - }, - "depositShapeShiftExplainer": { - "message": "நீஙà¯à®•ள௠மறà¯à®± கிரிபà¯à®Ÿà¯‹à®•ிராரனà¯à®•ள௠சொநà¯à®¤à®®à®¾à®• வைதà¯à®¤à®¿à®°à¯à®¨à¯à®¤à®¾à®²à¯, உஙà¯à®•ள௠மெடà¯à®Ÿà®¾à®®à®¾à®¸à¯à®•௠பணபà¯à®ªà¯ˆà®¯à®¿à®²à¯ நேரடியாக ஈதரை வரà¯à®¤à¯à®¤à®•ம௠செயà¯à®¯à®²à®¾à®®à¯ மறà¯à®±à¯à®®à¯ வைபà¯à®ªà¯ செயà¯à®¯à®²à®¾à®®à¯. கணகà¯à®•௠தேவையிலà¯à®²à¯ˆ." - }, - "details": { - "message": "விவரஙà¯à®•ளà¯" - }, - "directDeposit": { - "message": "நேரடி வைபà¯à®ªà¯" - }, - "directDepositEther": { - "message": "நேரடியாக வைபà¯à®ªà¯à®¤à¯à®¤à¯Šà®•ை" - }, - "directDepositEtherExplainer": { - "message": "நீஙà¯à®•ள௠à®à®±à¯à®•னவே à®à®¤à¯†à®°à¯ இரà¯à®¨à¯à®¤à®¾à®²à¯, நேரடி வைபà¯à®ªà¯ மூலம௠உஙà¯à®•ள௠பà¯à®¤à®¿à®¯ பணபà¯à®ªà¯ˆà®¯à®¿à®²à¯ ஈதà¯à®¤à®°à¯ பெற விரைவான வழி." - }, - "done": { - "message": "à®®à¯à®Ÿà®¿à®¨à¯à®¤à®¤à¯" - }, - "downloadStateLogs": { - "message": "மாநில பதிவà¯à®•ள௠பதிவிறகà¯à®•" - }, - "dropped": { - "message": "நீகà¯à®•பà¯à®ªà®Ÿà¯à®Ÿà®¾à®°à¯" - }, - "edit": { - "message": "தொகà¯" - }, - "editAccountName": { - "message": "கணகà¯à®•௠பெயரை மாறà¯à®±à¯à®•" - }, - "emailUs": { - "message": "எஙà¯à®•ளà¯à®•à¯à®•௠மினà¯à®©à®žà¯à®šà®²à¯!" - }, - "encryptNewDen": { - "message": "உஙà¯à®•ள௠பà¯à®¤à®¿à®¯ DEN ஠கà¯à®±à®¿à®¯à®¾à®•à¯à®•à¯à®•" - }, - "enterPassword": { - "message": "கடவà¯à®šà¯à®šà¯†à®¾à®²à¯à®²à¯ˆ உளà¯à®³à®¿à®Ÿà®µà¯à®®à¯" - }, - "enterPasswordConfirm": { - "message": "உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤ உஙà¯à®•ள௠கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ உளà¯à®³à®¿à®Ÿà®µà¯à®®à¯" - }, - "passwordNotLongEnough": { - "message": "கடவà¯à®šà¯à®šà¯Šà®²à¯ போதாதà¯" - }, - "passwordsDontMatch": { - "message": "கடவà¯à®šà¯à®šà¯Šà®±à¯à®•ள௠பொரà¯à®¨à¯à®¤à®¾à®¤à¯‡" - }, - "etherscanView": { - "message": "Etherscan கணகà¯à®•ைப௠பாரà¯à®•à¯à®•வà¯à®®à¯" - }, - "exchangeRate": { - "message": "மாறà¯à®±à¯ விகிதமà¯" - }, - "exportPrivateKey": { - "message": "தனியார௠விசை à® à®à®±à¯à®±à¯à®®à®¤à®¿ செயà¯à®•" - }, - "exportPrivateKeyWarning": { - "message": "தனிபà¯à®ªà®Ÿà¯à®Ÿ விசைகளை உஙà¯à®•ள௠சொநà¯à®¤ ஆபதà¯à®¤à®¿à®²à¯ à®à®±à¯à®±à¯à®®à®¤à®¿ செயà¯à®¯à¯à®™à¯à®•ளà¯." - }, - "failed": { - "message": "தோலà¯à®µà®¿" - }, - "fiat": { - "message": "FIAT", - "description": "பரிமாறà¯à®± வகை" - }, - "fileImportFail": { - "message": "கோபà¯à®ªà¯ இறகà¯à®•à¯à®®à®¤à®¿ வேலை செயà¯à®¯à®µà®¿à®²à¯à®²à¯ˆà®¯à®¾? இஙà¯à®•ே கிளிக௠செயà¯à®¯à®µà¯à®®à¯!", - "description": "JSON கோபà¯à®ªà®¿à®²à¯ பயனர௠கணகà¯à®•ை தஙà¯à®•ள௠கணகà¯à®•ை இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®¯ உதவà¯à®•ிறதà¯" - }, - "followTwitter": { - "message": "Twitter இல௠எஙà¯à®•ளைப௠பினà¯à®¤à¯Šà®Ÿà®°à®µà¯à®®à¯" - }, - "from": { - "message": "இரà¯à®¨à¯à®¤à¯" - }, - "fromToSame": { - "message": "இரà¯à®¨à¯à®¤à¯ மறà¯à®±à¯à®®à¯ à®®à¯à®•வரி அதே இரà¯à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯" - }, - "fromShapeShift": { - "message": "ShapeShift இலிரà¯à®¨à¯à®¤à¯" - }, - "gas": { - "message": "எரிவாயà¯", - "description": "எரிவாய௠விலை கà¯à®±à¯ˆà®¯à¯à®®à¯" - }, - "gasFee": { - "message": "எரிவாய௠கடà¯à®Ÿà®£à®®à¯" - }, - "gasLimit": { - "message": "எரிவாய௠வரமà¯à®ªà¯" - }, - "gasLimitCalculation": { - "message": "நெடà¯à®µà¯Šà®°à¯à®•௠வெறà¯à®±à®¿ விகிதஙà¯à®•ளின௠அடிபà¯à®ªà®Ÿà¯ˆà®¯à®¿à®²à¯ பரிநà¯à®¤à¯à®°à¯ˆà®•à¯à®•பà¯à®ªà®Ÿà¯à®Ÿ எரிவாய௠வரமà¯à®ªà¯ˆ நாஙà¯à®•ள௠கணகà¯à®•ிடà¯à®•ிறோமà¯." - }, - "gasLimitRequired": { - "message": "எரிவாய௠வரமà¯à®ªà¯ தேவை" - }, - "gasLimitTooLow": { - "message": "எரிவாய௠வரமà¯à®ªà¯ கà¯à®±à¯ˆà®¨à¯à®¤à®¤à¯ 21000 ஆக இரà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯" - }, - "generatingSeed": { - "message": "விதை உரà¯à®µà®¾à®•à¯à®•à¯à®•ிறத௠..." - }, - "gasPrice": { - "message": "எரிவாய௠விலை (GWEI)" - }, - "gasPriceCalculation": { - "message": "நெடà¯à®µà¯Šà®°à¯à®•௠வெறà¯à®±à®¿ விகிதஙà¯à®•ளின௠அடிபà¯à®ªà®Ÿà¯ˆà®¯à®¿à®²à¯ பரிநà¯à®¤à¯à®°à¯ˆà®•à¯à®•பà¯à®ªà®Ÿà¯à®Ÿ எரிவாய௠விலைகளை நாஙà¯à®•ள௠கணகà¯à®•ிடà¯à®•ிறோமà¯." - }, - "gasPriceRequired": { - "message": "எரிவாய௠விலை தேவைபà¯à®ªà®Ÿà¯à®•ிறதà¯" - }, - "getEther": { - "message": "ஈதà¯à®¤à®°à¯ கிடைகà¯à®•à¯à®®à¯" - }, - "getEtherFromFaucet": { - "message": "$ 1 கà¯à®•௠ஒர௠கà¯à®´à®¾à®¯à¯ இரà¯à®¨à¯à®¤à¯ ஈதர௠கிடைகà¯à®•à¯à®®à¯$1", - "description": "ஈதà¯à®¤à®°à¯ கà¯à®´à®¾à®¯à¯ à®à®¨à¯à®¤à¯ பிணைய பெயர௠காடà¯à®Ÿà¯à®•ிறதà¯" - }, - "greaterThanMin": { - "message": "$ 1 கà¯à®•à¯à®®à¯ அதிகமாகவோ அலà¯à®²à®¤à¯ சமமாகவோ இரà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯", - "description": "ஹெகà¯à®¸à¯ உளà¯à®³à¯€à®Ÿà¯ தசம உளà¯à®³à¯€à®Ÿà¯ என உதவி" - }, - "here": { - "message": "இஙà¯à®•ே", - "description": "இஙà¯à®•ே-கிளிக௠செயà¯à®¯à®µà¯à®®à¯- மேலà¯à®®à¯ தகவலà¯à®•à¯à®•௠(troubleTokenBalances செலà¯à®•ிறதà¯)" - }, - "hereList": { - "message": "இஙà¯à®•ே ஒர௠படà¯à®Ÿà®¿à®¯à®²à¯ !!!!" - }, - "hide": { - "message": "மறை" - }, - "hideToken": { - "message": "டோகà¯à®•னை மறை" - }, - "hideTokenPrompt": { - "message": "டோகà¯à®•னை மறை?" - }, - "howToDeposit": { - "message": "எபà¯à®ªà®Ÿà®¿ ஈதà¯à®¤à®°à¯ வைபà¯à®ªà®¤à¯?" - }, - "holdEther": { - "message": "இத௠நீஙà¯à®•ள௠ஈதà¯à®¤à®°à¯ மறà¯à®±à¯à®®à¯ டோகà¯à®•னà¯à®•ளை வைதà¯à®¤à®¿à®°à¯à®•à¯à®• உதவà¯à®•ிறதà¯, மறà¯à®±à¯à®®à¯ பரவலாகà¯à®•பà¯à®ªà®Ÿà¯à®Ÿ பயனà¯à®ªà®¾à®Ÿà¯à®•ளà¯à®•à¯à®•௠உஙà¯à®•ள௠பாலமாக செயலà¯à®ªà®Ÿà¯à®•ிறதà¯." - }, - "import": { - "message": "இறகà¯à®•à¯à®®à®¤à®¿", - "description": "தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯à®•à¯à®•பà¯à®ªà®Ÿà¯à®Ÿ கோபà¯à®ªà®¿à®²à®¿à®°à¯à®¨à¯à®¤à¯ ஒர௠கணகà¯à®•ை இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®¯ பொதà¯à®¤à®¾à®©à¯ˆ à®…à®´à¯à®¤à¯à®¤à®µà¯à®®à¯" - }, - "importAccount": { - "message": "கணகà¯à®•ை இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®•" - }, - "importAccountMsg": { - "message": " இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ கணகà¯à®•௠உஙà¯à®•ள௠மà¯à®¤à®²à®¿à®²à¯ உரà¯à®µà®¾à®•à¯à®•பà¯à®ªà®Ÿà¯à®Ÿ மெடà¯à®Ÿà®¾à®®à®¾à®¸à¯à®•௠கணகà¯à®•௠விதை மூலம௠தொடரà¯à®ªà¯à®Ÿà¯ˆà®¯à®¤à®¾à®• இரà¯à®•à¯à®•ாதà¯. இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ கணகà¯à®•à¯à®•ள௠பறà¯à®±à®¿ மேலà¯à®®à¯ அறிக " - }, - "importAnAccount": { - "message": "ஒர௠கணகà¯à®•ை இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®•" - }, - "importDen": { - "message": "இறகà¯à®•à¯à®®à®¤à®¿ DEN இறகà¯à®•à¯à®®à®¤à®¿" - }, - "imported": { - "message": "இறகà¯à®•à¯à®®à®¤à®¿", - "description": "ஒர௠கணகà¯à®•௠மà¯à®´à¯à®®à¯ˆà®¯à®¾à®• விசைபà¯à®ªà®²à®•ையில௠à®à®±à¯à®±à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ˆà®•௠காடà¯à®Ÿà¯à®•ிறதà¯" - }, - "infoHelp": { - "message": "தகவல௠மறà¯à®±à¯à®®à¯ உதவி" - }, - "insufficientFunds": { - "message": "போதà¯à®®à®¾à®© பணம௠இலà¯à®²à¯ˆ." - }, - "insufficientTokens": { - "message": "போதà¯à®®à®¾à®© டோகà¯à®•னà¯à®•ளà¯." - }, - "invalidAddress": { - "message": "தவறான à®®à¯à®•வரி" - }, - "invalidAddressRecipient": { - "message": "பெறà¯à®¨à®°à¯ à®®à¯à®•வரி தவறானதà¯" - }, - "invalidGasParams": { - "message": "தவறான எரிவாய௠அளவà¯à®°à¯à®•à¯à®•ளà¯" - }, - "invalidInput": { - "message": "தவறான உளà¯à®³à¯€à®Ÿà¯.." - }, - "invalidRequest": { - "message": "தவறான கோரிகà¯à®•ை" - }, - "invalidRPC": { - "message": "தவறான RPC URI" - }, - "jsonFail": { - "message": "à®à®¤à¯‡à®¾ தவற௠நடநà¯à®¤à¯à®µà®¿à®Ÿà¯à®Ÿà®¤à¯. உஙà¯à®•ள௠JSON கோபà¯à®ªà¯ à®’à®´à¯à®™à¯à®•ாக வடிவமைகà¯à®•பà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯ எனà¯à®ªà®¤à¯ˆ உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®µà¯à®®à¯" - }, - "jsonFile": { - "message": "JSON கோபà¯à®ªà¯", - "description": "ஒர௠கணகà¯à®•ை இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®¯ வடிவமைகà¯à®•பà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯" - }, - "keepTrackTokens": { - "message": "உஙà¯à®•ள௠மேடமஸà¯à®•௠கணகà¯à®•à¯à®Ÿà®©à¯ நீஙà¯à®•ள௠வாஙà¯à®•ிய டோகà¯à®•னà¯à®•ளை கணà¯à®•ாணியà¯à®™à¯à®•ளà¯." - }, - "kovan": { - "message": "கோவன௠டெஸà¯à®Ÿà¯ நெடà¯à®µà¯Šà®°à¯à®•à¯" - }, - "knowledgeDataBase": { - "message": "எஙà¯à®•ள௠அறிவà¯à®¤à¯ தளதà¯à®¤à¯ˆà®ªà¯ பாரà¯à®µà¯ˆà®¯à®¿à®Ÿà®µà¯à®®à¯" - }, - "max": { - "message": "மேகà¯à®¸à¯" - }, - "learnMore": { - "message": "மேலà¯à®®à¯ அறிக" - }, - "lessThanMax": { - "message": "$ 1 கà¯à®•à¯à®®à¯ கà¯à®±à¯ˆà®µà®¾à®•வோ அலà¯à®²à®¤à¯ சமமாகவோ இரà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯.", - "description": "ஹெகà¯à®¸à¯ உளà¯à®³à¯€à®Ÿà¯ தசம உளà¯à®³à¯€à®Ÿà¯ என உதவி" - }, - "likeToAddTokens": { - "message": "இநà¯à®¤ டோகà¯à®•னà¯à®•ளைச௠சேரà¯à®•à¯à®• விரà¯à®®à¯à®ªà¯à®•ிறீரà¯à®•ளா?" - }, - "links": { - "message": "இணைபà¯à®ªà¯à®•ளà¯" - }, - "limit": { - "message": "அளவà¯" - }, - "loading": { - "message": "à®à®±à¯à®±à¯à®¤à®²à¯ ..." - }, - "loadingTokens": { - "message": "டோகà¯à®•னà¯à®•ளை à®à®±à¯à®±à¯à®•ிறத௠..." - }, - "localhost": { - "message": "லோகà¯à®•ல௠ஹோஸà¯à®Ÿà¯ 8545" - }, - "login": { - "message": "உள௠நà¯à®´à¯ˆ" - }, - "logout": { - "message": "வெளியேறà¯" - }, - "loose": { - "message": "லூஸà¯" - }, - "loweCaseWords": { - "message": "விதை வாரà¯à®¤à¯à®¤à¯ˆà®•ள௠ஸà¯à®®à®¾à®²à¯ எழà¯à®¤à¯à®¤à¯à®•ள௠மடà¯à®Ÿà¯à®®à¯‡" - }, - "mainnet": { - "message": "à®®à¯à®¤à®©à¯à®®à¯ˆ எதெரியà¯à®®à¯ நெடà¯à®µà¯Šà®°à¯à®•à¯" - }, - "message": { - "message": "செயà¯à®¤à®¿" - }, - "metamaskDescription": { - "message": "மேடமஸà¯à®•௠எனà¯à®ªà®¤à¯ ஒர௠பாதà¯à®•ாபà¯à®ªà®¾à®© அடையாள வாலà¯à®Ÿà¯ எதெரியà¯à®®à¯" - }, - "min": { - "message": "கà¯à®±à¯ˆà®¨à¯à®¤à®ªà®Ÿà¯à®š" - }, - "myAccounts": { - "message": "எனத௠கணகà¯à®•à¯à®•ளà¯" - }, - "mustSelectOne": { - "message": "கà¯à®±à¯ˆà®¨à¯à®¤à®¤à¯ 1 டோகà¯à®•னை தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯." - }, - "needEtherInWallet": { - "message": "மேடமஸà¯à®•௠஠பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿ பரவலாகà¯à®•பà¯à®ªà®Ÿà¯à®Ÿ பயனà¯à®ªà®¾à®Ÿà¯à®•ளà¯à®Ÿà®©à¯ தொடரà¯à®ªà¯ கொளà¯à®³, உஙà¯à®•ள௠பணபà¯à®ªà®°à®¿à®®à®¾à®±à¯à®±à®¤à¯à®¤à®¿à®²à¯ ஈதர௠தேவை." - }, - "needImportFile": { - "message": "இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®¯ ஒர௠கோபà¯à®ªà¯ˆ நீஙà¯à®•ள௠தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯.", - "description": "பயனர௠ஒர௠கணகà¯à®•௠மà¯à®•à¯à®•ியம௠மறà¯à®±à¯à®®à¯ தொடர ஒர௠கோபà¯à®ªà¯ சேரà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯" - }, - "needImportPassword": { - "message": "நீஙà¯à®•ள௠தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯à®¤à¯à®¤ கோபà¯à®ªà¯à®•à¯à®•௠ஒர௠கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ உளà¯à®³à®¿à®Ÿ வேணà¯à®Ÿà¯à®®à¯.", - "description": "ஒர௠கணகà¯à®•ை இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®¯ கடவà¯à®šà¯à®šà¯Šà®²à¯ மறà¯à®±à¯à®®à¯ கோபà¯à®ªà¯ தேவை" - }, - "negativeETH": { - "message": "ETH எதிரà¯à®®à®±à¯ˆ அளவà¯à®•ளை அனà¯à®ªà¯à®ª à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯." - }, - "networks": { - "message": "நெடà¯à®µà¯†à®¾à®°à¯à®•à¯à®¸à¯" - }, - "newAccount": { - "message": "பà¯à®¤à®¿à®¯ கணகà¯à®•à¯" - }, - "newAccountNumberName": { - "message": "கணகà¯à®•௠$ 1", - "description": "கணகà¯à®•௠கணகà¯à®•ை உரà¯à®µà®¾à®•à¯à®•à¯à®µà®¤à®±à¯à®•௠அடà¯à®¤à¯à®¤ கணகà¯à®•ின௠இயலà¯à®ªà¯à®¨à®¿à®²à¯ˆ பெயர௠உரà¯à®µà®¾à®•à¯à®•பà¯à®ªà®Ÿà¯à®®à¯" - }, - "newContract": { - "message": "பà¯à®¤à®¿à®¯ ஒபà¯à®ªà®¨à¯à®¤à®®à¯" - }, - "newPassword": { - "message": "பà¯à®¤à®¿à®¯ கடவà¯à®šà¯à®šà¯Šà®²à¯ (min 8 எழà¯à®¤à¯à®¤à¯à®•ளà¯)" - }, - "newRecipient": { - "message": "பà¯à®¤à®¿à®¯ பெறà¯à®¨à®°à¯" - }, - "newRPC": { - "message": "பà¯à®¤à®¿à®¯ RPC URL" - }, - "next": { - "message": "அடà¯à®¤à¯à®¤" - }, - "noAddressForName": { - "message": "இநà¯à®¤ பெயரà¯à®•à¯à®•ான à®®à¯à®•வரி அமைகà¯à®•பà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ." - }, - "noDeposits": { - "message": "எநà¯à®¤ வைபà¯à®ªà¯à®•ளà¯à®®à¯ கிடைகà¯à®•விலà¯à®²à¯ˆ" - }, - "noTransactionHistory": { - "message": "பரிவரà¯à®¤à¯à®¤à®©à¯ˆ வரலாற௠இலà¯à®²à¯ˆ." - }, - "noTransactions": { - "message": "பரிவரà¯à®¤à¯à®¤à®©à¯ˆà®•ள௠இலà¯à®²à¯ˆ" - }, - "notStarted": { - "message": "தà¯à®µà®™à¯à®•விலà¯à®²à¯ˆ" - }, - "oldUI": { - "message": "பழைய UI" - }, - "oldUIMessage": { - "message": "நீஙà¯à®•ள௠பழைய UI கà¯à®•௠திரà¯à®®à¯à®ªà®¿à®¯à¯à®³à¯à®³à¯€à®°à¯à®•ளà¯. மேல௠வலத௠கீழà¯à®¤à¯‹à®©à¯à®±à¯à®®à¯ மெனà¯à®µà®¿à®²à¯ உளà¯à®³ விரà¯à®ªà¯à®ªà®¤à¯à®¤à®¿à®©à¯ மூலம௠பà¯à®¤à®¿à®¯ UI ஠மீணà¯à®Ÿà¯à®®à¯ மாறலாமà¯." - }, - "or": { - "message": "அலà¯à®²à®¤à¯", - "description": "ஒர௠பà¯à®¤à®¿à®¯ கணகà¯à®•ை உரà¯à®µà®¾à®•à¯à®• அலà¯à®²à®¤à¯ இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®µà®¤à®±à¯à®•௠இடையே தேரà¯à®µà¯" - }, - "passwordCorrect": { - "message": "தயவà¯à®šà¯†à®¯à¯à®¤à¯ உஙà¯à®•ள௠கடவà¯à®šà¯à®šà¯Šà®²à¯ சரியானதா என உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®µà¯à®®à¯." - }, - "passwordMismatch": { - "message": "கடவà¯à®šà¯à®šà¯Šà®±à¯à®•ள௠பொரà¯à®¨à¯à®¤à®µà®¿à®²à¯à®²à¯ˆ", - "description": "கடவà¯à®šà¯à®šà¯Šà®²à¯ உரà¯à®µà®¾à®•à¯à®•தà¯à®¤à®¿à®²à¯, இரணà¯à®Ÿà¯ பà¯à®¤à®¿à®¯ கடவà¯à®šà¯à®šà¯Šà®²à¯ பà¯à®²à®™à¯à®•ள௠பொரà¯à®¨à¯à®¤à®µà®¿à®²à¯à®²à¯ˆ" - }, - "passwordShort": { - "message": "கடவà¯à®šà¯à®šà¯Šà®²à¯ நீணà¯à®Ÿ காலமாக இலà¯à®²à¯ˆ", - "description": "கடவà¯à®šà¯à®šà¯Šà®²à¯ உரà¯à®µà®¾à®•à¯à®•தà¯à®¤à®¿à®²à¯, பாதà¯à®•ாபà¯à®ªà®¾à®©à®¤à®¾à®• இரà¯à®•à¯à®•à¯à®®à¯ கடவà¯à®šà¯à®šà¯Šà®²à¯ போதà¯à®®à¯" - }, - "pastePrivateKey": { - "message": "இஙà¯à®•ே உஙà¯à®•ள௠தனிபà¯à®ªà®Ÿà¯à®Ÿ விசை சரதà¯à®¤à¯ˆ ஒடà¯à®Ÿà¯à®•:", - "description": "ஒர௠தனிபà¯à®ªà®Ÿà¯à®Ÿ விசை ஒர௠கணகà¯à®•ை இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®¯" - }, - "pasteSeed": { - "message": "இஙà¯à®•ே உஙà¯à®•ள௠விதை சொறà¯à®±à¯Šà®Ÿà®°à¯ˆ ஒடà¯à®Ÿà®µà¯à®®à¯!" - }, - "personalAddressDetected": { - "message": "தனிபà¯à®ªà®Ÿà¯à®Ÿ à®®à¯à®•வரி கணà¯à®Ÿà®±à®¿à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯. டோகà¯à®•ன௠ஒபà¯à®ªà®¨à¯à®¤ à®®à¯à®•வரியை உளà¯à®³à®¿à®Ÿà®µà¯à®®à¯." - }, - "pleaseReviewTransaction": { - "message": "உஙà¯à®•ள௠பரிவரà¯à®¤à¯à®¤à®©à¯ˆ மதிபà¯à®ªà®¾à®¯à¯à®µà¯ செயà¯à®¯à®µà¯à®®à¯." - }, - "popularTokens": { - "message": "பிரபலமான டோகà¯à®•னà¯à®•ளà¯" - }, - "privacyMsg": { - "message": "தனியà¯à®°à®¿à®®à¯ˆ கொளà¯à®•ை" - }, - "privateKey": { - "message": "தனிபà¯à®ªà®Ÿà¯à®Ÿ விசை", - "description": "ஒர௠கணகà¯à®•ை இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤ இநà¯à®¤ வகை கோபà¯à®ªà¯ˆ தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯à®•à¯à®•வà¯à®®à¯" - }, - "privateKeyWarning": { - "message": "எசà¯à®šà®°à®¿à®•à¯à®•ை: இநà¯à®¤ விசையை எபà¯à®ªà¯‹à®¤à¯à®®à¯ வெளியிட வேணà¯à®Ÿà®¾à®®à¯. உஙà¯à®•ள௠தனிபà¯à®ªà®Ÿà¯à®Ÿ விசைகளைக௠கொணà¯à®Ÿ எவரà¯à®®à¯ உஙà¯à®•ள௠கணகà¯à®•ில௠உளà¯à®³ எநà¯à®¤ சொதà¯à®¤à¯à®•à¯à®•ளையà¯à®®à¯ திரà¯à®Ÿà®²à®¾à®®à¯." - }, - "privateNetwork": { - "message": "தனியார௠நெடà¯à®µà¯Šà®°à¯à®•à¯" - }, - "qrCode": { - "message": "QR கà¯à®±à®¿à®¯à¯€à®Ÿà¯à®Ÿà¯ˆà®•௠காடà¯à®Ÿà¯" - }, - "readdToken": { - "message": "உஙà¯à®•ள௠கணகà¯à®•௠விரà¯à®ªà¯à®ªà®™à¯à®•ள௠மெனà¯à®µà®¿à®²à¯ \"டோகà¯à®•னைச௠சேரà¯\" எனà¯à®ªà®¤à®©à¯ மூலம௠நீஙà¯à®•ள௠எதிரà¯à®•ாலதà¯à®¤à®¿à®²à¯ இநà¯à®¤ டோகà¯à®•னை மீணà¯à®Ÿà¯à®®à¯ சேரà¯à®•à¯à®•லாமà¯." - }, - "readMore": { - "message": "மேலà¯à®®à¯ வாசிகà¯à®• இஙà¯à®•ே." - }, - "readMore2": { - "message": "மேலà¯à®®à¯ வாசிகà¯à®•." - }, - "receive": { - "message": "பெறà¯à®•" - }, - "recipientAddress": { - "message": "பெறà¯à®¨à®°à¯ à®®à¯à®•வரி" - }, - "refundAddress": { - "message": "உஙà¯à®•ள௠பணதà¯à®¤à¯ˆ திரà¯à®ªà¯à®ªà®¿ அனà¯à®ªà¯à®ªà¯à®®à¯ à®®à¯à®•வரி" - }, - "rejected": { - "message": "நிராகரிகà¯à®•பà¯à®ªà®Ÿà¯à®Ÿà®¤à¯" - }, - "resetAccount": { - "message": "கணகà¯à®•ை மீடà¯à®Ÿà®®à¯ˆ" - }, - "restoreFromSeed": { - "message": "விதை வாகà¯à®•ியதà¯à®¤à®¿à®²à®¿à®°à¯à®¨à¯à®¤à¯ மீடà¯à®•வà¯à®®à¯" - }, - "restoreVault": { - "message": "வாலà¯à®Ÿà¯ மீடà¯à®•வà¯à®®à¯" - }, - "required": { - "message": "தேவையான" - }, - "retryWithMoreGas": { - "message": "இஙà¯à®•ே அதிக எரிவாய௠விலை மீணà¯à®Ÿà¯à®®à¯ à®®à¯à®¯à®±à¯à®šà®¿à®•à¯à®•வà¯à®®à¯" - }, - "walletSeed": { - "message": "வாலà¯à®Ÿà¯ விதை" - }, - "revealSeedWords": { - "message": "விதை வாரà¯à®¤à¯à®¤à¯ˆà®•ள௠வெளிபà¯à®ªà®Ÿà¯à®¤à¯à®¤" - }, - "revealSeedWordsWarning": { - "message": "உஙà¯à®•ள௠விதை வாரà¯à®¤à¯à®¤à¯ˆà®•ள௠ஒர௠பொத௠இடதà¯à®¤à®¿à®²à¯ மீடà¯à®• வேணà¯à®Ÿà®¾à®®à¯! உஙà¯à®•ள௠எலà¯à®²à®¾ கணகà¯à®•à¯à®•ளையà¯à®®à¯ திரà¯à®Ÿ இநà¯à®¤ வாரà¯à®¤à¯à®¤à¯ˆà®•ள௠பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà®²à®¾à®®à¯." - }, - "revert": { - "message": "மாறà¯à®±à®¿à®¯à®®à¯ˆ" - }, - "rinkeby": { - "message": "ரிஙà¯à®•ெபà¯à®¯ டெஸà¯à®Ÿà¯ நெடà¯à®µà¯Šà®°à¯à®•à¯" - }, - "ropsten": { - "message": "ரொபà¯à®¸à¯à®Ÿà¯†à®©à¯ டெஸà¯à®Ÿà¯ நெடà¯à®µà¯Šà®°à¯à®•à¯" - }, - "currentRpc": { - "message": "தறà¯à®ªà¯‹à®¤à¯ˆà®¯ RPC" - }, - "connectingToMainnet": { - "message": "à®®à¯à®•à¯à®•ிய எதெரியà¯à®®à¯ நெடà¯à®µà¯Šà®°à¯à®•௠இணைகà¯à®•à¯à®®à¯" - }, - "connectingToRopsten": { - "message": "ரொபà¯à®¸à¯à®Ÿà¯†à®©à¯ டெஸà¯à®Ÿà¯ நெடà¯à®µà¯Šà®°à¯à®•à¯à®•à¯à®Ÿà®©à¯ இணைகà¯à®•ிறதà¯" - }, - "connectingToKovan": { - "message": "கோவன௠டெஸà¯à®Ÿà¯ நெடà¯à®µà¯Šà®°à¯à®•à¯à®•à¯à®Ÿà®©à¯ இணைதà¯à®¤à®²à¯" - }, - "connectingToRinkeby": { - "message": "ரிஙà¯à®•ெபà¯à®¯ டெஸà¯à®Ÿà¯ நெடà¯à®µà¯Šà®°à¯à®•à¯à®•à¯à®Ÿà®©à¯ இணைகà¯à®•ிறதà¯" - }, - "connectingToUnknown": { - "message": "தெரியாத நெடà¯à®µà¯Šà®°à¯à®•à¯à®•à¯à®Ÿà®©à¯ இணைகà¯à®•ிறதà¯" - }, - "sampleAccountName": { - "message": "உதாரணமாக எனத௠பà¯à®¤à®¿à®¯ கணகà¯à®•à¯", - "description": "தஙà¯à®•ள௠கணகà¯à®•ில௠மனிதர௠படிகà¯à®•கà¯à®•ூடிய பெயரைச௠சேரà¯à®•à¯à®•à¯à®®à¯ கரà¯à®¤à¯à®¤à¯ˆ பயனர௠பà¯à®°à®¿à®¨à¯à®¤à¯ கொளà¯à®³ உதவà¯à®™à¯à®•ளà¯" - }, - "save": { - "message": "சேமி" - }, - "reprice_title": { - "message": "ரெபà¯à®°à®¿à®¸à¯ பரிவரà¯à®¤à¯à®¤à®©à¯ˆ" - }, - "reprice_subtitle": { - "message": "உஙà¯à®•ள௠பரிவரà¯à®¤à¯à®¤à®©à¯ˆà®•ளை மேலெழà¯à®¤à¯à®®à¯ à®®à¯à®¯à®±à¯à®šà®¿à®¯à¯ˆ அதிகரிகà¯à®• உஙà¯à®•ள௠எரிவாய௠விலையை அதிகரிகà¯à®•வà¯à®®à¯" - }, - "saveAsFile": { - "message": "கோபà¯à®ªà®¾à®• சேமிகà¯à®•வà¯à®®à¯", - "description": "கணகà¯à®•௠à®à®±à¯à®±à¯à®®à®¤à®¿ செயலà¯à®®à¯à®±à¯ˆ" - }, - "saveSeedAsFile": { - "message": "கோபà¯à®ªà¯ என விதை வாரà¯à®¤à¯à®¤à¯ˆà®•ள௠சேமிகà¯à®•வà¯à®®à¯" - }, - "search": { - "message": "தேடலà¯" - }, - "secretPhrase": { - "message": "உஙà¯à®•ள௠பெடà¯à®Ÿà®•தà¯à®¤à¯ˆ மீடà¯à®Ÿà¯†à®Ÿà¯à®ªà¯à®ªà®¤à®±à¯à®•ாக இஙà¯à®•ே உஙà¯à®•ள௠ரகசிய பனà¯à®©à®¿à®°à®£à¯à®Ÿà¯ வாரà¯à®¤à¯à®¤à¯ˆ சொறà¯à®±à¯Šà®Ÿà®°à¯ˆ உளà¯à®³à®¿à®Ÿà®µà¯à®®à¯." - }, - "newPassword8Chars": { - "message": "பà¯à®¤à®¿à®¯ கடவà¯à®šà¯à®šà¯Šà®²à¯ (கà¯à®±à¯ˆà®¨à¯à®¤à®ªà®Ÿà¯à®šà®®à¯ 8 எழà¯à®¤à¯à®¤à¯à®•ளà¯)" - }, - "seedPhraseReq": { - "message": "விதை வாகà¯à®•ியஙà¯à®•ள௠12 வாரà¯à®¤à¯à®¤à¯ˆà®•ள௠நீணà¯à®Ÿà®µà¯ˆ" - }, - "select": { - "message": "தேரà¯à®µà¯" - }, - "selectCurrency": { - "message": "நாணயதà¯à®¤à¯ˆà®¤à¯ தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯" - }, - "selectService": { - "message": "சேவை தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯à®•à¯à®•வà¯à®®à¯" - }, - "selectType": { - "message": "வகை தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯" - }, - "send": { - "message": "அனà¯à®ªà¯à®ªà¯" - }, - "sendETH": { - "message": "ETH ஠அனà¯à®ªà¯à®ªà¯" - }, - "sendTokens": { - "message": "டோகà¯à®•னà¯à®•ளை அனà¯à®ªà¯à®ªà®µà¯à®®à¯" - }, - "onlySendToEtherAddress": { - "message": "ETH ஠ஒர௠எதரியà¯à®®à¯ à®®à¯à®•வரிகà¯à®•௠மடà¯à®Ÿà¯à®®à¯ அனà¯à®ªà¯à®ªà®µà¯à®®à¯." - }, - "searchTokens": { - "message": "தேடல௠டோகà¯à®•னà¯à®¸à¯" - }, - "sendTokensAnywhere": { - "message": "யாரà¯à®Ÿà®©à¯à®®à¯ டோகà¯à®•னà¯à®•ளை அனà¯à®ªà¯à®ªà®µà¯à®®à¯ எதெரியà¯à®®à¯ கணகà¯à®•à¯" - }, - "settings": { - "message": "அமைபà¯à®ªà¯à®•ளà¯" - }, - "info": { - "message": "தகவலà¯" - }, - "shapeshiftBuy": { - "message": "Shapeshift உடன௠வாஙà¯à®•வà¯à®®à¯" - }, - "showPrivateKeys": { - "message": "தனிபà¯à®ªà®Ÿà¯à®Ÿ விசைகளைக௠காணà¯à®ªà®¿" - }, - "showQRCode": { - "message": "QR கà¯à®±à®¿à®¯à¯€à®Ÿà¯à®Ÿà¯ˆà®•௠காடà¯à®Ÿà¯" - }, - "sign": { - "message": "உளà¯à®¨à¯à®´à¯ˆ" - }, - "signed": { - "message": "கையொபà¯à®ªà®®à®¿à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿ" - }, - "signMessage": { - "message": "செயà¯à®¤à®¿à®¯à¯ˆ பதிவ௠செயà¯à®•" - }, - "signNotice": { - "message": "இநà¯à®¤ செயà¯à®¤à®¿à®¯à®¿à®²à¯ கையொபà¯à®ªà®®à®¿à®Ÿà®²à®¾à®®à¯ \nஆபதà¯à®¤à®¾à®© பகà¯à®• விளைவà¯à®•ள௠இரà¯à®•à¯à®•லாமà¯. \n உஙà¯à®•ள௠மொதà¯à®¤ கணகà¯à®•ில௠மà¯à®´à¯à®®à¯ˆà®¯à®¾à®• நமà¯à®ªà®•à¯à®•ூடிய தளஙà¯à®•ளில௠செயà¯à®¤à®¿à®•ளை மடà¯à®Ÿà¯à®®à¯‡ கையொபà¯à®ªà®®à®¿à®Ÿà¯à®™à¯à®•ளà¯. \n இநà¯à®¤ ஆபதà¯à®¤à®¾à®© à®®à¯à®±à¯ˆ எதிரà¯à®•ால பதிபà¯à®ªà®¿à®²à¯ அகறà¯à®±à®ªà¯à®ªà®Ÿà¯à®®à¯." - }, - "sigRequest": { - "message": "கையொபà¯à®ªà®®à¯ கோரிகà¯à®•ை" - }, - "sigRequested": { - "message": "கையொபà¯à®ªà®®à¯ கோரபà¯à®ªà®Ÿà¯à®Ÿà®¤à¯" - }, - "spaceBetween": { - "message": "வாரà¯à®¤à¯à®¤à¯ˆà®•ள௠இடையே இடைவெளி மடà¯à®Ÿà¯à®®à¯‡ இரà¯à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à¯à®®à¯" - }, - "status": { - "message": "நிலைமை" - }, - "stateLogs": { - "message": "மாநில பதிவà¯à®•ளà¯" - }, - "stateLogsDescription": { - "message": "மாநில பதிவà¯à®•ள௠உஙà¯à®•ள௠பொத௠கணகà¯à®•௠மà¯à®•வரிகள௠மறà¯à®±à¯à®®à¯ பரிமாறà¯à®±à®™à¯à®•ளை அனà¯à®ªà¯à®ªà®¿à®¯à¯à®³à¯à®³à®©." - }, - "stateLogError": { - "message": "மாநில பதிவà¯à®•ளை மீடà¯à®Ÿà¯†à®Ÿà¯à®ªà¯à®ªà®¤à®¿à®²à¯ பிழை." - }, - "submit": { - "message": "சமரà¯à®ªà¯à®ªà®¿" - }, - "submitted": { - "message": "சமரà¯à®ªà¯à®ªà®¿à®•à¯à®•பà¯à®ªà®Ÿà¯à®Ÿà®¤à¯" - }, - "supportCenter": { - "message": "எஙà¯à®•ள௠ஆதரவ௠மையதà¯à®¤à¯ˆà®ªà¯ பாரà¯à®µà¯ˆà®¯à®¿à®Ÿà®µà¯à®®à¯" - }, - "symbolBetweenZeroTwelve": { - "message": "கà¯à®±à®¿à®¯à¯€à®Ÿà¯ 0 மறà¯à®±à¯à®®à¯ 12 எழà¯à®¤à¯à®¤à¯à®•ளà¯à®•à¯à®•௠இடையில௠இரà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯." - }, - "takesTooLong": { - "message": "நீணà¯à®Ÿ நேரம௠எடà¯à®¤à¯à®¤à¯à®•à¯à®•ொளà¯à®•ிறதà¯?" - }, - "terms": { - "message": "பயனà¯à®ªà®¾à®Ÿà¯à®Ÿà¯ விதிமà¯à®±à¯ˆà®•ளை" - }, - "testFaucet": { - "message": "சோதனை கà¯à®´à®¾à®¯à¯" - }, - "to": { - "message": "பெறà¯à®¨à®°à¯" - }, - "toETHviaShapeShift": { - "message": "$ 1 à®®à¯à®¤à®²à¯ ETH வரை வடிவமà¯", - "description": "செயà¯à®¤à®¿ தொடகà¯à®•தà¯à®¤à®¿à®²à¯ வைபà¯à®ªà¯ வகைகளில௠நிரபà¯à®ªà®ªà¯à®ªà®Ÿà¯à®®à¯" - }, - "tokenAddress": { - "message": "டோகà¯à®•ன௠மà¯à®•வரி" - }, - "tokenAlreadyAdded": { - "message": "டோகà¯à®•ன௠à®à®±à¯à®•னவே சேரà¯à®•à¯à®•பà¯à®ªà®Ÿà¯à®Ÿà®¤à¯." - }, - "tokenBalance": { - "message": "உஙà¯à®•ள௠டோகà¯à®•ன௠இரà¯à®ªà¯à®ªà¯:" - }, - "tokenSelection": { - "message": "டோகà¯à®•னà¯à®•ளைத௠தேட௠அலà¯à®²à®¤à¯ பிரபல டோகà¯à®•னà¯à®•ளின௠படà¯à®Ÿà®¿à®¯à®²à®¿à®²à®¿à®°à¯à®¨à¯à®¤à¯ தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯à®•à¯à®•வà¯à®®à¯." - }, - "tokenSymbol": { - "message": "டோகà¯à®•ன௠சினà¯à®©à®®à¯" - }, - "tokenWarning1": { - "message": "உஙà¯à®•ள௠மேடமஸà¯à®•௠கணகà¯à®•à¯à®Ÿà®©à¯ நீஙà¯à®•ள௠வாஙà¯à®•ிய டோகà¯à®•னà¯à®•ளை கணà¯à®•ாணியà¯à®™à¯à®•ளà¯. வேற௠கணகà¯à®•ைப௠பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿ டோகà¯à®•னà¯à®•ளை வாஙà¯à®•ிவிடà¯à®Ÿà®¾à®²à¯, அநà¯à®¤ டோகà¯à®•னà¯à®•ள௠இஙà¯à®•ே தோனà¯à®±à®¾à®¤à¯." - }, - "total": { - "message": "மொதà¯à®¤" - }, - "transactions": { - "message": "பரிவரà¯à®¤à¯à®¤à®©à¯ˆà®•ளà¯" - }, - "transactionError": { - "message": "பரிவரà¯à®¤à¯à®¤à®©à¯ˆ பிழை. விதிமà¯à®±à¯ˆ ஒபà¯à®ªà®¨à¯à®¤à®¤à¯à®¤à®¿à®²à¯ விதிவிலகà¯à®•à¯." - }, - "transactionMemo": { - "message": "பரிவரà¯à®¤à¯à®¤à®©à¯ˆ கà¯à®±à®¿à®ªà¯à®ªà¯ (விரà¯à®ªà¯à®ªà®®à¯)" - }, - "transactionNumber": { - "message": "பரிவரà¯à®¤à¯à®¤à®©à¯ˆ எணà¯" - }, - "transfers": { - "message": "இடமாறà¯à®±à®™à¯à®•ளà¯" - }, - "troubleTokenBalances": { - "message": "உஙà¯à®•ள௠டோகà¯à®•ன௠நிலà¯à®µà¯ˆà®•ளை à®à®±à¯à®±à¯à®µà®¤à®¿à®²à¯ சிகà¯à®•ல௠à®à®±à¯à®ªà®Ÿà¯à®Ÿà®¤à¯. நீஙà¯à®•ள௠அவரà¯à®•ளை பாரà¯à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à¯à®®à¯.", - "description": "டோகà¯à®•ன௠நிலà¯à®µà¯ˆà®•ளை காண ஒர௠இணைபà¯à®ªà¯ (இஙà¯à®•ே) தொடரà¯à®¨à¯à®¤à¯" - }, - "twelveWords": { - "message": "இநà¯à®¤ 12 வாரà¯à®¤à¯à®¤à¯ˆà®•ள௠உஙà¯à®•ள௠மெடà¯à®Ÿà®¾à®®à®¾à®¸à¯à®•௠கணகà¯à®•ை மீடà¯à®• ஒரே வழி. \n அவறà¯à®±à¯ˆ எஙà¯à®•ாவத௠பாதà¯à®•ாபà¯à®ªà®¾à®•வà¯à®®à¯ ரகசியமாகவà¯à®®à¯ சேமிகà¯à®•வà¯à®®à¯." - }, - "typePassword": { - "message": "உஙà¯à®•ள௠கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ தடà¯à®Ÿà®šà¯à®šà¯ செயà¯à®¯à®µà¯à®®à¯" - }, - "uiWelcome": { - "message": "பà¯à®¤à®¿à®¯ UI (பீடà¯à®Ÿà®¾) கà¯à®•௠வரவேறà¯à®•ிறோமà¯" - }, - "uiWelcomeMessage": { - "message": "இபà¯à®ªà¯‹à®¤à¯ நீஙà¯à®•ள௠பà¯à®¤à®¿à®¯ மெடà¯à®Ÿà®¾à®®à®¾à®¸à¯à®•à¯à®•௠UI ஠பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®•ிறீரà¯à®•ளà¯. சà¯à®±à¯à®±à®¿ பாரà¯à®™à¯à®•ளà¯, டோகà¯à®•னà¯à®•ளை அனà¯à®ªà¯à®ªà¯à®®à¯ பà¯à®¤à®¿à®¯ à®…à®®à¯à®šà®™à¯à®•ளை à®®à¯à®¯à®±à¯à®šà®¿à®•à¯à®•வà¯à®®à¯, உஙà¯à®•ளிடம௠à®à®¤à¯‡à®©à¯à®®à¯ சிகà¯à®•ல௠இரà¯à®¨à¯à®¤à®¾à®²à¯ எஙà¯à®•ளà¯à®•à¯à®•à¯à®¤à¯ தெரியபà¯à®ªà®Ÿà¯à®¤à¯à®¤à®µà¯à®®à¯." - }, - "unapproved": { - "message": "à®…à®™à¯à®•ீகரிகà¯à®•பà¯à®ªà®Ÿà®¾à®¤" - }, - "unavailable": { - "message": "கிடைகà¯à®•விலà¯à®²à¯ˆ" - }, - "unknown": { - "message": "தெரியாத" - }, - "unknownNetwork": { - "message": "அறியபà¯à®ªà®Ÿà®¾à®¤ தனியார௠நெடà¯à®µà¯Šà®°à¯à®•à¯" - }, - "unknownNetworkId": { - "message": "தெரியாத நெடà¯à®µà¯Šà®°à¯à®•௠à®à®Ÿà®¿" - }, - "uriErrorMsg": { - "message": "URI கள௠சரியான HTTP / HTTPS à®®à¯à®©à¯à®©à¯Šà®Ÿà¯à®Ÿà¯ தேவை." - }, - "usaOnly": { - "message": "அமெரிகà¯à®•ா மடà¯à®Ÿà¯à®®à¯", - "description": "இநà¯à®¤ பரிமாறà¯à®±à®¤à¯à®¤à¯ˆà®ªà¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿ அமெரிகà¯à®•ாவில௠உளà¯à®³à®µà®°à¯à®•ளà¯à®•à¯à®•௠மடà¯à®Ÿà¯à®®à¯‡ இத௠வரையறà¯à®•à¯à®•பà¯à®ªà®Ÿà¯à®•ிறதà¯" - }, - "usedByClients": { - "message": "பலà¯à®µà¯‡à®±à¯ வாடிகà¯à®•ையாளரà¯à®•ள௠பலà¯à®µà¯‡à®±à¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿à®¯" - }, - "useOldUI": { - "message": "உஸ௠ஓலà¯à®Ÿà¯ உய௠" - }, - "validFileImport": { - "message": "இறகà¯à®•à¯à®®à®¤à®¿ செயà¯à®¯ சரியான கோபà¯à®ªà¯ தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯." - }, - "vaultCreated": { - "message": "வாலà¯à®Ÿà¯ உரà¯à®µà®¾à®•à¯à®•பà¯à®ªà®Ÿà¯à®Ÿà®¤à¯" - }, - "viewAccount": { - "message": "கணகà¯à®•ைக௠காடà¯à®Ÿà¯" - }, - "visitWebSite": { - "message": "எஙà¯à®•ள௠வலைதà¯à®¤à®³à®¤à¯à®¤à¯ˆà®ªà¯ பாரà¯à®µà¯ˆà®¯à®¿à®Ÿà®µà¯à®®à¯" - }, - "warning": { - "message": "எசà¯à®šà®°à®¿à®•à¯à®•ை" - }, - "welcome": { - "message": "மெடà¯à®Ÿà®¾à®®à®¾à®¸à¯à®•௠பீடà¯à®Ÿà®¾à®µà¯à®•à¯à®•௠வரà¯à®•" - }, - "whatsThis": { - "message": "இத௠எனà¯à®©?" - }, - "yourSigRequested": { - "message": "உஙà¯à®•ள௠கையொபà¯à®ªà®®à¯ கோரபà¯à®ªà®Ÿà¯à®•ிறதà¯" - }, - "youSign": { - "message": "நீஙà¯à®•ள௠கையெழà¯à®¤à¯à®¤à®¿à®Ÿà¯à®•ிறீரà¯à®•ளà¯" - } -} diff --git a/app/_locales/tr/messages.json b/app/_locales/tr/messages.json index 726024764e20..df904c9eba71 100644 --- a/app/_locales/tr/messages.json +++ b/app/_locales/tr/messages.json @@ -1,52 +1,7 @@ { - "privacyMode": { - "message": "Gizlilik modu" - }, - "privacyModeDescription": { - "message": "Web siteleri, hesap bilgilerinizi görmek için eriÅŸim istemek zorundadır." - }, - "exposeAccounts": { - "message": "Hesapları Açığa Çıkar" - }, - "exposeDescription": { - "message": "Hesapları mevcut web sitesine gösterin. Eski dapps için kullanışlıdır." - }, - "confirmExpose": { - "message": "Hesaplarınızı mevcut web sitesine taşımak istediÄŸinizden emin misiniz?" - }, - "confirmClear": { - "message": "Onaylanmış web sitelerini silmek istediÄŸinizden emin misiniz?" - }, - "clearApprovalDataSuccess": { - "message": "Onaylanan web sitesi verileri baÅŸarıyla temizlendi." - }, - "approvalData": { - "message": "Onay Verileri" - }, - "approvalDataDescription": { - "message": "Onaylanan web sitesi verilerini temizle, tüm sitelerin tekrar onay isteÄŸinde bulunması gerekir." - }, - "clearApprovalData": { - "message": "Onay verilerini temizle" - }, - "approve": { - "message": "Onaylamak" - }, "reject": { "message": "Reddetmek" }, - "providerAPIRequest": { - "message": "Web3 API İsteÄŸi" - }, - "reviewProviderRequest": { - "message": "Lütfen bu Ethereum API isteÄŸini inceleyin." - }, - "providerRequestInfo": { - "message": "AÅŸağıda listelenen etki alanı, Ethereum API'sine eriÅŸim talep etmeye çalışmaktadır, böylece Ethereum blockchain ile etkileÅŸime girebilir. Web3 eriÅŸimini onaylamadan önce her zaman doÄŸru sitede olduÄŸunuzu kontrol edin." - }, - "accept": { - "message": "Kabul et" - }, "account": { "message": "Hesap" }, @@ -56,12 +11,6 @@ "accountName": { "message": "Hesap İsmi" }, - "address": { - "message": "Adres" - }, - "addCustomToken": { - "message": "Özel jeton ekle" - }, "addToken": { "message": "Jeton ekle" }, @@ -71,16 +20,16 @@ "amount": { "message": "Tutar" }, - "amountPlusGas": { - "message": "Tutar + Gas" - }, "appDescription": { "message": "Ethereum Tarayıcı Uzantısı", - "description": "Uygulama açıklaması" + "description": "The description of the application" }, "appName": { "message": "MetaMask", - "description": "Uygulama ismi" + "description": "The name of the application" + }, + "approve": { + "message": "Onaylamak" }, "approved": { "message": "Onaylandı" @@ -91,46 +40,18 @@ "attributions": { "message": "Atıflar" }, - "available": { - "message": "Müsait" - }, "back": { "message": "Geri" }, "balance": { "message": "Bakiye:" }, - "balances": { - "message": "Jeton bakiyesi" - }, - "balanceIsInsufficientGas": { - "message": "Toplam gas için yetersiz bakiye" - }, - "beta": { - "message": "BETA" - }, - "betweenMinAndMax": { - "message": "$1'e eÅŸit veya daha büyük olmalı ve $2'den küçük veya eÅŸit olmalı", - "description": "Onaltılık sayının ondalık sayı olarak giriÅŸi için yardımcı" - }, "blockiesIdenticon": { "message": "Blockies Identicon kullan" }, - "borrowDharma": { - "message": "Dharma (Beta) ile ödünç al" - }, "builtInCalifornia": { "message": "MetaMask California'da tasarlandı ve yaratıldı" }, - "buy": { - "message": "Satın al" - }, - "buyCoinbase": { - "message": "Coinbase'de satın al" - }, - "buyCoinbaseExplainer": { - "message": "Coinbase Bitcoin, Ethereum, and Litecoin alıp satmanın dünyadaki en popüler yolu" - }, "buyCoinSwitch": { "message": "CoinSwitch'de satın al" }, @@ -143,32 +64,26 @@ "cancel": { "message": "Vazgeç" }, - "classicInterface": { - "message": "Klasik arayüzü kullan" - }, - "clickCopy": { - "message": "Kopyalamak için tıkla" - }, "confirm": { "message": "Onayla" }, "confirmed": { "message": "Onaylandı" }, - "confirmContract": { - "message": "SözleÅŸmeyi onayla" - }, "confirmPassword": { "message": "Åžifreyi onayla" }, - "confirmTransaction": { - "message": "İşlemi onayla" + "connectingToKovan": { + "message": "Kovan Test Ağına baÄŸlanıyor" }, - "continue": { - "message": "Devam et" + "connectingToMainnet": { + "message": "Main Ethereum Ağına baÄŸlanıyor" }, - "continueToCoinbase": { - "message": "Coinbase'e devam et" + "connectingToRopsten": { + "message": "Ropsten Test Ağına baÄŸlanıyor" + }, + "connectingToRinkeby": { + "message": "Rinkeby Test Ağına baÄŸlanıyor" }, "continueToCoinSwitch": { "message": "CoinSwitch'e devam et" @@ -176,30 +91,12 @@ "contractDeployment": { "message": "SözleÅŸme kurulumu" }, - "conversionProgress": { - "message": "Çevirim devam ediyor" - }, - "copiedButton": { - "message": "Kopyalandı" - }, - "copiedClipboard": { - "message": "Panoya kopyalandı" - }, "copiedExclamation": { "message": "Kopyalandı!" }, - "copiedSafe": { - "message": "Güvenli bir yere kopyaladım" - }, - "copy": { - "message": "Kopyala" - }, "copyToClipboard": { "message": "Panoya kopyala" }, - "copyButton": { - "message": " Kopyala " - }, "copyPrivateKey": { "message": "Bu sizin özel anahtarınız (kopyalamak için tıklayın)" }, @@ -209,28 +106,12 @@ "createAccount": { "message": "Hesap OluÅŸtur" }, - "createDen": { - "message": "Yarat" - }, - "crypto": { - "message": "Kripto", - "description": "Kambiyo tipi (kripto para)" - }, - "currentConversion": { - "message": "Geçerli çevirme" - }, - "currentNetwork": { - "message": "Geçerli AÄŸ" - }, "customGas": { "message": "Gas'i özelleÅŸtir" }, "customToken": { "message": "Özel Jeton" }, - "customize": { - "message": "ÖzelleÅŸtir" - }, "customRPC": { "message": "Özel RPC" }, @@ -243,39 +124,15 @@ "defaultNetwork": { "message": "Ether iÅŸlemleri için varsayılan aÄŸ Main Net." }, - "denExplainer": { - "message": "DEN'iniz MetaMask içersinde parola-ÅŸifrelenmiÅŸ deponuzdur." - }, "deposit": { "message": "Yatır" }, - "depositBTC": { - "message": "BTC'inizi aÅŸağıdaki adrese yatırın:" - }, - "depositEth": { - "message": "Eth yatır" - }, "depositEther": { "message": "Ether yatır" }, - "depositFiat": { - "message": "Para yatır" - }, - "depositFromAccount": { - "message": "BaÅŸka bir hesaptan yatır" - }, - "depositShapeShift": { - "message": "ShapeShift ile yatır" - }, - "depositShapeShiftExplainer": { - "message": "EÄŸer baÅŸka kripto paralara sahipseniz, MetaMask cüzdanınıza direk olarak Ether yatırabilirsiniz. Hesaba gerek yoktur." - }, "details": { "message": "Ayrıntılar" }, - "directDeposit": { - "message": "Direk Yatırma" - }, "directDepositEther": { "message": "Direk Ether Yatırma" }, @@ -294,129 +151,58 @@ "edit": { "message": "Düzenle" }, - "editAccountName": { - "message": "Hesap ismini düzenle" - }, - "emailUs": { - "message": "Bize e-posta atın!" - }, - "encryptNewDen": { - "message": "Yeni DEN'inizi ÅŸifreleyin" - }, "enterPassword": { "message": "Parolanızı girin" }, - "enterPasswordConfirm": { - "message": "Onaylamak için parolanızı girin" - }, - "passwordNotLongEnough": { - "message": "Parola yeterince uzun deÄŸil" - }, - "passwordsDontMatch": { - "message": "Parolalar eÅŸleÅŸmiyor" - }, "etherscanView": { "message": "Hesabı Etherscan üzerinde izle" }, - "exchangeRate": { - "message": "Döviz kuru" - }, "exportPrivateKey": { "message": "Özel anahtarı ver" }, - "exportPrivateKeyWarning": { - "message": "Özel anahtarınızı vermek sizin sorumluluÄŸunuzdadır." - }, "failed": { "message": "BaÅŸarısız oldu" }, "fiat": { "message": "Para", - "description": "Döviz türü" + "description": "Exchange type" }, "fileImportFail": { "message": "Dosya alma çalışmıyor mu? Buraya tıklayın!", - "description": "Kullanıcıların hesaplarını JSON dosyasından almalarına yardım eder" - }, - "followTwitter": { - "message": "Bizi twitter'da takip edin" + "description": "Helps user import their account from a JSON file" }, "from": { "message": "Kimden" }, - "fromToSame": { - "message": "Kimden ve kime adresi aynı olamaz" - }, - "fromShapeShift": { - "message": "ShapeShift'den" - }, - "gas": { - "message": "Gas", - "description": "Gas maliyetinin kısa indikatörü" - }, - "gasFee": { - "message": "Gas Ücreti" - }, "gasLimit": { "message": "Gas Limiti" }, - "gasLimitCalculation": { - "message": "Önerilen gas limitini aÄŸ baÅŸarı oranını baz alarak hesaplıyoruz." - }, - "gasLimitRequired": { - "message": "Gas limiti gereklidir" - }, "gasLimitTooLow": { "message": "Gas limiti en az 21000 olmalıdır" }, - "generatingSeed": { - "message": "Kaynak OluÅŸturuyor..." - }, "gasPrice": { "message": "Gas Fiyatı (GWEI)" }, - "gasPriceCalculation": { - "message": "Önerilen gas fiyatını aÄŸ baÅŸarı oranını baz alarak hesaplıyoruz." - }, - "gasPriceRequired": { - "message": "Gas Fiyatı Gereklidir" - }, "getEther": { "message": "Ether Al" }, "getEtherFromFaucet": { "message": "Musluktan $1 karşılığı Ether alın", - "description": "Ether musluÄŸunun aÄŸ ismini gösterir" - }, - "greaterThanMin": { - "message": "must be greater than or equal to $1.", - "description": "helper for inputting hex as decimal input" + "description": "Displays network name for Ether faucet" }, "here": { "message": "burada", - "description": "daha fazla bilgi için -buraya tıklayın- (troubleTokenBalances ile gidiyor)" - }, - "hereList": { - "message": "İşte bir liste!!!!" + "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, "hide": { "message": "Gizle" }, - "hideToken": { - "message": "Jetonu gizle" - }, "hideTokenPrompt": { "message": "Jetonu gizle?" }, - "howToDeposit": { - "message": "Ether'i nasıl yatırmak istersiniz?" - }, - "holdEther": { - "message": "Ether ve jeton tutmanızı saÄŸlar ve merkezi olmayan uygulamalar ve sizin aranızda köprü vazifesi görür." - }, "import": { "message": "Al", - "description": "Seçilen dosyadan hesap alma düğmesi. " + "description": "Button to import an account from a selected file" }, "importAccount": { "message": "Hesap Al" @@ -424,15 +210,9 @@ "importAccountMsg": { "message": " Alınan hesaplar orjinal kaynakifadenizle yarattığınız MetaMask hesabınızla iliÅŸkilendirilmez. Alınan hesaplar ile ilgili daha fazla bilgi edinin " }, - "importAnAccount": { - "message": "Hesap al" - }, - "importDen": { - "message": "Varolan DEN al" - }, "imported": { "message": "Alındı", - "description": "Hesabın keyringe baÅŸarı ile alındığını gösteren durum" + "description": "status showing that an account has been fully loaded into the keyring" }, "infoHelp": { "message": "Bilgi ve yardım" @@ -449,74 +229,46 @@ "invalidAddressRecipient": { "message": "Alıcı adresi geçersiz" }, - "invalidGasParams": { - "message": "Geçersiz gas parametreleri" - }, "invalidInput": { "message": "Geçersiz giriÅŸ." }, - "invalidRequest": { - "message": "Geçersiz istek" - }, "invalidRPC": { "message": "Geçersiz RPC URI" }, - "jsonFail": { - "message": "BirÅŸeyler yanlış gitti. JSON dosyanızın düzgün derlendiÄŸinden emin olun." + "invalidBlockExplorerURL": { + "message": "Geçersiz Block Explorer URI" }, "jsonFile": { "message": "JSON Dosyası", - "description": "Hesap alımı için düzenle" - }, - "keepTrackTokens": { - "message": "MetaMask hesabınızla satın aldığınız jetonların kaydını tutun." + "description": "format for importing an account" }, "kovan": { "message": "Kovan Test Ağı" }, - "knowledgeDataBase": { - "message": "Bilgi veritabanımızı ziyaret edin" - }, "max": { "message": "Maksimum" }, "learnMore": { "message": "Daha fazla bilgi." }, - "lessThanMax": { - "message": "$1'den az veya eÅŸit olmalıdır.", - "description": "Onaltılık sayıyı ondalık olarak girmek için yardımcı" - }, "likeToAddTokens": { "message": "Bu jetonlara adres eklemek ister misiniz?" }, "links": { "message": "BaÄŸlantılar" }, - "limit": { - "message": "Limit" - }, "loading": { "message": "Yükleniyor..." }, "loadingTokens": { "message": "Jetonlar yükleniyor..." }, - "localhost": { - "message": "Localhost 8545" - }, - "login": { + "unlock": { "message": "GiriÅŸ yap" }, - "logout": { + "lock": { "message": "Çıkış" }, - "loose": { - "message": "GevÅŸek" - }, - "loweCaseWords": { - "message": "kaynak kelimeleri sadece küçük harflerden oluÅŸabilir." - }, "mainnet": { "message": "Main Ethereum Ağı" }, @@ -526,9 +278,6 @@ "metamaskDescription": { "message": "MetaMask Ethereum için güvenli bir kimlik kasasıdır." }, - "min": { - "message": "Minimum" - }, "myAccounts": { "message": "Hesaplarım" }, @@ -540,11 +289,7 @@ }, "needImportFile": { "message": "Almak için bir dosya seçmelisiniz.", - "description": "Kullanıcı bir hesap alır ve devam etmek içinbir dosya seçmelidir." - }, - "needImportPassword": { - "message": "Seçilen dosya için bir parola girmelisiniz.", - "description": "Hesap almak için parola ve dosya gerekiyor." + "description": "User is important an account and needs to add a file to continue" }, "negativeETH": { "message": "Negatif ETH miktarları gönderilemez." @@ -557,7 +302,7 @@ }, "newAccountNumberName": { "message": "Hesap $1", - "description": "Hesap yaratma ekranındaki bir sonraki hesabın varsayılan ismi" + "description": "Default name of next account to be created on create account screen" }, "newContract": { "message": "Yeni SözleÅŸme" @@ -565,73 +310,34 @@ "newPassword": { "message": "Yeni Parola (min 8 karakter)" }, - "newRecipient": { - "message": "Yeni alıcı" - }, - "newRPC": { - "message": "Yeni RPC URL" - }, "next": { "message": "Sonraki" }, "noAddressForName": { "message": "Bu isim için bir adres tanımlanmamış." }, - "noDeposits": { - "message": "Yatırma alınmadı" - }, - "noTransactionHistory": { - "message": "İşlem geçmiÅŸi yok." - }, "noTransactions": { "message": "İşlem yok" }, - "notStarted": { - "message": "BaÅŸlamadı" - }, - "oldUI": { - "message": "Eski UI" - }, - "oldUIMessage": { - "message": "Eski UI'a döndünüz. Yeni UI'a üst saÄŸ sekme menüsündeki seçenek ile dönebilirsiniz." - }, - "or": { - "message": "veya", - "description": "Yeni bir hesap yaratmak veya almak arasındaki seçim" - }, - "passwordCorrect": { - "message": "Lütfen parolanın doÄŸru olduÄŸuna emin olun." - }, - "passwordMismatch": { - "message": "parolalar eÅŸleÅŸmiyor", - "description": "parola yaratma iÅŸleminde, iki yeni parola alanı eÅŸleÅŸmiyor." + "passwordsDontMatch": { + "message": "Parolalar eÅŸleÅŸmiyor" }, - "passwordShort": { - "message": "parola yeterince uzun deÄŸil", - "description": "parola yaratma iÅŸleminde, parola güvenli olacak kadar uzun deÄŸil." + "passwordNotLongEnough": { + "message": "Parola yeterince uzun deÄŸil" }, "pastePrivateKey": { "message": "Özel anahtar dizinizi buraya yapıştırın:", - "description": "Özel anahtardan hesap almak için" - }, - "pasteSeed": { - "message": "Kaynak ifadenizi buraya yapıştırın!" + "description": "For importing an account from a private key" }, "personalAddressDetected": { "message": "KiÅŸisel adres tespit edilidi. Jeton sözleÅŸme adresini girin." }, - "pleaseReviewTransaction": { - "message": "Lütfen iÅŸleminizi gözden geçirin." - }, - "popularTokens": { - "message": "Popüler Jetonlar" - }, "privacyMsg": { "message": "Gizlilik Åžartları" }, "privateKey": { "message": "Özel Anahtar", - "description": "Hesap alırken bu tip bir dosya seçin" + "description": "select this type of file to use to import an account" }, "privateKeyWarning": { "message": "Uyarı: Bu anahtarı kimse ile paylaÅŸmayın. Özel anahtarlarınıza sahip herkes hesaplarınızıdaki tüm varlığınızı çalabilir." @@ -639,27 +345,12 @@ "privateNetwork": { "message": "Özel AÄŸ" }, - "qrCode": { - "message": "QR Kodunu göster" - }, "readdToken": { "message": "Gelecekte Bu jetonu hesap seçenekleri menüsünde “Jeton ekleâ€'ye giderek geri ekleyebilirsiniz." }, - "readMore": { - "message": "Burada daha fazla okuyun." - }, - "readMore2": { - "message": "Daha fazla okuyun." - }, - "receive": { - "message": "Al" - }, "recipientAddress": { "message": "Alıcı adresi" }, - "refundAddress": { - "message": "İade adresiniz" - }, "rejected": { "message": "Rededildi" }, @@ -669,92 +360,36 @@ "restoreFromSeed": { "message": "Kaynak ifadeden geri getir. Restore from seed phrase" }, - "restoreVault": { - "message": "Kasayı geri getir" - }, "required": { "message": "Gerekli" }, - "retryWithMoreGas": { - "message": "Daha yüksek bir gas fiyatı ile tekrar dene" - }, - "walletSeed": { - "message": "Cüzdan Kaynağı" - }, "revealSeedWords": { "message": "Kaynak kelimelerini göster" }, "revealSeedWordsWarning": { "message": "Açık bir yerde kaynak kelimeliriniz geri getirmeyin! Bu kelimeler tüm hesaplarınızı çalmak için kullanılabilir." }, - "revert": { - "message": "Geri döndür" - }, "rinkeby": { "message": "Rinkeby Test Ağı" }, "ropsten": { "message": "Ropsten Test Ağı" }, - "currentRpc": { - "message": "Geçerli RPC" - }, - "connectingToMainnet": { - "message": "Main Ethereum Ağına baÄŸlanıyor" - }, - "connectingToRopsten": { - "message": "Ropsten Test Ağına baÄŸlanıyor" - }, - "connectingToKovan": { - "message": "Kovan Test Ağına baÄŸlanıyor" - }, - "connectingToRinkeby": { - "message": "Rinkeby Test Ağına baÄŸlanıyor" - }, - "connectingToUnknown": { - "message": "Bilinmeyen AÄŸa baÄŸlanıyor" - }, - "sampleAccountName": { - "message": "E.g. Yeni hesabım", - "description": "Kullanıcının hesabına okunabilir isim ekleme konseptini anlamasına yardımcı olmak." - }, "save": { "message": "Kaydet" }, - "reprice_title": { - "message": "İşlemi Yeniden Fiyatlandır" - }, - "reprice_subtitle": { - "message": "İşlemizi hızlandırmayı denemek için gas fiyatınızı yükseltin." - }, - "saveAsFile": { - "message": "Dosya olarak kaydet", - "description": "Hesap verme iÅŸlemi" - }, - "saveSeedAsFile": { - "message": "Kaynak Kelimelerini Dosya olarak Kaydet" - }, "search": { "message": "Ara" }, "secretPhrase": { "message": "Kasanızı geri getirmek için gizli 12 kelimelik ifadenizi giriniz." }, - "newPassword8Chars": { - "message": "Yeni Parola (minumum 8 karakter)" - }, "seedPhraseReq": { "message": "Kaynak ifadeleri 12 kelimedir." }, - "select": { - "message": "Seç" - }, "selectCurrency": { "message": "Döviz Seç" }, - "selectService": { - "message": "Servis Seç" - }, "selectType": { "message": "Tip Seç" }, @@ -767,54 +402,30 @@ "sendTokens": { "message": "Jeton Gönder" }, - "onlySendToEtherAddress": { - "message": "Ethereum adresine sadece ETH gönder." - }, "searchTokens": { "message": "Jeton ara" }, - "sendTokensAnywhere": { - "message": "Ethereum hesabı olan birine Jeton gönder" - }, "settings": { "message": "Ayarlar" }, - "info": { - "message": "Bilgi" - }, - "shapeshiftBuy": { - "message": "Shapeshift ile satın al" - }, "showPrivateKeys": { "message": "Özel anahtarları göster" }, - "showQRCode": { - "message": "QR Kodu göster" - }, "sign": { "message": "İmza" }, + "signatureRequest": { + "message": "İmza isteÄŸi" + }, "signed": { "message": "İmzalandı" }, - "signMessage": { - "message": "Mesajı İmzala" - }, "signNotice": { "message": "Bu mesajı imzalamanın tehlikeli \nyan etkileri olabilir. Tamamen güvendiÄŸiniz sitelerden \ngelen mesajları hesabınızla imzalayınız.\n Bu tehlikeli metod gelecek versiyonlarda çıkarılacaktır. " }, "sigRequest": { "message": "İmza isteÄŸi" }, - "sigRequested": { - "message": "İmza isteniyor" - }, - "spaceBetween": { - "message": "Kelimeler arası sadece bir boÅŸluk olabilir." - }, - "status": { - "message": "Durum" - }, "stateLogs": { "message": "Durum Kayıtları" }, @@ -824,9 +435,6 @@ "stateLogError": { "message": "Durum kayıtlarını alma hatası" }, - "submit": { - "message": "Gönder" - }, "submitted": { "message": "Gönderildi" }, @@ -834,10 +442,7 @@ "message": "Destek merkezimizi ziyaret edin" }, "symbolBetweenZeroTwelve": { - "message": "Sembol 0 ve 12 karakter aralığında olmalıdır." - }, - "takesTooLong": { - "message": "Çok mu uzun sürüyor?" + "message": "Sembol 11 karakter veya daha az olmalıdır." }, "terms": { "message": "Kullanım ÅŸartları" @@ -848,111 +453,52 @@ "to": { "message": "Kime" }, - "toETHviaShapeShift": { - "message": "ShapeShift üstünden $1'dan ETH'e", - "description": "system will fill in deposit type in start of message" - }, - "tokenAddress": { - "message": "Jeton Adresi" - }, "tokenAlreadyAdded": { "message": "Jeton çoktan eklenmiÅŸ." }, - "tokenBalance": { - "message": "Jeton bakiyeniz:" - }, - "tokenSelection": { - "message": "Jeton arayın veya popüler jeton listemizden seçin." - }, "tokenSymbol": { "message": "Jeton Sembolü" }, - "tokenWarning1": { - "message": "MetaMask hesabınızla aldığınız jetonların kaydını tutun. BaÅŸka bir hesapla jetonlar satın aldıysanız, o jetonlar burada gözükmeyecektir." - }, "total": { "message": "Toplam" }, - "transactions": { - "message": "iÅŸlemler" - }, "transactionError": { "message": "İşlem Hatası. SözleÅŸme kodundan kural dışı durum fırlatıldı." }, - "transactionMemo": { - "message": "İşlem notu (opsiyonel)" - }, - "transactionNumber": { - "message": "İşlem numarası" - }, - "transfers": { - "message": "Transferler" - }, "troubleTokenBalances": { "message": "Jeton bakiyelerinizi yüklerken sorun yaÅŸadık. Buradan izleyebilirsiniz ", - "description": "Jeton bakiyelerini görmek için bir link (burası) ile takip ediliyor" - }, - "twelveWords": { - "message": "MetaMask hesaplarınızı geri getirmenin tek yolu bu 12 kelimedir.\nBu kelimeleri güvenli ve gizli bir yerde saklayın." + "description": "Followed by a link (here) to view token balances" }, "typePassword": { "message": "Parolanızı girin" }, - "uiWelcome": { - "message": "Yeni UI (Beta)'ya hoÅŸgeldiniz" - }, - "uiWelcomeMessage": { - "message": "Åžu anda yeni MetaMask UI kullanmaktasınız. Gözatın, jeton gönderme gibi yeni özellikleri deneyin ve herhangi bir sorunlar karşılaşırsanız bize haber verin" - }, "unapproved": { "message": "Onaylanmadı" }, - "unavailable": { - "message": "Mevcut deÄŸil" - }, "unknown": { "message": "Bilinmeyen" }, "unknownNetwork": { "message": "Bilinmeyen özel aÄŸ" }, - "unknownNetworkId": { - "message": "Bilinmeyen aÄŸ IDsi" - }, - "uriErrorMsg": { + "urlErrorMsg": { "message": "URIler için HTTP/HTTPS öneki gerekmektedir." }, - "usaOnly": { - "message": "Sadece ABD", - "description": "Bu dövizi sadece ABD ikamet edenler kullanabilir" - }, "usedByClients": { "message": "Farklı istemciler tarafından kullanılmakta" }, - "useOldUI": { - "message": "Eski UI kullan" - }, - "validFileImport": { - "message": "Almak için geçerli bir dosya seçmelisiniz" - }, - "vaultCreated": { - "message": "Kasa Yaratıldı" - }, "viewAccount": { "message": "Hesabı İncele" }, "visitWebSite": { "message": "Web sitemizi ziyaret edin" }, - "warning": { - "message": "Uyarı" + "walletSeed": { + "message": "Cüzdan Kaynağı" }, "welcome": { "message": "MetaMask'ya HoÅŸgeldiniz" }, - "whatsThis": { - "message": "Bu nedir?" - }, "yourSigRequested": { "message": "İmzanız isteniyor" }, diff --git a/app/_locales/uk/messages.json b/app/_locales/uk/messages.json new file mode 100644 index 000000000000..14ff03db6353 --- /dev/null +++ b/app/_locales/uk/messages.json @@ -0,0 +1,1310 @@ +{ + "chartOnlyAvailableEth": { + "message": "Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ Ð´Ð¾Ñтупна тільки в мережах Ethereum." + }, + "contractInteraction": { + "message": "Контрактна взаємодіÑ" + }, + "reject": { + "message": "Відхилити" + }, + "about": { + "message": "Про Google Chrome" + }, + "aboutSettingsDescription": { + "message": "ВерÑÑ–Ñ, центр підтримки та контактна інформаціÑ" + }, + "acceleratingATransaction": { + "message": "* ПриÑÐºÐ¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ— за допомогою вищих цін на газ підвищує Ñ—Ñ— шанÑи бути обробленою мережею швидше, але це не завжди гарантовано." + }, + "accessingYourCamera": { + "message": "Отримуємо доÑтуп до вашої камери..." + }, + "account": { + "message": "Обліковий запиÑ" + }, + "accountDetails": { + "message": "Деталі облікового запиÑу" + }, + "accountName": { + "message": "Ðазва облікового запиÑу" + }, + "accountOptions": { + "message": "Опції облікового запиÑу" + }, + "accountSelectionRequired": { + "message": "Вам потрібно обрати обліковий запиÑ!" + }, + "activityLog": { + "message": "журнал активноÑті" + }, + "addNetwork": { + "message": "Додати мережу" + }, + "addRecipient": { + "message": "Додати отримувача" + }, + "advanced": { + "message": "Розширені" + }, + "advancedSettingsDescription": { + "message": "Отримайте доÑтуп до функцій розробника, завантажте Логи Ñтанів, перезапуÑтіть обліковий запиÑ, налаштуйте теÑтові Ñітки та перÑоніфіковані RPC" + }, + "advancedOptions": { + "message": "Додаткові параметри" + }, + "addToAddressBook": { + "message": "Додати до адреÑної книги" + }, + "addToAddressBookModalPlaceholder": { + "message": "Ðапр.: Джон Д." + }, + "addAlias": { + "message": "Додати пÑевдо" + }, + "addToken": { + "message": "Додати токен" + }, + "addTokens": { + "message": "Додати токени" + }, + "addSuggestedTokens": { + "message": "Додати рекомендовані токени" + }, + "addAcquiredTokens": { + "message": "Додайте токени, отримані за допомогою MetaMask" + }, + "amount": { + "message": "КількіÑть" + }, + "appDescription": { + "message": "Гаманець Ethereum у вашому браузері", + "description": "The description of the application" + }, + "appName": { + "message": "MetaMask", + "description": "The name of the application" + }, + "approve": { + "message": "Затвердити" + }, + "approved": { + "message": "Затверджено" + }, + "asset": { + "message": "Ðктив" + }, + "attemptingConnect": { + "message": "Спроба Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ розподіленої бази даних." + }, + "attemptToCancel": { + "message": "Спробувати ÑкаÑувати?" + }, + "attemptToCancelDescription": { + "message": "Ð’Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñ†Ñ–Ñ”Ñ— Ñпроби не гарантує ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— транзакції. Якщо Ñпроба ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð´Ð°ÑтьÑÑ, з Ð²Ð°Ñ Ð±ÑƒÐ´Ðµ ÑÑ‚Ñгнуто зазначену вище коміÑÑ–ÑŽ." + }, + "attributions": { + "message": "ÐвторÑтво" + }, + "autoLockTimeLimit": { + "message": "Таймер автоматичного виходу (хвилин)" + }, + "autoLockTimeLimitDescription": { + "message": "Ð’Ñтановіть Ñ‡Ð°Ñ Ð²Ñ–Ð´ÑутноÑті активноÑті у хвилинах піÑÐ»Ñ Ñкого MetaMask буде здійÑнювати автоматичний вихід" + }, + "average": { + "message": "У Ñередньому" + }, + "back": { + "message": "Ðазад" + }, + "backToAll": { + "message": "ПовернутиÑÑ Ð´Ð¾ вÑÑ–Ñ…" + }, + "backupApprovalNotice": { + "message": "Створіть резервну копію вашого Секретного кода відновленнÑ, щоб ваш гаманець та ваші кошти залишалиÑÑŒ у безпеці." + }, + "backupApprovalInfo": { + "message": "Цей Ñекретний код буде потрібен, щоб відновити ваш гаманець у разі втрати вашого приÑтрою, Ð·Ð°Ð±ÑƒÑ‚Ñ‚Ñ Ð¿Ð°Ñ€Ð¾Ð»ÑŽ, потреби у перевÑтановленні MetaMask або Ð²Ð¸Ð½Ð¸ÐºÐ½ÐµÐ½Ð½Ñ Ð±Ð°Ð¶Ð°Ð½Ð½Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ доÑтуп до вашого Ð³Ð°Ð¼Ð°Ð½Ñ†Ñ Ð· іншого приÑтрою." + }, + "backupNow": { + "message": "Створити резервну копію зараз" + }, + "balance": { + "message": "БаланÑ" + }, + "balanceOutdated": { + "message": "Залишок можливо вже змінивÑÑ" + }, + "basic": { + "message": "ОÑновні параметри" + }, + "blockExplorerUrl": { + "message": "Блокувати Explorer" + }, + "blockExplorerView": { + "message": "ПереглÑнути обліковий Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° $1", + "description": "$1 replaced by URL for custom block explorer" + }, + "blockiesIdenticon": { + "message": "Викоритовувати Blockies Identicon" + }, + "browserNotSupported": { + "message": "Ваш браузер не підтримуєтьÑÑ..." + }, + "builtInCalifornia": { + "message": "MetaMask розроблено й Ñтворено в Каліфорнії." + }, + "buyWithWyre": { + "message": "Купити ETH через Wyre" + }, + "buyWithWyreDescription": { + "message": "Wyre дає змогу викориÑтовувати кредитну картку Ð´Ð»Ñ Ð²Ð½ÐµÑÐµÐ½Ð½Ñ Ð²Ð°Ð»ÑŽÑ‚Ð¸ ETH безпоÑередньо у Ñвій гаманець MetaMask." + }, + "buyCoinSwitch": { + "message": "Купувати на CoinSwitch" + }, + "buyCoinSwitchExplainer": { + "message": "CoinSwitch це точка Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð· однією зупинкою Ð´Ð»Ñ Ð¾Ð±Ð¼Ñ–Ð½Ñƒ більш ніж 300 криптовалют за найкращими курÑами. " + }, + "bytes": { + "message": "Байти" + }, + "off": { + "message": "Вимкнено" + }, + "ok": { + "message": "OK" + }, + "on": { + "message": "Увімкнути" + }, + "optionalBlockExplorerUrl": { + "message": "Блокувати Explorer URL (не обов'Ñзково)" + }, + "cancel": { + "message": "СкаÑувати" + }, + "cancelAttempt": { + "message": "Відмінити Ñпробу" + }, + "cancellationGasFee": { + "message": "ВартіÑть пального за ÑкаÑуваннÑ" + }, + "cancelled": { + "message": "СкаÑовано" + }, + "chainId": { + "message": "ID мережі" + }, + "clickToRevealSeed": { + "message": "Клацніть тут, щоб відкрити Ñекретні Ñлова" + }, + "close": { + "message": "Близько" + }, + "chromeRequiredForHardwareWallets": { + "message": "Щоб підключитиÑÑ Ð´Ð¾ апаратного гаманцÑ, Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ MetaMask потрібно викориÑтовувати в Google Chrome." + }, + "confirm": { + "message": "Підтвердити" + }, + "confirmed": { + "message": "Підтверджено" + }, + "confirmPassword": { + "message": "Підтвердити пароль" + }, + "confirmSecretBackupPhrase": { + "message": "Підтвердьте вашу Ñекретну резервну фразу" + }, + "congratulations": { + "message": "Вітаємо!" + }, + "connectHardwareWallet": { + "message": "Приєднайте апаратний гаманець" + }, + "connect": { + "message": "Під’єднатиÑÑ" + }, + "connectingTo": { + "message": "Під'єднуємоÑÑŒ до $1" + }, + "connectingToKovan": { + "message": "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ теÑтової мережі Kovan" + }, + "connectingToMainnet": { + "message": "З'єднуємоÑÑŒ з Головною мережею Ethereum" + }, + "connectingToRopsten": { + "message": "Під'єднуємоÑÑŒ до ТеÑтової мережі Ropsten" + }, + "connectingToRinkeby": { + "message": "Під'єднуємоÑÑŒ до теÑтової мережі Rinkeby" + }, + "connectingToLocalhost": { + "message": "Під'єднуємоÑÑŒ до локального хоÑту 8545" + }, + "connectingToGoerli": { + "message": "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ теÑтової мережі Goerli" + }, + "continueToWyre": { + "message": "Продовжити у Wyre" + }, + "continueToCoinSwitch": { + "message": "Продовжити в CoinSwitch" + }, + "contractDeployment": { + "message": "Ð Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð°ÐºÑ‚Ñƒ" + }, + "copiedExclamation": { + "message": "Скопійовано!" + }, + "copyAddress": { + "message": "Копіювати адреÑу в буфер обміну" + }, + "copyTransactionId": { + "message": "Копіювати ID транзакції" + }, + "copiedTransactionId": { + "message": "ID Скопійованої транзакції" + }, + "copyToClipboard": { + "message": "Копіювати в буфер" + }, + "copyPrivateKey": { + "message": "Це ваш закритий ключ (натиÑніть, щоб Ñкопіювати)" + }, + "create": { + "message": "Створити" + }, + "createAccount": { + "message": "Створити обліковий запиÑ" + }, + "createAWallet": { + "message": "Створити гаманець" + }, + "createPassword": { + "message": "Створити пароль" + }, + "currencyConversion": { + "message": "Обмін валют" + }, + "currentLanguage": { + "message": "Поточна мова" + }, + "customGas": { + "message": "Ðалаштувати пальне" + }, + "customGasSubTitle": { + "message": "Ð—Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ ÐºÐ¾Ð¼Ñ–ÑÑ–Ñ— може призвеÑти до Ð·Ð¼ÐµÐ½ÑˆÐµÐ½Ð½Ñ Ñ‡Ð°Ñу обробки, але це не гарантуєтьÑÑ." + }, + "customToken": { + "message": "КориÑтувацький токен" + }, + "customRPC": { + "message": "Ðалаштувати RPC" + }, + "decimalsMustZerotoTen": { + "message": "КількіÑть розрÑдів піÑÐ»Ñ ÐºÐ¾Ð¼Ð¸: від 0 до 36." + }, + "decimal": { + "message": "Знаків піÑÐ»Ñ ÐºÐ¾Ð¼Ð¸" + }, + "defaultNetwork": { + "message": "Мережа Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ð¹ з Ether за замовчуваннÑм - Main Net." + }, + "delete": { + "message": "Видалити" + }, + "deleteAccount": { + "message": "Видалити обліковий запиÑ" + }, + "deposit": { + "message": "Депозит" + }, + "depositEther": { + "message": "Депонувати Ether" + }, + "details": { + "message": "Деталі" + }, + "directDepositEther": { + "message": "ВнеÑти безпоÑередньо Ефір" + }, + "directDepositEtherExplainer": { + "message": "Якщо ви вже маєте ефір, прÑме Ð¿ÐµÑ€ÐµÐ²ÐµÐ´ÐµÐ½Ð½Ñ â€“ найшвидший ÑпоÑіб передати ефір у Ñвій гаманець." + }, + "done": { + "message": "Готово" + }, + "downloadGoogleChrome": { + "message": "Завантажити Гугл Хром" + }, + "downloadSecretBackup": { + "message": "Завантажте цю Секретну резервну фразу та зберігайте Ñ—Ñ— у безпеці на зовнішньому зашифрованому жорÑткому диÑку або ноÑÑ–Ñ— інформації." + }, + "downloadStateLogs": { + "message": "Завантажити журнали Ñтану" + }, + "dontHaveAHardwareWallet": { + "message": "Ðе маєте апаратного гаманцÑ?" + }, + "dropped": { + "message": "Скинуто" + }, + "edit": { + "message": "Редагувати" + }, + "editContact": { + "message": "Редагувати контракт" + }, + "endOfFlowMessage1": { + "message": "Ви пройшли теÑÑ‚, зберігайте вашу початкову фразу в безпеці - це ваша відповідальніÑть!" + }, + "endOfFlowMessage2": { + "message": "Поради Ð´Ð»Ñ Ð±ÐµÐ·Ð¿ÐµÑ‡Ð½Ð¾Ð³Ð¾ зберіганнÑ" + }, + "endOfFlowMessage3": { + "message": "Збережіть резервну копію в декількох міÑцÑÑ…." + }, + "endOfFlowMessage4": { + "message": "Ðіколи не передавайте цю фразу нікому." + }, + "endOfFlowMessage5": { + "message": "ОÑтерігайтеÑÑŒ фішингу! MetaMask ніколи не запитуватиме вашої початкової фрази." + }, + "endOfFlowMessage6": { + "message": "Якщо вам потрібно знову зробити резервну копію вашої початкової фрази, ви можете знайти Ñ—Ñ— у ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ -> Безпека." + }, + "endOfFlowMessage7": { + "message": "Якщо у Ð²Ð°Ñ ÐºÐ¾Ð»Ð¸-небудь виникатимуть Ð¿Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ ви побачите щоÑÑŒ фішингове, пишіть на support@metamask.io." + }, + "endOfFlowMessage8": { + "message": "MetaMask не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ вашу мнемонічну фразу. Докладніше." + }, + "endOfFlowMessage9": { + "message": "ДізнатиÑÑŒ більше." + }, + "endOfFlowMessage10": { + "message": "УÑе готово" + }, + "ensRegistrationError": { + "message": "Помилка у реєÑтрації ENS ім'Ñ" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "Ім'Ñ ENS не знайдено у даній мережі. Спробуйте перейти у Main Ethereum Network." + }, + "enterAnAlias": { + "message": "Введіть пÑевдонім" + }, + "enterPassword": { + "message": "Введіть пароль" + }, + "enterPasswordContinue": { + "message": "Введіть пароль, щоб продовжити" + }, + "ethereumPublicAddress": { + "message": "Публічна адреÑа Ethereum" + }, + "etherscanView": { + "message": "ПереглÑнути обліковий Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° Etherscan" + }, + "estimatedProcessingTimes": { + "message": "Приблизні чаÑи обробки" + }, + "expandView": { + "message": "Розгорнути поданнÑ" + }, + "exportPrivateKey": { + "message": "ЕкÑпортувати приватний ключ" + }, + "failed": { + "message": "Помилка" + }, + "fast": { + "message": "Швидка" + }, + "faster": { + "message": "Швидше" + }, + "fiat": { + "message": "Вказівка", + "description": "Exchange type" + }, + "fileImportFail": { + "message": "Ðе працює імпорт файлу? ÐатиÑніть тут!", + "description": "Helps user import their account from a JSON file" + }, + "forgetDevice": { + "message": "Забути цей приÑтрій" + }, + "from": { + "message": "Від" + }, + "functionType": { + "message": "Тип функції" + }, + "gasLimit": { + "message": "Ліміт газу" + }, + "gasLimitInfoModalContent": { + "message": "Ліміт газу – макÑимальна кількіÑть одиниць газу, Ñку ви бажаєте витратити." + }, + "gasLimitTooLow": { + "message": "Ліміт газу має бути не менше 21000" + }, + "gasUsed": { + "message": "Пального викориÑтано" + }, + "gasPrice": { + "message": "Ціна на пальне (GWEI)" + }, + "gasPriceExtremelyLow": { + "message": "Ціна газу дуже низька" + }, + "gasPriceInfoModalContent": { + "message": "Ціна на пальне визначає кількіÑть Ether, Ñку ви готові заплатити за кожну одиницю пального." + }, + "gasPriceNoDenom": { + "message": "Ціна Газу" + }, + "general": { + "message": "Загальні" + }, + "generalSettingsDescription": { + "message": "КонверÑÑ–Ñ Ð²Ð°Ð»ÑŽÑ‚, первіÑна валюта, мова, ідентикон блокіз" + }, + "getEther": { + "message": "Отримати Ефір" + }, + "getEtherFromFaucet": { + "message": "Отримайте Ether з крану за $1", + "description": "Displays network name for Ether faucet" + }, + "getHelp": { + "message": "Отримати допомогу." + }, + "getStarted": { + "message": "Почати" + }, + "happyToSeeYou": { + "message": "Раді Ð²Ð°Ñ Ð±Ð°Ñ‡Ð¸Ñ‚Ð¸." + }, + "hardware": { + "message": "апаратний" + }, + "hardwareWalletConnected": { + "message": "Ðпаратний гаманець під'єднано" + }, + "hardwareWallets": { + "message": "Під'єднати апаратний гаманець" + }, + "hardwareWalletsMsg": { + "message": "Оберіть апаратний гаманець, Ñкий ви хочете викориÑтовувати з MetaMask" + }, + "havingTroubleConnecting": { + "message": "Проблеми при підключенні?" + }, + "here": { + "message": "тут", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" + }, + "hexData": { + "message": "ШіÑтнадцÑтирикові дані" + }, + "hide": { + "message": "Сховати" + }, + "hideTokenPrompt": { + "message": "Приховати токен?" + }, + "history": { + "message": "ІÑторіÑ" + }, + "import": { + "message": "Імпортувати", + "description": "Button to import an account from a selected file" + }, + "importAccount": { + "message": "Імпортувати обліковий запиÑ" + }, + "importAccountMsg": { + "message": "Імпортовані облікові запиÑи не будуть пов'Ñзані з вашою первіÑно Ñтвореною початковою фразою облікового запиÑу MetaMask. ДізнайтеÑÑŒ більше про імпортовані облікові запиÑи" + }, + "importAccountSeedPhrase": { + "message": "Імпортувати обліковий Ð·Ð°Ð¿Ð¸Ñ Ð· початковою фразою" + }, + "importWallet": { + "message": "Імпортувати гаманець" + }, + "importYourExisting": { + "message": "Імпортуйте ваш гаманець, що Ñ–Ñнує, викориÑтовуючи початкову фразу з 12 Ñлів" + }, + "imported": { + "message": "Імпортовано", + "description": "status showing that an account has been fully loaded into the keyring" + }, + "importUsingSeed": { + "message": "Імпортувати, викориÑтовуючи початкову фразу облікового запиÑу" + }, + "infoHelp": { + "message": "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ñ‚Ð° допомога" + }, + "initialTransactionConfirmed": { + "message": "Ваша початкова Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð° мережею. ÐатиÑніть ОК Ð´Ð»Ñ Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ." + }, + "insufficientBalance": { + "message": "ÐедоÑтатньо коштів" + }, + "insufficientFunds": { + "message": "ÐедоÑтатньо коштів." + }, + "insufficientTokens": { + "message": "ÐедоÑтатньо токенів" + }, + "invalidAddress": { + "message": "ÐедійÑна адреÑа" + }, + "invalidAddressRecipient": { + "message": "ÐедійÑна адреÑа отримувача" + }, + "knownAddressRecipient": { + "message": "Відома контрактна адреÑа." + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "Ðе Ñ” мережею ETH, налаштуйте нижній регіÑтр" + }, + "invalidInput": { + "message": "ÐеприпуÑтимий ввід." + }, + "invalidRPC": { + "message": "ÐедійÑний RPC URL" + }, + "invalidBlockExplorerURL": { + "message": "ÐедійÑний Block Explorer URL" + }, + "invalidSeedPhrase": { + "message": "ÐедійÑна seed-фраза" + }, + "jsonFile": { + "message": "Файл JSON", + "description": "format for importing an account" + }, + "kovan": { + "message": "ТеÑтова мережа Kovan" + }, + "max": { + "message": "МакÑимум" + }, + "learnMore": { + "message": "ДізнатиÑÑŒ більше" + }, + "ledgerAccountRestriction": { + "message": "Потрібно ÑкориÑтатиÑÑ Ñвоїм оÑтаннім обліковим запиÑом, перш ніж додавати новий." + }, + "letsGoSetUp": { + "message": "Так, давайте налаштуємо!" + }, + "likeToAddTokens": { + "message": "Ви б хотіли додати ці токени?" + }, + "links": { + "message": "ПоÑиланнÑ" + }, + "liveGasPricePredictions": { + "message": "Прогнози ціни на пальне наживо" + }, + "loading": { + "message": "ЗавантаженнÑ..." + }, + "loadingTokens": { + "message": "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ‚Ð¾ÐºÐµÐ½Ñ–Ð²â€¦" + }, + "loadMore": { + "message": "Завантажити більше" + }, + "localhost": { + "message": "Локальний хоÑÑ‚ 8545" + }, + "lock": { + "message": "Вийти" + }, + "mainnet": { + "message": "Головна Мережа Ethereum" + }, + "memorizePhrase": { + "message": "Запам'Ñтайте цю фразу." + }, + "memo": { + "message": "нотатка" + }, + "message": { + "message": "ПовідомленнÑ" + }, + "metamaskDescription": { + "message": "Під'єднуємо Ð²Ð°Ñ Ð´Ð¾ Ethereum та децентралізованої мережі." + }, + "metamaskVersion": { + "message": "ВерÑÑ–Ñ MetaMask" + }, + "mobileSyncText": { + "message": "Введіть пароль, щоб підтвердити Ñвою оÑобу!" + }, + "myAccounts": { + "message": "Мої облікові запиÑи" + }, + "myWalletAccounts": { + "message": "Облікові запиÑи мого гаманцÑ" + }, + "myWalletAccountsDescription": { + "message": "УÑÑ– ваші Ñтворені облікові запиÑи MetaMask буде автоматично додано в цей розділ." + }, + "mustSelectOne": { + "message": "Слід вибрати хоча б 1 токен." + }, + "needEtherInWallet": { + "message": "Щоб взаємодіÑти з децентралізованими заÑтоÑунками викориÑтовуючи MetaMask, вам буде потрібен Ether у вашому гаманці." + }, + "needImportFile": { + "message": "Потрібно вибрати файл Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ.", + "description": "User is important an account and needs to add a file to continue" + }, + "negativeETH": { + "message": "Ðе можливо наділÑати від'ємну кількіÑть ETH." + }, + "networkName": { + "message": "Ð†Ð¼â€™Ñ Ð¼ÐµÑ€ÐµÐ¶Ñ–" + }, + "networks": { + "message": "Мережі" + }, + "networkSettingsDescription": { + "message": "Додавайте та редагуйте мережі RPC, що можна налаштовувати" + }, + "nevermind": { + "message": "Ðе зважати" + }, + "newAccount": { + "message": "Ðовий обліковий запиÑ" + }, + "newAccountDetectedDialogMessage": { + "message": "ВиÑвлено нову адреÑу! Клацніть тут, щоб додати Ñ—Ñ— до вашої адреÑної книги." + }, + "newAccountNumberName": { + "message": "Обліковий Ð·Ð°Ð¿Ð¸Ñ $1", + "description": "Default name of next account to be created on create account screen" + }, + "newContact": { + "message": "Ðовий контакт" + }, + "newContract": { + "message": "Ðовий контракт" + }, + "newPassword": { + "message": "Ðовий пароль (мінімум 8 Ñимволів)" + }, + "newNetwork": { + "message": "Ðова мережа" + }, + "newToMetaMask": { + "message": "Вперше в MetaMask?" + }, + "noAlreadyHaveSeed": { + "message": "ÐÑ–, Ñ Ð²Ð¶Ðµ маю початкову фразу" + }, + "protectYourKeys": { + "message": "ЗахиÑтіть Ñвої ключі!" + }, + "protectYourKeysMessage1": { + "message": "Будьте обережними з вашою початковою фразою - надходила Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ Ñайти, Ñкі намагалиÑÑŒ імітувати MetaMask. MetaMask ніколи не запитує вашої початкової фрази!" + }, + "protectYourKeysMessage2": { + "message": "Тримайте Ñвою фразу у безпеці. Якщо ви бачите щоÑÑŒ фішингове або ви не впевнені щодо Ñайту, напишіть нам на support@metamask.io" + }, + "rpcUrl": { + "message": "Ðовий RPC URL" + }, + "optionalChainId": { + "message": "ChainID (необов’Ñзково)" + }, + "optionalSymbol": { + "message": "Символ (не обов'Ñзково)" + }, + "newTotal": { + "message": "Ðовий підÑумок" + }, + "newTransactionFee": { + "message": "Ðова коміÑÑ–Ñ Ð·Ð° транзакцію" + }, + "next": { + "message": "Далі" + }, + "noAddressForName": { + "message": "Ðа це ім'Ñ Ð½Ðµ вÑтановлено адреÑи." + }, + "noConversionRateAvailable": { + "message": "Ðемає доÑтупного обмінного курÑу" + }, + "noTransactions": { + "message": "У Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” транзакцій" + }, + "notEnoughGas": { + "message": "ÐедоÑтатньо газу" + }, + "noWebcamFoundTitle": { + "message": "Вебкамеру не знайдено" + }, + "noWebcamFound": { + "message": "Веб-камеру комп’ютера не знайдено. Повторіть Ñпробу." + }, + "ofTextNofM": { + "message": "з" + }, + "orderOneHere": { + "message": "Замовте Trezor або Ledger та зберігайте ваші кошти у холодному Ñховищі" + }, + "origin": { + "message": "ПоходженнÑ" + }, + "parameters": { + "message": "Параметри" + }, + "participateInMetaMetrics": { + "message": "ВзÑти учаÑть у MetaMetrics" + }, + "participateInMetaMetricsDescription": { + "message": "Беріть учаÑть у програмі MetaMetrics, щоб допомогти нам покращити MetaMask" + }, + "password": { + "message": "Пароль" + }, + "passwordsDontMatch": { + "message": "Паролі не збігаютьÑÑ" + }, + "passwordNotLongEnough": { + "message": "Пароль закороткий" + }, + "pastePrivateKey": { + "message": "Ð’Ñтавте ваш Ñ€Ñдок з оÑобиÑтим ключем Ñюди:", + "description": "For importing an account from a private key" + }, + "pending": { + "message": "очікує" + }, + "personalAddressDetected": { + "message": "ВиÑвлено оÑобиÑту адреÑу. Введіть контрактну адреÑу токена." + }, + "prev": { + "message": "Попередній" + }, + "primaryCurrencySetting": { + "message": "ПервіÑна валюта" + }, + "primaryCurrencySettingDescription": { + "message": "Оберіть \"рідна\", щоб пріоритезувати показ Ñум у рідних валютах мережі (напр.ETH). \nОберіть \"фіатна\", щоб пріоритезувати показ Ñум у ваших обраних фіатних валютах." + }, + "privacyMsg": { + "message": "Політика конфіденційноÑті" + }, + "privateKey": { + "message": "Закритий ключ", + "description": "select this type of file to use to import an account" + }, + "privateKeyWarning": { + "message": "Увага: Ðіколи не розкривайте цей ключ. Будь-хто з вашим Ñекретним ключем може викраÑти вÑÑ– Ñтатки з вашого облікового запиÑу." + }, + "privateNetwork": { + "message": "Приватна мережа" + }, + "queue": { + "message": "Черга" + }, + "readdToken": { + "message": "Ви можете знову додати цей токен у меню облікового запиÑу у розділі “Додати токенâ€. " + }, + "recents": { + "message": "ОÑтанні" + }, + "recipientAddress": { + "message": "ÐдреÑа отримувача" + }, + "recipientAddressPlaceholder": { + "message": "Пошук, публічна адреÑа (0x), або ENS" + }, + "rejectAll": { + "message": "Відхилити вÑе" + }, + "rejectTxsN": { + "message": "Відхилити транзакції ($1)" + }, + "rejectTxsDescription": { + "message": "Ви збираєтеÑÑ Ð¿Ð°ÐºÐµÑ‚Ð½Ð¾ відхилити транзакції ($1)." + }, + "rejected": { + "message": "Відмовлено" + }, + "reset": { + "message": "Скинути" + }, + "resetAccount": { + "message": "ПерезапуÑтити обліковий запиÑ" + }, + "resetAccountDescription": { + "message": "ПерезапуÑк вашого облікового запиÑу очиÑтить Ñ–Ñторію ваших транзакцій." + }, + "deleteNetwork": { + "message": "Видалити мережу?" + }, + "deleteNetworkDescription": { + "message": "Ви впевнені, що хочете видалити цю мережу?" + }, + "remindMeLater": { + "message": "Ðагадайте мені пізніше" + }, + "restoreFromSeed": { + "message": "Відновити обліковий запиÑ?" + }, + "restoreAccountWithSeed": { + "message": "Відновіть ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð·Ð° допомогою seed-фрази" + }, + "requestsAwaitingAcknowledgement": { + "message": "запити, що очікують на визнаннÑ" + }, + "required": { + "message": "Обов'Ñзкове" + }, + "restore": { + "message": "Відновити" + }, + "revealSeedWords": { + "message": "Показати мнемонічні Ñлова" + }, + "revealSeedWordsTitle": { + "message": "Мнемонічна фраза" + }, + "revealSeedWordsDescription": { + "message": "При зміні браузера або комп'ютера, вам знадобитьÑÑ seed-фраза Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ñтупу до ваших облікових запиÑів. Збережіть Ñ—Ñ— у надійному міÑці." + }, + "revealSeedWordsWarningTitle": { + "message": "ÐЕ передавайте цю фразу нікому!" + }, + "revealSeedWordsWarning": { + "message": "Ці Ñлова можуть бути викориÑтані, щоб вкраÑти вÑÑ– ваші облікові запиÑи." + }, + "remove": { + "message": "Видалити" + }, + "removeAccount": { + "message": "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу" + }, + "removeAccountDescription": { + "message": "Цей обліковий Ð·Ð°Ð¿Ð¸Ñ Ð±ÑƒÐ´Ðµ видалено з вашого гаманцÑ. Будь лаÑка, переконайтеÑÑŒ, що у Ð²Ð°Ñ Ñ” оригінальна seed-фраза чи Ñекретний ключ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ облікового запиÑу. Ви можете імпортувати або Ñтворювати облікові запиÑи у випадаючому меню вашого облікового запиÑу." + }, + "readyToConnect": { + "message": "Готові підключитиÑÑ?" + }, + "rinkeby": { + "message": "ТеÑтова мережа Rinkeby" + }, + "ropsten": { + "message": "ТеÑтова мережа Ropsten" + }, + "goerli": { + "message": "ТеÑтова мережа Goerli " + }, + "save": { + "message": "Зберегти" + }, + "slow": { + "message": "Повільна" + }, + "slower": { + "message": "Повільніше" + }, + "saveAsCsvFile": { + "message": "Зберегти Ñк файл CSV" + }, + "scanInstructions": { + "message": "Розташуйте QR-код перед вашою камерою" + }, + "scanQrCode": { + "message": "Сканувати QR-код" + }, + "search": { + "message": "Пошук" + }, + "searchResults": { + "message": "Результати пошуку" + }, + "secretBackupPhrase": { + "message": "Секретна резервна фраза" + }, + "secretBackupPhraseDescription": { + "message": "Ваша Ñекретна резервна фраза дозволÑÑ” легко Ñтворити резервну копію та відновити обліковий запиÑ." + }, + "secretBackupPhraseWarning": { + "message": "ЗÐСТЕРЕЖЕÐÐЯ: Ðіколи не розголошуйте вашу резервну фразу. Будь-хто з цією фразою зможе забрати ваш Ether назавжди." + }, + "secretPhrase": { + "message": "Введіть Ñекретну фразу з дванадцÑти Ñлів, щоб відновити Ñвоє Ñховище." + }, + "securityAndPrivacy": { + "message": "Безпека й конфіденційніÑть" + }, + "securitySettingsDescription": { + "message": "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ð²Ð°Ñ‚Ð½Ð¾Ñті та початкова фраза гаманцÑ" + }, + "seedPhrasePlaceholder": { + "message": "Відділіть кожне Ñлово одним пробілом" + }, + "seedPhraseReq": { + "message": "Початкові фрази мають 12 Ñлів" + }, + "selectCurrency": { + "message": "Виберіть валюту" + }, + "selectEachPhrase": { + "message": "Виберіть кожну фразу, щоб переконатиÑÑ, що вона правильна." + }, + "selectLocale": { + "message": "Оберіть локаль" + }, + "selectType": { + "message": "Обрати тип" + }, + "send": { + "message": "ÐадіÑлати" + }, + "sendAmount": { + "message": "ÐадіÑлати Ñуму" + }, + "sendETH": { + "message": "ÐадіÑлати ETH" + }, + "sendTokens": { + "message": "ÐадіÑлати токени" + }, + "sentEther": { + "message": "надіÑланий ефір" + }, + "sentTokens": { + "message": "надіÑлані токени" + }, + "separateEachWord": { + "message": "Відділіть кожне Ñлово одним пробілом" + }, + "searchTokens": { + "message": "Шукати токени" + }, + "selectAnAccount": { + "message": "Виберіть обліковий запиÑ" + }, + "selectAnAccountHelp": { + "message": "Оберіть обліковий Ð·Ð°Ð¿Ð¸Ñ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду в MetaMask" + }, + "selectAHigherGasFee": { + "message": "Оберіть вищу вартіÑть пального, щоб пришвидшити обробку вашої транзакції.*" + }, + "selectHdPath": { + "message": "Виберіть шлÑÑ… до HD-гаманцÑ" + }, + "selectPathHelp": { + "message": "Якщо ви не бачите ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ledger, Ñкий Ñ–Ñнує, Ñпробуйте переключити шлÑхи на \"Legacy (MEW / MyCrypto)\"" + }, + "settings": { + "message": "ÐалаштуваннÑ" + }, + "showAdvancedGasInline": { + "message": "Розширене ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ð°Ð·Ð¾Ð¼" + }, + "showAdvancedGasInlineDescription": { + "message": "Виберіть цей параметр, щоб відображати регулÑтори ціни й ліміту газу на екранах надÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¹ підтвердженнÑ." + }, + "showFiatConversionInTestnets": { + "message": "Показати беÑіду у Testnet" + }, + "showFiatConversionInTestnetsDescription": { + "message": "Оберіть це, щоб показати конверÑÑ–ÑŽ фіатних валют на Testnets" + }, + "showPrivateKeys": { + "message": "Показати приватні ключі" + }, + "showHexData": { + "message": "Показати шіÑтнадцÑтирикові дані" + }, + "showHexDataDescription": { + "message": "Оберіть це, щоб показати поле Ð´Ð»Ñ ÑˆÑ–ÑтнадцÑтирикових даних на екрані надÑиланнÑ" + }, + "sign": { + "message": "ПідпиÑати" + }, + "signatureRequest": { + "message": "Запит підпиÑу" + }, + "signed": { + "message": "ПідпиÑано" + }, + "signNotice": { + "message": "ПідпиÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶Ðµ мати небезпечний побічний ефект. ПідпиÑуйте тільки Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ Ñайтів, Ñким ви повніÑтю довірÑєте веÑÑŒ ваш обліковий запиÑ. Цей небезпечний метод буде уÑунуто у майбутній верÑÑ–Ñ—." + }, + "sigRequest": { + "message": "Запит підпиÑу" + }, + "somethingWentWrong": { + "message": "Ой! ЩоÑÑŒ пішло не так." + }, + "speedUp": { + "message": "Пришвидшити" + }, + "speedUpCancellation": { + "message": "Пришвидшити це ÑкаÑуваннÑ" + }, + "speedUpTransaction": { + "message": "ПриÑкорити цю транзакцію" + }, + "switchNetworks": { + "message": "Переключити мережі" + }, + "stateLogs": { + "message": "Логи Ñтану" + }, + "stateLogsDescription": { + "message": "Логи Ñтану міÑÑ‚Ñть ваші публічні адреÑи облікового запиÑу та надіÑлані транзакції." + }, + "stateLogError": { + "message": "При отриманні логів Ñтану ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°." + }, + "step1HardwareWallet": { + "message": "1. Приєднайте апаратний гаманець" + }, + "step1HardwareWalletMsg": { + "message": "Під'єднайте ваш апаратний гаманець безпоÑередньо до вашого комп'ютера." + }, + "step2HardwareWallet": { + "message": "2. Оберіть обліковий запиÑ" + }, + "step2HardwareWalletMsg": { + "message": "Оберіть обліковий запиÑ, Ñкий бажаєте переглÑнути. Ви можете вибрати лише один." + }, + "step3HardwareWallet": { + "message": "3. Почніть кориÑтуватиÑÑŒ dApps та більше!" + }, + "step3HardwareWalletMsg": { + "message": "ВикориÑтовуйте ваш апаратний обліковий запиÑ, Ñк би ви викориÑтовували будь-Ñкий обліковий Ð·Ð°Ð¿Ð¸Ñ Ethereum. Увійдіть в dApps, надÑилайте Eth, купуйте та зберігайте токени ERC20 та токени, Ñкі не Ñ” взаємозамінними, такі Ñк CryptoKitties." + }, + "storePhrase": { + "message": "Зберігайте цю фразу у менеджері паролів, Ñк 1Password." + }, + "submitted": { + "message": "ÐадіÑлано" + }, + "supportCenter": { + "message": "Відвідайте наш центр підтримки" + }, + "symbol": { + "message": "Символ" + }, + "symbolBetweenZeroTwelve": { + "message": "Символ повинен міÑтити 11 Ñимволів або менше." + }, + "syncWithMobile": { + "message": "Синхронізувати з мобільним приÑтроєм" + }, + "syncWithMobileTitle": { + "message": "Синхронізувати з мобільним" + }, + "syncWithMobileDesc": { + "message": "Ви можете Ñинхронізувати ваші облікові запиÑи та інформацію з вашим мобільним приÑтроєм. Відкрийте мобільний заÑтоÑунок MetaMask, перейдіть до \"ÐалаштуваннÑ\" та клацніть на \"Синхронізувати з Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ð°\"" + }, + "syncWithMobileDescNewUsers": { + "message": "Якщо ви відкрили мобільний заÑтоÑунок MetaMask вперше, проÑто Ñлідуйте крокам у вашому телефоні." + }, + "syncWithMobileScanThisCode": { + "message": "ВідÑкануйте цей код за допомогою мобільної програми MetaMask" + }, + "syncWithMobileBeCareful": { + "message": "ПереконайтеÑÑŒ, що ніхто не дивитьÑÑ Ð½Ð° ваш екран, коли Ñкануєте цей код" + }, + "syncWithMobileComplete": { + "message": "Ваші дані були уÑпішно Ñинхронізовані. ÐаÑолоджуйтеÑÑŒ мобільним заÑтоÑунком MetaMask!" + }, + "terms": { + "message": "Умови викориÑтаннÑ" + }, + "testFaucet": { + "message": "ТеÑтовий кран" + }, + "thisWillCreate": { + "message": "У результаті цієї дії буде Ñтворено новий гаманець Ñ– мнемонічна фраза" + }, + "tips": { + "message": "Чайові" + }, + "to": { + "message": "Кому" + }, + "token": { + "message": "Токен" + }, + "tokenAlreadyAdded": { + "message": "Токен вже був доданий." + }, + "tokenContractAddress": { + "message": "Контрактна адреÑа токену" + }, + "tokenSymbol": { + "message": "Символ токена" + }, + "total": { + "message": "УÑього" + }, + "transaction": { + "message": "транзакціÑ" + }, + "transactionConfirmed": { + "message": "Транзакцію підтверджено о $2." + }, + "transactionCreated": { + "message": "Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ñтворена з вартіÑтю $1 о $2." + }, + "transactionDropped": { + "message": "Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ð²Ð¿Ð°Ð»Ð° о $2." + }, + "transactionSubmitted": { + "message": "Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ð½Ð°Ð´Ñ–Ñлана з оплатою за газ $1 о $2." + }, + "transactionResubmitted": { + "message": "Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾ подана з підвищеною платою за газ до $1 о $2" + }, + "transactionUpdated": { + "message": "Ð§Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ—: $2." + }, + "transactionErrored": { + "message": "Під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ— ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°." + }, + "transactionCancelAttempted": { + "message": "СталаÑÑŒ Ñпроба ÑкаÑувати транзакцію з ціною пального $1 за $2" + }, + "transactionCancelSuccess": { + "message": "Транзакцію уÑпішно ÑкаÑовано на $2" + }, + "transactionError": { + "message": "Помилка транзакції. Ð’ контрактному коді виданий винÑток" + }, + "transactionErrorNoContract": { + "message": "Ви намагаєтеÑÑŒ викликати функцію за неконтрактною адреÑою." + }, + "transactionFee": { + "message": "КоміÑÑ–Ñ Ð·Ð° транзакцію" + }, + "transactionTime": { + "message": "Ð§Ð°Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ—" + }, + "transfer": { + "message": "Передати" + }, + "transferBetweenAccounts": { + "message": "Передати між моїми обліковими запиÑами" + }, + "transferFrom": { + "message": "Передати від" + }, + "troubleTokenBalances": { + "message": "Ð’ Ð½Ð°Ñ Ð²Ð¸Ð½Ð¸ÐºÐ»Ð¸ Ñкладнощі при завантаженні ваших залишків токенів. Ви можете переглÑнути Ñ—Ñ…", + "description": "Followed by a link (here) to view token balances" + }, + "tryAgain": { + "message": "Повторити" + }, + "typePassword": { + "message": "Введіть ваш пароль MetaMask" + }, + "unapproved": { + "message": "Ðе затверджено" + }, + "units": { + "message": "одиниці" + }, + "unknown": { + "message": "невідомо" + }, + "unknownNetwork": { + "message": "Ðезнайома приватна мережа" + }, + "unknownQrCode": { + "message": "Помилка: ми не змогли ідентифікувати цей QR-код " + }, + "unknownCameraErrorTitle": { + "message": "Отакої! ЩоÑÑŒ пішло не так..." + }, + "unknownCameraError": { + "message": "Виникла помилка при Ñпробі отримати доÑтуп до вашої камери. Будь лаÑка, Ñпробуйте знову..." + }, + "unlock": { + "message": "Розблокувати" + }, + "unlockMessage": { + "message": "Децентралізована мережа очікує" + }, + "updatedWithDate": { + "message": "Оновлено $1" + }, + "urlErrorMsg": { + "message": "URIs вимагають відповідного префікÑа HTTP/HTTPS." + }, + "usedByClients": { + "message": "ВикориÑтовуєтьÑÑ Ð½Ð¸Ð·ÐºÐ¾ÑŽ різних клієнтів" + }, + "userName": { + "message": "Ð†Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸Ñтувача" + }, + "viewAccount": { + "message": "ПереглÑнути обліковий запиÑ" + }, + "viewinExplorer": { + "message": "ДивитиÑÑŒ в Explorer" + }, + "viewContact": { + "message": "ПереглÑнути контакт" + }, + "viewOnCustomBlockExplorer": { + "message": "ДивитиÑÑŒ на $1" + }, + "viewOnEtherscan": { + "message": "ДивитиÑÑŒ на Etherscan" + }, + "visitWebSite": { + "message": "Відвідайте наш веб-Ñайт" + }, + "walletSeed": { + "message": "Seed гаманцÑ" + }, + "welcomeBack": { + "message": "З поверненнÑм!" + }, + "welcome": { + "message": "ЛаÑкаво проÑимо до MetaMask" + }, + "writePhrase": { + "message": "Запишіть цю фразу на аркуші паперу й покладіть у надійне міÑце. Ð”Ð»Ñ Ð±Ñ–Ð»ÑŒÑˆÐ¾Ñ— надійноÑті запишіть Ñ—Ñ— на кількох аркушах паперу й зберігайте кожен в 2–3 різних міÑцÑÑ…." + }, + "yesLetsTry": { + "message": "Так, давайте Ñпробуємо" + }, + "youNeedToAllowCameraAccess": { + "message": "Вам потрібно дозволити доÑтуп до камери, щоб кориÑтуватиÑÑŒ цією функцією." + }, + "yourSigRequested": { + "message": "Ðадійшов запит вашого підпиÑу" + }, + "youSign": { + "message": "Ви підпиÑуєте" + }, + "yourPrivateSeedPhrase": { + "message": "Ваша Ñекретна seed-фраза" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "Ціна пального на приÑÐºÐ¾Ñ€ÐµÐ½Ð½Ñ - нуль" + } +} diff --git a/app/_locales/vi/messages.json b/app/_locales/vi/messages.json index aee6474b63e5..1c55942ac059 100644 --- a/app/_locales/vi/messages.json +++ b/app/_locales/vi/messages.json @@ -1,52 +1,7 @@ { - "privacyMode": { - "message": "Chế độ riêng tư" - }, - "privacyModeDescription": { - "message": "Trang web phải yêu cầu quyá»n truy cập để xem thông tin tài khoản cá»§a bạn." - }, - "exposeAccounts": { - "message": "Hiển thị tài khoản" - }, - "exposeDescription": { - "message": "Hiển thị tài khoản cho trang web hiện tại. Hữu ích cho các ứng dụng cÅ©." - }, - "confirmExpose": { - "message": "Bạn có chắc chắn muốn hiển thị tài khoản cá»§a mình cho trang web hiện tại không?" - }, - "confirmClear": { - "message": "Bạn có chắc chắn muốn xóa các trang web được phê duyệt không?" - }, - "clearApprovalDataSuccess": { - "message": "Äã xóa thành công dữ liệu trang web được phê duyệt." - }, - "approvalData": { - "message": "Dữ liệu phê duyệt" - }, - "approvalDataDescription": { - "message": "Xóa dữ liệu trang web được phê duyệt để tất cả các trang web phải yêu cầu phê duyệt lại." - }, - "clearApprovalData": { - "message": "Xóa dữ liệu phê duyệt" - }, - "approve": { - "message": "Phê duyệt" - }, "reject": { "message": "Từ chối" }, - "providerAPIRequest": { - "message": "Yêu cầu API Web3" - }, - "reviewProviderRequest": { - "message": "Vui lòng xem lại yêu cầu API Ethereum này." - }, - "providerRequestInfo": { - "message": "Miá»n được liệt kê bên dưới Ä‘ang cố gắng yêu cầu quyá»n truy cập vào API Ethereum để nó có thể tương tác vá»›i chuá»—i khối Ethereum. Luôn kiểm tra kỹ xem bạn có Ä‘ang ở đúng trang web trước khi phê duyệt quyá»n truy cập Ethereum hay không." - }, - "accept": { - "message": "Chấp nhận" - }, "account": { "message": "Tài khoản" }, @@ -59,57 +14,29 @@ "addToken": { "message": "Thêm mã Token" }, - "address": { - "message": "Äịa chỉ" - }, "amount": { "message": "Số lượng" }, - "amountPlusGas": { - "message": "Số lượng + Gas" - }, "appDescription": { - "description": "Mô tả phần má»m", - "message": "Tính năng Ethereum cho trình duyệt" + "message": "Tính năng Ethereum cho trình duyệt", + "description": "The description of the application" }, "appName": { - "description": "Tên phần má»m", - "message": "MetaMask" + "message": "MetaMask", + "description": "The name of the application" + }, + "approve": { + "message": "Phê duyệt" }, "attemptingConnect": { "message": "Äang kết nối đến blockchain." }, - "available": { - "message": "Có sẵn" - }, "back": { "message": "Quay lại" }, "balance": { "message": "Số dư:" }, - "balanceIsInsufficientGas": { - "message": "Số dư không đủ để thanh toán tổng tiá»n gas hiện tại" - }, - "beta": { - "message": "Bản thá»­ nghiệm Beta" - }, - "betweenMinAndMax": { - "description": "trợ giúp để nhập hex dưới dạng số thập phân", - "message": "phải nhiá»u hÆ¡n hoặc bằng $1 và ít hÆ¡n hoặc bằng $2." - }, - "borrowDharma": { - "message": "Vay Dharma (thá»­ nghiệm)" - }, - "buy": { - "message": "Mua" - }, - "buyCoinbase": { - "message": "Mua trên Coinbase" - }, - "buyCoinbaseExplainer": { - "message": "Coinbase là dịch vụ ví Ä‘iện tá»­ thông dụng nhất thế giá»›i để mua bán Bitcoin, Ethereum, và Litecoin" - }, "buyCoinSwitch": { "message": "Mua trên CoinSwitch" }, @@ -119,112 +46,51 @@ "cancel": { "message": "Há»§y" }, - "clickCopy": { - "message": "Nhấp vào để sao chép" - }, "confirm": { "message": "Xác nhận" }, - "confirmContract": { - "message": "Xác nhận hợp đồng" - }, "confirmPassword": { "message": "Xác nhận mật khẩu" }, - "confirmTransaction": { - "message": "Xác nhận giao dịch" - }, - "continueToCoinbase": { - "message": "Tiếp tục đến Coinbase" - }, "continueToCoinSwitch": { "message": "Tiếp tục đến CoinSwitch" }, "contractDeployment": { "message": "Triển khai hợp đồng" }, - "conversionProgress": { - "message": "Äang chuyển đổi" - }, - "copiedButton": { - "message": "Äã sao chép" - }, - "copiedClipboard": { - "message": "Äã sao chép vào bá»™ nhá»› Clipboard" - }, "copiedExclamation": { "message": "Äã sao chép!" }, - "copy": { - "message": "Sao chép" - }, - "copyButton": { - "message": "Sao chép" + "copyToClipboard": { + "message": "Äã sao chép vào clipboard" }, "copyPrivateKey": { "message": "Äây là Khoá Bí Mật cá»§a bạn (nhấp vào để sao chép)" }, - "copyToClipboard": { - "message": "Äã sao chép vào clipboard" - }, "create": { "message": "Tạo" }, "createAccount": { "message": "Tạo tài khoản" }, - "createDen": { - "message": "Tạo" - }, - "crypto": { - "description": "Hình thức giao dịch (tiá»n Ä‘iện tá»­)", - "message": "Tiá»n Ä‘iện tá»­" - }, "customGas": { "message": "Tùy chỉnh gas" }, "customRPC": { "message": "Tùy chỉnh RPC" }, - "customize": { - "message": "Tùy chỉnh" - }, "defaultNetwork": { "message": "Mạng lưới mặc định dùng cho các giao dịch Ether là Main Net (tiá»n ETH thật)." }, - "denExplainer": { - "message": "Số DEN cá»§a bạn là mật khẩu đã được mã hóa và lưu trữ trong MetaMask" - }, "deposit": { "message": "Ký gá»­i/nạp tiá»n" }, - "depositBTC": { - "message": "Ký gá»­i BTC đến địa chỉ sau:" - }, - "depositEth": { - "message": "Ký gá»­i Eth" - }, "depositEther": { "message": "Ký gá»­i Ether" }, - "depositFiat": { - "message": "Ký gá»­i bằng tiá»n Fiat (USD, GBP, ...)" - }, - "depositFromAccount": { - "message": "Ký gá»­i từ má»™t tài khoản khác" - }, - "depositShapeShift": { - "message": "Ký gá»­i vá»›i ShapeShift" - }, - "depositShapeShiftExplainer": { - "message": "Nếu bạn sở hữu các đồng tiá»n Ä‘iện tá»­ khác, bạn có thể giao dịch và ký gá»­i Ether trá»±c tiếp vào ví MetaMask cá»§a bạn. Không cần tạo thêm tài khoản." - }, "details": { "message": "Chi tiết" }, - "directDeposit": { - "message": "Ký gá»­i trá»±c tiếp" - }, "directDepositEther": { "message": "Ký gá»­i Ether trá»±c tiếp" }, @@ -237,115 +103,65 @@ "edit": { "message": "Chỉnh sá»­a" }, - "editAccountName": { - "message": "Chỉnh sá»­a tên tài khoản" - }, - "encryptNewDen": { - "message": "Mã hóa số DEN má»›i cá»§a bạn" - }, "enterPassword": { "message": "Nhập mật khẩu" }, "etherscanView": { "message": "Xem tài khoản trên Etherscan" }, - "exchangeRate": { - "message": "Tá»· giá" - }, "exportPrivateKey": { "message": "Xuất mã khóa cá nhân" }, - "exportPrivateKeyWarning": { - "message": "Xuất mã khóa cá nhân theo rá»§i ro tá»± chịu" - }, "failed": { "message": "Không thành công" }, "fiat": { - "description": "Hình thức giao dịch", - "message": "FIAT" + "message": "FIAT", + "description": "Exchange type" }, "fileImportFail": { - "description": "Giúp ngưá»i dùng nhập tài khoản từ tập tin JSON", - "message": "Tập tin đã nhập không hoạt động? Nhấp vào đây!" + "message": "Tập tin đã nhập không hoạt động? Nhấp vào đây!", + "description": "Helps user import their account from a JSON file" }, "from": { "message": "Từ" }, - "fromShapeShift": { - "message": "Từ ShapeShift" - }, - "gas": { - "description": "Viết tắt cá»§a giá ga", - "message": "Ga" - }, - "gasFee": { - "message": "Tiá»n ga" - }, "gasLimit": { "message": "Hạn mức ga" }, - "gasLimitCalculation": { - "message": "Chúng tôi tính toán và gợi ý má»™t hạn mức ga cụ thể dá»±a trên tá»· lệ thành công cá»§a hệ thống." - }, - "gasLimitRequired": { - "message": "Hạn mức ga được yêu cầu" - }, "gasLimitTooLow": { "message": "Hạn mức ga phải đạt tối thiểu 21000" }, "gasPrice": { "message": "Giá ga (GWEI)" }, - "gasPriceCalculation": { - "message": "Chúng tôi tính toán và gợi ý má»™t giá ga cụ thể dá»±a trên tá»· lệ thành công cá»§a hệ thống." - }, - "gasPriceRequired": { - "message": "Giá ga được yêu cầu" - }, "getEther": { "message": "Lấy Ether" }, "getEtherFromFaucet": { - "description": "Hiển thị tên mạng cho vòi Ether", - "message": "Lấy Ether từ vòi vá»›i giá $1" - }, - "greaterThanMin": { - "description": "trợ giúp để nhập hex dưới dạng số thập phân", - "message": "phải nhiá»u hÆ¡n hoặc bằng $1" + "message": "Lấy Ether từ vòi vá»›i giá $1", + "description": "Displays network name for Ether faucet" }, "here": { - "description": "như trong -Nhấp vào đây để xem thêm thông tin- (dùng vá»›i các số dư token có vấn Ä‘á»)", - "message": "tại đây" + "message": "tại đây", + "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, "hide": { "message": "Ẩn" }, - "hideToken": { - "message": "Ẩn mã token" - }, "hideTokenPrompt": { "message": "Ẩn mã token?" }, - "howToDeposit": { - "message": "Bạn muốn ký gá»­i Ether bằng cách nào?" - }, "import": { - "description": "Nút để nhập tài khoản từ má»™t tập tin đã chá»n", - "message": "Nhập" + "message": "Nhập", + "description": "Button to import an account from a selected file" }, "importAccount": { "message": "Nhập tài khoản" }, - "importAnAccount": { - "message": "Nhập má»™t tài khoản" - }, - "importDen": { - "message": "Nhập mã DEN hiện hành" - }, "imported": { - "description": "Trạng thái hiển thị cho má»™t tài khoản đã được tải toàn bá»™ vào chùm chìa khóa", - "message": "Äã nhập" + "message": "Äã nhập", + "description": "status showing that an account has been fully loaded into the keyring" }, "infoHelp": { "message": "Thông tin & Trợ giúp" @@ -353,53 +169,31 @@ "invalidAddress": { "message": "Äịa chỉ không hợp lệ" }, - "invalidGasParams": { - "message": "Thông số ga không hợp lệ" - }, "invalidInput": { "message": "Thông tin nhập vào không hợp lệ" }, - "invalidRequest": { - "message": "Yêu cầu không hợp lệ" - }, "jsonFile": { - "description": "định dạng để nhập tài khoản", - "message": "Tập tin JSON" + "message": "Tập tin JSON", + "description": "format for importing an account" }, "kovan": { "message": "Mạng thá»­ nghiệm Kovan" }, - "lessThanMax": { - "description": "trợ giúp để nhập hex dưới dạng số thập phân", - "message": "phải ít hÆ¡n hoặc bằng $1." - }, - "limit": { - "message": "Giá»›i hạn" - }, "loading": { "message": "Äang tải..." }, "loadingTokens": { "message": "Äang tải mã token..." }, - "localhost": { - "message": "Localhost 8545" - }, - "logout": { + "lock": { "message": "Thoát" }, - "loose": { - "message": "Ná»›i lá»ng" - }, "mainnet": { "message": "Mạng Ethereum MainNet (tiá»n ETH thật)" }, "message": { "message": "Tin nhắn" }, - "min": { - "message": "Tối thiểu" - }, "myAccounts": { "message": "Tài khoản cá»§a tôi" }, @@ -407,12 +201,8 @@ "message": "Äể tương tác vá»›i các ứng dụng phân tán bằng MetaMask, bạn sẽ phải cần có Ether trong ví cá»§a bạn." }, "needImportFile": { - "description": "Ngưá»i dùng Ä‘ang nhập má»™t tài khoản và cần thêm tập tin để tiếp tục", - "message": "Bạn phải chá»n má»™t tập tin để nhập." - }, - "needImportPassword": { - "description": "Mật khẩu và tập tin cần thiết để nhập má»™t tài khoản", - "message": "Bạn phải Ä‘iá»n mật khẩu cho tập tin đã chá»n." + "message": "Bạn phải chá»n má»™t tập tin để nhập.", + "description": "User is important an account and needs to add a file to continue" }, "networks": { "message": "Các mạng lưới" @@ -421,8 +211,8 @@ "message": "Tài khoản má»›i" }, "newAccountNumberName": { - "description": "Tên mặc định cá»§a tài khoản tiếp theo để tạo trên màn hình tài khoản", - "message": "Tài khoản $1" + "message": "Tài khoản $1", + "description": "Default name of next account to be created on create account screen" }, "newContract": { "message": "Hợp đồng má»›i" @@ -430,58 +220,22 @@ "newPassword": { "message": "Mật khẩu má»›i (tối thiểu 8 ký tá»±)" }, - "newRecipient": { - "message": "Ngưá»i nhận má»›i" - }, "next": { "message": "Kế tiếp" }, "noAddressForName": { "message": "Không có địa chỉ nào được ấn định cho tên này." }, - "noDeposits": { - "message": "Không có tiá»n ký gá»­i nào được nhận" - }, - "noTransactionHistory": { - "message": "Không có lịch sá»­ giao dịch" - }, "noTransactions": { "message": "Không có giao dịch" }, - "notStarted": { - "message": "Chưa bắt đầu" - }, - "oldUI": { - "message": "Giao diện cÅ©" - }, - "oldUIMessage": { - "message": "Bạn vừa quay vá» giao diện cÅ©. Bạn có thể chuyển đổi sang giao diện má»›i bằng tùy chá»n trong menu ở góc phải trên cùng." - }, - "or": { - "description": "lá»±a chá»n giữa tạo hay nhập má»™t tài khoản má»›i", - "message": "hoặc" - }, - "passwordMismatch": { - "description": "trong quá trình tạo mật khẩu, hai trưá»ng mật khẩu má»›i không khá»›p", - "message": "mật khẩu không khá»›p" - }, - "passwordShort": { - "description": "trong quá trình tạo mật khẩu, mật khẩu không đủ dài để đảm bảo an toàn", - "message": "mật khẩu không đủ dài" - }, "pastePrivateKey": { - "description": "Dùng cho việc nhập tài khoản từ má»™t khóa cá nhân", - "message": "Dán dãy khóa cá nhân cá»§a bạn tại đây:" - }, - "pasteSeed": { - "message": "Dán Mật Khẩu Sinh Khoá (seed phrase) cá»§a bạn tại đây!" - }, - "pleaseReviewTransaction": { - "message": "Vui lòng xem lại giao dịch cá»§a bạn." + "message": "Dán dãy khóa cá nhân cá»§a bạn tại đây:", + "description": "For importing an account from a private key" }, "privateKey": { - "description": "chá»n định dạng tập tin này để nhập má»™t tài khoản", - "message": "Khóa Bí Mật" + "message": "Khóa Bí Mật", + "description": "select this type of file to use to import an account" }, "privateKeyWarning": { "message": "Cảnh báo: Không bao giỠđược tiết lá»™ khóa này. Bất kỳ ai có Khóa Bí Mật cá»§a bạn Ä‘á»u có thể đánh cắp tài sản được giữ trong tài khoản cá»§a bạn." @@ -489,100 +243,50 @@ "privateNetwork": { "message": "Mạng lưới riêng" }, - "qrCode": { - "message": "Hiển thị mã QR" - }, - "readMore": { - "message": "Äá»c thêm tại đây." - }, "readdToken": { "message": "Bạn có thể thêm trở lại mã token này bằng cách nhấn \"Thêm mã token\" trong menu tùy chá»n trong tài khoản cá»§a bạn." }, - "receive": { - "message": "Nhận" - }, "recipientAddress": { "message": "Äịa chỉ ngưá»i nhận" }, - "refundAddress": { - "message": "Äịa chỉ hoàn trả lại cá»§a bạn" - }, "rejected": { "message": "Không chấp thuận/Bị từ chối" }, "required": { "message": "Yêu cầu" }, - "retryWithMoreGas": { - "message": "Thá»­ lại vá»›i má»™t giá ga cao hÆ¡n tại đây" - }, - "revert": { - "message": "Chuyển lại" - }, "rinkeby": { "message": "Mạng thá»­ nghiệm Rinkeby" }, "ropsten": { "message": "Mạng thá»­ nghiệm Ropsten" }, - "sampleAccountName": { - "description": "Giúp ngưá»i dùng hiểu khái niệm thêm má»™t cái tên có thể Ä‘á»c được vào tài khoản cá»§a há»", - "message": "Ví dụ, Tài khoản má»›i cá»§a tôi" - }, "save": { "message": "Lưu" }, - "saveAsFile": { - "description": "Quá trình xuất tài khoản", - "message": "Lưu lại dưới dạng tập tin" - }, - "selectService": { - "message": "Chá»n dịch vụ" - }, "send": { "message": "Gá»­i" }, "sendTokens": { "message": "Gá»­i mã token" }, - "sendTokensAnywhere": { - "message": "Gá»­i mã token đến bất kỳ ai có tài khoản Ethereum" - }, "settings": { "message": "Cài đặt" }, - "shapeshiftBuy": { - "message": "Mua vá»›i ShapeShift" - }, "showPrivateKeys": { "message": "Hiển thị khóa cá nhân" }, - "showQRCode": { - "message": "Hiển thị mã QR" - }, - "sigRequest": { - "message": "Yêu cầu chữ ký" - }, - "sigRequested": { - "message": "Äã yêu cầu chữ ký" - }, "sign": { "message": "Ký nhận" }, - "signMessage": { - "message": "Ký nhận tin nhắn" + "signatureRequest": { + "message": "Yêu cầu chữ ký" }, "signNotice": { "message": "Ký nhận vào tin nhắn này có thể gây nguy hiểm. Chỉ nên ký nhận tin nhắn từ những nguồn bạn hoàn toàn tin tưởng có thể dùng vá»›i tài khoản cá»§a bạn. Cách thức nguy hiểm này sẽ bị xóa trong phiên bản sắp tá»›i." }, - "status": { - "message": "Trạng thái" - }, - "submit": { - "message": "Gá»­i Ä‘i" - }, - "takesTooLong": { - "message": "Chá» quá lâu?" + "sigRequest": { + "message": "Yêu cầu chữ ký" }, "testFaucet": { "message": "Vòi nhận tiá»n ETH ảo để thá»­ nghiệm" @@ -590,70 +294,32 @@ "to": { "message": "Äến" }, - "toETHviaShapeShift": { - "description": "hệ thống sẽ Ä‘iá»n vào loại tiá»n gá»­i khi bắt đầu tin nhắn", - "message": "$1 thành ETH qua ShapeShift" - }, - "tokenBalance": { - "message": "Số dư token cá»§a bạn là:" - }, "total": { "message": "Tổng cá»™ng" }, - "transactionMemo": { - "message": "Ghi nhá»› giao dịch (tùy chá»n)" - }, - "transactionNumber": { - "message": "Số thứ tá»± giao dịch" - }, - "transfers": { - "message": "Các giao dịch" - }, "troubleTokenBalances": { - "description": "Kèm theo má»™t đưá»ng link (tại đây) để xem số dư token.", - "message": "Chúng tôi gặp sá»± cố khi tải số dư token cá»§a bạn. Xin vui lòng xem lại" + "message": "Chúng tôi gặp sá»± cố khi tải số dư token cá»§a bạn. Xin vui lòng xem lại", + "description": "Followed by a link (here) to view token balances" }, "typePassword": { "message": "Äiá»n mật khẩu cá»§a bạn" }, - "uiWelcome": { - "message": "Chào mừng bạn đến vá»›i giao diện má»›i (Beta)" - }, - "uiWelcomeMessage": { - "message": "Bạn Ä‘ang sá»­ dụng giao diện má»›i cá»§a MetaMask. Chúng tôi khuyến khích bạn thá»­ nghiệm và khám phá các tính năng má»›i như gá»­i token, và nếu bạn có gặp phải vấn đỠgì khó khăn, xin hãy liên hệ ngay để chúng tôi có thể giúp đỡ bạn." - }, - "unavailable": { - "message": "Không có sẵn" - }, "unknown": { "message": "Không xác định" }, "unknownNetwork": { "message": "Mạng lưới riêng không xác định" }, - "unknownNetworkId": { - "message": "ID không xác định" - }, - "usaOnly": { - "description": "Việc sá»­ dụng hệ thống giao dịch này chỉ giá»›i hạn cho ngưá»i dùng ở Mỹ", - "message": "Chỉ áp dụng cho ngưá»i dùng ở Mỹ" - }, "usedByClients": { "message": "ÄÆ°á»£c sá»­ dụng bởi nhiá»u khách hàng khác nhau" }, "viewAccount": { "message": "Xem tài khoản" }, - "warning": { - "message": "Cảnh báo" - }, - "whatsThis": { - "message": "Äây là gì?" + "yourSigRequested": { + "message": "Chữ ký cá»§a bạn Ä‘ang được yêu cầu" }, "youSign": { "message": "Bạn Ä‘ang ký nhận" - }, - "yourSigRequested": { - "message": "Chữ ký cá»§a bạn Ä‘ang được yêu cầu" - } + } } diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json index d14b99acbf18..bd13f3ac1a03 100644 --- a/app/_locales/zh_CN/messages.json +++ b/app/_locales/zh_CN/messages.json @@ -1,66 +1,66 @@ { - "privacyMode": { - "message": "éšç§æ¨¡å¼" + "chartOnlyAvailableEth": { + "message": "èŠå¤©åŠŸèƒ½ä»…å¯¹ä»¥å¤ªåŠç½‘络开放。" }, - "privacyModeDescription": { - "message": "网站必须请求访问æƒé™æ‰èƒ½æŸ¥çœ‹æ‚¨çš„叿ˆ·ä¿¡æ¯ã€‚" + "contractInteraction": { + "message": "åˆçº¦äº¤äº’" }, - "exposeAccounts": { - "message": "公开账户" + "reject": { + "message": "æ‹’ç»" }, - "exposeDescription": { - "message": "将叿ˆ·å…¬å¼€ç»™å½“å‰ç½‘站。对传统dapps很有用。" + "about": { + "message": "关于" }, - "confirmExpose": { - "message": "您确定è¦å°†å¸æˆ·å…¬å¼€åˆ°å½“å‰ç½‘ç«™å—?" + "aboutSettingsDescription": { + "message": "ç‰ˆæœ¬ã€æŠ€æœ¯æ”¯æŒä¸­å¿ƒå’Œè”系方å¼ã€‚" }, - "confirmClear": { - "message": "æ‚¨ç¡®å®šè¦æ¸…除已批准的网站å—?" + "acceleratingATransaction": { + "message": "* 设定更高天燃气价格,加快交易完æˆè¿›åº¦ï¼Œæé«˜ç½‘ç»œå¿«é€Ÿå¤„ç†æœºçŽ‡ï¼Œä½†æ— æ³•ä¿è¯æ¯æ¬¡å‡èƒ½å¤Ÿå®žçްæé€Ÿã€‚" }, - "clearApprovalDataSuccess": { - "message": "已批准的网站数æ®å·²æˆåŠŸæ¸…é™¤ã€‚" + "accessingYourCamera": { + "message": "正在获å–相机使用æƒé™..." }, - "approvalData": { - "message": "审批数æ®" + "account": { + "message": "账户" }, - "approvalDataDescription": { - "message": "清除已批准的网站数æ®ï¼Œä»¥ä¾¿æ‰€æœ‰ç½‘ç«™éƒ½å¿…é¡»å†æ¬¡ç”³è¯·" + "accountDetails": { + "message": "账户详情" }, - "clearApprovalData": { - "message": "清除批准数æ®" + "accountName": { + "message": "账户åç§°" }, - "approve": { - "message": "批准" + "accountOptions": { + "message": "账户选项" }, - "reject": { - "message": "æ‹’ç»" + "accountSelectionRequired": { + "message": "您需è¦é€‰æ‹©ä¸€ä¸ªè´¦æˆ· ï¼" }, - "providerAPIRequest": { - "message": "Web3 API请求" + "activityLog": { + "message": "活动日志" }, - "reviewProviderRequest": { - "message": "请查看此Ethereum API请求。" + "addNetwork": { + "message": "添加网络" }, - "providerRequestInfo": { - "message": "下é¢åˆ—出的域正在å°è¯•请求访问Ethereum API,以便它å¯ä»¥ä¸Žä»¥å¤ªåŠåŒºå—链进行交互。在批准Ethereum访问之å‰ï¼Œè¯·åŠ¡å¿…ä»”ç»†æ£€æŸ¥æ‚¨æ˜¯å¦åœ¨æ­£ç¡®çš„站点上。" + "addRecipient": { + "message": "添加收件人" }, - "accept": { - "message": "接å—" + "advanced": { + "message": "高级" }, - "account": { - "message": "账户" + "advancedSettingsDescription": { + "message": "访问开å‘è€…åŠŸèƒ½ï¼Œä¸‹è½½çŠ¶æ€æ—¥å¿—,é‡ç½®è´¦æˆ·ï¼Œå®‰æŽ’测试网络和自定义 RPC 。" }, - "accountDetails": { - "message": "账户详情" + "advancedOptions": { + "message": "高级选项" }, - "accountName": { - "message": "账户åç§°" + "addToAddressBook": { + "message": "添加地å€ç°¿" }, - "address": { - "message": "地å€" + "addToAddressBookModalPlaceholder": { + "message": "如:John D." }, - "addCustomToken": { - "message": "添加自定义代å¸" + "addAlias": { + "message": "添加别å" }, "addToken": { "message": "添加代å¸" @@ -68,15 +68,15 @@ "addTokens": { "message": "添加代å¸" }, + "addSuggestedTokens": { + "message": "添加推è代å¸" + }, "addAcquiredTokens": { - "message": "在Metamask上添加已用的代å¸" + "message": "在MetaMask上添加已用的代å¸" }, "amount": { "message": "æ•°é‡" }, - "amountPlusGas": { - "message": "æ•°é‡ + Gas" - }, "appDescription": { "message": "ä»¥å¤ªåŠæµè§ˆå™¨æ’ä»¶", "description": "The description of the application" @@ -85,54 +85,81 @@ "message": "MetaMask", "description": "The name of the application" }, + "approve": { + "message": "批准" + }, "approved": { "message": "批准" }, + "asset": { + "message": "资产" + }, "attemptingConnect": { "message": "正在å°è¯•连接区å—链。" }, + "attemptToCancel": { + "message": "想è¦å–消å—?" + }, + "attemptToCancelDescription": { + "message": "确认æäº¤è¯¥æ“作无法ä¿è¯èƒ½å¤ŸæˆåŠŸå–æ¶ˆæ‚¨çš„åŽŸå§‹äº¤æ˜“ã€‚å¦‚æžœå–æ¶ˆæˆåŠŸï¼Œæ‚¨å°†è¢«æ”¶å–上述交易费用。" + }, "attributions": { "message": "æ¥æº" }, - "available": { - "message": "å¯ç”¨" + "autoLockTimeLimit": { + "message": "自动注销计时器(分钟)" + }, + "autoLockTimeLimitDescription": { + "message": "请设置 MetaMask 自动注销å‰çš„空闲时间(以分钟为å•ä½ï¼‰" + }, + "average": { + "message": "å¹³å‡å€¼" }, "back": { "message": "返回" }, + "backToAll": { + "message": "æ¢å¤æ‰€æœ‰è®¾ç½®" + }, + "backupApprovalNotice": { + "message": "请备份您的ç§å¯†æ¢å¤ä»£ç ï¼Œä¿è¯ä¸ªäººé’±åŒ…和资金安全。" + }, + "backupApprovalInfo": { + "message": "å¦‚æžœä¸æ…Žä¸¢å¤±ä¸ªäººè®¾å¤‡ï¼Œå¿˜è®°å¯†ç ï¼Œæˆ–者需è¦é‡æ–°å®‰è£… MetaMask,亦或是需在å¦ä¸€å°è®¾å¤‡ä¸Šæ‰“开钱包,请使用该ä¿å¯†ç æ¢å¤ä¸ªäººé’±åŒ…æ•°æ®ã€‚" + }, + "backupNow": { + "message": "ç«‹å³å¤‡ä»½" + }, "balance": { "message": "ä½™é¢ï¼š" }, - "balances": { - "message": "代å¸ä½™é¢" + "balanceOutdated": { + "message": "ä½™é¢å¯èƒ½å·²è¿‡æœŸ" }, - "balanceIsInsufficientGas": { - "message": "当å‰ä½™é¢ä¸è¶³ä»¥æ”¯ä»˜ Gas" + "basic": { + "message": "基本" }, - "beta": { - "message": "BETA" + "blockExplorerUrl": { + "message": "å±è”½ç®¡ç†å™¨" }, - "betweenMinAndMax": { - "message": "必须大于等于 $1 并且å°äºŽç­‰äºŽ $2 。", - "description": "helper for inputting hex as decimal input" + "blockExplorerView": { + "message": "通过 $1 查看账户", + "description": "$1 replaced by URL for custom block explorer" }, "blockiesIdenticon": { "message": "使用区å—Identicon" }, - "borrowDharma": { - "message": "Borrow With Dharma (Beta)" + "browserNotSupported": { + "message": "您的æµè§ˆå™¨ä¸æ”¯æŒè¯¥åŠŸèƒ½â€¦" }, "builtInCalifornia": { "message": "MetaMask在加利ç¦å°¼äºšè®¾è®¡å’Œåˆ¶é€ ã€‚" }, - "buy": { - "message": "è´­ä¹°" - }, - "buyCoinbase": { - "message": "在 Coinbase 上购买" + "buyWithWyre": { + "message": "使用 Wyre è´­ä¹° ETH" }, - "buyCoinbaseExplainer": { - "message": "Coinbase 是世界上最æµè¡Œçš„ä¹°å–æ¯”特å¸ï¼Œä»¥å¤ªå¸å’ŒèŽ±ç‰¹å¸çš„交易所。" + "buyWithWyreDescription": { + "message": "您å¯ä»¥é€šè¿‡ Wyre 使用信用å¡å°† ETH 存入您的 MetaMask 账户。" }, "buyCoinSwitch": { "message": "在CoinSwitch上购买" @@ -140,44 +167,89 @@ "buyCoinSwitchExplainer": { "message": "CoinSwitch是以最优惠的价格交æ¢è¶…过300ç§åŠ å¯†è´§å¸çš„一站å¼ç›®çš„地。" }, + "bytes": { + "message": "字节" + }, + "off": { + "message": "å…³" + }, "ok": { "message": "确认" }, + "on": { + "message": "å¯ç”¨" + }, + "optionalBlockExplorerUrl": { + "message": "å±è”½ç®¡ç†å™¨ URL(选填)" + }, "cancel": { "message": "å–æ¶ˆ" }, - "classicInterface": { - "message": "使用ç»å…¸æŽ¥å£" + "cancelAttempt": { + "message": "å–æ¶ˆæ“作" }, - "clickCopy": { - "message": "点击å¤åˆ¶" + "cancellationGasFee": { + "message": "å–æ¶ˆå¤©ç„¶æ°”è´¹" + }, + "cancelled": { + "message": "已喿¶ˆ" + }, + "chainId": { + "message": "链 ID" + }, + "clickToRevealSeed": { + "message": "点击此处显示密语" }, "close": { "message": "关闭" }, + "chromeRequiredForHardwareWallets": { + "message": "您需è¦é€šè¿‡ Google Chrome æµè§ˆå™¨ä½¿ç”¨ MetaMask ,连接个人硬件钱包。" + }, "confirm": { "message": "确认" }, "confirmed": { "message": "确认" }, - "confirmContract": { - "message": "确认åˆçº¦" - }, "confirmPassword": { "message": "确认密ç " }, - "confirmTransaction": { - "message": "确认交易" + "confirmSecretBackupPhrase": { + "message": "请确认您的ç§å¯†å¤‡ä»½å¯†è¯­" + }, + "congratulations": { + "message": "æ­å–œ" }, "connectHardwareWallet": { "message": "链接硬件钱包" }, - "continue": { - "message": "ç»§ç»­" + "connect": { + "message": "连接" + }, + "connectingTo": { + "message": "正在连接 $1" + }, + "connectingToKovan": { + "message": "正在连接到Kovan测试网络" + }, + "connectingToMainnet": { + "message": "正在连接到以太åŠä¸»ç½‘" + }, + "connectingToRopsten": { + "message": "正在连接到Ropsten测试网络" + }, + "connectingToRinkeby": { + "message": "正在连接到Rinkeby测试网络" + }, + "connectingToLocalhost": { + "message": "正在连接 Localhost 8545" }, - "continueToCoinbase": { - "message": "继续访问 Coinbase" + "connectingToGoerli": { + "message": "正在连接 Goerli 测试网络" + }, + "continueToWyre": { + "message": "ç»§ç»­å‰å¾€ Wyre" }, "continueToCoinSwitch": { "message": "继续访问 CoinSwitch" @@ -185,30 +257,21 @@ "contractDeployment": { "message": "åˆçº¦éƒ¨ç½²" }, - "conversionProgress": { - "message": "正在进行转æ¢" - }, - "copiedButton": { - "message": "å·²å¤åˆ¶" - }, - "copiedClipboard": { - "message": "å·²å¤åˆ¶åˆ°å‰ªè´´æ¿" - }, "copiedExclamation": { "message": "å·²å¤åˆ¶" }, - "copiedSafe": { - "message": "我已将它å¤åˆ¶ä¿å­˜åˆ°æŸä¸ªå®‰å…¨çš„地方" + "copyAddress": { + "message": "将地å€å¤åˆ¶åˆ°å‰ªè´´æ¿" + }, + "copyTransactionId": { + "message": "å¤åˆ¶äº¤æ˜“ ID" }, - "copy": { - "message": "å¤åˆ¶" + "copiedTransactionId": { + "message": "交易 ID å¤åˆ¶æˆåŠŸ" }, "copyToClipboard": { "message": "å¤åˆ¶åˆ°å‰ªè´´æ¿" }, - "copyButton": { - "message": " å¤åˆ¶ " - }, "copyPrivateKey": { "message": "这是你的ç§é’¥ï¼ˆç‚¹å‡»å¤åˆ¶ï¼‰" }, @@ -218,28 +281,27 @@ "createAccount": { "message": "创建账户" }, - "createDen": { - "message": "创建" + "createAWallet": { + "message": "创建钱包" }, - "crypto": { - "message": "加密", - "description": "Exchange type (cryptocurrencies)" + "createPassword": { + "message": "创建密ç " }, - "currentConversion": { - "message": "当剿±‡çއ" + "currencyConversion": { + "message": "è´§å¸å…‘æ¢" }, - "currentNetwork": { - "message": "当å‰ç½‘络" + "currentLanguage": { + "message": "当å‰è¯­è¨€" }, "customGas": { "message": "自定义 Gas" }, + "customGasSubTitle": { + "message": "æå‡è´¹ç”¨å¯èƒ½ä¼šç¼©çŸ­å¤„ç†æ—¶é—´ï¼Œä½†ä¸ä¿è¯ç»å¯¹æœ‰æ•ˆã€‚" + }, "customToken": { "message": "自定义代å¸" }, - "customize": { - "message": "自定义" - }, "customRPC": { "message": "自定义 RPC" }, @@ -252,39 +314,21 @@ "defaultNetwork": { "message": "默认以太åŠäº¤æ˜“网络为主网。" }, - "denExplainer": { - "message": "ä½ çš„ DEN 是存储在 MetaMask 中的已加密密ç ã€‚" + "delete": { + "message": "删除" + }, + "deleteAccount": { + "message": "删除账户" }, "deposit": { "message": "存入" }, - "depositBTC": { - "message": "将你的 BTC 存入到下é¢çš„地å€ï¼š" - }, - "depositEth": { - "message": "存入 Eth" - }, "depositEther": { "message": "存入 Ether" }, - "depositFiat": { - "message": "从 Fiat 存入" - }, - "depositFromAccount": { - "message": "从其他账户存入" - }, - "depositShapeShift": { - "message": "从 ShapeShift 存入" - }, - "depositShapeShiftExplainer": { - "message": "如果你拥有其他加密货å¸ï¼Œä½ å¯ä»¥ç›´æŽ¥äº¤æ˜“并存入 Ether 到你的 MetaMask 钱包。 ä¸éœ€è¦å¸æˆ·ã€‚" - }, "details": { "message": "详情" }, - "directDeposit": { - "message": "直接存入" - }, "directDepositEther": { "message": "直接存入 Ether" }, @@ -294,54 +338,96 @@ "done": { "message": "完æˆ" }, + "downloadGoogleChrome": { + "message": "下载 Google Chrome æµè§ˆå™¨" + }, + "downloadSecretBackup": { + "message": "下载ç§å¯†å¤‡ä»½å¯†è¯­ï¼Œå¹¶ä½¿ç”¨å¤–部加密硬盘或存储媒介妥善ä¿ç®¡ã€‚" + }, "downloadStateLogs": { "message": "下载日志" }, + "dontHaveAHardwareWallet": { + "message": "没有硬件钱包?" + }, "dropped": { "message": "丢弃" }, "edit": { "message": "编辑" }, - "editAccountName": { - "message": "编辑账户åç§°" + "editContact": { + "message": "编辑è”系人" + }, + "endOfFlowMessage1": { + "message": "您已通过测试 - 请妥善ä¿ç®¡ä½ çš„ç§å­å¯†è¯­ã€‚这是您的责任ï¼" + }, + "endOfFlowMessage2": { + "message": "安全ä¿å­˜å°æŠ€å·§" + }, + "endOfFlowMessage3": { + "message": "在多处ä¿å­˜å¤‡ä»½æ•°æ®ã€‚" }, - "emailUs": { - "message": "è”系我们" + "endOfFlowMessage4": { + "message": "ç»ä¸å‘任何分享该密语。" }, - "encryptNewDen": { - "message": "加密你的新 DEN" + "endOfFlowMessage5": { + "message": "谨防网络钓鱼ï¼MetaMask ç»ä¸ä¼šä¸»åŠ¨è¦æ±‚您æä¾›ä¸ªäººç§å­å¯†è¯­ã€‚" + }, + "endOfFlowMessage6": { + "message": "如果您需è¦å†æ¬¡å¤‡ä»½ä¸ªäººç§å­å¯†è¯­ï¼Œè¯·é€šè¿‡è®¾ç½® -> 安全选项完æˆè¯¥æ“作。" + }, + "endOfFlowMessage7": { + "message": "如果您ä»å­˜æœ‰ç–‘问或å‘现任何å¯ç–‘的地方,请å‘é€ç”µå­é‚®ä»¶è‡³ support@metamask.io 进行咨询。" + }, + "endOfFlowMessage8": { + "message": "MetaMask 无法æ¢å¤æ‚¨çš„ç§å­å¯†è¯­ã€‚了解更多。" + }, + "endOfFlowMessage9": { + "message": "了解详情。" + }, + "endOfFlowMessage10": { + "message": "全部完æˆ" + }, + "ensRegistrationError": { + "message": "ENS å称登记错误" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "未在当å‰ç½‘络找到 ENS å称。请å°è¯•切æ¢è‡³ä¸»ä»¥å¤ªåŠç½‘络。" + }, + "enterAnAlias": { + "message": "输入别å" }, "enterPassword": { "message": "请输入密ç " }, - "enterPasswordConfirm": { - "message": "请输入密ç ä»¥ç¡®è®¤" - }, "enterPasswordContinue": { "message": "请输入密ç ä»¥ç»§ç»­" }, - "passwordNotLongEnough": { - "message": "密ç é•¿åº¦ä¸è¶³" - }, - "passwordsDontMatch": { - "message": "密ç ä¸åŒ¹é…" + "ethereumPublicAddress": { + "message": "以太åŠå…¬å…±åœ°å€" }, "etherscanView": { "message": "在 Etherscan 上查看账户" }, - "exchangeRate": { - "message": "å…‘æ¢æ¯”率" + "estimatedProcessingTimes": { + "message": "é¢„ä¼°å¤„ç†æ—¶é—´" + }, + "expandView": { + "message": "展开视图" }, "exportPrivateKey": { "message": "导出ç§é’¥" }, - "exportPrivateKeyWarning": { - "message": "导出ç§é’¥éœ€è¦ä½ è‡ªæ‹…风险" - }, "failed": { "message": "失败" }, + "fast": { + "message": "å¿«" + }, + "faster": { + "message": "å¿«æ·æ“作" + }, "fiat": { "message": "FIAT", "description": "Exchange type" @@ -350,51 +436,38 @@ "message": "文件导入失败? 点击这里ï¼", "description": "Helps user import their account from a JSON file" }, - "followTwitter": { - "message": "关注我们的Twitter" + "forgetDevice": { + "message": "å–æ¶ˆä¿å­˜æ­¤è®¾å¤‡" }, "from": { "message": "æ¥è‡ª" }, - "fromToSame": { - "message": "å‘é€å’ŒæŽ¥å—地å€ä¸èƒ½ç›¸åŒ" - }, - "fromShapeShift": { - "message": "æ¥è‡ª ShapeShift" - }, - "gas": { - "message": "Gas", - "description": "Short indication of gas cost" + "functionType": { + "message": "功能类型" }, - "gasFee": { - "message": "Gas 费用" - }, - "gasLimit": { - "message": "Gas Limit" - }, - "gasLimitCalculation": { - "message": "我们根æ®ç½‘络æˆåŠŸçŽ‡è®¡ç®—å»ºè®®çš„ Gas Limit。" - }, - "gasLimitRequired": { - "message": "Gas Limit å¿…å¡«" + "gasLimitInfoModalContent": { + "message": "天然气é™åˆ¶å³æ‚¨ä¸ªäººå¸Œæœ›è´­ä¹°çš„æœ€å¤§å•使•°é‡ã€‚" }, "gasLimitTooLow": { "message": "Gas Limit è‡³å°‘è¦ 21000" }, - "generatingSeed": { - "message": "生æˆå¯†é’¥ä¸­..." + "gasUsed": { + "message": "已使用天然气é‡" + }, + "gasPriceExtremelyLow": { + "message": "天然气价格æžä½Ž" }, - "gasPrice": { - "message": "Gas Price (GWEI)" + "gasPriceInfoModalContent": { + "message": "天然气价格将详细列明æ¯ä¸ªä»˜è´¹å¤©ç„¶æ°”å•ä½çš„以太å¸é‡‘é¢ã€‚" }, - "gasPriceCalculation": { - "message": "我们根æ®ç½‘络æˆåŠŸçŽ‡è®¡ç®—å»ºè®®çš„ Gas Price" + "gasPriceNoDenom": { + "message": "天然气价格" }, - "gasPriceRequired": { - "message": "Gas Price å¿…å¡«" + "general": { + "message": "通用" }, - "generatingTransaction": { - "message": "ç”Ÿæˆ äº¤æ˜“" + "generalSettingsDescription": { + "message": "è´§å¸å…‘æ¢ã€ä¸»è¦è´§å¸ã€è¯­è¨€å’Œå—状身份头åƒ" }, "getEther": { "message": "èŽ·å– Ether" @@ -403,31 +476,45 @@ "message": "从水管获å–$1网络的 Ether", "description": "Displays network name for Ether faucet" }, - "greaterThanMin": { - "message": "å¿…é¡»è¦å¤§äºŽç­‰äºŽ $1。", - "description": "helper for inputting hex as decimal input" + "getHelp": { + "message": "获å–帮助。" + }, + "getStarted": { + "message": "开始使用" + }, + "happyToSeeYou": { + "message": "我们很高兴与您è§é¢ã€‚" + }, + "hardware": { + "message": "硬件" + }, + "hardwareWalletConnected": { + "message": "已连接硬件钱包" + }, + "hardwareWallets": { + "message": "连接硬件钱包" + }, + "hardwareWalletsMsg": { + "message": "请选择希望用于 MetaMask 的硬件钱包" + }, + "havingTroubleConnecting": { + "message": "连接出现问题?" }, "here": { "message": "这里", "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, - "hereList": { - "message": "Here's a list!!!!" + "hexData": { + "message": "å六进制数æ®" }, "hide": { "message": "éšè—" }, - "hideToken": { - "message": "éšè—代å¸" - }, "hideTokenPrompt": { "message": "éšè—代å¸ï¼Ÿ" }, - "howToDeposit": { - "message": "你想怎样转入 Ether?" - }, - "holdEther": { - "message": "它å…许你ä¿å­˜ether和代å¸ï¼Œå¹¶ä½œä¸ºä½ ä½¿ç”¨Dapp的桥æ¢." + "history": { + "message": "历å²è®°å½•" }, "import": { "message": "导入", @@ -436,22 +523,31 @@ "importAccount": { "message": "导入账户" }, - "importAccountMsg": { - "message": " Imported accounts will not be associated with your originally created MetaMask account seedphrase. Learn more about imported accounts " + "importAccountSeedPhrase": { + "message": "使用ç§å­å¯†è¯­å¯¼å…¥è´¦æˆ·" }, - "importAnAccount": { - "message": "导入一个账户" + "importWallet": { + "message": "导入钱包" }, - "importDen": { - "message": "导入存在的 DEN" + "importYourExisting": { + "message": "请使用 12 å­—ç§å­å¯†è¯­å¯¼å…¥çŽ°æœ‰é’±åŒ…" }, "imported": { "message": "已导入", "description": "status showing that an account has been fully loaded into the keyring" }, + "importUsingSeed": { + "message": "使用å¸å·ç§å­å¯†è¯­å¯¼å…¥" + }, "infoHelp": { "message": "ä¿¡æ¯ & 帮助" }, + "initialTransactionConfirmed": { + "message": "您的首次交易已通过网络完æˆç¡®è®¤ã€‚请点击“确定â€è¿”回。" + }, + "insufficientBalance": { + "message": "ä½™é¢ä¸è¶³ã€‚" + }, "insufficientFunds": { "message": "ä½™é¢ä¸è¶³." }, @@ -464,43 +560,42 @@ "invalidAddressRecipient": { "message": "收款地å€ä¸åˆæ³•" }, - "invalidGasParams": { - "message": "无效 Gas 傿•°" + "knownAddressRecipient": { + "message": "已知è”系人地å€ã€‚" + }, + "invalidAddressRecipientNotEthNetwork": { + "message": "éž ETH 网络,设置为å°å†™" }, "invalidInput": { "message": "无效输入." }, - "invalidRequest": { - "message": "无效请求" - }, "invalidRPC": { "message": "无效 RPC URI" }, - "jsonFail": { - "message": "Something went wrong. Please make sure your JSON file is properly formatted." + "invalidBlockExplorerURL": { + "message": "无效 Block Explorer URI" + }, + "invalidSeedPhrase": { + "message": "无效ç§å­å¯†è¯­" }, "jsonFile": { "message": "JSON 文件", "description": "format for importing an account" }, - "keepTrackTokens": { - "message": "Keep track of the tokens you’ve bought with your MetaMask account." - }, "kovan": { "message": "Kovan 测试网络" }, - "knowledgeDataBase": { - "message": "æµè§ˆæˆ‘们的知识库" - }, "max": { "message": "最大" }, "learnMore": { "message": "查看更多." }, - "lessThanMax": { - "message": "å¿…é¡»å°äºŽæˆ–等于 $1.", - "description": "helper for inputting hex as decimal input" + "ledgerAccountRestriction": { + "message": "请在新增账户å‰ï¼Œç¡®è®¤æ·»åŠ ä¸Šä¸€ä¸ªè´¦æˆ·ã€‚" + }, + "letsGoSetUp": { + "message": "是的。立å³å¼€å§‹è®¾ç½®ï¼" }, "likeToAddTokens": { "message": "你想添加这些代å¸å—?" @@ -508,8 +603,8 @@ "links": { "message": "链接" }, - "limit": { - "message": "é™åˆ¶" + "liveGasPricePredictions": { + "message": "实时天然气价格预测" }, "loading": { "message": "加载中..." @@ -517,38 +612,38 @@ "loadingTokens": { "message": "加载代å¸ä¸­..." }, - "localhost": { - "message": "Localhost 8545" - }, - "login": { - "message": "登录" - }, - "logout": { - "message": "登出" + "loadMore": { + "message": "加载更多" }, - "loose": { - "message": "ç–æ¾" - }, - "loweCaseWords": { - "message": "助记è¯åªæœ‰å°å†™å­—符" + "lock": { + "message": "é”定" }, "mainnet": { "message": "以太åŠä¸»ç½‘络" }, + "memorizePhrase": { + "message": "è®°ä½è¯¥å¯†è¯­ã€‚" + }, + "memo": { + "message": "备忘录" + }, "message": { "message": "消æ¯" }, "metamaskDescription": { "message": "MetaMask is a secure identity vault for Ethereum." }, - "metamaskSeedWords": { - "message": "MetaMask 助记è¯" + "metamaskVersion": { + "message": "MetaMask 版本" + }, + "mobileSyncText": { + "message": "请输入密ç ç¡®è®¤ä¸ªäººèº«ä»½ï¼" }, - "min": { - "message": "最å°" + "myWalletAccounts": { + "message": "我的钱包账户" }, - "myAccounts": { - "message": "My Accounts" + "myWalletAccountsDescription": { + "message": "所有已创建的 MetaMask 账户将自动添加到该部分。" }, "mustSelectOne": { "message": "至少选择一ç§ä»£å¸." @@ -560,34 +655,69 @@ "message": "必须选择导入一个文件。", "description": "User is important an account and needs to add a file to continue" }, - "needImportPassword": { - "message": "必须为已选择的文件输入密ç ã€‚", - "description": "Password and file needed to import an account" - }, - "negativeETH": { - "message": "Can not send negative amounts of ETH." + "networkName": { + "message": "网络åç§°" }, "networks": { "message": "网络" }, + "networkSettingsDescription": { + "message": "添加和编辑自定义 RPC 网络" + }, + "nevermind": { + "message": "无所谓" + }, "newAccount": { "message": "新账户" }, + "newAccountDetectedDialogMessage": { + "message": "检测到新地å€ï¼è¯·ç‚¹å‡»æ­¤å¤„添加至您的地å€ç°¿ã€‚" + }, "newAccountNumberName": { "message": "账户 $1", "description": "Default name of next account to be created on create account screen" }, + "newContact": { + "message": "新增è”系人" + }, "newContract": { "message": "æ–°åˆçº¦" }, "newPassword": { "message": "新密ç ï¼ˆè‡³å°‘ 8 个字符)" }, - "newRecipient": { - "message": "新收款人" + "newNetwork": { + "message": "新增网络" + }, + "newToMetaMask": { + "message": "新增至 MetaMask?" + }, + "noAlreadyHaveSeed": { + "message": "ä¸ï¼Œæˆ‘å·²ç»æœ‰ä¸€ä¸ªç§å­å¯†è¯­äº†ã€‚" + }, + "protectYourKeys": { + "message": "妥善ä¿ç®¡æ‚¨çš„密钥ï¼" }, - "newRPC": { - "message": "æ–° RPC URL" + "protectYourKeysMessage1": { + "message": "请注æ„个人ç§å­å¯†è¯­å®‰å…¨ã€‚报告显示有多个网站ä¼å›¾ä¼ªé€  MetaMask。MetaMask ç»ä¸ä¼šè¦æ±‚您æä¾›ä¸ªäººç§å­å¯†è¯­ï¼" + }, + "protectYourKeysMessage2": { + "message": "请妥善ä¿ç®¡æ‚¨çš„密语。如果您å‘现任何å¯ç–‘的地方,或无法确认网络安全性,请å‘é€ç”µå­é‚®ä»¶è‡³ support@metamask.io 进行咨询" + }, + "rpcUrl": { + "message": "新增 RPC URL" + }, + "optionalChainId": { + "message": "ChainID(选填)" + }, + "optionalSymbol": { + "message": "符å·ï¼ˆé€‰å¡«ï¼‰" + }, + "newTotal": { + "message": "新增åˆè®¡" + }, + "newTransactionFee": { + "message": "新增交易费用" }, "next": { "message": "下一步" @@ -595,57 +725,66 @@ "noAddressForName": { "message": "æ­¤ ENS å字还没有指定地å€ã€‚" }, - "noDeposits": { - "message": "没有已收的存款" - }, - "noTransactionHistory": { - "message": "没有交易历å²ã€‚" + "noConversionRateAvailable": { + "message": "æ— å¯ç”¨å…‘æ¢çއ" }, "noTransactions": { "message": "没有交易" }, - "notStarted": { - "message": "未开始" + "notEnoughGas": { + "message": "天然气ä¸è¶³" + }, + "noWebcamFoundTitle": { + "message": "未找到网络摄åƒå¤´" }, - "oldUI": { - "message": "旧版界é¢" + "noWebcamFound": { + "message": "找ä¸åˆ°æ‚¨çš„个人电脑网络摄åƒå¤´ã€‚请é‡è¯•。" }, - "oldUIMessage": { - "message": "ä½ å·²ç»åˆ‡æ¢åˆ°æ—§ç‰ˆç•Œé¢ã€‚ ä½ å¯ä»¥é€šè¿‡å³ä¸Šæ–¹ä¸‹æ‹‰èœå•中的选项切æ¢å›žæ–°çš„用户界é¢ã€‚" + "ofTextNofM": { + "message": "/" }, - "or": { - "message": "或", - "description": "choice between creating or importing a new account" + "orderOneHere": { + "message": "订购 Trezor 或 Ledger ,将个人资金进行冷存储" + }, + "origin": { + "message": "æ¥æº" + }, + "parameters": { + "message": "傿•°" + }, + "participateInMetaMetrics": { + "message": "加入 MetaMetrics" + }, + "participateInMetaMetricsDescription": { + "message": "加入 MetaMetrics ,帮助我们改善 MetaMask æœåŠ¡" }, "password": { "message": "密ç " }, - "passwordCorrect": { - "message": "Please make sure your password is correct." - }, - "passwordMismatch": { - "message": "密ç ä¸åŒ¹é…", - "description": "in password creation process, the two new password fields did not match" + "passwordsDontMatch": { + "message": "密ç ä¸åŒ¹é…" }, - "passwordShort": { - "message": "密ç ä¸å¤Ÿé•¿", - "description": "in password creation process, the password is not long enough to be secure" + "passwordNotLongEnough": { + "message": "密ç é•¿åº¦ä¸è¶³" }, "pastePrivateKey": { "message": "请粘贴你的ç§é’¥:", "description": "For importing an account from a private key" }, - "pasteSeed": { - "message": "请粘贴你的助记è¯ï¼" + "pending": { + "message": "待处ç†" }, "personalAddressDetected": { "message": "检测到个人地å€ã€‚请输入代å¸åˆçº¦åœ°å€ã€‚" }, - "pleaseReviewTransaction": { - "message": "请检查你的交易。" + "prev": { + "message": "上一个" }, - "popularTokens": { - "message": "常用代å¸" + "primaryCurrencySetting": { + "message": "主è¦è´§å¸" + }, + "primaryCurrencySettingDescription": { + "message": "请选择“本地â€ï¼Œä¼˜å…ˆæ˜¾ç¤ºå½“地货å¸é“¾ä»·å€¼ï¼ˆå¦‚ ETH )。请选择“法定â€ï¼Œä¼˜å…ˆæ˜¾ç¤ºé€‰å®šæ³•定货å¸ä»·å€¼ã€‚" }, "privacyMsg": { "message": "éšç§æ”¿ç­–" @@ -660,47 +799,65 @@ "privateNetwork": { "message": "ç§æœ‰ç½‘络" }, - "qrCode": { - "message": "显示二维ç " + "queue": { + "message": "队列" }, "readdToken": { "message": "之åŽä½ è¿˜å¯ä»¥é€šè¿‡å¸æˆ·é€‰é¡¹èœå•中的“添加代å¸â€æ¥æ·»åŠ æ­¤ä»£å¸ã€‚" }, - "readMore": { - "message": "了解更多。" - }, - "readMore2": { - "message": "了解更多。" - }, - "receive": { - "message": "接收" + "recents": { + "message": "最近记录" }, "recipientAddress": { "message": "接收地å€" }, - "refundAddress": { - "message": "你的退款地å€" + "recipientAddressPlaceholder": { + "message": "查找ã€å…¬ç”¨åœ°å€ (0x) 或 ENS" + }, + "rejectAll": { + "message": "æ‹’ç»æ‰€æœ‰" + }, + "rejectTxsN": { + "message": "æ‹’ç» $1 笔交易" + }, + "rejectTxsDescription": { + "message": "æ‚¨å°†æŒ‡æ‹’ç» $1 笔交易。" }, "rejected": { "message": "æ‹’ç»" }, + "reset": { + "message": "é‡ç½®" + }, "resetAccount": { "message": "é‡è®¾è´¦æˆ·" }, + "resetAccountDescription": { + "message": "é‡ç½®è´¦æˆ·åŽï¼Œå°†æ¸…除您的个人交易历å²è®°å½•。" + }, + "deleteNetwork": { + "message": "是å¦åˆ é™¤ç½‘络?" + }, + "deleteNetworkDescription": { + "message": "您是å¦ç¡®è®¤è¦åˆ é™¤è¯¥ç½‘络?" + }, + "remindMeLater": { + "message": "ç¨å޿醒" + }, "restoreFromSeed": { "message": "从助记è¯è¿˜åŽŸ" }, - "restoreVault": { - "message": "还原ä¿é™©æŸœ" + "restoreAccountWithSeed": { + "message": "使用ç§å­å¯†è¯­æ¢å¤ä¸ªäººè´¦æˆ·" + }, + "requestsAwaitingAcknowledgement": { + "message": "等待确认的请求" }, "required": { "message": "å¿…å¡«" }, - "retryWithMoreGas": { - "message": "使用更高的 Gas Price é‡è¯•" - }, - "walletSeed": { - "message": "钱包助记è¯" + "restore": { + "message": "æ¢å¤" }, "revealSeedWords": { "message": "显示助记è¯" @@ -717,8 +874,17 @@ "revealSeedWordsWarning": { "message": "助记è¯å¯ä»¥ç”¨æ¥çªƒå–æ‚¨çš„æ‰€æœ‰å¸æˆ·." }, - "revert": { - "message": "还原" + "remove": { + "message": "移除" + }, + "removeAccount": { + "message": "移除å¸å·" + }, + "removeAccountDescription": { + "message": "该账户已从您的钱包中删除。请在继续åŽç»­æ“作å‰ï¼Œç¡®è®¤æ‚¨æ˜¯å¦å·²æ‹¥æœ‰è¯¥å¯¼å…¥è´¦æˆ·çš„原始ç§å­å¯†è¯­æˆ–个人密钥。您å¯ä»¥é€šè¿‡è´¦æˆ·ä¸‹æ‹‰èœå•冿¬¡å¯¼å…¥æˆ–创建账户。" + }, + "readyToConnect": { + "message": "是å¦å‡†å¤‡è¿žæŽ¥ï¼Ÿ" }, "rinkeby": { "message": "Rinkeby 测试网络" @@ -726,46 +892,26 @@ "ropsten": { "message": "Ropsten 测试网络" }, - "currentRpc": { - "message": "å½“å‰ RPC" - }, - "connectingToMainnet": { - "message": "正在连接到以太åŠä¸»ç½‘" - }, - "connectingToRopsten": { - "message": "正在连接到Ropsten测试网络" - }, - "connectingToKovan": { - "message": "正在连接到Kovan测试网络" - }, - "connectingToRinkeby": { - "message": "正在连接到Rinkeby测试网络" - }, - "connectingToUnknown": { - "message": "正在连接到未知网络" - }, - "sampleAccountName": { - "message": "例如:我的账户", - "description": "Help user understand concept of adding a human-readable name to their account" + "goerli": { + "message": "Goerli 测试网络" }, "save": { "message": "ä¿å­˜" }, - "reprice_title": { - "message": "釿–°å‡ºä»·äº¤æ˜“" + "slow": { + "message": "æ…¢" }, - "reprice_subtitle": { - "message": "æé«˜ GAS ä»·æ ¼å°è¯•覆盖并加速交易" + "slower": { + "message": "é™é€Ÿ" }, "saveAsCsvFile": { "message": "å¦å­˜ä¸ºCSV文件" }, - "saveAsFile": { - "message": "ä¿å­˜æ–‡ä»¶", - "description": "Account export process" + "scanInstructions": { + "message": "请将二维ç ç½®äºŽé•œå¤´å‰" }, - "saveSeedAsFile": { - "message": "ä¿å­˜åŠ©è®°è¯ä¸ºæ–‡ä»¶" + "scanQrCode": { + "message": "扫æäºŒç»´ç " }, "search": { "message": "æœç´¢" @@ -773,23 +919,38 @@ "searchResults": { "message": "æœç´¢ç»“æžœ" }, + "secretBackupPhrase": { + "message": "ç§å¯†å¤‡ä»½å¯†è¯­" + }, + "secretBackupPhraseDescription": { + "message": "您的个人ç§å¯†å¤‡ä»½å¯†è¯­å¯ä»¥å¸®åŠ©æ‚¨è½»æ¾å¤‡ä»½å’Œæ¢å¤ä¸ªäººè´¦æˆ·ã€‚" + }, + "secretBackupPhraseWarning": { + "message": "警告:切勿å‘他人é€éœ²æ‚¨çš„å¤‡ä»½å¯†è¯­ã€‚ä»»ä½•äººä¸€æ—¦æŒæœ‰è¯¥å¯†è¯­ï¼Œå³å¯å–走您的以太å¸ã€‚" + }, "secretPhrase": { "message": "输入12ä½åŠ©è®°è¯ä»¥æ¢å¤é‡‘库." }, - "newPassword8Chars": { - "message": "新密ç ï¼ˆè‡³å°‘8ä½)" + "securityAndPrivacy": { + "message": "安全与éšç§" + }, + "securitySettingsDescription": { + "message": "éšç§è®¾ç½®å’Œé’±åŒ…ç§å­å¯†è¯­" + }, + "seedPhrasePlaceholder": { + "message": "用空格分隔æ¯ä¸ªå•è¯" }, "seedPhraseReq": { "message": "助记è¯ä¸º12个å•è¯" }, - "select": { - "message": "选择" - }, "selectCurrency": { "message": "选择货å¸" }, - "selectService": { - "message": "选择æœåŠ¡" + "selectEachPhrase": { + "message": "请选择æ¯ä¸€ä¸ªç‰‡è¯­ï¼Œä»¥ç¡®ä¿ç‰‡è¯­æ­£ç¡®æ€§ã€‚" + }, + "selectLocale": { + "message": "选择语言区域" }, "selectType": { "message": "选择类型" @@ -797,59 +958,95 @@ "send": { "message": "å‘é€" }, + "sendAmount": { + "message": "å‘é€é‡‘é¢" + }, "sendETH": { "message": "å‘é€ ETH" }, "sendTokens": { "message": "å‘é€ ä»£å¸" }, - "onlySendToEtherAddress": { - "message": "åªå‘é€ ETH 给一个以太åŠåœ°å€" + "sentEther": { + "message": "以太å¸å·²å‘é€" + }, + "sentTokens": { + "message": "代å¸å·²å‘é€" + }, + "separateEachWord": { + "message": "用空格分隔æ¯ä¸ªå•è¯" }, "searchTokens": { "message": "æœç´¢ä»£å¸" }, - "sendTokensAnywhere": { - "message": "将代å¸å‘é€ç»™æ‹¥æœ‰ä»¥å¤ªåŠåœ°å€çš„任何人" + "selectAnAccount": { + "message": "选择账户" + }, + "selectAnAccountHelp": { + "message": "请通过 MetaMask é€‰æ‹©éœ€è¦æŸ¥çœ‹çš„账户" + }, + "selectAHigherGasFee": { + "message": "请选择价格ç¨é«˜çš„天然气费,加快交易处ç†é€Ÿåº¦ã€‚*" + }, + "selectHdPath": { + "message": "选择 HD 路径" + }, + "selectPathHelp": { + "message": "å¦‚æžœä¸‹åˆ—è´¦æˆ·ä¸­æ²¡æœ‰æ‚¨å½“å‰æ‰€æŒæœ‰çš„ Ledger 账户,请将路径切æ¢è‡³â€œLegacy (MEW / MyCrypto)â€" }, "settings": { "message": "设置" }, - "info": { - "message": "ä¿¡æ¯" + "showAdvancedGasInline": { + "message": "高级天然气控制" }, - "shapeshiftBuy": { - "message": "使用 Shapeshift è´­ä¹°" + "showAdvancedGasInlineDescription": { + "message": "请选择该选项,直接在å‘é€å’Œç¡®è®¤é¡µé¢æ˜¾ç¤ºå¤©ç„¶æ°”价格和é™åˆ¶ç®¡ç†ã€‚" + }, + "showFiatConversionInTestnets": { + "message": "在 Testnets 上显示兑æ¢çއ" + }, + "showFiatConversionInTestnetsDescription": { + "message": "请选择该选项,在 Testnets 上显示法定兑æ¢çއ" }, "showPrivateKeys": { "message": "显示ç§é’¥" }, - "showQRCode": { - "message": "显示二维ç " + "showHexData": { + "message": "显示å六进制数æ®" + }, + "showHexDataDescription": { + "message": "请选择该选项,在å‘é€é¡µé¢æ˜¾ç¤ºå六进制数æ®å­—域" }, "sign": { "message": "ç­¾å" }, + "signatureRequest": { + "message": "请求签å" + }, "signed": { "message": "已签å" }, - "signMessage": { - "message": "签署消æ¯" - }, "signNotice": { "message": "签署此消æ¯å¯èƒ½ä¼šäº§ç”Ÿå±é™©çš„副作用。 \nåªä»Žä½ å®Œå…¨ä¿¡ä»»çš„网站上签å。 è¿™ç§å±é™©çš„æ–¹æ³•将在未æ¥çš„版本中被移除。" }, "sigRequest": { "message": "请求签å" }, - "sigRequested": { - "message": "ç­¾å已请求" + "somethingWentWrong": { + "message": "哎呀ï¼å‡ºé—®é¢˜äº†ã€‚" + }, + "speedUp": { + "message": "加速" + }, + "speedUpCancellation": { + "message": "åŠ é€Ÿè¯¥å–æ¶ˆæ“作" }, - "spaceBetween": { - "message": "å•è¯ä¹‹é—´åªèƒ½æœ‰ä¸€ä¸ªç©ºæ ¼" + "speedUpTransaction": { + "message": "加速该交易æ“作" }, - "status": { - "message": "状æ€" + "switchNetworks": { + "message": "切æ¢ç½‘络" }, "stateLogs": { "message": "çŠ¶æ€æ—¥å¿—" @@ -860,8 +1057,26 @@ "stateLogError": { "message": "æ£€ç´¢çŠ¶æ€æ—¥å¿—时出错。" }, - "submit": { - "message": "æäº¤" + "step1HardwareWallet": { + "message": "1. 连接硬件钱包" + }, + "step1HardwareWalletMsg": { + "message": "直接将您的硬件钱包与个人电脑相连。" + }, + "step2HardwareWallet": { + "message": "2. 选择账户" + }, + "step2HardwareWalletMsg": { + "message": "è¯·é€‰æ‹©æ‚¨æƒ³æŸ¥çœ‹çš„è´¦æˆ·ã€‚æ¯æ¬¡ä»…é™é€‰æ‹©ä¸€ä¸ªã€‚" + }, + "step3HardwareWallet": { + "message": "3. 开始体验 dApps 和更多功能ï¼" + }, + "step3HardwareWalletMsg": { + "message": "使用您的硬件钱包,æ“作与以太åŠè´¦æˆ·åˆ¶ä½œç›¸åŒã€‚登录 dApps,å‘é€ ETH ,购买和ä¿å­˜ ERC20 代å¸å’Œè¯¸å¦‚ CryptoKitties ç­‰ä¸å¯æ›¿ä»£ä»£å¸ã€‚" + }, + "storePhrase": { + "message": "通过如 1Password 等密ç ç®¡å®¶ä¿å­˜è¯¥å¯†è¯­ã€‚" }, "submitted": { "message": "å·²æäº¤" @@ -869,11 +1084,32 @@ "supportCenter": { "message": "访问我们的支æŒä¸­å¿ƒ" }, + "symbol": { + "message": "符å·" + }, "symbolBetweenZeroTwelve": { - "message": "符å·åº”该有0-12个字符." + "message": "符å·ä¸å¾—超过11个字符。" + }, + "syncWithMobile": { + "message": "ä½¿ç”¨ç§»åŠ¨è®¾å¤‡è¿›è¡ŒåŒæ­¥" }, - "takesTooLong": { - "message": "花费太长时间?" + "syncWithMobileTitle": { + "message": "ä½¿ç”¨ç§»åŠ¨è®¾å¤‡è¿›è¡ŒåŒæ­¥" + }, + "syncWithMobileDesc": { + "message": "您å¯ä»¥ä½¿ç”¨ä¸ªäººç§»åŠ¨è®¾å¤‡åŒæ­¥ä¸ªäººè´¦æˆ·ä¸Žä¿¡æ¯ã€‚打开 MetaMask 移动应用程åºï¼Œè¿›å…¥â€œè®¾ç½®â€é€‰é¡¹ï¼Œç‚¹å‡»â€œé€šè¿‡æµè§ˆå™¨æ‰©å±•程åºåŒæ­¥â€" + }, + "syncWithMobileDescNewUsers": { + "message": "如果您是首次å¯ç”¨ MetaMask 移动应用程åºï¼Œè¯·é€šè¿‡ä¸ªäººæ‰‹æœºå®Œæˆå¦‚下æ“作。" + }, + "syncWithMobileScanThisCode": { + "message": "使用 MetaMask åº”ç”¨ç¨‹åºæ‰«æç¼–ç " + }, + "syncWithMobileBeCareful": { + "message": "扫æç¼–ç æ—¶ï¼Œè¯·ç¡®ä¿èº«è¾¹æ— å…¶ä»–人正在查看您的显示页é¢" + }, + "syncWithMobileComplete": { + "message": "您的数æ®å·²åŒæ­¥æˆåŠŸã€‚å°½æƒ…ä½“éªŒ MetaMask 应用程åºï¼" }, "terms": { "message": "ä½¿ç”¨æ¡æ¬¾" @@ -881,70 +1117,96 @@ "testFaucet": { "message": "测试水管" }, + "thisWillCreate": { + "message": "该æ“作将为您创建新钱包和ç§å­å¯†è¯­" + }, + "tips": { + "message": "èµé‡‘" + }, "to": { "message": "至" }, - "toETHviaShapeShift": { - "message": "$1 ETH 通过 ShapeShift", - "description": "system will fill in deposit type in start of message" - }, - "tokenAddress": { - "message": "代å¸åœ°å€" + "token": { + "message": "代å¸" }, "tokenAlreadyAdded": { "message": "代å¸å·²ç»è¢«æ·»åŠ ." }, - "tokenBalance": { - "message": "代å¸ä½™é¢ï¼š" - }, - "tokenSelection": { - "message": "æœç´¢ä»£å¸æˆ–从我们的常用代å¸åˆ—表中进行选择" + "tokenContractAddress": { + "message": "代å¸è”系人地å€" }, "tokenSymbol": { "message": "代å¸ç¬¦å·" }, - "tokenWarning1": { - "message": "Keep track of the tokens you’ve bought with your MetaMask account. If you bought tokens using a different account, those tokens will not appear here." - }, "total": { "message": "总é‡" }, - "transactions": { + "transaction": { "message": "交易" }, + "transactionConfirmed": { + "message": "交易已通过 $2 确认。" + }, + "transactionCreated": { + "message": "在 $2 生æˆçš„交易å•,其交易é¢ä¸º $1 。" + }, + "transactionDropped": { + "message": "在 $2 终止的交易å•。" + }, + "transactionSubmitted": { + "message": "在 $2 æäº¤çš„交易å•,其天然气费为 $1 。" + }, + "transactionResubmitted": { + "message": "在 $2 釿–°æäº¤çš„交易å•,其天然气费增加至 $1" + }, + "transactionUpdated": { + "message": "交易å•已于 $2 更新。" + }, + "transactionErrored": { + "message": "交易报错。" + }, + "transactionCancelAttempted": { + "message": "在 $2 å°è¯•å–æ¶ˆäº¤æ˜“,其天然气费为 $1" + }, + "transactionCancelSuccess": { + "message": "æˆåŠŸåœ¨ $2 å–æ¶ˆäº¤æ˜“å•" + }, "transactionError": { "message": "交易出错. åˆçº¦ä»£ç æ‰§è¡Œå¼‚常." }, - "transactionMemo": { - "message": "交易备注(å¯é€‰)" + "transactionErrorNoContract": { + "message": "正在å°è¯•调用éžè”系人地å€åŠŸèƒ½ã€‚" }, - "transactionNumber": { - "message": "交易 number" + "transactionFee": { + "message": "交易费" }, - "transfers": { - "message": "交易" + "transactionTime": { + "message": "交易时间" + }, + "transfer": { + "message": "转账" + }, + "transferBetweenAccounts": { + "message": "在个人账户间转账" + }, + "transferFrom": { + "message": "转出" }, "troubleTokenBalances": { "message": "我们无法加载您的代å¸ä½™é¢ã€‚ä½ å¯ä»¥æŸ¥çœ‹å®ƒä»¬", "description": "Followed by a link (here) to view token balances" }, - "twelveWords": { - "message": "è¿™12个å•è¯æ˜¯æ¢å¤MetaMask叿ˆ·çš„唯一方法。.\n将它们存放在安全和秘密的地方。." + "tryAgain": { + "message": "é‡è¯•" }, "typePassword": { "message": "输入你的密ç " }, - "uiWelcome": { - "message": "æ¬¢è¿Žä½¿ç”¨æ–°ç‰ˆç•Œé¢ ï¼ˆBeta)" - }, - "uiWelcomeMessage": { - "message": "你现在正在使用新的 MetaMask 界é¢ã€‚ å°è¯•å‘é€ä»£å¸ç­‰æ–°åŠŸèƒ½ï¼Œæœ‰ä»»ä½•é—®é¢˜è¯·å‘ŠçŸ¥æˆ‘ä»¬ã€‚" - }, "unapproved": { "message": "未批准" }, - "unavailable": { - "message": "ä¸å¯ç”¨" + "units": { + "message": "å•ä½" }, "unknown": { "message": "未知" @@ -952,42 +1214,65 @@ "unknownNetwork": { "message": "æœªçŸ¥ç§æœ‰ç½‘络" }, - "unknownNetworkId": { - "message": "未知网络ID" + "unknownQrCode": { + "message": "错误:我们无法识别该二维ç " }, - "uriErrorMsg": { - "message": "URIs require the appropriate HTTP/HTTPS prefix." + "unknownCameraErrorTitle": { + "message": "哎呀ï¼å‡ºé—®é¢˜äº†â€¦" }, - "usaOnly": { - "message": "åªé™äºŽç¾Žå›½", - "description": "Using this exchange is limited to people inside the USA" + "unknownCameraError": { + "message": "å°è¯•获å–相机使用æƒé™æ—¶æŠ¥é”™ã€‚请é‡è¯•…" }, - "usedByClients": { - "message": "å¯ç”¨äºŽå„ç§ä¸åŒçš„客户端" + "unlock": { + "message": "è§£é”" + }, + "unlockMessage": { + "message": "分散网络待命中" }, - "useOldUI": { - "message": "使用旧版 UI" + "updatedWithDate": { + "message": "已更新 $1" }, - "validFileImport": { - "message": "您必须选择一个有效的文件进行导入." + "usedByClients": { + "message": "å¯ç”¨äºŽå„ç§ä¸åŒçš„客户端" }, - "vaultCreated": { - "message": "已创建ä¿é™©åº“" + "userName": { + "message": "用户å" }, "viewAccount": { "message": "查看账户" }, + "viewinExplorer": { + "message": "在管ç†å™¨ä¸­æŸ¥çœ‹" + }, + "viewContact": { + "message": "查看è”系人" + }, + "viewOnCustomBlockExplorer": { + "message": "在 $1 查看" + }, + "viewOnEtherscan": { + "message": "在 Etherscan 上查看" + }, "visitWebSite": { "message": "访问我们的网站" }, - "warning": { - "message": "警告" + "walletSeed": { + "message": "钱包助记è¯" + }, + "welcomeBack": { + "message": "欢迎回æ¥ï¼" }, "welcome": { "message": "欢迎使用 MetaMask 测试版" }, - "whatsThis": { - "message": "这是什么?" + "writePhrase": { + "message": "请将该密语记录在纸上,并ä¿å­˜åœ¨å®‰å…¨çš„地方。如果希望æå‡ä¿¡æ¯å®‰å…¨æ€§ï¼Œè¯·å°†ä¿¡æ¯è®°å½•在多张纸上,并分别ä¿å­˜åœ¨ 2 - 3 个ä¸åŒçš„地方。" + }, + "yesLetsTry": { + "message": "没错。ä¸å¦¨ä¸€è¯•" + }, + "youNeedToAllowCameraAccess": { + "message": "您需è¦å¼€å¯ç›¸æœºè®¿é—®æƒé™ï¼Œæ‰èƒ½ä½¿ç”¨è¯¥åŠŸèƒ½ã€‚" }, "yourSigRequested": { "message": "正在请求你的签å" @@ -997,5 +1282,8 @@ }, "yourPrivateSeedPhrase": { "message": "ä½ çš„ç§æœ‰åŠ©è®°è¯" + }, + "zeroGasPriceOnSpeedUpError": { + "message": "天然气价格加速上涨" } } diff --git a/app/_locales/zh_TW/messages.json b/app/_locales/zh_TW/messages.json index 18e30188ed66..3e2e5d8345ab 100644 --- a/app/_locales/zh_TW/messages.json +++ b/app/_locales/zh_TW/messages.json @@ -1,57 +1,18 @@ { - "privacyMode": { - "message": "éš±ç§æ¨¡å¼" - }, - "privacyModeDescription": { - "message": "ç¶²ç«™å¿…é ˆè«‹æ±‚è¨ªå•æ¬Šé™æ‰èƒ½æŸ¥çœ‹æ‚¨çš„帳戶資訊" - }, - "exposeAccounts": { - "message": "公開賬戶" - }, - "exposeDescription": { - "message": "將帳戶公開給當å‰ç¶²ç«™ã€‚å°å‚³çµ±åŽ»ä¸­å¿ƒåŒ–æ‡‰ç”¨æœå‹™å¾ˆæœ‰ç”¨ã€‚" - }, - "confirmExpose": { - "message": "您確定è¦å°‡å¸³æˆ¶å…¬é–‹åˆ°ç•¶å‰ç¶²ç«™å—Žï¼Ÿ" - }, - "confirmClear": { - "message": "æ‚¨ç¢ºå®šè¦æ¸…除已批准的網站紀錄?" + "chartOnlyAvailableEth": { + "message": "圖表僅é©ç”¨æ–¼ä»¥å¤ªåŠç¶²è·¯ã€‚" }, "contractInteraction": { "message": "åˆç´„互動" }, - "clearApprovalDataSuccess": { - "message": "已批准的網站紀錄已æˆåŠŸæ¸…é™¤ã€‚" - }, - "approvalData": { - "message": "審核紀錄" - }, - "approvalDataDescription": { - "message": "清除之å‰å·²æ‰¹å‡†éŽçš„ç¶²ç«™å¯©æ ¸ç´€éŒ„ï¼Œæ‰€æœ‰ç¶²ç«™éƒ½å¿…é ˆå†æ¬¡ç”³è«‹" - }, - "clearApprovalData": { - "message": "清除批准數據" - }, - "approve": { - "message": "批准" - }, "reject": { "message": "拒絕" }, - "providerRequest": { - "message": "$1 請求訪å•帳戶權é™" - }, - "providerRequestInfo": { - "message": "æ­¤ç¶²ç«™å¸Œæœ›èƒ½è®€å–æ‚¨çš„å¸³æˆ¶è³‡è¨Šã€‚è«‹å‹™å¿…ç¢ºèªæ‚¨ä¿¡ä»»é€™å€‹ç¶²ç«™ã€ä¸¦äº†è§£å¾ŒçºŒå¯èƒ½çš„交易行為。" + "about": { + "message": "關於" }, - "providerAPIRequest": { - "message": "Web3 API 請求" - }, - "reviewProviderRequest": { - "message": "請查看此Ethereum API請求。" - }, - "accept": { - "message": "接å—" + "aboutSettingsDescription": { + "message": "版本,支æ´ä¸­å¿ƒï¼Œä»¥åŠè¯çµ¡è³‡è¨Šã€‚" }, "acceleratingATransaction": { "message": "* æé«˜äº¤æ˜“è²» Gas 價格將å¯åŠ é€Ÿè™•ç†æ™‚間,但ä¸ä¿è­‰æœƒæœ‰é¡¯è‘—效果" @@ -77,14 +38,29 @@ "activityLog": { "message": "活動紀錄" }, - "address": { - "message": "帳戶ä½å€" + "addNetwork": { + "message": "新增網路" + }, + "addRecipient": { + "message": "新增接收人" + }, + "advanced": { + "message": "進階" + }, + "advancedSettingsDescription": { + "message": "å­˜å–開發者功能,下載狀態日誌,é‡è¨­å¸³è™Ÿï¼Œè¨­å®šæ¸¬è©¦ç¶²åŠè‡ªè¨‚ PRC。" }, "advancedOptions": { "message": "進階é¸é …" }, - "addCustomToken": { - "message": "加入自訂代幣" + "addToAddressBook": { + "message": "新增至ä½å€ç°¿ä¸­" + }, + "addToAddressBookModalPlaceholder": { + "message": "如 John D。" + }, + "addAlias": { + "message": "新增化å" }, "addToken": { "message": "加入代幣" @@ -98,18 +74,9 @@ "addAcquiredTokens": { "message": "å°‡æ‚¨å·²ç¶“æ“æœ‰çš„代幣顯示於 MetaMask" }, - "advanced": { - "message": "進階" - }, "amount": { "message": "數é‡" }, - "amountPlusGas": { - "message": "æ•¸é‡ + Gas" - }, - "amountPlusTxFee": { - "message": "æ•¸é‡ + 交易費" - }, "appDescription": { "message": "乙太åŠç€è¦½å™¨æ“´å……æ’ä»¶", "description": "The description of the application" @@ -118,9 +85,15 @@ "message": "MetaMask", "description": "The name of the application" }, + "approve": { + "message": "批准" + }, "approved": { "message": "已批准" }, + "asset": { + "message": "資產" + }, "attemptingConnect": { "message": "正在嘗試連接å€å¡Šéˆã€‚" }, @@ -133,8 +106,11 @@ "attributions": { "message": "來æº" }, - "available": { - "message": "å¯ä½¿ç”¨" + "autoLockTimeLimit": { + "message": "自動登出計時器(分)" + }, + "autoLockTimeLimitDescription": { + "message": "設定閒置分é˜ä¸Šé™ï¼Œæ™‚間到時 MetaMask 將自動登出" }, "average": { "message": "å¹³å‡" @@ -142,51 +118,48 @@ "back": { "message": "上一é " }, + "backToAll": { + "message": "回到所有" + }, + "backupApprovalNotice": { + "message": "備份你的秘密還原代碼,安全防護錢包與資金。" + }, + "backupApprovalInfo": { + "message": "在è£ç½®éºå¤±ã€å¿˜è¨˜å¯†ç¢¼ã€éœ€è¦é‡æ–°å®‰è£ MetaMaskã€æˆ–是想在å¦ä¸€è£ç½®é–‹å•ŸéŒ¢åŒ…çš„æƒ…å½¢ä¸‹ï¼Œä½ éœ€è¦æ­¤ç§˜å¯†ä»£ç¢¼ä¾†å¾©åŽŸéŒ¢åŒ…ã€‚" + }, + "backupNow": { + "message": "ç¾åœ¨å‚™ä»½" + }, "balance": { "message": "餘é¡ï¼š" }, "balanceOutdated": { "message": "顯示餘é¡ä¸ä¸€å®šæ˜¯æœ€æ–°è³‡è¨Š" }, - "balances": { - "message": "您的餘é¡ï¼š" - }, - "balanceIsInsufficientGas": { - "message": "ç•¶å‰é¤˜é¡ä¸è¶³ä»¥æ”¯ä»˜ Gas" - }, "basic": { "message": "基本" }, - "beta": { - "message": "BETA" + "blockExplorerUrl": { + "message": "å€å¡Šéˆç€è¦½å™¨" }, - "betweenMinAndMax": { - "message": "必須大於等於 $1 䏦䏔尿–¼ç­‰æ–¼ $2 。", - "description": "helper for inputting hex as decimal input" + "blockExplorerView": { + "message": "在 $1 觀看帳號 ", + "description": "$1 replaced by URL for custom block explorer" }, "blockiesIdenticon": { "message": "使用åƒç´ é¢¨æ ¼ä»£è¡¨åœ–案" }, - "borrowDharma": { - "message": "é€éŽ Dharma (Beta) 借用" - }, "browserNotSupported": { "message": "您的ç€è¦½å™¨å°šæœªæ”¯æ´..." }, "builtInCalifornia": { "message": "MetaMask 是在加州設計製造" }, - "buy": { - "message": "購買" + "buyWithWyre": { + "message": "用 Wyre 購買 ETH" }, - "buyCoinbase": { - "message": "在 Coinbase 上購買" - }, - "buyCoinbaseExplainer": { - "message": "Coinbase æ˜¯ä¸–ç•Œä¸Šæœ€å—æ­¡è¿Žçš„æ¯”特幣ã€ä»¥å¤ªå¹£å’ŒèŠç‰¹å¹£çš„買賣交易所。" - }, - "bytes": { - "message": "ä½å…ƒçµ„" + "buyWithWyreDescription": { + "message": "Wyre 讓你使用信用å¡åœ¨ MetaMask 帳號中直接存入 ETH。" }, "buyCoinSwitch": { "message": "在CoinSwitch上购买" @@ -194,8 +167,17 @@ "buyCoinSwitchExplainer": { "message": "CoinSwitch是以最优惠的价格交æ¢è¶…过300ç§åŠ å¯†è´§å¸çš„一站å¼ç›®çš„地。" }, - "ok": { - "message": "Ok" + "bytes": { + "message": "ä½å…ƒçµ„" + }, + "off": { + "message": "é—œ" + }, + "on": { + "message": "開啟" + }, + "optionalBlockExplorerUrl": { + "message": "å€å¡Šéˆç€è¦½å™¨ URL(éžå¿…è¦ï¼‰" }, "cancel": { "message": "å–æ¶ˆ" @@ -209,17 +191,8 @@ "cancelled": { "message": "已喿¶ˆ" }, - "cancelN": { - "message": "å–æ¶ˆå…¨éƒ¨ $1 筆交易" - }, - "classicInterface": { - "message": "使用舊版界é¢" - }, - "clickCopy": { - "message": "點擊複製" - }, - "clickToAdd": { - "message": "點é¸ä¸‹æ–¹ $1 新增資訊" + "chainId": { + "message": "éˆ ID" }, "clickToRevealSeed": { "message": "點é¸é¡¯ç¤ºåŠ©æ†¶è©ž" @@ -233,23 +206,17 @@ "confirm": { "message": "確èª" }, - "confirmationTime": { - "message": "ç¢ºèªæ™‚é–“ (ç§’)" - }, "confirmed": { "message": "已確èª" }, - "confirmContract": { - "message": "確èªåˆç´„" - }, "confirmPassword": { "message": "確èªå¯†ç¢¼" }, "confirmSecretBackupPhrase": { "message": "ç¢ºèªæ‚¨å·²ç¶“備份的助憶詞" }, - "confirmTransaction": { - "message": "確èªäº¤æ˜“" + "congratulations": { + "message": "æ­å–œ" }, "connectHardwareWallet": { "message": "連線硬體錢包" @@ -257,26 +224,29 @@ "connect": { "message": "連線" }, - "connectRequest": { - "message": "連線請求" - }, - "connecting": { - "message": "連線中..." - }, "connectingTo": { "message": "連線到$1" }, - "connectToLedger": { - "message": "連線到 Ledger" + "connectingToKovan": { + "message": "連線到 Kovan 測試網路" + }, + "connectingToMainnet": { + "message": "連線到主 Ethereum 網路" + }, + "connectingToRopsten": { + "message": "連線到 Ropsten 測試網路" }, - "connectToTrezor": { - "message": "連線到 Trezor" + "connectingToRinkeby": { + "message": "連線到 Rinkeby 測試網路" }, - "continue": { - "message": "繼續" + "connectingToLocalhost": { + "message": "連接至本地主機 8545" }, - "continueToCoinbase": { - "message": "繼續å‰å¾€ Coinbase" + "connectingToGoerli": { + "message": "連接至 Goerli 測試網路" + }, + "continueToWyre": { + "message": "繼續至 Wyre" }, "continueToCoinSwitch": { "message": "繼續å‰å¾€ CoinSwitch" @@ -284,33 +254,21 @@ "contractDeployment": { "message": "部署åˆç´„" }, - "conversionProgress": { - "message": "正在å–得匯率" - }, - "copiedButton": { - "message": "已複製" - }, - "copiedClipboard": { - "message": "已複製到剪貼簿" - }, "copiedExclamation": { "message": "已複製ï¼" }, - "copiedSafe": { - "message": "我已經複製到æŸå€‹å®‰å…¨çš„地方了" - }, - "copy": { - "message": "複製" - }, "copyAddress": { "message": "複製到剪貼簿" }, + "copyTransactionId": { + "message": "複製交易 ID" + }, + "copiedTransactionId": { + "message": "已複製的交易 ID" + }, "copyToClipboard": { "message": "複製到剪貼簿" }, - "copyButton": { - "message": " 複製 " - }, "copyPrivateKey": { "message": "這是您的ç§é‘°ï¼ˆé»žæ“Šè¤‡è£½ï¼‰" }, @@ -320,28 +278,18 @@ "createAccount": { "message": "建立帳戶" }, - "createDen": { - "message": "建立" + "createAWallet": { + "message": "創建錢包" }, "createPassword": { "message": "建立密碼" }, - "crypto": { - "message": "加密", - "description": "Exchange type (cryptocurrencies)" - }, "currencyConversion": { "message": "轉æ›åŒ¯çއ" }, - "currentConversion": { - "message": "ç•¶å‰åŒ¯çއ" - }, "currentLanguage": { "message": "ç•¶å‰èªžè¨€" }, - "currentNetwork": { - "message": "ç•¶å‰ç¶²è·¯" - }, "customGas": { "message": "自訂 Gas" }, @@ -351,9 +299,6 @@ "customToken": { "message": "自訂代幣" }, - "customize": { - "message": "自訂" - }, "customRPC": { "message": "自訂 RPC" }, @@ -369,39 +314,18 @@ "delete": { "message": "刪除" }, - "denExplainer": { - "message": "您的 DEN 是 MetaMask 中您的的密碼加密儲存庫。" + "deleteAccount": { + "message": "刪除帳號" }, "deposit": { "message": "存入" }, - "depositBTC": { - "message": "將您的 BTC 存入到下é¢çš„ä½å€ï¼š" - }, - "depositEth": { - "message": "存入乙太幣" - }, "depositEther": { "message": "存入乙太幣" }, - "depositFiat": { - "message": "從法定貨幣存入" - }, - "depositFromAccount": { - "message": "從其他帳戶存入" - }, - "depositShapeShift": { - "message": "從 ShapeShift 存入" - }, - "depositShapeShiftExplainer": { - "message": "å¦‚æžœæ‚¨æ“æœ‰å…¶ä»–加密貨幣,å¯ç›´æŽ¥è½‰æ›ç‚ºä¹™å¤ªå¹£å­˜å…¥ MetaMask 錢包。ä¸éœ€é–‹æ–°å¸³æˆ¶ã€‚" - }, "details": { "message": "詳情" }, - "directDeposit": { - "message": "直接存入" - }, "directDepositEther": { "message": "直接存入乙太幣" }, @@ -429,38 +353,56 @@ "edit": { "message": "編輯" }, - "editAccountName": { - "message": "編輯帳戶å稱" + "editContact": { + "message": "編輯è¯çµ¡è³‡è¨Š" + }, + "endOfFlowMessage1": { + "message": "ä½ é€šéŽæ¸¬è©¦äº†â€”安全存放助記詞,這是你的責任ï¼" + }, + "endOfFlowMessage2": { + "message": "安全儲存的å°ç§˜è¨£" + }, + "endOfFlowMessage3": { + "message": "在多處儲存備份。" }, - "editingTransaction": { - "message": "修改交易" + "endOfFlowMessage4": { + "message": "ä¸è¦åˆ†äº«æ­¤åŠ©è¨˜ç¥ çµ¦ä»»ä½•äºº" }, - "emailUs": { - "message": "寄 Email 給我們!" + "endOfFlowMessage5": { + "message": "å°å¿ƒç¶²è·¯é‡£é­šï¼MetaMask æ°¸é ä¸æœƒä¸»å‹•è©¢å•你的助記詞。" }, - "encryptNewDen": { - "message": "加密您的新 DEN" + "endOfFlowMessage6": { + "message": "如你需è¦å†æ¬¡å‚™ä»½åŠ©è¨˜è©žï¼Œå¯è‡³è¨­å®š -> 安全。" }, - "ensNameNotFound": { - "message": "ENS å稱ä¸å­˜åœ¨" + "endOfFlowMessage7": { + "message": "如你有任何å•題或察覺有異,請寄信給 support@metamask.io" + }, + "endOfFlowMessage8": { + "message": "MetaMask 無法還原你的助記詞。暸解更多" + }, + "endOfFlowMessage9": { + "message": "深入瞭解。" + }, + "endOfFlowMessage10": { + "message": "都完æˆäº†" + }, + "ensRegistrationError": { + "message": "ENS å稱註冊錯誤" + }, + "ensNotFoundOnCurrentNetwork": { + "message": "ç¾æœ‰ç¶²è·¯ä¸­æ‰¾ä¸åˆ° ENS å稱。嘗試轉æ›åˆ°ä¸»è¦ä»¥å¤ªåŠç¶²è·¯ã€‚" + }, + "enterAnAlias": { + "message": "輸入化å" }, "enterPassword": { "message": "請輸入密碼" }, - "enterPasswordConfirm": { - "message": "è«‹å†æ¬¡è¼¸å…¥å¯†ç¢¼ç¢ºèª" - }, "enterPasswordContinue": { "message": "請輸入密碼" }, - "passwordNotLongEnough": { - "message": "您所輸入的密碼長度ä¸è¶³" - }, - "passwordsDontMatch": { - "message": "您所輸入的密碼ä¸ä¸€è‡´" - }, - "eth": { - "message": "ETH" + "ethereumPublicAddress": { + "message": "以太åŠå…¬é–‹ä½å€" }, "etherscanView": { "message": "在 Etherscan 上查看帳戶" @@ -468,18 +410,12 @@ "estimatedProcessingTimes": { "message": "é ä¼°è™•ç†æ™‚é–“" }, - "exchangeRate": { - "message": "匯率" - }, "expandView": { "message": "展開畫é¢" }, "exportPrivateKey": { "message": "導出ç§é‘°" }, - "exportPrivateKeyWarning": { - "message": "您需è¦è‡ªè¡Œè² æ“”導出ç§é‘°ç”¢ç”Ÿçš„風險" - }, "failed": { "message": "交易失败" }, @@ -489,12 +425,6 @@ "faster": { "message": "æ›´å¿«" }, - "fastest": { - "message": "最快" - }, - "feeChartTitle": { - "message": "峿™‚交易費é ä¼°" - }, "fiat": { "message": "法定貨幣", "description": "Exchange type" @@ -503,52 +433,27 @@ "message": "檔案匯入失敗?點擊這裡ï¼", "description": "Helps user import their account from a JSON file" }, - "followTwitter": { - "message": "追蹤 Twitter" - }, "forgetDevice": { "message": "移除此è£ç½®" }, "from": { "message": "來æºå¸³æˆ¶" }, - "fromToSame": { - "message": "來æºå’Œç›®çš„ä½å€ä¸èƒ½ä¸€æ¨£" - }, - "fromShapeShift": { - "message": "來自 ShapeShift" - }, "functionType": { "message": "功能類型" }, - "gas": { - "message": "Gas", - "description": "Short indication of gas cost" - }, - "gasFee": { - "message": "Gas 費用" - }, "gasLimit": { "message": "Gas 上é™" }, - "gasLimitCalculation": { - "message": "我們根據網路æˆåŠŸçŽ‡ç®—å‡ºå»ºè­°çš„ Gas 上é™ã€‚" - }, "gasLimitInfoModalContent": { "message": "Gas 上é™ä»£è¡¨é¡˜æ„為交易手續費所付出的最高總價" }, - "gasLimitRequired": { - "message": "必需填寫 Gas 上é™" - }, "gasLimitTooLow": { "message": "Gas 上é™è‡³å°‘為 21000" }, "gasUsed": { "message": "Gas 用é‡" }, - "generatingSeed": { - "message": "產生助憶詞中..." - }, "gasPrice": { "message": "Gas 價格 (GWEI)" }, @@ -561,14 +466,11 @@ "gasPriceNoDenom": { "message": "Gas 價格" }, - "gasPriceCalculation": { - "message": "我們根據網路æˆåŠŸçŽ‡ç®—å‡ºå»ºè­°çš„ Gas 價格" - }, - "gasPriceRequired": { - "message": "必需填寫 Gas 價格" + "general": { + "message": "一般" }, - "generatingTransaction": { - "message": "產生交易" + "generalSettingsDescription": { + "message": "貨幣轉æ›ï¼Œä¸»è¦è²¨å¹£ï¼Œèªžè¨€ï¼Œå€å¡Šéˆå“ˆå¸Œé ­åƒ" }, "getEther": { "message": "å–得乙太幣" @@ -580,9 +482,11 @@ "getHelp": { "message": "å–å¾—å”助" }, - "greaterThanMin": { - "message": "å¿…é ˆè¦å¤§æ–¼ç­‰æ–¼ $1。", - "description": "helper for inputting hex as decimal input" + "getStarted": { + "message": "開始使用" + }, + "happyToSeeYou": { + "message": "我們很高興看到你。" }, "hardware": { "message": "硬體" @@ -603,30 +507,18 @@ "message": "這裡", "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, - "hereList": { - "message": "Here's a list!!!!" - }, "hexData": { "message": "16進ä½è³‡æ–™" }, "hide": { "message": "éš±è—" }, - "hideToken": { - "message": "éš±è—代幣" - }, "hideTokenPrompt": { "message": "éš±è—代幣?" }, "history": { "message": "紀錄" }, - "howToDeposit": { - "message": "您想怎麼存入乙太幣?" - }, - "holdEther": { - "message": "能讓您ä¿å­˜ä¹™å¤ªå¹£å’Œä»£å¹£ï¼Œä¸¦æˆç‚ºæ‚¨èˆ‡åŽ»ä¸­å¿ƒåŒ–æ‡‰ç”¨ç¨‹å¼çš„æ©‹æ¢" - }, "import": { "message": "匯入", "description": "Button to import an account from a selected file" @@ -640,22 +532,18 @@ "importAccountSeedPhrase": { "message": "利用助憶詞還原" }, - "importAnAccount": { - "message": "匯入一個帳戶" + "importWallet": { + "message": "匯入錢包" }, - "importDen": { - "message": "åŒ¯å…¥ç¾æœ‰çš„ DEN" + "importYourExisting": { + "message": "使用 12 å­—çš„åŠ©è¨˜è©žä¾†åŒ¯å…¥ä½ ç¾æœ‰çš„錢包" }, "imported": { "message": "已匯入ç§é‘°", "description": "status showing that an account has been fully loaded into the keyring" }, "importUsingSeed": { - "message": "利用助憶詞匯入帳戶" , - "description": "登入é é¢ä¸‹æ–¹" - }, - "importWithSeedPhrase": { - "message": "利用助憶詞還原" + "message": "利用助憶詞匯入帳戶" }, "infoHelp": { "message": "說明 & 資訊" @@ -681,37 +569,28 @@ "knownAddressRecipient": { "message": "已知åˆç´„ä½å€" }, - "invalidGasParams": { - "message": "Gas åƒæ•¸éŒ¯èª¤" + "invalidAddressRecipientNotEthNetwork": { + "message": "éž ETH 網路,設定至å°å¯«" }, "invalidInput": { "message": "輸入錯誤。" }, - "invalidRequest": { - "message": "無效的請求" - }, "invalidRPC": { "message": "無效的 RPC URI" }, + "invalidBlockExplorerURL": { + "message": "無效的å€å¡Šéˆç€è¦½å™¨ URL" + }, "invalidSeedPhrase": { "message": "無效的助憶詞" }, - "jsonFail": { - "message": "有æ±è¥¿å‡ºéŒ¯äº†. è«‹ç¢ºèªæ‚¨çš„ JSON æª”æ¡ˆæ ¼å¼æ­£ç¢ºã€‚" - }, "jsonFile": { "message": "JSON æ ¼å¼æª”案", "description": "format for importing an account" }, - "keepTrackTokens": { - "message": "æŒçºŒè¿½è¹¤æ‚¨ MetaMask 帳戶中的代幣。" - }, "kovan": { "message": "Kovan 測試網路" }, - "knowledgeDataBase": { - "message": "查看我們的知識庫" - }, "max": { "message": "最大值" }, @@ -721,9 +600,8 @@ "ledgerAccountRestriction": { "message": "您必須使用最後的帳戶æ‰èƒ½ç”¢ç”Ÿæ–°å¸³æˆ¶" }, - "lessThanMax": { - "message": "å¿…é ˆå°æ–¼ç­‰æ–¼ $1.", - "description": "helper for inputting hex as decimal input" + "letsGoSetUp": { + "message": "好,我們開始å§ï¼" }, "likeToAddTokens": { "message": "確定è¦åŠ å…¥ä»£å¹£ï¼Ÿ" @@ -731,9 +609,6 @@ "links": { "message": "連çµ" }, - "limit": { - "message": "上é™" - }, "liveGasPricePredictions": { "message": "峿™‚ Gas 價格é ä¼°" }, @@ -743,20 +618,11 @@ "loadingTokens": { "message": "載入代幣..." }, - "localhost": { - "message": "Localhost 8545" - }, - "login": { - "message": "登入" + "loadMore": { + "message": "載入更多" }, - "logout": { - "message": "登出" - }, - "loose": { - "message": "éž MetaMask 帳號" - }, - "loweCaseWords": { - "message": "助憶詞僅包å«å°å¯«å­—å…ƒ" + "lock": { + "message": "鎖定" }, "mainnet": { "message": "ä¹™å¤ªåŠ ä¸»ç¶²è·¯" @@ -764,8 +630,8 @@ "memorizePhrase": { "message": "絕å°ä¸è¦å¿˜è¨˜æ‚¨çš„助憶詞。" }, - "menu": { - "message": "é¸å–®" + "memo": { + "message": "備註" }, "message": { "message": "訊æ¯" @@ -773,24 +639,21 @@ "metamaskDescription": { "message": "MetaMask 是乙太åŠå®‰å…¨èº«ä»½è­˜åˆ¥é‡‘庫" }, - "metamaskSeedWords": { - "message": "MetaMask Seed Words" - }, "metamaskVersion": { "message": "MetaMask 版本" }, - "min": { - "message": "最å°" - }, - "missingYourTokens": { - "message": "看ä¸åˆ°æ‚¨çš„代幣?" - }, - "minutesShorthand": { - "message": "Min" + "mobileSyncText": { + "message": "請輸入密碼確èªèº«ä»½ï¼" }, "myAccounts": { "message": "我的帳戶" }, + "myWalletAccounts": { + "message": "我的錢包帳號" + }, + "myWalletAccountsDescription": { + "message": "所有你在 MetaMask 創建的帳號將自動新增到此å€å¡Šã€‚" + }, "mustSelectOne": { "message": "å¿…é ˆé¸æ“‡è‡³å°‘ 1 代幣" }, @@ -801,49 +664,60 @@ "message": "æ‚¨å¿…é ˆé¸æ“‡ä¸€å€‹æª”案來匯入", "description": "User is important an account and needs to add a file to continue" }, - "needImportPassword": { - "message": "æ‚¨å¿…é ˆç‚ºé¸æ“‡å¥½çš„æª”案輸入密碼", - "description": "Password and file needed to import an account" - }, "negativeETH": { "message": "ä¸èƒ½é€å‡ºè² å€¼çš„乙太幣" }, + "networkName": { + "message": "網路å稱" + }, "networks": { "message": "網路" }, + "networkSettingsDescription": { + "message": "新增並編輯自訂 RPC 網路" + }, "nevermind": { "message": "算了" }, "newAccount": { "message": "新帳戶" }, + "newAccountDetectedDialogMessage": { + "message": "嵿¸¬åˆ°æ–°ä½å€ï¼é»žæ“Šæ­¤è™•將其新增到你的ä½å€ç°¿ã€‚" + }, "newAccountNumberName": { "message": "帳戶 $1", "description": "Default name of next account to be created on create account screen" }, + "newContact": { + "message": "æ–°è¯çµ¡è³‡è¨Š" + }, "newContract": { "message": "建立新åˆç´„" }, "newPassword": { "message": "新密碼(至少8個字元)" }, - "newPassword8Chars": { - "message": "新密碼 (至少8個字元)" - }, - "newRecipient": { - "message": "新收款人" - }, "newNetwork": { "message": "新增網路" }, - "rpcURL": { - "message": "RPC URL ä½å€" + "newToMetaMask": { + "message": "新來到 MetaMask?" + }, + "noAlreadyHaveSeed": { + "message": "ä¸ï¼Œæˆ‘已經有助記詞" + }, + "protectYourKeys": { + "message": "ä¿è­·ä½ çš„鑰匙ï¼" + }, + "protectYourKeysMessage1": { + "message": "å°å¿ƒä¿ç®¡ä½ çš„註記詞—我們接到報告有網站嘗試模仿 MetaMask。MetaMask æ°¸é ä¸æœƒè©¢å•你的助記詞ï¼" }, - "showAdvancedOptions": { - "message": "顯示進階é¸é …" + "protectYourKeysMessage2": { + "message": "å®‰å…¨å­˜æ”¾ä½ çš„åŠ©è¨˜è©žã€‚å¦‚ä½ å¯Ÿè¦ºæœ‰ç•°ï¼Œæˆ–ä½ å°æŸç¶²ç«™èµ·ç–‘,請寄信給 support@metamask.io" }, - "hideAdvancedOptions": { - "message": "éš±è—進階é¸é …" + "rpcUrl": { + "message": "æ–°çš„ RPC URL" }, "optionalChainId": { "message": "ChainID (å¯é¸)" @@ -851,9 +725,6 @@ "optionalSymbol": { "message": "Symbol (å¯é¸)" }, - "optionalNickname": { - "message": "顯示å稱 (å¯é¸)" - }, "newTotal": { "message": "總費用" }, @@ -866,23 +737,14 @@ "noAddressForName": { "message": "æ­¤ ENS 尚未指定ä½å€ã€‚" }, - "noDeposits": { - "message": "尚未有存款" - }, "noConversionRateAvailable": { "message": "尚未有匯率比較值" }, - "noTransactionHistory": { - "message": "尚未有交易紀錄" - }, "noTransactions": { "message": "尚未有交易" }, - "notFound": { - "message": "找ä¸åˆ°" - }, - "notStarted": { - "message": "尚未開始" + "notEnoughGas": { + "message": "Gas ä¸å¤ " }, "noWebcamFoundTitle": { "message": "找ä¸åˆ°æ”å½±é¡é ­" @@ -890,80 +752,40 @@ "noWebcamFound": { "message": "無法æœå°‹åˆ°æ”å½±é¡é ­è£ç½®ã€‚è«‹å†è©¦ä¸€æ¬¡" }, - "ofTextNofM": { - "message": "of" - }, - "oldUI": { - "message": "舊版界é¢" - }, - "oldUIMessage": { - "message": "您已經切æ›åˆ°èˆŠç‰ˆç•Œé¢ã€‚å¯ä»¥é€šéŽå³ä¸Šæ–¹ä¸‹æ‹‰é¸å–®ä¸­çš„é¸é …切æ›å›žæ–°çš„使用者界é¢ã€‚" - }, - "onlySendToEtherAddress": { - "message": "åªèƒ½ç™¼é€åˆ°ä¹™å¤ªåŠä½å€" - }, - "onlySendTokensToAccountAddress": { - "message": "åªèƒ½ç™¼é€ $1 到乙太åŠä½å€", - "description": "displays token symbol" - }, - "openInTab": { - "message": "é ç±¤ä¸­é–‹å•Ÿ" - }, - "or": { - "message": "或", - "description": "choice between creating or importing a new account" - }, "orderOneHere": { "message": "訂購 Trezor 或 Ledger 讓資產ä¿å­˜æ–¼ç¡¬é«”è£ç½®ã€‚" }, "origin": { "message": "來æº" }, - "outgoing": { - "message": "外出" - }, "parameters": { "message": "åƒæ•¸" }, - "originalTotal": { - "message": "原始總é‡" + "participateInMetaMetrics": { + "message": "åƒèˆ‡ MetaMetrics" + }, + "participateInMetaMetricsDescription": { + "message": "åƒèˆ‡ MetaMetrics 來å”助我們打造更好的 MetaMask" }, "password": { "message": "密碼" }, - "passwordCorrect": { - "message": "è«‹ç¢ºèªæ‚¨çš„密碼是正確的。" - }, - "passwordMismatch": { - "message": "密碼ä¸ä¸€è‡´", - "description": "in password creation process, the two new password fields did not match" + "passwordsDontMatch": { + "message": "您所輸入的密碼ä¸ä¸€è‡´" }, - "passwordShort": { - "message": "密碼ä¸å¤ é•·", - "description": "in password creation process, the password is not long enough to be secure" + "passwordNotLongEnough": { + "message": "您所輸入的密碼長度ä¸è¶³" }, "pastePrivateKey": { "message": "請貼上您的ç§é‘°å­—串:", "description": "For importing an account from a private key" }, - "pasteSeed": { - "message": "請貼上您的助憶詞ï¼" - }, "pending": { "message": "等待處ç†" }, "personalAddressDetected": { "message": "嵿¸¬ç‚ºå€‹äººä½å€ï¼Œè«‹è¼¸å…¥ä»£å¹£åˆç´„ä½å€" }, - "pleaseReviewTransaction": { - "message": "請檢查您的交易。" - }, - "popularTokens": { - "message": "常見的代幣" - }, - "prev": { - "message": "Prev" - }, "primaryCurrencySetting": { "message": "主è¦é¡¯ç¤º" }, @@ -983,29 +805,20 @@ "privateNetwork": { "message": "ç§æœ‰ç¶²è·¯" }, - "qrCode": { - "message": "顯示 QR Code" - }, "queue": { "message": "佇列" }, "readdToken": { "message": "未來å¯ä»¥éš¨æ™‚釿–°åŠ å…¥æ­¤ä»£å¹£" }, - "readMore": { - "message": "了解更多" - }, - "readMore2": { - "message": "了解更多" - }, - "receive": { - "message": "接收" + "recents": { + "message": "最近" }, "recipientAddress": { "message": "接收ä½å€" }, - "refundAddress": { - "message": "您的退款ä½å€" + "recipientAddressPlaceholder": { + "message": "æœå°‹ï¼Œå…¬é–‹åœ°å€ (0x),或 ENS" }, "rejectAll": { "message": "全部拒絕" @@ -1028,12 +841,17 @@ "resetAccountDescription": { "message": "é‡ç½®å¸³æˆ¶å°‡æ¸…除您的交易紀錄" }, - "restoreFromSeed": { - "message": "還原帳戶?", - "description": "登入é é¢ä¸‹æ–¹" + "deleteNetwork": { + "message": "刪除網路?" }, - "restoreVault": { - "message": "還原金庫" + "deleteNetworkDescription": { + "message": "你確定è¦åˆªé™¤ç¶²è·¯å—Žï¼Ÿ" + }, + "remindMeLater": { + "message": "ç¨å¾Œæé†’我" + }, + "restoreFromSeed": { + "message": "還原帳戶?" }, "restoreAccountWithSeed": { "message": "é€éŽåŠ©æ†¶è©žé‚„åŽŸæ‚¨çš„å¸³æˆ¶" @@ -1044,15 +862,6 @@ "required": { "message": "å¿…å¡«" }, - "retryWithMoreGas": { - "message": "改用更高的 Gas 價格é‡è©¦" - }, - "restore": { - "message": "Restore" - }, - "walletSeed": { - "message": "助憶詞" - }, "revealSeedWords": { "message": "顯示助憶詞" }, @@ -1068,9 +877,6 @@ "revealSeedWordsWarning": { "message": "絕å°ä¸è¦åœ¨å…¬å…±å ´åˆè¼¸å…¥åŠ©æ†¶è©žï¼é€™å¯è¢«ç”¨ä¾†ç«Šå–您的帳戶。" }, - "revert": { - "message": "還原" - }, "remove": { "message": "移除" }, @@ -1089,30 +895,8 @@ "ropsten": { "message": "Ropsten 測試網路" }, - "rpc": { - "message": "自訂 RPC" - }, - "currentRpc": { - "message": "ç•¶å‰çš„ RPC" - }, - "connectingToMainnet": { - "message": "連線到主 Ethereum 網路" - }, - "connectingToRopsten": { - "message": "連線到 Ropsten 測試網路" - }, - "connectingToKovan": { - "message": "連線到 Kovan 測試網路" - }, - "connectingToRinkeby": { - "message": "連線到 Rinkeby 測試網路" - }, - "connectingToUnknown": { - "message": "連線到未知網路" - }, - "sampleAccountName": { - "message": "例如:我的新帳戶", - "description": "Help user understand concept of adding a human-readable name to their account" + "goerli": { + "message": "Goerli 測試網路" }, "save": { "message": "儲存" @@ -1126,13 +910,6 @@ "saveAsCsvFile": { "message": "儲存為CSVæ ¼å¼æª”案" }, - "saveAsFile": { - "message": "儲存檔案", - "description": "Account export process" - }, - "saveSeedAsFile": { - "message": "å°‡åŠ©æ†¶è©žå„²å­˜æˆæª”案" - }, "scanInstructions": { "message": "è«‹å°‡ QR code 放在æ”å½±é¡é ­å‰é¢" }, @@ -1157,8 +934,11 @@ "secretPhrase": { "message": "輸入您的12個助憶詞以回復金庫" }, - "secondsShorthand": { - "message": "ç§’" + "securityAndPrivacy": { + "message": "安全&隱ç§" + }, + "securitySettingsDescription": { + "message": "éš±ç§è¨­å®šåŠéŒ¢åŒ…助記詞" }, "seedPhrasePlaceholder": { "message": "單詞之間請用空白分隔" @@ -1166,9 +946,6 @@ "seedPhraseReq": { "message": "助憶詞為 12 個詞語" }, - "select": { - "message": "鏿“‡" - }, "selectCurrency": { "message": "鏿“‡å¹£åˆ¥" }, @@ -1178,9 +955,6 @@ "selectLocale": { "message": "鏿“‡åœ°å€" }, - "selectService": { - "message": "鏿“‡æœå‹™" - }, "selectType": { "message": "鏿“‡é¡žåž‹" }, @@ -1208,48 +982,33 @@ "searchTokens": { "message": "æœå°‹ä»£å¹£" }, - "selectAnAddress": { - "message": "鏿“‡ä½å€" - }, "selectAnAccount": { "message": "鏿“‡å¸³æˆ¶" }, - "selectAnAccountHelp": { - "message": "Select the account to view in MetaMask" - }, "selectAHigherGasFee": { "message": "鏿“‡æ›´é«˜çš„交易費å¯åŠ é€Ÿæ‚¨çš„äº¤æ˜“è™•ç†æ™‚é–“ *" }, - "selectHdPath": { - "message": "Select HD Path" - }, "selectPathHelp": { "message": "若看ä¸åˆ°æ‚¨å·²ç¶“æ“æœ‰çš„ Ledger 帳戶,請嘗試切æ›è·¯å¾‘為 \"Legacy (MEW / MyCrypto)\"" }, - "sendTokensAnywhere": { - "message": "發é€ä»£å¹£çµ¦æ“有乙太åŠå¸³æˆ¶çš„任何人" - }, "settings": { "message": "設定" }, - "info": { - "message": "資訊" - }, - "shapeshiftBuy": { - "message": "從 Shapeshift 購買" - }, "showAdvancedGasInline": { "message": "顯示進階 Gas 控制é¸é …" }, "showAdvancedGasInlineDescription": { "message": "在交易時顯示å¯å¾®èª¿ Gas åƒ¹æ ¼ä»¥åŠ Gas 上é™çš„功能" }, + "showFiatConversionInTestnets": { + "message": "在測試網上顯示匯率" + }, + "showFiatConversionInTestnetsDescription": { + "message": "鏿“‡æ­¤ä¾†åœ¨æ¸¬è©¦ç¶²ä¸Šé¡¯ç¤ºæ³•定貨幣匯率" + }, "showPrivateKeys": { "message": "顯示ç§é‘°" }, - "showQRCode": { - "message": "顯示 QR Code" - }, "showHexData": { "message": "顯示16進ä½è³‡æ–™" }, @@ -1265,33 +1024,18 @@ "signed": { "message": "已簽署" }, - "signMessage": { - "message": "簽署訊æ¯" - }, "signNotice": { "message": "簽署此訊æ¯å¯èƒ½æœƒç”¢ç”Ÿå±éšªåœ°å‰¯ä½œç”¨ã€‚ \nåªå¾žæ‚¨å®Œå…¨ä¿¡ä»»çš„網站上簽署。這種å±éšªçš„æ–¹æ³•,將在未來的版本中被移除。" }, "sigRequest": { "message": "請求簽署" }, - "sigRequested": { - "message": "已請求簽署" - }, "somethingWentWrong": { "message": "糟糕ï¼å‡ºäº†é»žå•題。" }, - "spaceBetween": { - "message": "單詞之間åªèƒ½æœ‰ç©ºç™½" - }, "speedUp": { "message": "加速" }, - "speedUpTitle": { - "message": "加速交易" - }, - "speedUpSubtitle": { - "message": "æé«˜æ‰‹çºŒè²»å¯ä»¥åŠ é€Ÿäº¤æ˜“è™•ç†æ™‚é–“" - }, "speedUpCancellation": { "message": "åŠ é€Ÿå–æ¶ˆ" }, @@ -1301,9 +1045,6 @@ "switchNetworks": { "message": "切æ›ç¶²è·¯" }, - "status": { - "message": "狀態" - }, "stateLogs": { "message": "狀態紀錄" }, @@ -1334,20 +1075,38 @@ "storePhrase": { "message": "您å¯ä»¥ç”¨å¯†ç¢¼ç®¡ç†ç³»çµ±ä¾‹å¦‚ 1Password 等軟體儲存助憶詞。" }, - "submit": { - "message": "é€å‡º" - }, "submitted": { "message": "å·²é€å‡º" }, "supportCenter": { "message": "造訪我們的å”助中心" }, + "symbol": { + "message": "符號" + }, "symbolBetweenZeroTwelve": { - "message": "代號必須介於 0 到 12 字元間." + "message": "符號ä¸å¾—è¶…éŽ11個字符。" + }, + "syncWithMobile": { + "message": "和移動è£ç½®åŒæ­¥" + }, + "syncWithMobileTitle": { + "message": "和移動è£ç½®åŒæ­¥" + }, + "syncWithMobileDesc": { + "message": "ä½ å¯ä»¥ç”¨ç§»å‹•è£ç½®åŒæ­¥å¸³è™Ÿèˆ‡è³‡è¨Šã€‚開啟 MetaMask 移動 app,至「設定ã€ä¸¦é»žæ“Šã€Œè‡ªç€è¦½å™¨æ“´å……åŠŸèƒ½åŒæ­¥ã€" + }, + "syncWithMobileDescNewUsers": { + "message": "如你是第一次開啟 MetaMask 移動 app,åªè¦è·Ÿè‘—手機上的指示æ“作å³å¯ã€‚" + }, + "syncWithMobileScanThisCode": { + "message": "用你的 MetaMask 移動 app æŽƒææ­¤ä»£ç¢¼" + }, + "syncWithMobileBeCareful": { + "message": "掃æä»£ç¢¼æ™‚ç¢ºä¿æ²’有其他人在看你的螢幕" }, - "takesTooLong": { - "message": "花費太長時間?" + "syncWithMobileComplete": { + "message": "你的資料已æˆåŠŸåŒæ­¥ã€‚開始活用 MetaMask 移動 appï¼" }, "terms": { "message": "ä½¿ç”¨æ¢æ¬¾" @@ -1355,37 +1114,27 @@ "testFaucet": { "message": "測試水管" }, + "thisWillCreate": { + "message": "這將創建新的錢包與助記詞" + }, "tips": { "message": "æç¤º" }, "to": { "message": "目的帳戶" }, - "toETHviaShapeShift": { - "message": "$1 ETH é€éŽ ShapeShift", - "description": "system will fill in deposit type in start of message" - }, "token": { "message": "代碼" }, - "tokenAddress": { - "message": "代幣ä½å€" - }, "tokenAlreadyAdded": { "message": "å·²åŠ å…¥éŽæ­¤ä»£å¹£ã€‚" }, - "tokenBalance": { - "message": "代幣餘é¡ï¼š" - }, - "tokenSelection": { - "message": "æœå°‹ä»£å¹£æˆ–æ˜¯å¾žå¸¸è¦‹ä»£å¹£åˆ—è¡¨ä¸­é¸æ“‡ã€‚" + "tokenContractAddress": { + "message": "代幣åˆåŒä½å€" }, "tokenSymbol": { "message": "代幣代號" }, - "tokenWarning1": { - "message": "使用 MetaMask 帳戶追蹤您已購得的代幣。如果使用ä¸åŒçš„帳戶ä¿å­˜è³¼å¾—çš„ä»£å¹£ï¼Œé‚£äº›ä»£å¹£å°±ä¸æœƒå‡ºç¾åœ¨é€™è£¡ã€‚" - }, "total": { "message": "總é‡" }, @@ -1398,9 +1147,6 @@ "transactionCreated": { "message": "交易產生 æ•¸é‡ $1 時間 $2" }, - "transactionWithNonce": { - "message": "交易 $1" - }, "transactionDropped": { "message": "交易廢除 時間 $2" }, @@ -1413,9 +1159,6 @@ "transactionUpdated": { "message": "交易狀態更新 時間 $2" }, - "transactionUpdatedGas": { - "message": "交易狀態更新 手續費 $1 時間 $2." - }, "transactionErrored": { "message": "交易錯誤" }, @@ -1425,9 +1168,6 @@ "transactionCancelSuccess": { "message": "äº¤æ˜“å–æ¶ˆæˆåŠŸ $2" }, - "transactions": { - "message": "交易紀錄" - }, "transactionError": { "message": "交易失敗。åˆç´„代碼拋出錯誤資訊" }, @@ -1437,27 +1177,18 @@ "transactionFee": { "message": "交易費" }, - "transactionMemo": { - "message": "交易備註(é¸å¡«ï¼‰" - }, - "transactionNumber": { - "message": "交易號碼" - }, "transactionTime": { "message": "交易時間" }, "transfer": { "message": "交易" }, + "transferBetweenAccounts": { + "message": "在我的帳號間轉帳" + }, "transferFrom": { "message": "交易來æº" }, - "transfers": { - "message": "交易" - }, - "trezorHardwareWallet": { - "message": "TREZOR 硬體錢包" - }, "troubleTokenBalances": { "message": "無法å–得代幣餘é¡ã€‚您kå¯ä»¥åˆ°é€™è£¡æŸ¥çœ‹ ", "description": "Followed by a link (here) to view token balances" @@ -1465,27 +1196,12 @@ "tryAgain": { "message": "å†è©¦ä¸€æ¬¡" }, - "twelveWords": { - "message": "這 12 個單詞是唯一回復您的 MetaMask 帳戶的方法。\n將它們儲存到那些安全且隱密的地方å§ã€‚" - }, "typePassword": { "message": "請輸入密碼" }, - "uiMigrationAnnouncement": { - "message": "歡迎使用 MetaMask 新版使用介é¢ã€‚若您有任何關於使用介é¢çš„æ”¹å–„建議,請到GitHubè¯çµ¡æˆ‘們的æœå‹™å°çµ„。" - }, - "uiWelcome": { - "message": "æ­¡è¿Žä½¿ç”¨æ–°ç‰ˆç•Œé¢ (Beta)" - }, - "uiWelcomeMessage": { - "message": "您ç¾åœ¨æ­£åœ¨ä½¿ç”¨ MetaMask 新版界é¢ã€‚試試發é€ä»£å¹£ç­‰æ–°åŠŸèƒ½å§ï¼Œæœ‰ä»»ä½•å•題請告知我們。" - }, "unapproved": { "message": "未批准" }, - "unavailable": { - "message": "ä¸å¯ç”¨" - }, "units": { "message": "å–®ä½" }, @@ -1495,9 +1211,6 @@ "unknownNetwork": { "message": "æœªçŸ¥ç§æœ‰ç¶²è·¯" }, - "unknownNetworkId": { - "message": "未知的網路ID" - }, "unknownQrCode": { "message": "錯誤:無法辨識 QR code" }, @@ -1508,7 +1221,7 @@ "message": "ç„¡æ³•å­˜å–æ”å½±é¡é ­ã€‚è«‹å†è©¦ä¸€æ¬¡..." }, "unlock": { - "message": "Unlock" + "message": "解鎖" }, "unlockMessage": { "message": "去中心化網路世界等待著您" @@ -1516,36 +1229,35 @@ "updatedWithDate": { "message": "更新時間 $1" }, - "uriErrorMsg": { + "urlErrorMsg": { "message": "URIs 需è¦åŠ å…¥é©ç•¶çš„ HTTP/HTTPS å‰ç¶´å­—" }, - "usaOnly": { - "message": "僅é™ç¾Žåœ‹", - "description": "Using this exchange is limited to people inside the USA" - }, "usedByClients": { "message": "å¯ç”¨æ–¼å„種ä¸åŒçš„客戶端" }, - "useOldUI": { - "message": "使用舊版界é¢" - }, - "validFileImport": { - "message": "æ‚¨å¿…é ˆé¸æ“‡ä¸€å€‹åˆæ³•的檔案來匯入." - }, - "vaultCreated": { - "message": "已建立金庫" + "userName": { + "message": "使用者å稱" }, "viewAccount": { "message": "查看帳戶" }, + "viewinExplorer": { + "message": "在 Explorer 上ç€è¦½" + }, + "viewContact": { + "message": "觀看è¯çµ¡è³‡è¨Š" + }, + "viewOnCustomBlockExplorer": { + "message": "在 $1 ç€è¦½" + }, "viewOnEtherscan": { "message": "在 Etherscan 上ç€è¦½" }, "visitWebSite": { "message": "造訪我們的網站" }, - "warning": { - "message": "警告" + "walletSeed": { + "message": "助憶詞" }, "welcomeBack": { "message": "歡迎回來!" @@ -1553,9 +1265,6 @@ "welcome": { "message": "歡迎來到 MetaMask" }, - "whatsThis": { - "message": "這是什麼?" - }, "writePhrase": { "message": "將助憶詞寫在紙上,並ä¿å­˜åœ¨å®‰å…¨çš„å ´æ‰€ã€‚è‹¥æƒ³è¦æ›´å®‰å…¨ï¼Œå°‡åŠ©æ†¶è©žåˆ†åˆ¥å¯«åœ¨ä¸åŒç´™å¼µä¸Šä¸¦å­˜æ”¾åœ¨ä¸åŒçš„地方。" }, @@ -1574,16 +1283,7 @@ "yourPrivateSeedPhrase": { "message": "您的助憶詞" }, - "yourUniqueAccountImage": { - "message": "您的帳戶圖案" - }, - "yourUniqueAccountImageDescription1": { - "message": "這個圖案是基於您的帳戶資訊由電腦自動產生。" - }, - "yourUniqueAccountImageDescription2": { - "message": "您æ¯ä¸€æ¬¡åœ¨äº¤æ˜“時,都會看到這個圖案。" - }, "zeroGasPriceOnSpeedUpError": { - "message":"加速的 Gas 價格為 0" + "message": "加速的 Gas 價格為 0" } } diff --git a/app/fonts/DIN Next/DIN Next W01 Bold.otf b/app/fonts/DIN Next/DIN Next W01 Bold.otf deleted file mode 100644 index 2b78d1ff4bf0..000000000000 Binary files a/app/fonts/DIN Next/DIN Next W01 Bold.otf and /dev/null differ diff --git a/app/fonts/DIN Next/DIN Next W01 Regular.otf b/app/fonts/DIN Next/DIN Next W01 Regular.otf deleted file mode 100644 index 09f6ee297817..000000000000 Binary files a/app/fonts/DIN Next/DIN Next W01 Regular.otf and /dev/null differ diff --git a/app/fonts/DIN Next/DIN Next W10 Black.otf b/app/fonts/DIN Next/DIN Next W10 Black.otf deleted file mode 100644 index 08eb73373337..000000000000 Binary files a/app/fonts/DIN Next/DIN Next W10 Black.otf and /dev/null differ diff --git a/app/fonts/DIN Next/DIN Next W10 Italic.otf b/app/fonts/DIN Next/DIN Next W10 Italic.otf deleted file mode 100644 index 73f2b9e8c117..000000000000 Binary files a/app/fonts/DIN Next/DIN Next W10 Italic.otf and /dev/null differ diff --git a/app/fonts/DIN Next/DIN Next W10 Light.otf b/app/fonts/DIN Next/DIN Next W10 Light.otf deleted file mode 100644 index 700450e49094..000000000000 Binary files a/app/fonts/DIN Next/DIN Next W10 Light.otf and /dev/null differ diff --git a/app/fonts/DIN Next/DIN Next W10 Medium.otf b/app/fonts/DIN Next/DIN Next W10 Medium.otf deleted file mode 100644 index b73f2e43f31a..000000000000 Binary files a/app/fonts/DIN Next/DIN Next W10 Medium.otf and /dev/null differ diff --git a/app/fonts/DIN_OT/DINOT-2.otf b/app/fonts/DIN_OT/DINOT-2.otf deleted file mode 100644 index 4a5e131270c8..000000000000 Binary files a/app/fonts/DIN_OT/DINOT-2.otf and /dev/null differ diff --git a/app/fonts/DIN_OT/DINOT-Bold 2.otf b/app/fonts/DIN_OT/DINOT-Bold 2.otf deleted file mode 100644 index 6ed5b6c3d7b1..000000000000 Binary files a/app/fonts/DIN_OT/DINOT-Bold 2.otf and /dev/null differ diff --git a/app/fonts/DIN_OT/DINOT-BoldItalic.otf b/app/fonts/DIN_OT/DINOT-BoldItalic.otf deleted file mode 100644 index 148c905883c4..000000000000 Binary files a/app/fonts/DIN_OT/DINOT-BoldItalic.otf and /dev/null differ diff --git a/app/fonts/DIN_OT/DINOT-Italic 2.otf b/app/fonts/DIN_OT/DINOT-Italic 2.otf deleted file mode 100644 index e365e77ab782..000000000000 Binary files a/app/fonts/DIN_OT/DINOT-Italic 2.otf and /dev/null differ diff --git a/app/fonts/DIN_OT/DINOT-Medium 2.otf b/app/fonts/DIN_OT/DINOT-Medium 2.otf deleted file mode 100644 index a87a2df37764..000000000000 Binary files a/app/fonts/DIN_OT/DINOT-Medium 2.otf and /dev/null differ diff --git a/app/fonts/DIN_OT/DINOT-MediumItalic 2.otf b/app/fonts/DIN_OT/DINOT-MediumItalic 2.otf deleted file mode 100644 index 14eddfc764c0..000000000000 Binary files a/app/fonts/DIN_OT/DINOT-MediumItalic 2.otf and /dev/null differ diff --git a/app/fonts/Euclid/EuclidCircularB-Bold-WebXL.ttf b/app/fonts/Euclid/EuclidCircularB-Bold-WebXL.ttf new file mode 100644 index 000000000000..244ebba0a481 Binary files /dev/null and b/app/fonts/Euclid/EuclidCircularB-Bold-WebXL.ttf differ diff --git a/app/fonts/Euclid/EuclidCircularB-Regular-WebXL.ttf b/app/fonts/Euclid/EuclidCircularB-Regular-WebXL.ttf new file mode 100644 index 000000000000..6cf177fe1b23 Binary files /dev/null and b/app/fonts/Euclid/EuclidCircularB-Regular-WebXL.ttf differ diff --git a/app/fonts/Euclid/EuclidCircularB-RegularItalic-WebXL.ttf b/app/fonts/Euclid/EuclidCircularB-RegularItalic-WebXL.ttf new file mode 100644 index 000000000000..35345ba0f23b Binary files /dev/null and b/app/fonts/Euclid/EuclidCircularB-RegularItalic-WebXL.ttf differ diff --git a/app/fonts/Font_Awesome/font-awesome.min.css b/app/fonts/Font_Awesome/font-awesome.min.css deleted file mode 100644 index ee4e9782bf8b..000000000000 --- a/app/fonts/Font_Awesome/font-awesome.min.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.4.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"} diff --git a/app/fonts/Lato/Lato-Black.ttf b/app/fonts/Lato/Lato-Black.ttf deleted file mode 100755 index 6848db0d1acf..000000000000 Binary files a/app/fonts/Lato/Lato-Black.ttf and /dev/null differ diff --git a/app/fonts/Lato/Lato-BlackItalic.ttf b/app/fonts/Lato/Lato-BlackItalic.ttf deleted file mode 100755 index 5decf12973e9..000000000000 Binary files a/app/fonts/Lato/Lato-BlackItalic.ttf and /dev/null differ diff --git a/app/fonts/Lato/Lato-Bold.ttf b/app/fonts/Lato/Lato-Bold.ttf deleted file mode 100755 index 74343694e2b2..000000000000 Binary files a/app/fonts/Lato/Lato-Bold.ttf and /dev/null differ diff --git a/app/fonts/Lato/Lato-BoldItalic.ttf b/app/fonts/Lato/Lato-BoldItalic.ttf deleted file mode 100755 index 684aacf5b4f3..000000000000 Binary files a/app/fonts/Lato/Lato-BoldItalic.ttf and /dev/null differ diff --git a/app/fonts/Lato/Lato-Hairline.ttf b/app/fonts/Lato/Lato-Hairline.ttf deleted file mode 100755 index 288be29553a7..000000000000 Binary files a/app/fonts/Lato/Lato-Hairline.ttf and /dev/null differ diff --git a/app/fonts/Lato/Lato-HairlineItalic.ttf b/app/fonts/Lato/Lato-HairlineItalic.ttf deleted file mode 100755 index c2bfd3353e37..000000000000 Binary files a/app/fonts/Lato/Lato-HairlineItalic.ttf and /dev/null differ diff --git a/app/fonts/Lato/Lato-Italic.ttf b/app/fonts/Lato/Lato-Italic.ttf deleted file mode 100755 index 3d3b7a2984ae..000000000000 Binary files a/app/fonts/Lato/Lato-Italic.ttf and /dev/null differ diff --git a/app/fonts/Lato/Lato-Light.ttf b/app/fonts/Lato/Lato-Light.ttf deleted file mode 100755 index a958067a86f4..000000000000 Binary files a/app/fonts/Lato/Lato-Light.ttf and /dev/null differ diff --git a/app/fonts/Lato/Lato-LightItalic.ttf b/app/fonts/Lato/Lato-LightItalic.ttf deleted file mode 100755 index 5e45ad9a6c94..000000000000 Binary files a/app/fonts/Lato/Lato-LightItalic.ttf and /dev/null differ diff --git a/app/fonts/Lato/Lato-Regular.ttf b/app/fonts/Lato/Lato-Regular.ttf deleted file mode 100755 index 04ea8efb1367..000000000000 Binary files a/app/fonts/Lato/Lato-Regular.ttf and /dev/null differ diff --git a/app/fonts/Lato/OFL.txt b/app/fonts/Lato/OFL.txt deleted file mode 100755 index dfca0da4bcda..000000000000 --- a/app/fonts/Lato/OFL.txt +++ /dev/null @@ -1,93 +0,0 @@ -Copyright (c) 2010-2014 by tyPoland Lukasz Dziedzic (team@latofonts.com) with Reserved Font Name "Lato" - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/app/fonts/Montserrat/Montserrat-Bold.ttf b/app/fonts/Montserrat/Montserrat-Bold.ttf deleted file mode 100755 index ae33a4538132..000000000000 Binary files a/app/fonts/Montserrat/Montserrat-Bold.ttf and /dev/null differ diff --git a/app/fonts/Montserrat/Montserrat-Bold.woff b/app/fonts/Montserrat/Montserrat-Bold.woff deleted file mode 100644 index 29644358cd94..000000000000 Binary files a/app/fonts/Montserrat/Montserrat-Bold.woff and /dev/null differ diff --git a/app/fonts/Montserrat/Montserrat-Light.ttf b/app/fonts/Montserrat/Montserrat-Light.ttf deleted file mode 100644 index cd8f62d7e40f..000000000000 Binary files a/app/fonts/Montserrat/Montserrat-Light.ttf and /dev/null differ diff --git a/app/fonts/Montserrat/Montserrat-Light.woff b/app/fonts/Montserrat/Montserrat-Light.woff deleted file mode 100644 index d8aa6e103700..000000000000 Binary files a/app/fonts/Montserrat/Montserrat-Light.woff and /dev/null differ diff --git a/app/fonts/Montserrat/Montserrat-Regular.ttf b/app/fonts/Montserrat/Montserrat-Regular.ttf deleted file mode 100755 index 5b4b5afe6ee4..000000000000 Binary files a/app/fonts/Montserrat/Montserrat-Regular.ttf and /dev/null differ diff --git a/app/fonts/Montserrat/Montserrat-Regular.woff b/app/fonts/Montserrat/Montserrat-Regular.woff deleted file mode 100644 index fcbed160237b..000000000000 Binary files a/app/fonts/Montserrat/Montserrat-Regular.woff and /dev/null differ diff --git a/app/fonts/Montserrat/Montserrat-UltraLight.ttf b/app/fonts/Montserrat/Montserrat-UltraLight.ttf deleted file mode 100644 index 16d2dbf15373..000000000000 Binary files a/app/fonts/Montserrat/Montserrat-UltraLight.ttf and /dev/null differ diff --git a/app/fonts/Montserrat/Montserrat-UltraLight.woff b/app/fonts/Montserrat/Montserrat-UltraLight.woff deleted file mode 100644 index 156ff32c89a6..000000000000 Binary files a/app/fonts/Montserrat/Montserrat-UltraLight.woff and /dev/null differ diff --git a/app/fonts/Montserrat/OFL.txt b/app/fonts/Montserrat/OFL.txt deleted file mode 100755 index 3968b2265a31..000000000000 --- a/app/fonts/Montserrat/OFL.txt +++ /dev/null @@ -1,92 +0,0 @@ -Copyright (c) 2011-2012, Julieta Ulanovsky (julieta.ulanovsky@gmail.com), with Reserved Font Names 'Montserrat' -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/app/fonts/fonts/FontAwesome.otf b/app/fonts/fonts/FontAwesome.otf deleted file mode 100644 index 681bdd4d4c8d..000000000000 Binary files a/app/fonts/fonts/FontAwesome.otf and /dev/null differ diff --git a/app/fonts/fonts/fontawesome-webfont.eot b/app/fonts/fonts/fontawesome-webfont.eot deleted file mode 100644 index a30335d748c6..000000000000 Binary files a/app/fonts/fonts/fontawesome-webfont.eot and /dev/null differ diff --git a/app/fonts/fonts/fontawesome-webfont.svg b/app/fonts/fonts/fontawesome-webfont.svg deleted file mode 100644 index 6fd19abcb9ec..000000000000 --- a/app/fonts/fonts/fontawesome-webfont.svg +++ /dev/null @@ -1,640 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/fonts/fonts/fontawesome-webfont.ttf b/app/fonts/fonts/fontawesome-webfont.ttf deleted file mode 100644 index d7994e13086b..000000000000 Binary files a/app/fonts/fonts/fontawesome-webfont.ttf and /dev/null differ diff --git a/app/fonts/fonts/fontawesome-webfont.woff b/app/fonts/fonts/fontawesome-webfont.woff deleted file mode 100644 index 6fd4ede0f30f..000000000000 Binary files a/app/fonts/fonts/fontawesome-webfont.woff and /dev/null differ diff --git a/app/fonts/fonts/fontawesome-webfont.woff2 b/app/fonts/fonts/fontawesome-webfont.woff2 deleted file mode 100644 index 5560193ccc5d..000000000000 Binary files a/app/fonts/fonts/fontawesome-webfont.woff2 and /dev/null differ diff --git a/app/fonts/index.css b/app/fonts/index.css deleted file mode 100644 index b31179cb44db..000000000000 --- a/app/fonts/index.css +++ /dev/null @@ -1,405 +0,0 @@ -@import url('./Font_Awesome/font-awesome.min.css'); - -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('./Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('./Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('./Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('./Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('./Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('./Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('./Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('./Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('./Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('./Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('./Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('./Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('./Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('./Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('./Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('./Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('./Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('./Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('./Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('./Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('./Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('./Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('./Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('./Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('./Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('./Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('./Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('./Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('./Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('./Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('./Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('./Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('./Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('./Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('./Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('./Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('./Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('./Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('./Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('./Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('./Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} - -@font-face { - font-family: 'Montserrat Regular'; - src: url('./Montserrat/Montserrat-Regular.woff') format('woff'); - src: url('./Montserrat/Montserrat-Regular.ttf') format('truetype'); - font-weight: 400; - font-style: normal; - font-size: small; -} - -@font-face { - font-family: 'Montserrat Bold'; - src: url('./Montserrat/Montserrat-Bold.woff') format('woff'); - src: url('./Montserrat/Montserrat-Bold.ttf') format('truetype'); - font-weight: 400; - font-style: normal; -} - -@font-face { - font-family: 'Montserrat Light'; - src: url('./Montserrat/Montserrat-Light.woff') format('woff'); - src: url('./Montserrat/Montserrat-Light.ttf') format('truetype'); - font-weight: 400; - font-style: normal; -} - -@font-face { - font-family: 'Montserrat UltraLight'; - src: url('./Montserrat/Montserrat-UltraLight.woff') format('woff'); - src: url('./Montserrat/Montserrat-UltraLight.ttf') format('truetype'); - font-weight: 400; - font-style: normal; -} - -@font-face { - font-family: 'DIN OT'; - src: url('./DIN_OT/DINOT-2.otf') format('opentype'); - font-weight: 400; - font-style: normal; -} - -@font-face { - font-family: 'DIN OT Light'; - src: url('./DIN_OT/DINOT-2.otf') format('opentype'); - font-weight: 200; - font-style: normal; -} - -@font-face { - font-family: 'DIN NEXT'; - src: url('./DIN Next/DIN Next W01 Regular.otf') format('opentype'); - font-weight: 400; - font-style: normal; -} - -@font-face { - font-family: 'DIN NEXT Light'; - src: url('./DIN Next/DIN Next W10 Light.otf') format('opentype'); - font-weight: 400; - font-style: normal; -} - -@font-face { - font-family: 'Lato'; - src: url('./Lato/Lato-Regular.ttf') format('truetype'); - font-weight: 400; - font-style: normal; -} diff --git a/app/home.html b/app/home.html index 051133cf818c..5c131bfc838f 100644 --- a/app/home.html +++ b/app/home.html @@ -4,10 +4,13 @@ MetaMask + +
- +
+ diff --git a/app/images/404.png b/app/images/404.png deleted file mode 100644 index b1a767dde6a8..000000000000 Binary files a/app/images/404.png and /dev/null differ diff --git a/app/images/alert-red.svg b/app/images/alert-red.svg index ac5b30e2710d..29aa77e8c4df 100644 --- a/app/images/alert-red.svg +++ b/app/images/alert-red.svg @@ -1,14 +1,9 @@ - - - - Artboard Copy - Created with Sketch. - - - - - - + + + + + + - \ No newline at end of file + diff --git a/app/images/alert.svg b/app/images/alert.svg index 534eda194b4f..7238cfb2906a 100644 --- a/app/images/alert.svg +++ b/app/images/alert.svg @@ -1,19 +1,6 @@ - - - - 7414FFD8-B28A-4593-9D7E-19E73D687B50 - Created with sketchtool. - - - - - - - - - - - - + + + + - \ No newline at end of file + diff --git a/app/images/arrow-popout.svg b/app/images/arrow-popout.svg index 7e25f7cd2afb..c3a11e45f9a0 100644 --- a/app/images/arrow-popout.svg +++ b/app/images/arrow-popout.svg @@ -1,3 +1,3 @@ - - + + diff --git a/app/images/arrow-right.svg b/app/images/arrow-right.svg index ea5cd06093d7..158e63c82998 100644 --- a/app/images/arrow-right.svg +++ b/app/images/arrow-right.svg @@ -1,16 +1,3 @@ - - - - arrow-right - Created with Sketch. - - - - - - - - - - - \ No newline at end of file + + + diff --git a/app/images/camera.svg b/app/images/camera.svg index 69f14b91d3d6..4d3f73ec6082 100644 --- a/app/images/camera.svg +++ b/app/images/camera.svg @@ -1,18 +1,4 @@ - - - - - - - - + + + diff --git a/app/images/cancel.png b/app/images/cancel.png deleted file mode 100644 index 4e0eb11432be..000000000000 Binary files a/app/images/cancel.png and /dev/null differ diff --git a/app/images/caret-left-black.svg b/app/images/caret-left-black.svg index 872135ece42d..f225424f0796 100644 --- a/app/images/caret-left-black.svg +++ b/app/images/caret-left-black.svg @@ -1,18 +1,3 @@ - - - - 8439120D-5704-4273-B416-FEE134322584 - Created with sketchtool. - - - - - - - - - - - - + + diff --git a/app/images/caret-left.svg b/app/images/caret-left.svg index 0ea266161e1e..775d76e39a75 100644 --- a/app/images/caret-left.svg +++ b/app/images/caret-left.svg @@ -1,18 +1,3 @@ - - - - 8439120D-5704-4273-B416-FEE134322584 - Created with sketchtool. - - - - - - - - - - - - - \ No newline at end of file + + + diff --git a/app/images/caret-right.svg b/app/images/caret-right.svg index 8981ac25482f..b1a990ad191a 100644 --- a/app/images/caret-right.svg +++ b/app/images/caret-right.svg @@ -1,76 +1,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + diff --git a/app/images/check-green-solid.svg b/app/images/check-green-solid.svg new file mode 100644 index 000000000000..68c46196d1e7 --- /dev/null +++ b/app/images/check-green-solid.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/images/check-icon.svg b/app/images/check-icon.svg index cafa864e5156..ebd8ee11f691 100644 --- a/app/images/check-icon.svg +++ b/app/images/check-icon.svg @@ -1,17 +1,6 @@ - - - - 76BCDB09-52B0-41CB-908F-12F9087A2F1B - Created with sketchtool. - - - - - - - - - - + + + + - \ No newline at end of file + diff --git a/app/images/check-white.svg b/app/images/check-white.svg index 0f15667dae04..9bbea3c1a858 100644 --- a/app/images/check-white.svg +++ b/app/images/check-white.svg @@ -1,14 +1,3 @@ - - - - check-white - Created with Sketch. - - - - - - - - - \ No newline at end of file + + + diff --git a/app/images/close-gray.svg b/app/images/close-gray.svg new file mode 100755 index 000000000000..cb198fa6cdf0 --- /dev/null +++ b/app/images/close-gray.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/images/coinbase logo.png b/app/images/coinbase logo.png deleted file mode 100644 index a23d7926d3b8..000000000000 Binary files a/app/images/coinbase logo.png and /dev/null differ diff --git a/app/images/coinswitch_logo.png b/app/images/coinswitch_logo.png index 445ecf02eef9..d13d55c32c2e 100644 Binary files a/app/images/coinswitch_logo.png and b/app/images/coinswitch_logo.png differ diff --git a/app/images/connect-icon.svg b/app/images/connect-icon.svg index 84540999adcd..7b93be6b4b05 100644 --- a/app/images/connect-icon.svg +++ b/app/images/connect-icon.svg @@ -1,11 +1,4 @@ - - - - background - - - - Layer 1 - - - \ No newline at end of file + + + + diff --git a/app/images/connect-white.svg b/app/images/connect-white.svg new file mode 100644 index 000000000000..e9063ae4639f --- /dev/null +++ b/app/images/connect-white.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/images/copy-to-clipboard.svg b/app/images/copy-to-clipboard.svg deleted file mode 100644 index c67c2aa84e2d..000000000000 --- a/app/images/copy-to-clipboard.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - 374E58A5-C29E-4921-83E7-889FA06D6408 - Created with sketchtool. - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/images/copy.svg b/app/images/copy.svg index 494c823bdec2..9ee2317b74ce 100644 --- a/app/images/copy.svg +++ b/app/images/copy.svg @@ -1,21 +1,5 @@ - - - - - - - - - - - - - - + + + + diff --git a/app/images/deadface.png b/app/images/deadface.png deleted file mode 100644 index e12476c0312a..000000000000 Binary files a/app/images/deadface.png and /dev/null differ diff --git a/app/images/deposit-eth.svg b/app/images/deposit-eth.svg index a2c69242e7c5..997c3b7acab1 100644 --- a/app/images/deposit-eth.svg +++ b/app/images/deposit-eth.svg @@ -1,32 +1,12 @@ - - - - deposit-eth - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - \ No newline at end of file + diff --git a/app/images/double-arrow.svg b/app/images/double-arrow.svg index a31a0550bcdf..db13703e7154 100644 --- a/app/images/double-arrow.svg +++ b/app/images/double-arrow.svg @@ -1,13 +1,5 @@ - - - - first/last - Created with Sketch. - - - - - - + + + - \ No newline at end of file + diff --git a/app/images/download-alt.svg b/app/images/download-alt.svg index 11c54fd66171..c59f815effe4 100644 --- a/app/images/download-alt.svg +++ b/app/images/download-alt.svg @@ -1,5 +1,7 @@ - - - - + + + + + + diff --git a/app/images/download.svg b/app/images/download.svg index b55066414319..98110070f45f 100644 --- a/app/images/download.svg +++ b/app/images/download.svg @@ -1,26 +1,6 @@ - - - - 50559280-0739-419A-8E87-3CDD16A6996A - Created with sketchtool. - - - - - - - - - - - - - - - - - - - + + + + - \ No newline at end of file + diff --git a/app/images/enslogo.svg b/app/images/enslogo.svg index 20d94c0b11c3..92af701dabee 100644 --- a/app/images/enslogo.svg +++ b/app/images/enslogo.svg @@ -1 +1,19 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + diff --git a/app/images/eth.svg b/app/images/eth.svg index 6375b790f407..04e726b13793 100644 --- a/app/images/eth.svg +++ b/app/images/eth.svg @@ -1,14 +1,3 @@ - - - - -deposit-eth -Created with Sketch. - - - + + diff --git a/app/images/eth_logo.svg b/app/images/eth_logo.svg index 894bd70dda65..42be3a2e05fe 100644 --- a/app/images/eth_logo.svg +++ b/app/images/eth_logo.svg @@ -1,11 +1,18 @@ - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + diff --git a/app/images/ethereum-metamask-chrome.png b/app/images/ethereum-metamask-chrome.png deleted file mode 100644 index 0b886babb1d6..000000000000 Binary files a/app/images/ethereum-metamask-chrome.png and /dev/null differ diff --git a/app/images/expand.svg b/app/images/expand.svg deleted file mode 100644 index 65f6cbfd7aab..000000000000 --- a/app/images/expand.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - expand - Created with Sketch. - - - - - - - - \ No newline at end of file diff --git a/app/images/forward-carrat.svg b/app/images/forward-carrat.svg index bbcbf019fe3c..c64355c78058 100644 --- a/app/images/forward-carrat.svg +++ b/app/images/forward-carrat.svg @@ -1,74 +1,3 @@ - - - - - - - - - - - - image/svg+xml - - - - - - - - + + diff --git a/app/images/hardware-wallet-step-1.svg b/app/images/hardware-wallet-step-1.svg index 2b6596a43487..a6bd40f60916 100644 --- a/app/images/hardware-wallet-step-1.svg +++ b/app/images/hardware-wallet-step-1.svg @@ -1,44 +1,27 @@ - - - - 2981A924-C7CB-4957-87AD-8C680802DAD7 - Created with sketchtool. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file + diff --git a/app/images/hardware-wallet-step-2.svg b/app/images/hardware-wallet-step-2.svg index 9fff05b7e391..3862acb6dd5b 100644 --- a/app/images/hardware-wallet-step-2.svg +++ b/app/images/hardware-wallet-step-2.svg @@ -1,81 +1,67 @@ - - - - 27B850D0-B3BA-4F98-8BB4-B542D8BFDE3B - Created with sketchtool. + - - - - - - + + + + + + - - - - - - - - - 3 - - - OXz3…T3A4 - - - 0.020000 ETH - - - - - - - 1 - - - OXa4…s0a2 - - - 0.01500 ETH - - - - - - - 4 - - - OXd2…D0V4 - - - 0.030000 ETH - - - - - - - - - - - 2 - - - OXe7…B0a1 - - - 0.041000 ETH - - - - - - + + + + + 3 + + + OXz3…T3A4 + + + 0.020000 ETH + + + + + + + 1 + + + OXa4…s0a2 + + + 0.01500 ETH + + + + + + + 4 + + + OXd2…D0V4 + + + 0.030000 ETH + + + + + + + + 2 + + + OXe7…B0a1 + + + 0.041000 ETH + + + - \ No newline at end of file + diff --git a/app/images/hardware-wallet-step-3.svg b/app/images/hardware-wallet-step-3.svg index 4a7655b3b14e..33e45991eeca 100644 --- a/app/images/hardware-wallet-step-3.svg +++ b/app/images/hardware-wallet-step-3.svg @@ -1,42 +1,26 @@ - - - - CEB55C41-7BCE-405E-83CD-834B388B495F - Created with sketchtool. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LOGIN WITH - METAMASK - - + + + + + + + + + + + + + + + + + + + + + LOGIN WITH METAMASK + - \ No newline at end of file + diff --git a/app/images/help.svg b/app/images/help.svg index 1424ffee3b26..85266316143f 100644 --- a/app/images/help.svg +++ b/app/images/help.svg @@ -1,16 +1,3 @@ - - - - - - - + + diff --git a/app/images/hide.svg b/app/images/hide.svg deleted file mode 100644 index d7ba01572771..000000000000 --- a/app/images/hide.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - hide - Created with Sketch. - - - - - - - - - - - \ No newline at end of file diff --git a/app/images/icon-128.png b/app/images/icon-128.png index ae687147d1c5..8d593bc0c921 100644 Binary files a/app/images/icon-128.png and b/app/images/icon-128.png differ diff --git a/app/images/icon-16.png b/app/images/icon-16.png index ba752907396e..3343f97743f3 100644 Binary files a/app/images/icon-16.png and b/app/images/icon-16.png differ diff --git a/app/images/icon-19.png b/app/images/icon-19.png index 07ac2f33f5af..5257d444aa66 100644 Binary files a/app/images/icon-19.png and b/app/images/icon-19.png differ diff --git a/app/images/icon-32.png b/app/images/icon-32.png index f801ebb6b0d8..a7dfe7f6cd68 100644 Binary files a/app/images/icon-32.png and b/app/images/icon-32.png differ diff --git a/app/images/icon-38.png b/app/images/icon-38.png index 83c04800d85b..6654687143ca 100644 Binary files a/app/images/icon-38.png and b/app/images/icon-38.png differ diff --git a/app/images/icon-512.png b/app/images/icon-512.png index 9c0d1384d55a..a506fabe7bbc 100644 Binary files a/app/images/icon-512.png and b/app/images/icon-512.png differ diff --git a/app/images/icon-64.png b/app/images/icon-64.png index b3019ad65293..643c02b3108f 100644 Binary files a/app/images/icon-64.png and b/app/images/icon-64.png differ diff --git a/app/images/icons/3dots.svg b/app/images/icons/3dots.svg deleted file mode 100644 index 07bbad137a37..000000000000 --- a/app/images/icons/3dots.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/app/images/icons/blue-circle-info.svg b/app/images/icons/blue-circle-info.svg new file mode 100644 index 000000000000..ebed859d5e7f --- /dev/null +++ b/app/images/icons/blue-circle-info.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/images/icons/cancelled.svg b/app/images/icons/cancelled.svg index ae4846dde3b9..34a3e097b020 100755 --- a/app/images/icons/cancelled.svg +++ b/app/images/icons/cancelled.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/app/images/icons/caret-down.svg b/app/images/icons/caret-down.svg index 06790bf92226..8ab7b0319ce0 100644 --- a/app/images/icons/caret-down.svg +++ b/app/images/icons/caret-down.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/app/images/icons/confirm.svg b/app/images/icons/confirm.svg index 3263bf03eb5a..fd81b03b7903 100644 --- a/app/images/icons/confirm.svg +++ b/app/images/icons/confirm.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/app/images/icons/connect.svg b/app/images/icons/connect.svg new file mode 100644 index 000000000000..ac6577090789 --- /dev/null +++ b/app/images/icons/connect.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/images/icons/connected-sites.svg b/app/images/icons/connected-sites.svg new file mode 100644 index 000000000000..4d90e233f997 --- /dev/null +++ b/app/images/icons/connected-sites.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/images/icons/disconnect.svg b/app/images/icons/disconnect.svg new file mode 100644 index 000000000000..146d6c727271 --- /dev/null +++ b/app/images/icons/disconnect.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/images/icons/down-arrow.svg b/app/images/icons/down-arrow.svg index 6cfb4a38b40c..e55f29129bb7 100644 --- a/app/images/icons/down-arrow.svg +++ b/app/images/icons/down-arrow.svg @@ -1,4 +1 @@ - - - - + \ No newline at end of file diff --git a/app/images/icons/error.svg b/app/images/icons/error.svg index bf5abf946f8c..2fcbc612f26e 100644 --- a/app/images/icons/error.svg +++ b/app/images/icons/error.svg @@ -1,4 +1 @@ - - - - + \ No newline at end of file diff --git a/app/images/icons/green-circle-check.svg b/app/images/icons/green-circle-check.svg new file mode 100644 index 000000000000..305b326f763c --- /dev/null +++ b/app/images/icons/green-circle-check.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/images/icons/hamburger.svg b/app/images/icons/hamburger.svg index 7a6da3089331..64fc344abe28 100644 --- a/app/images/icons/hamburger.svg +++ b/app/images/icons/hamburger.svg @@ -1,7 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/app/images/icons/info.svg b/app/images/icons/info.svg new file mode 100644 index 000000000000..dfb4ee04951d --- /dev/null +++ b/app/images/icons/info.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/images/icons/new.svg b/app/images/icons/new.svg index f56c43e088a6..6ed612bd98d8 100755 --- a/app/images/icons/new.svg +++ b/app/images/icons/new.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/app/images/icons/red-triangle-exclaim.svg b/app/images/icons/red-triangle-exclaim.svg new file mode 100644 index 000000000000..064908c786e7 --- /dev/null +++ b/app/images/icons/red-triangle-exclaim.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/images/icons/retry.svg b/app/images/icons/retry.svg index ddaa198caf57..b394bfb86a86 100755 --- a/app/images/icons/retry.svg +++ b/app/images/icons/retry.svg @@ -1,7 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/app/images/icons/submitted.svg b/app/images/icons/submitted.svg index b5ced877759c..df2ce7044ca3 100755 --- a/app/images/icons/submitted.svg +++ b/app/images/icons/submitted.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/app/images/icons/yellow-bell.svg b/app/images/icons/yellow-bell.svg new file mode 100644 index 000000000000..f40e00194522 --- /dev/null +++ b/app/images/icons/yellow-bell.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/images/import-account.svg b/app/images/import-account.svg index d6a81b70c290..bbcec8e2974d 100644 --- a/app/images/import-account.svg +++ b/app/images/import-account.svg @@ -1,18 +1,6 @@ - - - - import-account - Created with Sketch. - - - - - - - - - - - + + + + - \ No newline at end of file + diff --git a/app/images/info-logo.png b/app/images/info-logo.png index f654ed5b11ed..ab777d44e40e 100644 Binary files a/app/images/info-logo.png and b/app/images/info-logo.png differ diff --git a/app/images/info.svg b/app/images/info.svg deleted file mode 100644 index 1ebae8ee41a0..000000000000 --- a/app/images/info.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - info - Created with Sketch. - - - - - - - - - - - - \ No newline at end of file diff --git a/app/images/key-32.png b/app/images/key-32.png deleted file mode 100644 index ca11cacd9c4f..000000000000 Binary files a/app/images/key-32.png and /dev/null differ diff --git a/app/images/ledger-logo.svg b/app/images/ledger-logo.svg index 5ca90e16efb0..aa411823083f 100644 --- a/app/images/ledger-logo.svg +++ b/app/images/ledger-logo.svg @@ -1,33 +1,5 @@ - - -Fichier 8 - - - - - - - - - - - - - - - - + + + + diff --git a/app/images/loading.svg b/app/images/loading.svg index 854da88ddffc..26eb55fa115e 100644 --- a/app/images/loading.svg +++ b/app/images/loading.svg @@ -1 +1,30 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/images/lock.svg b/app/images/lock.svg index 2172d5bad05d..8ecb366eaa63 100644 --- a/app/images/lock.svg +++ b/app/images/lock.svg @@ -1,9 +1,3 @@ - - - - - + + diff --git a/app/images/loginglogo.svg b/app/images/loginglogo.svg index ca8b0a2eee5e..e39001e1004a 100644 --- a/app/images/loginglogo.svg +++ b/app/images/loginglogo.svg @@ -1,53 +1,11 @@ - - - - logo2 - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - \ No newline at end of file + diff --git a/app/images/logo.png b/app/images/logo.png deleted file mode 100644 index db6ba7d6cf71..000000000000 Binary files a/app/images/logo.png and /dev/null differ diff --git a/app/images/logo/metamask-fox.svg b/app/images/logo/metamask-fox.svg index 60a827b022a3..a6cffef03d8e 100644 --- a/app/images/logo/metamask-fox.svg +++ b/app/images/logo/metamask-fox.svg @@ -1,31 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/app/images/logo/metamask-logo-horizontal.svg b/app/images/logo/metamask-logo-horizontal.svg index 8e0bdb938064..bc60a078286d 100644 --- a/app/images/logo/metamask-logo-horizontal.svg +++ b/app/images/logo/metamask-logo-horizontal.svg @@ -1,62 +1 @@ - - - - metamask-logo-horizontal-beta - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/images/meta-shield.svg b/app/images/meta-shield.svg new file mode 100644 index 000000000000..f8eee0db1fe2 --- /dev/null +++ b/app/images/meta-shield.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/images/metrics-chart.svg b/app/images/metrics-chart.svg index e1893424467b..4bd330d4051e 100644 --- a/app/images/metrics-chart.svg +++ b/app/images/metrics-chart.svg @@ -1,8 +1,10 @@ - - - - - - - + + + + + + + + + diff --git a/app/images/mm-bolt.svg b/app/images/mm-bolt.svg index bbf0abcc7d35..8f2e3a7e52e3 100644 --- a/app/images/mm-bolt.svg +++ b/app/images/mm-bolt.svg @@ -1,11 +1,3 @@ - - - - - - + + diff --git a/app/images/mm-info-icon.svg b/app/images/mm-info-icon.svg index 825f0f20040a..c6d4a4ad4aa0 100644 --- a/app/images/mm-info-icon.svg +++ b/app/images/mm-info-icon.svg @@ -1,11 +1,3 @@ - - - - - - + + diff --git a/app/images/mm-secure.svg b/app/images/mm-secure.svg index 1345b75b2698..a85800751426 100644 --- a/app/images/mm-secure.svg +++ b/app/images/mm-secure.svg @@ -1,7 +1,7 @@ - - - - - - + + + + + + diff --git a/app/images/open-etherscan.svg b/app/images/open-etherscan.svg deleted file mode 100644 index 84c5687ce536..000000000000 --- a/app/images/open-etherscan.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - open-etherscan - Created with Sketch. - - - - - - - \ No newline at end of file diff --git a/app/images/open.svg b/app/images/open.svg index 2957ce43de6a..07feb87b988a 100644 --- a/app/images/open.svg +++ b/app/images/open.svg @@ -1,15 +1,6 @@ - - - - open - Created with Sketch. - - - - - - - - + + + + - \ No newline at end of file + diff --git a/app/images/permissions-check.svg b/app/images/permissions-check.svg new file mode 100644 index 000000000000..a45c5346b680 --- /dev/null +++ b/app/images/permissions-check.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/app/images/plus-btn-white.svg b/app/images/plus-btn-white.svg index 2672d39dd2fb..13ce2e74b19d 100644 --- a/app/images/plus-btn-white.svg +++ b/app/images/plus-btn-white.svg @@ -1,17 +1,6 @@ - - - - plus-btn-white - Created with Sketch. - - - - - - - - - - + + + + - \ No newline at end of file + diff --git a/app/images/popout.svg b/app/images/popout.svg index 760fe4379f66..d4256391b226 100644 --- a/app/images/popout.svg +++ b/app/images/popout.svg @@ -1,21 +1,9 @@ - - - - popout - Created with Sketch. - - - - - - - - - - - - - - + + + + + + + - \ No newline at end of file + diff --git a/app/images/provider-approval-check.svg b/app/images/provider-approval-check.svg deleted file mode 100644 index c3df71f59cd1..000000000000 --- a/app/images/provider-approval-check.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/app/images/pw-128x128.png b/app/images/pw-128x128.png deleted file mode 100644 index a0eb1b730013..000000000000 Binary files a/app/images/pw-128x128.png and /dev/null differ diff --git a/app/images/pw-48x48.png b/app/images/pw-48x48.png deleted file mode 100644 index a96c59e15c30..000000000000 Binary files a/app/images/pw-48x48.png and /dev/null differ diff --git a/app/images/pw128x128.png b/app/images/pw128x128.png deleted file mode 100644 index a0eb1b730013..000000000000 Binary files a/app/images/pw128x128.png and /dev/null differ diff --git a/app/images/qr-blue.svg b/app/images/qr-blue.svg new file mode 100644 index 000000000000..7310e3e85da2 --- /dev/null +++ b/app/images/qr-blue.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/app/images/qr.svg b/app/images/qr.svg index b52682bfab38..320e689195c6 100644 --- a/app/images/qr.svg +++ b/app/images/qr.svg @@ -1,29 +1,10 @@ - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + diff --git a/app/images/search-black.svg b/app/images/search-black.svg new file mode 100644 index 000000000000..a6d230f4adfb --- /dev/null +++ b/app/images/search-black.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/images/search.svg b/app/images/search.svg index 44fea12aa764..de1f38e0cacb 100644 --- a/app/images/search.svg +++ b/app/images/search.svg @@ -1,14 +1,3 @@ - - - - search - Created with Sketch. - - - - - - - - - \ No newline at end of file + + + diff --git a/app/images/settings.svg b/app/images/settings.svg index cf9b298dd0b4..5424d5f0924c 100644 --- a/app/images/settings.svg +++ b/app/images/settings.svg @@ -1,22 +1,6 @@ - - - - settings - Created with Sketch. - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + diff --git a/app/images/shapeshift logo.png b/app/images/shapeshift logo.png deleted file mode 100644 index ac8faba5b1a1..000000000000 Binary files a/app/images/shapeshift logo.png and /dev/null differ diff --git a/app/images/single-arrow.svg b/app/images/single-arrow.svg index 399da72d6364..2939fb606eb3 100644 --- a/app/images/single-arrow.svg +++ b/app/images/single-arrow.svg @@ -1,10 +1,3 @@ - - - - previous/next - Created with Sketch. - - - - - \ No newline at end of file + + + diff --git a/app/images/sleuth.svg b/app/images/sleuth.svg index f4ac8c787c51..2ca1846d5fdd 100644 --- a/app/images/sleuth.svg +++ b/app/images/sleuth.svg @@ -1 +1,18 @@ - + + + + + + + + + + + + + + + + + + diff --git a/app/images/spinner.gif b/app/images/spinner.gif index 8891f95967ab..64d29f9d43dc 100644 Binary files a/app/images/spinner.gif and b/app/images/spinner.gif differ diff --git a/app/images/switch_acc.svg b/app/images/switch_acc.svg index 67c76e7f184d..436e2e28afe9 100644 --- a/app/images/switch_acc.svg +++ b/app/images/switch_acc.svg @@ -1,29 +1,5 @@ - - - - - - - - - - + + + + diff --git a/app/images/thin-plus.svg b/app/images/thin-plus.svg index f46c72a4a3f6..3a1773102c28 100644 --- a/app/images/thin-plus.svg +++ b/app/images/thin-plus.svg @@ -1,4 +1,6 @@ - - - + + + + + diff --git a/app/images/tokensearch.svg b/app/images/tokensearch.svg index cd0b03bf2c9b..89a83960225b 100644 --- a/app/images/tokensearch.svg +++ b/app/images/tokensearch.svg @@ -1,15 +1,6 @@ - - - - 7FDB75AD-BD4D-497C-B391-69EEB31A0561 - Created with sketchtool. - - - - - - - - + + + + - \ No newline at end of file + diff --git a/app/images/trezor-logo.svg b/app/images/trezor-logo.svg index b8d85e3afe75..139ea781078a 100644 --- a/app/images/trezor-logo.svg +++ b/app/images/trezor-logo.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/app/images/user-check.svg b/app/images/user-check.svg new file mode 100644 index 000000000000..8ba739338e3d --- /dev/null +++ b/app/images/user-check.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/images/warning.svg b/app/images/warning.svg index 9c8d697d77dd..bcccab618729 100644 --- a/app/images/warning.svg +++ b/app/images/warning.svg @@ -1,22 +1,8 @@ - - - - Group 7 - Created with Sketch. - - - - - - - - - - - - - - + + + + + - \ No newline at end of file + diff --git a/app/images/webcam.svg b/app/images/webcam.svg index 4b9b58148c6e..2809226d43cf 100644 --- a/app/images/webcam.svg +++ b/app/images/webcam.svg @@ -1,18 +1,8 @@ - - - - webcam - Created with Sketch. - - - - - - - - - - + + + + + - \ No newline at end of file + diff --git a/app/images/wyre.svg b/app/images/wyre.svg index a5209329d552..ef524cb4c98b 100644 --- a/app/images/wyre.svg +++ b/app/images/wyre.svg @@ -1,9 +1,7 @@ - - - - - - - - + + + + + + diff --git a/app/manifest.json b/app/manifest.json deleted file mode 100644 index 8639577bb951..000000000000 --- a/app/manifest.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "name": "__MSG_appName__", - "short_name": "__MSG_appName__", - "version": "6.7.2", - "manifest_version": 2, - "author": "https://metamask.io", - "description": "__MSG_appDescription__", - "commands": { - "_execute_browser_action": { - "suggested_key": { - "windows": "Alt+Shift+M", - "mac": "Alt+Shift+M", - "chromeos": "Alt+Shift+M", - "linux": "Alt+Shift+M" - } - } - }, - "icons": { - "16": "images/icon-16.png", - "128": "images/icon-128.png" - }, - "applications": { - "gecko": { - "id": "webextension@metamask.io" - } - }, - "default_locale": "en", - "background": { - "scripts": [ - "chromereload.js", - "background.js" - ], - "persistent": true - }, - "browser_action": { - "default_icon": { - "19": "images/icon-19.png", - "38": "images/icon-38.png" - }, - "default_title": "MetaMask", - "default_popup": "popup.html" - }, - "content_scripts": [ - { - "matches": [ - "file://*/*", - "http://*/*", - "https://*/*" - ], - "js": [ - "contentscript.js" - ], - "run_at": "document_start", - "all_frames": true - }, - { - "matches": [ - "*://connect.trezor.io/*/popup.html" - ], - "js": [ - "vendor/trezor/content-script.js" - ] - } - ], - "permissions": [ - "storage", - "unlimitedStorage", - "clipboardWrite", - "http://localhost:8545/", - "https://*.infura.io/", - "activeTab", - "webRequest", - "*://*.eth/", - "notifications" - ], - "web_accessible_resources": [ - "inpage.js", - "phishing.html" - ], - "externally_connectable": { - "matches": [ - "https://metamask.io/*" - ], - "ids": [ - "*" - ] - } -} \ No newline at end of file diff --git a/app/manifest/_base.json b/app/manifest/_base.json new file mode 100644 index 000000000000..8c22e0e199bd --- /dev/null +++ b/app/manifest/_base.json @@ -0,0 +1,93 @@ +{ + "name": "__MSG_appName__", + "short_name": "__MSG_appName__", + "version": "8.0.9", + "manifest_version": 2, + "author": "https://metamask.io", + "description": "__MSG_appDescription__", + "commands": { + "_execute_browser_action": { + "suggested_key": { + "windows": "Alt+Shift+M", + "mac": "Alt+Shift+M", + "chromeos": "Alt+Shift+M", + "linux": "Alt+Shift+M" + } + } + }, + "icons": { + "16": "images/icon-16.png", + "19": "images/icon-19.png", + "32": "images/icon-32.png", + "38": "images/icon-38.png", + "64": "images/icon-64.png", + "128": "images/icon-128.png", + "512": "images/icon-512.png" + }, + "default_locale": "en", + "background": { + "scripts": [ + "bg-libs.js", + "background.js" + ], + "persistent": true + }, + "browser_action": { + "default_icon": { + "16": "images/icon-16.png", + "19": "images/icon-19.png", + "32": "images/icon-32.png", + "38": "images/icon-38.png", + "64": "images/icon-64.png", + "128": "images/icon-128.png", + "512": "images/icon-512.png" + }, + "default_title": "MetaMask", + "default_popup": "popup.html" + }, + "content_scripts": [ + { + "matches": [ + "file://*/*", + "http://*/*", + "https://*/*" + ], + "js": [ + "contentscript.js" + ], + "run_at": "document_start", + "all_frames": true + }, + { + "matches": [ + "*://connect.trezor.io/*/popup.html" + ], + "js": [ + "vendor/trezor/content-script.js" + ] + } + ], + "permissions": [ + "storage", + "unlimitedStorage", + "clipboardWrite", + "http://localhost:8545/", + "https://*.infura.io/", + "activeTab", + "webRequest", + "*://*.eth/", + "notifications" + ], + "web_accessible_resources": [ + "inpage.js", + "phishing.html" + ], + "externally_connectable": { + "matches": [ + "https://metamask.io/*" + ], + "ids": [ + "*" + ] + } +} diff --git a/app/manifest/brave.json b/app/manifest/brave.json new file mode 100644 index 000000000000..9e26dfeeb6e6 --- /dev/null +++ b/app/manifest/brave.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/app/manifest/chrome.json b/app/manifest/chrome.json new file mode 100644 index 000000000000..ba81cab75341 --- /dev/null +++ b/app/manifest/chrome.json @@ -0,0 +1,3 @@ +{ + "minimum_chrome_version": "58" +} \ No newline at end of file diff --git a/app/manifest/firefox.json b/app/manifest/firefox.json new file mode 100644 index 000000000000..bee5f4e6c8ac --- /dev/null +++ b/app/manifest/firefox.json @@ -0,0 +1,8 @@ +{ + "applications": { + "gecko": { + "id": "webextension@metamask.io", + "strict_min_version": "56.0" + } + } +} \ No newline at end of file diff --git a/app/manifest/opera.json b/app/manifest/opera.json new file mode 100644 index 000000000000..37beda645e77 --- /dev/null +++ b/app/manifest/opera.json @@ -0,0 +1,9 @@ +{ + "permissions": [ + "storage", + "tabs", + "clipboardWrite", + "clipboardRead", + "http://localhost:8545/" + ] +} \ No newline at end of file diff --git a/app/notification.html b/app/notification.html index 82bf95ada27e..cb8448a37a75 100644 --- a/app/notification.html +++ b/app/notification.html @@ -1,14 +1,10 @@ - + MetaMask Notification + + - +
- +
+ diff --git a/app/phishing.html b/app/phishing.html index 1e1c4d11cefb..583a50140c93 100644 --- a/app/phishing.html +++ b/app/phishing.html @@ -3,7 +3,8 @@ Ethereum Phishing Detection - MetaMask - + + - -
- -

ENS resolver only support on Ethereum mainnet

-
- - \ No newline at end of file diff --git a/app/vendor/trezor/usb-permissions.js b/app/vendor/trezor/usb-permissions.js index 9de47e0a1050..18f70f94faea 100644 --- a/app/vendor/trezor/usb-permissions.js +++ b/app/vendor/trezor/usb-permissions.js @@ -25,6 +25,7 @@ const switchToPopupTab = (event) => { return; } + // TODO: remove this query, or add `tabs` permission. This does not work. // triggered from 'beforeunload' event // find tab by popup pattern and switch to it chrome.tabs.query({ @@ -47,4 +48,4 @@ window.addEventListener('message', event => { } }); -window.addEventListener('beforeunload', switchToPopupTab); \ No newline at end of file +window.addEventListener('beforeunload', switchToPopupTab); diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 000000000000..26b47fdb9d0e --- /dev/null +++ b/babel.config.js @@ -0,0 +1,26 @@ +module.exports = function (api) { + api.cache(false) + return { + presets: [ + [ + '@babel/preset-env', + { + targets: { + browsers: [ + 'chrome >= 58', + 'firefox >= 56.2', + ], + }, + }, + ], + '@babel/preset-react', + ], + plugins: [ + '@babel/plugin-transform-runtime', + '@babel/plugin-proposal-class-properties', + '@babel/plugin-proposal-object-rest-spread', + '@babel/plugin-proposal-optional-chaining', + '@babel/plugin-proposal-nullish-coalescing-operator', + ], + } +} diff --git a/development/announcer.js b/development/announcer.js index ea1bfdd3663e..798e7da0742b 100644 --- a/development/announcer.js +++ b/development/announcer.js @@ -1,12 +1,10 @@ -var manifest = require('../app/manifest.json') -var version = manifest.version +const fs = require('fs') +const path = require('path') +const { version } = require('../app/manifest/_base.json') -var fs = require('fs') -var path = require('path') -var changelog = fs.readFileSync(path.join(__dirname, '..', 'CHANGELOG.md')).toString() - -var log = changelog.split(version)[1].split('##')[0].trim() +const changelog = fs.readFileSync(path.join(__dirname, '..', 'CHANGELOG.md'), 'utf8') +const log = changelog.split(version)[1].split('##')[0].trim() const msg = `*MetaMask ${version}* now published! It should auto-update soon!\n${log}` console.log(msg) diff --git a/development/auto-changelog.sh b/development/auto-changelog.sh index f9f577ade56c..26ab8e93f72a 100755 --- a/development/auto-changelog.sh +++ b/development/auto-changelog.sh @@ -1,26 +1,60 @@ -#! /bin/bash -# update tags +#!/usr/bin/env bash + +set -e +set -u +set -o pipefail + +readonly URL='https://github.com/MetaMask/metamask-extension' + git fetch --tags -# get origin -URL='https://github.com/MetaMask/metamask-extension' -# get git logs from last tag until HEAD, pretty by 'subject::body' filtered by grep for PRs made with Github squash merge or Github regular merge -LOG=$(git log $(git describe --tags $(git rev-list --tags --max-count=1))..HEAD --pretty="%s::%b" --reverse --grep="Merge pull request #" --grep="(#"); -while read -r line; do - # get git log subject - SUBJECT=$(echo $line | sed -E 's/(.*):{2}(.*)/\1/') - # get git log PR id, PR made with Github squash merge or Github regular merge - PR=$(echo $SUBJECT | sed 's/^.*(#\([^&]*\)).*/\1/' | sed 's/^.*#\([^&]*\) from.*/\1/') - # if PR made with Github squash merge, subject is the body - if [ -z "$(echo $line | sed -E 's/(.*):{2}(.*)/\2/')" ]; then - BODY=$(echo $SUBJECT | sed "s/(#$PR)//g"); else - BODY=$(echo $line | sed -E 's/(.*):{2}(.*)/\2/') + +most_recent_tag="$(git describe --tags "$(git rev-list --tags --max-count=1)")" + +git rev-list "${most_recent_tag}"..HEAD | while read -r commit +do + subject="$(git show -s --format="%s" "$commit")" + + # Squash & Merge: the commit subject is parsed as ` (#)` + if grep -E -q '\(#[[:digit:]]+\)' <<< "$subject" + then + pr="$(awk '{print $NF}' <<< "$subject" | tr -d '()')" + prefix="[$pr]($URL/pull/${pr###}): " + description="$(awk '{NF--; print $0}' <<< "$subject")" + + # Merge: the PR ID is parsed from the git subject (which is of the form `Merge pull request + # # from `, and the description is assumed to be the first line of the body. + # If no body is found, the description is set to the commit subject + elif grep -E -q '#[[:digit:]]+\sfrom' <<< "$subject" + then + pr="$(awk '{print $4}' <<< "$subject")" + prefix="[$pr]($URL/pull/${pr###}): " + + first_line_of_body="$(git show -s --format="%b" "$commit" | head -n 1 | tr -d '\r')" + if [[ -z "$first_line_of_body" ]] + then + description="$subject" + else + description="$first_line_of_body" + fi + + # Normal commits: The commit subject is the description, and the PR ID is omitted. + else + pr='' + prefix='' + description="$subject" fi + # add entry to CHANGELOG - if [[ "$OSTYPE" == "linux-gnu" ]]; then + if [[ "$OSTYPE" == "linux-gnu" ]] + then + # shellcheck disable=SC1004 sed -i'' '/## Current Develop Branch/a\ -- [#'"$PR"']('"$URL"'/pull/'"$PR"'): '"$BODY"''$'\n' CHANGELOG.md; else +- '"$prefix$description"''$'\n' CHANGELOG.md + else + # shellcheck disable=SC1004 sed -i '' '/## Current Develop Branch/a\ -- [#'"$PR"']('"$URL"'/pull/'"$PR"'): '"$BODY"''$'\n' CHANGELOG.md; +- '"$prefix$description"''$'\n' CHANGELOG.md fi -done <<< "$LOG" +done + echo 'CHANGELOG updated' diff --git a/development/backGroundConnectionModifiers.js b/development/backGroundConnectionModifiers.js deleted file mode 100644 index cf1a723d0b3d..000000000000 --- a/development/backGroundConnectionModifiers.js +++ /dev/null @@ -1,26 +0,0 @@ -module.exports = { - 'confirm sig requests': { - signMessage: (_, cb) => { - const stateUpdate = { - unapprovedMsgs: {}, - unapprovedMsgCount: 0, - } - return cb(null, stateUpdate) - }, - signPersonalMessage: (_, cb) => { - const stateUpdate = { - unapprovedPersonalMsgs: {}, - unapprovedPersonalMsgCount: 0, - } - return cb(null, stateUpdate) - }, - signTypedMessage: (_, cb) => { - const stateUpdate = { - unapprovedTypedMessages: {}, - unapprovedTypedMessagesCount: 0, - } - return cb(null, stateUpdate) - }, - }, -} - diff --git a/development/build/display.js b/development/build/display.js new file mode 100644 index 000000000000..e5556dd091dc --- /dev/null +++ b/development/build/display.js @@ -0,0 +1,148 @@ +const randomColor = require('randomcolor') +const chalk = require('chalk') + +module.exports = { setupTaskDisplay, displayChart } + +const SYMBOLS = { + Empty: '', + Space: ' ', + Full: 'â–ˆ', + SevenEighths: 'â–‰', + ThreeQuarters: 'â–Š', + FiveEighths: 'â–‹', + Half: 'â–Œ', + ThreeEighths: 'â–', + Quarter: 'â–Ž', + Eighth: 'â–', + RightHalf: 'â–', + RightEighth: 'â–•', +} + +function setupTaskDisplay (taskEvents) { + const taskData = [] + taskEvents.on('start', ([name]) => { + console.log(`Starting '${name}'...`) + }) + taskEvents.on('end', ([name, start, end]) => { + taskData.push([name, start, end]) + console.log(`Finished '${name}'`) + }) + taskEvents.on('complete', () => { + displayChart(taskData) + }) +} + +function displayChart (data) { + // sort tasks by start time + data.sort((a, b) => a[1] - b[1]) + + // get bounds + const first = Math.min(...data.map((entry) => entry[1])) + const last = Math.max(...data.map((entry) => entry[2])) + + // get colors + const colors = randomColor({ count: data.length }) + + // some heading before the bars + console.log(`\nbuild completed. task timeline:`) + + // build bars for bounds + data.forEach((entry, index) => { + const [label, start, end] = entry + const [start2, end2] = [start, end].map((value) => adjust(value, first, last, 40)) + const barString = barBuilder(start2, end2) + const color = colors[index] + const coloredBarString = colorize(color, barString) + const duration = ((end - start) / 1e3).toFixed(1) + console.log(coloredBarString, `${label} ${duration}s`) + }) + +} + +function colorize (color, string) { + const colorizer = (typeof chalk[color] === 'function') ? chalk[color] : chalk.hex(color) + return colorizer(string) +} + +// scale number within bounds +function adjust (value, first, last, size) { + const length = last - first + const result = (value - first) / length * size + return result +} + +// draw bars +function barBuilder (start, end) { + const [spaceInt, spaceRest] = splitNumber(start) + const barBodyLength = end - spaceInt + let [barInt, barRest] = splitNumber(barBodyLength) + // We are handling zero value as a special case + // to print at least something on the screen + if (barInt === 0 && barRest === 0) { + barInt = 0 + barRest = 0.001 + } + + const spaceFull = SYMBOLS.Space.repeat(spaceInt) + const spacePartial = getSymbolNormalRight(spaceRest) + const barFull = SYMBOLS.Full.repeat(barInt) + const barPartial = getSymbolNormal(barRest) + + return `${spaceFull}${spacePartial}${barFull}${barPartial}` +} + +// get integer and remainder +function splitNumber (value = 0) { + const [int, rest = '0'] = value.toString().split('.') + const int2 = parseInt(int, 10) + const rest2 = parseInt(rest, 10) / Math.pow(10, rest.length) + return [int2, rest2] +} + +// get partial block char for value (left-adjusted) +function getSymbolNormal (value) { + // round to closest supported value + const possibleValues = [0, 1 / 8, 1 / 4, 3 / 8, 1 / 2, 5 / 8, 3 / 4, 7 / 8, 1] + const rounded = possibleValues.reduce((prev, curr) => { + return (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev) + }) + + if (rounded === 0) { + return SYMBOLS.Empty + } else if (rounded === 1 / 8) { + return SYMBOLS.Eighth + } else if (rounded === 1 / 4) { + return SYMBOLS.Quarter + } else if (rounded === 3 / 8) { + return SYMBOLS.ThreeEighths + } else if (rounded === 1 / 2) { + return SYMBOLS.Half + } else if (rounded === 5 / 8) { + return SYMBOLS.FiveEighths + } else if (rounded === 3 / 4) { + return SYMBOLS.ThreeQuarters + } else if (rounded === 7 / 8) { + return SYMBOLS.SevenEighths + } + return SYMBOLS.Full +} + +// get partial block char for value (right-adjusted) +function getSymbolNormalRight (value) { + // round to closest supported value (not much :/) + const possibleValues = [0, 1 / 2, 7 / 8, 1] + const rounded = possibleValues.reduce((prev, curr) => { + return (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev) + }) + + if (rounded === 0) { + return SYMBOLS.Full + } else if (rounded === 1 / 2) { + return SYMBOLS.RightHalf + } else if (rounded === 7 / 8) { + return SYMBOLS.RightEighth + } else if (rounded === 1) { + return SYMBOLS.Space + } + throw new Error('getSymbolNormalRight got unexpected result') +} diff --git a/development/build/etc.js b/development/build/etc.js new file mode 100644 index 000000000000..92af2e338ac7 --- /dev/null +++ b/development/build/etc.js @@ -0,0 +1,41 @@ +const { promises: fs } = require('fs') +const gulp = require('gulp') +const gulpZip = require('gulp-zip') +const del = require('del') +const pify = require('pify') +const pump = pify(require('pump')) +const baseManifest = require('../../app/manifest/_base.json') +const { createTask, composeParallel } = require('./task') + +module.exports = createEtcTasks + +function createEtcTasks ({ browserPlatforms, livereload }) { + + const clean = createTask('clean', async function clean () { + await del(['./dist/*']) + await Promise.all(browserPlatforms.map(async (platform) => { + await fs.mkdir(`./dist/${platform}`, { recursive: true }) + })) + }) + + const reload = createTask('reload', function devReload () { + livereload.listen({ port: 35729 }) + }) + + // zip tasks for distribution + const zip = createTask('zip', composeParallel( + ...browserPlatforms.map((platform) => createZipTask(platform)), + )) + + return { clean, reload, zip } +} + +function createZipTask (target) { + return async () => { + await pump( + gulp.src(`dist/${target}/**`), + gulpZip(`metamask-${target}-${baseManifest.version}.zip`), + gulp.dest('builds'), + ) + } +} diff --git a/development/build/index.js b/development/build/index.js new file mode 100755 index 000000000000..0a9f519f8328 --- /dev/null +++ b/development/build/index.js @@ -0,0 +1,95 @@ +// +// build task definitions +// +// run any task with "yarn build ${taskName}" +// + +const livereload = require('gulp-livereload') +const { createTask, composeSeries, composeParallel, detectAndRunEntryTask } = require('./task') +const createManifestTasks = require('./manifest') +const createScriptTasks = require('./scripts') +const createStyleTasks = require('./styles') +const createStaticAssetTasks = require('./static') +const createEtcTasks = require('./etc') + +const browserPlatforms = [ + 'firefox', + 'chrome', + 'brave', + 'opera', +] + +defineAllTasks() +detectAndRunEntryTask() + +function defineAllTasks () { + + const staticTasks = createStaticAssetTasks({ livereload, browserPlatforms }) + const manifestTasks = createManifestTasks({ browserPlatforms }) + const styleTasks = createStyleTasks({ livereload }) + const scriptTasks = createScriptTasks({ livereload, browserPlatforms }) + const { clean, reload, zip } = createEtcTasks({ livereload, browserPlatforms }) + + // build for development (livereload) + createTask( + 'dev', + composeSeries( + clean, + styleTasks.dev, + composeParallel( + scriptTasks.dev, + staticTasks.dev, + manifestTasks.dev, + reload, + ), + ), + ) + + // build for test development (livereload) + createTask( + 'testDev', + composeSeries( + clean, + styleTasks.dev, + composeParallel( + scriptTasks.testDev, + staticTasks.dev, + manifestTasks.testDev, + reload, + ), + ), + ) + + // build for prod release + createTask( + 'prod', + composeSeries( + clean, + styleTasks.prod, + composeParallel( + scriptTasks.prod, + staticTasks.prod, + manifestTasks.prod, + ), + zip, + ), + ) + + // build for CI testing + createTask( + 'test', + composeSeries( + clean, + styleTasks.prod, + composeParallel( + scriptTasks.test, + staticTasks.prod, + manifestTasks.test, + ), + ), + ) + + // special build for minimal CI testing + createTask('styles', styleTasks.prod) + +} diff --git a/development/build/manifest.js b/development/build/manifest.js new file mode 100644 index 000000000000..1ea9e5ad5a64 --- /dev/null +++ b/development/build/manifest.js @@ -0,0 +1,96 @@ +const { promises: fs } = require('fs') +const { merge, cloneDeep } = require('lodash') + +const baseManifest = require('../../app/manifest/_base.json') + +const { createTask, composeSeries } = require('./task') + +module.exports = createManifestTasks + +const scriptsToExcludeFromBackgroundDevBuild = { + 'bg-libs.js': true, +} + +function createManifestTasks ({ browserPlatforms }) { + + // merge base manifest with per-platform manifests + const prepPlatforms = async () => { + return Promise.all(browserPlatforms.map(async (platform) => { + const platformModifications = await readJson(`${__dirname}/../../app/manifest/${platform}.json`) + const result = merge(cloneDeep(baseManifest), platformModifications) + const dir = `./dist/${platform}` + await fs.mkdir(dir, { recursive: true }) + await writeJson(result, `${dir}/manifest.json`) + })) + } + + // dev: remove bg-libs, add chromereload, add perms + const envDev = createTaskForModifyManifestForEnvironment((manifest) => { + const scripts = manifest.background.scripts.filter((scriptName) => !scriptsToExcludeFromBackgroundDevBuild[scriptName]) + scripts.push('chromereload.js') + manifest.background = { + ...manifest.background, + scripts, + } + manifest.permissions = [...manifest.permissions, 'webRequestBlocking'] + }) + + // testDev: remove bg-libs, add perms + const envTestDev = createTaskForModifyManifestForEnvironment((manifest) => { + const scripts = manifest.background.scripts.filter((scriptName) => !scriptsToExcludeFromBackgroundDevBuild[scriptName]) + scripts.push('chromereload.js') + manifest.background = { + ...manifest.background, + scripts, + } + manifest.permissions = [...manifest.permissions, 'webRequestBlocking', 'http://localhost/*'] + }) + + // test: add permissions + const envTest = createTaskForModifyManifestForEnvironment((manifest) => { + manifest.permissions = [...manifest.permissions, 'webRequestBlocking', 'http://localhost/*'] + }) + + // high level manifest tasks + const dev = createTask('manifest:dev', composeSeries( + prepPlatforms, + envDev, + )) + + const testDev = createTask('manifest:testDev', composeSeries( + prepPlatforms, + envTestDev, + )) + + const test = createTask('manifest:test', composeSeries( + prepPlatforms, + envTest, + )) + + const prod = createTask('manifest:prod', prepPlatforms) + + return { prod, dev, testDev, test } + + // helper for modifying each platform's manifest.json in place + function createTaskForModifyManifestForEnvironment (transformFn) { + return () => { + return Promise.all(browserPlatforms.map(async (platform) => { + const path = `./dist/${platform}/manifest.json` + const manifest = await readJson(path) + transformFn(manifest) + await writeJson(manifest, path) + })) + } + } + +} + +// helper for reading and deserializing json from fs +async function readJson (path) { + return JSON.parse(await fs.readFile(path, 'utf8')) +} + +// helper for serializing and writing json to fs +async function writeJson (obj, path) { + return fs.writeFile(path, JSON.stringify(obj, null, 2)) +} diff --git a/development/build/scripts.js b/development/build/scripts.js new file mode 100644 index 000000000000..c6e3e417355d --- /dev/null +++ b/development/build/scripts.js @@ -0,0 +1,367 @@ +const fs = require('fs') +const gulp = require('gulp') +const watch = require('gulp-watch') +const source = require('vinyl-source-stream') +const buffer = require('vinyl-buffer') +const log = require('fancy-log') +const { assign } = require('lodash') +const watchify = require('watchify') +const browserify = require('browserify') +const envify = require('envify/custom') +const sourcemaps = require('gulp-sourcemaps') +const sesify = require('sesify') +const terser = require('gulp-terser-js') +const pify = require('pify') +const endOfStream = pify(require('end-of-stream')) +const { makeStringTransform } = require('browserify-transform-tools') + +const conf = require('rc')('metamask', {}) + +const packageJSON = require('../../package.json') +const { createTask, composeParallel, composeSeries, runInChildProcess } = require('./task') + +module.exports = createScriptTasks + +const dependencies = Object.keys((packageJSON && packageJSON.dependencies) || {}) +const materialUIDependencies = ['@material-ui/core'] +const reactDepenendencies = dependencies.filter((dep) => dep.match(/react/u)) +const d3Dependencies = ['c3', 'd3'] + +const externalDependenciesMap = { + background: [ + '3box', + ], + ui: [ + ...materialUIDependencies, ...reactDepenendencies, ...d3Dependencies, + ], +} + +function createScriptTasks ({ browserPlatforms, livereload }) { + + // internal tasks + const core = { + // dev tasks (live reload) + dev: createTasksForBuildJsExtension({ taskPrefix: 'scripts:core:dev', devMode: true }), + testDev: createTasksForBuildJsExtension({ taskPrefix: 'scripts:core:test-live', devMode: true, testing: true }), + // built for CI tests + test: createTasksForBuildJsExtension({ taskPrefix: 'scripts:core:test', testing: true }), + // production + prod: createTasksForBuildJsExtension({ taskPrefix: 'scripts:core:prod' }), + } + const deps = { + background: createTasksForBuildJsDeps({ filename: 'bg-libs', key: 'background' }), + ui: createTasksForBuildJsDeps({ filename: 'ui-libs', key: 'ui' }), + } + + // high level tasks + + const prod = composeParallel( + deps.background, + deps.ui, + core.prod, + ) + + const { dev, testDev } = core + + const test = composeParallel( + deps.background, + deps.ui, + core.test, + ) + + return { prod, dev, testDev, test } + + function createTasksForBuildJsDeps ({ key, filename }) { + return createTask(`scripts:deps:${key}`, bundleTask({ + label: filename, + filename: `${filename}.js`, + buildLib: true, + dependenciesToBundle: externalDependenciesMap[key], + devMode: false, + })) + } + + function createTasksForBuildJsExtension ({ taskPrefix, devMode, testing }) { + const standardBundles = [ + 'background', + 'ui', + 'phishing-detect', + ] + + const standardSubtasks = standardBundles.map((filename) => { + return createTask(`${taskPrefix}:${filename}`, + createBundleTaskForBuildJsExtensionNormal({ filename, devMode, testing })) + }) + // inpage must be built before contentscript + // because inpage bundle result is included inside contentscript + const contentscriptSubtask = createTask(`${taskPrefix}:contentscript`, + createTaskForBuildJsExtensionContentscript({ devMode, testing })) + + // task for initiating livereload + const initiateLiveReload = async () => { + if (devMode) { + // trigger live reload when the bundles are updated + // this is not ideal, but overcomes the limitations: + // - run from the main process (not child process tasks) + // - after the first build has completed (thus the timeout) + // - build tasks never "complete" when run with livereload + child process + setTimeout(() => { + watch('./dist/*/*.js', (event) => { + livereload.changed(event.path) + }) + }, 75e3) + } + } + + // make each bundle run in a separate process + const allSubtasks = [...standardSubtasks, contentscriptSubtask].map((subtask) => runInChildProcess(subtask)) + // const allSubtasks = [...standardSubtasks, contentscriptSubtask].map(subtask => (subtask)) + // make a parent task that runs each task in a child thread + return composeParallel(initiateLiveReload, ...allSubtasks) + } + + function createBundleTaskForBuildJsExtensionNormal ({ filename, devMode, testing }) { + return bundleTask({ + label: filename, + filename: `${filename}.js`, + filepath: `./app/scripts/${filename}.js`, + externalDependencies: devMode ? undefined : externalDependenciesMap[filename], + devMode, + testing, + }) + } + + function createTaskForBuildJsExtensionContentscript ({ devMode, testing }) { + const inpage = 'inpage' + const contentscript = 'contentscript' + return composeSeries( + bundleTask({ + label: inpage, + filename: `${inpage}.js`, + filepath: `./app/scripts/${inpage}.js`, + externalDependencies: devMode ? undefined : externalDependenciesMap[inpage], + devMode, + testing, + }), + bundleTask({ + label: contentscript, + filename: `${contentscript}.js`, + filepath: `./app/scripts/${contentscript}.js`, + externalDependencies: devMode ? undefined : externalDependenciesMap[contentscript], + devMode, + testing, + }), + ) + } + + function bundleTask (opts) { + let bundler + + return performBundle + + async function performBundle () { + // initialize bundler if not available yet + // dont create bundler until task is actually run + if (!bundler) { + bundler = generateBundler(opts, performBundle) + // output build logs to terminal + bundler.on('log', log) + } + + let buildStream = bundler.bundle() + + // handle errors + buildStream.on('error', (err) => { + beep() + if (opts.devMode) { + console.warn(err.stack) + } else { + throw err + } + }) + + // process bundles + buildStream = buildStream + // convert bundle stream to gulp vinyl stream + .pipe(source(opts.filename)) + // buffer file contents (?) + .pipe(buffer()) + + // Initialize Source Maps + buildStream = buildStream + // loads map from browserify file + .pipe(sourcemaps.init({ loadMaps: true })) + + // Minification + if (!opts.devMode) { + buildStream = buildStream + .pipe(terser({ + mangle: { + reserved: ['MetamaskInpageProvider'], + }, + sourceMap: { + content: true, + }, + })) + } + + // Finalize Source Maps + if (opts.devMode) { + // Use inline source maps for development due to Chrome DevTools bug + // https://bugs.chromium.org/p/chromium/issues/detail?id=931675 + buildStream = buildStream + .pipe(sourcemaps.write()) + } else { + buildStream = buildStream + .pipe(sourcemaps.write('../sourcemaps')) + } + + // write completed bundles + browserPlatforms.forEach((platform) => { + const dest = `./dist/${platform}` + buildStream = buildStream.pipe(gulp.dest(dest)) + }) + + await endOfStream(buildStream) + } + } + + function configureBundleForSesify ({ + browserifyOpts, + bundleName, + }) { + // add in sesify args for better globalRef usage detection + Object.assign(browserifyOpts, sesify.args) + + // ensure browserify uses full paths + browserifyOpts.fullPaths = true + + // record dependencies used in bundle + fs.mkdirSync('./sesify', { recursive: true }) + browserifyOpts.plugin.push(['deps-dump', { + filename: `./sesify/deps-${bundleName}.json`, + }]) + + const sesifyConfigPath = `./sesify/${bundleName}.json` + + // add sesify plugin + browserifyOpts.plugin.push([sesify, { + writeAutoConfig: sesifyConfigPath, + }]) + + // remove html comments that SES is alergic to + const removeHtmlComment = makeStringTransform('remove-html-comment', { excludeExtension: ['.json'] }, (content, _, cb) => { + const result = content.split('-->').join('-- >') + cb(null, result) + }) + browserifyOpts.transform.push([removeHtmlComment, { global: true }]) + } + + function generateBundler (opts, performBundle) { + const browserifyOpts = assign({}, watchify.args, { + plugin: [], + transform: [], + debug: true, + fullPaths: opts.devMode, + }) + + const bundleName = opts.filename.split('.')[0] + + // activate sesify + const activateAutoConfig = Boolean(process.env.SESIFY_AUTOGEN) + // const activateSesify = activateAutoConfig + const activateSesify = activateAutoConfig && ['background'].includes(bundleName) + if (activateSesify) { + configureBundleForSesify({ browserifyOpts, bundleName }) + } + + if (!activateSesify) { + browserifyOpts.plugin.push('browserify-derequire') + } + + if (!opts.buildLib) { + if (opts.devMode && opts.filename === 'ui.js') { + browserifyOpts.entries = ['./development/require-react-devtools.js', opts.filepath] + } else { + browserifyOpts.entries = [opts.filepath] + } + } + + let bundler = browserify(browserifyOpts) + .transform('babelify') + // Transpile any dependencies using the object spread/rest operator + // because it is incompatible with `esprima`, which is used by `envify` + // See https://github.com/jquery/esprima/issues/1927 + .transform('babelify', { + only: [ + './**/node_modules/libp2p', + ], + global: true, + plugins: ['@babel/plugin-proposal-object-rest-spread'], + }) + .transform('brfs') + + if (opts.buildLib) { + bundler = bundler.require(opts.dependenciesToBundle) + } + + if (opts.externalDependencies) { + bundler = bundler.external(opts.externalDependencies) + } + + const environment = getEnvironment({ devMode: opts.devMode, test: opts.testing }) + if (environment === 'production' && !process.env.SENTRY_DSN) { + throw new Error('Missing SENTRY_DSN environment variable') + } + + // Inject variables into bundle + bundler.transform(envify({ + METAMASK_DEBUG: opts.devMode, + METAMASK_ENVIRONMENT: environment, + METAMETRICS_PROJECT_ID: process.env.METAMETRICS_PROJECT_ID, + NODE_ENV: opts.devMode ? 'development' : 'production', + IN_TEST: opts.testing ? 'true' : false, + PUBNUB_SUB_KEY: process.env.PUBNUB_SUB_KEY || '', + PUBNUB_PUB_KEY: process.env.PUBNUB_PUB_KEY || '', + ETH_GAS_STATION_API_KEY: process.env.ETH_GAS_STATION_API_KEY || '', + CONF: opts.devMode ? conf : ({}), + SENTRY_DSN: process.env.SENTRY_DSN, + }), { + global: true, + }) + + // Live reload - minimal rebundle on change + if (opts.devMode) { + bundler = watchify(bundler) + // on any file update, re-runs the bundler + bundler.on('update', () => { + performBundle() + }) + } + + return bundler + } + +} + +function beep () { + process.stdout.write('\x07') +} + +function getEnvironment ({ devMode, test }) { + // get environment slug + if (devMode) { + return 'development' + } else if (test) { + return 'testing' + } else if (process.env.CIRCLE_BRANCH === 'master') { + return 'production' + } else if ((/^Version-v(\d+)[.](\d+)[.](\d+)/u).test(process.env.CIRCLE_BRANCH)) { + return 'release-candidate' + } else if (process.env.CIRCLE_BRANCH === 'develop') { + return 'staging' + } else if (process.env.CIRCLE_PULL_REQUEST) { + return 'pull-request' + } + return 'other' +} diff --git a/development/build/static.js b/development/build/static.js new file mode 100644 index 000000000000..3d4c7439468a --- /dev/null +++ b/development/build/static.js @@ -0,0 +1,114 @@ +const path = require('path') +const fs = require('fs-extra') +const watch = require('gulp-watch') +const glob = require('fast-glob') + +const locales = require('../../app/_locales/index.json') + +const { createTask, composeSeries } = require('./task') + +module.exports = createStaticAssetTasks + +const copyTargets = [ + { + src: `./app/_locales/`, + dest: `_locales`, + }, + { + src: `./app/images/`, + dest: `images`, + }, + { + src: `./node_modules/eth-contract-metadata/images/`, + dest: `images/contract`, + }, + { + src: `./app/fonts/`, + dest: `fonts`, + }, + { + src: `./app/vendor/`, + dest: `vendor`, + }, + { + src: `./node_modules/@fortawesome/fontawesome-free/webfonts/`, + dest: `fonts/fontawesome`, + }, + { + src: `./ui/app/css/output/`, + pattern: `*.css`, + dest: ``, + }, + { + src: `./app/`, + pattern: `*.html`, + dest: ``, + }, +] + +const languageTags = new Set() +for (const locale of locales) { + const { code } = locale + const tag = code.split('_')[0] + languageTags.add(tag) +} + +for (const tag of languageTags) { + copyTargets.push({ + src: `./node_modules/@formatjs/intl-relativetimeformat/dist/locale-data/${tag}.json`, + dest: `intl/${tag}/relative-time-format-data.json`, + }) +} + +const copyTargetsDev = [ + ...copyTargets, + { + src: './app/scripts/', + pattern: '/chromereload.js', + dest: ``, + }, +] + +function createStaticAssetTasks ({ livereload, browserPlatforms }) { + + const prod = createTask('static:prod', composeSeries(...copyTargets.map((target) => { + return async function copyStaticAssets () { + await performCopy(target) + } + }))) + const dev = createTask('static:dev', composeSeries(...copyTargetsDev.map((target) => { + return async function copyStaticAssets () { + await setupLiveCopy(target) + } + }))) + + return { dev, prod } + + async function setupLiveCopy (target) { + const pattern = target.pattern || '/**/*' + watch(target.src + pattern, (event) => { + livereload.changed(event.path) + performCopy(target) + }) + await performCopy(target) + } + + async function performCopy (target) { + await Promise.all(browserPlatforms.map(async (platform) => { + if (target.pattern) { + await copyGlob(target.src, `${target.src}${target.pattern}`, `./dist/${platform}/${target.dest}`) + } else { + await copyGlob(target.src, `${target.src}`, `./dist/${platform}/${target.dest}`) + } + })) + } + + async function copyGlob (baseDir, srcGlob, dest) { + const sources = await glob(srcGlob, { onlyFiles: false }) + await Promise.all(sources.map(async (src) => { + const relativePath = path.relative(baseDir, src) + await fs.copy(src, `${dest}${relativePath}`) + })) + } + +} diff --git a/development/build/styles.js b/development/build/styles.js new file mode 100644 index 000000000000..d6f3a7855698 --- /dev/null +++ b/development/build/styles.js @@ -0,0 +1,75 @@ +const pify = require('pify') +const gulp = require('gulp') +const sass = require('gulp-sass') +sass.compiler = require('node-sass') +const autoprefixer = require('gulp-autoprefixer') +const gulpStylelint = require('gulp-stylelint') +const watch = require('gulp-watch') +const sourcemaps = require('gulp-sourcemaps') +const rtlcss = require('gulp-rtlcss') +const rename = require('gulp-rename') +const pump = pify(require('pump')) +const { createTask } = require('./task') + +// scss compilation and autoprefixing tasks +module.exports = createStyleTasks + +function createStyleTasks ({ livereload }) { + + const prod = createTask('styles:prod', createScssBuildTask({ + src: 'ui/app/css/index.scss', + dest: 'ui/app/css/output', + devMode: false, + })) + + const dev = createTask('styles:dev', createScssBuildTask({ + src: 'ui/app/css/index.scss', + dest: 'ui/app/css/output', + devMode: true, + pattern: 'ui/app/**/*.scss', + })) + + const lint = createTask('lint-scss', function () { + return gulp + .src('ui/app/css/itcss/**/*.scss') + .pipe(gulpStylelint({ + reporters: [ + { formatter: 'string', console: true }, + ], + fix: true, + })) + }) + + return { prod, dev, lint } + + function createScssBuildTask ({ src, dest, devMode, pattern }) { + return async function () { + if (devMode) { + watch(pattern, async (event) => { + await buildScss() + livereload.changed(event.path) + }) + } + await buildScss(devMode) + } + + async function buildScss () { + await pump(...[ + // pre-process + gulp.src(src), + devMode && sourcemaps.init(), + sass().on('error', sass.logError), + devMode && sourcemaps.write(), + autoprefixer(), + // standard + gulp.dest(dest), + // right-to-left + rtlcss(), + rename({ suffix: '-rtl' }), + devMode && sourcemaps.write(), + gulp.dest(dest), + ].filter(Boolean)) + } + } + +} diff --git a/development/build/task.js b/development/build/task.js new file mode 100644 index 000000000000..879ab1c97c2b --- /dev/null +++ b/development/build/task.js @@ -0,0 +1,100 @@ +const EventEmitter = require('events') +const { spawn } = require('child_process') + +const tasks = {} +const taskEvents = new EventEmitter() + +module.exports = { detectAndRunEntryTask, tasks, taskEvents, createTask, runTask, composeSeries, composeParallel, runInChildProcess } + +const { setupTaskDisplay } = require('./display') + +function detectAndRunEntryTask () { + // get requested task name and execute + const taskName = process.argv[2] + if (!taskName) { + throw new Error(`MetaMask build: No task name specified`) + } + const skipStats = process.argv[3] === '--skip-stats' + + runTask(taskName, { skipStats }) +} + +async function runTask (taskName, { skipStats } = {}) { + if (!(taskName in tasks)) { + throw new Error(`MetaMask build: Unrecognized task name "${taskName}"`) + } + if (!skipStats) { + setupTaskDisplay(taskEvents) + console.log(`running task "${taskName}"...`) + } + try { + await tasks[taskName]() + } catch (err) { + console.error(`MetaMask build: Encountered an error while running task "${taskName}".`) + console.error(err) + process.exit(1) + } + taskEvents.emit('complete') +} + +function createTask (taskName, taskFn) { + if (taskName in tasks) { + throw new Error(`MetaMask build: task "${taskName}" already exists. Refusing to redefine`) + } + const task = instrumentForTaskStats(taskName, taskFn) + task.taskName = taskName + tasks[taskName] = task + return task +} + +function runInChildProcess (task) { + const taskName = typeof task === 'string' ? task : task.taskName + if (!taskName) { + throw new Error(`MetaMask build: runInChildProcess unable to identify task name`) + } + return instrumentForTaskStats(taskName, async () => { + const childProcess = spawn('yarn', ['build', taskName, '--skip-stats']) + // forward logs to main process + // skip the first stdout event (announcing the process command) + childProcess.stdout.once('data', () => { + childProcess.stdout.on('data', (data) => process.stdout.write(`${taskName}: ${data}`)) + }) + childProcess.stderr.on('data', (data) => process.stderr.write(`${taskName}: ${data}`)) + // await end of process + await new Promise((resolve, reject) => { + childProcess.once('close', (errCode) => { + if (errCode !== 0) { + reject(new Error(`MetaMask build: runInChildProcess for task "${taskName}" encountered an error`)) + return + } + resolve() + }) + }) + }) +} + +function instrumentForTaskStats (taskName, asyncFn) { + return async () => { + const start = Date.now() + taskEvents.emit('start', [taskName, start]) + await asyncFn() + const end = Date.now() + taskEvents.emit('end', [taskName, start, end]) + } +} + +function composeSeries (...subtasks) { + return async () => { + const realTasks = subtasks + for (const subtask of realTasks) { + await subtask() + } + } +} + +function composeParallel (...subtasks) { + return async () => { + const realTasks = subtasks + await Promise.all(realTasks.map((subtask) => subtask())) + } +} diff --git a/development/create-static-server.js b/development/create-static-server.js new file mode 100644 index 000000000000..3312c43e7a05 --- /dev/null +++ b/development/create-static-server.js @@ -0,0 +1,22 @@ +const http = require('http') +const path = require('path') + +const serveHandler = require('serve-handler') + +const createStaticServer = (rootDirectory) => { + return http.createServer((request, response) => { + if (request.url.startsWith('/node_modules/')) { + request.url = request.url.substr(14) + return serveHandler(request, response, { + directoryListing: false, + public: path.resolve('./node_modules'), + }) + } + return serveHandler(request, response, { + directoryListing: false, + public: rootDirectory, + }) + }) +} + +module.exports = createStaticServer diff --git a/development/genStates.js b/development/genStates.js deleted file mode 100644 index 15e0863e8be5..000000000000 --- a/development/genStates.js +++ /dev/null @@ -1,25 +0,0 @@ -const fs = require('fs') -const path = require('path') -const promisify = require('pify') -const enLocaleMessages = require('../app/_locales/en/messages.json') -const writeFile = promisify(fs.writeFile) - -start().catch(console.error) - -async function start () { - const statesPath = path.join(__dirname, 'states') - const stateFilesNames = await promisify(fs.readdir)(statesPath) - const states = {} - await Promise.all(stateFilesNames.map(async (stateFileName) => { - const stateFilePath = path.join(__dirname, 'states', stateFileName) - const state = require(stateFilePath) - - state.localeMessages = { en: enLocaleMessages, current: {} } - - const stateName = stateFileName.split('.')[0].replace(/-/g, ' ', 'g') - states[stateName] = state - })) - const generatedFileContent = `module.exports = ${JSON.stringify(states)}` - const generatedFilePath = path.join(__dirname, 'states.js') - await writeFile(generatedFilePath, generatedFileContent) -} diff --git a/development/generate-migration.sh b/development/generate-migration.sh new file mode 100755 index 000000000000..5fb85feb5aff --- /dev/null +++ b/development/generate-migration.sh @@ -0,0 +1,15 @@ +#! /bin/bash +g-migration() { + [[ -z "$1" ]] && { echo "Migration version is required!" ; exit 1; } + local vnum=$1 + if (($1 < 100)); then + vnum=0$1 + fi + touch app/scripts/migrations/"$vnum".js + cp app/scripts/migrations/template.js app/scripts/migrations/"$vnum".js + + touch test/unit/migrations/"$vnum".js + cp test/unit/migrations/template-test.js test/unit/migrations/"$vnum"-test.js +} + +g-migration "$1" diff --git a/development/gource-viz.sh b/development/gource-viz.sh new file mode 100755 index 000000000000..d2896f940ad9 --- /dev/null +++ b/development/gource-viz.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +set -x + +gource \ + --seconds-per-day .025 \ + --user-scale 1.5 \ + --default-user-image "./images/icon-512.png" \ + --viewport 1280x720 \ + --auto-skip-seconds .05 \ + --multi-sampling \ + --highlight-users \ + --hide mouse,progress,filenames \ + --dir-name-depth 2 \ + --file-idle-time 0 \ + --max-files 0 \ + --background-colour 000000 \ + --font-size 18 \ + --date-format "%b %d, %Y" \ + --highlight-dirs \ + --user-friction 0.1 \ + --title "MetaMask Development History" \ + --output-ppm-stream - \ + --output-framerate 30 \ + | ffmpeg -y -r 30 -f image2pipe -vcodec ppm -i - -b 65536K metamask-dev-history.mp4 \ No newline at end of file diff --git a/development/index.html b/development/index.html deleted file mode 100644 index e5a027447c5e..000000000000 --- a/development/index.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - MetaMask - - - - - - - - - - diff --git a/development/metamaskbot-build-announce.js b/development/metamaskbot-build-announce.js index b254c8a900ac..51d9617a27f8 100755 --- a/development/metamaskbot-build-announce.js +++ b/development/metamaskbot-build-announce.js @@ -1,17 +1,22 @@ #!/usr/bin/env node -const request = require('request-promise') -const VERSION = require('../dist/chrome/manifest.json').version +const { promises: fs } = require('fs') +const path = require('path') +const fetch = require('node-fetch') +const VERSION = require('../dist/chrome/manifest.json').version // eslint-disable-line import/no-unresolved start().catch(console.error) +function capitalizeFirstLetter (string) { + return string.charAt(0).toUpperCase() + string.slice(1) +} + async function start () { - const GITHUB_COMMENT_TOKEN = process.env.GITHUB_COMMENT_TOKEN - const CIRCLE_PULL_REQUEST = process.env.CIRCLE_PULL_REQUEST + const { GITHUB_COMMENT_TOKEN, CIRCLE_PULL_REQUEST } = process.env console.log('CIRCLE_PULL_REQUEST', CIRCLE_PULL_REQUEST) - const CIRCLE_SHA1 = process.env.CIRCLE_SHA1 + const { CIRCLE_SHA1 } = process.env console.log('CIRCLE_SHA1', CIRCLE_SHA1) - const CIRCLE_BUILD_NUM = process.env.CIRCLE_BUILD_NUM + const { CIRCLE_BUILD_NUM } = process.env console.log('CIRCLE_BUILD_NUM', CIRCLE_BUILD_NUM) if (!CIRCLE_PULL_REQUEST) { @@ -23,26 +28,140 @@ async function start () { const SHORT_SHA1 = CIRCLE_SHA1.slice(0, 7) const BUILD_LINK_BASE = `https://${CIRCLE_BUILD_NUM}-42009758-gh.circle-artifacts.com/0` - const CHROME = `${BUILD_LINK_BASE}/builds/metamask-chrome-${VERSION}.zip` - const FIREFOX = `${BUILD_LINK_BASE}/builds/metamask-firefox-${VERSION}.zip` - const EDGE = `${BUILD_LINK_BASE}/builds/metamask-edge-${VERSION}.zip` - const OPERA = `${BUILD_LINK_BASE}/builds/metamask-opera-${VERSION}.zip` + // build the github comment content + + // links to extension builds + const platforms = ['chrome', 'firefox', 'opera'] + const buildLinks = platforms.map((platform) => { + const url = `${BUILD_LINK_BASE}/builds/metamask-${platform}-${VERSION}.zip` + return `${platform}` + }).join(', ') + + // links to bundle browser builds + const bundles = ['background', 'ui', 'inpage', 'contentscript', 'ui-libs', 'bg-libs', 'phishing-detect'] + const bundleLinks = bundles.map((bundle) => { + const url = `${BUILD_LINK_BASE}/build-artifacts/source-map-explorer/${bundle}.html` + return `${bundle}` + }).join(', ') - const commentBody = `Builds ready [${SHORT_SHA1}]: chrome, firefox, edge, opera` + // links to bundle browser builds + const depVizUrl = `${BUILD_LINK_BASE}/build-artifacts/deps-viz/background/index.html` + const depVizLink = `background` + + // link to artifacts + const allArtifactsUrl = `https://circleci.com/gh/MetaMask/metamask-extension/${CIRCLE_BUILD_NUM}#artifacts/containers/0` + + const contentRows = [ + `builds: ${buildLinks}`, + `bundle viz: ${bundleLinks}`, + `dep viz: ${depVizLink}`, + `all artifacts`, + ] + const hiddenContent = `
    ${contentRows.map((row) => `
  • ${row}
  • `).join('\n')}
` + const exposedContent = `Builds ready [${SHORT_SHA1}]` + const artifactsBody = `
${exposedContent}${hiddenContent}
` + + const benchmarkResults = {} + for (const platform of platforms) { + const benchmarkPath = path.resolve(__dirname, '..', path.join('test-artifacts', platform, 'benchmark', 'pageload.json')) + try { + const data = await fs.readFile(benchmarkPath, 'utf8') + const benchmark = JSON.parse(data) + benchmarkResults[platform] = benchmark + } catch (error) { + if (error.code === 'ENOENT') { + console.log(`No benchmark data found for ${platform}; skipping`) + } else { + console.error(`Error encountered processing benchmark data for '${platform}': '${error}'`) + } + } + } + + const summaryPlatform = 'chrome' + const summaryPage = 'home' + let commentBody + if (benchmarkResults[summaryPlatform]) { + try { + const summaryPageLoad = Math.round(parseFloat(benchmarkResults[summaryPlatform][summaryPage].average.load)) + const summaryPageLoadMarginOfError = Math.round(parseFloat(benchmarkResults[summaryPlatform][summaryPage].marginOfError.load)) + const benchmarkSummary = `Page Load Metrics (${summaryPageLoad} ± ${summaryPageLoadMarginOfError} ms)` + + const allPlatforms = new Set() + const allPages = new Set() + const allMetrics = new Set() + const allMeasures = new Set() + for (const platform of Object.keys(benchmarkResults)) { + allPlatforms.add(platform) + const platformBenchmark = benchmarkResults[platform] + const pages = Object.keys(platformBenchmark) + for (const page of pages) { + allPages.add(page) + const pageBenchmark = platformBenchmark[page] + const measures = Object.keys(pageBenchmark) + for (const measure of measures) { + allMeasures.add(measure) + const measureBenchmark = pageBenchmark[measure] + const metrics = Object.keys(measureBenchmark) + for (const metric of metrics) { + allMetrics.add(metric) + } + } + } + } + + const tableRows = [] + for (const platform of allPlatforms) { + const pageRows = [] + for (const page of allPages) { + const metricRows = [] + for (const metric of allMetrics) { + let metricData = `${metric}` + for (const measure of allMeasures) { + metricData += `${Math.round(parseFloat(benchmarkResults[platform][page][measure][metric]))}` + } + metricRows.push(metricData) + } + metricRows[0] = `${capitalizeFirstLetter(page)}${metricRows[0]}` + pageRows.push(...metricRows) + } + pageRows[0] = `${capitalizeFirstLetter(platform)}${pageRows[0]}` + for (const row of pageRows) { + tableRows.push(`${row}`) + } + } + + const benchmarkTableHeaders = ['Platform', 'Page', 'Metric'] + for (const measure of allMeasures) { + benchmarkTableHeaders.push(`${capitalizeFirstLetter(measure)} (ms)`) + } + const benchmarkTableHeader = `${benchmarkTableHeaders.map((header) => `${header}`).join('')}` + const benchmarkTableBody = `${tableRows.join('')}` + const benchmarkTable = `${benchmarkTableHeader}${benchmarkTableBody}
` + const benchmarkBody = `
${benchmarkSummary}${benchmarkTable}
` + commentBody = `${artifactsBody}${benchmarkBody}` + } catch (error) { + console.error(`Error constructing benchmark results: '${error}'`) + commentBody = artifactsBody + } + } else { + console.log(`No results for ${summaryPlatform} found; skipping benchmark`) + commentBody = artifactsBody + } const JSON_PAYLOAD = JSON.stringify({ body: commentBody }) const POST_COMMENT_URI = `https://api.github.com/repos/metamask/metamask-extension/issues/${CIRCLE_PR_NUMBER}/comments` console.log(`Announcement:\n${commentBody}`) console.log(`Posting to: ${POST_COMMENT_URI}`) - await request({ - method: 'POST', - uri: POST_COMMENT_URI, - body: JSON_PAYLOAD, - headers: { - 'User-Agent': 'metamaskbot', - 'Authorization': `token ${GITHUB_COMMENT_TOKEN}`, - }, + const response = await fetch(POST_COMMENT_URI, { + method: 'POST', + body: JSON_PAYLOAD, + headers: { + 'User-Agent': 'metamaskbot', + 'Authorization': `token ${GITHUB_COMMENT_TOKEN}`, + }, }) - + if (!response.ok) { + throw new Error(`Post comment failed with status '${response.statusText}'`) + } } diff --git a/development/mock-3box.js b/development/mock-3box.js new file mode 100644 index 000000000000..e4260c6103d9 --- /dev/null +++ b/development/mock-3box.js @@ -0,0 +1,65 @@ +function delay (time) { + return new Promise((resolve) => setTimeout(resolve, time)) +} + +async function loadFromMock3Box (key) { + const res = await window.fetch(`http://localhost:8889?key=${key}`) + const text = await res.text() + return text.length ? JSON.parse(text) : null +} + +async function saveToMock3Box (key, newDataAtKey) { + const res = await window.fetch('http://localhost:8889', { + method: 'POST', + body: JSON.stringify({ + key, + data: newDataAtKey, + }), + }) + + return res.text() +} + +class Mock3Box { + static openBox (address) { + this.address = address + return Promise.resolve({ + onSyncDone: (cb) => { + setTimeout(cb, 200) + }, + openSpace: async (spaceName, config) => { + const { onSyncDone } = config + this.spaceName = spaceName + + setTimeout(onSyncDone, 150) + + await delay(50) + + return { + private: { + get: async (key) => { + await delay(50) + const res = await loadFromMock3Box(`${this.address}-${this.spaceName}-${key}`) + return res + }, + set: async (key, data) => { + await saveToMock3Box(`${this.address}-${this.spaceName}-${key}`, data) + await delay(50) + return null + }, + }, + } + }, + logout: () => undefined, + }) + } + + static async getConfig (address) { + const backup = await loadFromMock3Box(`${address}-metamask-metamaskBackup`) + return backup + ? { spaces: { metamask: {} } } + : {} + } +} + +module.exports = Mock3Box diff --git a/development/mock-dev.js b/development/mock-dev.js deleted file mode 100644 index 4a3217a06b38..000000000000 --- a/development/mock-dev.js +++ /dev/null @@ -1,156 +0,0 @@ -/* MOCK DEV - * - * This is a utility module. - * It initializes a minimalist browserifiable project - * that contains the Metamask UI, with a local background process. - * - * Includes a state reset button for restoring to initial state. - * - * This is a convenient way to develop and test the plugin - * without having to re-open the plugin or even re-build it. - * - * To use, run `npm run mock`. - */ - -const render = require('react-dom').render -const h = require('react-hyperscript') -const Root = require('../ui/app/pages') -const configureStore = require('../ui/app/store/store') -const actions = require('../ui/app/store/actions') -const states = require('./states') -const backGroundConnectionModifiers = require('./backGroundConnectionModifiers') -const Selector = require('./selector') -const MetamaskController = require('../app/scripts/metamask-controller') -const firstTimeState = require('../app/scripts/first-time-state') -const ExtensionPlatform = require('../app/scripts/platforms/extension') -const noop = function () {} - -const log = require('loglevel') -window.log = log -log.setLevel('debug') - -// -// Query String -// - -const qs = require('qs') -const routerPath = window.location.href.split('#')[1] -let queryString = {} -let selectedView - -if (routerPath) { - queryString = qs.parse(routerPath.split('?')[1]) -} - -selectedView = queryString.view || 'send new ui' -const firstState = states[selectedView] -updateQueryParams(selectedView) - -function updateQueryParams (newView) { - queryString.view = newView - const params = qs.stringify(queryString) - const locationPaths = window.location.href.split('#') - const routerPath = locationPaths[1] || '' - const newPath = locationPaths[0] + '#' + routerPath.split('?')[0] + `?${params}` - - if (window.location.href !== newPath) { - window.location.href = newPath - } -} - -// -// CSS -// - -const MetaMaskUiCss = require('../ui/css') -const injectCss = require('inject-css') - -// -// MetaMask Controller -// - -const controller = new MetamaskController({ - // User confirmation callbacks: - showUnconfirmedMessage: noop, - unlockAccountMessage: noop, - showUnapprovedTx: noop, - platform: {}, - // initial state - initState: firstTimeState, -}) -global.metamaskController = controller -global.platform = new ExtensionPlatform() - -// -// User Interface -// - -actions._setBackgroundConnection(controller.getApi()) -actions.update = function (stateName) { - selectedView = stateName - updateQueryParams(stateName) - const newState = states[selectedView] - return { - type: 'GLOBAL_FORCE_UPDATE', - value: newState, - } -} - -function modifyBackgroundConnection (backgroundConnectionModifier) { - const modifiedBackgroundConnection = Object.assign({}, controller.getApi(), backgroundConnectionModifier) - actions._setBackgroundConnection(modifiedBackgroundConnection) -} - -var css = MetaMaskUiCss() -injectCss(css) - -// parse opts -var store = configureStore(firstState) - -// start app -startApp() - -function startApp () { - const body = document.body - const container = document.createElement('div') - container.id = 'test-container' - body.appendChild(container) - - render( - h('.super-dev-container', [ - - h('button', { - onClick: (ev) => { - ev.preventDefault() - store.dispatch(actions.update('terms')) - }, - style: { - margin: '19px 19px 0px 19px', - }, - }, 'Reset State'), - - h(Selector, { - actions, - selectedKey: selectedView, - states, - store, - modifyBackgroundConnection, - backGroundConnectionModifiers, - }), - - h('#app-content', { - style: { - height: '500px', - width: '360px', - boxShadow: 'grey 0px 2px 9px', - margin: '20px', - }, - }, [ - h(Root, { - store: store, - }), - ]), - - ] - ), container) -} diff --git a/development/mockExtension.js b/development/mockExtension.js deleted file mode 100644 index 634d4263a3de..000000000000 --- a/development/mockExtension.js +++ /dev/null @@ -1,44 +0,0 @@ -/* MockExtension - * - * A module for importing the global extension polyfiller - * and stubbing out all the extension methods with appropriate mocks. - */ - -const extension = require('extensionizer') -const noop = function () {} - -const apis = [ - 'alarms', - 'bookmarks', - 'browserAction', - 'commands', - 'contextMenus', - 'cookies', - 'downloads', - 'events', - 'extension', - 'extensionTypes', - 'history', - 'i18n', - 'idle', - 'notifications', - 'pageAction', - 'runtime', - 'storage', - 'tabs', - 'webNavigation', - 'webRequest', - 'windows', -] - -apis.forEach(function (api) { - extension[api] = {} -}) - -extension.runtime.reload = noop -extension.tabs.create = noop -extension.runtime.getManifest = function () { - return { - version: 'development', - } -} diff --git a/development/notices/.gitkeep b/development/notices/.gitkeep deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/development/require-react-devtools.js b/development/require-react-devtools.js new file mode 100644 index 000000000000..9d0b1f46da82 --- /dev/null +++ b/development/require-react-devtools.js @@ -0,0 +1 @@ +require('react-devtools') diff --git a/development/rollback.sh b/development/rollback.sh deleted file mode 100755 index 0a1d8ad62022..000000000000 --- a/development/rollback.sh +++ /dev/null @@ -1,35 +0,0 @@ -#! /bin/bash - -[[ -z "$1" ]] && { echo "Rollback version is required!" ; exit 1; } -echo "Rolling back to version $1" - -# Checkout branch to increment version -git checkout -b version-increment-$1 -npm run version:bump patch - -# Store the new version name -NEW_VERSION=$(cat app/manifest.json | jq -r .version) - -# Make sure origin tags are loaded -git fetch origin - -# check out the rollback branch -git checkout origin/v$1 - -# Create the rollback branch. -git checkout -b Version-$NEW_VERSION-Rollback-to-$1 - -# Set the version files to the next one. -git checkout master CHANGELOG.md -git checkout master app/manifest.json -git commit -m "Version $NEW_VERSION (Rollback to $1)" - -# Push the new branch to PR -git push -u origin HEAD - -# Create tag and push that up too -git tag v${NEW_VERSION} -git push origin v${NEW_VERSION} - -# Cleanup version branch -git branch -D version-increment-$1 diff --git a/development/run-ganache b/development/run-ganache new file mode 100755 index 000000000000..8831c21122ab --- /dev/null +++ b/development/run-ganache @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +set -e +set -u +set -o pipefail + +ganache_cli="$(yarn bin)/ganache-cli" +seed_phrase="${GANACHE_SEED_PHRASE:-phrase upgrade clock rough situate wedding elder clever doctor stamp excess tent}" + +_term () { + printf '%s\n' "Received SIGTERM, sending SIGKILL to Ganache" + kill -KILL "$child" 2>/dev/null + exit 42 +} + +_int () { + printf '%s\n' "Received SIGINT, sending SIGKILL to Ganache" + kill -KILL "$child" 2>/dev/null + exit 42 +} + +trap _term SIGTERM +trap _int SIGINT + +# shellcheck disable=SC2086 +$ganache_cli --noVMErrorsOnRPCResponse --networkId 5777 --mnemonic "$seed_phrase" ${GANACHE_ARGS:-} & + +child=$! +wait "$child" diff --git a/development/run-version-bump.js b/development/run-version-bump.js deleted file mode 100644 index 32fed1865e36..000000000000 --- a/development/run-version-bump.js +++ /dev/null @@ -1,43 +0,0 @@ -const promisify = require('pify') -const fs = require('fs') -const readFile = promisify(fs.readFile) -const writeFile = promisify(fs.writeFile) -const path = require('path') -const changelogPath = path.join(__dirname, '..', 'CHANGELOG.md') -const manifestPath = path.join(__dirname, '..', 'app', 'manifest.json') -const manifest = require('../app/manifest.json') -const versionBump = require('./version-bump') -const bumpType = normalizeType(process.argv[2]) - -start().catch(console.error) - -async function start () { - - const changeBuffer = await readFile(changelogPath) - const changelog = changeBuffer.toString() - - const newData = await versionBump(bumpType, changelog, manifest) - - const manifestString = JSON.stringify(newData.manifest, null, 2) - - await writeFile(changelogPath, newData.changelog) - await writeFile(manifestPath, manifestString) - - console.log(`Bumped ${bumpType} to version ${newData.version}`) -} - - -function normalizeType (userInput) { - const err = new Error('First option must be a type (major, minor, or patch)') - if (!userInput || typeof userInput !== 'string') { - throw err - } - - const lower = userInput.toLowerCase() - - if (lower !== 'major' && lower !== 'minor' && lower !== 'patch') { - throw err - } - - return lower -} diff --git a/development/selector.js b/development/selector.js deleted file mode 100644 index 2673d0fe3c30..000000000000 --- a/development/selector.js +++ /dev/null @@ -1,42 +0,0 @@ -const Component = require('react').Component -const h = require('react-hyperscript') -const inherits = require('util').inherits - -module.exports = NewComponent - -inherits(NewComponent, Component) -function NewComponent () { - Component.call(this) -} - -NewComponent.prototype.render = function () { - const props = this.props - const { - states, - selectedKey, - actions, - store, - modifyBackgroundConnection, - backGroundConnectionModifiers, - } = props - - const state = this.state || {} - const selected = state.selected || selectedKey - - return h('select', { - style: { - margin: '20px 20px 0px', - }, - value: selected, - onChange: (event) => { - const selectedKey = event.target.value - const backgroundConnectionModifier = backGroundConnectionModifiers[selectedKey] - modifyBackgroundConnection(backgroundConnectionModifier || {}) - store.dispatch(actions.update(selectedKey)) - this.setState({ selected: selectedKey }) - }, - }, Object.keys(states).map((stateName) => { - return h('option', { value: stateName }, stateName) - })) - -} diff --git a/development/sentry-publish.js b/development/sentry-publish.js index e14f3f1765ad..80c373608171 100644 --- a/development/sentry-publish.js +++ b/development/sentry-publish.js @@ -1,7 +1,9 @@ #!/usr/bin/env node +const childProcess = require('child_process') const pify = require('pify') -const exec = pify(require('child_process').exec, { multiArgs: true }) -const VERSION = require('../dist/chrome/manifest.json').version + +const exec = pify(childProcess.exec, { multiArgs: true }) +const VERSION = require('../dist/chrome/manifest.json').version // eslint-disable-line import/no-unresolved start().catch(console.error) @@ -16,7 +18,7 @@ async function start () { if (versionAlreadyExists) { console.log(`Version "${VERSION}" already exists on Sentry, skipping version creation`) } else { - // create sentry release + // create sentry release console.log(`creating Sentry release for "${VERSION}"...`) await exec(`sentry-cli releases --org 'metamask' --project 'metamask' new ${VERSION}`) console.log(`removing any existing files from Sentry release "${VERSION}"...`) @@ -25,16 +27,14 @@ async function start () { // check if version has artifacts or not const versionHasArtifacts = versionAlreadyExists && await checkIfVersionHasArtifacts() - if (!versionHasArtifacts) { - // upload sentry source and sourcemaps - console.log(`uploading source files Sentry release "${VERSION}"...`) - await exec(`for FILEPATH in ./dist/chrome/*.js; do [ -e $FILEPATH ] || continue; export FILE=\`basename $FILEPATH\` && echo uploading $FILE && sentry-cli releases --org 'metamask' --project 'metamask' files ${VERSION} upload $FILEPATH metamask/$FILE; done;`) - console.log(`uploading sourcemaps Sentry release "${VERSION}"...`) - await exec(`sentry-cli releases --org 'metamask' --project 'metamask' files ${VERSION} upload-sourcemaps ./dist/sourcemaps/ --url-prefix 'sourcemaps'`) - console.log('all done!') - } else { + if (versionHasArtifacts) { console.log(`Version "${VERSION}" already has artifacts on Sentry, skipping sourcemap upload`) + return } + + // upload sentry source and sourcemaps + await exec(`./development/sentry-upload-artifacts.sh --release ${VERSION}`) + } async function checkIfAuthWorks () { diff --git a/development/sentry-upload-artifacts.sh b/development/sentry-upload-artifacts.sh new file mode 100755 index 000000000000..12b799b942ec --- /dev/null +++ b/development/sentry-upload-artifacts.sh @@ -0,0 +1,97 @@ +#!/usr/bin/env bash + +set -x +set -e +set -u +set -o pipefail + +readonly __SCRIPT_NAME__="${0##*/}" +readonly __SEE_HELP_MESSAGE__="See '${__SCRIPT_NAME__} --help' for more information." + +function die { + local message="${1}" + + printf 'ERROR: %s\n' "${message}" >&2 + + exit 1 +} + +function show_help { + cat << EOF +${__SCRIPT_NAME__}" +Upload JavaScript bundles and sourcemaps to Sentry + +Options: + -h, --help Show help text + -r, --release Sentry release to upload files to (defaults to 'VERSION' environment variable) +EOF +} + +function upload_bundles { + local release="${1}"; shift + + for filepath in ./dist/chrome/*.js + do + if [[ -f $filepath ]] + then + upload_bundle "${release}" "${filepath}" + fi + done +} + +function upload_bundle { + local release="${1}"; shift + local filepath="${1}"; shift + local filename + + filename="$( basename "${filepath}" )" + + printf 'Uploading %s\n' "${filename}" + sentry-cli releases --org 'metamask' --project 'metamask' files "${release}" upload "${filepath}" "metamask/${filename}" +} + +function upload_sourcemaps { + local release="${1}"; shift + + sentry-cli releases --org 'metamask' --project 'metamask' files "${release}" upload-sourcemaps ./dist/sourcemaps/ --url-prefix 'sourcemaps' +} + +function main { + local release=VERSION + + while :; do + case "${1-default}" in + -h|--help) + show_help + exit + ;; + -r|--release) + if [[ -z $2 ]] + then + printf "'release' option requires an argument.\\n" >&2 + printf '%s\n' "${__SEE_HELP_MESSAGE__}" >&2 + exit 1 + fi + release="${2}" + shift + ;; + *) + break + esac + + shift + done + + if [[ -z $release ]] + then + die 'Required parameter "release" missing; either include parameter or set VERSION environment variable' + fi + + printf 'uploading source files Sentry release "%s"...\n' "${release}" + upload_bundles "${release}" + printf 'uploading sourcemaps Sentry release "%s"...\n' "${release}" + upload_sourcemaps "${release}" + printf 'all done!\n' +} + +main "${@}" diff --git a/development/shellcheck.sh b/development/shellcheck.sh new file mode 100755 index 000000000000..ec326908ded9 --- /dev/null +++ b/development/shellcheck.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +set -e +set -u +set -x +set -o pipefail + +shellcheck --version +# lint all *.sh files +find . -type f -name '*.sh' ! -path './node_modules/*' -print0 | xargs -0 shellcheck +# lint all .scripts in package.json +# shellcheck disable=SC2016 +list=$(jq -r '.scripts | keys[] as $key | .[$key]' < package.json) +printf "#!/bin/bash\n%s\n" "$list" | shellcheck - diff --git a/development/show-deps-install-scripts.js b/development/show-deps-install-scripts.js new file mode 100644 index 000000000000..12301fe0d5e1 --- /dev/null +++ b/development/show-deps-install-scripts.js @@ -0,0 +1,38 @@ +// This script lists all dependencies that have package install scripts +const path = require('path') +const readInstalled = require('read-installed') + +const installScripts = ['preinstall', 'install', 'postinstall'] + +readInstalled('./', { dev: true }, function (err, data) { + if (err) { + throw err + } + + const deps = data.dependencies + Object.entries(deps).forEach(([packageName, packageData]) => { + const packageScripts = packageData.scripts || {} + const scriptKeys = Reflect.ownKeys(packageScripts) + + const hasInstallScript = installScripts.some((installKey) => scriptKeys.includes(installKey)) + if (!hasInstallScript) { + return + } + + const matchingScripts = {} + if (packageScripts.preinstall) { + matchingScripts.preinstall = packageScripts.preinstall + } + if (packageScripts.install) { + matchingScripts.install = packageScripts.install + } + if (packageScripts.postinstall) { + matchingScripts.postinstall = packageScripts.postinstall + } + const scriptNames = Reflect.ownKeys(matchingScripts) + + const relativePath = path.relative(process.cwd(), packageData.path) + + console.log(`${packageName}: ${relativePath} ${scriptNames}`) + }) +}) diff --git a/development/source-map-explorer.sh b/development/source-map-explorer.sh new file mode 100755 index 000000000000..2a2ec61204c0 --- /dev/null +++ b/development/source-map-explorer.sh @@ -0,0 +1,10 @@ +#! /bin/bash +set -x + +mkdir -p build-artifacts/source-map-explorer +npx source-map-explorer dist/chrome/inpage.js --html build-artifacts/source-map-explorer/inpage.html +npx source-map-explorer dist/chrome/contentscript.js --html build-artifacts/source-map-explorer/contentscript.html +npx source-map-explorer dist/chrome/background.js --html build-artifacts/source-map-explorer/background.html +npx source-map-explorer dist/chrome/ui.js --html build-artifacts/source-map-explorer/ui.html +npx source-map-explorer dist/chrome/libs.js --html build-artifacts/source-map-explorer/libs.html +npx source-map-explorer dist/chrome/phishing-detect.js --html build-artifacts/source-map-explorer/phishing-detect.html diff --git a/development/sourcemap-validator.js b/development/sourcemap-validator.js index 546745f1665d..cb5f6f6c895c 100644 --- a/development/sourcemap-validator.js +++ b/development/sourcemap-validator.js @@ -1,7 +1,8 @@ const fs = require('fs') -const { SourceMapConsumer } = require('source-map') const path = require('path') +const { SourceMapConsumer } = require('source-map') const pify = require('pify') + const fsAsync = pify(fs) // @@ -12,13 +13,30 @@ const fsAsync = pify(fs) // if not working it may error or print minified garbage // -start().catch(console.error) - +start().catch((error) => { + console.error(error) + process.exit(1) +}) async function start () { - const targetFiles = [`inpage.js`, `contentscript.js`, `ui.js`, `background.js`] + const targetFiles = [ + `background.js`, + // `bg-libs`, skipped because source maps are invalid due to browserify bug: https://github.com/browserify/browserify/issues/1971 + // `contentscript.js`, skipped because the validator is erroneously sampling the inlined `inpage.js` script + `inpage.js`, + 'phishing-detect.js', + `ui.js`, + // `ui-libs.js`, skipped because source maps are invalid due to browserify bug: https://github.com/browserify/browserify/issues/1971 + ] + let valid = true + for (const buildName of targetFiles) { - await validateSourcemapForFile({ buildName }) + const fileIsValid = await validateSourcemapForFile({ buildName }) + valid = valid && fileIsValid + } + + if (!valid) { + process.exit(1) } } @@ -30,7 +48,9 @@ async function validateSourcemapForFile ({ buildName }) { try { const filePath = path.join(__dirname, `/../dist/${platform}/`, `${buildName}`) rawBuild = await fsAsync.readFile(filePath, 'utf8') - } catch (err) {} + } catch (_) { + // empty + } if (!rawBuild) { throw new Error(`SourcemapValidator - failed to load source file for "${buildName}"`) } @@ -39,12 +59,16 @@ async function validateSourcemapForFile ({ buildName }) { try { const filePath = path.join(__dirname, `/../dist/sourcemaps/`, `${buildName}.map`) rawSourceMap = await fsAsync.readFile(filePath, 'utf8') - } catch (err) {} + } catch (_) { + // empty + } // attempt to load in dev mode try { const filePath = path.join(__dirname, `/../dist/${platform}/`, `${buildName}.map`) rawSourceMap = await fsAsync.readFile(filePath, 'utf8') - } catch (err) {} + } catch (_) { + // empty + } if (!rawSourceMap) { throw new Error(`SourcemapValidator - failed to load sourcemaps for "${buildName}"`) } @@ -52,22 +76,26 @@ async function validateSourcemapForFile ({ buildName }) { const consumer = await new SourceMapConsumer(rawSourceMap) const hasContentsOfAllSources = consumer.hasContentsOfAllSources() - if (!hasContentsOfAllSources) console.warn('SourcemapValidator - missing content of some sources...') + if (!hasContentsOfAllSources) { + console.warn('SourcemapValidator - missing content of some sources...') + } console.log(` sampling from ${consumer.sources.length} files`) let sampleCount = 0 + let valid = true const buildLines = rawBuild.split('\n') const targetString = 'new Error' // const targetString = 'null' - const matchesPerLine = buildLines.map(line => indicesOf(targetString, line)) + const matchesPerLine = buildLines.map((line) => indicesOf(targetString, line)) matchesPerLine.forEach((matchIndices, lineIndex) => { matchIndices.forEach((matchColumn) => { - sampleCount++ + sampleCount += 1 const position = { line: lineIndex + 1, column: matchColumn } const result = consumer.originalPositionFor(position) // warn if source content is missing if (!result.source) { + valid = false console.warn(`!! missing source for position: ${JSON.stringify(position)}`) // const buildLine = buildLines[position.line - 1] console.warn(` origin in build:`) @@ -83,19 +111,34 @@ async function validateSourcemapForFile ({ buildName }) { const portion = line.slice(result.column) const isMaybeValid = portion.includes(targetString) if (!isMaybeValid) { - console.error('Sourcemap seems invalid:') - console.log(`\n========================== ${result.source} ====================================\n`) - console.log(line) - console.log(`\n==============================================================================\n`) + valid = false + console.error(`Sourcemap seems invalid:\n${getFencedCode(result.source, line)}`) } }) }) console.log(` checked ${sampleCount} samples`) + return valid +} + +const CODE_FENCE_LENGTH = 80 +const TITLE_PADDING_LENGTH = 1 + +function getFencedCode (filename, code) { + const title = `${' '.repeat(TITLE_PADDING_LENGTH)}${filename}${' '.repeat(TITLE_PADDING_LENGTH)}` + const openingFenceLength = Math.max(CODE_FENCE_LENGTH - (filename.length + (TITLE_PADDING_LENGTH * 2)), 0) + const startOpeningFenceLength = Math.floor(openingFenceLength / 2) + const endOpeningFenceLength = Math.ceil(openingFenceLength / 2) + const openingFence = `${'='.repeat(startOpeningFenceLength)}${title}${'='.repeat(endOpeningFenceLength)}` + const closingFence = '='.repeat(CODE_FENCE_LENGTH) + + return `${openingFence}\n${code}\n${closingFence}\n` } function indicesOf (substring, string) { - var a = [] - var i = -1 - while ((i = string.indexOf(substring, i + 1)) >= 0) a.push(i) + const a = [] + let i = -1 + while ((i = string.indexOf(substring, i + 1)) >= 0) { + a.push(i) + } return a } diff --git a/development/states.json b/development/states.json deleted file mode 100644 index bdd0a6b2798e..000000000000 --- a/development/states.json +++ /dev/null @@ -1 +0,0 @@ -module.exports = [{"account detail":{"metamask":{"isInitialized":true,"isUnlocked":true,"currentDomain":"example.com","rpcTarget":"https://rawtestrpc.metamask.io/","identities":{"0x5f11b68b7d41633e74c6b18d8b8d147da52aedd6":{"name":"Secret Wallet!","address":"0x5f11b68b7d41633e74c6b18d8b8d147da52aedd6","mayBeFauceting":false},"0x843963b837841dad3b0f5969ff271108776616df":{"name":"Main Wallet","address":"0x843963b837841dad3b0f5969ff271108776616df","mayBeFauceting":false},"0x2cb215323857bec1c91e5db10fe87379a5cf129a":{"name":"Wallet 3","address":"0x2cb215323857bec1c91e5db10fe87379a5cf129a","mayBeFauceting":false}},"unconfTxs":{},"accounts":{"0x5f11b68b7d41633e74c6b18d8b8d147da52aedd6":{"code":"0x","balance":"0x0","nonce":"0x0","address":"0x5f11b68b7d41633e74c6b18d8b8d147da52aedd6"},"0x843963b837841dad3b0f5969ff271108776616df":{"code":"0x","balance":"0x0","nonce":"0x0","address":"0x843963b837841dad3b0f5969ff271108776616df"},"0x2cb215323857bec1c91e5db10fe87379a5cf129a":{"code":"0x","balance":"0x0","nonce":"0x0","address":"0x2cb215323857bec1c91e5db10fe87379a5cf129a"}},"transactions":[],"selectedAddress":"0x843963b837841dad3b0f5969ff271108776616df","network":"2","seedWords":null,"isDisclaimerConfirmed":true,"unconfMsgs":{},"messages":[],"provider":{"type":"testnet"},"selectedAddress":"0x843963b837841dad3b0f5969ff271108776616df"},"appState":{"menuOpen":false,"currentView":{"name":"accountDetail","detailView":null,"context":"0x843963b837841dad3b0f5969ff271108776616df"},"accountDetail":{"subview":"transactions"},"currentDomain":"127.0.0.1:9966","transForward":true,"isLoading":false,"warning":null},"identities":{}}},{"accounts":{"metamask":{"isInitialized":true,"isUnlocked":true,"currentDomain":"example.com","rpcTarget":"https://rawtestrpc.metamask.io/","identities":{"0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc":{"name":"Wallet 1","address":"0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc","mayBeFauceting":false},"0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b":{"name":"Wallet 2","address":"0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b","mayBeFauceting":false},"0xeb9e64b93097bc15f01f13eae97015c57ab64823":{"name":"Wallet 3","address":"0xeb9e64b93097bc15f01f13eae97015c57ab64823","mayBeFauceting":false},"0x704107d04affddd9b66ab9de3dd7b095852e9b69":{"name":"Wallet 4","address":"0x704107d04affddd9b66ab9de3dd7b095852e9b69","mayBeFauceting":false}},"unconfTxs":{},"accounts":{"0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc":{"balance":"0x0","nonce":"0x0","code":"0x","address":"0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc"},"0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b":{"balance":"0x0","nonce":"0x0","code":"0x","address":"0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b"},"0xeb9e64b93097bc15f01f13eae97015c57ab64823":{"balance":"0x0","nonce":"0x0","code":"0x","address":"0xeb9e64b93097bc15f01f13eae97015c57ab64823"},"0x704107d04affddd9b66ab9de3dd7b095852e9b69":{"balance":"0x0","code":"0x","nonce":"0x0","address":"0x704107d04affddd9b66ab9de3dd7b095852e9b69"}},"transactions":[],"network":"2","isDisclaimerConfirmed":true,"unconfMsgs":{},"messages":[],"provider":{"type":"testnet"},"selectedAddress":"0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc","selectedAddress":"0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc","seedWords":null},"appState":{"menuOpen":false,"currentView":{"name":"accounts"},"accountDetail":{"subview":"transactions","accountExport":"none","privateKey":""},"currentDomain":"extensions","transForward":true,"isLoading":false,"warning":null,"scrollToBottom":true},"identities":{}}},{"config":{"metamask":{"isInitialized":true,"isUnlocked":true,"currentDomain":"example.com","rpcTarget":"https://rawtestrpc.metamask.io/","identities":{"0x5f11b68b7d41633e74c6b18d8b8d147da52aedd6":{"name":"Wallet 1","address":"0x5f11b68b7d41633e74c6b18d8b8d147da52aedd6","mayBeFauceting":false},"0x843963b837841dad3b0f5969ff271108776616df":{"name":"Wallet 2","address":"0x843963b837841dad3b0f5969ff271108776616df","mayBeFauceting":false},"0x2cb215323857bec1c91e5db10fe87379a5cf129a":{"name":"Wallet 3","address":"0x2cb215323857bec1c91e5db10fe87379a5cf129a","mayBeFauceting":false},"0xc5091450b7548b0dce3a76b8d325929c39e648d1":{"name":"Wallet 4","address":"0xc5091450b7548b0dce3a76b8d325929c39e648d1","mayBeFauceting":false}},"unconfTxs":{},"accounts":{"0x5f11b68b7d41633e74c6b18d8b8d147da52aedd6":{"balance":"0x0","nonce":"0x0","code":"0x","address":"0x5f11b68b7d41633e74c6b18d8b8d147da52aedd6"},"0x843963b837841dad3b0f5969ff271108776616df":{"balance":"0x0","nonce":"0x0","code":"0x","address":"0x843963b837841dad3b0f5969ff271108776616df"},"0x2cb215323857bec1c91e5db10fe87379a5cf129a":{"balance":"0x0","nonce":"0x0","code":"0x","address":"0x2cb215323857bec1c91e5db10fe87379a5cf129a"},"0xc5091450b7548b0dce3a76b8d325929c39e648d1":{"balance":"0x0","nonce":"0x0","code":"0x","address":"0xc5091450b7548b0dce3a76b8d325929c39e648d1"}},"transactions":[],"selectedAddress":"0x843963b837841dad3b0f5969ff271108776616df","network":"2","isDisclaimerConfirmed":true,"unconfMsgs":{},"messages":[],"provider":{"type":"testnet"},"selectedAddress":"0x843963b837841dad3b0f5969ff271108776616df","seedWords":null},"appState":{"menuOpen":false,"currentView":{"name":"accounts"},"accountDetail":{"subview":"transactions","accountExport":"none","privateKey":""},"currentDomain":"testfaucet.metamask.io","transForward":true,"isLoading":false,"warning":null,"scrollToBottom":true},"identities":{}}},{"create vault password":{"metamask":{"isInitialized":false,"isUnlocked":false,"currentDomain":"example.com","rpcTarget":"https://rawtestrpc.metamask.io/","identities":{},"unconfTxs":{},"accounts":{},"transactions":[],"network":"2","seedWords":null,"isDisclaimerConfirmed":true,"unconfMsgs":{},"messages":[],"provider":{"type":"testnet"}},"appState":{"menuOpen":false,"currentView":{"name":"accounts","detailView":null},"accountDetail":{"subview":"transactions"},"currentDomain":"extensions","transForward":false,"isLoading":false,"warning":null},"identities":{}}},{"help":{"metamask":{"isInitialized":true,"isUnlocked":true,"currentDomain":"example.com","rpcTarget":"https://rawtestrpc.metamask.io/","identities":{"0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc":{"name":"Wallet 1","address":"0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc","mayBeFauceting":false},"0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b":{"name":"Wallet 2","address":"0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b","mayBeFauceting":false},"0xeb9e64b93097bc15f01f13eae97015c57ab64823":{"name":"Wallet 3","address":"0xeb9e64b93097bc15f01f13eae97015c57ab64823","mayBeFauceting":false},"0x704107d04affddd9b66ab9de3dd7b095852e9b69":{"name":"Wallet 4","address":"0x704107d04affddd9b66ab9de3dd7b095852e9b69","mayBeFauceting":false}},"unconfTxs":{},"accounts":{"0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc":{"code":"0x","balance":"0x0","nonce":"0x0","address":"0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc"},"0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b":{"code":"0x","balance":"0x0","nonce":"0x0","address":"0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b"},"0xeb9e64b93097bc15f01f13eae97015c57ab64823":{"code":"0x","balance":"0x0","nonce":"0x0","address":"0xeb9e64b93097bc15f01f13eae97015c57ab64823"},"0x704107d04affddd9b66ab9de3dd7b095852e9b69":{"code":"0x","nonce":"0x0","balance":"0x0","address":"0x704107d04affddd9b66ab9de3dd7b095852e9b69"}},"transactions":[],"network":"2","isDisclaimerConfirmed":true,"unconfMsgs":{},"messages":[],"provider":{"type":"testnet"},"selectedAddress":"0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc","selectedAddress":"0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc","seedWords":null},"appState":{"menuOpen":false,"currentView":{"name":"info"},"accountDetail":{"subview":"transactions","accountExport":"none","privateKey":""},"currentDomain":"extensions","transForward":true,"isLoading":false,"warning":null,"scrollToBottom":true},"identities":{}}},{"locked":{"metamask":{"isInitialized":true,"isUnlocked":true,"currentDomain":"example.com","rpcTarget":"https://rawtestrpc.metamask.io/","identities":{"0x5f11b68b7d41633e74c6b18d8b8d147da52aedd6":{"name":"Wallet 1","address":"0x5f11b68b7d41633e74c6b18d8b8d147da52aedd6","mayBeFauceting":false},"0x843963b837841dad3b0f5969ff271108776616df":{"name":"Wallet 2","address":"0x843963b837841dad3b0f5969ff271108776616df","mayBeFauceting":false},"0x2cb215323857bec1c91e5db10fe87379a5cf129a":{"name":"Wallet 3","address":"0x2cb215323857bec1c91e5db10fe87379a5cf129a","mayBeFauceting":false},"0xc5091450b7548b0dce3a76b8d325929c39e648d1":{"name":"Wallet 4","address":"0xc5091450b7548b0dce3a76b8d325929c39e648d1","mayBeFauceting":false}},"unconfTxs":{},"accounts":{"0x5f11b68b7d41633e74c6b18d8b8d147da52aedd6":{"balance":"0x0","nonce":"0x0","code":"0x","address":"0x5f11b68b7d41633e74c6b18d8b8d147da52aedd6"},"0x843963b837841dad3b0f5969ff271108776616df":{"balance":"0x0","nonce":"0x0","code":"0x","address":"0x843963b837841dad3b0f5969ff271108776616df"},"0x2cb215323857bec1c91e5db10fe87379a5cf129a":{"balance":"0x0","nonce":"0x0","code":"0x","address":"0x2cb215323857bec1c91e5db10fe87379a5cf129a"},"0xc5091450b7548b0dce3a76b8d325929c39e648d1":{"balance":"0x0","nonce":"0x0","code":"0x","address":"0xc5091450b7548b0dce3a76b8d325929c39e648d1"}},"transactions":[],"selectedAddress":"0x843963b837841dad3b0f5969ff271108776616df","network":"2","isDisclaimerConfirmed":true,"unconfMsgs":{},"messages":[],"provider":{"type":"testnet"},"selectedAddress":"0x843963b837841dad3b0f5969ff271108776616df"},"appState":{"menuOpen":false,"currentView":{"name":"accountDetail"},"accountDetail":{"subview":"transactions","accountExport":"none","privateKey":""},"currentDomain":"testfaucet.metamask.io","transForward":false,"isLoading":false,"warning":null,"scrollToBottom":false},"identities":{}}},{"new vault":{"metamask":{"isInitialized":false,"isUnlocked":false,"currentDomain":"example.com","rpcTarget":"https://rawtestrpc.metamask.io/","identities":{},"unconfTxs":{},"accounts":{},"transactions":[],"network":"2","seedWords":null,"isDisclaimerConfirmed":false,"unconfMsgs":{},"messages":[],"provider":{"type":"testnet"}},"appState":{"menuOpen":false,"currentView":{"name":"accounts","detailView":null},"accountDetail":{"subview":"transactions"},"currentDomain":"extensions","transForward":true,"isLoading":false,"warning":null},"identities":{}}},{"show seed words":{"metamask":{"isInitialized":false,"isUnlocked":true,"currentDomain":"example.com","rpcTarget":"https://rawtestrpc.metamask.io/","identities":{"0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc":{"name":"Wallet 1","address":"0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc","mayBeFauceting":false},"0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b":{"name":"Wallet 2","address":"0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b","mayBeFauceting":false},"0xeb9e64b93097bc15f01f13eae97015c57ab64823":{"name":"Wallet 3","address":"0xeb9e64b93097bc15f01f13eae97015c57ab64823","mayBeFauceting":false}},"unconfTxs":{},"accounts":{"0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc":{"balance":"0x0","nonce":"0x0","code":"0x","address":"0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc"},"0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b":{"balance":"0x0","nonce":"0x0","code":"0x","address":"0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b"},"0xeb9e64b93097bc15f01f13eae97015c57ab64823":{"balance":"0x0","nonce":"0x0","code":"0x","address":"0xeb9e64b93097bc15f01f13eae97015c57ab64823"}},"transactions":[],"network":"2","seedWords":"debris dizzy just program just float decrease vacant alarm reduce speak stadium","isDisclaimerConfirmed":false,"unconfMsgs":{},"messages":[],"provider":{"type":"testnet"}},"appState":{"menuOpen":false,"currentView":{"name":"createVaultComplete","seedWords":"debris dizzy just program just float decrease vacant alarm reduce speak stadium"},"accountDetail":{"subview":"transactions"},"currentDomain":"extensions","transForward":true,"isLoading":false,"warning":null},"identities":{}}},{"terms":{"metamask":{"accounts":{},"transactions":[],"identities":{},"network":"2","isInitialized":false,"isUnlocked":false,"seedWords":null,"isDisclaimerConfirmed":false,"unconfTxs":{},"unconfMsgs":{},"messages":[],"provider":{"type":"testnet"}},"appState":{"currentDomain":"extensions"}}}] \ No newline at end of file diff --git a/development/states/account-detail-with-shapeshift-tx.json b/development/states/account-detail-with-shapeshift-tx.json deleted file mode 100644 index 97d5e9f06e80..000000000000 --- a/development/states/account-detail-with-shapeshift-tx.json +++ /dev/null @@ -1,162 +0,0 @@ -{ - "metamask": { - "currentCurrency": "USD", - "conversionRate": 11.06608791, - "conversionDate": 1470421024, - "isInitialized": true, - "isUnlocked": true, - "currentDomain": "example.com", - "rpcTarget": "https://rawtestrpc.metamask.io/", - "shapeShiftTxList":[ - { - "depositAddress": "1L8BJCR6KHkCiVceDqibt7zJscqPpH7pFw", - "depositType": "BTC", - "key": "shapeshift", - "time": 1471564825772, - "response": { - "status": "complete", - "outgoingCoin": "100.00", - "incomingCoin": "1.000", - "transaction": "0x3701e0ac344a12a1fc5417cf251109a7c41f3edab922310202630d9c012414c8" - } - }, - { - "depositAddress": "1L8BJCR6KHkCiVceDqibt7zJscqPpH7pFw", - "depositType": "BTC", - "key": "shapeshift", - "time": 1471566579224, - "response": { - "status": "no_deposits", - "depositAddress": "1L8BJCR6KHkCiVceDqibt7zJscqPpH7pFw" - } - }, - { - "depositAddress": "1L8BJCR6KHkCiVceDqibt7zJscqPpH7pFw", - "depositType": "BTC", - "key": "shapeshift", - "time": 1471566565378, - "response": { - "status": "received", - "depositAddress": "1L8BJCR6KHkCiVceDqibt7zJscqPpH7pFw" - } - } - ], - "transactions": [ { - "id": 1467921503489592, - "txParams": { - "from": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", - "to": "0x18a3462427bcc9133bb46e88bcbe39cd7ef0e761", - "value": "0x66c899104aa57038000", - "origin": "thelongestdomainnameintheworldandthensomeandthensomemoreandmore.com", - "metamaskId": 1467921503489592, - "metamaskNetworkId": "2" - }, - "time": 1467921503489, - "status": "rejected", - "containsDelegateCall": false - }, - { - "id": 1467923203344608, - "txParams": { - "from": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", - "to": "0x18a3462427bcc9133bb46e88bcbe39cd7ef0e761", - "value": "0x0", - "origin": "thelongestdomainnameintheworldandthensomeandthensomemoreandmore.com", - "metamaskId": 1467923203344608, - "metamaskNetworkId": "2" - }, - "time": 1467923203344, - "status": "confirmed", - "containsDelegateCall": false, - "hash": "0x957bbba51e2732a86c10c5e7e8a484a093795a06f2e2c38ad02da1b20aeca620" - }, - { - "id": 1467921503489592, - "txParams": { - "from": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", - "to": "0x18a3462427bcc9133bb46e88bcbe39cd7ef0e761", - "value": "0x66c899104aa57038000", - "origin": "thelongestdomainnameintheworldandthensomeandthensomemoreandmore.com", - "metamaskId": 1467921503489592, - "metamaskNetworkId": "2" - }, - "time": 1467921503489, - "status": "confirmed", - "containsDelegateCall": false - }], - "identities": { - "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc": { - "name": "Wallet 1", - "address": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", - "mayBeFauceting": false - }, - "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b": { - "name": "Wallet 2", - "address": "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b", - "mayBeFauceting": false - }, - "0xeb9e64b93097bc15f01f13eae97015c57ab64823": { - "name": "Wallet 3", - "address": "0xeb9e64b93097bc15f01f13eae97015c57ab64823", - "mayBeFauceting": false - }, - "0x704107d04affddd9b66ab9de3dd7b095852e9b69": { - "name": "Wallet 4", - "address": "0x704107d04affddd9b66ab9de3dd7b095852e9b69", - "mayBeFauceting": false - } - }, - "unconfTxs": {}, - "accounts": { - "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc" - }, - "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b": { - "code": "0x", - "nonce": "0x0", - "balance": "0x0", - "address": "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b" - }, - "0xeb9e64b93097bc15f01f13eae97015c57ab64823": { - "code": "0x", - "nonce": "0x0", - "balance": "0x0", - "address": "0xeb9e64b93097bc15f01f13eae97015c57ab64823" - }, - "0x704107d04affddd9b66ab9de3dd7b095852e9b69": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0x704107d04affddd9b66ab9de3dd7b095852e9b69" - } - }, - "selectedAddress": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", - "network": "1", - "seedWords": null, - "unconfMsgs": {}, - "messages": [], - "provider": { - "type": "mainnet" - }, - "selectedAddress": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc" - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "accountDetail", - "detailView": null, - "context": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc" - }, - "accountDetail": { - "subview": "transactions" - }, - "currentDomain": "127.0.0.1:9966", - "transForward": true, - "isLoading": false, - "warning": null - }, - "identities": {} -} diff --git a/development/states/account-detail-with-transaction-history.json b/development/states/account-detail-with-transaction-history.json deleted file mode 100644 index a6bcc2658b24..000000000000 --- a/development/states/account-detail-with-transaction-history.json +++ /dev/null @@ -1,128 +0,0 @@ -{ - "metamask": { - "currentCurrency": "USD", - "conversionRate": 11.06608791, - "conversionDate": 1470421024, - "isInitialized": true, - "isUnlocked": true, - "currentDomain": "example.com", - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc": { - "name": "Wallet 1", - "address": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", - "mayBeFauceting": false - }, - "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b": { - "name": "Wallet 2", - "address": "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b", - "mayBeFauceting": false - }, - "0xeb9e64b93097bc15f01f13eae97015c57ab64823": { - "name": "Wallet 3", - "address": "0xeb9e64b93097bc15f01f13eae97015c57ab64823", - "mayBeFauceting": false - }, - "0x704107d04affddd9b66ab9de3dd7b095852e9b69": { - "name": "Wallet 4", - "address": "0x704107d04affddd9b66ab9de3dd7b095852e9b69", - "mayBeFauceting": false - } - }, - "unconfTxs": {}, - "accounts": { - "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc" - }, - "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b": { - "code": "0x", - "nonce": "0x0", - "balance": "0x0", - "address": "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b" - }, - "0xeb9e64b93097bc15f01f13eae97015c57ab64823": { - "code": "0x", - "nonce": "0x0", - "balance": "0x0", - "address": "0xeb9e64b93097bc15f01f13eae97015c57ab64823" - }, - "0x704107d04affddd9b66ab9de3dd7b095852e9b69": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0x704107d04affddd9b66ab9de3dd7b095852e9b69" - } - }, - "transactions": [ { - "id": 1467921503489592, - "txParams": { - "from": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", - "to": "0x18a3462427bcc9133bb46e88bcbe39cd7ef0e761", - "value": "0x66c899104aa57038000", - "origin": "thelongestdomainnameintheworldandthensomeandthensomemoreandmore.com", - "metamaskId": 1467921503489592, - "metamaskNetworkId": "2" - }, - "time": 1467921503489, - "status": "rejected", - "containsDelegateCall": false - }, - { - "id": 1467923203344608, - "txParams": { - "from": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", - "to": "0x18a3462427bcc9133bb46e88bcbe39cd7ef0e761", - "value": "0x0", - "origin": "thelongestdomainnameintheworldandthensomeandthensomemoreandmore.com", - "metamaskId": 1467923203344608, - "metamaskNetworkId": "2" - }, - "time": 1467923203344, - "status": "confirmed", - "containsDelegateCall": false, - "hash": "0x957bbba51e2732a86c10c5e7e8a484a093795a06f2e2c38ad02da1b20aeca620" - }, - { - "id": 1467921503489592, - "txParams": { - "from": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", - "to": "0x18a3462427bcc9133bb46e88bcbe39cd7ef0e761", - "value": "0x66c899104aa57038000", - "origin": "thelongestdomainnameintheworldandthensomeandthensomemoreandmore.com", - "metamaskId": 1467921503489592, - "metamaskNetworkId": "2" - }, - "time": 1467921503489, - "status": "confirmed", - "containsDelegateCall": false - }], - "selectedAddress": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", - "network": "2", - "seedWords": null, - "unconfMsgs": {}, - "messages": [], - "provider": { - "type": "testnet" - }, - "selectedAddress": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc" - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "accountDetail", - "detailView": null, - "context": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc" - }, - "accountDetail": { - "subview": "transactions" - }, - "currentDomain": "127.0.0.1:9966", - "transForward": true, - "isLoading": false, - "warning": null - }, - "identities": {} -} diff --git a/development/states/account-detail.json b/development/states/account-detail.json deleted file mode 100644 index 6d11c1deba3d..000000000000 --- a/development/states/account-detail.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "metamask": { - "currentCurrency": "USD", - "conversionRate": 11.06608791, - "conversionDate": 1470421024, - "isInitialized": true, - "isUnlocked": true, - "currentDomain": "example.com", - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc": { - "name": "Wallet 1", - "address": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", - "mayBeFauceting": false - }, - "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b": { - "name": "Wallet 2", - "address": "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b", - "mayBeFauceting": false - }, - "0xeb9e64b93097bc15f01f13eae97015c57ab64823": { - "name": "Wallet 3", - "address": "0xeb9e64b93097bc15f01f13eae97015c57ab64823", - "mayBeFauceting": false - }, - "0x704107d04affddd9b66ab9de3dd7b095852e9b69": { - "name": "Wallet 4", - "address": "0x704107d04affddd9b66ab9de3dd7b095852e9b69", - "mayBeFauceting": false - } - }, - "unconfTxs": {}, - "accounts": { - "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc": { - "code": "0x", - "balance": "0x100000000000", - "nonce": "0x0", - "address": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc" - }, - "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b": { - "code": "0x", - "nonce": "0x0", - "balance": "0x100000000000", - "address": "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b" - }, - "0xeb9e64b93097bc15f01f13eae97015c57ab64823": { - "code": "0x", - "nonce": "0x0", - "balance": "0x100000000000", - "address": "0xeb9e64b93097bc15f01f13eae97015c57ab64823" - }, - "0x704107d04affddd9b66ab9de3dd7b095852e9b69": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0x704107d04affddd9b66ab9de3dd7b095852e9b69" - } - }, - "transactions": [], - "selectedAddress": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", - "network": "2", - "seedWords": null, - "unconfMsgs": {}, - "messages": [], - "provider": { - "type": "testnet" - }, - "selectedAddress": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc" - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "accountDetail", - "detailView": null, - "context": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc" - }, - "accountDetail": { - "subview": "transactions" - }, - "currentDomain": "127.0.0.1:9966", - "transForward": true, - "isLoading": false, - "warning": null - }, - "identities": {} -} diff --git a/development/states/account-list-with-imported.json b/development/states/account-list-with-imported.json deleted file mode 100644 index 41d586db62f7..000000000000 --- a/development/states/account-list-with-imported.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "metamask": { - "isInitialized": true, - "isUnlocked": true, - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0x58bda1f9d87dc7d2bcc6f7c2513efc9d03fca683": { - "address": "0x58bda1f9d87dc7d2bcc6f7c2513efc9d03fca683", - "name": "Account 1" - }, - "0x9858e7d8b79fc3e6d989636721584498926da38a": { - "address": "0x9858e7d8b79fc3e6d989636721584498926da38a", - "name": "Imported Account" - } - }, - "unconfTxs": {}, - "currentCurrency": "USD", - "conversionRate": 10.19458075, - "conversionDate": 1484696373, - "noActiveNotices": true, - "network": "3", - "accounts": { - "0x58bda1f9d87dc7d2bcc6f7c2513efc9d03fca683": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0x58bda1f9d87dc7d2bcc6f7c2513efc9d03fca683" - }, - "0x9858e7d8b79fc3e6d989636721584498926da38a": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0x9858e7d8b79fc3e6d989636721584498926da38a" - } - }, - "transactions": [], - "provider": { - "type": "testnet" - }, - "selectedAddress": "0x9858e7d8b79fc3e6d989636721584498926da38a", - "selectedAccountTxList": [], - "unconfMsgs": {}, - "messages": [], - "shapeShiftTxList": [], - "keyringTypes": [ - "Simple Key Pair", - "HD Key Tree" - ], - "keyrings": [ - { - "type": "HD Key Tree", - "accounts": [ - "58bda1f9d87dc7d2bcc6f7c2513efc9d03fca683" - ] - }, - { - "type": "Simple Key Pair", - "accounts": [ - "0x9858e7d8b79fc3e6d989636721584498926da38a" - ] - } - ], - "lostAccounts": [], - "seedWords": null - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "accounts" - }, - "accountDetail": { - "subview": "transactions", - "accountExport": "none", - "privateKey": "" - }, - "transForward": true, - "isLoading": false, - "warning": null, - "scrollToBottom": false, - "forgottenPassword": false - }, - "identities": {} -} diff --git a/development/states/accounts-loose.json b/development/states/accounts-loose.json deleted file mode 100644 index df51f0d7e685..000000000000 --- a/development/states/accounts-loose.json +++ /dev/null @@ -1,125 +0,0 @@ -{ - "metamask": { - "isInitialized": true, - "isUnlocked": true, - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0xac39b311dceb2a4b2f5d8461c1cdaf756f4f7ae9": { - "address": "0xac39b311dceb2a4b2f5d8461c1cdaf756f4f7ae9", - "name": "Account 1" - }, - "0xd7c0cd9e7d2701c710d64fc492c7086679bdf7b4": { - "address": "0xd7c0cd9e7d2701c710d64fc492c7086679bdf7b4", - "name": "Account 2" - }, - "0x1acfb961c5a8268eac8e09d6241a26cbeff42241": { - "address": "0x1acfb961c5a8268eac8e09d6241a26cbeff42241", - "name": "Account 3" - }, - "0xe15d894becb0354c501ae69429b05143679f39e0": { - "address": "0xe15d894becb0354c501ae69429b05143679f39e0", - "name": "Account 4" - }, - "0x87658c15aefe7448008a28513a11b6b130ef4cd0": { - "address": "0x87658c15aefe7448008a28513a11b6b130ef4cd0", - "name": "Account 5" - }, - "0xaa25854c0379e53c957ac9382e720c577fa31fd5": { - "address": "0xaa25854c0379e53c957ac9382e720c577fa31fd5", - "name": "Account 6" - } - }, - "unconfTxs": {}, - "currentCurrency": "USD", - "conversionRate": 0, - "conversionDate": "N/A", - "noActiveNotices": true, - "network": "3", - "accounts": { - "0xac39b311dceb2a4b2f5d8461c1cdaf756f4f7ae9": { - "code": "0x", - "balance": "0x11f646fe14c9c000", - "nonce": "0x3", - "address": "0xac39b311dceb2a4b2f5d8461c1cdaf756f4f7ae9" - }, - "0xd7c0cd9e7d2701c710d64fc492c7086679bdf7b4": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0xd7c0cd9e7d2701c710d64fc492c7086679bdf7b4" - }, - "0x1acfb961c5a8268eac8e09d6241a26cbeff42241": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0x1acfb961c5a8268eac8e09d6241a26cbeff42241" - }, - "0xe15d894becb0354c501ae69429b05143679f39e0": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0xe15d894becb0354c501ae69429b05143679f39e0" - }, - "0x87658c15aefe7448008a28513a11b6b130ef4cd0": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0x87658c15aefe7448008a28513a11b6b130ef4cd0" - }, - "0xaa25854c0379e53c957ac9382e720c577fa31fd5": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0xaa25854c0379e53c957ac9382e720c577fa31fd5" - } - }, - "transactions": [], - "provider": { - "type": "testnet" - }, - "selectedAddress": "0x87658c15aefe7448008a28513a11b6b130ef4cd0", - "unconfMsgs": {}, - "messages": [], - "shapeShiftTxList": [], - "keyringTypes": [ - "Simple Key Pair", - "HD Key Tree" - ], - "keyrings": [ - { - "type": "HD Key Tree", - "accounts": [ - "ac39b311dceb2a4b2f5d8461c1cdaf756f4f7ae9", - "d7c0cd9e7d2701c710d64fc492c7086679bdf7b4", - "1acfb961c5a8268eac8e09d6241a26cbeff42241" - ] - }, - { - "type": "Simple Key Pair", - "accounts": [ - "e15d894becb0354c501ae69429b05143679f39e0", - "87658c15aefe7448008a28513a11b6b130ef4cd0", - "aa25854c0379e53c957ac9382e720c577fa31fd5" - ] - } - ], - "lostAccounts": [] - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "accounts" - }, - "accountDetail": { - "subview": "transactions", - "accountExport": "none", - "privateKey": "" - }, - "transForward": true, - "isLoading": false, - "warning": null, - "scrollToBottom": false, - "forgottenPassword": false - }, - "identities": {} -} diff --git a/development/states/accounts.json b/development/states/accounts.json deleted file mode 100644 index c8ff40ed9cf3..000000000000 --- a/development/states/accounts.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "metamask": { - "isInitialized": true, - "isUnlocked": true, - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0x0abdd95cafcabec9b3e99dcd09fc4b441037cb80": { - "name": "Wallet 1", - "address": "0x0abdd95cafcabec9b3e99dcd09fc4b441037cb80", - "mayBeFauceting": false - }, - "0xc4692812f03d96edf4ac88c9d08106222578407b": { - "name": "Wallet 2", - "address": "0xc4692812f03d96edf4ac88c9d08106222578407b", - "mayBeFauceting": false - }, - "0x1abda824194d3583509c97e6faefd575e194844d": { - "name": "Wallet 3", - "address": "0x1abda824194d3583509c97e6faefd575e194844d", - "mayBeFauceting": false - }, - "0xa7ea108f933abe81ddafc0b2279b1d828dd0e8d6": { - "name": "Wallet 4", - "address": "0xa7ea108f933abe81ddafc0b2279b1d828dd0e8d6", - "mayBeFauceting": false - }, - "0xab64bed4528feed6a85ab3f3da91479954da9e46": { - "name": "Wallet 5", - "address": "0xab64bed4528feed6a85ab3f3da91479954da9e46", - "mayBeFauceting": false - }, - "0x69e90083dabd9acc9ea6d706eb6dccf245ae4d6b": { - "name": "Wallet 6", - "address": "0x69e90083dabd9acc9ea6d706eb6dccf245ae4d6b", - "mayBeFauceting": false - }, - "0xebcc86684ef70e0ec3ad85f996b22e1bdad2d024": { - "name": "Wallet 7", - "address": "0xebcc86684ef70e0ec3ad85f996b22e1bdad2d024", - "mayBeFauceting": false - } - }, - "unconfTxs": {}, - "currentCurrency": "USD", - "conversionRate": 11.84461814, - "conversionDate": 1476226414, - "accounts": { - "0x0abdd95cafcabec9b3e99dcd09fc4b441037cb80": { - "balance": "0x0de0b6b3a7640000", - "nonce": "0x100000", - "code": "0x", - "address": "0x0abdd95cafcabec9b3e99dcd09fc4b441037cb80" - }, - "0xc4692812f03d96edf4ac88c9d08106222578407b": { - "balance": "0x00", - "nonce": "0x100000", - "code": "0x", - "address": "0xc4692812f03d96edf4ac88c9d08106222578407b" - }, - "0x1abda824194d3583509c97e6faefd575e194844d": { - "balance": "0x00", - "nonce": "0x100000", - "code": "0x", - "address": "0x1abda824194d3583509c97e6faefd575e194844d" - }, - "0xa7ea108f933abe81ddafc0b2279b1d828dd0e8d6": { - "balance": "0x00", - "nonce": "0x100000", - "code": "0x", - "address": "0xa7ea108f933abe81ddafc0b2279b1d828dd0e8d6" - }, - "0xab64bed4528feed6a85ab3f3da91479954da9e46": { - "balance": "0x00", - "nonce": "0x100000", - "code": "0x", - "address": "0xab64bed4528feed6a85ab3f3da91479954da9e46" - }, - "0x69e90083dabd9acc9ea6d706eb6dccf245ae4d6b": { - "balance": "0x00", - "nonce": "0x100000", - "code": "0x", - "address": "0x69e90083dabd9acc9ea6d706eb6dccf245ae4d6b" - }, - "0xebcc86684ef70e0ec3ad85f996b22e1bdad2d024": { - "balance": "0x00", - "nonce": "0x100000", - "code": "0x", - "address": "0xebcc86684ef70e0ec3ad85f996b22e1bdad2d024" - } - }, - "transactions": [], - "network": "2", - "unconfMsgs": {}, - "messages": [], - "shapeShiftTxList": [], - "provider": { - "type": "testnet" - }, - "selectedAddress": "0x0abdd95cafcabec9b3e99dcd09fc4b441037cb80", - "seedWords": null - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "accounts" - }, - "accountDetail": { - "subview": "transactions" - }, - "transForward": true, - "isLoading": false, - "warning": null, - "scrollToBottom": true - }, - "identities": {} -} diff --git a/development/states/add-token.json b/development/states/add-token.json deleted file mode 100644 index 6de25664a4d2..000000000000 --- a/development/states/add-token.json +++ /dev/null @@ -1,138 +0,0 @@ -{ - "metamask": { - "isInitialized": true, - "isUnlocked": true, - "featureFlags": {"betaUI": true}, - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "name": "Send Account 1" - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "name": "Send Account 2" - }, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { - "address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d", - "name": "Send Account 3" - }, - "0xd85a4b6a394794842887b8284293d69163007bbb": { - "address": "0xd85a4b6a394794842887b8284293d69163007bbb", - "name": "Send Account 4" - } - }, - "unapprovedTxs": {}, - "conversionRate": 1200.88200327, - "conversionDate": 1489013762, - "noActiveNotices": true, - "frequentRpcList": [], - "network": "3", - "accounts": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "code": "0x", - "balance": "0x47c9d71831c76efe", - "nonce": "0x1b", - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "code": "0x", - "balance": "0x37452b1315889f80", - "nonce": "0xa", - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb" - }, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { - "code": "0x", - "balance": "0x30c9d71831c76efe", - "nonce": "0x1c", - "address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d" - }, - "0xd85a4b6a394794842887b8284293d69163007bbb": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0xd85a4b6a394794842887b8284293d69163007bbb" - } - }, - "addressBook": [ - { - "address": "0x06195827297c7a80a443b6894d3bdb8824b43896", - "name": "Address Book Account 1" - } - ], - "tokens": [], - "transactions": {}, - "selectedAddressTxList": [], - "unapprovedMsgs": {}, - "unapprovedMsgCount": 0, - "unapprovedPersonalMsgs": {}, - "unapprovedPersonalMsgCount": 0, - "keyringTypes": [ - "Simple Key Pair", - "HD Key Tree" - ], - "keyrings": [ - { - "type": "HD Key Tree", - "accounts": [ - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d" - ] - }, - { - "type": "Simple Key Pair", - "accounts": [ - "0xd85a4b6a394794842887b8284293d69163007bbb" - ] - } - ], - "selectedAddress": "0xd85a4b6a394794842887b8284293d69163007bbb", - "currentCurrency": "USD", - "provider": { - "type": "testnet" - }, - "shapeShiftTxList": [], - "lostAccounts": [], - "send": { - "gasLimit": null, - "gasPrice": null, - "gasTotal": "0xb451dc41b578", - "tokenBalance": null, - "from": "", - "to": "", - "amount": "0x0", - "memo": "", - "errors": {}, - "warnings": {}, - "maxModeOn": false, - "editingTransactionId": null - }, - "currentLocale": "en", - "preferences": { - "useNativeCurrencyAsPrimaryCurrency": true - } - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "accountDetail", - "detailView": null, - "context": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc" - }, - "accountDetail": { - "subview": "transactions" - }, - "modal": { - "modalState": {}, - "previousModalState": {} - }, - "sidebar": {}, - "transForward": true, - "isLoading": false, - "warning": null, - "scrollToBottom": false, - "forgottenPassword": null - }, - "identities": {} -} diff --git a/development/states/compilation-bug.json b/development/states/compilation-bug.json deleted file mode 100644 index 588d069d4966..000000000000 --- a/development/states/compilation-bug.json +++ /dev/null @@ -1,123 +0,0 @@ -{ - "metamask": { - "isInitialized": true, - "isUnlocked": true, - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0xac39b311dceb2a4b2f5d8461c1cdaf756f4f7ae9": { - "address": "0xac39b311dceb2a4b2f5d8461c1cdaf756f4f7ae9", - "name": "Account 1" - }, - "0xd7c0cd9e7d2701c710d64fc492c7086679bdf7b4": { - "address": "0xd7c0cd9e7d2701c710d64fc492c7086679bdf7b4", - "name": "Account 2" - }, - "0x1acfb961c5a8268eac8e09d6241a26cbeff42241": { - "address": "0x1acfb961c5a8268eac8e09d6241a26cbeff42241", - "name": "Account 3" - }, - "0xabc2bca51709b8615147352c62420f547a63a00c": { - "address": "0xabc2bca51709b8615147352c62420f547a63a00c", - "name": "Account 4" - } - }, - "unconfTxs": { - "7992944905869041": { - "id": 7992944905869041, - "txParams": { - "from": "0xac39b311dceb2a4b2f5d8461c1cdaf756f4f7ae9", - "value": "0x0", - "data": "0x606060405234610000575b60da806100186000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630dbe671f14603c575b6000565b3460005760466088565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a72305820a99dfa6091771f518dd1ae8d1ee347bae3304dffd98fd24b1b99a8380bc60a750029", - "gas": "0x1af75", - "metamaskId": 7992944905869041, - "metamaskNetworkId": "3" - }, - "time": 1482279685589, - "status": "unconfirmed", - "gasMultiplier": 1, - "metamaskNetworkId": "3", - "gasLimitSpecified": true, - "estimatedGas": "0x1af75", - "simulationFails": true - } - }, - "currentCurrency": "USD", - "conversionRate": 7.69158136, - "conversionDate": 1482279663, - "noActiveNotices": true, - "network": "3", - "accounts": { - "0xac39b311dceb2a4b2f5d8461c1cdaf756f4f7ae9": { - "code": "0x", - "nonce": "0x3", - "balance": "0x11f646fe14c9c000", - "address": "0xac39b311dceb2a4b2f5d8461c1cdaf756f4f7ae9" - }, - "0xd7c0cd9e7d2701c710d64fc492c7086679bdf7b4": { - "code": "0x", - "nonce": "0x0", - "balance": "0x0", - "address": "0xd7c0cd9e7d2701c710d64fc492c7086679bdf7b4" - }, - "0x1acfb961c5a8268eac8e09d6241a26cbeff42241": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0x1acfb961c5a8268eac8e09d6241a26cbeff42241" - }, - "0xabc2bca51709b8615147352c62420f547a63a00c": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0xabc2bca51709b8615147352c62420f547a63a00c" - } - }, - "transactions": [ - { - "id": 7992944905869041, - "txParams": { - "from": "0xac39b311dceb2a4b2f5d8461c1cdaf756f4f7ae9", - "value": "0x0", - "data": "0x606060405234610000575b60da806100186000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630dbe671f14603c575b6000565b3460005760466088565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a72305820a99dfa6091771f518dd1ae8d1ee347bae3304dffd98fd24b1b99a8380bc60a750029", - "gas": "0x1af75", - "metamaskId": 7992944905869041, - "metamaskNetworkId": "3" - }, - "time": 1482279685589, - "status": "unconfirmed", - "gasMultiplier": 1, - "metamaskNetworkId": "3", - "gasLimitSpecified": true, - "estimatedGas": "0x1af75", - "simulationFails": true - } - ], - "provider": { - "type": "testnet" - }, - "selectedAddress": "0xac39b311dceb2a4b2f5d8461c1cdaf756f4f7ae9", - "seedWords": false, - "unconfMsgs": {}, - "messages": [], - "shapeShiftTxList": [], - "keyringTypes": [ - "Simple Key Pair", - "HD Key Tree" - ], - "lostAccounts": [] - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "confTx", - "context": 0 - }, - "accountDetail": { - "subview": "transactions" - }, - "transForward": true, - "isLoading": false, - "warning": null - }, - "identities": {} -} diff --git a/development/states/conf-tx.json b/development/states/conf-tx.json deleted file mode 100644 index 7b278f3311d8..000000000000 --- a/development/states/conf-tx.json +++ /dev/null @@ -1,212 +0,0 @@ -{ - "metamask": { - "isInitialized": true, - "isUnlocked": true, - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "name": "Account 1" - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "name": "Account 2" - }, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { - "address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d", - "name": "Account 3" - }, - "0x18c643c9cf21027339c8648fbaa2f348ddcbe00a": { - "address": "0x18c643c9cf21027339c8648fbaa2f348ddcbe00a", - "name": "Account 4" - }, - "0x9858e7d8b79fc3e6d989636721584498926da38a": { - "address": "0x9858e7d8b79fc3e6d989636721584498926da38a", - "name": "Account 5" - } - }, - "unapprovedTxs": { - "4768706228115573": { - "id": 4768706228115573, - "time": 1487363153561, - "status": "unapproved", - "gasMultiplier": 1, - "metamaskNetworkId": "3", - "txParams": { - "from": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "to": "0x18a3462427bcc9133bb46e88bcbe39cd7ef0e761", - "value": "0xde0b6b3a7640000", - "metamaskId": 4768706228115573, - "metamaskNetworkId": "3", - "gas": "0x5209" - }, - "gasLimitSpecified": false, - "estimatedGas": "0x5209", - "txFee": "17e0186e60800", - "txValue": "de0b6b3a7640000", - "maxCost": "de234b52e4a0800", - "gasPrice": "4a817c800" - } - }, - "currentCurrency": "USD", - "conversionRate": 12.7200827, - "conversionDate": 1487363041, - "noActiveNotices": true, - "nextUnreadNotice": { - "read": true, - "date": "Thu Feb 09 2017", - "title": "Terms of Use", - "body": "# Terms of Use #\n\n**THIS AGREEMENT IS SUBJECT TO BINDING ARBITRATION AND A WAIVER OF CLASS ACTION RIGHTS AS DETAILED IN SECTION 13. PLEASE READ THE AGREEMENT CAREFULLY.**\n\n_Our Terms of Use have been updated as of September 5, 2016_\n\n## 1. Acceptance of Terms ##\n\nMetaMask provides a platform for managing Ethereum (or \"ETH\") accounts, and allowing ordinary websites to interact with the Ethereum blockchain, while keeping the user in control over what transactions they approve, through our website located at[ ](http://metamask.io)[https://metamask.io/](https://metamask.io/) and browser plugin (the \"Site\") — which includes text, images, audio, code and other materials (collectively, the “Contentâ€) and all of the features, and services provided. The Site, and any other features, tools, materials, or other services offered from time to time by MetaMask are referred to here as the “Service.†Please read these Terms of Use (the “Terms†or “Terms of Useâ€) carefully before using the Service. By using or otherwise accessing the Services, or clicking to accept or agree to these Terms where that option is made available, you (1) accept and agree to these Terms (2) consent to the collection, use, disclosure and other handling of information as described in our Privacy Policy and (3) any additional terms, rules and conditions of participation issued by MetaMask from time to time. If you do not agree to the Terms, then you may not access or use the Content or Services.\n\n## 2. Modification of Terms of Use ##\n\nExcept for Section 13, providing for binding arbitration and waiver of class action rights, MetaMask reserves the right, at its sole discretion, to modify or replace the Terms of Use at any time. The most current version of these Terms will be posted on our Site. You shall be responsible for reviewing and becoming familiar with any such modifications. Use of the Services by you after any modification to the Terms constitutes your acceptance of the Terms of Use as modified.\n\n\n\n## 3. Eligibility ##\n\nYou hereby represent and warrant that you are fully able and competent to enter into the terms, conditions, obligations, affirmations, representations and warranties set forth in these Terms and to abide by and comply with these Terms.\n\nMetaMask is a global platform and by accessing the Content or Services, you are representing and warranting that, you are of the legal age of majority in your jurisdiction as is required to access such Services and Content and enter into arrangements as provided by the Service. You further represent that you are otherwise legally permitted to use the service in your jurisdiction including owning cryptographic tokens of value, and interacting with the Services or Content in any way. You further represent you are responsible for ensuring compliance with the laws of your jurisdiction and acknowledge that MetaMask is not liable for your compliance with such laws.\n\n## 4 Account Password and Security ##\n\nWhen setting up an account within MetaMask, you will be responsible for keeping your own account secrets, which may be a twelve-word seed phrase, an account file, or other locally stored secret information. MetaMask encrypts this information locally with a password you provide, that we never send to our servers. You agree to (a) never use the same password for MetaMask that you have ever used outside of this service; (b) keep your secret information and password confidential and do not share them with anyone else; (c) immediately notify MetaMask of any unauthorized use of your account or breach of security. MetaMask cannot and will not be liable for any loss or damage arising from your failure to comply with this section.\n\n## 5. Representations, Warranties, and Risks ##\n\n### 5.1. Warranty Disclaimer ###\n\nYou expressly understand and agree that your use of the Service is at your sole risk. The Service (including the Service and the Content) are provided on an \"AS IS\" and \"as available\" basis, without warranties of any kind, either express or implied, including, without limitation, implied warranties of merchantability, fitness for a particular purpose or non-infringement. You acknowledge that MetaMask has no control over, and no duty to take any action regarding: which users gain access to or use the Service; what effects the Content may have on you; how you may interpret or use the Content; or what actions you may take as a result of having been exposed to the Content. You release MetaMask from all liability for you having acquired or not acquired Content through the Service. MetaMask makes no representations concerning any Content contained in or accessed through the Service, and MetaMask will not be responsible or liable for the accuracy, copyright compliance, legality or decency of material contained in or accessed through the Service.\n\n### 5.2 Sophistication and Risk of Cryptographic Systems ###\n\nBy utilizing the Service or interacting with the Content or platform in any way, you represent that you understand the inherent risks associated with cryptographic systems; and warrant that you have an understanding of the usage and intricacies of native cryptographic tokens, like Ether (ETH) and Bitcoin (BTC), smart contract based tokens such as those that follow the Ethereum Token Standard (https://github.com/ethereum/EIPs/issues/20), and blockchain-based software systems.\n\n### 5.3 Risk of Regulatory Actions in One or More Jurisdictions ###\n\nMetaMask and ETH could be impacted by one or more regulatory inquiries or regulatory action, which could impede or limit the ability of MetaMask to continue to develop, or which could impede or limit your ability to access or use the Service or Ethereum blockchain.\n\n### 5.4 Risk of Weaknesses or Exploits in the Field of Cryptography ###\n\nYou acknowledge and understand that Cryptography is a progressing field. Advances in code cracking or technical advances such as the development of quantum computers may present risks to cryptocurrencies and Services of Content, which could result in the theft or loss of your cryptographic tokens or property. To the extent possible, MetaMask intends to update the protocol underlying Services to account for any advances in cryptography and to incorporate additional security measures, but does not guarantee or otherwise represent full security of the system. By using the Service or accessing Content, you acknowledge these inherent risks.\n\n### 5.5 Volatility of Crypto Currencies ###\n\nYou understand that Ethereum and other blockchain technologies and associated currencies or tokens are highly volatile due to many factors including but not limited to adoption, speculation, technology and security risks. You also acknowledge that the cost of transacting on such technologies is variable and may increase at any time causing impact to any activities taking place on the Ethereum blockchain. You acknowledge these risks and represent that MetaMask cannot be held liable for such fluctuations or increased costs.\n\n### 5.6 Application Security ###\n\nYou acknowledge that Ethereum applications are code subject to flaws and acknowledge that you are solely responsible for evaluating any code provided by the Services or Content and the trustworthiness of any third-party websites, products, smart-contracts, or Content you access or use through the Service. You further expressly acknowledge and represent that Ethereum applications can be written maliciously or negligently, that MetaMask cannot be held liable for your interaction with such applications and that such applications may cause the loss of property or even identity. This warning and others later provided by MetaMask in no way evidence or represent an on-going duty to alert you to all of the potential risks of utilizing the Service or Content.\n\n## 6. Indemnity ##\n\nYou agree to release and to indemnify, defend and hold harmless MetaMask and its parents, subsidiaries, affiliates and agencies, as well as the officers, directors, employees, shareholders and representatives of any of the foregoing entities, from and against any and all losses, liabilities, expenses, damages, costs (including attorneys’ fees and court costs) claims or actions of any kind whatsoever arising or resulting from your use of the Service, your violation of these Terms of Use, and any of your acts or omissions that implicate publicity rights, defamation or invasion of privacy. MetaMask reserves the right, at its own expense, to assume exclusive defense and control of any matter otherwise subject to indemnification by you and, in such case, you agree to cooperate with MetaMask in the defense of such matter.\n\n## 7. Limitation on liability ##\n\nYOU ACKNOWLEDGE AND AGREE THAT YOU ASSUME FULL RESPONSIBILITY FOR YOUR USE OF THE SITE AND SERVICE. YOU ACKNOWLEDGE AND AGREE THAT ANY INFORMATION YOU SEND OR RECEIVE DURING YOUR USE OF THE SITE AND SERVICE MAY NOT BE SECURE AND MAY BE INTERCEPTED OR LATER ACQUIRED BY UNAUTHORIZED PARTIES. YOU ACKNOWLEDGE AND AGREE THAT YOUR USE OF THE SITE AND SERVICE IS AT YOUR OWN RISK. RECOGNIZING SUCH, YOU UNDERSTAND AND AGREE THAT, TO THE FULLEST EXTENT PERMITTED BY APPLICABLE LAW, NEITHER METAMASK NOR ITS SUPPLIERS OR LICENSORS WILL BE LIABLE TO YOU FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY OR OTHER DAMAGES OF ANY KIND, INCLUDING WITHOUT LIMITATION DAMAGES FOR LOSS OF PROFITS, GOODWILL, USE, DATA OR OTHER TANGIBLE OR INTANGIBLE LOSSES OR ANY OTHER DAMAGES BASED ON CONTRACT, TORT, STRICT LIABILITY OR ANY OTHER THEORY (EVEN IF METAMASK HAD BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES), RESULTING FROM THE SITE OR SERVICE; THE USE OR THE INABILITY TO USE THE SITE OR SERVICE; UNAUTHORIZED ACCESS TO OR ALTERATION OF YOUR TRANSMISSIONS OR DATA; STATEMENTS OR CONDUCT OF ANY THIRD PARTY ON THE SITE OR SERVICE; ANY ACTIONS WE TAKE OR FAIL TO TAKE AS A RESULT OF COMMUNICATIONS YOU SEND TO US; HUMAN ERRORS; TECHNICAL MALFUNCTIONS; FAILURES, INCLUDING PUBLIC UTILITY OR TELEPHONE OUTAGES; OMISSIONS, INTERRUPTIONS, LATENCY, DELETIONS OR DEFECTS OF ANY DEVICE OR NETWORK, PROVIDERS, OR SOFTWARE (INCLUDING, BUT NOT LIMITED TO, THOSE THAT DO NOT PERMIT PARTICIPATION IN THE SERVICE); ANY INJURY OR DAMAGE TO COMPUTER EQUIPMENT; INABILITY TO FULLY ACCESS THE SITE OR SERVICE OR ANY OTHER WEBSITE; THEFT, TAMPERING, DESTRUCTION, OR UNAUTHORIZED ACCESS TO, IMAGES OR OTHER CONTENT OF ANY KIND; DATA THAT IS PROCESSED LATE OR INCORRECTLY OR IS INCOMPLETE OR LOST; TYPOGRAPHICAL, PRINTING OR OTHER ERRORS, OR ANY COMBINATION THEREOF; OR ANY OTHER MATTER RELATING TO THE SITE OR SERVICE.\n\nSOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF CERTAIN WARRANTIES OR THE LIMITATION OR EXCLUSION OF LIABILITY FOR INCIDENTAL OR CONSEQUENTIAL DAMAGES. ACCORDINGLY, SOME OF THE ABOVE LIMITATIONS MAY NOT APPLY TO YOU.\n\n## 8. Our Proprietary Rights ##\n\nAll title, ownership and intellectual property rights in and to the Service are owned by MetaMask or its licensors. You acknowledge and agree that the Service contains proprietary and confidential information that is protected by applicable intellectual property and other laws. Except as expressly authorized by MetaMask, you agree not to copy, modify, rent, lease, loan, sell, distribute, perform, display or create derivative works based on the Service, in whole or in part. MetaMask issues a license for MetaMask, found [here](https://github.com/MetaMask/metamask-plugin/blob/master/LICENSE). For information on other licenses utilized in the development of MetaMask, please see our attribution page at: [https://metamask.io/attributions.html](https://metamask.io/attributions.html)\n\n## 9. Links ##\n\nThe Service provides, or third parties may provide, links to other World Wide Web or accessible sites, applications or resources. Because MetaMask has no control over such sites, applications and resources, you acknowledge and agree that MetaMask is not responsible for the availability of such external sites, applications or resources, and does not endorse and is not responsible or liable for any content, advertising, products or other materials on or available from such sites or resources. You further acknowledge and agree that MetaMask shall not be responsible or liable, directly or indirectly, for any damage or loss caused or alleged to be caused by or in connection with use of or reliance on any such content, goods or services available on or through any such site or resource.\n\n## 10. Termination and Suspension ##\n\nMetaMask may terminate or suspend all or part of the Service and your MetaMask access immediately, without prior notice or liability, if you breach any of the terms or conditions of the Terms. Upon termination of your access, your right to use the Service will immediately cease.\n\nThe following provisions of the Terms survive any termination of these Terms: INDEMNITY; WARRANTY DISCLAIMERS; LIMITATION ON LIABILITY; OUR PROPRIETARY RIGHTS; LINKS; TERMINATION; NO THIRD PARTY BENEFICIARIES; BINDING ARBITRATION AND CLASS ACTION WAIVER; GENERAL INFORMATION.\n\n## 11. No Third Party Beneficiaries ##\n\nYou agree that, except as otherwise expressly provided in these Terms, there shall be no third party beneficiaries to the Terms.\n\n## 12. Notice and Procedure For Making Claims of Copyright Infringement ##\n\nIf you believe that your copyright or the copyright of a person on whose behalf you are authorized to act has been infringed, please provide MetaMask’s Copyright Agent a written Notice containing the following information:\n\n· an electronic or physical signature of the person authorized to act on behalf of the owner of the copyright or other intellectual property interest;\n\n· a description of the copyrighted work or other intellectual property that you claim has been infringed;\n\n· a description of where the material that you claim is infringing is located on the Service;\n\n· your address, telephone number, and email address;\n\n· a statement by you that you have a good faith belief that the disputed use is not authorized by the copyright owner, its agent, or the law;\n\n· a statement by you, made under penalty of perjury, that the above information in your Notice is accurate and that you are the copyright or intellectual property owner or authorized to act on the copyright or intellectual property owner's behalf.\n\nMetaMask’s Copyright Agent can be reached at:\n\nEmail: copyright [at] metamask [dot] io\n\nMail:\n\nAttention:\n\nMetaMask Copyright â„… ConsenSys\n\n49 Bogart Street\n\nBrooklyn, NY 11206\n\n## 13. Binding Arbitration and Class Action Waiver ##\n\nPLEASE READ THIS SECTION CAREFULLY – IT MAY SIGNIFICANTLY AFFECT YOUR LEGAL RIGHTS, INCLUDING YOUR RIGHT TO FILE A LAWSUIT IN COURT\n\n### 13.1 Initial Dispute Resolution ###\n\nThe parties shall use their best efforts to engage directly to settle any dispute, claim, question, or disagreement and engage in good faith negotiations which shall be a condition to either party initiating a lawsuit or arbitration.\n\n### 13.2 Binding Arbitration ###\n\nIf the parties do not reach an agreed upon solution within a period of 30 days from the time informal dispute resolution under the Initial Dispute Resolution provision begins, then either party may initiate binding arbitration as the sole means to resolve claims, subject to the terms set forth below. Specifically, all claims arising out of or relating to these Terms (including their formation, performance and breach), the parties’ relationship with each other and/or your use of the Service shall be finally settled by binding arbitration administered by the American Arbitration Association in accordance with the provisions of its Commercial Arbitration Rules and the supplementary procedures for consumer related disputes of the American Arbitration Association (the \"AAA\"), excluding any rules or procedures governing or permitting class actions.\n\nThe arbitrator, and not any federal, state or local court or agency, shall have exclusive authority to resolve all disputes arising out of or relating to the interpretation, applicability, enforceability or formation of these Terms, including, but not limited to any claim that all or any part of these Terms are void or voidable, or whether a claim is subject to arbitration. The arbitrator shall be empowered to grant whatever relief would be available in a court under law or in equity. The arbitrator’s award shall be written, and binding on the parties and may be entered as a judgment in any court of competent jurisdiction.\n\nThe parties understand that, absent this mandatory provision, they would have the right to sue in court and have a jury trial. They further understand that, in some instances, the costs of arbitration could exceed the costs of litigation and the right to discovery may be more limited in arbitration than in court.\n\n### 13.3 Location ###\n\nBinding arbitration shall take place in New York. You agree to submit to the personal jurisdiction of any federal or state court in New York County, New York, in order to compel arbitration, to stay proceedings pending arbitration, or to confirm, modify, vacate or enter judgment on the award entered by the arbitrator.\n\n### 13.4 Class Action Waiver ###\n\nThe parties further agree that any arbitration shall be conducted in their individual capacities only and not as a class action or other representative action, and the parties expressly waive their right to file a class action or seek relief on a class basis. YOU AND METAMASK AGREE THAT EACH MAY BRING CLAIMS AGAINST THE OTHER ONLY IN YOUR OR ITS INDIVIDUAL CAPACITY, AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED CLASS OR REPRESENTATIVE PROCEEDING. If any court or arbitrator determines that the class action waiver set forth in this paragraph is void or unenforceable for any reason or that an arbitration can proceed on a class basis, then the arbitration provision set forth above shall be deemed null and void in its entirety and the parties shall be deemed to have not agreed to arbitrate disputes.\n\n### 13.5 Exception - Litigation of Intellectual Property and Small Claims Court Claims ###\n\nNotwithstanding the parties' decision to resolve all disputes through arbitration, either party may bring an action in state or federal court to protect its intellectual property rights (\"intellectual property rights\" means patents, copyrights, moral rights, trademarks, and trade secrets, but not privacy or publicity rights). Either party may also seek relief in a small claims court for disputes or claims within the scope of that court’s jurisdiction.\n\n### 13.6 30-Day Right to Opt Out ###\n\nYou have the right to opt-out and not be bound by the arbitration and class action waiver provisions set forth above by sending written notice of your decision to opt-out to the following address: MetaMask â„… ConsenSys, 49 Bogart Street, Brooklyn NY 11206 and via email at support@metamask.io. The notice must be sent within 30 days of September 6, 2016 or your first use of the Service, whichever is later, otherwise you shall be bound to arbitrate disputes in accordance with the terms of those paragraphs. If you opt-out of these arbitration provisions, MetaMask also will not be bound by them.\n\n### 13.7 Changes to This Section ###\n\nMetaMask will provide 60-days’ notice of any changes to this section. Changes will become effective on the 60th day, and will apply prospectively only to any claims arising after the 60th day.\n\nFor any dispute not subject to arbitration you and MetaMask agree to submit to the personal and exclusive jurisdiction of and venue in the federal and state courts located in New York, New York. You further agree to accept service of process by mail, and hereby waive any and all jurisdictional and venue defenses otherwise available.\n\nThe Terms and the relationship between you and MetaMask shall be governed by the laws of the State of New York without regard to conflict of law provisions.\n\n## 14. General Information ##\n\n### 14.1 Entire Agreement ###\n\nThese Terms (and any additional terms, rules and conditions of participation that MetaMask may post on the Service) constitute the entire agreement between you and MetaMask with respect to the Service and supersedes any prior agreements, oral or written, between you and MetaMask. In the event of a conflict between these Terms and the additional terms, rules and conditions of participation, the latter will prevail over the Terms to the extent of the conflict.\n\n### 14.2 Waiver and Severability of Terms ###\n\nThe failure of MetaMask to exercise or enforce any right or provision of the Terms shall not constitute a waiver of such right or provision. If any provision of the Terms is found by an arbitrator or court of competent jurisdiction to be invalid, the parties nevertheless agree that the arbitrator or court should endeavor to give effect to the parties' intentions as reflected in the provision, and the other provisions of the Terms remain in full force and effect.\n\n### 14.3 Statute of Limitations ###\n\nYou agree that regardless of any statute or law to the contrary, any claim or cause of action arising out of or related to the use of the Service or the Terms must be filed within one (1) year after such claim or cause of action arose or be forever barred.\n\n### 14.4 Section Titles ###\n\nThe section titles in the Terms are for convenience only and have no legal or contractual effect.\n\n### 14.5 Communications ###\n\nUsers with questions, complaints or claims with respect to the Service may contact us using the relevant contact information set forth above and at communications@metamask.io.\n\n## 15 Related Links ##\n\n**[Terms of Use](https://metamask.io/terms.html)**\n\n**[Privacy](https://metamask.io/privacy.html)**\n\n**[Attributions](https://metamask.io/attributions.html)**\n\n", - "id": 0 - }, - "network": "3", - "accounts": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "code": "0x", - "nonce": "0x12", - "balance": "0x6ae7c45a61c0e8d2", - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "code": "0x", - "balance": "0x136b2c3ecfdb480", - "nonce": "0x2", - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb" - }, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d" - }, - "0x18c643c9cf21027339c8648fbaa2f348ddcbe00a": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0x18c643c9cf21027339c8648fbaa2f348ddcbe00a" - }, - "0x9858e7d8b79fc3e6d989636721584498926da38a": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0x9858e7d8b79fc3e6d989636721584498926da38a" - } - }, - "transactions": {}, - "selectedAddressTxList": [ - { - "id": 3870222542191014, - "time": 1487271497135, - "status": "confirmed", - "gasMultiplier": 1, - "metamaskNetworkId": "3", - "txParams": { - "from": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "to": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "value": "0x38d7ea4c68000", - "metamaskId": 3870222542191014, - "metamaskNetworkId": "3", - "gas": "0x5209", - "gasPrice": "0x458d0be6b8", - "nonce": "0x0", - "gasLimit": "0x5209" - }, - "gasLimitSpecified": false, - "estimatedGas": "0x5209", - "txFee": "17e0186e60800", - "txValue": "38d7ea4c68000", - "maxCost": "50b802bac8800", - "hash": "0x45daeb705b5b4dfeaddbd81efc95edfc8adbd229f8adbcb38f33cfc973dcc2ef" - }, - { - "id": 3870222542191015, - "time": 1487271512355, - "status": "confirmed", - "gasMultiplier": 1, - "metamaskNetworkId": "3", - "txParams": { - "from": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "to": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "value": "0x0", - "metamaskId": 3870222542191015, - "metamaskNetworkId": "3", - "gas": "0x5209", - "nonce": "0x01", - "gasPrice": "0x458d0be6b8", - "gasLimit": "0x5209" - }, - "gasLimitSpecified": false, - "estimatedGas": "0x5209", - "txFee": "17e0186e60800", - "txValue": "0", - "maxCost": "17e0186e60800", - "hash": "0x61581e70651fa917c0af0e8b3b2d2bdf7d4cee0f1925518a985ade0fd49b4fa8" - }, - { - "id": 4768706228115573, - "time": 1487363153561, - "status": "unapproved", - "gasMultiplier": 1, - "metamaskNetworkId": "3", - "txParams": { - "from": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "to": "0x18a3462427bcc9133bb46e88bcbe39cd7ef0e761", - "value": "0xde0b6b3a7640000", - "metamaskId": 4768706228115573, - "metamaskNetworkId": "3", - "gas": "0x5209" - }, - "gasLimitSpecified": false, - "estimatedGas": "0x5209", - "txFee": "17e0186e60800", - "txValue": "de0b6b3a7640000", - "maxCost": "de234b52e4a0800" - } - ], - "unapprovedMsgs": {}, - "unapprovedMsgCount": 0, - "keyringTypes": [ - "Simple Key Pair", - "HD Key Tree" - ], - "keyrings": [ - { - "type": "HD Key Tree", - "accounts": [ - "fdea65c8e26263f6d9a1b5de9555d2931a33b825", - "c5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "2f8d4a878cfa04a6e60d46362f5644deab66572d", - "18c643c9cf21027339c8648fbaa2f348ddcbe00a" - ] - }, - { - "type": "Simple Key Pair", - "accounts": [ - "0x9858e7d8b79fc3e6d989636721584498926da38a" - ] - } - ], - "selectedAddress": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "currentCurrency": "USD", - "provider": { - "type": "testnet" - }, - "shapeShiftTxList": [], - "lostAccounts": [], - "frequentRpcListDetail": [] - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "confTx", - "context": 0 - }, - "accountDetail": { - "subview": "transactions" - }, - "transForward": true, - "isLoading": false, - "warning": null - }, - "identities": {} -} diff --git a/development/states/config.json b/development/states/config.json deleted file mode 100644 index 551c0e3fad31..000000000000 --- a/development/states/config.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "metamask": { - "currentCurrency": "USD", - "conversionRate": 11.06608791, - "conversionDate": 1470421024, - "isInitialized": true, - "isUnlocked": true, - "currentDomain": "example.com", - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0x5f11b68b7d41633e74c6b18d8b8d147da52aedd6": { - "name": "Wallet 1", - "address": "0x5f11b68b7d41633e74c6b18d8b8d147da52aedd6", - "mayBeFauceting": false - }, - "0x843963b837841dad3b0f5969ff271108776616df": { - "name": "Wallet 2", - "address": "0x843963b837841dad3b0f5969ff271108776616df", - "mayBeFauceting": false - }, - "0x2cb215323857bec1c91e5db10fe87379a5cf129a": { - "name": "Wallet 3", - "address": "0x2cb215323857bec1c91e5db10fe87379a5cf129a", - "mayBeFauceting": false - }, - "0xc5091450b7548b0dce3a76b8d325929c39e648d1": { - "name": "Wallet 4", - "address": "0xc5091450b7548b0dce3a76b8d325929c39e648d1", - "mayBeFauceting": false - } - }, - "unconfTxs": {}, - "accounts": { - "0x5f11b68b7d41633e74c6b18d8b8d147da52aedd6": { - "balance": "0x0", - "nonce": "0x0", - "code": "0x", - "address": "0x5f11b68b7d41633e74c6b18d8b8d147da52aedd6" - }, - "0x843963b837841dad3b0f5969ff271108776616df": { - "balance": "0x0", - "nonce": "0x0", - "code": "0x", - "address": "0x843963b837841dad3b0f5969ff271108776616df" - }, - "0x2cb215323857bec1c91e5db10fe87379a5cf129a": { - "balance": "0x0", - "nonce": "0x0", - "code": "0x", - "address": "0x2cb215323857bec1c91e5db10fe87379a5cf129a" - }, - "0xc5091450b7548b0dce3a76b8d325929c39e648d1": { - "balance": "0x0", - "nonce": "0x0", - "code": "0x", - "address": "0xc5091450b7548b0dce3a76b8d325929c39e648d1" - } - }, - "transactions": [], - "network": "2", - "unconfMsgs": {}, - "messages": [], - "provider": { - "type": "testnet" - }, - "selectedAddress": "0x843963b837841dad3b0f5969ff271108776616df", - "seedWords": null - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "config" - }, - "accountDetail": { - "subview": "transactions", - "accountExport": "none", - "privateKey": "" - }, - "currentDomain": "testfaucet.metamask.io", - "transForward": true, - "isLoading": false, - "warning": null, - "scrollToBottom": true - }, - "identities": {} -} diff --git a/development/states/confirm-new-ui.json b/development/states/confirm-new-ui.json deleted file mode 100644 index c9340fc8f062..000000000000 --- a/development/states/confirm-new-ui.json +++ /dev/null @@ -1,502 +0,0 @@ -{ - "metamask": { - "isInitialized": true, - "isUnlocked": true, - "featureFlags": {"betaUI": true}, - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "name": "Send Account 1" - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "name": "Send Account 2" - }, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { - "address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d", - "name": "Send Account 3" - }, - "0xd85a4b6a394794842887b8284293d69163007bbb": { - "address": "0xd85a4b6a394794842887b8284293d69163007bbb", - "name": "Send Account 4" - } - }, - "unapprovedTxs": {}, - "currentCurrency": "USD", - "conversionRate": 1200.88200327, - "conversionDate": 1489013762, - "noActiveNotices": true, - "frequentRpcList": [], - "network": "3", - "accounts": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "code": "0x", - "balance": "0x47c9d71831c76efe", - "nonce": "0x1b", - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "code": "0x", - "balance": "0x37452b1315889f80", - "nonce": "0xa", - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb" - }, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { - "code": "0x", - "balance": "0x30c9d71831c76efe", - "nonce": "0x1c", - "address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d" - }, - "0xd85a4b6a394794842887b8284293d69163007bbb": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0xd85a4b6a394794842887b8284293d69163007bbb" - } - }, - "addressBook": [ - { - "address": "0x06195827297c7a80a443b6894d3bdb8824b43896", - "name": "Address Book Account 1" - } - ], - "tokens": [], - "transactions": {}, - "selectedAddressTxList": [], - "unapprovedTxs": { - "4768706228115573": { - "id": 4768706228115573, - "time": 1487363153561, - "status": "unapproved", - "gasMultiplier": 1, - "metamaskNetworkId": "3", - "txParams": { - "from": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "to": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d", - "value": "0x1bc16d674ec80000", - "metamaskId": 4768706228115573, - "metamaskNetworkId": "3", - "gas": "0xea60", - "gasPrice": "0xba43b7400" - } - } - }, - "unapprovedMsgs": {}, - "unapprovedMsgCount": 0, - "unapprovedPersonalMsgs": {}, - "unapprovedPersonalMsgCount": 0, - "keyringTypes": [ - "Simple Key Pair", - "HD Key Tree" - ], - "keyrings": [ - { - "type": "HD Key Tree", - "accounts": [ - "fdea65c8e26263f6d9a1b5de9555d2931a33b825", - "c5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "2f8d4a878cfa04a6e60d46362f5644deab66572d" - ] - }, - { - "type": "Simple Key Pair", - "accounts": [ - "0xd85a4b6a394794842887b8284293d69163007bbb" - ] - } - ], - "selectedAddress": "0xd85a4b6a394794842887b8284293d69163007bbb", - "currentCurrency": "USD", - "provider": { - "type": "testnet" - }, - "shapeShiftTxList": [], - "lostAccounts": [], - "send": { - "gasLimit": "0xea60", - "gasPrice": "0xba43b7400", - "gasTotal": "0xaa87bee538000", - "tokenBalance": null, - "from": { - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "balance": "0x37452b1315889f80" - }, - "to": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d", - "amount": "0x1bc16d674ec80000", - "memo": "", - "errors": {}, - "maxModeOn": false, - "editingTransactionId": null - }, - "currentLocale": "en", - "preferences": { - "useNativeCurrencyAsPrimaryCurrency": true, - "showFiatInTestnets": true - }, - "completedUiMigration": true, - "frequentRpcListDetail": [] - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "confTx", - "detailView": null, - "context": 0 - }, - "accountDetail": { - "subview": "transactions" - }, - "sidebar": {}, - "modal": { - "modalState": {}, - "previousModalState": {} - }, - "transForward": true, - "isLoading": false, - "warning": null, - "scrollToBottom": false, - "forgottenPassword": null - }, - "identities": {}, - "send": { - "fromDropdownOpen": false, - "toDropdownOpen": false, - "errors": {}, - "warnings": {} - }, - "confirmTransaction": { - "txData": {}, - "tokenData": {}, - "methodData": {}, - "tokenProps": { - "tokenDecimals": "", - "tokenSymbol": "" - }, - "fiatTransactionAmount": "", - "fiatTransactionFee": "", - "fiatTransactionTotal": "", - "ethTransactionAmount": "", - "ethTransactionFee": "", - "ethTransactionTotal": "", - "hexGasTotal": "", - "nonce": "", - "fetchingMethodData": false - }, - "gas": { - "customData": { - "price": null, - "limit": "0x186a0" - }, - "basicEstimates": { - "average": 73, - "avgWait": 10.6, - "blockTime": 13.871657754010695, - "blockNum": 6655504, - "fast": 160, - "fastest": 290, - "fastestWait": 0.5, - "fastWait": 0.6, - "safeLow": 50, - "safeLowWait": 16.1, - "speed": 0.6702462692280712 - }, - "basicEstimateIsLoading": false, - "gasEstimatesLoading": false, - "basicPriceAndTimeEstimates": [], - "priceAndTimeEstimates": [ - { - "expectedTime": "1374.1168296452973076627", - "expectedWait": 99.0593088449, - "gasprice": 4.1 - }, - { - "expectedTime": "1280.88976972896682763716", - "expectedWait": 92.3386225672, - "gasprice": 4.4 - }, - { - "expectedTime": "1245.13314632680319175597", - "expectedWait": 89.7609477113, - "gasprice": 4.8 - }, - { - "expectedTime": "1227.99925007911014385881", - "expectedWait": 88.5257747744, - "gasprice": 4.9 - }, - { - "expectedTime": "965.52572720362993349654", - "expectedWait": 69.6042062402, - "gasprice": 5 - }, - { - "expectedTime": "917.466895447437420776", - "expectedWait": 66.1396721082, - "gasprice": 5.1 - }, - { - "expectedTime": "915.81694044041496090521", - "expectedWait": 66.0207277804, - "gasprice": 5.2 - }, - { - "expectedTime": "902.13145619709089691874", - "expectedWait": 65.034148924, - "gasprice": 5.3 - }, - { - "expectedTime": "890.83591122200105749896", - "expectedWait": 64.2198594443, - "gasprice": 5.4 - }, - { - "expectedTime": "879.10469542971335712248", - "expectedWait": 63.3741627006, - "gasprice": 5.5 - }, - { - "expectedTime": "876.99737395823100420974", - "expectedWait": 63.2222470818, - "gasprice": 5.6 - }, - { - "expectedTime": "865.96781957003849098957", - "expectedWait": 62.4271327138, - "gasprice": 5.7 - }, - { - "expectedTime": "865.44839472121496158482", - "expectedWait": 62.3896876688, - "gasprice": 5.8 - }, - { - "expectedTime": "802.16173170976255602161", - "expectedWait": 57.8273877524, - "gasprice": 6 - }, - { - "expectedTime": "780.79313908053047074843", - "expectedWait": 56.2869379368, - "gasprice": 6.1 - }, - { - "expectedTime": "770.04888359616469549233", - "expectedWait": 55.5123906062, - "gasprice": 6.2 - }, - { - "expectedTime": "745.01007965146736962697", - "expectedWait": 53.7073573226, - "gasprice": 6.3 - }, - { - "expectedTime": "735.19921111598501681816", - "expectedWait": 53.0000973318, - "gasprice": 6.6 - }, - { - "expectedTime": "705.68767153912619368694", - "expectedWait": 50.8726270539, - "gasprice": 6.7 - }, - { - "expectedTime": "705.26438593445239690121", - "expectedWait": 50.8421126329, - "gasprice": 6.9 - }, - { - "expectedTime": "652.51573119854865429742", - "expectedWait": 47.0394918019, - "gasprice": 7 - }, - { - "expectedTime": "635.51471669299464383162", - "expectedWait": 45.813898235, - "gasprice": 7.1 - }, - { - "expectedTime": "634.37181911960854759036", - "expectedWait": 45.7315073922, - "gasprice": 7.2 - }, - { - "expectedTime": "633.23097691113902888918", - "expectedWait": 45.6492647195, - "gasprice": 7.3 - }, - { - "expectedTime": "112.7753456245379663928", - "expectedWait": 8.1299111919, - "gasprice": 7.6 - }, - { - "expectedTime": "102.9665314468898381829", - "expectedWait": 7.4227992986, - "gasprice": 8 - }, - { - "expectedTime": "100.94784507024919649891", - "expectedWait": 7.2772733339, - "gasprice": 8.1 - }, - { - "expectedTime": "100.46445647447807351078", - "expectedWait": 7.2424261221, - "gasprice": 8.8 - }, - { - "expectedTime": "84.91686745986737853339", - "expectedWait": 6.1216091808, - "gasprice": 9 - }, - { - "expectedTime": "80.39566429296684383503", - "expectedWait": 5.7956781892, - "gasprice": 9.1 - }, - { - "expectedTime": "78.24522052614759252715", - "expectedWait": 5.6406539084, - "gasprice": 9.2 - }, - { - "expectedTime": "77.1685119880459882636", - "expectedWait": 5.5630345959, - "gasprice": 9.5 - }, - { - "expectedTime": "72.43649507646737870178", - "expectedWait": 5.2219061601, - "gasprice": 9.8 - }, - { - "expectedTime": "71.48259532351443753818", - "expectedWait": 5.1531400638, - "gasprice": 9.9 - }, - { - "expectedTime": "58.23892805162994573827", - "expectedWait": 4.1984115442, - "gasprice": 10 - }, - { - "expectedTime": "53.13065124862245917617", - "expectedWait": 3.8301587446, - "gasprice": 10.1 - }, - { - "expectedTime": "53.03510209647058751971", - "expectedWait": 3.82327066, - "gasprice": 10.3 - }, - { - "expectedTime": "49.06846157804491912403", - "expectedWait": 3.5373177776, - "gasprice": 11 - }, - { - "expectedTime": "48.30893330101818116637", - "expectedWait": 3.4825638116, - "gasprice": 11.1 - }, - { - "expectedTime": "48.25099734861818116715", - "expectedWait": 3.4783872414, - "gasprice": 11.3 - }, - { - "expectedTime": "47.64416885027272662988", - "expectedWait": 3.4346413165, - "gasprice": 11.9 - }, - { - "expectedTime": "46.76354741392085498401", - "expectedWait": 3.3711578128, - "gasprice": 12.6 - }, - { - "expectedTime": "44.99427448545882292232", - "expectedWait": 3.2436119232, - "gasprice": 13 - }, - { - "expectedTime": "44.61790554199251276697", - "expectedWait": 3.2164796979, - "gasprice": 13.1 - }, - { - "expectedTime": "42.87832690973048070488", - "expectedWait": 3.0910744534, - "gasprice": 14 - }, - { - "expectedTime": "42.21224091308663044649", - "expectedWait": 3.0430566888, - "gasprice": 14.9 - }, - { - "expectedTime": "41.15715335111336842864", - "expectedWait": 2.9669960203, - "gasprice": 15 - }, - { - "expectedTime": "40.9600723880876999821", - "expectedWait": 2.9527885646, - "gasprice": 15.1 - }, - { - "expectedTime": "38.89138450301711177472", - "expectedWait": 2.8036580193, - "gasprice": 15.8 - }, - { - "expectedTime": "37.89655640860213852611", - "expectedWait": 2.7319414219, - "gasprice": 16 - }, - { - "expectedTime": "37.35265517364705831954", - "expectedWait": 2.692731888, - "gasprice": 17.4 - }, - { - "expectedTime": "36.79447683873796741798", - "expectedWait": 2.652493126, - "gasprice": 17.8 - }, - { - "expectedTime": "36.11439350850802090309", - "expectedWait": 2.6034663015, - "gasprice": 19 - }, - { - "expectedTime": "31.32676199432192471101", - "expectedWait": 2.2583286403, - "gasprice": 20 - }, - { - "expectedTime": "30.76792490132192471855", - "expectedWait": 2.2180423888, - "gasprice": 20.1 - }, - { - "expectedTime": "29.94493658520962526441", - "expectedWait": 2.1587136243, - "gasprice": 25 - }, - { - "expectedTime": "29.53287347625561457478", - "expectedWait": 2.1290082267, - "gasprice": 29 - }, - { - "expectedTime": "29.09318627175614934008", - "expectedWait": 2.0973114236, - "gasprice": 47 - } - ], - "priceAndTimeEstimatesLastRetrieved": 1541527901281, - "errors": {} - } -} diff --git a/development/states/confirm-sig-requests.json b/development/states/confirm-sig-requests.json deleted file mode 100644 index d531b2ef7b74..000000000000 --- a/development/states/confirm-sig-requests.json +++ /dev/null @@ -1,528 +0,0 @@ -{ - "metamask": { - "completedOnboarding": true, - "isInitialized": true, - "isUnlocked": true, - "featureFlags": {"betaUI": true}, - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "name": "Send Account 1" - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "name": "Send Account 2" - }, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { - "address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d", - "name": "Send Account 3" - }, - "0xd85a4b6a394794842887b8284293d69163007bbb": { - "address": "0xd85a4b6a394794842887b8284293d69163007bbb", - "name": "Send Account 4" - } - }, - "cachedBalances": {}, - "unapprovedTxs": {}, - "currentCurrency": "USD", - "conversionRate": 1200.88200327, - "conversionDate": 1489013762, - "noActiveNotices": true, - "frequentRpcList": [], - "network": "3", - "accounts": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "code": "0x", - "balance": "0x47c9d71831c76efe", - "nonce": "0x1b", - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "code": "0x", - "balance": "0x37452b1315889f80", - "nonce": "0xa", - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb" - }, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { - "code": "0x", - "balance": "0x30c9d71831c76efe", - "nonce": "0x1c", - "address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d" - }, - "0xd85a4b6a394794842887b8284293d69163007bbb": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0xd85a4b6a394794842887b8284293d69163007bbb" - } - }, - "addressBook": [ - { - "address": "0x06195827297c7a80a443b6894d3bdb8824b43896", - "name": "Address Book Account 1" - } - ], - "tokens": [], - "transactions": {}, - "selectedAddressTxList": [], - "unapprovedTxs": {}, - "unapprovedMsgs": { - "8927167822566864": { - "id": 8927167822566864, - "msgParams": { - "data": "0x879a053d4800c6354e76c7985a865d2922c82fb5b3f4577b2fe08b998954f2e0", - "from": "0x0d0c7188d9c72b019a5da9bca0d127680c22e658" - }, - "status": "unapproved", - "time": 1537889070000, - "type": "eth_sign" - } - }, - "unapprovedMsgCount": 1, - "unapprovedPersonalMsgs": { - "8907167822566865": { - "id": 8907167822566865, - "msgParams": { - "data": "0x23205465726d73206f662055736520230a0a2a2a544849532041475245454d454e54204953205355424a45435420544f2042494e44494e47204152424954524154494f4e20414e44204120574149564552204f4620434c41535320414354494f4e205249474854532041532044455441494c454420494e2053454354494f4e2031332e20504c454153452052454144205448452041475245454d454e54204341524546554c4c592e2a2a0a0a5f4f7572205465726d73206f66205573652068617665206265656e2075706461746564206173206f662053657074656d62657220352c20323031365f0a0a232320312e20416363657074616e6365206f66205465726d732023230a0a4d6574614d61736b2070726f7669646573206120706c6174666f726d20666f72206d616e6167696e6720457468657265756d20286f7220224554482229206163636f756e74732c20616e6420616c6c6f77696e67206f7264696e61727920776562736974657320746f20696e74657261637420776974682074686520457468657265756d20626c6f636b636861696e2c207768696c65206b656570696e6720746865207573657220696e20636f6e74726f6c206f7665722077686174207472616e73616374696f6e73207468657920617070726f76652c207468726f756768206f75722077656273697465206c6f63617465642061745b205d28687474703a2f2f6d6574616d61736b2e696f295b68747470733a2f2f6d6574616d61736b2e696f2f5d2868747470733a2f2f6d6574616d61736b2e696f2f2920616e642062726f7773657220706c7567696e2028746865202253697465222920e2809420776869636820696e636c7564657320746578742c20696d616765732c20617564696f2c20636f646520616e64206f74686572206d6174657269616c73202028636f6c6c6563746976656c792c2074686520e2809c436f6e74656e74e2809d2920616e6420616c6c206f66207468652066656174757265732c20616e642073657276696365732070726f76696465642e2054686520536974652c20616e6420616e79206f746865722066656174757265732c20746f6f6c732c206d6174657269616c732c206f72206f74686572207365727669636573206f6666657265642066726f6d2074696d6520746f2074696d65206279204d6574614d61736b2061726520726566657272656420746f20686572652061732074686520e2809c536572766963652ee2809d20506c656173652072656164207468657365205465726d73206f6620557365202874686520e2809c5465726d73e2809d206f7220e2809c5465726d73206f6620557365e2809d29206361726566756c6c79206265666f7265207573696e672074686520536572766963652e204279207573696e67206f72206f746865727769736520616363657373696e67207468652053657276696365732c206f7220636c69636b696e6720746f20616363657074206f7220616772656520746f207468657365205465726d732077686572652074686174206f7074696f6e206973206d61646520617661696c61626c652c20796f75202831292061636365707420616e6420616772656520746f207468657365205465726d732028322920636f6e73656e7420746f2074686520636f6c6c656374696f6e2c207573652c20646973636c6f7375726520616e64206f746865722068616e646c696e67206f6620696e666f726d6174696f6e2061732064657363726962656420696e206f7572205072697661637920506f6c6963792020616e642028332920616e79206164646974696f6e616c207465726d732c2072756c657320616e6420636f6e646974696f6e73206f662070617274696369706174696f6e20697373756564206279204d6574614d61736b2066726f6d2074696d6520746f2074696d652e20496620796f7520646f206e6f7420616772656520746f20746865205465726d732c207468656e20796f75206d6179206e6f7420616363657373206f72207573652074686520436f6e74656e74206f722053657276696365732e0a0a232320322e204d6f64696669636174696f6e206f66205465726d73206f66205573652023230a0a45786365707420666f722053656374696f6e2031332c2070726f766964696e6720666f722062696e64696e67206172626974726174696f6e20616e6420776169766572206f6620636c61737320616374696f6e207269676874732c204d6574614d61736b207265736572766573207468652072696768742c2061742069747320736f6c652064697363726574696f6e2c20746f206d6f64696679206f72207265706c61636520746865205465726d73206f662055736520617420616e792074696d652e20546865206d6f73742063757272656e742076657273696f6e206f66207468657365205465726d732077696c6c20626520706f73746564206f6e206f757220536974652e20596f75207368616c6c20626520726573706f6e7369626c6520666f7220726576696577696e6720616e64206265636f6d696e672066616d696c696172207769746820616e792073756368206d6f64696669636174696f6e732e20557365206f662074686520536572766963657320627920796f7520616674657220616e79206d6f64696669636174696f6e20746f20746865205465726d7320636f6e737469747574657320796f757220616363657074616e6365206f6620746865205465726d73206f6620557365206173206d6f6469666965642e0a0a0a0a232320332e20456c69676962696c6974792023230a0a596f752068657265627920726570726573656e7420616e642077617272616e74207468617420796f75206172652066756c6c792061626c6520616e6420636f6d706574656e7420746f20656e74657220696e746f20746865207465726d732c20636f6e646974696f6e732c206f626c69676174696f6e732c2061666669726d6174696f6e732c20726570726573656e746174696f6e7320616e642077617272616e746965732073657420666f72746820696e207468657365205465726d7320616e6420746f20616269646520627920616e6420636f6d706c792077697468207468657365205465726d732e0a0a4d6574614d61736b206973206120676c6f62616c20706c6174666f726d20616e6420627920616363657373696e672074686520436f6e74656e74206f722053657276696365732c20796f752061726520726570726573656e74696e6720616e642077617272616e74696e6720746861742c20796f7520617265206f6620746865206c6567616c20616765206f66206d616a6f7269747920696e20796f7572206a7572697364696374696f6e20617320697320726571756972656420746f20616363657373207375636820536572766963657320616e6420436f6e74656e…16e79206368616e67657320746f20746869732073656374696f6e2e204368616e6765732077696c6c206265636f6d6520656666656374697665206f6e207468652036307468206461792c20616e642077696c6c206170706c792070726f73706563746976656c79206f6e6c7920746f20616e7920636c61696d732061726973696e67206166746572207468652036307468206461792e0a0a466f7220616e792064697370757465206e6f74207375626a65637420746f206172626974726174696f6e20796f7520616e64204d6574614d61736b20616772656520746f207375626d697420746f2074686520706572736f6e616c20616e64206578636c7573697665206a7572697364696374696f6e206f6620616e642076656e756520696e20746865206665646572616c20616e6420737461746520636f75727473206c6f636174656420696e204e657720596f726b2c204e657720596f726b2e20596f75206675727468657220616772656520746f206163636570742073657276696365206f662070726f63657373206279206d61696c2c20616e642068657265627920776169766520616e7920616e6420616c6c206a7572697364696374696f6e616c20616e642076656e756520646566656e736573206f746865727769736520617661696c61626c652e0a0a546865205465726d7320616e64207468652072656c6174696f6e73686970206265747765656e20796f7520616e64204d6574614d61736b207368616c6c20626520676f7665726e656420627920746865206c617773206f6620746865205374617465206f66204e657720596f726b20776974686f75742072656761726420746f20636f6e666c696374206f66206c61772070726f766973696f6e732e0a0a23232031342e2047656e6572616c20496e666f726d6174696f6e2023230a0a2323232031342e3120456e746972652041677265656d656e74202323230a0a5468657365205465726d732028616e6420616e79206164646974696f6e616c207465726d732c2072756c657320616e6420636f6e646974696f6e73206f662070617274696369706174696f6e2074686174204d6574614d61736b206d617920706f7374206f6e2074686520536572766963652920636f6e737469747574652074686520656e746972652061677265656d656e74206265747765656e20796f7520616e64204d6574614d61736b2077697468207265737065637420746f20746865205365727669636520616e64207375706572736564657320616e79207072696f722061677265656d656e74732c206f72616c206f72207772697474656e2c206265747765656e20796f7520616e64204d6574614d61736b2e20496e20746865206576656e74206f66206120636f6e666c696374206265747765656e207468657365205465726d7320616e6420746865206164646974696f6e616c207465726d732c2072756c657320616e6420636f6e646974696f6e73206f662070617274696369706174696f6e2c20746865206c61747465722077696c6c207072657661696c206f76657220746865205465726d7320746f2074686520657874656e74206f662074686520636f6e666c6963742e0a0a2323232031342e322057616976657220616e642053657665726162696c697479206f66205465726d73202323230a0a546865206661696c757265206f66204d6574614d61736b20746f206578657263697365206f7220656e666f72636520616e79207269676874206f722070726f766973696f6e206f6620746865205465726d73207368616c6c206e6f7420636f6e73746974757465206120776169766572206f662073756368207269676874206f722070726f766973696f6e2e20496620616e792070726f766973696f6e206f6620746865205465726d7320697320666f756e6420627920616e2061726269747261746f72206f7220636f757274206f6620636f6d706574656e74206a7572697364696374696f6e20746f20626520696e76616c69642c207468652070617274696573206e657665727468656c6573732061677265652074686174207468652061726269747261746f72206f7220636f7572742073686f756c6420656e646561766f7220746f20676976652065666665637420746f2074686520706172746965732720696e74656e74696f6e73206173207265666c656374656420696e207468652070726f766973696f6e2c20616e6420746865206f746865722070726f766973696f6e73206f6620746865205465726d732072656d61696e20696e2066756c6c20666f72636520616e64206566666563742e0a0a2323232031342e332053746174757465206f66204c696d69746174696f6e73202323230a0a596f752061677265652074686174207265676172646c657373206f6620616e792073746174757465206f72206c617720746f2074686520636f6e74726172792c20616e7920636c61696d206f72206361757365206f6620616374696f6e2061726973696e67206f7574206f66206f722072656c6174656420746f2074686520757365206f66207468652053657276696365206f7220746865205465726d73206d7573742062652066696c65642077697468696e206f6e65202831292079656172206166746572207375636820636c61696d206f72206361757365206f6620616374696f6e2061726f7365206f7220626520666f7265766572206261727265642e0a0a2323232031342e342053656374696f6e205469746c6573202323230a0a5468652073656374696f6e207469746c657320696e20746865205465726d732061726520666f7220636f6e76656e69656e6365206f6e6c7920616e642068617665206e6f206c6567616c206f7220636f6e747261637475616c206566666563742e0a0a2323232031342e3520436f6d6d756e69636174696f6e73202323230a0a55736572732077697468207175657374696f6e732c20636f6d706c61696e7473206f7220636c61696d732077697468207265737065637420746f207468652053657276696365206d617920636f6e74616374207573207573696e67207468652072656c6576616e7420636f6e7461637420696e666f726d6174696f6e2073657420666f7274682061626f766520616e6420617420636f6d6d756e69636174696f6e73406d6574616d61736b2e696f2e0a0a23232031352052656c61746564204c696e6b732023230a0a2a2a5b5465726d73206f66205573655d2868747470733a2f2f6d6574616d61736b2e696f2f7465726d732e68746d6c292a2a0a0a2a2a5b507269766163795d2868747470733a2f2f6d6574616d61736b2e696f2f707269766163792e68746d6c292a2a0a0a2a2a5b4174747269627574696f6e735d2868747470733a2f2f6d6574616d61736b2e696f2f6174747269627574696f6e732e68746d6c292a2a0a", - "from": "0x0d0c7188d9c72b019a5da9bca0d127680c22e659" - }, - "status": "unapproved", - "time": 1537889065000, - "type": "personal_sign" - } - }, - "unapprovedPersonalMsgCount": 1 , - "unapprovedTypedMessages": { - "8997167822566869": { - "id": 8997167822566869, - "msgParams": { - "data": [ - {"type": "string", "name": "Message", "value": "Hi, Alice!"}, - {"type": "uint32", "name": "A number", "value": "1337"} - ], - "from": "0x0d0c7188d9c72b019a5da9bca0d127680c22e659" - }, - "status": "unapproved", - "time": 1537889060000, - "type": "eth_signTypedData" - } - }, - "unapprovedTypedMessagesCount": 1, - "keyringTypes": [ - "Simple Key Pair", - "HD Key Tree" - ], - "keyrings": [ - { - "type": "HD Key Tree", - "accounts": [ - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d" - ] - }, - { - "type": "Simple Key Pair", - "accounts": [ - "0xd85a4b6a394794842887b8284293d69163007bbb" - ] - } - ], - "selectedAddress": "0xd85a4b6a394794842887b8284293d69163007bbb", - "currentCurrency": "USD", - "provider": { - "type": "testnet" - }, - "shapeShiftTxList": [], - "lostAccounts": [], - "send": { - "gasLimit": "0xea60", - "gasPrice": "0xba43b7400", - "gasTotal": "0xb451dc41b578", - "tokenBalance": null, - "from": { - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "balance": "0x37452b1315889f80" - }, - "to": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d", - "amount": "0x1bc16d674ec80000", - "memo": "", - "errors": {}, - "warnings": {}, - "maxModeOn": false, - "editingTransactionId": null - }, - "currentLocale": "en", - "preferences": { - "useNativeCurrencyAsPrimaryCurrency": true - }, - "completedUiMigration": true, - "frequentRpcListDetail": [] - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "confTx", - "detailView": null, - "context": 0 - }, - "accountDetail": { - "subview": "transactions" - }, - "sidebar": {}, - "modal": { - "modalState": {}, - "previousModalState": {} - }, - "transForward": true, - "isLoading": false, - "warning": null, - "scrollToBottom": false, - "forgottenPassword": null - }, - "identities": {}, - "confirmTransaction": { - "txData": { - "id": 8927167822566864, - "msgParams": { - "data": "0x879a053d4800c6354e76c7985a865d2922c82fb5b3f4577b2fe08b998954f2e0", - "from": "0x0d0c7188d9c72b019a5da9bca0d127680c22e658" - }, - "status": "unapproved", - "time": 1537889069339, - "type": "eth_sign" - }, - "tokenData": {}, - "methodData": {}, - "tokenProps": { - "tokenDecimals": "", - "tokenSymbol": "" - }, - "fiatTransactionAmount": "", - "fiatTransactionFee": "", - "fiatTransactionTotal": "", - "ethTransactionAmount": "", - "ethTransactionFee": "", - "ethTransactionTotal": "", - "hexGasTotal": "", - "nonce": "", - "fetchingMethodData": false - }, - "gas": { - "customData": { - "price": null, - "limit": "0x186a0" - }, - "basicEstimates": { - "average": 73, - "avgWait": 10.6, - "blockTime": 13.871657754010695, - "blockNum": 6655504, - "fast": 160, - "fastest": 290, - "fastestWait": 0.5, - "fastWait": 0.6, - "safeLow": 50, - "safeLowWait": 16.1, - "speed": 0.6702462692280712 - }, - "basicEstimateIsLoading": false, - "gasEstimatesLoading": false, - "basicPriceAndTimeEstimates": [], - "priceAndTimeEstimates": [ - { - "expectedTime": "1374.1168296452973076627", - "expectedWait": 99.0593088449, - "gasprice": 4.1 - }, - { - "expectedTime": "1280.88976972896682763716", - "expectedWait": 92.3386225672, - "gasprice": 4.4 - }, - { - "expectedTime": "1245.13314632680319175597", - "expectedWait": 89.7609477113, - "gasprice": 4.8 - }, - { - "expectedTime": "1227.99925007911014385881", - "expectedWait": 88.5257747744, - "gasprice": 4.9 - }, - { - "expectedTime": "965.52572720362993349654", - "expectedWait": 69.6042062402, - "gasprice": 5 - }, - { - "expectedTime": "917.466895447437420776", - "expectedWait": 66.1396721082, - "gasprice": 5.1 - }, - { - "expectedTime": "915.81694044041496090521", - "expectedWait": 66.0207277804, - "gasprice": 5.2 - }, - { - "expectedTime": "902.13145619709089691874", - "expectedWait": 65.034148924, - "gasprice": 5.3 - }, - { - "expectedTime": "890.83591122200105749896", - "expectedWait": 64.2198594443, - "gasprice": 5.4 - }, - { - "expectedTime": "879.10469542971335712248", - "expectedWait": 63.3741627006, - "gasprice": 5.5 - }, - { - "expectedTime": "876.99737395823100420974", - "expectedWait": 63.2222470818, - "gasprice": 5.6 - }, - { - "expectedTime": "865.96781957003849098957", - "expectedWait": 62.4271327138, - "gasprice": 5.7 - }, - { - "expectedTime": "865.44839472121496158482", - "expectedWait": 62.3896876688, - "gasprice": 5.8 - }, - { - "expectedTime": "802.16173170976255602161", - "expectedWait": 57.8273877524, - "gasprice": 6 - }, - { - "expectedTime": "780.79313908053047074843", - "expectedWait": 56.2869379368, - "gasprice": 6.1 - }, - { - "expectedTime": "770.04888359616469549233", - "expectedWait": 55.5123906062, - "gasprice": 6.2 - }, - { - "expectedTime": "745.01007965146736962697", - "expectedWait": 53.7073573226, - "gasprice": 6.3 - }, - { - "expectedTime": "735.19921111598501681816", - "expectedWait": 53.0000973318, - "gasprice": 6.6 - }, - { - "expectedTime": "705.68767153912619368694", - "expectedWait": 50.8726270539, - "gasprice": 6.7 - }, - { - "expectedTime": "705.26438593445239690121", - "expectedWait": 50.8421126329, - "gasprice": 6.9 - }, - { - "expectedTime": "652.51573119854865429742", - "expectedWait": 47.0394918019, - "gasprice": 7 - }, - { - "expectedTime": "635.51471669299464383162", - "expectedWait": 45.813898235, - "gasprice": 7.1 - }, - { - "expectedTime": "634.37181911960854759036", - "expectedWait": 45.7315073922, - "gasprice": 7.2 - }, - { - "expectedTime": "633.23097691113902888918", - "expectedWait": 45.6492647195, - "gasprice": 7.3 - }, - { - "expectedTime": "112.7753456245379663928", - "expectedWait": 8.1299111919, - "gasprice": 7.6 - }, - { - "expectedTime": "102.9665314468898381829", - "expectedWait": 7.4227992986, - "gasprice": 8 - }, - { - "expectedTime": "100.94784507024919649891", - "expectedWait": 7.2772733339, - "gasprice": 8.1 - }, - { - "expectedTime": "100.46445647447807351078", - "expectedWait": 7.2424261221, - "gasprice": 8.8 - }, - { - "expectedTime": "84.91686745986737853339", - "expectedWait": 6.1216091808, - "gasprice": 9 - }, - { - "expectedTime": "80.39566429296684383503", - "expectedWait": 5.7956781892, - "gasprice": 9.1 - }, - { - "expectedTime": "78.24522052614759252715", - "expectedWait": 5.6406539084, - "gasprice": 9.2 - }, - { - "expectedTime": "77.1685119880459882636", - "expectedWait": 5.5630345959, - "gasprice": 9.5 - }, - { - "expectedTime": "72.43649507646737870178", - "expectedWait": 5.2219061601, - "gasprice": 9.8 - }, - { - "expectedTime": "71.48259532351443753818", - "expectedWait": 5.1531400638, - "gasprice": 9.9 - }, - { - "expectedTime": "58.23892805162994573827", - "expectedWait": 4.1984115442, - "gasprice": 10 - }, - { - "expectedTime": "53.13065124862245917617", - "expectedWait": 3.8301587446, - "gasprice": 10.1 - }, - { - "expectedTime": "53.03510209647058751971", - "expectedWait": 3.82327066, - "gasprice": 10.3 - }, - { - "expectedTime": "49.06846157804491912403", - "expectedWait": 3.5373177776, - "gasprice": 11 - }, - { - "expectedTime": "48.30893330101818116637", - "expectedWait": 3.4825638116, - "gasprice": 11.1 - }, - { - "expectedTime": "48.25099734861818116715", - "expectedWait": 3.4783872414, - "gasprice": 11.3 - }, - { - "expectedTime": "47.64416885027272662988", - "expectedWait": 3.4346413165, - "gasprice": 11.9 - }, - { - "expectedTime": "46.76354741392085498401", - "expectedWait": 3.3711578128, - "gasprice": 12.6 - }, - { - "expectedTime": "44.99427448545882292232", - "expectedWait": 3.2436119232, - "gasprice": 13 - }, - { - "expectedTime": "44.61790554199251276697", - "expectedWait": 3.2164796979, - "gasprice": 13.1 - }, - { - "expectedTime": "42.87832690973048070488", - "expectedWait": 3.0910744534, - "gasprice": 14 - }, - { - "expectedTime": "42.21224091308663044649", - "expectedWait": 3.0430566888, - "gasprice": 14.9 - }, - { - "expectedTime": "41.15715335111336842864", - "expectedWait": 2.9669960203, - "gasprice": 15 - }, - { - "expectedTime": "40.9600723880876999821", - "expectedWait": 2.9527885646, - "gasprice": 15.1 - }, - { - "expectedTime": "38.89138450301711177472", - "expectedWait": 2.8036580193, - "gasprice": 15.8 - }, - { - "expectedTime": "37.89655640860213852611", - "expectedWait": 2.7319414219, - "gasprice": 16 - }, - { - "expectedTime": "37.35265517364705831954", - "expectedWait": 2.692731888, - "gasprice": 17.4 - }, - { - "expectedTime": "36.79447683873796741798", - "expectedWait": 2.652493126, - "gasprice": 17.8 - }, - { - "expectedTime": "36.11439350850802090309", - "expectedWait": 2.6034663015, - "gasprice": 19 - }, - { - "expectedTime": "31.32676199432192471101", - "expectedWait": 2.2583286403, - "gasprice": 20 - }, - { - "expectedTime": "30.76792490132192471855", - "expectedWait": 2.2180423888, - "gasprice": 20.1 - }, - { - "expectedTime": "29.94493658520962526441", - "expectedWait": 2.1587136243, - "gasprice": 25 - }, - { - "expectedTime": "29.53287347625561457478", - "expectedWait": 2.1290082267, - "gasprice": 29 - }, - { - "expectedTime": "29.09318627175614934008", - "expectedWait": 2.0973114236, - "gasprice": 47 - } - ], - "priceAndTimeEstimatesLastRetrieved": 1541527901281, - "errors": {} - } -} diff --git a/development/states/create-vault-password.json b/development/states/create-vault-password.json deleted file mode 100644 index 1ff51b42765e..000000000000 --- a/development/states/create-vault-password.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "metamask": { - "isInitialized": false, - "isUnlocked": false, - "currentDomain": "example.com", - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": {}, - "unconfTxs": {}, - "accounts": {}, - "transactions": [], - "network": "2", - "seedWords": null, - "unconfMsgs": {}, - "messages": [], - "provider": { - "type": "testnet" - } - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "accounts", - "detailView": null - }, - "accountDetail": { - "subview": "transactions" - }, - "currentDomain": "extensions", - "transForward": false, - "isLoading": false, - "warning": null - }, - "identities": {} -} diff --git a/development/states/currency-localization.json b/development/states/currency-localization.json deleted file mode 100644 index a9a37ecd0f95..000000000000 --- a/development/states/currency-localization.json +++ /dev/null @@ -1,478 +0,0 @@ -{ - "metamask": { - "completedOnboarding": true, - "isInitialized": true, - "isUnlocked": true, - "featureFlags": {"betaUI": true}, - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "name": "Send Account 1" - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "name": "Send Account 2" - }, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { - "address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d", - "name": "Send Account 3" - }, - "0xd85a4b6a394794842887b8284293d69163007bbb": { - "address": "0xd85a4b6a394794842887b8284293d69163007bbb", - "name": "Send Account 4" - } - }, - "cachedBalances": {}, - "unapprovedTxs": {}, - "currentCurrency": "USD", - "conversionRate": 19855, - "conversionDate": 1489013762, - "noActiveNotices": true, - "frequentRpcList": [], - "network": "3", - "accounts": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "code": "0x", - "balance": "0x47c9d71831c76efe", - "nonce": "0x1b", - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "code": "0x", - "balance": "0x37452b1315889f80", - "nonce": "0xa", - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb" - }, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { - "code": "0x", - "balance": "0x30c9d71831c76efe", - "nonce": "0x1c", - "address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d" - }, - "0xd85a4b6a394794842887b8284293d69163007bbb": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0xd85a4b6a394794842887b8284293d69163007bbb" - } - }, - "addressBook": [ - { - "address": "0x06195827297c7a80a443b6894d3bdb8824b43896", - "name": "Address Book Account 1" - } - ], - "tokens": [], - "transactions": {}, - "selectedAddressTxList": [], - "unapprovedMsgs": {}, - "unapprovedMsgCount": 0, - "unapprovedPersonalMsgs": {}, - "unapprovedPersonalMsgCount": 0, - "keyringTypes": [ - "Simple Key Pair", - "HD Key Tree" - ], - "keyrings": [ - { - "type": "HD Key Tree", - "accounts": [ - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d" - ] - }, - { - "type": "Simple Key Pair", - "accounts": [ - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - ] - } - ], - "selectedAddress": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "currentCurrency": "PHP", - "provider": { - "type": "testnet" - }, - "shapeShiftTxList": [], - "lostAccounts": [], - "send": { - "gasLimit": null, - "gasPrice": null, - "gasTotal": "0xb451dc41b578", - "tokenBalance": null, - "from": "", - "to": "", - "amount": "0x0", - "memo": "", - "errors": {}, - "warnings": {}, - "maxModeOn": false, - "editingTransactionId": null - }, - "currentLocale": "en", - "preferences": { - "useNativeCurrencyAsPrimaryCurrency": true, - "showFiatInTestnets": true - }, - "completedUiMigration": true, - "frequentRpcListDetail": [] - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "accountDetail", - "detailView": null, - "context": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc" - }, - "accountDetail": { - "subview": "transactions" - }, - "sidebar": {}, - "modal": { - "modalState": {}, - "previousModalState": {} - }, - "transForward": true, - "isLoading": false, - "warning": null, - "scrollToBottom": false, - "forgottenPassword": null - }, - "identities": {}, - "confirmTransaction": { - "txData": {}, - "tokenData": {}, - "methodData": {}, - "tokenProps": { - "tokenDecimals": "", - "tokenSymbol": "" - }, - "fiatTransactionAmount": "", - "fiatTransactionFee": "", - "fiatTransactionTotal": "", - "ethTransactionAmount": "", - "ethTransactionFee": "", - "ethTransactionTotal": "", - "hexGasTotal": "", - "nonce": "", - "fetchingMethodData": false - }, - "gas": { - "customData": { - "price": null, - "limit": "0x186a0" - }, - "basicEstimates": { - "average": 73, - "avgWait": 10.6, - "blockTime": 13.871657754010695, - "blockNum": 6655504, - "fast": 160, - "fastest": 290, - "fastestWait": 0.5, - "fastWait": 0.6, - "safeLow": 50, - "safeLowWait": 16.1, - "speed": 0.6702462692280712 - }, - "basicEstimateIsLoading": false, - "gasEstimatesLoading": false, - "basicPriceAndTimeEstimates": [], - "priceAndTimeEstimates": [ - { - "expectedTime": "1374.1168296452973076627", - "expectedWait": 99.0593088449, - "gasprice": 4.1 - }, - { - "expectedTime": "1280.88976972896682763716", - "expectedWait": 92.3386225672, - "gasprice": 4.4 - }, - { - "expectedTime": "1245.13314632680319175597", - "expectedWait": 89.7609477113, - "gasprice": 4.8 - }, - { - "expectedTime": "1227.99925007911014385881", - "expectedWait": 88.5257747744, - "gasprice": 4.9 - }, - { - "expectedTime": "965.52572720362993349654", - "expectedWait": 69.6042062402, - "gasprice": 5 - }, - { - "expectedTime": "917.466895447437420776", - "expectedWait": 66.1396721082, - "gasprice": 5.1 - }, - { - "expectedTime": "915.81694044041496090521", - "expectedWait": 66.0207277804, - "gasprice": 5.2 - }, - { - "expectedTime": "902.13145619709089691874", - "expectedWait": 65.034148924, - "gasprice": 5.3 - }, - { - "expectedTime": "890.83591122200105749896", - "expectedWait": 64.2198594443, - "gasprice": 5.4 - }, - { - "expectedTime": "879.10469542971335712248", - "expectedWait": 63.3741627006, - "gasprice": 5.5 - }, - { - "expectedTime": "876.99737395823100420974", - "expectedWait": 63.2222470818, - "gasprice": 5.6 - }, - { - "expectedTime": "865.96781957003849098957", - "expectedWait": 62.4271327138, - "gasprice": 5.7 - }, - { - "expectedTime": "865.44839472121496158482", - "expectedWait": 62.3896876688, - "gasprice": 5.8 - }, - { - "expectedTime": "802.16173170976255602161", - "expectedWait": 57.8273877524, - "gasprice": 6 - }, - { - "expectedTime": "780.79313908053047074843", - "expectedWait": 56.2869379368, - "gasprice": 6.1 - }, - { - "expectedTime": "770.04888359616469549233", - "expectedWait": 55.5123906062, - "gasprice": 6.2 - }, - { - "expectedTime": "745.01007965146736962697", - "expectedWait": 53.7073573226, - "gasprice": 6.3 - }, - { - "expectedTime": "735.19921111598501681816", - "expectedWait": 53.0000973318, - "gasprice": 6.6 - }, - { - "expectedTime": "705.68767153912619368694", - "expectedWait": 50.8726270539, - "gasprice": 6.7 - }, - { - "expectedTime": "705.26438593445239690121", - "expectedWait": 50.8421126329, - "gasprice": 6.9 - }, - { - "expectedTime": "652.51573119854865429742", - "expectedWait": 47.0394918019, - "gasprice": 7 - }, - { - "expectedTime": "635.51471669299464383162", - "expectedWait": 45.813898235, - "gasprice": 7.1 - }, - { - "expectedTime": "634.37181911960854759036", - "expectedWait": 45.7315073922, - "gasprice": 7.2 - }, - { - "expectedTime": "633.23097691113902888918", - "expectedWait": 45.6492647195, - "gasprice": 7.3 - }, - { - "expectedTime": "112.7753456245379663928", - "expectedWait": 8.1299111919, - "gasprice": 7.6 - }, - { - "expectedTime": "102.9665314468898381829", - "expectedWait": 7.4227992986, - "gasprice": 8 - }, - { - "expectedTime": "100.94784507024919649891", - "expectedWait": 7.2772733339, - "gasprice": 8.1 - }, - { - "expectedTime": "100.46445647447807351078", - "expectedWait": 7.2424261221, - "gasprice": 8.8 - }, - { - "expectedTime": "84.91686745986737853339", - "expectedWait": 6.1216091808, - "gasprice": 9 - }, - { - "expectedTime": "80.39566429296684383503", - "expectedWait": 5.7956781892, - "gasprice": 9.1 - }, - { - "expectedTime": "78.24522052614759252715", - "expectedWait": 5.6406539084, - "gasprice": 9.2 - }, - { - "expectedTime": "77.1685119880459882636", - "expectedWait": 5.5630345959, - "gasprice": 9.5 - }, - { - "expectedTime": "72.43649507646737870178", - "expectedWait": 5.2219061601, - "gasprice": 9.8 - }, - { - "expectedTime": "71.48259532351443753818", - "expectedWait": 5.1531400638, - "gasprice": 9.9 - }, - { - "expectedTime": "58.23892805162994573827", - "expectedWait": 4.1984115442, - "gasprice": 10 - }, - { - "expectedTime": "53.13065124862245917617", - "expectedWait": 3.8301587446, - "gasprice": 10.1 - }, - { - "expectedTime": "53.03510209647058751971", - "expectedWait": 3.82327066, - "gasprice": 10.3 - }, - { - "expectedTime": "49.06846157804491912403", - "expectedWait": 3.5373177776, - "gasprice": 11 - }, - { - "expectedTime": "48.30893330101818116637", - "expectedWait": 3.4825638116, - "gasprice": 11.1 - }, - { - "expectedTime": "48.25099734861818116715", - "expectedWait": 3.4783872414, - "gasprice": 11.3 - }, - { - "expectedTime": "47.64416885027272662988", - "expectedWait": 3.4346413165, - "gasprice": 11.9 - }, - { - "expectedTime": "46.76354741392085498401", - "expectedWait": 3.3711578128, - "gasprice": 12.6 - }, - { - "expectedTime": "44.99427448545882292232", - "expectedWait": 3.2436119232, - "gasprice": 13 - }, - { - "expectedTime": "44.61790554199251276697", - "expectedWait": 3.2164796979, - "gasprice": 13.1 - }, - { - "expectedTime": "42.87832690973048070488", - "expectedWait": 3.0910744534, - "gasprice": 14 - }, - { - "expectedTime": "42.21224091308663044649", - "expectedWait": 3.0430566888, - "gasprice": 14.9 - }, - { - "expectedTime": "41.15715335111336842864", - "expectedWait": 2.9669960203, - "gasprice": 15 - }, - { - "expectedTime": "40.9600723880876999821", - "expectedWait": 2.9527885646, - "gasprice": 15.1 - }, - { - "expectedTime": "38.89138450301711177472", - "expectedWait": 2.8036580193, - "gasprice": 15.8 - }, - { - "expectedTime": "37.89655640860213852611", - "expectedWait": 2.7319414219, - "gasprice": 16 - }, - { - "expectedTime": "37.35265517364705831954", - "expectedWait": 2.692731888, - "gasprice": 17.4 - }, - { - "expectedTime": "36.79447683873796741798", - "expectedWait": 2.652493126, - "gasprice": 17.8 - }, - { - "expectedTime": "36.11439350850802090309", - "expectedWait": 2.6034663015, - "gasprice": 19 - }, - { - "expectedTime": "31.32676199432192471101", - "expectedWait": 2.2583286403, - "gasprice": 20 - }, - { - "expectedTime": "30.76792490132192471855", - "expectedWait": 2.2180423888, - "gasprice": 20.1 - }, - { - "expectedTime": "29.94493658520962526441", - "expectedWait": 2.1587136243, - "gasprice": 25 - }, - { - "expectedTime": "29.53287347625561457478", - "expectedWait": 2.1290082267, - "gasprice": 29 - }, - { - "expectedTime": "29.09318627175614934008", - "expectedWait": 2.0973114236, - "gasprice": 47 - } - ], - "priceAndTimeEstimatesLastRetrieved": 1541527901281, - "errors": {} - } -} diff --git a/development/states/custom-rpc.json b/development/states/custom-rpc.json deleted file mode 100644 index 7917352e8e07..000000000000 --- a/development/states/custom-rpc.json +++ /dev/null @@ -1,186 +0,0 @@ -{ - "metamask": { - "isInitialized": true, - "isUnlocked": true, - "currentDomain": "example.com", - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "name": "Wallet 1", - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "mayBeFauceting": false - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "name": "Wallet 2", - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "mayBeFauceting": false - }, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { - "name": "Wallet 3", - "address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d", - "mayBeFauceting": false - }, - "0x18c643c9cf21027339c8648fbaa2f348ddcbe00a": { - "name": "Wallet 4", - "address": "0x18c643c9cf21027339c8648fbaa2f348ddcbe00a", - "mayBeFauceting": false - } - }, - "unconfTxs": {}, - "accounts": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": {}, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": {}, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": {}, - "0x18c643c9cf21027339c8648fbaa2f348ddcbe00a": {} - }, - "transactions": [ - { - "id": 1470676748243181, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "data": "0x60a060405260046060527f48302e31000000000000000000000000000000000000000000000000000000006080526006805460008290527f48302e310000000000000000000000000000000000000000000000000000000882556100b5907ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f602060026001841615610100026000190190931692909204601f01919091048101905b8082111561017957600081556001016100a1565b505060405161097d38038061097d83398101604052808051906020019091908051820191906020018051906020019091908051820191906020015050836000600050600033600160a060020a0316815260200190815260200160002060005081905550836002600050819055508260036000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061017d57805160ff19168380011785555b506101ad9291506100a1565b5090565b8280016001018555821561016d579182015b8281111561016d57825182600050559160200191906001019061018f565b50506004805460ff19168317905560058054825160008390527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0602060026001851615610100026000190190941693909304601f90810184900482019386019083901061022d57805160ff19168380011785555b5061025d9291506100a1565b82800160010185558215610221579182015b8281111561022157825182600050559160200191906001019061023f565b50505050505061070c806102716000396000f36060604052361561008d5760e060020a600035046306fdde038114610095578063095ea7b3146100f257806318160ddd1461015d57806323b872dd14610166578063313ce567146102c757806354fd4d50146102d357806370a082311461033057806395d89b411461035e578063a9059cbb146103bb578063cae9ca511461044d578063dd62ed3e14610618575b610000610002565b61064c60038054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156106ef5780601f106106c4576101008083540402835291602001916106ef565b61034c60043560243533600160a060020a03908116600081815260016020908152604080832094871680845294825282208590556060858152919392917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a35060015b92915050565b61034c60025481565b61034c600435602435604435600160a060020a0383166000908152602081905260408120548290108015906101b9575060016020908152604080832033600160a060020a03168452909152812054829010155b80156101c55750600082115b1561070757816000600050600085600160a060020a03168152602001908152602001600020600082828250540192505081905550816000600050600086600160a060020a03168152602001908152602001600020600082828250540392505081905550816001600050600086600160a060020a03168152602001908152602001600020600050600033600160a060020a0316815260200190815260200160002060008282825054039250508190555082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35060016106fb565b6106ba60045460ff1681565b61064c60068054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156106ef5780601f106106c4576101008083540402835291602001916106ef565b600160a060020a03600435166000908152602081905260409020545b60408051918252519081900360200190f35b61064c60058054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156106ef5780601f106106c4576101008083540402835291602001916106ef565b61034c60043560243533600160a060020a03166000908152602081905260408120548290108015906103ed5750600082115b1561070257604080822080548490039055600160a060020a03808516808452918320805485019055606084815233909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602090a3506001610157565b60806020604435600481810135601f81018490049093028401604052606083815261034c948235946024803595606494939101919081908382808284375094965050505050505033600160a060020a03908116600081815260016020908152604080832094881680845294825280832087905580518781529051929493927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a383600160a060020a031660405180807f72656365697665417070726f76616c28616464726573732c75696e743235362c81526020017f616464726573732c627974657329000000000000000000000000000000000000815260200150602e019050604051809103902060e060020a8091040260e060020a9004338530866040518560e060020a0281526004018085600160a060020a0316815260200184815260200183600160a060020a031681526020018280519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156105f05780820380516001836020036101000a031916815260200191505b509450505050506000604051808303816000876161da5a03f19250505015156106f757610002565b61034c600435602435600160a060020a03808316600090815260016020908152604080832093851683529290522054610157565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156106ac5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6060908152602090f35b820191906000526020600020905b8154815290600101906020018083116106d257829003601f168201915b505050505081565b5060015b9392505050565b610157565b6106fb5600000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000084d536674436f696e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d53465400000000000000000000000000000000000000000000000000000000", - "gasPrice": "0xba43b7400", - "gas": "0xf4240", - "origin": "tokenfactory.surge.sh", - "metamaskId": 1470676748243181, - "metamaskNetworkId": "2" - }, - "time": 1470676748243, - "status": "confirmed", - "estimatedGas": "0xa9442", - "hash": "0xce6f9e068c780a1197117ec9e2103c33ac21bc8d5822aa2293c9c84e72229d88" - }, - { - "id": 1470682363931487, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "nonce": "0x2", - "gasPrice": "0x4a817c800", - "to": "0x059f1e6f420d6fee280bb83e2702dcd06a2ce9c8", - "value": "0x3e2c284391c0000", - "data": "0xd92ed13700000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000224d6574614d61736b3a20457468657265756d20696e20796f75722042726f777365720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052416e7920696e746572657374696e672064657461696c732061626f757420796f752c207468617420796f7520776f756c64206c696b6520746f20736861726520776974682074686520636f6d6d756e697479000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000137777772e796f7572776562736974652e636f6d00000000000000000000000000", - "gasLimit": "0x5ce40", - "origin": "www.etherfaces.com", - "metamaskId": 1470682363931487, - "metamaskNetworkId": "1" - }, - "time": 1470682363931, - "status": "confirmed", - "estimatedGas": "0x447a0", - "containsDelegateCall": false, - "hash": "0x4aa629bdc0710f9048c2dd8c35883338de681aff50998b0e14f1079e41e7b3bf" - }, - { - "id": 1470682617417416, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "nonce": "0x3", - "gasPrice": "0x4a817c800", - "to": "0x059f1e6f420d6fee280bb83e2702dcd06a2ce9c8", - "value": "0x3e2c284391c0000", - "data": "0xd92ed137000000000000000000000000000000000000000000000000000000000000006200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084d6574614d61736b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e566973697420457468657265756d2044617070732077697468696e206e6f726d616c207765622062726f77736572732077697468204d6574614d61736b210000000000000000000000000000000000000000000000000000000000000000001368747470733a2f2f6d6574616d61736b2e696f00000000000000000000000000", - "gasLimit": "0x2fc7720", - "origin": "www.etherfaces.com", - "metamaskId": 1470682617417416, - "metamaskNetworkId": "1" - }, - "time": 1470682617417, - "status": "confirmed", - "containsDelegateCall": false, - "estimatedGas": "0x2faf080", - "hash": "0x88bd8c6276854039ea416a8c38e867546cc928670758aebb8db44b9120f7dad2" - }, - { - "id": 1470682742887332, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "nonce": "0x3", - "gasPrice": "0x4a817c800", - "to": "0x059f1e6f420d6fee280bb83e2702dcd06a2ce9c8", - "value": "0x470de4df8200000", - "data": "0xd92ed137000000000000000000000000000000000000000000000000000000000000006200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084d6574614d61736b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029566973697420457468657265756d20446170707320696e2061206e6f726d616c2042726f777365722e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f7777772e6d6574616d61736b2e696f0000000000000000000000000000000000", - "gasLimit": "0x2fc7720", - "origin": "www.etherfaces.com", - "metamaskId": 1470682742887332, - "metamaskNetworkId": "1" - }, - "time": 1470682742887, - "status": "confirmed", - "containsDelegateCall": false, - "estimatedGas": "0x2faf080", - "hash": "0xc716c9ce00d48edf04ec64ab07ea7b413dd49ffd744359213fe8da69246aad10" - }, - { - "id": 1470692493483229, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "data": "0x60a060405260046060527f48302e31000000000000000000000000000000000000000000000000000000006080526006805460008290527f48302e310000000000000000000000000000000000000000000000000000000882556100b5907ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f602060026001841615610100026000190190931692909204601f01919091048101905b8082111561017957600081556001016100a1565b505060405161097d38038061097d83398101604052808051906020019091908051820191906020018051906020019091908051820191906020015050836000600050600033600160a060020a0316815260200190815260200160002060005081905550836002600050819055508260036000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061017d57805160ff19168380011785555b506101ad9291506100a1565b5090565b8280016001018555821561016d579182015b8281111561016d57825182600050559160200191906001019061018f565b50506004805460ff19168317905560058054825160008390527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0602060026001851615610100026000190190941693909304601f90810184900482019386019083901061022d57805160ff19168380011785555b5061025d9291506100a1565b82800160010185558215610221579182015b8281111561022157825182600050559160200191906001019061023f565b50505050505061070c806102716000396000f36060604052361561008d5760e060020a600035046306fdde038114610095578063095ea7b3146100f257806318160ddd1461015d57806323b872dd14610166578063313ce567146102c757806354fd4d50146102d357806370a082311461033057806395d89b411461035e578063a9059cbb146103bb578063cae9ca511461044d578063dd62ed3e14610618575b610000610002565b61064c60038054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156106ef5780601f106106c4576101008083540402835291602001916106ef565b61034c60043560243533600160a060020a03908116600081815260016020908152604080832094871680845294825282208590556060858152919392917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a35060015b92915050565b61034c60025481565b61034c600435602435604435600160a060020a0383166000908152602081905260408120548290108015906101b9575060016020908152604080832033600160a060020a03168452909152812054829010155b80156101c55750600082115b1561070757816000600050600085600160a060020a03168152602001908152602001600020600082828250540192505081905550816000600050600086600160a060020a03168152602001908152602001600020600082828250540392505081905550816001600050600086600160a060020a03168152602001908152602001600020600050600033600160a060020a0316815260200190815260200160002060008282825054039250508190555082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35060016106fb565b6106ba60045460ff1681565b61064c60068054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156106ef5780601f106106c4576101008083540402835291602001916106ef565b600160a060020a03600435166000908152602081905260409020545b60408051918252519081900360200190f35b61064c60058054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156106ef5780601f106106c4576101008083540402835291602001916106ef565b61034c60043560243533600160a060020a03166000908152602081905260408120548290108015906103ed5750600082115b1561070257604080822080548490039055600160a060020a03808516808452918320805485019055606084815233909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602090a3506001610157565b60806020604435600481810135601f81018490049093028401604052606083815261034c948235946024803595606494939101919081908382808284375094965050505050505033600160a060020a03908116600081815260016020908152604080832094881680845294825280832087905580518781529051929493927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a383600160a060020a031660405180807f72656365697665417070726f76616c28616464726573732c75696e743235362c81526020017f616464726573732c627974657329000000000000000000000000000000000000815260200150602e019050604051809103902060e060020a8091040260e060020a9004338530866040518560e060020a0281526004018085600160a060020a0316815260200184815260200183600160a060020a031681526020018280519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156105f05780820380516001836020036101000a031916815260200191505b509450505050506000604051808303816000876161da5a03f19250505015156106f757610002565b61034c600435602435600160a060020a03808316600090815260016020908152604080832093851683529290522054610157565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156106ac5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6060908152602090f35b820191906000526020600020905b8154815290600101906020018083116106d257829003601f168201915b505050505081565b5060015b9392505050565b610157565b6106fb5600000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000084d5346542062757800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d53465400000000000000000000000000000000000000000000000000000000", - "gasPrice": "0xba43b7400", - "gas": "0xf4240", - "origin": "tokenfactory.surge.sh", - "metamaskId": 1470692493483229, - "metamaskNetworkId": "1" - }, - "time": 1470692493483, - "status": "confirmed", - "estimatedGas": "0xa9482", - "hash": "0xe539d7b39c2742261b9b3d1cdb22940275c6cc4d8b80a8a0222f6d2b0b549311" - }, - { - "id": 1470962599348486, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0x69eabf45623e5b53683924dff98309eb39af1a89", - "value": "0x2", - "origin": "localhost", - "metamaskId": 1470962599348486, - "metamaskNetworkId": "1" - }, - "time": 1470962599348, - "status": "rejected", - "containsDelegateCall": false, - "estimatedGas": "0x5208" - }, - { - "id": 1470963263070463, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0x69eabf45623e5b53683924dff98309eb39af1a89", - "value": "0x2", - "origin": "localhost", - "metamaskId": 1470963263070463, - "metamaskNetworkId": "1" - }, - "time": 1470963263070, - "status": "rejected", - "containsDelegateCall": false, - "estimatedGas": "0x5208" - } - ], - "network": "166", - "seedWords": null, - "unconfMsgs": {}, - "messages": [], - "provider": { - "type": "rpc", - "rpcTarget": "555.203.16.244" - }, - "selectedAddress": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "accountDetail", - "detailView": null, - "context": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - }, - "accountDetail": { - "subview": "transactions" - }, - "currentDomain": "localhost:8080", - "transForward": true, - "isLoading": false, - "warning": null - }, - "identities": {} -} diff --git a/development/states/empty-account-detail.json b/development/states/empty-account-detail.json deleted file mode 100644 index 60b04f03dad9..000000000000 --- a/development/states/empty-account-detail.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "metamask": { - "isInitialized": true, - "isUnlocked": true, - "currentDomain": "example.com", - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc": { - "name": "Wallet 1", - "address": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", - "mayBeFauceting": false - }, - "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b": { - "name": "Wallet 2", - "address": "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b", - "mayBeFauceting": false - }, - "0xeb9e64b93097bc15f01f13eae97015c57ab64823": { - "name": "Wallet 3", - "address": "0xeb9e64b93097bc15f01f13eae97015c57ab64823", - "mayBeFauceting": false - }, - "0x704107d04affddd9b66ab9de3dd7b095852e9b69": { - "name": "Wallet 4", - "address": "0x704107d04affddd9b66ab9de3dd7b095852e9b69", - "mayBeFauceting": false - } - }, - "unconfTxs": {}, - "accounts": { - "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc": { - "code": "0x", - "balance": "0x01", - "nonce": "0x0", - "address": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc" - }, - "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b": { - "code": "0x", - "nonce": "0x0", - "balance": "0x01", - "address": "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b" - }, - "0xeb9e64b93097bc15f01f13eae97015c57ab64823": { - "code": "0x", - "nonce": "0x0", - "balance": "0x01", - "address": "0xeb9e64b93097bc15f01f13eae97015c57ab64823" - }, - "0x704107d04affddd9b66ab9de3dd7b095852e9b69": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0x704107d04affddd9b66ab9de3dd7b095852e9b69" - } - }, - "transactions": [], - "selectedAddress": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", - "network": "2", - "seedWords": null, - "unconfMsgs": {}, - "messages": [], - "provider": { - "type": "testnet" - }, - "selectedAddress": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc" - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "accountDetail", - "detailView": null, - "context": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc" - }, - "accountDetail": { - "subview": "transactions" - }, - "currentDomain": "127.0.0.1:9966", - "transForward": true, - "isLoading": false, - "warning": null - }, - "identities": {} -} diff --git a/development/states/first-time.json b/development/states/first-time.json deleted file mode 100644 index ff70787200f1..000000000000 --- a/development/states/first-time.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "metamask": { - "isInitialized": false, - "isUnlocked": false, - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": {}, - "computedBalances": {}, - "frequentRpcList": [], - "unapprovedTxs": {}, - "currentCurrency": "USD", - "featureFlags": {"betaUI": false}, - "conversionRate": 12.7527416, - "conversionDate": 1487624341, - "noActiveNotices": false, - "nextUnreadNotice": { - "read": false, - "date": "Thu Feb 09 2017", - "title": "Terms of Use", - "body": "# Terms of Use #\n\n**THIS AGREEMENT IS SUBJECT TO BINDING ARBITRATION AND A WAIVER OF CLASS ACTION RIGHTS AS DETAILED IN SECTION 13. PLEASE READ THE AGREEMENT CAREFULLY.**\n\n_Our Terms of Use have been updated as of September 5, 2016_\n\n## 1. Acceptance of Terms ##\n\nMetaMask provides a platform for managing Ethereum (or \"ETH\") accounts, and allowing ordinary websites to interact with the Ethereum blockchain, while keeping the user in control over what transactions they approve, through our website located at[ ](http://metamask.io)[https://metamask.io/](https://metamask.io/) and browser plugin (the \"Site\") — which includes text, images, audio, code and other materials (collectively, the “Contentâ€) and all of the features, and services provided. The Site, and any other features, tools, materials, or other services offered from time to time by MetaMask are referred to here as the “Service.†Please read these Terms of Use (the “Terms†or “Terms of Useâ€) carefully before using the Service. By using or otherwise accessing the Services, or clicking to accept or agree to these Terms where that option is made available, you (1) accept and agree to these Terms (2) consent to the collection, use, disclosure and other handling of information as described in our Privacy Policy and (3) any additional terms, rules and conditions of participation issued by MetaMask from time to time. If you do not agree to the Terms, then you may not access or use the Content or Services.\n\n## 2. Modification of Terms of Use ##\n\nExcept for Section 13, providing for binding arbitration and waiver of class action rights, MetaMask reserves the right, at its sole discretion, to modify or replace the Terms of Use at any time. The most current version of these Terms will be posted on our Site. You shall be responsible for reviewing and becoming familiar with any such modifications. Use of the Services by you after any modification to the Terms constitutes your acceptance of the Terms of Use as modified.\n\n\n\n## 3. Eligibility ##\n\nYou hereby represent and warrant that you are fully able and competent to enter into the terms, conditions, obligations, affirmations, representations and warranties set forth in these Terms and to abide by and comply with these Terms.\n\nMetaMask is a global platform and by accessing the Content or Services, you are representing and warranting that, you are of the legal age of majority in your jurisdiction as is required to access such Services and Content and enter into arrangements as provided by the Service. You further represent that you are otherwise legally permitted to use the service in your jurisdiction including owning cryptographic tokens of value, and interacting with the Services or Content in any way. You further represent you are responsible for ensuring compliance with the laws of your jurisdiction and acknowledge that MetaMask is not liable for your compliance with such laws.\n\n## 4 Account Password and Security ##\n\nWhen setting up an account within MetaMask, you will be responsible for keeping your own account secrets, which may be a twelve-word seed phrase, an account file, or other locally stored secret information. MetaMask encrypts this information locally with a password you provide, that we never send to our servers. You agree to (a) never use the same password for MetaMask that you have ever used outside of this service; (b) keep your secret information and password confidential and do not share them with anyone else; (c) immediately notify MetaMask of any unauthorized use of your account or breach of security. MetaMask cannot and will not be liable for any loss or damage arising from your failure to comply with this section.\n\n## 5. Representations, Warranties, and Risks ##\n\n### 5.1. Warranty Disclaimer ###\n\nYou expressly understand and agree that your use of the Service is at your sole risk. The Service (including the Service and the Content) are provided on an \"AS IS\" and \"as available\" basis, without warranties of any kind, either express or implied, including, without limitation, implied warranties of merchantability, fitness for a particular purpose or non-infringement. You acknowledge that MetaMask has no control over, and no duty to take any action regarding: which users gain access to or use the Service; what effects the Content may have on you; how you may interpret or use the Content; or what actions you may take as a result of having been exposed to the Content. You release MetaMask from all liability for you having acquired or not acquired Content through the Service. MetaMask makes no representations concerning any Content contained in or accessed through the Service, and MetaMask will not be responsible or liable for the accuracy, copyright compliance, legality or decency of material contained in or accessed through the Service.\n\n### 5.2 Sophistication and Risk of Cryptographic Systems ###\n\nBy utilizing the Service or interacting with the Content or platform in any way, you represent that you understand the inherent risks associated with cryptographic systems; and warrant that you have an understanding of the usage and intricacies of native cryptographic tokens, like Ether (ETH) and Bitcoin (BTC), smart contract based tokens such as those that follow the Ethereum Token Standard (https://github.com/ethereum/EIPs/issues/20), and blockchain-based software systems.\n\n### 5.3 Risk of Regulatory Actions in One or More Jurisdictions ###\n\nMetaMask and ETH could be impacted by one or more regulatory inquiries or regulatory action, which could impede or limit the ability of MetaMask to continue to develop, or which could impede or limit your ability to access or use the Service or Ethereum blockchain.\n\n### 5.4 Risk of Weaknesses or Exploits in the Field of Cryptography ###\n\nYou acknowledge and understand that Cryptography is a progressing field. Advances in code cracking or technical advances such as the development of quantum computers may present risks to cryptocurrencies and Services of Content, which could result in the theft or loss of your cryptographic tokens or property. To the extent possible, MetaMask intends to update the protocol underlying Services to account for any advances in cryptography and to incorporate additional security measures, but does not guarantee or otherwise represent full security of the system. By using the Service or accessing Content, you acknowledge these inherent risks.\n\n### 5.5 Volatility of Crypto Currencies ###\n\nYou understand that Ethereum and other blockchain technologies and associated currencies or tokens are highly volatile due to many factors including but not limited to adoption, speculation, technology and security risks. You also acknowledge that the cost of transacting on such technologies is variable and may increase at any time causing impact to any activities taking place on the Ethereum blockchain. You acknowledge these risks and represent that MetaMask cannot be held liable for such fluctuations or increased costs.\n\n### 5.6 Application Security ###\n\nYou acknowledge that Ethereum applications are code subject to flaws and acknowledge that you are solely responsible for evaluating any code provided by the Services or Content and the trustworthiness of any third-party websites, products, smart-contracts, or Content you access or use through the Service. You further expressly acknowledge and represent that Ethereum applications can be written maliciously or negligently, that MetaMask cannot be held liable for your interaction with such applications and that such applications may cause the loss of property or even identity. This warning and others later provided by MetaMask in no way evidence or represent an on-going duty to alert you to all of the potential risks of utilizing the Service or Content.\n\n## 6. Indemnity ##\n\nYou agree to release and to indemnify, defend and hold harmless MetaMask and its parents, subsidiaries, affiliates and agencies, as well as the officers, directors, employees, shareholders and representatives of any of the foregoing entities, from and against any and all losses, liabilities, expenses, damages, costs (including attorneys’ fees and court costs) claims or actions of any kind whatsoever arising or resulting from your use of the Service, your violation of these Terms of Use, and any of your acts or omissions that implicate publicity rights, defamation or invasion of privacy. MetaMask reserves the right, at its own expense, to assume exclusive defense and control of any matter otherwise subject to indemnification by you and, in such case, you agree to cooperate with MetaMask in the defense of such matter.\n\n## 7. Limitation on liability ##\n\nYOU ACKNOWLEDGE AND AGREE THAT YOU ASSUME FULL RESPONSIBILITY FOR YOUR USE OF THE SITE AND SERVICE. YOU ACKNOWLEDGE AND AGREE THAT ANY INFORMATION YOU SEND OR RECEIVE DURING YOUR USE OF THE SITE AND SERVICE MAY NOT BE SECURE AND MAY BE INTERCEPTED OR LATER ACQUIRED BY UNAUTHORIZED PARTIES. YOU ACKNOWLEDGE AND AGREE THAT YOUR USE OF THE SITE AND SERVICE IS AT YOUR OWN RISK. RECOGNIZING SUCH, YOU UNDERSTAND AND AGREE THAT, TO THE FULLEST EXTENT PERMITTED BY APPLICABLE LAW, NEITHER METAMASK NOR ITS SUPPLIERS OR LICENSORS WILL BE LIABLE TO YOU FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY OR OTHER DAMAGES OF ANY KIND, INCLUDING WITHOUT LIMITATION DAMAGES FOR LOSS OF PROFITS, GOODWILL, USE, DATA OR OTHER TANGIBLE OR INTANGIBLE LOSSES OR ANY OTHER DAMAGES BASED ON CONTRACT, TORT, STRICT LIABILITY OR ANY OTHER THEORY (EVEN IF METAMASK HAD BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES), RESULTING FROM THE SITE OR SERVICE; THE USE OR THE INABILITY TO USE THE SITE OR SERVICE; UNAUTHORIZED ACCESS TO OR ALTERATION OF YOUR TRANSMISSIONS OR DATA; STATEMENTS OR CONDUCT OF ANY THIRD PARTY ON THE SITE OR SERVICE; ANY ACTIONS WE TAKE OR FAIL TO TAKE AS A RESULT OF COMMUNICATIONS YOU SEND TO US; HUMAN ERRORS; TECHNICAL MALFUNCTIONS; FAILURES, INCLUDING PUBLIC UTILITY OR TELEPHONE OUTAGES; OMISSIONS, INTERRUPTIONS, LATENCY, DELETIONS OR DEFECTS OF ANY DEVICE OR NETWORK, PROVIDERS, OR SOFTWARE (INCLUDING, BUT NOT LIMITED TO, THOSE THAT DO NOT PERMIT PARTICIPATION IN THE SERVICE); ANY INJURY OR DAMAGE TO COMPUTER EQUIPMENT; INABILITY TO FULLY ACCESS THE SITE OR SERVICE OR ANY OTHER WEBSITE; THEFT, TAMPERING, DESTRUCTION, OR UNAUTHORIZED ACCESS TO, IMAGES OR OTHER CONTENT OF ANY KIND; DATA THAT IS PROCESSED LATE OR INCORRECTLY OR IS INCOMPLETE OR LOST; TYPOGRAPHICAL, PRINTING OR OTHER ERRORS, OR ANY COMBINATION THEREOF; OR ANY OTHER MATTER RELATING TO THE SITE OR SERVICE.\n\nSOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF CERTAIN WARRANTIES OR THE LIMITATION OR EXCLUSION OF LIABILITY FOR INCIDENTAL OR CONSEQUENTIAL DAMAGES. ACCORDINGLY, SOME OF THE ABOVE LIMITATIONS MAY NOT APPLY TO YOU.\n\n## 8. Our Proprietary Rights ##\n\nAll title, ownership and intellectual property rights in and to the Service are owned by MetaMask or its licensors. You acknowledge and agree that the Service contains proprietary and confidential information that is protected by applicable intellectual property and other laws. Except as expressly authorized by MetaMask, you agree not to copy, modify, rent, lease, loan, sell, distribute, perform, display or create derivative works based on the Service, in whole or in part. MetaMask issues a license for MetaMask, found [here](https://github.com/MetaMask/metamask-plugin/blob/master/LICENSE). For information on other licenses utilized in the development of MetaMask, please see our attribution page at: [https://metamask.io/attributions.html](https://metamask.io/attributions.html)\n\n## 9. Links ##\n\nThe Service provides, or third parties may provide, links to other World Wide Web or accessible sites, applications or resources. Because MetaMask has no control over such sites, applications and resources, you acknowledge and agree that MetaMask is not responsible for the availability of such external sites, applications or resources, and does not endorse and is not responsible or liable for any content, advertising, products or other materials on or available from such sites or resources. You further acknowledge and agree that MetaMask shall not be responsible or liable, directly or indirectly, for any damage or loss caused or alleged to be caused by or in connection with use of or reliance on any such content, goods or services available on or through any such site or resource.\n\n## 10. Termination and Suspension ##\n\nMetaMask may terminate or suspend all or part of the Service and your MetaMask access immediately, without prior notice or liability, if you breach any of the terms or conditions of the Terms. Upon termination of your access, your right to use the Service will immediately cease.\n\nThe following provisions of the Terms survive any termination of these Terms: INDEMNITY; WARRANTY DISCLAIMERS; LIMITATION ON LIABILITY; OUR PROPRIETARY RIGHTS; LINKS; TERMINATION; NO THIRD PARTY BENEFICIARIES; BINDING ARBITRATION AND CLASS ACTION WAIVER; GENERAL INFORMATION.\n\n## 11. No Third Party Beneficiaries ##\n\nYou agree that, except as otherwise expressly provided in these Terms, there shall be no third party beneficiaries to the Terms.\n\n## 12. Notice and Procedure For Making Claims of Copyright Infringement ##\n\nIf you believe that your copyright or the copyright of a person on whose behalf you are authorized to act has been infringed, please provide MetaMask’s Copyright Agent a written Notice containing the following information:\n\n· an electronic or physical signature of the person authorized to act on behalf of the owner of the copyright or other intellectual property interest;\n\n· a description of the copyrighted work or other intellectual property that you claim has been infringed;\n\n· a description of where the material that you claim is infringing is located on the Service;\n\n· your address, telephone number, and email address;\n\n· a statement by you that you have a good faith belief that the disputed use is not authorized by the copyright owner, its agent, or the law;\n\n· a statement by you, made under penalty of perjury, that the above information in your Notice is accurate and that you are the copyright or intellectual property owner or authorized to act on the copyright or intellectual property owner's behalf.\n\nMetaMask’s Copyright Agent can be reached at:\n\nEmail: copyright [at] metamask [dot] io\n\nMail:\n\nAttention:\n\nMetaMask Copyright â„… ConsenSys\n\n49 Bogart Street\n\nBrooklyn, NY 11206\n\n## 13. Binding Arbitration and Class Action Waiver ##\n\nPLEASE READ THIS SECTION CAREFULLY – IT MAY SIGNIFICANTLY AFFECT YOUR LEGAL RIGHTS, INCLUDING YOUR RIGHT TO FILE A LAWSUIT IN COURT\n\n### 13.1 Initial Dispute Resolution ###\n\nThe parties shall use their best efforts to engage directly to settle any dispute, claim, question, or disagreement and engage in good faith negotiations which shall be a condition to either party initiating a lawsuit or arbitration.\n\n### 13.2 Binding Arbitration ###\n\nIf the parties do not reach an agreed upon solution within a period of 30 days from the time informal dispute resolution under the Initial Dispute Resolution provision begins, then either party may initiate binding arbitration as the sole means to resolve claims, subject to the terms set forth below. Specifically, all claims arising out of or relating to these Terms (including their formation, performance and breach), the parties’ relationship with each other and/or your use of the Service shall be finally settled by binding arbitration administered by the American Arbitration Association in accordance with the provisions of its Commercial Arbitration Rules and the supplementary procedures for consumer related disputes of the American Arbitration Association (the \"AAA\"), excluding any rules or procedures governing or permitting class actions.\n\nThe arbitrator, and not any federal, state or local court or agency, shall have exclusive authority to resolve all disputes arising out of or relating to the interpretation, applicability, enforceability or formation of these Terms, including, but not limited to any claim that all or any part of these Terms are void or voidable, or whether a claim is subject to arbitration. The arbitrator shall be empowered to grant whatever relief would be available in a court under law or in equity. The arbitrator’s award shall be written, and binding on the parties and may be entered as a judgment in any court of competent jurisdiction.\n\nThe parties understand that, absent this mandatory provision, they would have the right to sue in court and have a jury trial. They further understand that, in some instances, the costs of arbitration could exceed the costs of litigation and the right to discovery may be more limited in arbitration than in court.\n\n### 13.3 Location ###\n\nBinding arbitration shall take place in New York. You agree to submit to the personal jurisdiction of any federal or state court in New York County, New York, in order to compel arbitration, to stay proceedings pending arbitration, or to confirm, modify, vacate or enter judgment on the award entered by the arbitrator.\n\n### 13.4 Class Action Waiver ###\n\nThe parties further agree that any arbitration shall be conducted in their individual capacities only and not as a class action or other representative action, and the parties expressly waive their right to file a class action or seek relief on a class basis. YOU AND METAMASK AGREE THAT EACH MAY BRING CLAIMS AGAINST THE OTHER ONLY IN YOUR OR ITS INDIVIDUAL CAPACITY, AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED CLASS OR REPRESENTATIVE PROCEEDING. If any court or arbitrator determines that the class action waiver set forth in this paragraph is void or unenforceable for any reason or that an arbitration can proceed on a class basis, then the arbitration provision set forth above shall be deemed null and void in its entirety and the parties shall be deemed to have not agreed to arbitrate disputes.\n\n### 13.5 Exception - Litigation of Intellectual Property and Small Claims Court Claims ###\n\nNotwithstanding the parties' decision to resolve all disputes through arbitration, either party may bring an action in state or federal court to protect its intellectual property rights (\"intellectual property rights\" means patents, copyrights, moral rights, trademarks, and trade secrets, but not privacy or publicity rights). Either party may also seek relief in a small claims court for disputes or claims within the scope of that court’s jurisdiction.\n\n### 13.6 30-Day Right to Opt Out ###\n\nYou have the right to opt-out and not be bound by the arbitration and class action waiver provisions set forth above by sending written notice of your decision to opt-out to the following address: MetaMask â„… ConsenSys, 49 Bogart Street, Brooklyn NY 11206 and via email at support@metamask.io. The notice must be sent within 30 days of September 6, 2016 or your first use of the Service, whichever is later, otherwise you shall be bound to arbitrate disputes in accordance with the terms of those paragraphs. If you opt-out of these arbitration provisions, MetaMask also will not be bound by them.\n\n### 13.7 Changes to This Section ###\n\nMetaMask will provide 60-days’ notice of any changes to this section. Changes will become effective on the 60th day, and will apply prospectively only to any claims arising after the 60th day.\n\nFor any dispute not subject to arbitration you and MetaMask agree to submit to the personal and exclusive jurisdiction of and venue in the federal and state courts located in New York, New York. You further agree to accept service of process by mail, and hereby waive any and all jurisdictional and venue defenses otherwise available.\n\nThe Terms and the relationship between you and MetaMask shall be governed by the laws of the State of New York without regard to conflict of law provisions.\n\n## 14. General Information ##\n\n### 14.1 Entire Agreement ###\n\nThese Terms (and any additional terms, rules and conditions of participation that MetaMask may post on the Service) constitute the entire agreement between you and MetaMask with respect to the Service and supersedes any prior agreements, oral or written, between you and MetaMask. In the event of a conflict between these Terms and the additional terms, rules and conditions of participation, the latter will prevail over the Terms to the extent of the conflict.\n\n### 14.2 Waiver and Severability of Terms ###\n\nThe failure of MetaMask to exercise or enforce any right or provision of the Terms shall not constitute a waiver of such right or provision. If any provision of the Terms is found by an arbitrator or court of competent jurisdiction to be invalid, the parties nevertheless agree that the arbitrator or court should endeavor to give effect to the parties' intentions as reflected in the provision, and the other provisions of the Terms remain in full force and effect.\n\n### 14.3 Statute of Limitations ###\n\nYou agree that regardless of any statute or law to the contrary, any claim or cause of action arising out of or related to the use of the Service or the Terms must be filed within one (1) year after such claim or cause of action arose or be forever barred.\n\n### 14.4 Section Titles ###\n\nThe section titles in the Terms are for convenience only and have no legal or contractual effect.\n\n### 14.5 Communications ###\n\nUsers with questions, complaints or claims with respect to the Service may contact us using the relevant contact information set forth above and at communications@metamask.io.\n\n## 15 Related Links ##\n\n**[Terms of Use](https://metamask.io/terms.html)**\n\n**[Privacy](https://metamask.io/privacy.html)**\n\n**[Attributions](https://metamask.io/attributions.html)**\n\n", - "id": 0 - }, - "network": "3", - "accounts": {}, - "transactions": {}, - "selectedAddressTxList": [], - "unapprovedMsgs": {}, - "unapprovedMsgCount": 0, - "keyringTypes": [ - "Simple Key Pair", - "HD Key Tree" - ], - "keyrings": [], - "currentCurrency": "USD", - "provider": { - "type": "testnet" - }, - "shapeShiftTxList": [], - "lostAccounts": [], - "tokens": [], - "currentLocale": "en", - "preferences": { - "useNativeCurrencyAsPrimaryCurrency": true - } - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "accounts", - "detailView": null - }, - "accountDetail": { - "subview": "transactions" - }, - "sidebar": {}, - "transForward": true, - "isLoading": false, - "warning": null, - "modal": { - "modalState": {"name": null}, - "open": false, - "previousModalState": {"name": null} - } - }, - "identities": {}, - "computedBalances": {}, - "confirmTransaction": { - "txData": {}, - "tokenData": {}, - "methodData": {}, - "tokenProps": { - "tokenDecimals": "", - "tokenSymbol": "" - }, - "fiatTransactionAmount": "", - "fiatTransactionFee": "", - "fiatTransactionTotal": "", - "ethTransactionAmount": "", - "ethTransactionFee": "", - "ethTransactionTotal": "", - "hexGasTotal": "", - "nonce": "", - "fetchingMethodData": false - } -} diff --git a/development/states/help.json b/development/states/help.json deleted file mode 100644 index cb8b119708a9..000000000000 --- a/development/states/help.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "metamask": { - "isInitialized": true, - "isUnlocked": true, - "currentDomain": "example.com", - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc": { - "name": "Wallet 1", - "address": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", - "mayBeFauceting": false - }, - "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b": { - "name": "Wallet 2", - "address": "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b", - "mayBeFauceting": false - }, - "0xeb9e64b93097bc15f01f13eae97015c57ab64823": { - "name": "Wallet 3", - "address": "0xeb9e64b93097bc15f01f13eae97015c57ab64823", - "mayBeFauceting": false - }, - "0x704107d04affddd9b66ab9de3dd7b095852e9b69": { - "name": "Wallet 4", - "address": "0x704107d04affddd9b66ab9de3dd7b095852e9b69", - "mayBeFauceting": false - } - }, - "unconfTxs": {}, - "accounts": { - "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc" - }, - "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b" - }, - "0xeb9e64b93097bc15f01f13eae97015c57ab64823": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0xeb9e64b93097bc15f01f13eae97015c57ab64823" - }, - "0x704107d04affddd9b66ab9de3dd7b095852e9b69": { - "code": "0x", - "nonce": "0x0", - "balance": "0x0", - "address": "0x704107d04affddd9b66ab9de3dd7b095852e9b69" - } - }, - "transactions": [], - "network": "2", - "unconfMsgs": {}, - "messages": [], - "provider": { - "type": "testnet" - }, - "selectedAddress": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", - "seedWords": null - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "info" - }, - "accountDetail": { - "subview": "transactions", - "accountExport": "none", - "privateKey": "" - }, - "currentDomain": "extensions", - "transForward": true, - "isLoading": false, - "warning": null, - "scrollToBottom": true - }, - "identities": {} -} diff --git a/development/states/import-private-key-warning.json b/development/states/import-private-key-warning.json deleted file mode 100644 index 80ebc650df7b..000000000000 --- a/development/states/import-private-key-warning.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "metamask": { - "isInitialized": true, - "isUnlocked": true, - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0x01208723ba84e15da2e71656544a2963b0c06d40": { - "address": "0x01208723ba84e15da2e71656544a2963b0c06d40", - "name": "Account 1" - } - }, - "unconfTxs": {}, - "currentCurrency": "USD", - "conversionRate": 10.1219126, - "conversionDate": 1484695442, - "noActiveNotices": true, - "network": "3", - "accounts": { - "0x01208723ba84e15da2e71656544a2963b0c06d40": { - "nonce": "0x0", - "balance": "0x0", - "code": "0x", - "address": "0x01208723ba84e15da2e71656544a2963b0c06d40" - } - }, - "transactions": [], - "provider": { - "type": "testnet" - }, - "selectedAddress": "0x01208723ba84e15da2e71656544a2963b0c06d40", - "selectedAccountTxList": [], - "seedWords": false, - "unconfMsgs": {}, - "messages": [], - "shapeShiftTxList": [], - "keyringTypes": [ - "Simple Key Pair", - "HD Key Tree" - ], - "keyrings": [ - { - "type": "Simple Key Pair", - "accounts": [] - }, - { - "type": "Simple Key Pair", - "accounts": [] - }, - { - "type": "Simple Key Pair", - "accounts": [] - }, - { - "type": "Simple Key Pair", - "accounts": [] - }, - { - "type": "Simple Key Pair", - "accounts": [] - }, - { - "type": "Simple Key Pair", - "accounts": [] - }, - { - "type": "Simple Key Pair", - "accounts": [] - }, - { - "type": "HD Key Tree", - "accounts": [ - "01208723ba84e15da2e71656544a2963b0c06d40" - ] - } - ], - "lostAccounts": [] - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "import-menu" - }, - "accountDetail": { - "subview": "transactions" - }, - "transForward": true, - "isLoading": false, - "warning": "Invalid hex string" - }, - "identities": {} -} diff --git a/development/states/import-private-key.json b/development/states/import-private-key.json deleted file mode 100644 index bd455c6d59f5..000000000000 --- a/development/states/import-private-key.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "metamask": { - "isInitialized": true, - "isUnlocked": true, - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0x01208723ba84e15da2e71656544a2963b0c06d40": { - "address": "0x01208723ba84e15da2e71656544a2963b0c06d40", - "name": "Account 1" - } - }, - "unconfTxs": {}, - "currentCurrency": "USD", - "conversionRate": 10.10788584, - "conversionDate": 1484694362, - "noActiveNotices": true, - "network": "3", - "accounts": { - "0x01208723ba84e15da2e71656544a2963b0c06d40": { - "balance": "0x0", - "code": "0x", - "nonce": "0x0", - "address": "0x01208723ba84e15da2e71656544a2963b0c06d40" - } - }, - "transactions": [], - "provider": { - "type": "testnet" - }, - "selectedAddress": "0x01208723ba84e15da2e71656544a2963b0c06d40", - "selectedAccountTxList": [], - "seedWords": null, - "unconfMsgs": {}, - "messages": [], - "shapeShiftTxList": [], - "keyringTypes": [ - "Simple Key Pair", - "HD Key Tree" - ], - "keyrings": [ - { - "type": "HD Key Tree", - "accounts": [ - "01208723ba84e15da2e71656544a2963b0c06d40" - ] - } - ], - "lostAccounts": [] - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "import-menu" - }, - "accountDetail": { - "subview": "transactions" - }, - "transForward": true, - "isLoading": false, - "warning": null - }, - "identities": {} -} diff --git a/development/states/locked.json b/development/states/locked.json deleted file mode 100644 index 866394e86681..000000000000 --- a/development/states/locked.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "metamask": { - "isInitialized": true, - "isUnlocked": false, - "currentDomain": "example.com", - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": {}, - "unconfTxs": {}, - "currentCurrency": "USD", - "conversionRate": 11.4379398, - "conversionDate": 1473358355, - "accounts": {}, - "transactions": [], - "selectedAddress": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "network": "1473186153102", - "seedWords": null, - "unconfMsgs": {}, - "messages": [], - "shapeShiftTxList": [], - "provider": { - "type": "rpc", - "rpcTarget": "http://localhost:8545" - }, - "selectedAddress": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "accountDetail", - "detailView": null, - "context": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - }, - "accountDetail": { - "subview": "transactions" - }, - "currentDomain": "127.0.0.1:9966", - "transForward": true, - "isLoading": false, - "warning": null - }, - "identities": {} -} diff --git a/development/states/lost-accounts.json b/development/states/lost-accounts.json deleted file mode 100644 index 4f50092b0da9..000000000000 --- a/development/states/lost-accounts.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "metamask": { - "currentCurrency": "USD", - "lostAccounts": [ - "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", - "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b" - ], - "conversionRate": 11.06608791, - "conversionDate": 1470421024, - "isInitialized": true, - "isUnlocked": true, - "currentDomain": "example.com", - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc": { - "name": "Wallet 1", - "address": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", - "mayBeFauceting": false - }, - "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b": { - "name": "Wallet 2", - "address": "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b", - "mayBeFauceting": false - }, - "0xeb9e64b93097bc15f01f13eae97015c57ab64823": { - "name": "Wallet 3", - "address": "0xeb9e64b93097bc15f01f13eae97015c57ab64823", - "mayBeFauceting": false - }, - "0x704107d04affddd9b66ab9de3dd7b095852e9b69": { - "name": "Wallet 4", - "address": "0x704107d04affddd9b66ab9de3dd7b095852e9b69", - "mayBeFauceting": false - } - }, - "unconfTxs": {}, - "accounts": { - "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc": { - "code": "0x", - "balance": "0x100000000000", - "nonce": "0x0", - "address": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc" - }, - "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b": { - "code": "0x", - "nonce": "0x0", - "balance": "0x100000000000", - "address": "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b" - }, - "0xeb9e64b93097bc15f01f13eae97015c57ab64823": { - "code": "0x", - "nonce": "0x0", - "balance": "0x100000000000", - "address": "0xeb9e64b93097bc15f01f13eae97015c57ab64823" - }, - "0x704107d04affddd9b66ab9de3dd7b095852e9b69": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0x704107d04affddd9b66ab9de3dd7b095852e9b69" - } - }, - "transactions": [], - "selectedAddress": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", - "network": "2", - "seedWords": null, - "unconfMsgs": {}, - "messages": [], - "provider": { - "type": "testnet" - }, - "selectedAddress": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc" - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "accountDetail", - "detailView": null, - "context": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc" - }, - "accountDetail": { - "subview": "transactions" - }, - "currentDomain": "127.0.0.1:9966", - "transForward": true, - "isLoading": false, - "warning": null - }, - "identities": {} -} diff --git a/development/states/navigate-txs.json b/development/states/navigate-txs.json deleted file mode 100644 index 584a754f010c..000000000000 --- a/development/states/navigate-txs.json +++ /dev/null @@ -1,324 +0,0 @@ -{ - "metamask": { - "isInitialized": true, - "isUnlocked": true, - "isAccountMenuOpen": false, - "isPopup": false, - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0x8cf82b5aa41ff2282427be151dd328568684007a": { - "address": "0x8cf82b5aa41ff2282427be151dd328568684007a", - "name": "Account 3" - }, - "0xbe1a00e10ec68b154adb84e8119167146a71c9a2": { - "address": "0xbe1a00e10ec68b154adb84e8119167146a71c9a2", - "name": "Account 2" - }, - "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2": { - "address": "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", - "name": "Account 1" - } - }, - "unapprovedTxs": { - "2389644572638771": { - "estimatedGas": "0x8544", - "gasLimitSpecified": true, - "gasPriceSpecified": true, - "history": [], - "id": 2389644572638771, - "loadingDefaults": false, - "metamaskNetworkId": "4", - "origin": "MetaMask", - "status": "unapproved", - "time": 1538844175144, - "txParams": { - "data": "0xa9059cbb000000000000000000000000be1a00e10ec68b154adb84e8119167146a71c9a20000000000000000000000000000000000000000000000000000000000000000", - "from": "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", - "gas": "0x8544", - "gasPrice": "0x3b9aca00", - "to": "0xe0b7927c4af23765cb51314a0e0521a9645f0e2a", - "value": "0x0" - }, - "type": "standard" - }, - "2389644572638772": { - "estimatedGas": "0x5208", - "gasLimitSpecified": true, - "gasPriceSpecified": true, - "history": [], - "id": 2389644572638772, - "loadingDefaults": false, - "metamaskNetworkId": "4", - "origin": "MetaMask", - "status": "unapproved", - "time": 1538844178492, - "txParams": { - "from": "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", - "gas": "0x5208", - "gasPrice": "0x3b9aca00", - "to": "0xbe1a00e10ec68b154adb84e8119167146a71c9a2", - "value": "0x0" - }, - "type": "standard" - }, - "2389644572638773": { - "estimatedGas": { - "length": 1, - "negative": 0, - "red": null, - "words": [ - 34061, - null - ] - }, - "gasLimitSpecified": false, - "gasPriceSpecified": true, - "history": [], - "id": 2389644572638773, - "loadingDefaults": false, - "metamaskNetworkId": "4", - "origin": "localhost", - "status": "unapproved", - "time": 1538844204724, - "txParams": { - "data": "0xdfb29935000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000155468697320697320746865206970667320686173680000000000000000000000", - "from": "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", - "gas": "0xc793", - "gasPrice": "0x3b9aca00", - "to": "0xb7ec370c889b3b48ec537e0b2c887faedceb254a", - "value": "0x0" - }, - "type": "standard" - }, - "2389644572638774": { - "estimatedGas": "0x38f53", - "gasLimitSpecified": true, - "gasPriceSpecified": false, - "history": [], - "id": 2389644572638774, - "loadingDefaults": false, - "metamaskNetworkId": "4", - "origin": "remix.ethereum.org", - "status": "unapproved", - "time": 1538844223352, - "txParams": { - "data": "0x608060405234801561001057600080fd5b506102a7806100206000396000f30060806040526004361061004b5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663d13319c48114610050578063dfb29935146100da575b600080fd5b34801561005c57600080fd5b50610065610135565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561009f578181015183820152602001610087565b50505050905090810190601f1680156100cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100e657600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101339436949293602493928401919081908401838280828437509497506101cc9650505050505050565b005b60008054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156101c15780601f10610196576101008083540402835291602001916101c1565b820191906000526020600020905b8154815290600101906020018083116101a457829003601f168201915b505050505090505b90565b80516101df9060009060208401906101e3565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061022457805160ff1916838001178555610251565b82800160010185558215610251579182015b82811115610251578251825591602001919060010190610236565b5061025d929150610261565b5090565b6101c991905b8082111561025d57600081556001016102675600a165627a7a72305820cf4282c534b8f2faad947d592afa109b907e4e6b2f52335b361b69c24fedb9580029", - "from": "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", - "gas": "0x38f53", - "gasPrice": "0x3b9aca00", - "value": "0x0" - }, - "type": "standard" - } - }, - "noActiveNotices": true, - "frequentRpcList": [], - "addressBook": [], - "selectedTokenAddress": null, - "contractExchangeRates": {}, - "tokenExchangeRates": {}, - "tokens": [ - { - "address": "0xe0b7927c4af23765cb51314a0e0521a9645f0e2a", - "decimals": 9, - "symbol": "DGD" - } - ], - "pendingTokens": {}, - "send": { - "gasLimit": null, - "gasPrice": null, - "gasTotal": null, - "tokenBalance": null, - "from": "", - "to": "", - "amount": "0x0", - "memo": "", - "errors": {}, - "editingTransactionId": null, - "forceGasMin": null - }, - "coinOptions": {}, - "useBlockie": false, - "featureFlags": { - "betaUI": true, - "skipAnnounceBetaUI": true - }, - "isRevealingSeedWords": false, - "welcomeScreenSeen": false, - "currentLocale": "en", - "preferences": { - "useETHAsPrimaryCurrency": true - }, - "provider": { - "type": "rinkeby" - }, - "network": "4", - "accounts": { - "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2": { - "address": "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", - "balance": "0x36aabfb2a0190c00" - }, - "0xbe1a00e10ec68b154adb84e8119167146a71c9a2": { - "address": "0xbe1a00e10ec68b154adb84e8119167146a71c9a2", - "balance": "0x7b3ef08c294a000" - }, - "0x8cf82b5aa41ff2282427be151dd328568684007a": { - "address": "0x8cf82b5aa41ff2282427be151dd328568684007a", - "balance": "0x0" - } - }, - "currentBlockGasLimit": "0x731e25", - "selectedAddressTxList": [], - "computedBalances": {}, - "unapprovedMsgs": {}, - "unapprovedMsgCount": 0, - "unapprovedPersonalMsgs": {}, - "unapprovedPersonalMsgCount": 0, - "unapprovedTypedMessages": {}, - "unapprovedTypedMessagesCount": 0, - "keyringTypes": [ - "Simple Key Pair", - "HD Key Tree", - "Trezor Hardware", - "Ledger Hardware" - ], - "keyrings": [ - { - "type": "HD Key Tree", - "accounts": [ - "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", - "0xbe1a00e10ec68b154adb84e8119167146a71c9a2", - "0x8cf82b5aa41ff2282427be151dd328568684007a" - ] - } - ], - "currentAccountTab": "history", - "accountTokens": { - "0x8cf82b5aa41ff2282427be151dd328568684007a": {}, - "0xbe1a00e10ec68b154adb84e8119167146a71c9a2": {}, - "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2": { - "rinkeby": [ - { - "address": "0xe0b7927c4af23765cb51314a0e0521a9645f0e2a", - "decimals": 9, - "symbol": "DGD" - }, - { - "address": "0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359", - "decimals": 18, - "symbol": "DAI" - } - ] - } - }, - "assetImages": { - "0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359": null, - "0xe0b7927c4af23765cb51314a0e0521a9645f0e2a": null - }, - "suggestedTokens": {}, - "lostIdentities": {}, - "seedWords": null, - "forgottenPassword": false, - "selectedAddress": "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", - "recentBlocks": [], - "currentCurrency": "usd", - "conversionRate": 225.23, - "conversionDate": 1538859376, - "shapeShiftTxList": [], - "infuraNetworkStatus": { - "kovan": "ok", - "mainnet": "ok", - "rinkeby": "ok", - "ropsten": "ok", - "goerli": "ok" - }, - "lostAccounts": [] - }, - "appState": { - "shouldClose": false, - "menuOpen": false, - "modal": { - "open": false, - "modalState": { - "name": null, - "props": {} - }, - "previousModalState": { - "name": null - } - }, - "sidebar": { - "isOpen": false, - "transitionName": "", - "type": "" - }, - "alertOpen": false, - "alertMessage": null, - "qrCodeData": null, - "networkDropdownOpen": false, - "currentView": { - "name": "confTx", - "context": 0 - }, - "accountDetail": { - "subview": "transactions" - }, - "transForward": false, - "isLoading": false, - "warning": null, - "buyView": {}, - "isMouseUser": true, - "gasIsLoading": false, - "networkNonce": "0x92", - "defaultHdPaths": { - "trezor": "m/44'/60'/0'/0", - "ledger": "m/44'/60'/0'/0/0" - } - }, - "localeMessages": {}, - "send": { - "fromDropdownOpen": false, - "toDropdownOpen": false, - "errors": {}, - "warnings": {} - }, - "confirmTransaction": { - "txData": { - "estimatedGas": "0x38f53", - "gasLimitSpecified": true, - "gasPriceSpecified": false, - "history": [], - "id": 2389644572638774, - "loadingDefaults": false, - "metamaskNetworkId": "4", - "origin": "remix.ethereum.org", - "status": "unapproved", - "time": 1538844223352, - "txParams": { - "data": "0x608060405234801561001057600080fd5b506102a7806100206000396000f30060806040526004361061004b5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663d13319c48114610050578063dfb29935146100da575b600080fd5b34801561005c57600080fd5b50610065610135565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561009f578181015183820152602001610087565b50505050905090810190601f1680156100cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100e657600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101339436949293602493928401919081908401838280828437509497506101cc9650505050505050565b005b60008054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156101c15780601f10610196576101008083540402835291602001916101c1565b820191906000526020600020905b8154815290600101906020018083116101a457829003601f168201915b505050505090505b90565b80516101df9060009060208401906101e3565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061022457805160ff1916838001178555610251565b82800160010185558215610251579182015b82811115610251578251825591602001919060010190610236565b5061025d929150610261565b5090565b6101c991905b8082111561025d57600081556001016102675600a165627a7a72305820cf4282c534b8f2faad947d592afa109b907e4e6b2f52335b361b69c24fedb9580029", - "from": "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2", - "gas": "0x38f53", - "gasPrice": "0x3b9aca00", - "value": "0x0" - }, - "type": "standard" - }, - "tokenData": {}, - "methodData": {}, - "tokenProps": { - "tokenDecimals": "", - "tokenSymbol": "" - }, - "fiatTransactionAmount": "0", - "fiatTransactionFee": "0.05", - "fiatTransactionTotal": "0.05", - "ethTransactionAmount": "0", - "ethTransactionFee": "0.000233", - "ethTransactionTotal": "0.000233", - "hexGasTotal": "0xd42f28057e00", - "nonce": "", - "toSmartContract": false, - "fetchingData": false - } -} diff --git a/development/states/new-account.json b/development/states/new-account.json deleted file mode 100644 index dc2341b0efd6..000000000000 --- a/development/states/new-account.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "metamask": { - "isInitialized": true, - "isUnlocked": true, - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0xa6ef573d60594731178b7f85d80da13cc2af52dd": { - "address": "0xa6ef573d60594731178b7f85d80da13cc2af52dd", - "name": "Dan! 1" - }, - "0xf9f52e84ad2c9122caa87478d27041ddaa215666": { - "address": "0xf9f52e84ad2c9122caa87478d27041ddaa215666", - "name": "Account 2" - } - }, - "unconfTxs": {}, - "currentCurrency": "USD", - "conversionRate": 10.92067835, - "conversionDate": 1478282884, - "network": null, - "accounts": { - "0xa6ef573d60594731178b7f85d80da13cc2af52dd": { - "balance": "0x00", - "nonce": "0x100000", - "code": "0x", - "address": "0xa6ef573d60594731178b7f85d80da13cc2af52dd" - }, - "0xf9f52e84ad2c9122caa87478d27041ddaa215666": { - "balance": "0x00", - "nonce": "0x100000", - "code": "0x", - "address": "0xf9f52e84ad2c9122caa87478d27041ddaa215666" - } - }, - "transactions": [], - "provider": { - "type": "testnet" - }, - "selectedAddress": "0xa6ef573d60594731178b7f85d80da13cc2af52dd", - "unconfMsgs": {}, - "messages": [], - "selectedAddress": "0xa6ef573d60594731178b7f85d80da13cc2af52dd", - "shapeShiftTxList": [], - "keyringTypes": [ - "Simple Key Pair", - "HD Key Tree" - ] - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "new-account" - }, - "accountDetail": { - "subview": "transactions" - }, - "transForward": true, - "isLoading": false, - "warning": null, - "forgottenPassword": null, - "detailView": {}, - "scrollToBottom": false - }, - "identities": {} -} diff --git a/development/states/new-vault.json b/development/states/new-vault.json deleted file mode 100644 index 8db8222fa4b7..000000000000 --- a/development/states/new-vault.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "metamask": { - "isInitialized": false, - "isUnlocked": false, - "currentDomain": "example.com", - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": {}, - "unconfTxs": {}, - "accounts": {}, - "transactions": [], - "network": "2", - "seedWords": null, - "unconfMsgs": {}, - "messages": [], - "provider": { - "type": "testnet" - } - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "accounts", - "detailView": null - }, - "accountDetail": { - "subview": "transactions" - }, - "currentDomain": "extensions", - "transForward": true, - "isLoading": false, - "warning": null - }, - "identities": {} -} diff --git a/development/states/notice.json b/development/states/notice.json deleted file mode 100644 index 4401393c3cc0..000000000000 --- a/development/states/notice.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "metamask": { - "isInitialized": true, - "isUnlocked": true, - "identities": { - "0x24a1d059462456aa332d6da9117aa7f91a46f2ac": { - "address": "0x24a1d059462456aa332d6da9117aa7f91a46f2ac", - "name": "Account 1" - } - }, - "unconfTxs": {}, - "currentCurrency": "USD", - "conversionRate": 8.3533002, - "conversionDate": 1481671082, - "noActiveNotices": false, - "nextUnreadNotice": { - "read": false, - "date": "Tue Dec 13 2016", - "title": "MultiVault Support", - "body": "# Multi\n# Line\n## Support\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi tincidunt dapibus justo a auctor. Sed luctus metus non mi laoreet, sit amet placerat nibh ultricies. Cras fringilla, urna sit amet sodales porttitor, lacus risus lacinia lorem, non euismod magna felis id ex. Nam iaculis, ante nec imperdiet suscipit, nisi quam fringilla nisl, sed fringilla turpis lectus et nibh. Pellentesque sed neque pretium nulla elementum lacinia eu eget felis. Nulla facilisi. Pellentesque id mi tempor, tempus sapien id, ultricies nibh. Integer faucibus elit non orci dapibus porttitor. Pellentesque rutrum hendrerit sapien ut lacinia. Nunc elementum eget arcu eu volutpat. Integer ullamcorper aliquam metus, eu malesuada tellus vestibulum a.\n", - "id": 0 - }, - "network": "3", - "accounts": { - "0x24a1d059462456aa332d6da9117aa7f91a46f2ac": { - "code": "0x", - "nonce": "0x0", - "balance": "0x0", - "address": "0x24a1d059462456aa332d6da9117aa7f91a46f2ac" - } - }, - "transactions": [], - "provider": { - "type": "testnet" - }, - "selectedAddress": "0x24a1d059462456aa332d6da9117aa7f91a46f2ac", - "seedWords": null, - "unconfMsgs": {}, - "messages": [], - "shapeShiftTxList": [], - "keyringTypes": [ - "Simple Key Pair", - "HD Key Tree" - ] - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "accountDetail", - "detailView": null, - "context": "0x24a1d059462456aa332d6da9117aa7f91a46f2ac" - }, - "accountDetail": { - "subview": "transactions" - }, - "transForward": true, - "isLoading": false, - "warning": null - }, - "identities": {} -} diff --git a/development/states/pending-crash.json b/development/states/pending-crash.json deleted file mode 100644 index cbb395359414..000000000000 --- a/development/states/pending-crash.json +++ /dev/null @@ -1 +0,0 @@ -{"metamask":{"isInitialized":true,"isUnlocked":true,"currentDomain":"example.com","rpcTarget":"https://rawtestrpc.metamask.io/","identities":{},"unconfTxs":{"1467755147235616":{"id":1467755147235616,"txParams":{"from":"0xfdea65c8e26263f6d9a1b5de9555d2931a33b825","data":"0x60a060405260046060527f48302e31000000000000000000000000000000000000000000000000000000006080526006805460008290527f48302e310000000000000000000000000000000000000000000000000000000882556100b5907ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f602060026001841615610100026000190190931692909204601f01919091048101905b8082111561017957600081556001016100a1565b505060405161099338038061099383398101604052808051906020019091908051820191906020018051906020019091908051820191906020015050836000600050600033600160a060020a0316815260200190815260200160002060005081905550836002600050819055508260036000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061017d57805160ff19168380011785555b506101ad9291506100a1565b5090565b8280016001018555821561016d579182015b8281111561016d57825182600050559160200191906001019061018f565b50506004805460ff19168317905560058054825160008390527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0602060026001851615610100026000190190941693909304601f90810184900482019386019083901061022d57805160ff19168380011785555b5061025d9291506100a1565b82800160010185558215610221579182015b8281111561022157825182600050559160200191906001019061023f565b505050505050610722806102716000396000f36060604052361561008d5760e060020a600035046306fdde038114610095578063095ea7b3146100f257806318160ddd1461015d57806323b872dd14610166578063313ce567146102c757806354fd4d50146102d357806370a082311461033057806395d89b411461035e578063a9059cbb146103bb578063cae9ca511461044d578063dd62ed3e14610639575b610000610002565b61066d60038054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156107105780601f106106e557610100808354040283529160200191610710565b61034c60043560243533600160a060020a03908116600081815260016020908152604080832094871680845294825282208590556060858152919392917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a35060015b92915050565b61034c60025481565b61034c600435602435604435600160a060020a0383166000908152602081905260408120548290108015906101b9575060016020908152604080832033600160a060020a03168452909152812054829010155b80156101c55750600082115b1561071d57816000600050600085600160a060020a03168152602001908152602001600020600082828250540192505081905550816000600050600086600160a060020a03168152602001908152602001600020600082828250540392505081905550816001600050600086600160a060020a03168152602001908152602001600020600050600033600160a060020a0316815260200190815260200160002060008282825054039250508190555082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3506001610632565b6106db60045460ff1681565b61066d60068054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156107105780601f106106e557610100808354040283529160200191610710565b600160a060020a03600435166000908152602081905260409020545b60408051918252519081900360200190f35b61066d60058054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156107105780601f106106e557610100808354040283529160200191610710565b61034c60043560243533600160a060020a03166000908152602081905260408120548290108015906103ed5750600082115b1561071857604080822080548490039055600160a060020a03808516808452918320805485019055606084815233909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602090a3506001610157565b60806020604435600481810135601f81018490049093028401604052606083815261034c94823594602480359560649493910191908190838280828437509496505050505050506000826001600050600033600160a060020a03168152602001908152602001600020600050600086600160a060020a031681526020019081526020016000206000508190555083600160a060020a031660405180807f72656365697665417070726f76616c28616464726573732c75696e743235362c81526020017f616464726573732c627974657329000000000000000000000000000000000000815260200150602e019050604051809103902060e060020a8091040260e060020a9004338530866040518560e060020a0281526004018085600160a060020a0316815260200184815260200183600160a060020a031681526020018280519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156105d45780820380516001836020036101000a031916815260200191505b509450505050506000604051808303816000876161da5a03f1505060408051868152905133600160a060020a031692507f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259181900360200190a35060015b9392505050565b61034c600435602435600160a060020a03808316600090815260016020908152604080832093851683529290522054610157565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156106cd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6060908152602090f35b820191906000526020600020905b8154815290600101906020018083116106f357829003601f168201915b505050505081565b610157565b6106325600000000000000000000000000000000000000000000000000000000000f42400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000844616e4275636b7300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034442580000000000000000000000000000000000000000000000000000000000","gasPrice":"0xba43b7400","gas":"0xf4240","origin":"tokenfactory.surge.sh","metamaskId":1467755147235616,"metamaskNetworkId":"1"},"time":1467755147235,"status":"unconfirmed"}},"accounts":{"0xfdea65c8e26263f6d9a1b5de9555d2931a33b825":{}},"transactions":[{"id":1467742640796159,"txParams":{"from":"0xfdea65c8e26263f6d9a1b5de9555d2931a33b825","data":"0x60a060405260046060527f48302e31000000000000000000000000000000000000000000000000000000006080526006805460008290527f48302e310000000000000000000000000000000000000000000000000000000882556100b5907ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f602060026001841615610100026000190190931692909204601f01919091048101905b8082111561017957600081556001016100a1565b505060405161099338038061099383398101604052808051906020019091908051820191906020018051906020019091908051820191906020015050836000600050600033600160a060020a0316815260200190815260200160002060005081905550836002600050819055508260036000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061017d57805160ff19168380011785555b506101ad9291506100a1565b5090565b8280016001018555821561016d579182015b8281111561016d57825182600050559160200191906001019061018f565b50506004805460ff19168317905560058054825160008390527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0602060026001851615610100026000190190941693909304601f90810184900482019386019083901061022d57805160ff19168380011785555b5061025d9291506100a1565b82800160010185558215610221579182015b8281111561022157825182600050559160200191906001019061023f565b505050505050610722806102716000396000f36060604052361561008d5760e060020a600035046306fdde038114610095578063095ea7b3146100f257806318160ddd1461015d57806323b872dd14610166578063313ce567146102c757806354fd4d50146102d357806370a082311461033057806395d89b411461035e578063a9059cbb146103bb578063cae9ca511461044d578063dd62ed3e14610639575b610000610002565b61066d60038054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156107105780601f106106e557610100808354040283529160200191610710565b61034c60043560243533600160a060020a03908116600081815260016020908152604080832094871680845294825282208590556060858152919392917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a35060015b92915050565b61034c60025481565b61034c600435602435604435600160a060020a0383166000908152602081905260408120548290108015906101b9575060016020908152604080832033600160a060020a03168452909152812054829010155b80156101c55750600082115b1561071d57816000600050600085600160a060020a03168152602001908152602001600020600082828250540192505081905550816000600050600086600160a060020a03168152602001908152602001600020600082828250540392505081905550816001600050600086600160a060020a03168152602001908152602001600020600050600033600160a060020a0316815260200190815260200160002060008282825054039250508190555082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3506001610632565b6106db60045460ff1681565b61066d60068054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156107105780601f106106e557610100808354040283529160200191610710565b600160a060020a03600435166000908152602081905260409020545b60408051918252519081900360200190f35b61066d60058054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156107105780601f106106e557610100808354040283529160200191610710565b61034c60043560243533600160a060020a03166000908152602081905260408120548290108015906103ed5750600082115b1561071857604080822080548490039055600160a060020a03808516808452918320805485019055606084815233909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602090a3506001610157565b60806020604435600481810135601f81018490049093028401604052606083815261034c94823594602480359560649493910191908190838280828437509496505050505050506000826001600050600033600160a060020a03168152602001908152602001600020600050600086600160a060020a031681526020019081526020016000206000508190555083600160a060020a031660405180807f72656365697665417070726f76616c28616464726573732c75696e743235362c81526020017f616464726573732c627974657329000000000000000000000000000000000000815260200150602e019050604051809103902060e060020a8091040260e060020a9004338530866040518560e060020a0281526004018085600160a060020a0316815260200184815260200183600160a060020a031681526020018280519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156105d45780820380516001836020036101000a031916815260200191505b509450505050506000604051808303816000876161da5a03f1505060408051868152905133600160a060020a031692507f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259181900360200190a35060015b9392505050565b61034c600435602435600160a060020a03808316600090815260016020908152604080832093851683529290522054610157565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156106cd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6060908152602090f35b820191906000526020600020905b8154815290600101906020018083116106f357829003601f168201915b505050505081565b610157565b6106325600000000000000000000000000000000000000000000000000000000000186a00000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000844616e6275636b7300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034442580000000000000000000000000000000000000000000000000000000000","gasPrice":"0xba43b7400","gas":"0xf4240","origin":"tokenfactory.surge.sh","metamaskId":1467742640796159,"metamaskNetworkId":"2"},"time":1467742640796,"status":"rejected"},{"id":1467742652846512,"txParams":{"from":"0xfdea65c8e26263f6d9a1b5de9555d2931a33b825","data":"0x60a060405260046060527f48302e31000000000000000000000000000000000000000000000000000000006080526006805460008290527f48302e310000000000000000000000000000000000000000000000000000000882556100b5907ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f602060026001841615610100026000190190931692909204601f01919091048101905b8082111561017957600081556001016100a1565b505060405161099338038061099383398101604052808051906020019091908051820191906020018051906020019091908051820191906020015050836000600050600033600160a060020a0316815260200190815260200160002060005081905550836002600050819055508260036000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061017d57805160ff19168380011785555b506101ad9291506100a1565b5090565b8280016001018555821561016d579182015b8281111561016d57825182600050559160200191906001019061018f565b50506004805460ff19168317905560058054825160008390527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0602060026001851615610100026000190190941693909304601f90810184900482019386019083901061022d57805160ff19168380011785555b5061025d9291506100a1565b82800160010185558215610221579182015b8281111561022157825182600050559160200191906001019061023f565b505050505050610722806102716000396000f36060604052361561008d5760e060020a600035046306fdde038114610095578063095ea7b3146100f257806318160ddd1461015d57806323b872dd14610166578063313ce567146102c757806354fd4d50146102d357806370a082311461033057806395d89b411461035e578063a9059cbb146103bb578063cae9ca511461044d578063dd62ed3e14610639575b610000610002565b61066d60038054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156107105780601f106106e557610100808354040283529160200191610710565b61034c60043560243533600160a060020a03908116600081815260016020908152604080832094871680845294825282208590556060858152919392917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a35060015b92915050565b61034c60025481565b61034c600435602435604435600160a060020a0383166000908152602081905260408120548290108015906101b9575060016020908152604080832033600160a060020a03168452909152812054829010155b80156101c55750600082115b1561071d57816000600050600085600160a060020a03168152602001908152602001600020600082828250540192505081905550816000600050600086600160a060020a03168152602001908152602001600020600082828250540392505081905550816001600050600086600160a060020a03168152602001908152602001600020600050600033600160a060020a0316815260200190815260200160002060008282825054039250508190555082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3506001610632565b6106db60045460ff1681565b61066d60068054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156107105780601f106106e557610100808354040283529160200191610710565b600160a060020a03600435166000908152602081905260409020545b60408051918252519081900360200190f35b61066d60058054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156107105780601f106106e557610100808354040283529160200191610710565b61034c60043560243533600160a060020a03166000908152602081905260408120548290108015906103ed5750600082115b1561071857604080822080548490039055600160a060020a03808516808452918320805485019055606084815233909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602090a3506001610157565b60806020604435600481810135601f81018490049093028401604052606083815261034c94823594602480359560649493910191908190838280828437509496505050505050506000826001600050600033600160a060020a03168152602001908152602001600020600050600086600160a060020a031681526020019081526020016000206000508190555083600160a060020a031660405180807f72656365697665417070726f76616c28616464726573732c75696e743235362c81526020017f616464726573732c627974657329000000000000000000000000000000000000815260200150602e019050604051809103902060e060020a8091040260e060020a9004338530866040518560e060020a0281526004018085600160a060020a0316815260200184815260200183600160a060020a031681526020018280519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156105d45780820380516001836020036101000a031916815260200191505b509450505050506000604051808303816000876161da5a03f1505060408051868152905133600160a060020a031692507f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259181900360200190a35060015b9392505050565b61034c600435602435600160a060020a03808316600090815260016020908152604080832093851683529290522054610157565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156106cd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6060908152602090f35b820191906000526020600020905b8154815290600101906020018083116106f357829003601f168201915b505050505081565b610157565b6106325600000000000000000000000000000000000000000000000000000000000186a00000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000844616e6275636b7300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034442580000000000000000000000000000000000000000000000000000000000","gasPrice":"0xba43b7400","gas":"0xf4240","origin":"tokenfactory.surge.sh","metamaskId":1467742652846512,"metamaskNetworkId":"2"},"time":1467742652846,"status":"confirmed","hash":"0xa991793a6918aea6d58c30934dab5ca4c0a47c2444e5b60769637491f118de26"},{"id":1467755147235616,"txParams":{"from":"0xfdea65c8e26263f6d9a1b5de9555d2931a33b825","data":"0x60a060405260046060527f48302e31000000000000000000000000000000000000000000000000000000006080526006805460008290527f48302e310000000000000000000000000000000000000000000000000000000882556100b5907ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f602060026001841615610100026000190190931692909204601f01919091048101905b8082111561017957600081556001016100a1565b505060405161099338038061099383398101604052808051906020019091908051820191906020018051906020019091908051820191906020015050836000600050600033600160a060020a0316815260200190815260200160002060005081905550836002600050819055508260036000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061017d57805160ff19168380011785555b506101ad9291506100a1565b5090565b8280016001018555821561016d579182015b8281111561016d57825182600050559160200191906001019061018f565b50506004805460ff19168317905560058054825160008390527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0602060026001851615610100026000190190941693909304601f90810184900482019386019083901061022d57805160ff19168380011785555b5061025d9291506100a1565b82800160010185558215610221579182015b8281111561022157825182600050559160200191906001019061023f565b505050505050610722806102716000396000f36060604052361561008d5760e060020a600035046306fdde038114610095578063095ea7b3146100f257806318160ddd1461015d57806323b872dd14610166578063313ce567146102c757806354fd4d50146102d357806370a082311461033057806395d89b411461035e578063a9059cbb146103bb578063cae9ca511461044d578063dd62ed3e14610639575b610000610002565b61066d60038054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156107105780601f106106e557610100808354040283529160200191610710565b61034c60043560243533600160a060020a03908116600081815260016020908152604080832094871680845294825282208590556060858152919392917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a35060015b92915050565b61034c60025481565b61034c600435602435604435600160a060020a0383166000908152602081905260408120548290108015906101b9575060016020908152604080832033600160a060020a03168452909152812054829010155b80156101c55750600082115b1561071d57816000600050600085600160a060020a03168152602001908152602001600020600082828250540192505081905550816000600050600086600160a060020a03168152602001908152602001600020600082828250540392505081905550816001600050600086600160a060020a03168152602001908152602001600020600050600033600160a060020a0316815260200190815260200160002060008282825054039250508190555082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3506001610632565b6106db60045460ff1681565b61066d60068054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156107105780601f106106e557610100808354040283529160200191610710565b600160a060020a03600435166000908152602081905260409020545b60408051918252519081900360200190f35b61066d60058054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156107105780601f106106e557610100808354040283529160200191610710565b61034c60043560243533600160a060020a03166000908152602081905260408120548290108015906103ed5750600082115b1561071857604080822080548490039055600160a060020a03808516808452918320805485019055606084815233909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602090a3506001610157565b60806020604435600481810135601f81018490049093028401604052606083815261034c94823594602480359560649493910191908190838280828437509496505050505050506000826001600050600033600160a060020a03168152602001908152602001600020600050600086600160a060020a031681526020019081526020016000206000508190555083600160a060020a031660405180807f72656365697665417070726f76616c28616464726573732c75696e743235362c81526020017f616464726573732c627974657329000000000000000000000000000000000000815260200150602e019050604051809103902060e060020a8091040260e060020a9004338530866040518560e060020a0281526004018085600160a060020a0316815260200184815260200183600160a060020a031681526020018280519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156105d45780820380516001836020036101000a031916815260200191505b509450505050506000604051808303816000876161da5a03f1505060408051868152905133600160a060020a031692507f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259181900360200190a35060015b9392505050565b61034c600435602435600160a060020a03808316600090815260016020908152604080832093851683529290522054610157565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156106cd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6060908152602090f35b820191906000526020600020905b8154815290600101906020018083116106f357829003601f168201915b505050505081565b610157565b6106325600000000000000000000000000000000000000000000000000000000000f42400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000844616e4275636b7300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034442580000000000000000000000000000000000000000000000000000000000","gasPrice":"0xba43b7400","gas":"0xf4240","origin":"tokenfactory.surge.sh","metamaskId":1467755147235616,"metamaskNetworkId":"1"},"time":1467755147235,"status":"unconfirmed"}],"selectedAddress":"0xfdea65c8e26263f6d9a1b5de9555d2931a33b825","network":"1","seedWords":null,"unconfMsgs":{},"messages":[],"provider":{"type":"mainnet"},"selectedAddress":"0xfdea65c8e26263f6d9a1b5de9555d2931a33b825"},"appState":{"menuOpen":false,"currentView":{"name":"confTx","context":0},"accountDetail":{"subview":"transactions"},"currentDomain":"tokenfactory.surge.sh","transForward":true,"isLoading":false,"warning":null},"identities":{}} diff --git a/development/states/pending-signature.json b/development/states/pending-signature.json deleted file mode 100644 index 7deaee8f75de..000000000000 --- a/development/states/pending-signature.json +++ /dev/null @@ -1,404 +0,0 @@ -{ - "metamask": { - "isInitialized": true, - "isUnlocked": true, - "currentDomain": "example.com", - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "name": "Wallet 1", - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "mayBeFauceting": false - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "name": "Wallet 2", - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "mayBeFauceting": false - }, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { - "name": "Wallet 3", - "address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d", - "mayBeFauceting": false - } - }, - "unconfTxs": {}, - "currentCurrency": "USD", - "conversionRate": 11.02269525, - "conversionDate": 1472076963, - "accounts": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "balance": "0x056ace16d84b1c7e78", - "nonce": "0x17", - "code": "0x0", - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "balance": "0x00000000000000056bc75e2d63100000", - "nonce": "0x0", - "code": "0x0", - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb" - }, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { - "balance": "0x00000000000000056bc75e2d63100000", - "nonce": "0x0", - "code": "0x0", - "address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d" - } - }, - "transactions": [ - { - "id": 1471975421223082, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63", - "data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb000000000000000000000000000000000000000000000000000000000000000a", - "origin": "localhost", - "metamaskId": 1471975421223082, - "metamaskNetworkId": "1471904489432" - }, - "time": 1471975421223, - "status": "confirmed", - "containsDelegateCall": true, - "estimatedGas": "0x89ef", - "hash": "0xd0fe393e2586ebded866c9f13b90494e902bc49047fbf25ba2ac96c805a2f5d3" - }, - { - "id": 1471975427199819, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63", - "data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb000000000000000000000000000000000000000000000000000000000000000a", - "origin": "localhost", - "metamaskId": 1471975427199819, - "metamaskNetworkId": "1471904489432" - }, - "time": 1471975427199, - "status": "rejected", - "containsDelegateCall": true, - "estimatedGas": "0x89ef", - "hash": "0xb1f2f63f3e265f05d7c353ab38dd8b73fce8e7214489037311ee1f58a994dae3" - }, - { - "id": 1471975806981442, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63", - "data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb000000000000000000000000000000000000000000000000000000000000000a", - "origin": "localhost", - "metamaskId": 1471975806981442, - "metamaskNetworkId": "1471904489432" - }, - "time": 1471975806981, - "status": "confirmed", - "containsDelegateCall": true, - "estimatedGas": "0x89ef", - "hash": "0xeeb89e91aaeea14c4950016c45d60df8ee8874daa6f414de5cf267ea2c17bc6e" - }, - { - "id": 1471975810133789, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63", - "data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb000000000000000000000000000000000000000000000000000000000000000a", - "origin": "localhost", - "metamaskId": 1471975810133789, - "metamaskNetworkId": "1471904489432" - }, - "time": 1471975810133, - "status": "confirmed", - "containsDelegateCall": true, - "estimatedGas": "0x89ef", - "hash": "0xe54cab2e54b8495691b6d8315ca24a190cba546a9fcb056642479ce5770cec8b" - }, - { - "id": 1471976546865348, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63", - "data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb000000000000000000000000000000000000000000000000000000000000000a", - "origin": "localhost", - "metamaskId": 1471976546865348, - "metamaskNetworkId": "1471904489432" - }, - "time": 1471976546865, - "status": "confirmed", - "containsDelegateCall": true, - "estimatedGas": "0x89ef", - "hash": "0x54e10f77e17f28f4d12751749a2ca22f9b528592d1140ef53c6430a68e731542" - }, - { - "id": 1471976930101889, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63", - "data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb0000000000000000000000000000000000000000000000000000000000000005", - "origin": "localhost", - "metamaskId": 1471976930101889, - "metamaskNetworkId": "1471904489432" - }, - "time": 1471976930101, - "status": "confirmed", - "containsDelegateCall": true, - "estimatedGas": "0x89ef", - "hash": "0x60b5af26fad18c5549949064b67c8f965c9f20cd3e890c69512ca3acad10ed8b" - }, - { - "id": 1471977268048169, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63", - "data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb0000000000000000000000000000000000000000000000000000000000000002", - "origin": "localhost", - "metamaskId": 1471977268048169, - "metamaskNetworkId": "1471904489432" - }, - "time": 1471977268048, - "status": "confirmed", - "containsDelegateCall": true, - "estimatedGas": "0x89ef", - "hash": "0x1f96e29305ef11a9c993302c29e5419d87017e8222d4034daea0d86e155dc3aa" - }, - { - "id": 1471977310778630, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63", - "data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb0000000000000000000000000000000000000000000000000000000000000005", - "origin": "localhost", - "metamaskId": 1471977310778630, - "metamaskNetworkId": "1471904489432" - }, - "time": 1471977310778, - "status": "rejected", - "containsDelegateCall": true, - "estimatedGas": "0x89ef" - }, - { - "id": 1471977316241561, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63", - "data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb0000000000000000000000000000000000000000000000000000000000000005", - "origin": "localhost", - "metamaskId": 1471977316241561, - "metamaskNetworkId": "1471904489432" - }, - "time": 1471977316240, - "status": "confirmed", - "containsDelegateCall": true, - "estimatedGas": "0x89ef", - "hash": "0xdbd610c92d77a07c76b82e14e32674d382c45c4780dd2a550888b5cc40d54bcc" - }, - { - "id": 1471977344018510, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63", - "data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb0000000000000000000000000000000000000000000000000000000000000004", - "origin": "localhost", - "metamaskId": 1471977344018510, - "metamaskNetworkId": "1471904489432" - }, - "time": 1471977344018, - "status": "confirmed", - "containsDelegateCall": true, - "estimatedGas": "0x89ef", - "hash": "0x709d871d9ded0108de9f7718a7490b19d45e5e7562b1ba6c5bf6cce56e767d48" - }, - { - "id": 1471977403830380, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63", - "data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb0000000000000000000000000000000000000000000000000000000000000001", - "origin": "localhost", - "metamaskId": 1471977403830380, - "metamaskNetworkId": "1471904489432" - }, - "time": 1471977403830, - "status": "confirmed", - "containsDelegateCall": true, - "estimatedGas": "0x89ef", - "hash": "0x94f5088a127bba181b303d6427ae93cbfa9867997bea1326f30da311e36c6aca" - }, - { - "id": 1471977431563703, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63", - "data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb0000000000000000000000000000000000000000000000000000000000000001", - "origin": "localhost", - "metamaskId": 1471977431563703, - "metamaskNetworkId": "1471904489432" - }, - "time": 1471977431563, - "status": "rejected", - "containsDelegateCall": true, - "estimatedGas": "0x89ef" - }, - { - "id": 1471977436074587, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63", - "data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb0000000000000000000000000000000000000000000000000000000000000001", - "origin": "localhost", - "metamaskId": 1471977436074587, - "metamaskNetworkId": "1471904489432" - }, - "time": 1471977436074, - "status": "confirmed", - "containsDelegateCall": true, - "estimatedGas": "0x89ef", - "hash": "0x5f514dfe3bd48f6f301c809a7a75f73f0fc93bc3a0e469368b84dce032aff9ec" - }, - { - "id": 1471991826717707, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63", - "data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb0000000000000000000000000000000000000000000000000000000000000004", - "origin": "localhost", - "metamaskId": 1471991826717707, - "metamaskNetworkId": "1471904489432" - }, - "time": 1471991826717, - "status": "confirmed", - "containsDelegateCall": true, - "estimatedGas": "0x89ef", - "hash": "0xab1e706f8981680a6c921f9f57f8ce573392bbb4f0fe85cf45e5cbf858fa5f3e" - }, - { - "id": 1471991851917592, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63", - "data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb0000000000000000000000000000000000000000000000000000000000000004", - "origin": "localhost", - "metamaskId": 1471991851917592, - "metamaskNetworkId": "1471904489432" - }, - "time": 1471991851917, - "status": "confirmed", - "containsDelegateCall": true, - "estimatedGas": "0x89ef", - "hash": "0xdea144f7a6f06969739f676d8702a9a11efc689e032f1981fe67afc9261dd4de" - }, - { - "id": 1471992032999543, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63", - "data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb0000000000000000000000000000000000000000000000000000000000000005", - "origin": "localhost", - "metamaskId": 1471992032999543, - "metamaskNetworkId": "1471904489432" - }, - "time": 1471992032999, - "status": "confirmed", - "containsDelegateCall": true, - "estimatedGas": "0x89ef", - "hash": "0xdf31b8cc0fbd2ab6727e0b63536bd4eab51a147aa29e04691e68fae28b866fb3" - }, - { - "id": 1471992043490878, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63", - "data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb0000000000000000000000000000000000000000000000000000000000000005", - "origin": "localhost", - "metamaskId": 1471992043490878, - "metamaskNetworkId": "1471904489432" - }, - "time": 1471992043490, - "status": "rejected", - "containsDelegateCall": true, - "estimatedGas": "0x89ef" - }, - { - "id": 1472068030402279, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "value": "0x3782dace9d90000", - "gas": "0x493e0", - "to": "0x18a672e11d637fffadccc99b152f4895da069601", - "data": "0x5b7d47a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", - "origin": "www.rouleth.com", - "metamaskId": 1472068030402279, - "metamaskNetworkId": "1" - }, - "time": 1472068030402, - "status": "rejected", - "containsDelegateCall": false, - "estimatedGas": "0x24704" - }, - { - "id": 1472068061833258, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "value": "0x16345785d8a0000", - "gas": "0x493e0", - "to": "0x18a672e11d637fffadccc99b152f4895da069601", - "data": "0x5b7d47a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", - "origin": "www.rouleth.com", - "metamaskId": 1472068061833258, - "metamaskNetworkId": "1" - }, - "time": 1472068061833, - "status": "confirmed", - "containsDelegateCall": false, - "estimatedGas": "0x24704", - "hash": "0xb6e6ff57e7b5f6bd7f2e6dc44c39f4e858a227c9509586634ca547179345a13e" - } - ], - "selectedAddress": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "network": "1471904489432", - "seedWords": null, - "unconfMsgs": { - "1472076978535283": { - "id": 1472076978535283, - "msgParams": { - "origin": "localhost", - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "data": "hello" - }, - "time": 1472076978535, - "status": "unconfirmed" - } - }, - "messages": [ - { - "id": 1472076978535283, - "msgParams": { - "origin": "localhost", - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "data": "hello" - }, - "time": 1472076978535, - "status": "unconfirmed" - } - ], - "shapeShiftTxList": [], - "provider": { - "type": "rpc", - "rpcTarget": "http://localhost:8545" - }, - "selectedAddress": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "confTx", - "detailView": null, - "context": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - }, - "accountDetail": { - "subview": "transactions" - }, - "currentDomain": "ebjbdknjcgcbchkagneicjfpneaghdhb", - "transForward": true, - "isLoading": false, - "warning": null - }, - "identities": {} -} diff --git a/development/states/pending-tx-insufficient.json b/development/states/pending-tx-insufficient.json deleted file mode 100644 index 18be840899a8..000000000000 --- a/development/states/pending-tx-insufficient.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "metamask": { - "isInitialized": true, - "isUnlocked": true, - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0xa06599bd35921cfb5b71b4be3869740385b0b306": { - "address": "0xa06599bd35921cfb5b71b4be3869740385b0b306", - "name": "Account 1" - } - }, - "unapprovedTxs": { - "1188547363326880": { - "id": 1188547363326880, - "time": 1487662234127, - "status": "unapproved", - "gasMultiplier": 1, - "metamaskNetworkId": "3", - "txParams": { - "from": "0xa06599bd35921cfb5b71b4be3869740385b0b306", - "to": "0x18a3462427bcc9133bb46e88bcbe39cd7ef0e761", - "value": "0xde0b6b3a7640000", - "metamaskId": 1188547363326880, - "metamaskNetworkId": "3", - "gas": "0x5209" - }, - "gasLimitSpecified": false, - "estimatedGas": "0x5209", - "txFee": "17e0186e60800", - "txValue": "de0b6b3a7640000", - "maxCost": "de234b52e4a0800" - } - }, - "currentCurrency": "USD", - "conversionRate": 12.59854817, - "conversionDate": 1487662141, - "noActiveNotices": true, - "network": "3", - "accounts": { - "0xa06599bd35921cfb5b71b4be3869740385b0b306": { - "nonce": "0x0", - "balance": "0x0", - "code": "0x", - "address": "0xa06599bd35921cfb5b71b4be3869740385b0b306" - } - }, - "transactions": {}, - "selectedAddressTxList": [ - { - "id": 1188547363326880, - "time": 1487662234127, - "status": "unapproved", - "gasMultiplier": 1, - "metamaskNetworkId": "3", - "txParams": { - "from": "0xa06599bd35921cfb5b71b4be3869740385b0b306", - "to": "0x18a3462427bcc9133bb46e88bcbe39cd7ef0e761", - "value": "0xde0b6b3a7640000", - "metamaskId": 1188547363326880, - "metamaskNetworkId": "3", - "gas": "0x5209" - }, - "gasLimitSpecified": false, - "estimatedGas": "0x5209", - "txFee": "17e0186e60800", - "txValue": "de0b6b3a7640000", - "maxCost": "de234b52e4a0800" - } - ], - "unapprovedMsgs": {}, - "unapprovedMsgCount": 0, - "keyringTypes": [ - "Simple Key Pair", - "HD Key Tree" - ], - "keyrings": [ - { - "type": "HD Key Tree", - "accounts": [ - "a06599bd35921cfb5b71b4be3869740385b0b306" - ] - } - ], - "selectedAddress": "0xa06599bd35921cfb5b71b4be3869740385b0b306", - "currentCurrency": "USD", - "provider": { - "type": "testnet" - }, - "shapeShiftTxList": [], - "lostAccounts": [], - "seedWords": null - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "confTx", - "context": 0 - }, - "accountDetail": { - "subview": "transactions" - }, - "transForward": true, - "isLoading": false, - "warning": null - }, - "identities": {} -} diff --git a/development/states/pending-tx.json b/development/states/pending-tx.json deleted file mode 100644 index 28c1751bd3a5..000000000000 --- a/development/states/pending-tx.json +++ /dev/null @@ -1,739 +0,0 @@ -{ - "metamask": { - "isInitialized": true, - "isUnlocked": true, - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "name": "Account 1" - } - }, - "unapprovedTxs": {}, - "noActiveNotices": true, - "frequentRpcList": [ - "http://192.168.1.34:7545/" - ], - "addressBook": [], - "tokenExchangeRates": {}, - "coinOptions": {}, - "provider": { - "type": "mainnet", - "rpcTarget": "https://mainnet.infura.io/metamask" - }, - "network": "1", - "accounts": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "code": "0x", - "balance": "0x1b3f641ed0c2f62", - "nonce": "0x35", - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - } - }, - "currentBlockGasLimit": "0x66df83", - "selectedAddressTxList": [ - { - "id": 3516145537630216, - "time": 1512615655535, - "status": "submitted", - "metamaskNetworkId": "1", - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "value": "0x16345785d8a0000", - "gasPrice": "0xc1b710800", - "gas": "0x7b0c", - "nonce": "0x35", - "chainId": "0x1" - }, - "gasPriceSpecified": false, - "gasLimitSpecified": false, - "estimatedGas": "5208", - "history": [ - { - "id": 3516145537630216, - "time": 1512615655535, - "status": "unapproved", - "metamaskNetworkId": "1", - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "value": "0x16345785d8a0000", - "gasPrice": "0xe6f7cec00", - "gas": "0x7b0c" - }, - "gasPriceSpecified": false, - "gasLimitSpecified": false, - "estimatedGas": "5208" - }, - [ - { - "op": "replace", - "path": "/txParams/gasPrice", - "value": "0xc1b710800", - "note": "confTx: user approved transaction" - } - ], - [ - { - "op": "replace", - "path": "/status", - "value": "approved", - "note": "txStateManager: setting status to approved" - } - ], - [ - { - "op": "add", - "path": "/txParams/nonce", - "value": "0x35", - "note": "transactions#approveTransaction" - }, - { - "op": "add", - "path": "/nonceDetails", - "value": { - "params": { - "highestLocalNonce": 53, - "highestSuggested": 53, - "nextNetworkNonce": 53 - }, - "local": { - "name": "local", - "nonce": 53, - "details": { - "startPoint": 53, - "highest": 53 - } - }, - "network": { - "name": "network", - "nonce": 53, - "details": { - "baseCount": 53 - } - } - } - } - ], - [ - { - "op": "add", - "path": "/txParams/chainId", - "value": "0x1", - "note": "txStateManager: setting status to signed" - }, - { - "op": "replace", - "path": "/status", - "value": "signed" - } - ], - [ - { - "op": "add", - "path": "/rawTx", - "value": "0xf86c35850c1b710800827b0c94fdea65c8e26263f6d9a1b5de9555d2931a33b82588016345785d8a00008026a0f5142ba79a13ca7ec65548953017edafb217803244bbf9821d9ad077d89921e9a03afcb614169c90be9905d5b469d06984825c76675d3a535937cdb8f2ad1c0a95", - "note": "transactions#publishTransaction" - } - ], - [ - { - "op": "add", - "path": "/hash", - "value": "0x7ce19c0d128ca11293b44a4e6d3cc9063665c00ea8c8eb400f548e132c147353", - "note": "transactions#setTxHash" - } - ], - [ - { - "op": "replace", - "path": "/status", - "value": "submitted", - "note": "txStateManager: setting status to submitted" - } - ], - [ - { - "op": "add", - "path": "/firstRetryBlockNumber", - "value": "0x478ab3", - "note": "transactions/pending-tx-tracker#event: tx:block-update" - } - ] - ], - "nonceDetails": { - "params": { - "highestLocalNonce": 53, - "highestSuggested": 53, - "nextNetworkNonce": 53 - }, - "local": { - "name": "local", - "nonce": 53, - "details": { - "startPoint": 53, - "highest": 53 - } - }, - "network": { - "name": "network", - "nonce": 53, - "details": { - "baseCount": 53 - } - } - }, - "rawTx": "0xf86c35850c1b710800827b0c94fdea65c8e26263f6d9a1b5de9555d2931a33b82588016345785d8a00008026a0f5142ba79a13ca7ec65548953017edafb217803244bbf9821d9ad077d89921e9a03afcb614169c90be9905d5b469d06984825c76675d3a535937cdb8f2ad1c0a95", - "hash": "0x7ce19c0d128ca11293b44a4e6d3cc9063665c00ea8c8eb400f548e132c147353", - "firstRetryBlockNumber": "0x478ab3" - }, - { - "id": 3516145537630211, - "time": 1512613432658, - "status": "confirmed", - "metamaskNetworkId": "1", - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "value": "0x16345785d8a0000", - "gasPrice": "0xba43b7400", - "gas": "0x7b0c", - "nonce": "0x34", - "chainId": "0x1" - }, - "gasPriceSpecified": false, - "gasLimitSpecified": false, - "estimatedGas": "5208", - "history": [ - { - "id": 3516145537630211, - "time": 1512613432658, - "status": "unapproved", - "metamaskNetworkId": "1", - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "value": "0x16345785d8a0000", - "gasPrice": "0xdf8475800", - "gas": "0x7b0c" - }, - "gasPriceSpecified": false, - "gasLimitSpecified": false, - "estimatedGas": "5208" - }, - [ - { - "op": "replace", - "path": "/txParams/gasPrice", - "value": "0xba43b7400", - "note": "confTx: user approved transaction" - } - ], - [ - { - "op": "replace", - "path": "/status", - "value": "approved", - "note": "txStateManager: setting status to approved" - } - ], - [ - { - "op": "add", - "path": "/txParams/nonce", - "value": "0x34", - "note": "transactions#approveTransaction" - }, - { - "op": "add", - "path": "/nonceDetails", - "value": { - "params": { - "highestLocalNonce": 52, - "highestSuggested": 52, - "nextNetworkNonce": 52 - }, - "local": { - "name": "local", - "nonce": 52, - "details": { - "startPoint": 52, - "highest": 52 - } - }, - "network": { - "name": "network", - "nonce": 52, - "details": { - "baseCount": 52 - } - } - } - } - ], - [ - { - "op": "add", - "path": "/txParams/chainId", - "value": "0x1", - "note": "txStateManager: setting status to signed" - }, - { - "op": "replace", - "path": "/status", - "value": "signed" - } - ], - [ - { - "op": "add", - "path": "/rawTx", - "value": "0xf86c34850ba43b7400827b0c94fdea65c8e26263f6d9a1b5de9555d2931a33b82588016345785d8a00008026a073a4afdb8e8ad32b0cf9039af56c66baffd60d30e75cee5c1b783208824eafb8a0021ca6c1714a2c71281333ab77f776d3514348ab77967280fca8a5b4be44285e", - "note": "transactions#publishTransaction" - } - ], - [ - { - "op": "add", - "path": "/hash", - "value": "0x5c98409883fdfd3cd24058a83b91470da6c40ffae41a40eb90d7dee0b837d26d", - "note": "transactions#setTxHash" - } - ], - [ - { - "op": "replace", - "path": "/status", - "value": "submitted", - "note": "txStateManager: setting status to submitted" - } - ], - [ - { - "op": "add", - "path": "/firstRetryBlockNumber", - "value": "0x478a2c", - "note": "transactions/pending-tx-tracker#event: tx:block-update" - } - ], - [ - { - "op": "replace", - "path": "/status", - "value": "confirmed", - "note": "txStateManager: setting status to confirmed" - } - ] - ], - "nonceDetails": { - "params": { - "highestLocalNonce": 52, - "highestSuggested": 52, - "nextNetworkNonce": 52 - }, - "local": { - "name": "local", - "nonce": 52, - "details": { - "startPoint": 52, - "highest": 52 - } - }, - "network": { - "name": "network", - "nonce": 52, - "details": { - "baseCount": 52 - } - } - }, - "rawTx": "0xf86c34850ba43b7400827b0c94fdea65c8e26263f6d9a1b5de9555d2931a33b82588016345785d8a00008026a073a4afdb8e8ad32b0cf9039af56c66baffd60d30e75cee5c1b783208824eafb8a0021ca6c1714a2c71281333ab77f776d3514348ab77967280fca8a5b4be44285e", - "hash": "0x5c98409883fdfd3cd24058a83b91470da6c40ffae41a40eb90d7dee0b837d26d", - "firstRetryBlockNumber": "0x478a2c" - }, - { - "id": 3516145537630210, - "time": 1512612826136, - "status": "confirmed", - "metamaskNetworkId": "1", - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "value": "0x16345785d8a0000", - "gasPrice": "0xa7a358200", - "gas": "0x7b0c", - "nonce": "0x33", - "chainId": "0x1" - }, - "gasPriceSpecified": false, - "gasLimitSpecified": false, - "estimatedGas": "5208", - "history": [ - { - "id": 3516145537630210, - "time": 1512612826136, - "status": "unapproved", - "metamaskNetworkId": "1", - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "value": "0x16345785d8a0000", - "gasPrice": "0xba43b7400", - "gas": "0x7b0c" - }, - "gasPriceSpecified": false, - "gasLimitSpecified": false, - "estimatedGas": "5208" - }, - [ - { - "op": "replace", - "path": "/txParams/gasPrice", - "value": "0xa7a358200", - "note": "confTx: user approved transaction" - } - ], - [ - { - "op": "replace", - "path": "/status", - "value": "approved", - "note": "txStateManager: setting status to approved" - } - ], - [ - { - "op": "add", - "path": "/txParams/nonce", - "value": "0x33", - "note": "transactions#approveTransaction" - }, - { - "op": "add", - "path": "/nonceDetails", - "value": { - "params": { - "highestLocalNonce": 0, - "highestSuggested": 51, - "nextNetworkNonce": 51 - }, - "local": { - "name": "local", - "nonce": 51, - "details": { - "startPoint": 51, - "highest": 51 - } - }, - "network": { - "name": "network", - "nonce": 51, - "details": { - "baseCount": 51 - } - } - } - } - ], - [ - { - "op": "add", - "path": "/txParams/chainId", - "value": "0x1", - "note": "txStateManager: setting status to signed" - }, - { - "op": "replace", - "path": "/status", - "value": "signed" - } - ], - [ - { - "op": "add", - "path": "/rawTx", - "value": "0xf86c33850a7a358200827b0c94fdea65c8e26263f6d9a1b5de9555d2931a33b82588016345785d8a00008026a0021a8cd6c10208cc593e22af53637e5d127cee5cc6f9443a3e758a02afff1d7ca025f7420e974d3f2c668c165040987c72543a8e709bfea3528a62836a6ced9ce8", - "note": "transactions#publishTransaction" - } - ], - [ - { - "op": "add", - "path": "/hash", - "value": "0x289772800898bc9cd414530d8581c0da257a9055e4aaaa6d10d92d700bfbd044", - "note": "transactions#setTxHash" - } - ], - [ - { - "op": "replace", - "path": "/status", - "value": "submitted", - "note": "txStateManager: setting status to submitted" - } - ], - [ - { - "op": "add", - "path": "/firstRetryBlockNumber", - "value": "0x478a04", - "note": "transactions/pending-tx-tracker#event: tx:block-update" - } - ], - [ - { - "op": "replace", - "path": "/status", - "value": "confirmed", - "note": "txStateManager: setting status to confirmed" - } - ] - ], - "nonceDetails": { - "params": { - "highestLocalNonce": 0, - "highestSuggested": 51, - "nextNetworkNonce": 51 - }, - "local": { - "name": "local", - "nonce": 51, - "details": { - "startPoint": 51, - "highest": 51 - } - }, - "network": { - "name": "network", - "nonce": 51, - "details": { - "baseCount": 51 - } - } - }, - "rawTx": "0xf86c33850a7a358200827b0c94fdea65c8e26263f6d9a1b5de9555d2931a33b82588016345785d8a00008026a0021a8cd6c10208cc593e22af53637e5d127cee5cc6f9443a3e758a02afff1d7ca025f7420e974d3f2c668c165040987c72543a8e709bfea3528a62836a6ced9ce8", - "hash": "0x289772800898bc9cd414530d8581c0da257a9055e4aaaa6d10d92d700bfbd044", - "firstRetryBlockNumber": "0x478a04" - }, - { - "id": 3516145537630209, - "time": 1512612809252, - "status": "failed", - "metamaskNetworkId": "1", - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "value": "0x16345785d8a0000", - "gasPrice": "0x77359400", - "gas": "0x7b0c", - "nonce": "0x33", - "chainId": "0x1" - }, - "gasPriceSpecified": false, - "gasLimitSpecified": false, - "estimatedGas": "5208", - "history": [ - { - "id": 3516145537630209, - "time": 1512612809252, - "status": "unapproved", - "metamaskNetworkId": "1", - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "value": "0x16345785d8a0000", - "gasPrice": "0xba43b7400", - "gas": "0x7b0c" - }, - "gasPriceSpecified": false, - "gasLimitSpecified": false, - "estimatedGas": "5208" - }, - [ - { - "op": "replace", - "path": "/txParams/gasPrice", - "value": "0x77359400", - "note": "confTx: user approved transaction" - } - ], - [ - { - "op": "replace", - "path": "/status", - "value": "approved", - "note": "txStateManager: setting status to approved" - } - ], - [ - { - "op": "add", - "path": "/txParams/nonce", - "value": "0x33", - "note": "transactions#approveTransaction" - }, - { - "op": "add", - "path": "/nonceDetails", - "value": { - "params": { - "highestLocalNonce": 0, - "highestSuggested": 51, - "nextNetworkNonce": 51 - }, - "local": { - "name": "local", - "nonce": 51, - "details": { - "startPoint": 51, - "highest": 51 - } - }, - "network": { - "name": "network", - "nonce": 51, - "details": { - "baseCount": 51 - } - } - } - } - ], - [ - { - "op": "add", - "path": "/txParams/chainId", - "value": "0x1", - "note": "txStateManager: setting status to signed" - }, - { - "op": "replace", - "path": "/status", - "value": "signed" - } - ], - [ - { - "op": "add", - "path": "/rawTx", - "value": "0xf86b338477359400827b0c94fdea65c8e26263f6d9a1b5de9555d2931a33b82588016345785d8a00008025a098624a27ae79b2b1adc63b913850f266a920cb9d93e6588b8df9b8883eb1b323a00cc6fd855723a234f4f93b48caf7a7659366d09e5c5887f0a4c2e5fa68012cd7", - "note": "transactions#publishTransaction" - } - ], - [ - { - "op": "add", - "path": "/err", - "value": { - "message": "Error: [ethjs-rpc] rpc error with payload {\"id\":7801900228852,\"jsonrpc\":\"2.0\",\"params\":[\"0xf86b338477359400827b0c94fdea65c8e26263f6d9a1b5de9555d2931a33b82588016345785d8a00008025a098624a27ae79b2b1adc63b913850f266a920cb9d93e6588b8df9b8883eb1b323a00cc6fd855723a234f4f93b48caf7a7659366d09e5c5887f0a4c2e5fa68012cd7\"],\"method\":\"eth_sendRawTransaction\"} Error: transaction underpriced", - "stack": "Error: [ethjs-rpc] rpc error with payload {\"id\":7801900228852,\"jsonrpc\":\"2.0\",\"params\":[\"0xf86b338477359400827b0c94fdea65c8e26263f6d9a1b5de9555d2931a33b82588016345785d8a00008025a098624a27ae79b2b1adc63b913850f266a920cb9d93e6588b8df9b8883eb1b323a00cc6fd855723a234f4f93b48caf7a7659366d09e5c5887f0a4c2e5fa68012cd7\"],\"method\":\"eth_sendRawTransaction\"} Error: transaction underpriced\n at chrome-extension://ebjbdknjcgcbchkagneicjfpneaghdhb/scripts/background.js:60327:26\n at chrome-extension://ebjbdknjcgcbchkagneicjfpneaghdhb/scripts/background.js:88030:9\n at chrome-extension://ebjbdknjcgcbchkagneicjfpneaghdhb/scripts/background.js:16678:16\n at replenish (chrome-extension://ebjbdknjcgcbchkagneicjfpneaghdhb/scripts/background.js:16522:25)\n at iterateeCallback (chrome-extension://ebjbdknjcgcbchkagneicjfpneaghdhb/scripts/background.js:16512:17)\n at chrome-extension://ebjbdknjcgcbchkagneicjfpneaghdhb/scripts/background.js:16694:16\n at resultObj.id (chrome-extension://ebjbdknjcgcbchkagneicjfpneaghdhb/scripts/background.js:88012:9)\n at chrome-extension://ebjbdknjcgcbchkagneicjfpneaghdhb/scripts/background.js:16813:16\n at replenish (chrome-extension://ebjbdknjcgcbchkagneicjfpneaghdhb/scripts/background.js:16527:17)\n at iterateeCallback (chrome-extension://ebjbdknjcgcbchkagneicjfpneaghdhb/scripts/background.js:16512:17)" - } - } - ], - [ - { - "op": "replace", - "path": "/status", - "value": "failed", - "note": "txStateManager: setting status to failed" - } - ] - ], - "nonceDetails": { - "params": { - "highestLocalNonce": 0, - "highestSuggested": 51, - "nextNetworkNonce": 51 - }, - "local": { - "name": "local", - "nonce": 51, - "details": { - "startPoint": 51, - "highest": 51 - } - }, - "network": { - "name": "network", - "nonce": 51, - "details": { - "baseCount": 51 - } - } - }, - "rawTx": "0xf86b338477359400827b0c94fdea65c8e26263f6d9a1b5de9555d2931a33b82588016345785d8a00008025a098624a27ae79b2b1adc63b913850f266a920cb9d93e6588b8df9b8883eb1b323a00cc6fd855723a234f4f93b48caf7a7659366d09e5c5887f0a4c2e5fa68012cd7", - "err": { - "message": "Error: [ethjs-rpc] rpc error with payload {\"id\":7801900228852,\"jsonrpc\":\"2.0\",\"params\":[\"0xf86b338477359400827b0c94fdea65c8e26263f6d9a1b5de9555d2931a33b82588016345785d8a00008025a098624a27ae79b2b1adc63b913850f266a920cb9d93e6588b8df9b8883eb1b323a00cc6fd855723a234f4f93b48caf7a7659366d09e5c5887f0a4c2e5fa68012cd7\"],\"method\":\"eth_sendRawTransaction\"} Error: transaction underpriced", - "stack": "Error: [ethjs-rpc] rpc error with payload {\"id\":7801900228852,\"jsonrpc\":\"2.0\",\"params\":[\"0xf86b338477359400827b0c94fdea65c8e26263f6d9a1b5de9555d2931a33b82588016345785d8a00008025a098624a27ae79b2b1adc63b913850f266a920cb9d93e6588b8df9b8883eb1b323a00cc6fd855723a234f4f93b48caf7a7659366d09e5c5887f0a4c2e5fa68012cd7\"],\"method\":\"eth_sendRawTransaction\"} Error: transaction underpriced\n at chrome-extension://ebjbdknjcgcbchkagneicjfpneaghdhb/scripts/background.js:60327:26\n at chrome-extension://ebjbdknjcgcbchkagneicjfpneaghdhb/scripts/background.js:88030:9\n at chrome-extension://ebjbdknjcgcbchkagneicjfpneaghdhb/scripts/background.js:16678:16\n at replenish (chrome-extension://ebjbdknjcgcbchkagneicjfpneaghdhb/scripts/background.js:16522:25)\n at iterateeCallback (chrome-extension://ebjbdknjcgcbchkagneicjfpneaghdhb/scripts/background.js:16512:17)\n at chrome-extension://ebjbdknjcgcbchkagneicjfpneaghdhb/scripts/background.js:16694:16\n at resultObj.id (chrome-extension://ebjbdknjcgcbchkagneicjfpneaghdhb/scripts/background.js:88012:9)\n at chrome-extension://ebjbdknjcgcbchkagneicjfpneaghdhb/scripts/background.js:16813:16\n at replenish (chrome-extension://ebjbdknjcgcbchkagneicjfpneaghdhb/scripts/background.js:16527:17)\n at iterateeCallback (chrome-extension://ebjbdknjcgcbchkagneicjfpneaghdhb/scripts/background.js:16512:17)" - } - } - ], - "unapprovedMsgs": {}, - "unapprovedMsgCount": 0, - "unapprovedPersonalMsgs": {}, - "unapprovedPersonalMsgCount": 0, - "unapprovedTypedMessages": {}, - "unapprovedTypedMessagesCount": 0, - "keyringTypes": [ - "Simple Key Pair", - "HD Key Tree" - ], - "keyrings": [ - { - "type": "HD Key Tree", - "accounts": [ - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - ] - } - ], - "computedBalances": {}, - "currentAccountTab": "history", - "tokens": [ - { - "address": "0x0d8775f648430679a709e98d2b0cb6250d2887ef", - "symbol": "BAT", - "decimals": "18" - } - ], - "selectedAddress": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "currentCurrency": "usd", - "conversionRate": 418.62, - "conversionDate": 1512615622, - "infuraNetworkStatus": { - "mainnet": "ok", - "ropsten": "ok", - "kovan": "ok", - "rinkeby": "ok", - "goerli": "ok" - }, - "shapeShiftTxList": [], - "lostAccounts": [] - }, - "appState": { - "shouldClose": true, - "menuOpen": false, - "currentView": { - "name": "accountDetail", - "context": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - }, - "accountDetail": { - "subview": "transactions", - "accountExport": "none", - "privateKey": "" - }, - "transForward": false, - "isLoading": false, - "warning": null, - "forgottenPassword": false, - "scrollToBottom": false - }, - "identities": {}, - "version": "3.12.1", - "platform": { - "arch": "x86-64", - "nacl_arch": "x86-64", - "os": "mac" - }, - "browser": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36" -} diff --git a/development/states/personal-sign.json b/development/states/personal-sign.json deleted file mode 100644 index 8ded6205c5ec..000000000000 --- a/development/states/personal-sign.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "metamask": { - "isInitialized": true, - "isUnlocked": true, - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "name": "Account 1" - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "name": "Account 2" - }, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { - "address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d", - "name": "Account 3" - } - }, - "unapprovedTxs": {}, - "currentCurrency": "USD", - "conversionRate": 13.2126613, - "conversionDate": 1487888522, - "noActiveNotices": true, - "network": "3", - "accounts": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "balance": "0x6ae7c45a61c0e8d2", - "nonce": "0x12", - "code": "0x", - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "balance": "0x2892a7aece555480", - "nonce": "0x7", - "code": "0x", - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb" - }, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { - "balance": "0x0", - "nonce": "0x0", - "code": "0x", - "address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d" - } - }, - "transactions": {}, - "selectedAddressTxList": [], - "unapprovedMsgs": {}, - "unapprovedMsgCount": 0, - "unapprovedPersonalMsgs": { - "2971973686529444": { - "id": 2971973686529444, - "msgParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "data": "0x879a053d4800c6354e76c7985a865d2922c82fb5b3f4577b2fe08b998954f2e01" - }, - "time": 1487888668426, - "status": "unapproved", - "type": "personal_sign" - } - }, - "unapprovedPersonalMsgCount": 1, - "keyringTypes": [ - "Simple Key Pair", - "HD Key Tree" - ], - "keyrings": [ - { - "type": "HD Key Tree", - "accounts": [ - "fdea65c8e26263f6d9a1b5de9555d2931a33b825", - "c5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "2f8d4a878cfa04a6e60d46362f5644deab66572d" - ] - } - ], - "selectedAddress": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "currentCurrency": "USD", - "provider": { - "type": "testnet" - }, - "shapeShiftTxList": [], - "lostAccounts": [] - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "confTx", - "context": 0 - }, - "accountDetail": { - "subview": "transactions" - }, - "transForward": true, - "isLoading": false, - "warning": null - }, - "identities": {} -} \ No newline at end of file diff --git a/development/states/private-key-export-success.json b/development/states/private-key-export-success.json deleted file mode 100644 index 2ff3c4d1753b..000000000000 --- a/development/states/private-key-export-success.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "metamask": { - "isInitialized": true, - "isUnlocked": true, - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0x07284e146926a4facd0ea60598dc4f001ad620f1": { - "address": "0x07284e146926a4facd0ea60598dc4f001ad620f1", - "name": "Account 1" - } - }, - "unapprovedTxs": {}, - "noActiveNotices": true, - "frequentRpcList": [], - "addressBook": [], - "network": "3", - "accounts": { - "0x07284e146926a4facd0ea60598dc4f001ad620f1": { - "code": "0x", - "nonce": "0x0", - "balance": "0x0", - "address": "0x07284e146926a4facd0ea60598dc4f001ad620f1" - } - }, - "transactions": {}, - "selectedAddressTxList": [], - "unapprovedMsgs": {}, - "unapprovedMsgCount": 0, - "unapprovedPersonalMsgs": {}, - "unapprovedPersonalMsgCount": 0, - "keyringTypes": [ - "Simple Key Pair", - "HD Key Tree" - ], - "keyrings": [ - { - "type": "HD Key Tree", - "accounts": [ - "07284e146926a4facd0ea60598dc4f001ad620f1" - ] - } - ], - "selectedAddress": "0x07284e146926a4facd0ea60598dc4f001ad620f1", - "currentCurrency": "USD", - "conversionRate": 43.35903476, - "conversionDate": 1490105102, - "provider": { - "type": "testnet" - }, - "shapeShiftTxList": [], - "lostAccounts": [], - "seedWords": null - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "accountDetail", - "context": "0x07284e146926a4facd0ea60598dc4f001ad620f1" - }, - "accountDetail": { - "subview": "export", - "accountExport": "completed", - "privateKey": "549c9638ad06432568969accacad4a02f8548cc358085938071745138ec134b7" - }, - "transForward": true, - "isLoading": false, - "warning": null - }, - "identities": {} -} diff --git a/development/states/private-key-export.json b/development/states/private-key-export.json deleted file mode 100644 index db7a53e22602..000000000000 --- a/development/states/private-key-export.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "metamask": { - "isInitialized": true, - "isUnlocked": true, - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0x07284e146926a4facd0ea60598dc4f001ad620f1": { - "address": "0x07284e146926a4facd0ea60598dc4f001ad620f1", - "name": "Account 1" - } - }, - "unapprovedTxs": {}, - "noActiveNotices": true, - "frequentRpcList": [], - "addressBook": [], - "network": "3", - "accounts": { - "0x07284e146926a4facd0ea60598dc4f001ad620f1": { - "code": "0x", - "nonce": "0x0", - "balance": "0x0", - "address": "0x07284e146926a4facd0ea60598dc4f001ad620f1" - } - }, - "transactions": {}, - "selectedAddressTxList": [], - "unapprovedMsgs": {}, - "unapprovedMsgCount": 0, - "unapprovedPersonalMsgs": {}, - "unapprovedPersonalMsgCount": 0, - "keyringTypes": [ - "Simple Key Pair", - "HD Key Tree" - ], - "keyrings": [ - { - "type": "HD Key Tree", - "accounts": [ - "07284e146926a4facd0ea60598dc4f001ad620f1" - ] - } - ], - "selectedAddress": "0x07284e146926a4facd0ea60598dc4f001ad620f1", - "currentCurrency": "USD", - "conversionRate": 43.35903476, - "conversionDate": 1490105102, - "provider": { - "type": "testnet" - }, - "shapeShiftTxList": [], - "lostAccounts": [], - "seedWords": null - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "accountDetail", - "context": "0x07284e146926a4facd0ea60598dc4f001ad620f1" - }, - "accountDetail": { - "subview": "export", - "accountExport": "requested" - }, - "transForward": true, - "isLoading": false, - "warning": null - }, - "identities": {} -} diff --git a/development/states/private-network.json b/development/states/private-network.json deleted file mode 100644 index 8cdcb4eeb313..000000000000 --- a/development/states/private-network.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "metamask": { - "isInitialized": true, - "isUnlocked": true, - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "name": "Account 1", - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "mayBeFauceting": false - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "name": "Account 2", - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "mayBeFauceting": false - } - }, - "unconfTxs": {}, - "currentCurrency": "USD", - "conversionRate": 9.52855776, - "conversionDate": 1479756513, - "accounts": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "balance": "0x0", - "nonce": "0x0", - "code": "0x0", - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "balance": "0x0", - "nonce": "0x0", - "code": "0x0", - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb" - } - }, - "transactions": [ - { - "id": 5551995700357153, - "txParams": { - "from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63", - "data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb000000000000000000000000000000000000000000000000000000000000000a", - "metamaskId": 5551995700357153, - "metamaskNetworkId": "1479490588308" - }, - "time": 1479498745949, - "status": "confirmed", - "gasMultiplier": 1, - "metamaskNetworkId": "1479490588308", - "containsDelegateCall": true, - "estimatedGas": "0x24b33", - "hash": "0xad609a6931f54a575ad71222ffc27cd6746017106d5b89f4ad300b37b273f8ac" - } - ], - "selectedAddress": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "network": "1479753732793", - "isEthConfirmed": true, - "unconfMsgs": {}, - "messages": [], - "shapeShiftTxList": [], - "gasMultiplier": false, - "provider": { - "type": "rpc", - "rpcTarget": "http://localhost:8545" - }, - "selectedAddress": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "accountDetail" - }, - "accountDetail": { - "subview": "transactions", - "accountExport": "none", - "privateKey": "" - }, - "transForward": false, - "isLoading": false, - "warning": null, - "scrollToBottom": false - }, - "identities": {} -} diff --git a/development/states/restore-vault.json b/development/states/restore-vault.json deleted file mode 100644 index 0d6c2610da1c..000000000000 --- a/development/states/restore-vault.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "metamask": { - "isInitialized": false, - "isUnlocked": false, - "currentDomain": "example.com", - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": {}, - "unconfTxs": {}, - "currentCurrency": "USD", - "conversionRate": 0, - "conversionDate": "N/A", - "accounts": {}, - "transactions": [], - "seedWords": null, - "unconfMsgs": {}, - "messages": [], - "shapeShiftTxList": [], - "provider": { - "type": "testnet" - }, - "network": "2" - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "restoreVault" - }, - "accountDetail": { - "subview": "transactions" - }, - "currentDomain": "extensions", - "transForward": true, - "isLoading": false, - "warning": null - }, - "identities": {} -} diff --git a/development/states/send-edit.json b/development/states/send-edit.json deleted file mode 100644 index c83968ae8c4c..000000000000 --- a/development/states/send-edit.json +++ /dev/null @@ -1,526 +0,0 @@ -{ - "confirmTransaction": { - "txData": { - "id": 4768706228115573 - } - }, - "metamask": { - "completedOnboarding": true, - "isInitialized": true, - "isUnlocked": true, - "featureFlags": {"betaUI": true}, - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "name": "Send Account 1" - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "name": "Send Account 2" - }, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { - "address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d", - "name": "Send Account 3" - }, - "0xd85a4b6a394794842887b8284293d69163007bbb": { - "address": "0xd85a4b6a394794842887b8284293d69163007bbb", - "name": "Send Account 4" - } - }, - "cachedBalances": {}, - "assetImages": {}, - "unapprovedTxs": {}, - "currentCurrency": "USD", - "conversionRate": 1200.88200327, - "conversionDate": 1489013762, - "noActiveNotices": true, - "frequentRpcList": [], - "network": "3", - "accounts": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "code": "0x", - "balance": "0x47c9d71831c76efe", - "nonce": "0x1b", - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "code": "0x", - "balance": "0x37452b1315889f80", - "nonce": "0xa", - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb" - }, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { - "code": "0x", - "balance": "0x30c9d71831c76efe", - "nonce": "0x1c", - "address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d" - }, - "0xd85a4b6a394794842887b8284293d69163007bbb": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0xd85a4b6a394794842887b8284293d69163007bbb" - } - }, - "addressBook": [ - { - "address": "0x06195827297c7a80a443b6894d3bdb8824b43896", - "name": "Address Book Account 1" - } - ], - "tokens": [], - "transactions": {}, - "selectedAddressTxList": [{ - "id": 4768706228115573, - "time": 1487363153561, - "status": "unapproved", - "gasMultiplier": 1, - "metamaskNetworkId": "3", - "txParams": { - "from": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "to": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d", - "value": "0x1bc16d674ec80000", - "metamaskId": 4768706228115573, - "metamaskNetworkId": "3", - "gas": "0xea60", - "gasPrice": "0xba43b7400" - } - }], - "unapprovedTxs": { - "4768706228115573": { - "id": 4768706228115573, - "time": 1487363153561, - "status": "unapproved", - "gasMultiplier": 1, - "metamaskNetworkId": "3", - "txParams": { - "from": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "to": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d", - "value": "0x1bc16d674ec80000", - "metamaskId": 4768706228115573, - "metamaskNetworkId": "3", - "gas": "0xea60", - "gasPrice": "0xba43b7400" - } - } - }, - "unapprovedMsgs": {}, - "unapprovedMsgCount": 0, - "unapprovedPersonalMsgs": {}, - "unapprovedPersonalMsgCount": 0, - "keyringTypes": [ - "Simple Key Pair", - "HD Key Tree" - ], - "keyrings": [ - { - "type": "HD Key Tree", - "accounts": [ - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d" - ] - }, - { - "type": "Simple Key Pair", - "accounts": [ - "0xd85a4b6a394794842887b8284293d69163007bbb" - ] - } - ], - "selectedAddress": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "currentCurrency": "USD", - "provider": { - "type": "testnet" - }, - "shapeShiftTxList": [], - "lostAccounts": [], - "send": { - "gasLimit": "0xea60", - "gasPrice": "0xba43b7400", - "gasTotal": "0xaa87bee538000", - "tokenBalance": null, - "from": { - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "balance": "0x37452b1315889f80" - }, - "to": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d", - "amount": "0x1bc16d674ec80000", - "memo": "", - "errors": {}, - "warnings": {}, - "maxModeOn": false, - "editingTransactionId": null - }, - "currentLocale": "en", - "preferences": { - "useNativeCurrencyAsPrimaryCurrency": true, - "showFiatInTestnets": true - }, - "completedUiMigration": true, - "frequentRpcListDetail": [] - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "confTx", - "detailView": null, - "context": 0 - }, - "accountDetail": { - "subview": "transactions" - }, - "sidebar": {}, - "modal": { - "modalState": {}, - "previousModalState": {} - }, - "transForward": true, - "isLoading": false, - "warning": null, - "scrollToBottom": false, - "forgottenPassword": null - }, - "identities": {}, - "send": { - "fromDropdownOpen": false, - "toDropdownOpen": false, - "errors": {}, - "warnings": {} - }, - "confirmTransaction": { - "txData": {}, - "tokenData": {}, - "methodData": {}, - "tokenProps": { - "tokenDecimals": "", - "tokenSymbol": "" - }, - "fiatTransactionAmount": "", - "fiatTransactionFee": "", - "fiatTransactionTotal": "", - "ethTransactionAmount": "", - "ethTransactionFee": "", - "ethTransactionTotal": "", - "hexGasTotal": "", - "nonce": "", - "fetchingMethodData": false - }, - "gas": { - "customData": { - "price": null, - "limit": "0x186a0" - }, - "basicEstimates": { - "average": 73, - "avgWait": 10.6, - "blockTime": 13.871657754010695, - "blockNum": 6655504, - "fast": 160, - "fastest": 290, - "fastestWait": 0.5, - "fastWait": 0.6, - "safeLow": 50, - "safeLowWait": 16.1, - "speed": 0.6702462692280712 - }, - "basicEstimateIsLoading": false, - "gasEstimatesLoading": false, - "basicPriceAndTimeEstimates": [], - "priceAndTimeEstimates": [ - { - "expectedTime": "1374.1168296452973076627", - "expectedWait": 99.0593088449, - "gasprice": 4.1 - }, - { - "expectedTime": "1280.88976972896682763716", - "expectedWait": 92.3386225672, - "gasprice": 4.4 - }, - { - "expectedTime": "1245.13314632680319175597", - "expectedWait": 89.7609477113, - "gasprice": 4.8 - }, - { - "expectedTime": "1227.99925007911014385881", - "expectedWait": 88.5257747744, - "gasprice": 4.9 - }, - { - "expectedTime": "965.52572720362993349654", - "expectedWait": 69.6042062402, - "gasprice": 5 - }, - { - "expectedTime": "917.466895447437420776", - "expectedWait": 66.1396721082, - "gasprice": 5.1 - }, - { - "expectedTime": "915.81694044041496090521", - "expectedWait": 66.0207277804, - "gasprice": 5.2 - }, - { - "expectedTime": "902.13145619709089691874", - "expectedWait": 65.034148924, - "gasprice": 5.3 - }, - { - "expectedTime": "890.83591122200105749896", - "expectedWait": 64.2198594443, - "gasprice": 5.4 - }, - { - "expectedTime": "879.10469542971335712248", - "expectedWait": 63.3741627006, - "gasprice": 5.5 - }, - { - "expectedTime": "876.99737395823100420974", - "expectedWait": 63.2222470818, - "gasprice": 5.6 - }, - { - "expectedTime": "865.96781957003849098957", - "expectedWait": 62.4271327138, - "gasprice": 5.7 - }, - { - "expectedTime": "865.44839472121496158482", - "expectedWait": 62.3896876688, - "gasprice": 5.8 - }, - { - "expectedTime": "802.16173170976255602161", - "expectedWait": 57.8273877524, - "gasprice": 6 - }, - { - "expectedTime": "780.79313908053047074843", - "expectedWait": 56.2869379368, - "gasprice": 6.1 - }, - { - "expectedTime": "770.04888359616469549233", - "expectedWait": 55.5123906062, - "gasprice": 6.2 - }, - { - "expectedTime": "745.01007965146736962697", - "expectedWait": 53.7073573226, - "gasprice": 6.3 - }, - { - "expectedTime": "735.19921111598501681816", - "expectedWait": 53.0000973318, - "gasprice": 6.6 - }, - { - "expectedTime": "705.68767153912619368694", - "expectedWait": 50.8726270539, - "gasprice": 6.7 - }, - { - "expectedTime": "705.26438593445239690121", - "expectedWait": 50.8421126329, - "gasprice": 6.9 - }, - { - "expectedTime": "652.51573119854865429742", - "expectedWait": 47.0394918019, - "gasprice": 7 - }, - { - "expectedTime": "635.51471669299464383162", - "expectedWait": 45.813898235, - "gasprice": 7.1 - }, - { - "expectedTime": "634.37181911960854759036", - "expectedWait": 45.7315073922, - "gasprice": 7.2 - }, - { - "expectedTime": "633.23097691113902888918", - "expectedWait": 45.6492647195, - "gasprice": 7.3 - }, - { - "expectedTime": "112.7753456245379663928", - "expectedWait": 8.1299111919, - "gasprice": 7.6 - }, - { - "expectedTime": "102.9665314468898381829", - "expectedWait": 7.4227992986, - "gasprice": 8 - }, - { - "expectedTime": "100.94784507024919649891", - "expectedWait": 7.2772733339, - "gasprice": 8.1 - }, - { - "expectedTime": "100.46445647447807351078", - "expectedWait": 7.2424261221, - "gasprice": 8.8 - }, - { - "expectedTime": "84.91686745986737853339", - "expectedWait": 6.1216091808, - "gasprice": 9 - }, - { - "expectedTime": "80.39566429296684383503", - "expectedWait": 5.7956781892, - "gasprice": 9.1 - }, - { - "expectedTime": "78.24522052614759252715", - "expectedWait": 5.6406539084, - "gasprice": 9.2 - }, - { - "expectedTime": "77.1685119880459882636", - "expectedWait": 5.5630345959, - "gasprice": 9.5 - }, - { - "expectedTime": "72.43649507646737870178", - "expectedWait": 5.2219061601, - "gasprice": 9.8 - }, - { - "expectedTime": "71.48259532351443753818", - "expectedWait": 5.1531400638, - "gasprice": 9.9 - }, - { - "expectedTime": "58.23892805162994573827", - "expectedWait": 4.1984115442, - "gasprice": 10 - }, - { - "expectedTime": "53.13065124862245917617", - "expectedWait": 3.8301587446, - "gasprice": 10.1 - }, - { - "expectedTime": "53.03510209647058751971", - "expectedWait": 3.82327066, - "gasprice": 10.3 - }, - { - "expectedTime": "49.06846157804491912403", - "expectedWait": 3.5373177776, - "gasprice": 11 - }, - { - "expectedTime": "48.30893330101818116637", - "expectedWait": 3.4825638116, - "gasprice": 11.1 - }, - { - "expectedTime": "48.25099734861818116715", - "expectedWait": 3.4783872414, - "gasprice": 11.3 - }, - { - "expectedTime": "47.64416885027272662988", - "expectedWait": 3.4346413165, - "gasprice": 11.9 - }, - { - "expectedTime": "46.76354741392085498401", - "expectedWait": 3.3711578128, - "gasprice": 12.6 - }, - { - "expectedTime": "44.99427448545882292232", - "expectedWait": 3.2436119232, - "gasprice": 13 - }, - { - "expectedTime": "44.61790554199251276697", - "expectedWait": 3.2164796979, - "gasprice": 13.1 - }, - { - "expectedTime": "42.87832690973048070488", - "expectedWait": 3.0910744534, - "gasprice": 14 - }, - { - "expectedTime": "42.21224091308663044649", - "expectedWait": 3.0430566888, - "gasprice": 14.9 - }, - { - "expectedTime": "41.15715335111336842864", - "expectedWait": 2.9669960203, - "gasprice": 15 - }, - { - "expectedTime": "40.9600723880876999821", - "expectedWait": 2.9527885646, - "gasprice": 15.1 - }, - { - "expectedTime": "38.89138450301711177472", - "expectedWait": 2.8036580193, - "gasprice": 15.8 - }, - { - "expectedTime": "37.89655640860213852611", - "expectedWait": 2.7319414219, - "gasprice": 16 - }, - { - "expectedTime": "37.35265517364705831954", - "expectedWait": 2.692731888, - "gasprice": 17.4 - }, - { - "expectedTime": "36.79447683873796741798", - "expectedWait": 2.652493126, - "gasprice": 17.8 - }, - { - "expectedTime": "36.11439350850802090309", - "expectedWait": 2.6034663015, - "gasprice": 19 - }, - { - "expectedTime": "31.32676199432192471101", - "expectedWait": 2.2583286403, - "gasprice": 20 - }, - { - "expectedTime": "30.76792490132192471855", - "expectedWait": 2.2180423888, - "gasprice": 20.1 - }, - { - "expectedTime": "29.94493658520962526441", - "expectedWait": 2.1587136243, - "gasprice": 25 - }, - { - "expectedTime": "29.53287347625561457478", - "expectedWait": 2.1290082267, - "gasprice": 29 - }, - { - "expectedTime": "29.09318627175614934008", - "expectedWait": 2.0973114236, - "gasprice": 47 - } - ], - "priceAndTimeEstimatesLastRetrieved": 1541527901281, - "errors": {} - } -} diff --git a/development/states/send-new-ui.json b/development/states/send-new-ui.json deleted file mode 100644 index 75982f3185e3..000000000000 --- a/development/states/send-new-ui.json +++ /dev/null @@ -1,486 +0,0 @@ -{ - "metamask": { - "completedOnboarding": true, - "isInitialized": true, - "isUnlocked": true, - "featureFlags": {"betaUI": true}, - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "name": "Send Account 1" - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "name": "Send Account 2" - }, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { - "address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d", - "name": "Send Account 3" - }, - "0xd85a4b6a394794842887b8284293d69163007bbb": { - "address": "0xd85a4b6a394794842887b8284293d69163007bbb", - "name": "Send Account 4" - } - }, - "cachedBalances": {}, - "unapprovedTxs": {}, - "currentCurrency": "USD", - "conversionRate": 1200.88200327, - "conversionDate": 1489013762, - "noActiveNotices": true, - "frequentRpcList": [], - "network": "3", - "accounts": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "code": "0x", - "balance": "0x47c9d71831c76efe", - "nonce": "0x1b", - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "code": "0x", - "balance": "0x37452b1315889f80", - "nonce": "0xa", - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb" - }, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { - "code": "0x", - "balance": "0x30c9d71831c76efe", - "nonce": "0x1c", - "address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d" - }, - "0xd85a4b6a394794842887b8284293d69163007bbb": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0xd85a4b6a394794842887b8284293d69163007bbb" - } - }, - "addressBook": [ - { - "address": "0x06195827297c7a80a443b6894d3bdb8824b43896", - "name": "Address Book Account 1" - } - ], - "assetImages": {}, - "tokens": [], - "transactions": {}, - "selectedAddressTxList": [], - "unapprovedMsgs": {}, - "unapprovedMsgCount": 0, - "unapprovedPersonalMsgs": {}, - "unapprovedPersonalMsgCount": 0, - "keyringTypes": [ - "Simple Key Pair", - "HD Key Tree" - ], - "keyrings": [ - { - "type": "HD Key Tree", - "accounts": [ - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d" - ] - }, - { - "type": "Simple Key Pair", - "accounts": [ - "0xd85a4b6a394794842887b8284293d69163007bbb" - ] - } - ], - "selectedAddress": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "currentCurrency": "USD", - "provider": { - "type": "testnet" - }, - "shapeShiftTxList": [], - "lostAccounts": [], - "send": { - "gasLimit": null, - "gasPrice": null, - "gasTotal": "0xb451dc41b578", - "tokenBalance": null, - "from": "", - "to": "", - "amount": "0x0", - "memo": "", - "errors": {}, - "warnings": {}, - "maxModeOn": false, - "editingTransactionId": null - }, - "currentLocale": "en", - "preferences": { - "useNativeCurrencyAsPrimaryCurrency": true, - "showFiatInTestnets": true - }, - "completedUiMigration": true, - "frequentRpcListDetail": [] - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "accountDetail", - "detailView": null, - "context": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc" - }, - "accountDetail": { - "subview": "transactions" - }, - "sidebar": {}, - "modal": { - "modalState": {}, - "previousModalState": {} - }, - "transForward": true, - "isLoading": false, - "warning": null, - "scrollToBottom": false, - "forgottenPassword": null - }, - "identities": {}, - "send": { - "fromDropdownOpen": false, - "toDropdownOpen": false, - "errors": {}, - "warnings": {}, - "gasButtonGroupShown": true - }, - "confirmTransaction": { - "txData": {}, - "tokenData": {}, - "methodData": {}, - "tokenProps": { - "tokenDecimals": "", - "tokenSymbol": "" - }, - "fiatTransactionAmount": "", - "fiatTransactionFee": "", - "fiatTransactionTotal": "", - "ethTransactionAmount": "", - "ethTransactionFee": "", - "ethTransactionTotal": "", - "hexGasTotal": "", - "nonce": "", - "fetchingMethodData": false - }, - "gas": { - "customData": { - "price": null, - "limit": "0x186a0" - }, - "basicEstimates": { - "average": 73, - "avgWait": 10.6, - "blockTime": 13.871657754010695, - "blockNum": 6655504, - "fast": 160, - "fastest": 290, - "fastestWait": 0.5, - "fastWait": 0.6, - "safeLow": 50, - "safeLowWait": 16.1, - "speed": 0.6702462692280712 - }, - "basicEstimateIsLoading": false, - "gasEstimatesLoading": false, - "basicPriceAndTimeEstimates": [], - "priceAndTimeEstimates": [ - { - "expectedTime": "1374.1168296452973076627", - "expectedWait": 99.0593088449, - "gasprice": 4.1 - }, - { - "expectedTime": "1280.88976972896682763716", - "expectedWait": 92.3386225672, - "gasprice": 4.4 - }, - { - "expectedTime": "1245.13314632680319175597", - "expectedWait": 89.7609477113, - "gasprice": 4.8 - }, - { - "expectedTime": "1227.99925007911014385881", - "expectedWait": 88.5257747744, - "gasprice": 4.9 - }, - { - "expectedTime": "965.52572720362993349654", - "expectedWait": 69.6042062402, - "gasprice": 5 - }, - { - "expectedTime": "917.466895447437420776", - "expectedWait": 66.1396721082, - "gasprice": 5.1 - }, - { - "expectedTime": "915.81694044041496090521", - "expectedWait": 66.0207277804, - "gasprice": 5.2 - }, - { - "expectedTime": "902.13145619709089691874", - "expectedWait": 65.034148924, - "gasprice": 5.3 - }, - { - "expectedTime": "890.83591122200105749896", - "expectedWait": 64.2198594443, - "gasprice": 5.4 - }, - { - "expectedTime": "879.10469542971335712248", - "expectedWait": 63.3741627006, - "gasprice": 5.5 - }, - { - "expectedTime": "876.99737395823100420974", - "expectedWait": 63.2222470818, - "gasprice": 5.6 - }, - { - "expectedTime": "865.96781957003849098957", - "expectedWait": 62.4271327138, - "gasprice": 5.7 - }, - { - "expectedTime": "865.44839472121496158482", - "expectedWait": 62.3896876688, - "gasprice": 5.8 - }, - { - "expectedTime": "802.16173170976255602161", - "expectedWait": 57.8273877524, - "gasprice": 6 - }, - { - "expectedTime": "780.79313908053047074843", - "expectedWait": 56.2869379368, - "gasprice": 6.1 - }, - { - "expectedTime": "770.04888359616469549233", - "expectedWait": 55.5123906062, - "gasprice": 6.2 - }, - { - "expectedTime": "745.01007965146736962697", - "expectedWait": 53.7073573226, - "gasprice": 6.3 - }, - { - "expectedTime": "735.19921111598501681816", - "expectedWait": 53.0000973318, - "gasprice": 6.6 - }, - { - "expectedTime": "705.68767153912619368694", - "expectedWait": 50.8726270539, - "gasprice": 6.7 - }, - { - "expectedTime": "705.26438593445239690121", - "expectedWait": 50.8421126329, - "gasprice": 6.9 - }, - { - "expectedTime": "652.51573119854865429742", - "expectedWait": 47.0394918019, - "gasprice": 7 - }, - { - "expectedTime": "635.51471669299464383162", - "expectedWait": 45.813898235, - "gasprice": 7.1 - }, - { - "expectedTime": "634.37181911960854759036", - "expectedWait": 45.7315073922, - "gasprice": 7.2 - }, - { - "expectedTime": "633.23097691113902888918", - "expectedWait": 45.6492647195, - "gasprice": 7.3 - }, - { - "expectedTime": "112.7753456245379663928", - "expectedWait": 8.1299111919, - "gasprice": 7.6 - }, - { - "expectedTime": "102.9665314468898381829", - "expectedWait": 7.4227992986, - "gasprice": 8 - }, - { - "expectedTime": "100.94784507024919649891", - "expectedWait": 7.2772733339, - "gasprice": 8.1 - }, - { - "expectedTime": "100.46445647447807351078", - "expectedWait": 7.2424261221, - "gasprice": 8.8 - }, - { - "expectedTime": "84.91686745986737853339", - "expectedWait": 6.1216091808, - "gasprice": 9 - }, - { - "expectedTime": "80.39566429296684383503", - "expectedWait": 5.7956781892, - "gasprice": 9.1 - }, - { - "expectedTime": "78.24522052614759252715", - "expectedWait": 5.6406539084, - "gasprice": 9.2 - }, - { - "expectedTime": "77.1685119880459882636", - "expectedWait": 5.5630345959, - "gasprice": 9.5 - }, - { - "expectedTime": "72.43649507646737870178", - "expectedWait": 5.2219061601, - "gasprice": 9.8 - }, - { - "expectedTime": "71.48259532351443753818", - "expectedWait": 5.1531400638, - "gasprice": 9.9 - }, - { - "expectedTime": "58.23892805162994573827", - "expectedWait": 4.1984115442, - "gasprice": 10 - }, - { - "expectedTime": "53.13065124862245917617", - "expectedWait": 3.8301587446, - "gasprice": 10.1 - }, - { - "expectedTime": "53.03510209647058751971", - "expectedWait": 3.82327066, - "gasprice": 10.3 - }, - { - "expectedTime": "49.06846157804491912403", - "expectedWait": 3.5373177776, - "gasprice": 11 - }, - { - "expectedTime": "48.30893330101818116637", - "expectedWait": 3.4825638116, - "gasprice": 11.1 - }, - { - "expectedTime": "48.25099734861818116715", - "expectedWait": 3.4783872414, - "gasprice": 11.3 - }, - { - "expectedTime": "47.64416885027272662988", - "expectedWait": 3.4346413165, - "gasprice": 11.9 - }, - { - "expectedTime": "46.76354741392085498401", - "expectedWait": 3.3711578128, - "gasprice": 12.6 - }, - { - "expectedTime": "44.99427448545882292232", - "expectedWait": 3.2436119232, - "gasprice": 13 - }, - { - "expectedTime": "44.61790554199251276697", - "expectedWait": 3.2164796979, - "gasprice": 13.1 - }, - { - "expectedTime": "42.87832690973048070488", - "expectedWait": 3.0910744534, - "gasprice": 14 - }, - { - "expectedTime": "42.21224091308663044649", - "expectedWait": 3.0430566888, - "gasprice": 14.9 - }, - { - "expectedTime": "41.15715335111336842864", - "expectedWait": 2.9669960203, - "gasprice": 15 - }, - { - "expectedTime": "40.9600723880876999821", - "expectedWait": 2.9527885646, - "gasprice": 15.1 - }, - { - "expectedTime": "38.89138450301711177472", - "expectedWait": 2.8036580193, - "gasprice": 15.8 - }, - { - "expectedTime": "37.89655640860213852611", - "expectedWait": 2.7319414219, - "gasprice": 16 - }, - { - "expectedTime": "37.35265517364705831954", - "expectedWait": 2.692731888, - "gasprice": 17.4 - }, - { - "expectedTime": "36.79447683873796741798", - "expectedWait": 2.652493126, - "gasprice": 17.8 - }, - { - "expectedTime": "36.11439350850802090309", - "expectedWait": 2.6034663015, - "gasprice": 19 - }, - { - "expectedTime": "31.32676199432192471101", - "expectedWait": 2.2583286403, - "gasprice": 20 - }, - { - "expectedTime": "30.76792490132192471855", - "expectedWait": 2.2180423888, - "gasprice": 20.1 - }, - { - "expectedTime": "29.94493658520962526441", - "expectedWait": 2.1587136243, - "gasprice": 25 - }, - { - "expectedTime": "29.53287347625561457478", - "expectedWait": 2.1290082267, - "gasprice": 29 - }, - { - "expectedTime": "29.09318627175614934008", - "expectedWait": 2.0973114236, - "gasprice": 47 - } - ], - "priceAndTimeEstimatesLastRetrieved": 1541527901281, - "errors": {} - } -} diff --git a/development/states/send.json b/development/states/send.json deleted file mode 100644 index c71516edce71..000000000000 --- a/development/states/send.json +++ /dev/null @@ -1,427 +0,0 @@ -{ - "metamask": { - "isInitialized": true, - "isUnlocked": true, - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "name": "Account 1" - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "name": "Account 2" - }, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { - "address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d", - "name": "Account 3" - }, - "0xd85a4b6a394794842887b8284293d69163007bbb": { - "address": "0xd85a4b6a394794842887b8284293d69163007bbb", - "name": "Account 4" - } - }, - "assetImages": {}, - "unapprovedTxs": {}, - "currentCurrency": "USD", - "conversionRate": 16.88200327, - "conversionDate": 1489013762, - "noActiveNotices": true, - "frequentRpcList": [], - "network": "3", - "accounts": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "code": "0x", - "balance": "0x47c9d71831c76efe", - "nonce": "0x1b", - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "code": "0x", - "balance": "0x37452b1315889f80", - "nonce": "0xa", - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb" - }, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d" - }, - "0xd85a4b6a394794842887b8284293d69163007bbb": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0xd85a4b6a394794842887b8284293d69163007bbb" - } - }, - "transactions": {}, - "selectedAddressTxList": [], - "unapprovedMsgs": {}, - "unapprovedMsgCount": 0, - "unapprovedPersonalMsgs": {}, - "unapprovedPersonalMsgCount": 0, - "keyringTypes": [ - "Simple Key Pair", - "HD Key Tree" - ], - "keyrings": [ - { - "type": "HD Key Tree", - "accounts": [ - "fdea65c8e26263f6d9a1b5de9555d2931a33b825", - "c5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "2f8d4a878cfa04a6e60d46362f5644deab66572d" - ] - }, - { - "type": "Simple Key Pair", - "accounts": [ - "0xd85a4b6a394794842887b8284293d69163007bbb" - ] - } - ], - "selectedAddress": "0xd85a4b6a394794842887b8284293d69163007bbb", - "currentCurrency": "USD", - "provider": { - "type": "testnet" - }, - "shapeShiftTxList": [], - "lostAccounts": [], - "frequentRpcListDetail": [] - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "sendTransaction", - "context": "0xd85a4b6a394794842887b8284293d69163007bbb" - }, - "accountDetail": { - "subview": "transactions", - "accountExport": "none", - "privateKey": "" - }, - "sidebar": {}, - "transForward": true, - "isLoading": false, - "warning": null, - "scrollToBottom": false, - "forgottenPassword": null - }, - "identities": {}, - "gas": { - "customData": { - "price": null, - "limit": "0x186a0" - }, - "basicEstimates": { - "average": 73, - "avgWait": 10.6, - "blockTime": 13.871657754010695, - "blockNum": 6655504, - "fast": 160, - "fastest": 290, - "fastestWait": 0.5, - "fastWait": 0.6, - "safeLow": 50, - "safeLowWait": 16.1, - "speed": 0.6702462692280712 - }, - "basicEstimateIsLoading": false, - "gasEstimatesLoading": false, - "priceAndTimeEstimates": [ - { - "expectedTime": "1374.1168296452973076627", - "expectedWait": 99.0593088449, - "gasprice": 4.1 - }, - { - "expectedTime": "1280.88976972896682763716", - "expectedWait": 92.3386225672, - "gasprice": 4.4 - }, - { - "expectedTime": "1245.13314632680319175597", - "expectedWait": 89.7609477113, - "gasprice": 4.8 - }, - { - "expectedTime": "1227.99925007911014385881", - "expectedWait": 88.5257747744, - "gasprice": 4.9 - }, - { - "expectedTime": "965.52572720362993349654", - "expectedWait": 69.6042062402, - "gasprice": 5 - }, - { - "expectedTime": "917.466895447437420776", - "expectedWait": 66.1396721082, - "gasprice": 5.1 - }, - { - "expectedTime": "915.81694044041496090521", - "expectedWait": 66.0207277804, - "gasprice": 5.2 - }, - { - "expectedTime": "902.13145619709089691874", - "expectedWait": 65.034148924, - "gasprice": 5.3 - }, - { - "expectedTime": "890.83591122200105749896", - "expectedWait": 64.2198594443, - "gasprice": 5.4 - }, - { - "expectedTime": "879.10469542971335712248", - "expectedWait": 63.3741627006, - "gasprice": 5.5 - }, - { - "expectedTime": "876.99737395823100420974", - "expectedWait": 63.2222470818, - "gasprice": 5.6 - }, - { - "expectedTime": "865.96781957003849098957", - "expectedWait": 62.4271327138, - "gasprice": 5.7 - }, - { - "expectedTime": "865.44839472121496158482", - "expectedWait": 62.3896876688, - "gasprice": 5.8 - }, - { - "expectedTime": "802.16173170976255602161", - "expectedWait": 57.8273877524, - "gasprice": 6 - }, - { - "expectedTime": "780.79313908053047074843", - "expectedWait": 56.2869379368, - "gasprice": 6.1 - }, - { - "expectedTime": "770.04888359616469549233", - "expectedWait": 55.5123906062, - "gasprice": 6.2 - }, - { - "expectedTime": "745.01007965146736962697", - "expectedWait": 53.7073573226, - "gasprice": 6.3 - }, - { - "expectedTime": "735.19921111598501681816", - "expectedWait": 53.0000973318, - "gasprice": 6.6 - }, - { - "expectedTime": "705.68767153912619368694", - "expectedWait": 50.8726270539, - "gasprice": 6.7 - }, - { - "expectedTime": "705.26438593445239690121", - "expectedWait": 50.8421126329, - "gasprice": 6.9 - }, - { - "expectedTime": "652.51573119854865429742", - "expectedWait": 47.0394918019, - "gasprice": 7 - }, - { - "expectedTime": "635.51471669299464383162", - "expectedWait": 45.813898235, - "gasprice": 7.1 - }, - { - "expectedTime": "634.37181911960854759036", - "expectedWait": 45.7315073922, - "gasprice": 7.2 - }, - { - "expectedTime": "633.23097691113902888918", - "expectedWait": 45.6492647195, - "gasprice": 7.3 - }, - { - "expectedTime": "112.7753456245379663928", - "expectedWait": 8.1299111919, - "gasprice": 7.6 - }, - { - "expectedTime": "102.9665314468898381829", - "expectedWait": 7.4227992986, - "gasprice": 8 - }, - { - "expectedTime": "100.94784507024919649891", - "expectedWait": 7.2772733339, - "gasprice": 8.1 - }, - { - "expectedTime": "100.46445647447807351078", - "expectedWait": 7.2424261221, - "gasprice": 8.8 - }, - { - "expectedTime": "84.91686745986737853339", - "expectedWait": 6.1216091808, - "gasprice": 9 - }, - { - "expectedTime": "80.39566429296684383503", - "expectedWait": 5.7956781892, - "gasprice": 9.1 - }, - { - "expectedTime": "78.24522052614759252715", - "expectedWait": 5.6406539084, - "gasprice": 9.2 - }, - { - "expectedTime": "77.1685119880459882636", - "expectedWait": 5.5630345959, - "gasprice": 9.5 - }, - { - "expectedTime": "72.43649507646737870178", - "expectedWait": 5.2219061601, - "gasprice": 9.8 - }, - { - "expectedTime": "71.48259532351443753818", - "expectedWait": 5.1531400638, - "gasprice": 9.9 - }, - { - "expectedTime": "58.23892805162994573827", - "expectedWait": 4.1984115442, - "gasprice": 10 - }, - { - "expectedTime": "53.13065124862245917617", - "expectedWait": 3.8301587446, - "gasprice": 10.1 - }, - { - "expectedTime": "53.03510209647058751971", - "expectedWait": 3.82327066, - "gasprice": 10.3 - }, - { - "expectedTime": "49.06846157804491912403", - "expectedWait": 3.5373177776, - "gasprice": 11 - }, - { - "expectedTime": "48.30893330101818116637", - "expectedWait": 3.4825638116, - "gasprice": 11.1 - }, - { - "expectedTime": "48.25099734861818116715", - "expectedWait": 3.4783872414, - "gasprice": 11.3 - }, - { - "expectedTime": "47.64416885027272662988", - "expectedWait": 3.4346413165, - "gasprice": 11.9 - }, - { - "expectedTime": "46.76354741392085498401", - "expectedWait": 3.3711578128, - "gasprice": 12.6 - }, - { - "expectedTime": "44.99427448545882292232", - "expectedWait": 3.2436119232, - "gasprice": 13 - }, - { - "expectedTime": "44.61790554199251276697", - "expectedWait": 3.2164796979, - "gasprice": 13.1 - }, - { - "expectedTime": "42.87832690973048070488", - "expectedWait": 3.0910744534, - "gasprice": 14 - }, - { - "expectedTime": "42.21224091308663044649", - "expectedWait": 3.0430566888, - "gasprice": 14.9 - }, - { - "expectedTime": "41.15715335111336842864", - "expectedWait": 2.9669960203, - "gasprice": 15 - }, - { - "expectedTime": "40.9600723880876999821", - "expectedWait": 2.9527885646, - "gasprice": 15.1 - }, - { - "expectedTime": "38.89138450301711177472", - "expectedWait": 2.8036580193, - "gasprice": 15.8 - }, - { - "expectedTime": "37.89655640860213852611", - "expectedWait": 2.7319414219, - "gasprice": 16 - }, - { - "expectedTime": "37.35265517364705831954", - "expectedWait": 2.692731888, - "gasprice": 17.4 - }, - { - "expectedTime": "36.79447683873796741798", - "expectedWait": 2.652493126, - "gasprice": 17.8 - }, - { - "expectedTime": "36.11439350850802090309", - "expectedWait": 2.6034663015, - "gasprice": 19 - }, - { - "expectedTime": "31.32676199432192471101", - "expectedWait": 2.2583286403, - "gasprice": 20 - }, - { - "expectedTime": "30.76792490132192471855", - "expectedWait": 2.2180423888, - "gasprice": 20.1 - }, - { - "expectedTime": "29.94493658520962526441", - "expectedWait": 2.1587136243, - "gasprice": 25 - }, - { - "expectedTime": "29.53287347625561457478", - "expectedWait": 2.1290082267, - "gasprice": 29 - }, - { - "expectedTime": "29.09318627175614934008", - "expectedWait": 2.0973114236, - "gasprice": 47 - } - ], - "priceAndTimeEstimatesLastRetrieved": 1541527901281, - "errors": {} - } -} diff --git a/development/states/shapeshift.json b/development/states/shapeshift.json deleted file mode 100644 index bfd4b7c16148..000000000000 --- a/development/states/shapeshift.json +++ /dev/null @@ -1,346 +0,0 @@ -{ - "metamask": { - "isInitialized": true, - "isUnlocked": true, - "currentDomain": "example.com", - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "name": "Wallet 1", - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "mayBeFauceting": false - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "name": "Wallet 2", - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "mayBeFauceting": false - }, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { - "name": "Wallet 3", - "address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d", - "mayBeFauceting": false - } - }, - "unconfTxs": {}, - "currentCurrency": "USD", - "conversionRate": 11.21274318, - "conversionDate": 1472159644, - "accounts": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "code": "0x", - "nonce": "0x13", - "balance": "0x461d4a64e937d3d1", - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "code": "0x", - "nonce": "0x0", - "balance": "0x0", - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb" - }, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d" - } - }, - "transactions": [], - "selectedAddress": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "network": "1", - "seedWords": null, - "unconfMsgs": {}, - "messages": [], - "shapeShiftTxList": [], - "provider": { - "type": "mainnet" - }, - "selectedAddress": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "buyEth", - "context": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - }, - "accountDetail": { - "subview": "transactions" - }, - "currentDomain": "127.0.0.1:9966", - "transForward": true, - "isLoading": false, - "detailView": {}, - "buyView": { - "subview": "buyForm", - "formView": { - "coinbase": false, - "shapeshift": true, - "marketinfo": { - "pair": "btc_eth", - "rate": 51.14252949, - "minerFee": 0.01, - "limit": 2.60306578, - "minimum": 0.00038935, - "maxLimit": 8.67688592 - }, - "coinOptions": { - "BTC": { - "name": "Bitcoin", - "symbol": "BTC", - "image": "https://shapeshift.io/images/coins/bitcoin.png", - "status": "available" - }, - "BCY": { - "name": "BitCrystals", - "symbol": "BCY", - "image": "https://shapeshift.io/images/coins/bitcrystals.png", - "status": "available" - }, - "BLK": { - "name": "Blackcoin", - "symbol": "BLK", - "image": "https://shapeshift.io/images/coins/blackcoin.png", - "status": "available" - }, - "BTS": { - "name": "Bitshares", - "symbol": "BTS", - "specialReturn": false, - "specialOutgoing": true, - "specialIncoming": true, - "fieldName": "destTag", - "fieldKey": "destTag", - "image": "https://shapeshift.io/images/coins/bitshares.png", - "status": "available" - }, - "CLAM": { - "name": "Clams", - "symbol": "CLAM", - "image": "https://shapeshift.io/images/coins/clams.png", - "status": "available" - }, - "DASH": { - "name": "Dash", - "symbol": "DASH", - "image": "https://shapeshift.io/images/coins/dash.png", - "status": "available" - }, - "DGB": { - "name": "Digibyte", - "symbol": "DGB", - "image": "https://shapeshift.io/images/coins/digibyte.png", - "status": "available" - }, - "DAO": { - "name": "TheDao", - "symbol": "DAO", - "image": "https://shapeshift.io/images/coins/thedao.png", - "status": "available" - }, - "DGD": { - "name": "DigixDao", - "symbol": "DGD", - "image": "https://shapeshift.io/images/coins/digixdao.png", - "status": "available" - }, - "DOGE": { - "name": "Dogecoin", - "symbol": "DOGE", - "image": "https://shapeshift.io/images/coins/dogecoin.png", - "status": "available" - }, - "EMC": { - "name": "Emercoin", - "symbol": "EMC", - "image": "https://shapeshift.io/images/coins/emercoin.png", - "status": "available" - }, - "ETH": { - "name": "Ether", - "symbol": "ETH", - "image": "https://shapeshift.io/images/coins/ether.png", - "status": "available" - }, - "ETC": { - "name": "Ether Classic", - "symbol": "ETC", - "image": "https://shapeshift.io/images/coins/etherclassic.png", - "status": "available" - }, - "FCT": { - "name": "Factoids", - "symbol": "FCT", - "image": "https://shapeshift.io/images/coins/factoids.png", - "status": "available" - }, - "LBC": { - "name": "LBRY Credits", - "symbol": "LBC", - "image": "https://shapeshift.io/images/coins/lbry.png", - "status": "available" - }, - "LSK": { - "name": "Lisk", - "symbol": "LSK", - "image": "https://shapeshift.io/images/coins/lisk.png", - "status": "available" - }, - "LTC": { - "name": "Litecoin", - "symbol": "LTC", - "image": "https://shapeshift.io/images/coins/litecoin.png", - "status": "available" - }, - "MAID": { - "name": "Maidsafe", - "symbol": "MAID", - "image": "https://shapeshift.io/images/coins/maidsafe.png", - "status": "available" - }, - "MINT": { - "name": "Mintcoin", - "symbol": "MINT", - "image": "https://shapeshift.io/images/coins/mintcoin.png", - "status": "available" - }, - "MONA": { - "name": "Monacoin", - "symbol": "MONA", - "image": "https://shapeshift.io/images/coins/monacoin.png", - "status": "available" - }, - "MSC": { - "name": "Omni", - "symbol": "MSC", - "image": "https://shapeshift.io/images/coins/mastercoin.png", - "status": "available" - }, - "NBT": { - "name": "Nubits", - "symbol": "NBT", - "image": "https://shapeshift.io/images/coins/nubits.png", - "status": "available" - }, - "NMC": { - "name": "Namecoin", - "symbol": "NMC", - "image": "https://shapeshift.io/images/coins/namecoin.png", - "status": "available" - }, - "NVC": { - "name": "Novacoin", - "symbol": "NVC", - "image": "https://shapeshift.io/images/coins/novacoin.png", - "status": "available" - }, - "NXT": { - "name": "Nxt", - "symbol": "NXT", - "specialReturn": false, - "specialOutgoing": true, - "specialIncoming": true, - "specialIncomingStatus": false, - "fieldName": "Public Key (only for unfunded accounts!)", - "fieldKey": "rsAddress", - "image": "https://shapeshift.io/images/coins/nxt.png", - "status": "available" - }, - "PPC": { - "name": "Peercoin", - "symbol": "PPC", - "image": "https://shapeshift.io/images/coins/peercoin.png", - "status": "available" - }, - "RDD": { - "name": "Reddcoin", - "symbol": "RDD", - "image": "https://shapeshift.io/images/coins/reddcoin.png", - "status": "available" - }, - "SDC": { - "name": "Shadowcash", - "symbol": "SDC", - "image": "https://shapeshift.io/images/coins/shadowcash.png", - "status": "available" - }, - "SC": { - "name": "Siacoin", - "symbol": "SC", - "image": "https://shapeshift.io/images/coins/siacoin.png", - "status": "available" - }, - "SJCX": { - "name": "StorjX", - "symbol": "SJCX", - "image": "https://shapeshift.io/images/coins/storjcoinx.png", - "status": "available" - }, - "START": { - "name": "Startcoin", - "symbol": "START", - "image": "https://shapeshift.io/images/coins/startcoin.png", - "status": "available" - }, - "STEEM": { - "name": "Steem", - "symbol": "STEEM", - "specialReturn": false, - "specialOutgoing": true, - "specialIncoming": true, - "fieldName": "destTag", - "fieldKey": "destTag", - "image": "https://shapeshift.io/images/coins/steem.png", - "status": "available" - }, - "USDT": { - "name": "Tether", - "symbol": "USDT", - "image": "https://shapeshift.io/images/coins/tether.png", - "status": "available" - }, - "VOX": { - "name": "Voxels", - "symbol": "VOX", - "image": "https://shapeshift.io/images/coins/voxels.png", - "status": "available" - }, - "VRC": { - "name": "Vericoin", - "symbol": "VRC", - "image": "https://shapeshift.io/images/coins/vericoin.png", - "status": "available" - }, - "VTC": { - "name": "Vertcoin", - "symbol": "VTC", - "image": "https://shapeshift.io/images/coins/vertcoin.png", - "status": "available" - }, - "XCP": { - "name": "Counterparty", - "symbol": "XCP", - "image": "https://shapeshift.io/images/coins/counterparty.png", - "status": "available" - }, - "XMR": { - "name": "Monero", - "symbol": "XMR", - "specialReturn": false, - "specialOutgoing": true, - "specialIncoming": true, - "fieldName": "Payment Id", - "qrName": "tx_payment_id", - "fieldKey": "paymentId", - "image": "https://shapeshift.io/images/coins/monero.png", - "status": "available" - } - } - }, - "buyAddress": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "amount": "5.00", - "warning": null - }, - "isSubLoading": false - }, - "identities": {} -} diff --git a/development/states/show-seed-words.json b/development/states/show-seed-words.json deleted file mode 100644 index 55127f60a80f..000000000000 --- a/development/states/show-seed-words.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "metamask": { - "isInitialized": false, - "isUnlocked": true, - "currentDomain": "example.com", - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc": { - "name": "Wallet 1", - "address": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", - "mayBeFauceting": false - }, - "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b": { - "name": "Wallet 2", - "address": "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b", - "mayBeFauceting": false - }, - "0xeb9e64b93097bc15f01f13eae97015c57ab64823": { - "name": "Wallet 3", - "address": "0xeb9e64b93097bc15f01f13eae97015c57ab64823", - "mayBeFauceting": false - } - }, - "unconfTxs": {}, - "accounts": { - "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc": { - "balance": "0x0", - "nonce": "0x0", - "code": "0x", - "address": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc" - }, - "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b": { - "balance": "0x0", - "nonce": "0x0", - "code": "0x", - "address": "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b" - }, - "0xeb9e64b93097bc15f01f13eae97015c57ab64823": { - "balance": "0x0", - "nonce": "0x0", - "code": "0x", - "address": "0xeb9e64b93097bc15f01f13eae97015c57ab64823" - } - }, - "transactions": [], - "network": "2", - "seedWords": "debris dizzy just program just float decrease vacant alarm reduce speak stadium", - "unconfMsgs": {}, - "messages": [], - "provider": { - "type": "testnet" - } - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "createVaultComplete", - "seedWords": "debris dizzy just program just float decrease vacant alarm reduce speak stadium" - }, - "accountDetail": { - "subview": "transactions" - }, - "currentDomain": "extensions", - "transForward": true, - "isLoading": false, - "warning": null - }, - "identities": {} -} diff --git a/development/states/terms-and-conditions.json b/development/states/terms-and-conditions.json deleted file mode 100644 index f5ebe8254e3d..000000000000 --- a/development/states/terms-and-conditions.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "metamask": { - "isInitialized": false, - "isUnlocked": false, - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": {}, - "unconfTxs": {}, - "currentCurrency": "USD", - "conversionRate": 8.18703468, - "conversionDate": 1481755832, - "network": "3", - "accounts": {}, - "transactions": [], - "provider": { - "type": "testnet" - }, - "unconfMsgs": {}, - "messages": [], - "shapeShiftTxList": [], - "keyringTypes": [ - "Simple Key Pair", - "HD Key Tree" - ] - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "accounts", - "detailView": null - }, - "accountDetail": { - "subview": "transactions" - }, - "transForward": true, - "isLoading": false, - "warning": null - }, - "identities": {} -} diff --git a/development/states/tx-list-items.json b/development/states/tx-list-items.json deleted file mode 100644 index 4190ee149b2f..000000000000 --- a/development/states/tx-list-items.json +++ /dev/null @@ -1,1410 +0,0 @@ -{ - "metamask": { - "completedOnboarding": true, - "isInitialized": true, - "isUnlocked": true, - "featureFlags": {"betaUI": true}, - "rpcTarget": "https://rawtestrpc.metamask.io/", - "identities": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "name": "Send Account 1" - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "name": "Send Account 2" - }, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { - "address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d", - "name": "Send Account 3" - }, - "0xd85a4b6a394794842887b8284293d69163007bbb": { - "address": "0xd85a4b6a394794842887b8284293d69163007bbb", - "name": "Send Account 4" - } - }, - "cachedBalances": {}, - "currentCurrency": "USD", - "conversionRate": 1200.88200327, - "conversionDate": 1489013762, - "noActiveNotices": true, - "frequentRpcList": [], - "network": "1", - "accounts": { - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": { - "code": "0x", - "balance": "0x47c9d71831c76efe", - "nonce": "0x1b", - "address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825" - }, - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": { - "code": "0x", - "balance": "0x37452b1315889f80", - "nonce": "0xa", - "address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb" - }, - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d": { - "code": "0x", - "balance": "0x30c9d71831c76efe", - "nonce": "0x1c", - "address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d" - }, - "0xd85a4b6a394794842887b8284293d69163007bbb": { - "code": "0x", - "balance": "0x0", - "nonce": "0x0", - "address": "0xd85a4b6a394794842887b8284293d69163007bbb" - } - }, - "addressBook": [ - { - "address": "0x06195827297c7a80a443b6894d3bdb8824b43896", - "name": "Address Book Account 1" - } - ], - "tokens": [], - "transactions": {}, - "selectedAddressTxList": [ - { - "err": { - "message": "Error: intrinsic gas too low", - "stack": "Error: some error" - }, - "estimatedGas": "0xcf08", - "gasLimitSpecified": true, - "gasPriceSpecified": true, - "history": [ - { - "id": 4068311466147836, - "loadingDefaults": true, - "metamaskNetworkId": "1", - "status": "unapproved", - "time": 1522378334455, - "txParams": { - "from": "0x5b1cbd5636d484bf1cb6927a9425db9e7dc73ce4", - "gas": "0xcf08", - "gasPrice": "0x77359400", - "to": "0xf45d68f31b3c9ac84ff0d07b86c59b753a60b1e3", - "value": "0x0" - } - }, - [ - { - "op": "replace", - "path": "/loadingDefaults", - "value": false - }, - { - "op": "add", - "path": "/gasPriceSpecified", - "value": true - }, - { - "op": "add", - "path": "/gasLimitSpecified", - "value": true - }, - { - "op": "add", - "path": "/estimatedGas", - "value": "0xcf08" - } - ], - [ - { - "note": "confTx: user approved transaction", - "op": "replace", - "path": "/txParams/gas", - "value": "0x0" - } - ], - [ - { - "note": "txStateManager: setting status to approved", - "op": "replace", - "path": "/status", - "value": "approved" - } - ], - [ - { - "note": "transactions#approveTransaction", - "op": "add", - "path": "/txParams/nonce", - "value": "0x3" - }, - { - "op": "add", - "path": "/nonceDetails", - "value": { - "local": { - "details": { - "highest": 3, - "startPoint": 3 - }, - "name": "local", - "nonce": 3 - }, - "network": { - "details": { - "baseCount": 3 - }, - "name": "network", - "nonce": 3 - }, - "params": { - "highestLocalNonce": 3, - "highestSuggested": 3, - "nextNetworkNonce": 3 - } - } - } - ], - [ - { - "note": "txStateManager: setting status to signed", - "op": "add", - "path": "/txParams/chainId", - "value": "0x3" - }, - { - "op": "replace", - "path": "/status", - "value": "signed" - } - ], - [ - { - "note": "transactions#publishTransaction", - "op": "add", - "path": "/rawTx", - "value": "0xf8610384773594008094f45d68f31b3c9ac84ff0d07b86c59b753a60b1e3808029a052e5246c9a404f756a246b8cec545099741aeb4e6e0add935a5b7a366fa88f95a0538eaa2421e50377c534244dcdcd15ace00bf9c0adbd9eb162baae2b9e89a36f" - } - ], - [ - { - "op": "add", - "path": "/err", - "value": { - "message": "Error: intrinsic gas too low", - "stack":"Error: some error" - } - } - ] - ], - "id": 4068311466147836, - "loadingDefaults": false, - "metamaskNetworkId": "1", - "nonceDetails": { - "local": { - "details": { - "highest": 3, - "startPoint": 3 - }, - "name": "local", - "nonce": 3 - }, - "network": { - "details": { - "baseCount": 3 - }, - "name": "network", - "nonce": 3 - }, - "params": { - "highestLocalNonce": 3, - "highestSuggested": 3, - "nextNetworkNonce": 3 - } - }, - "rawTx": "0xf8610384773594008094f45d68f31b3c9ac84ff0d07b86c59b753a60b1e3808029a052e5246c9a404f756a246b8cec545099741aeb4e6e0add935a5b7a366fa88f95a0538eaa2421e50377c534244dcdcd15ace00bf9c0adbd9eb162baae2b9e89a36f", - "status": "failed", - "time": 1522378334455, - "txParams": { - "chainId": "0x3", - "from": "0x5b1cbd5636d484bf1cb6927a9425db9e7dc73ce4", - "gas": "0x0", - "gasPrice": "0x77359400", - "nonce": "0x3", - "to": "0xf45d68f31b3c9ac84ff0d07b86c59b753a60b1e3", - "value": "0x0" - } - }, - { - "id": 2315363930841933, - "time": 1522378572149, - "status": "approved", - "metamaskNetworkId": "1", - "loadingDefaults": false, - "txParams": { - "from": "0x5b1cbd5636d484bf1cb6927a9425db9e7dc73ce4", - "to": "0xf45d68f31b3c9ac84ff0d07b86c59b753a60b1e3", - "value": "0x0", - "gas": "0x0", - "gasPrice": "0x5f5e100", - "nonce": "0x4" - }, - "history": [ - { - "id": 2315363930841933, - "time": 1522378572149, - "status": "unapproved", - "metamaskNetworkId": "1", - "loadingDefaults": true, - "txParams": { - "from": "0x5b1cbd5636d484bf1cb6927a9425db9e7dc73ce4", - "to": "0xf45d68f31b3c9ac84ff0d07b86c59b753a60b1e3", - "value": "0x0", - "gas": "0xcf08", - "gasPrice": "0x5f5e100" - } - }, - [ - { - "op": "replace", - "path": "/loadingDefaults", - "value": false - }, - { - "op": "add", - "path": "/gasPriceSpecified", - "value": true - }, - { - "op": "add", - "path": "/gasLimitSpecified", - "value": true - }, - { - "op": "add", - "path": "/estimatedGas", - "value": "0xcf08" - } - ], - [ - { - "op": "replace", - "path": "/txParams/gas", - "value": "0x0", - "note": "confTx: user approved transaction" - } - ], - [ - { - "op": "replace", - "path": "/status", - "value": "approved", - "note": "txStateManager: setting status to approved" - } - ] - ], - "gasPriceSpecified": true, - "gasLimitSpecified": true, - "estimatedGas": "0xcf08" - }, - { - "estimatedGas": "8d41", - "firstRetryBlockNumber": "0x2cbc70", - "gasLimitSpecified": false, - "gasPriceSpecified": false, - "hash": "0xfbd997bf9bb85ca1598952ca23e7910502d527e06cb6ee1bbe7e7dd59d6909cd", - "history": [ - { - "id": 2079438776801906, - "loadingDefaults": true, - "metamaskNetworkId": "1", - "status": "unapproved", - "time": 1522346270251, - "txParams": { - "data": "0xa9059cbb000000000000000000000000e7884118ee52ec3f4eef715cb022279d7d4181a9000000000000000000000000000000000000000000000000000000000000000b", - "from": "0x5b1cbd5636d484bf1cb6927a9425db9e7dc73ce4", - "to": "0x66f30b996a7d345cd00badcfe75e81e25dc5e1eb" - } - }, - [ - { - "op": "add", - "path": "/txParams/gasPrice", - "value": "0x37e11d600" - }, - { - "op": "add", - "path": "/txParams/value", - "value": "0x0" - }, - { - "op": "add", - "path": "/txParams/gas", - "value": "0xd3e1" - }, - { - "op": "replace", - "path": "/loadingDefaults", - "value": false - }, - { - "op": "add", - "path": "/gasPriceSpecified", - "value": false - }, - { - "op": "add", - "path": "/gasLimitSpecified", - "value": false - }, - { - "op": "add", - "path": "/estimatedGas", - "value": "8d41" - } - ], - [ - { - "note": "confTx: user approved transaction", - "op": "replace", - "path": "/txParams/gasPrice", - "value": "0x5f5e100" - } - ], - [ - { - "note": "txStateManager: setting status to approved", - "op": "replace", - "path": "/status", - "value": "approved" - } - ], - [ - { - "note": "transactions#approveTransaction", - "op": "add", - "path": "/txParams/nonce", - "value": "0x2" - }, - { - "op": "add", - "path": "/nonceDetails", - "value": { - "local": { - "details": { - "highest": 2, - "startPoint": 2 - }, - "name": "local", - "nonce": 2 - }, - "network": { - "details": { - "baseCount": 2 - }, - "name": "network", - "nonce": 2 - }, - "params": { - "highestLocalNonce": 2, - "highestSuggested": 2, - "nextNetworkNonce": 2 - } - } - } - ], - [ - { - "note": "txStateManager: setting status to signed", - "op": "add", - "path": "/txParams/chainId", - "value": "0x3" - }, - { - "op": "replace", - "path": "/status", - "value": "signed" - } - ], - [ - { - "note": "transactions#publishTransaction", - "op": "add", - "path": "/rawTx", - "value": "0xf8a8028405f5e10082d3e19466f30b996a7d345cd00badcfe75e81e25dc5e1eb80b844a9059cbb000000000000000000000000e7884118ee52ec3f4eef715cb022279d7d4181a9000000000000000000000000000000000000000000000000000000000000000b2aa05cb38a3a68e49008da2e93839f6dedeb96b1630c2a73c4cf5eb3fcc74299a100a039f17c0807469bd101165fa0749dc7065832b4a7c3a382b6cf7e29228c2a683d" - } - ], - [ - { - "note": "transactions#setTxHash", - "op": "add", - "path": "/hash", - "value": "0xfbd997bf9bb85ca1598952ca23e7910502d527e06cb6ee1bbe7e7dd59d6909cd" - } - ], - [ - { - "note": "txStateManager - add submitted time stamp", - "op": "add", - "path": "/submittedTime", - "value": 1522346282571 - } - ], - [ - { - "note": "txStateManager: setting status to submitted", - "op": "replace", - "path": "/status", - "value": "submitted" - } - ], - [ - { - "note": "transactions/pending-tx-tracker#event: tx:block-update", - "op": "add", - "path": "/firstRetryBlockNumber", - "value": "0x2cbc70" - } - ], - [ - { - "note": "txStateManager: setting status to confirmed", - "op": "replace", - "path": "/status", - "value": "confirmed" - } - ] - ], - "id": 2079438776801906, - "loadingDefaults": false, - "metamaskNetworkId": "1", - "nonceDetails": { - "local": { - "details": { - "highest": 2, - "startPoint": 2 - }, - "name": "local", - "nonce": 2 - }, - "network": { - "details": { - "baseCount": 2 - }, - "name": "network", - "nonce": 2 - }, - "params": { - "highestLocalNonce": 2, - "highestSuggested": 2, - "nextNetworkNonce": 2 - } - }, - "rawTx": "0xf8a8028405f5e10082d3e19466f30b996a7d345cd00badcfe75e81e25dc5e1eb80b844a9059cbb000000000000000000000000e7884118ee52ec3f4eef715cb022279d7d4181a9000000000000000000000000000000000000000000000000000000000000000b2aa05cb38a3a68e49008da2e93839f6dedeb96b1630c2a73c4cf5eb3fcc74299a100a039f17c0807469bd101165fa0749dc7065832b4a7c3a382b6cf7e29228c2a683d", - "status": "confirmed", - "submittedTime": 1522346282571, - "time": 1522348270251, - "txParams": { - "chainId": "0x3", - "data": "0xa9059cbb000000000000000000000000e7884118ee52ec3f4eef715cb022279d7d4181a9000000000000000000000000000000000000000000000000000000000000000b", - "from": "0x5b1cbd5636d484bf1cb6927a9425db9e7dc73ce4", - "gas": "0xd3e1", - "gasPrice": "0x5f5e100", - "nonce": "0x6", - "to": "0x66f30b996a7d345cd00badcfe75e81e25dc5e1ec", - "value": "0x0" - } - }, - { - "estimatedGas": "8d41", - "firstRetryBlockNumber": "0x2cbc70", - "gasLimitSpecified": false, - "gasPriceSpecified": false, - "hash": "0xfbd997bf9bb85ca1598952ca23e7910502d527e06cb6ee1bbe7e7dd59d6909cd", - "history": [ - { - "id": 2079438776801906, - "loadingDefaults": true, - "metamaskNetworkId": "1", - "status": "unapproved", - "time": 1522346270251, - "txParams": { - "data": "0xa9059cbb000000000000000000000000e7884118ee52ec3f4eef715cb022279d7d4181a9000000000000000000000000000000000000000000000000000000000000000b", - "from": "0x5b1cbd5636d484bf1cb6927a9425db9e7dc73ce4", - "to": "0x66f30b996a7d345cd00badcfe75e81e25dc5e1eb" - } - }, - [ - { - "op": "add", - "path": "/txParams/gasPrice", - "value": "0x37e11d600" - }, - { - "op": "add", - "path": "/txParams/value", - "value": "0x0" - }, - { - "op": "add", - "path": "/txParams/gas", - "value": "0xd3e1" - }, - { - "op": "replace", - "path": "/loadingDefaults", - "value": false - }, - { - "op": "add", - "path": "/gasPriceSpecified", - "value": false - }, - { - "op": "add", - "path": "/gasLimitSpecified", - "value": false - }, - { - "op": "add", - "path": "/estimatedGas", - "value": "8d41" - } - ], - [ - { - "note": "confTx: user approved transaction", - "op": "replace", - "path": "/txParams/gasPrice", - "value": "0x5f5e100" - } - ], - [ - { - "note": "txStateManager: setting status to approved", - "op": "replace", - "path": "/status", - "value": "approved" - } - ], - [ - { - "note": "transactions#approveTransaction", - "op": "add", - "path": "/txParams/nonce", - "value": "0x2" - }, - { - "op": "add", - "path": "/nonceDetails", - "value": { - "local": { - "details": { - "highest": 2, - "startPoint": 2 - }, - "name": "local", - "nonce": 2 - }, - "network": { - "details": { - "baseCount": 2 - }, - "name": "network", - "nonce": 2 - }, - "params": { - "highestLocalNonce": 2, - "highestSuggested": 2, - "nextNetworkNonce": 2 - } - } - } - ], - [ - { - "note": "txStateManager: setting status to signed", - "op": "add", - "path": "/txParams/chainId", - "value": "0x3" - }, - { - "op": "replace", - "path": "/status", - "value": "signed" - } - ], - [ - { - "note": "transactions#publishTransaction", - "op": "add", - "path": "/rawTx", - "value": "0xf8a8028405f5e10082d3e19466f30b996a7d345cd00badcfe75e81e25dc5e1eb80b844a9059cbb000000000000000000000000e7884118ee52ec3f4eef715cb022279d7d4181a9000000000000000000000000000000000000000000000000000000000000000b2aa05cb38a3a68e49008da2e93839f6dedeb96b1630c2a73c4cf5eb3fcc74299a100a039f17c0807469bd101165fa0749dc7065832b4a7c3a382b6cf7e29228c2a683d" - } - ], - [ - { - "note": "transactions#setTxHash", - "op": "add", - "path": "/hash", - "value": "0xfbd997bf9bb85ca1598952ca23e7910502d527e06cb6ee1bbe7e7dd59d6909cd" - } - ], - [ - { - "note": "txStateManager - add submitted time stamp", - "op": "add", - "path": "/submittedTime", - "value": 1522346282571 - } - ], - [ - { - "note": "txStateManager: setting status to submitted", - "op": "replace", - "path": "/status", - "value": "submitted" - } - ], - [ - { - "note": "transactions/pending-tx-tracker#event: tx:block-update", - "op": "add", - "path": "/firstRetryBlockNumber", - "value": "0x2cbc70" - } - ], - [ - { - "note": "txStateManager: setting status to confirmed", - "op": "replace", - "path": "/status", - "value": "confirmed" - } - ] - ], - "id": 2079438776801906, - "loadingDefaults": false, - "metamaskNetworkId": "1", - "nonceDetails": { - "local": { - "details": { - "highest": 2, - "startPoint": 2 - }, - "name": "local", - "nonce": 2 - }, - "network": { - "details": { - "baseCount": 2 - }, - "name": "network", - "nonce": 2 - }, - "params": { - "highestLocalNonce": 2, - "highestSuggested": 2, - "nextNetworkNonce": 2 - } - }, - "rawTx": "0xf8a8028405f5e10082d3e19466f30b996a7d345cd00badcfe75e81e25dc5e1eb80b844a9059cbb000000000000000000000000e7884118ee52ec3f4eef715cb022279d7d4181a9000000000000000000000000000000000000000000000000000000000000000b2aa05cb38a3a68e49008da2e93839f6dedeb96b1630c2a73c4cf5eb3fcc74299a100a039f17c0807469bd101165fa0749dc7065832b4a7c3a382b6cf7e29228c2a683d", - "status": "confirmed", - "submittedTime": 1522346282571, - "time": 1522346270251, - "txParams": { - "chainId": "0x3", - "data": "0xa9059cbb000000000000000000000000e7884118ee52ec3f4eef715cb022279d7d4181a9000000000000000000000000000000000000000000000000000000000000000b", - "from": "0x5b1cbd5636d484bf1cb6927a9425db9e7dc73ce4", - "gas": "0xd3e1", - "gasPrice": "0x5f5e100", - "nonce": "0x2", - "to": "0x66f30b996a7d345cd00badcfe75e81e25dc5e1eb", - "value": "0x0" - } - }, - { - "id": 4087002078467524, - "time": 1522379587999, - "status": "submitted", - "metamaskNetworkId": "1", - "loadingDefaults": false, - "txParams": { - "from": "0x5b1cbd5636d484bf1cb6927a9425db9e7dc73ce4", - "to": "0xf45d68f31b3c9ac84ff0d07b86c59b753a60b1e3", - "value": "0x0", - "gas": "0xcf08", - "gasPrice": "0x5f5e100", - "nonce": "0x3", - "chainId": "0x3" - }, - "history": [ - { - "id": 4087002078467524, - "time": 1522379587999, - "status": "unapproved", - "metamaskNetworkId": "1", - "loadingDefaults": true, - "txParams": { - "from": "0x5b1cbd5636d484bf1cb6927a9425db9e7dc73ce4", - "to": "0xf45d68f31b3c9ac84ff0d07b86c59b753a60b1e3", - "value": "0x0", - "gas": "0xcf08", - "gasPrice": "0x5f5e100" - } - }, - [ - { - "op": "replace", - "path": "/loadingDefaults", - "value": false - }, - { - "op": "add", - "path": "/gasPriceSpecified", - "value": true - }, - { - "op": "add", - "path": "/gasLimitSpecified", - "value": true - }, - { - "op": "add", - "path": "/estimatedGas", - "value": "0xcf08" - } - ], - [], - [ - { - "op": "replace", - "path": "/status", - "value": "approved", - "note": "txStateManager: setting status to approved" - } - ], - [ - { - "op": "add", - "path": "/txParams/nonce", - "value": "0x3", - "note": "transactions#approveTransaction" - }, - { - "op": "add", - "path": "/nonceDetails", - "value": { - "params": { - "highestLocalNonce": 3, - "highestSuggested": 3, - "nextNetworkNonce": 3 - }, - "local": { - "name": "local", - "nonce": 3, - "details": { - "startPoint": 3, - "highest": 3 - } - }, - "network": { - "name": "network", - "nonce": 3, - "details": { - "baseCount": 3 - } - } - } - } - ], - [ - { - "op": "add", - "path": "/txParams/chainId", - "value": "0x3", - "note": "txStateManager: setting status to signed" - }, - { - "op": "replace", - "path": "/status", - "value": "signed" - } - ], - [ - { - "op": "add", - "path": "/rawTx", - "value": "0xf863038405f5e10082cf0894f45d68f31b3c9ac84ff0d07b86c59b753a60b1e3808029a0d64ed427733ef67fe788fe85d3cfe51c43cfc83d07fa4ab8af5d3bc8c8199895a02699c131cc0ffcf842b54776ac611bdd165fdb87dd3ecff1554ec8da1bf3ff39", - "note": "transactions#publishTransaction" - } - ], - [ - { - "op": "add", - "path": "/hash", - "value": "0x52f0929fc143d76f4e6255d95cebfc76b74f43726191bd4081a5ae9bd6c1fa4a", - "note": "transactions#setTxHash" - } - ], - [ - { - "op": "add", - "path": "/submittedTime", - "value": 1522379590158, - "note": "txStateManager - add submitted time stamp" - } - ], - [ - { - "op": "replace", - "path": "/status", - "value": "submitted", - "note": "txStateManager: setting status to submitted" - } - ], - [ - { - "op": "add", - "path": "/firstRetryBlockNumber", - "value": "0x2cc718", - "note": "transactions/pending-tx-tracker#event: tx:block-update" - } - ] - ], - "gasPriceSpecified": true, - "gasLimitSpecified": true, - "estimatedGas": "0xcf08", - "nonceDetails": { - "params": { - "highestLocalNonce": 3, - "highestSuggested": 3, - "nextNetworkNonce": 3 - }, - "local": { - "name": "local", - "nonce": 3, - "details": { - "startPoint": 3, - "highest": 3 - } - }, - "network": { - "name": "network", - "nonce": 3, - "details": { - "baseCount": 3 - } - } - }, - "rawTx": "0xf863038405f5e10082cf0894f45d68f31b3c9ac84ff0d07b86c59b753a60b1e3808029a0d64ed427733ef67fe788fe85d3cfe51c43cfc83d07fa4ab8af5d3bc8c8199895a02699c131cc0ffcf842b54776ac611bdd165fdb87dd3ecff1554ec8da1bf3ff39", - "hash": "0x52f0929fc143d76f4e6255d95cebfc76b74f43726191bd4081a5ae9bd6c1fa4a", - "submittedTime": 1522379590158, - "firstRetryBlockNumber": "0x2cc718" - }, - { - "id": 2699829174766090, - "time": 1522381785750, - "status": "unapproved", - "metamaskNetworkId": "1", - "loadingDefaults": false, - "txParams": { - "from": "0x5b1cbd5636d484bf1cb6927a9425db9e7dc73ce4", - "to": "0xf45d68f31b3c9ac84ff0d07b86c59b753a60b1e3", - "value": "0x0", - "gas": "0xcf08", - "gasPrice": "0x5f5e100" - }, - "history": [ - { - "id": 2699829174766090, - "time": 1522381785750, - "status": "unapproved", - "metamaskNetworkId": "1", - "loadingDefaults": true, - "txParams": { - "from": "0x5b1cbd5636d484bf1cb6927a9425db9e7dc73ce4", - "to": "0xf45d68f31b3c9ac84ff0d07b86c59b753a60b1e3", - "value": "0x0", - "gas": "0xcf08", - "gasPrice": "0x5f5e100" - } - }, - [ - { - "op": "replace", - "path": "/loadingDefaults", - "value": false - }, - { - "op": "add", - "path": "/gasPriceSpecified", - "value": true - }, - { - "op": "add", - "path": "/gasLimitSpecified", - "value": true - }, - { - "op": "add", - "path": "/estimatedGas", - "value": "0xcf08" - } - ] - ], - "gasPriceSpecified": true, - "gasLimitSpecified": true, - "estimatedGas": "0xcf08" - } - ], - "unapprovedTxs": { - "2699829174766090": { - "id": 2699829174766090, - "time": 1522381785750, - "status": "unapproved", - "metamaskNetworkId": "1", - "loadingDefaults": false, - "txParams": { - "from": "0x5b1cbd5636d484bf1cb6927a9425db9e7dc73ce4", - "to": "0xf45d68f31b3c9ac84ff0d07b86c59b753a60b1e3", - "value": "0x0", - "gas": "0xcf08", - "gasPrice": "0x5f5e100" - }, - "history": [ - { - "id": 2699829174766090, - "time": 1522381785750, - "status": "unapproved", - "metamaskNetworkId": "1", - "loadingDefaults": true, - "txParams": { - "from": "0x5b1cbd5636d484bf1cb6927a9425db9e7dc73ce4", - "to": "0xf45d68f31b3c9ac84ff0d07b86c59b753a60b1e3", - "value": "0x0", - "gas": "0xcf08", - "gasPrice": "0x5f5e100" - } - }, - [ - { - "op": "replace", - "path": "/loadingDefaults", - "value": false - }, - { - "op": "add", - "path": "/gasPriceSpecified", - "value": true - }, - { - "op": "add", - "path": "/gasLimitSpecified", - "value": true - }, - { - "op": "add", - "path": "/estimatedGas", - "value": "0xcf08" - } - ] - ], - "gasPriceSpecified": true, - "gasLimitSpecified": true, - "estimatedGas": "0xcf08" - } - }, - "unapprovedMsgs": { - "2315363930841932": { - "id": 2315363930841932, - "msgParams": { - "from":"0x5b1cbd5636d484bf1cb6927a9425db9e7dc73ce4", - "data":"0x879a053d4800c6354e76c7985a865d2922c82fb5b3f4577b2fe08b998954f2e0" - }, - "time": 1522378539686, - "status": "unapproved", - "type": "eth_sign" - } - }, - "unapprovedMsgCount": 0, - "unapprovedPersonalMsgs": {}, - "unapprovedPersonalMsgCount": 0, - "keyringTypes": [ - "Simple Key Pair", - "HD Key Tree" - ], - "keyrings": [ - { - "type": "HD Key Tree", - "accounts": [ - "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825", - "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb", - "0x2f8d4a878cfa04a6e60d46362f5644deab66572d" - ] - }, - { - "type": "Simple Key Pair", - "accounts": [ - "0xd85a4b6a394794842887b8284293d69163007bbb" - ] - } - ], - "selectedAddress": "0xd85a4b6a394794842887b8284293d69163007bbb", - "provider": { - "type": "testnet" - }, - "shapeShiftTxList": [ - {"depositAddress":"34vJ3AfmNcLiziA4VFgEVcQTwxVLD1qkke","depositType":"BTC","key":"shapeshift","response":{"status":"no_deposits","address":"34vJ3AfmNcLiziA4VFgEVcQTwxVLD1qkke"},"time":1522347459106}, - {"depositAddress":"34vJ3AfmNcLiziA4VFgEVcQTwxVLD1qkkq","depositType":"BTC","key":"shapeshift","response":{"status":"no_deposits","address":"34vJ3AfmNcLiziA4VFgEVcQTwxVLD1qkkq"},"time":1522345459106} - ], - "lostAccounts": [], - "send": {}, - "currentLocale": "en", - "preferences": { - "useNativeCurrencyAsPrimaryCurrency": true - }, - "completedUiMigration": true, - "frequentRpcListDetail": [] - }, - "appState": { - "menuOpen": false, - "currentView": { - "name": "confTx", - "detailView": null, - "context": 0 - }, - "accountDetail": { - "subview": "transactions" - }, - "modal": { - "modalState": {}, - "previousModalState": {} - }, - "sidebar": {}, - "transForward": true, - "isLoading": false, - "warning": null, - "scrollToBottom": false, - "forgottenPassword": null - }, - "identities": {}, - "send": { - "fromDropdownOpen": false, - "toDropdownOpen": false, - "errors": {}, - "warnings": {} - }, - "gas": { - "customData": { - "price": null, - "limit": "0x186a0" - }, - "basicEstimates": { - "average": 73, - "avgWait": 10.6, - "blockTime": 13.871657754010695, - "blockNum": 6655504, - "fast": 160, - "fastest": 290, - "fastestWait": 0.5, - "fastWait": 0.6, - "safeLow": 50, - "safeLowWait": 16.1, - "speed": 0.6702462692280712 - }, - "basicEstimateIsLoading": false, - "gasEstimatesLoading": false, - "basicPriceAndTimeEstimates": [], - "priceAndTimeEstimates": [ - { - "expectedTime": "1374.1168296452973076627", - "expectedWait": 99.0593088449, - "gasprice": 4.1 - }, - { - "expectedTime": "1280.88976972896682763716", - "expectedWait": 92.3386225672, - "gasprice": 4.4 - }, - { - "expectedTime": "1245.13314632680319175597", - "expectedWait": 89.7609477113, - "gasprice": 4.8 - }, - { - "expectedTime": "1227.99925007911014385881", - "expectedWait": 88.5257747744, - "gasprice": 4.9 - }, - { - "expectedTime": "965.52572720362993349654", - "expectedWait": 69.6042062402, - "gasprice": 5 - }, - { - "expectedTime": "917.466895447437420776", - "expectedWait": 66.1396721082, - "gasprice": 5.1 - }, - { - "expectedTime": "915.81694044041496090521", - "expectedWait": 66.0207277804, - "gasprice": 5.2 - }, - { - "expectedTime": "902.13145619709089691874", - "expectedWait": 65.034148924, - "gasprice": 5.3 - }, - { - "expectedTime": "890.83591122200105749896", - "expectedWait": 64.2198594443, - "gasprice": 5.4 - }, - { - "expectedTime": "879.10469542971335712248", - "expectedWait": 63.3741627006, - "gasprice": 5.5 - }, - { - "expectedTime": "876.99737395823100420974", - "expectedWait": 63.2222470818, - "gasprice": 5.6 - }, - { - "expectedTime": "865.96781957003849098957", - "expectedWait": 62.4271327138, - "gasprice": 5.7 - }, - { - "expectedTime": "865.44839472121496158482", - "expectedWait": 62.3896876688, - "gasprice": 5.8 - }, - { - "expectedTime": "802.16173170976255602161", - "expectedWait": 57.8273877524, - "gasprice": 6 - }, - { - "expectedTime": "780.79313908053047074843", - "expectedWait": 56.2869379368, - "gasprice": 6.1 - }, - { - "expectedTime": "770.04888359616469549233", - "expectedWait": 55.5123906062, - "gasprice": 6.2 - }, - { - "expectedTime": "745.01007965146736962697", - "expectedWait": 53.7073573226, - "gasprice": 6.3 - }, - { - "expectedTime": "735.19921111598501681816", - "expectedWait": 53.0000973318, - "gasprice": 6.6 - }, - { - "expectedTime": "705.68767153912619368694", - "expectedWait": 50.8726270539, - "gasprice": 6.7 - }, - { - "expectedTime": "705.26438593445239690121", - "expectedWait": 50.8421126329, - "gasprice": 6.9 - }, - { - "expectedTime": "652.51573119854865429742", - "expectedWait": 47.0394918019, - "gasprice": 7 - }, - { - "expectedTime": "635.51471669299464383162", - "expectedWait": 45.813898235, - "gasprice": 7.1 - }, - { - "expectedTime": "634.37181911960854759036", - "expectedWait": 45.7315073922, - "gasprice": 7.2 - }, - { - "expectedTime": "633.23097691113902888918", - "expectedWait": 45.6492647195, - "gasprice": 7.3 - }, - { - "expectedTime": "112.7753456245379663928", - "expectedWait": 8.1299111919, - "gasprice": 7.6 - }, - { - "expectedTime": "102.9665314468898381829", - "expectedWait": 7.4227992986, - "gasprice": 8 - }, - { - "expectedTime": "100.94784507024919649891", - "expectedWait": 7.2772733339, - "gasprice": 8.1 - }, - { - "expectedTime": "100.46445647447807351078", - "expectedWait": 7.2424261221, - "gasprice": 8.8 - }, - { - "expectedTime": "84.91686745986737853339", - "expectedWait": 6.1216091808, - "gasprice": 9 - }, - { - "expectedTime": "80.39566429296684383503", - "expectedWait": 5.7956781892, - "gasprice": 9.1 - }, - { - "expectedTime": "78.24522052614759252715", - "expectedWait": 5.6406539084, - "gasprice": 9.2 - }, - { - "expectedTime": "77.1685119880459882636", - "expectedWait": 5.5630345959, - "gasprice": 9.5 - }, - { - "expectedTime": "72.43649507646737870178", - "expectedWait": 5.2219061601, - "gasprice": 9.8 - }, - { - "expectedTime": "71.48259532351443753818", - "expectedWait": 5.1531400638, - "gasprice": 9.9 - }, - { - "expectedTime": "58.23892805162994573827", - "expectedWait": 4.1984115442, - "gasprice": 10 - }, - { - "expectedTime": "53.13065124862245917617", - "expectedWait": 3.8301587446, - "gasprice": 10.1 - }, - { - "expectedTime": "53.03510209647058751971", - "expectedWait": 3.82327066, - "gasprice": 10.3 - }, - { - "expectedTime": "49.06846157804491912403", - "expectedWait": 3.5373177776, - "gasprice": 11 - }, - { - "expectedTime": "48.30893330101818116637", - "expectedWait": 3.4825638116, - "gasprice": 11.1 - }, - { - "expectedTime": "48.25099734861818116715", - "expectedWait": 3.4783872414, - "gasprice": 11.3 - }, - { - "expectedTime": "47.64416885027272662988", - "expectedWait": 3.4346413165, - "gasprice": 11.9 - }, - { - "expectedTime": "46.76354741392085498401", - "expectedWait": 3.3711578128, - "gasprice": 12.6 - }, - { - "expectedTime": "44.99427448545882292232", - "expectedWait": 3.2436119232, - "gasprice": 13 - }, - { - "expectedTime": "44.61790554199251276697", - "expectedWait": 3.2164796979, - "gasprice": 13.1 - }, - { - "expectedTime": "42.87832690973048070488", - "expectedWait": 3.0910744534, - "gasprice": 14 - }, - { - "expectedTime": "42.21224091308663044649", - "expectedWait": 3.0430566888, - "gasprice": 14.9 - }, - { - "expectedTime": "41.15715335111336842864", - "expectedWait": 2.9669960203, - "gasprice": 15 - }, - { - "expectedTime": "40.9600723880876999821", - "expectedWait": 2.9527885646, - "gasprice": 15.1 - }, - { - "expectedTime": "38.89138450301711177472", - "expectedWait": 2.8036580193, - "gasprice": 15.8 - }, - { - "expectedTime": "37.89655640860213852611", - "expectedWait": 2.7319414219, - "gasprice": 16 - }, - { - "expectedTime": "37.35265517364705831954", - "expectedWait": 2.692731888, - "gasprice": 17.4 - }, - { - "expectedTime": "36.79447683873796741798", - "expectedWait": 2.652493126, - "gasprice": 17.8 - }, - { - "expectedTime": "36.11439350850802090309", - "expectedWait": 2.6034663015, - "gasprice": 19 - }, - { - "expectedTime": "31.32676199432192471101", - "expectedWait": 2.2583286403, - "gasprice": 20 - }, - { - "expectedTime": "30.76792490132192471855", - "expectedWait": 2.2180423888, - "gasprice": 20.1 - }, - { - "expectedTime": "29.94493658520962526441", - "expectedWait": 2.1587136243, - "gasprice": 25 - }, - { - "expectedTime": "29.53287347625561457478", - "expectedWait": 2.1290082267, - "gasprice": 29 - }, - { - "expectedTime": "29.09318627175614934008", - "expectedWait": 2.0973114236, - "gasprice": 47 - } - ], - "priceAndTimeEstimatesLastRetrieved": 1541527901281, - "errors": {} - }, - "confirmTransaction": {} -} diff --git a/development/static-server.js b/development/static-server.js new file mode 100644 index 000000000000..a209088784e2 --- /dev/null +++ b/development/static-server.js @@ -0,0 +1,83 @@ +const fs = require('fs') +const path = require('path') + +const chalk = require('chalk') +const pify = require('pify') + +const createStaticServer = require('./create-static-server') + +const fsStat = pify(fs.stat) +const DEFAULT_PORT = 9080 + +const onResponse = (request, response) => { + if (response.statusCode >= 400) { + console.log(chalk`{gray '-->'} {red ${response.statusCode}} ${request.url}`) + } else if (response.statusCode >= 200 && response.statusCode < 300) { + console.log(chalk`{gray '-->'} {green ${response.statusCode}} ${request.url}`) + } else { + console.log(chalk`{gray '-->'} {green.dim ${response.statusCode}} ${request.url}`) + } +} +const onRequest = (request, response) => { + console.log(chalk`{gray '<--'} {blue [${request.method}]} ${request.url}`) + response.on('finish', () => onResponse(request, response)) +} + +const startServer = ({ port, rootDirectory }) => { + const server = createStaticServer(rootDirectory) + + server.on('request', onRequest) + + server.listen(port, () => { + console.log(`Running at http://localhost:${port}`) + }) +} + +const parsePort = (portString) => { + const port = Number(portString) + if (!Number.isInteger(port)) { + throw new Error(`Port '${portString}' is invalid; must be an integer`) + } else if (port < 0 || port > 65535) { + throw new Error(`Port '${portString}' is out of range; must be between 0 and 65535 inclusive`) + } + return port +} + +const parseDirectoryArgument = async (pathString) => { + const resolvedPath = path.resolve(pathString) + const directoryStats = await fsStat(resolvedPath) + if (!directoryStats.isDirectory()) { + throw new Error(`Invalid path '${pathString}'; must be a directory`) + } + return resolvedPath +} + +const main = async () => { + const args = process.argv.slice(2) + + const options = { + port: process.env.port || DEFAULT_PORT, + rootDirectory: path.resolve('.'), + } + + while (args.length) { + if ((/^(--port|-p)$/u).test(args[0])) { + if (args[1] === undefined) { + throw new Error('Missing port argument') + } + options.port = parsePort(args[1]) + args.splice(0, 2) + } else { + options.rootDirectory = await parseDirectoryArgument(args[0]) + args.splice(0, 1) + } + } + + startServer(options) +} + +main() + .catch((error) => { + console.error(error) + process.exit(1) + }) diff --git a/development/test.html b/development/test.html deleted file mode 100644 index 49084c0a4058..000000000000 --- a/development/test.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - MetaMask - - - - - - -
- - - - - - diff --git a/development/tools/.jsdoc.json b/development/tools/.jsdoc.json deleted file mode 100644 index fd90bf89fe5c..000000000000 --- a/development/tools/.jsdoc.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "tags": { - "allowUnknownTags": false - }, - "source": { - "include": "app/scripts/", - "includePattern": ".js$", - "excludePattern": "(node_modules/|docs)" - }, - "plugins": [ - "plugins/markdown" - ], - "opts": { - "template": "node_modules/radgrad-jsdoc-template/", - "encoding": "utf8", - "destination": "docs/jsdocs", - "recurse": true, - "verbose": true - }, - "templates": { - "cleverLinks": false, - "monospaceLinks": false - } -} - diff --git a/development/tools/README.md b/development/tools/README.md deleted file mode 100644 index caef51fe66f7..000000000000 --- a/development/tools/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Development Tools & Configurations - -This folder contains configuration files which are used by the the different -development-tools, like e.g. JsDoc. - - -## Appveyor - - -https://www.appveyor.com/docs/build-configuration/#alternative-yaml-file-location - -Withtin the configuration, point to a weblocation of a txt config file: - -https://ci.appveyor.com/project/lazaridiscom/mm-vault/settings -https://raw.githubusercontent.com/lazaridiscom/mm-vault/master/dev/tools/appveyor.txt diff --git a/development/tools/appveyor.txt b/development/tools/appveyor.txt deleted file mode 100644 index 4ed9740792de..000000000000 --- a/development/tools/appveyor.txt +++ /dev/null @@ -1,21 +0,0 @@ -# Test against the latest version of this Node.js version -environment: - nodejs_version: "8" - -# Install scripts. (runs after repo cloning) -install: - # Get the latest stable version of Node.js or io.js - - ps: Install-Product node $env:nodejs_version - # install modules - - npm install - -# Post-install test scripts. -test_script: - # Output useful info for debugging. - - node --version - - npm --version - # run tests - - npm test - -# Don't actually build. -build: off diff --git a/development/ui-dev.js b/development/ui-dev.js deleted file mode 100644 index 70f513972c38..000000000000 --- a/development/ui-dev.js +++ /dev/null @@ -1,96 +0,0 @@ -/* UI DEV - * - * This is a utility module. - * It initializes a minimalist browserifiable project - * that contains the Metamask UI, with a mocked state. - * - * Includes a state menu for switching between different - * mocked states, along with query param support, - * so those states are preserved when live-reloading. - * - * This is a convenient way to develop on the UI - * without having to re-enter your password - * every time the plugin rebuilds. - * - * To use, run `npm run ui`. - */ - -const render = require('react-dom').render -const h = require('react-hyperscript') -const Root = require('../ui/app/pages') -const configureStore = require('./uiStore') -const states = require('./states') -const Selector = require('./selector') - -// logger -const log = require('loglevel') -window.log = log -log.setDefaultLevel(1) - -// Query String -const qs = require('qs') -const queryString = qs.parse(window.location.href.split('#')[1]) -let selectedView = queryString.view || 'first time' -updateQueryParams(selectedView) - -// CSS -const MetaMaskUiCss = require('../ui/css') -const injectCss = require('inject-css') - - -function updateQueryParams (newView) { - queryString.view = newView - const params = qs.stringify(queryString) - window.location.href = window.location.href.split('#')[0] + `#${params}` -} - -const actions = { - _setBackgroundConnection () {}, - update: function (stateName) { - selectedView = stateName - updateQueryParams(stateName) - const newState = states[selectedView] - return { - type: 'GLOBAL_FORCE_UPDATE', - value: newState, - } - }, -} - -var css = MetaMaskUiCss() -injectCss(css) - -// parse opts -var store = configureStore(states[selectedView]) - -// start app -startApp() - -function startApp () { - const body = document.body - const container = document.createElement('div') - container.id = 'test-container' - body.appendChild(container) - - render( - h('.super-dev-container', [ - - h(Selector, { actions, selectedKey: selectedView, states, store }), - - h('#app-content', { - style: { - height: '500px', - width: '360px', - boxShadow: 'grey 0px 2px 9px', - margin: '20px', - }, - }, [ - h(Root, { - store: store, - }), - ]), - - ] - ), container) -} - diff --git a/development/uiStore.js b/development/uiStore.js deleted file mode 100644 index bfec8f5e472e..000000000000 --- a/development/uiStore.js +++ /dev/null @@ -1,18 +0,0 @@ -const createStore = require('redux').createStore -const applyMiddleware = require('redux').applyMiddleware -const thunkMiddleware = require('redux-thunk').default -const createLogger = require('redux-logger').createLogger -const rootReducer = require('../ui/app/ducks') - -module.exports = configureStore - -const loggerMiddleware = createLogger() - -const createStoreWithMiddleware = applyMiddleware( - thunkMiddleware, - loggerMiddleware -)(createStore) - -function configureStore (initialState) { - return createStoreWithMiddleware(rootReducer, initialState) -} diff --git a/development/verify-locale-strings.js b/development/verify-locale-strings.js index a5d76a269c3a..1d4c6e3a7162 100644 --- a/development/verify-locale-strings.js +++ b/development/verify-locale-strings.js @@ -4,93 +4,246 @@ // // usage: // -// node app/scripts/verify-locale-strings.js +// node app/scripts/verify-locale-strings.js [] [--fix] [--quiet] // -// will check the given locale against the strings in english +// This script will validate that locales have no unused messages. It will check +// the English locale against string literals found under `ui/`, and it will check +// other locales by comparing them to the English locale. +// +// A report will be printed to the console detailing any unused locales, and also +// any missing messages in the non-English locales. +// +// The if the optional '--fix' parameter is given, locales will be automatically +// updated to remove any unused messages. +// +// The optional '--quiet' parameter reduces the verbosity of the output, printing +// just a single summary of results for each locale verified // // ////////////////////////////////////////////////////////////////////////////// const fs = require('fs') const path = require('path') +const { promisify } = require('util') +const log = require('loglevel') +const matchAll = require('string.prototype.matchall').getPolyfill() const localeIndex = require('../app/_locales/index.json') -console.log('Locale Verification') - -const specifiedLocale = process.argv[2] -if (specifiedLocale) { - console.log(`Verifying selected locale "${specifiedLocale}":\n\n`) - const locale = localeIndex.find(localeMeta => localeMeta.code === specifiedLocale) - verifyLocale(locale) -} else { - console.log('Verifying all locales:\n\n') - localeIndex.forEach(localeMeta => { - verifyLocale({ localeMeta }) - console.log('\n') - }) +const readdir = promisify(fs.readdir) +const readFile = promisify(fs.readFile) +const writeFile = promisify(fs.writeFile) + +log.setDefaultLevel('info') + +let fix = false +let specifiedLocale +for (const arg of process.argv.slice(2)) { + if (arg === '--fix') { + fix = true + } else if (arg === '--quiet') { + log.setLevel('error') + } else { + specifiedLocale = arg + } +} + +main() + .catch((error) => { + log.error(error) + process.exit(1) + }) + +async function main () { + if (specifiedLocale) { + log.info(`Verifying selected locale "${specifiedLocale}":\n`) + const locale = localeIndex.find((localeMeta) => localeMeta.code === specifiedLocale) + const failed = locale.code === 'en' ? + await verifyEnglishLocale() : + await verifyLocale(locale) + if (failed) { + process.exit(1) + } + } else { + log.info('Verifying all locales:\n') + let failed = await verifyEnglishLocale(fix) + const localeCodes = localeIndex + .filter((localeMeta) => localeMeta.code !== 'en') + .map((localeMeta) => localeMeta.code) + + for (const code of localeCodes) { + log.info() // Separate each locale report by a newline when not in '--quiet' mode + const localeFailed = await verifyLocale(code, fix) + failed = failed || localeFailed + } + + if (failed) { + process.exit(1) + } + } +} + +function getLocalePath (code) { + return path.resolve(__dirname, '..', 'app', '_locales', code, 'messages.json') +} + +async function getLocale (code) { + try { + const localeFilePath = getLocalePath(code) + const fileContents = await readFile(localeFilePath, 'utf8') + return JSON.parse(fileContents) + } catch (e) { + if (e.code === 'ENOENT') { + log.error('Locale file not found') + } else { + log.error(`Error opening your locale ("${code}") file: `, e) + } + process.exit(1) + return undefined + } +} + +async function writeLocale (code, locale) { + try { + const localeFilePath = getLocalePath(code) + return writeFile(localeFilePath, `${JSON.stringify(locale, null, 2)}\n`, 'utf8') + } catch (e) { + if (e.code === 'ENOENT') { + log.error('Locale file not found') + } else { + log.error(`Error writing your locale ("${code}") file: `, e) + } + process.exit(1) + return undefined + } +} + +async function verifyLocale (code) { + const englishLocale = await getLocale('en') + const targetLocale = await getLocale(code) + + const extraItems = compareLocalesForMissingItems({ base: targetLocale, subject: englishLocale }) + const missingItems = compareLocalesForMissingItems({ base: englishLocale, subject: targetLocale }) + + const englishEntryCount = Object.keys(englishLocale).length + const coveragePercent = 100 * (englishEntryCount - missingItems.length) / englishEntryCount + + if (extraItems.length) { + console.log(`**${code}**: ${extraItems.length} unused messages`) + log.info('Extra items that should not be localized:') + extraItems.forEach(function (key) { + log.info(` - [ ] ${key}`) + }) + } else { + log.info(`**${code}**: ${extraItems.length} unused messages`) + } + + log.info(`${coveragePercent.toFixed(2)}% coverage`) + if (missingItems.length) { + log.info(`Missing items not present in localized file:`) + missingItems.forEach(function (key) { + log.info(` - [ ] ${key}`) + }) + } + + if (!extraItems.length && !missingItems.length) { + log.info('Full coverage : )') + } + + if (extraItems.length > 0) { + if (fix) { + const newLocale = { ...targetLocale } + for (const item of extraItems) { + delete newLocale[item] + } + await writeLocale(code, newLocale) + } + return true + } + + return false } +async function verifyEnglishLocale () { + const englishLocale = await getLocale('en') + const javascriptFiles = await findJavascriptFiles(path.resolve(__dirname, '..', 'ui')) + + // match "t(`...`)" because constructing message keys from template strings + // prevents this script from finding the messages, and then inappropriately + // deletes them + const templateStringRegex = /\bt\(`.*`\)/ug + const templateUsage = [] + + // match the keys from the locale file + const keyRegex = /'(\w+)'|"(\w+)"/ug + const usedMessages = new Set() + for await (const fileContents of getFileContents(javascriptFiles)) { + for (const match of matchAll.call(fileContents, keyRegex)) { + usedMessages.add(match[1] || match[2]) + } + + const templateMatches = fileContents.match(templateStringRegex) + if (templateMatches) { + // concat doesn't work here for some reason + templateMatches.forEach((match) => templateUsage.push(match)) + } + } + + // never consider these messages as unused + const messageExceptions = ['appName', 'appDescription'] + + const englishMessages = Object.keys(englishLocale) + const unusedMessages = englishMessages + .filter((message) => !messageExceptions.includes(message) && !usedMessages.has(message)) + + if (unusedMessages.length) { + console.log(`**en**: ${unusedMessages.length} unused messages`) + log.info(`Messages not present in UI:`) + unusedMessages.forEach(function (key) { + log.info(` - [ ] ${key}`) + }) + } + + if (templateUsage.length) { + log.info(`Forbidden use of template strings in 't' function:`) + templateUsage.forEach(function (occurrence) { + log.info(` - ${occurrence}`) + }) + } + + if (!unusedMessages.length && !templateUsage.length) { + log.info('Full coverage : )') + return false // failed === false + } + + if (unusedMessages.length > 0 && fix) { + const newLocale = { ...englishLocale } + for (const key of unusedMessages) { + delete newLocale[key] + } + await writeLocale('en', newLocale) + } + + return true // failed === true +} + +async function findJavascriptFiles (rootDir) { + const javascriptFiles = [] + const contents = await readdir(rootDir, { withFileTypes: true }) + for (const file of contents) { + if (file.isDirectory()) { + javascriptFiles.push(...(await findJavascriptFiles(path.join(rootDir, file.name)))) + } else if (file.isFile() && file.name.endsWith('.js')) { + javascriptFiles.push(path.join(rootDir, file.name)) + } + } + return javascriptFiles +} -function verifyLocale ({ localeMeta }) { - const localeCode = localeMeta.code - const localeName = localeMeta.name - let targetLocale, englishLocale - try { - const localeFilePath = path.join(process.cwd(), 'app', '_locales', localeCode, 'messages.json') - targetLocale = JSON.parse(fs.readFileSync(localeFilePath, 'utf8')) - } catch (e) { - if (e.code === 'ENOENT') { - console.log('Locale file not found') - } else { - console.log(`Error opening your locale ("${localeCode}") file: `, e) - } - process.exit(1) - } - - try { - const englishFilePath = path.join(process.cwd(), 'app', '_locales', 'en', 'messages.json') - englishLocale = JSON.parse(fs.readFileSync(englishFilePath, 'utf8')) - } catch (e) { - if (e.code === 'ENOENT') { - console.log('English File not found') - } else { - console.log('Error opening english locale file: ', e) - } - process.exit(1) - } - - // console.log(' verifying whether all your locale ("${localeCode}") strings are contained in the english one') - const extraItems = compareLocalesForMissingItems({ base: targetLocale, subject: englishLocale }) - // console.log('\n verifying whether your locale ("${localeCode}") contains all english strings') - const missingItems = compareLocalesForMissingItems({ base: englishLocale, subject: targetLocale }) - - const englishEntryCount = Object.keys(englishLocale).length - const coveragePercent = 100 * (englishEntryCount - missingItems.length) / englishEntryCount - - console.log(`Status of **${localeName} (${localeCode})** ${coveragePercent.toFixed(2)}% coverage:`) - - if (extraItems.length) { - console.log('\nMissing from english locale:') - extraItems.forEach(function (key) { - console.log(` - [ ] ${key}`) - }) - } else { - // console.log(` all ${counter} strings declared in your locale ("${localeCode}") were found in the english one`) - } - - if (missingItems.length) { - console.log(`\nMissing:`) - missingItems.forEach(function (key) { - console.log(` - [ ] ${key}`) - }) - } else { - // console.log(` all ${counter} english strings were found in your locale ("${localeCode}")!`) - } - - if (!extraItems.length && !missingItems.length) { - console.log('Full coverage : )') - } +async function * getFileContents (filenames) { + for (const filename of filenames) { + yield readFile(filename, 'utf8') + } } function compareLocalesForMissingItems ({ base, subject }) { - return Object.keys(base).filter((key) => !subject[key]) + return Object.keys(base).filter((key) => !subject[key]) } diff --git a/development/version-bump.js b/development/version-bump.js deleted file mode 100644 index 66b6baffeed5..000000000000 --- a/development/version-bump.js +++ /dev/null @@ -1,48 +0,0 @@ -const clone = require('clone') - -async function versionBump (bumpType, changelog, oldManifest) { - const manifest = clone(oldManifest) - const newVersion = newVersionFrom(manifest, bumpType) - - manifest.version = newVersion - const date = (new Date()).toDateString() - - const logHeader = `\n## ${newVersion} ${date}` - const logLines = changelog.split('\n') - for (let i = 0; i < logLines.length; i++) { - if (logLines[i].includes('Current Develop Branch')) { - logLines.splice(i + 1, 0, logHeader) - break - } - } - - return { - version: newVersion, - manifest: manifest, - changelog: logLines.join('\n'), - } -} - -function newVersionFrom (manifest, bumpType) { - const string = manifest.version - const segments = string.split('.').map((str) => parseInt(str)) - - switch (bumpType) { - case 'major': - segments[0] += 1 - segments[1] = 0 - segments[2] = 0 - break - case 'minor': - segments[1] += 1 - segments[2] = 0 - break - case 'patch': - segments[2] += 1 - break - } - - return segments.map(String).join('.') -} - -module.exports = versionBump diff --git a/docs/README.md b/docs/README.md index 3c9bc0b4aa9a..6c54c98cf66d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -15,7 +15,6 @@ To learn how to develop MetaMask-compatible applications, visit our [Developer D - [Publishing Guide](./publishing.md) - [How to live reload on local dependency changes](./developing-on-deps.md) - [How to add new networks to the Provider Menu](./adding-new-networks.md) -- [How to manage notices that appear when the app starts up](./notices.md) - [How to port MetaMask to a new platform](./porting_to_new_environment.md) - [How to generate a visualization of this repository's development](./development-visualization.md) - [How to add a feature behind a secret feature flag](./secret-preferences.md) diff --git a/docs/add-to-chrome.md b/docs/add-to-chrome.md index 9c321a1a6a98..82c1afed3c2c 100644 --- a/docs/add-to-chrome.md +++ b/docs/add-to-chrome.md @@ -1,5 +1,7 @@ ## Add Custom Build to Chrome +![Load dev build](./load-dev-build-chrome.gif) + * Open `Settings` > `Extensions`. * Check "Developer mode". * Alternatively, use the URL `chrome://extensions/` in your address bar diff --git a/docs/add-to-firefox.md b/docs/add-to-firefox.md index 593d06170482..8eff282220d1 100644 --- a/docs/add-to-firefox.md +++ b/docs/add-to-firefox.md @@ -10,5 +10,5 @@ You can optionally enable debugging, and click `Debug`, for a console window tha If you have problems debugging, try connecting to the IRC channel `#webextensions` on `irc.mozilla.org`. -For longer questions, use the StackOverfow tag `firefox-addons`. +For longer questions, use the StackOverflow tag `firefox-addons`. diff --git a/docs/adding-new-networks.md b/docs/adding-new-networks.md deleted file mode 100644 index 40925f135054..000000000000 --- a/docs/adding-new-networks.md +++ /dev/null @@ -1,24 +0,0 @@ -## Adding Custom Networks - -To add another network to our dropdown menu, make sure the following files are adjusted properly: - -``` -app/scripts/config.js -app/scripts/lib/buy-eth-url.js -ui/app/index.js -ui/app/components/buy-button-subview.js -ui/app/components/drop-menu-item.js -ui/app/components/network.js -ui/app/components/transaction-list-item.js -ui/app/config.js -ui/app/css/lib.css -ui/lib/account-link.js -ui/lib/explorer-link.js -``` - -You will need: -+ The network ID -+ An RPC Endpoint url -+ An explorer link -+ CSS for the display icon - diff --git a/docs/architecture.png b/docs/architecture.png index 2a5924827a3f..d173c651a389 100644 Binary files a/docs/architecture.png and b/docs/architecture.png differ diff --git a/docs/bumping_version.md b/docs/bumping_version.md deleted file mode 100644 index df38369a2f2b..000000000000 --- a/docs/bumping_version.md +++ /dev/null @@ -1,33 +0,0 @@ -# How to Bump MetaMask's Version Automatically - -``` -npm run version:bump patch -``` - -MetaMask publishes using a loose [semver](https://semver.org/) interpretation. We divide the three segments of our version into three types of version bump: - -## Major - -Means a breaking change, either an API removed, or a major user expectation changed. - -## Minor - -Means a new API or new user feature. - -## Patch - -Means a fix for a bug, or correcting something that should have been assumed to work a different way. - -# Bumping the version - -`npm run version:bump $BUMP_TYPE` where `$BUMP_TYPE` is one of `major`, `minor`, or `patch`. - -This will increment the version in the `app/manifest.json` and `CHANGELOG.md` files according to our current protocol, where the manifest's version is updated, and any line items currently under the changelog's "master" section are now under the new dated version section. - -# Modifying the bump script - -The script that is executed lives [here](../development/run-version-bump.js). -The main functions all live [here](../development/version-bump.js). -The test for this behavior is at `test/unit/development/version-bump-test.js`. - - diff --git a/docs/components/account-menu.md b/docs/components/account-menu.md new file mode 100644 index 000000000000..464616b753ec --- /dev/null +++ b/docs/components/account-menu.md @@ -0,0 +1,20 @@ +# Account Menu + +The account menu is the popup menu which contains options such as: + - Logging out + - Switching accounts + - Creating a new account + - Importing an account + - Connecting a HW wallet + - Looking up info & help + - Adjusting settings + + It can be seen below where it has been outlined with a red box + + ![Screenshot of account menu](https://i.imgur.com/xpkfIuR.png) + + Above screenshot showing the menu bar in MetaMask 6.7.1 + + + + diff --git a/docs/creating-metrics-events.md b/docs/creating-metrics-events.md index 7e7f2d77d104..26fd8a6bb7d1 100644 --- a/docs/creating-metrics-events.md +++ b/docs/creating-metrics-events.md @@ -39,6 +39,7 @@ All metrics events send the following data when called: - accountType - numberOfTokens - numberOfAccounts +- version These are added to the metrics event via the metametrics provider. diff --git a/docs/developing-on-deps.md b/docs/developing-on-deps.md deleted file mode 100644 index e2e07cb4e855..000000000000 --- a/docs/developing-on-deps.md +++ /dev/null @@ -1,9 +0,0 @@ -### Developing on Dependencies - -To enjoy the live-reloading that `gulp dev` offers while working on the dependencies: - - 1. Clone the dependency locally. - 2. `npm install` in its folder. - 3. Run `npm link` in its folder. - 4. Run `npm link $DEP_NAME` in this project folder. - 5. Next time you `npm start` it will watch the dependency for changes as well! diff --git a/docs/development-visualization.md b/docs/development-visualization.md deleted file mode 100644 index 95847300d406..000000000000 --- a/docs/development-visualization.md +++ /dev/null @@ -1,35 +0,0 @@ -### Generate Development Visualization - -This will generate a video of the repo commit history. - -Install preqs: -``` -brew install gource -brew install ffmpeg -``` - -From the repo dir, pipe `gource` into `ffmpeg`: -``` -gource \ - --seconds-per-day .1 \ - --user-scale 1.5 \ - --default-user-image "./images/icon-512.png" \ - --viewport 1280x720 \ - --auto-skip-seconds .1 \ - --multi-sampling \ - --stop-at-end \ - --highlight-users \ - --hide mouse,progress \ - --file-idle-time 0 \ - --max-files 0 \ - --background-colour 000000 \ - --font-size 18 \ - --date-format "%b %d, %Y" \ - --highlight-dirs \ - --user-friction 0.1 \ - --title "MetaMask Development History" \ - --output-ppm-stream - \ - --output-framerate 30 \ - | ffmpeg -y -r 30 -f image2pipe -vcodec ppm -i - -b 65536K metamask-dev-history.mp4 -``` - diff --git a/docs/form_persisting_architecture.md b/docs/form_persisting_architecture.md deleted file mode 100644 index e2d766cccb88..000000000000 --- a/docs/form_persisting_architecture.md +++ /dev/null @@ -1,28 +0,0 @@ -# Form Persisting Architecture - -Since: - - The popup is torn down completely on every click outside of it. - - We have forms with multiple fields (like passwords & seed phrases) that might encourage a user to leave our panel to refer to a password manager. - - We cause user friction when we lose the contents of certain forms. - - This calls for an architecture of a form component that can completely persist its values to LocalStorage on every relevant change, and restore those values on reopening. - - To achieve this, we have defined a class, a subclass of `React.Component`, called `PersistentForm`, and it's stored at `ui/lib/persistent-form.js`. - -To use this class, simply take your form component (the component that renders `input`, `select`, or `textarea` elements), and make it subclass from `PersistentForm` instead of `React.Component`. - -You can see an example of this in use in `ui/app/first-time/restore-vault.js`. - -Additionally, any field whose value should be persisted, should have a `persistentFormId` attribute, which needs to be assigned under a `dataset` key on the main `attributes` hash. For example: - -```javascript - return h('textarea.twelve-word-phrase.letter-spacey', { - dataset: { - persistentFormId: 'wallet-seed', - }, - }) -``` - -That's it! This field should be persisted to `localStorage` on each `keyUp`, those values should be restored on view load, and the cached values should be cleared when navigating deliberately away from the form. - diff --git a/docs/limited_site_access.md b/docs/limited_site_access.md deleted file mode 100644 index f703d5c7e25c..000000000000 --- a/docs/limited_site_access.md +++ /dev/null @@ -1,5 +0,0 @@ -# Google Chrome/Brave Limited Site Access for Extensions - -Problem: MetaMask doesn't work with limited site access enabled under Chrome's extensions. - -Solution: In addition to the site you wish to whitelist, you must add 'api.infura.io' as another domain, so the MetaMask extension is authorized to make RPC calls to Infura. diff --git a/docs/load-dev-build-chrome.gif b/docs/load-dev-build-chrome.gif new file mode 100644 index 000000000000..5b4965fe3995 Binary files /dev/null and b/docs/load-dev-build-chrome.gif differ diff --git a/docs/multi_vault_planning.md b/docs/multi_vault_planning.md deleted file mode 100644 index fdde2bc50d3e..000000000000 --- a/docs/multi_vault_planning.md +++ /dev/null @@ -1,188 +0,0 @@ -https://hackmd.io/JwIwDMDGKQZgtAFgKZjEgbARhPAhgKxZbwAcA7LAWOQCaKEgFA==?edit - -Subscribablez(initState) - .subscribe() - .emitUpdate(newState) - //.getState() - - -var initState = fromDisk() -ReduxStore(reducer, initState) -.reduce(action) -> .emitUpdate() - -ReduxStore.subscribe(toDisk) - - -### KeyChainManager / idStore 2.0 (maybe just in MetaMaskController) - keychains: [] - getAllAccounts(cb) - getAllKeychainViewStates(cb) -> returns [ KeyChainViewState] - -#### Old idStore external methods, for feature parity: - -- init(configManager) -- setStore(ethStore) -- getState() -- getSelectedAddres() -- setSelectedAddress() -- createNewVault() -- recoverFromSeed() -- submitPassword() -- approveTransaction() -- cancelTransaction() -- addUnconfirmedMessage(msgParams, cb) -- signMessage() -- cancelMessage() -- setLocked() -- clearSeedWordCache() -- exportAccount() -- revealAccount() -- saveAccountLabel() -- tryPassword() -- recoverSeed() -- getNetwork() - -##### Of those methods - -Where they should end up: - -##### MetaMaskController - -- getNetwork() - -##### KeyChainManager - -- init(configManager) -- setStore(ethStore) -- getState() // Deprecate for unidirectional flow -- on('update', cb) -- createNewVault(password) -- getSelectedAddres() -- setSelectedAddress() -- submitPassword() -- tryPassword() -- approveTransaction() -- cancelTransaction() -- signMessage() -- cancelMessage() -- setLocked() -- exportAccount() - -##### Bip44 KeyChain - -- getState() // Deprecate for unidirectional flow -- on('update', cb) - -If we adopt a ReactStore style unidirectional action dispatching data flow, these methods will be unified under a `dispatch` method, and rather than having a cb will emit an update to the UI: - -- createNewKeyChain(entropy) -- recoverFromSeed() -- approveTransaction() -- signMessage() -- clearSeedWordCache() -- exportAccount() -- revealAccount() -- saveAccountLabel() -- recoverSeed() - -Additional methods, new to this: -- serialize() - - Returns pojo with optional `secret` key whose contents will be encrypted with the users' password and salt when written to disk. - - The isolation of secrets is to preserve performance when decrypting user data. -- deserialize(pojo) - -### KeyChain (ReduxStore?) - // attributes - @name - - signTx(txParams, cb) - signMsg(msg, cb) - - getAddressList(cb) - - getViewState(cb) -> returns KeyChainViewState - - serialize(cb) -> obj - deserialize(obj) - - dispatch({ type: , value: }) - - -### KeyChainViewState - // The serialized, renderable keychain data - accountList: [], - typeName: 'uPort', - iconAddress: 'uport.gif', - internal: {} // Subclass-defined metadata - -### KeyChainReactComponent - // takes a KeyChainViewState - - // Subclasses of this: - - KeyChainListItemComponent - - KeyChainInitComponent - Maybe part of the List Item - - KeyChainAccountHeaderComponent - - KeyChainConfirmationComponent - // Account list item, tx confirmation extra data (like a QR code), - // Maybe an options screen, init screen, - - how to send actions? - emitAction(keychains..didInit) - - -gimmeRemoteKeychain((err, remoteKeychain)=> - -) - - - - - -KeyChainReactComponent({ - keychain -}) - -Keychain: - methods:{}, - cachedAccountList: [], - name: '', - - -CoinbaseKeychain - getAccountList - - -CoinbaseKeychainComponent - isLoading = true - keychain.getAccountList(()=>{ - isLoading=false - accountList=accounts - }) - - - - - -KeyChainViewState { - attributes: { - //mandatory: - accountList: [], - typeName: 'uPort', - iconAddress: 'uport.gif', - - internal: { - // keychain-specific metadata - proxyAddresses: { - 0xReal: '0xProxy' - } - }, - }, - methods: { - // arbitrary, internal - } -} - -## A note on the security of arbitrary action dispatchers - -Since keychains will be dispatching actions that are then passed through the background process to be routed, we should not trust or require them to include their own keychain ID as a prefix to their action, but we should tack it on ourselves, so that no action dispatched by a KeyChainComponent ever reaches any KeyChain other than its own. - diff --git a/docs/notices.md b/docs/notices.md deleted file mode 100644 index 826e6e84ead1..000000000000 --- a/docs/notices.md +++ /dev/null @@ -1,15 +0,0 @@ -## Generating Notices - -To add a notice: -``` -npm run generateNotice -``` -Enter the body of your notice into the text editor that pops up, without including the body. Be sure to save the file before closing the window! -Afterwards, enter the title of the notice in the command line and press enter. Afterwards, add and commit the new changes made. - -To delete a notice: -``` -npm run deleteNotice -``` -A list of active notices will pop up. Enter the corresponding id in the command line prompt and add and commit the new changes afterwards. - diff --git a/docs/porting_to_new_environment.md b/docs/porting_to_new_environment.md deleted file mode 100644 index f7a2ac8b7db4..000000000000 --- a/docs/porting_to_new_environment.md +++ /dev/null @@ -1,101 +0,0 @@ -# Guide to Porting MetaMask to a New Environment - -MetaMask has been under continuous development for nearly two years now, and we’ve gradually discovered some useful abstractions that have allowed us to grow more easily. A couple of those layers together allow MetaMask to be ported to new environments and contexts increasingly easily (although it still could be easier, and please let us know if you get stuck!) - -Before we get started, it's worth becoming familiar with our basic architecture: - -![metamask-architecture-diagram](./architecture.png) - -The `metamask-background` describes the file at `app/scripts/background.js`, which is the web extension singleton. This context instantiates an instance of the `MetaMask Controller`, which represents the user's accounts, a connection to the blockchain, and the interaction with new Dapps. - -When a new site is visited, the WebExtension creates a new `ContentScript` in that page's context, which can be seen at `app/scripts/contentscript.js`. This script represents a per-page setup process, which creates the per-page `web3` api, connects it to the background script via the Port API (wrapped in a [stream abstraction](https://github.com/substack/stream-handbook)), and injected into the DOM before anything loads. - -The most confusing part about porting MetaMask to a new platform is the way we provide the Web3 API over a series of streams between contexts. Once you understand how we create the [MetamaskInpageProvider](https://github.com/MetaMask/metamask-inpage-provider/blob/master/index.js) in the [inpage.js script](../app/scripts/inpage.js), you will be able to understand how the [port-stream](../app/scripts/lib/port-stream.js) is just a thin wrapper around the [postMessage API](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage), and a similar stream API can be wrapped around any communication channel to communicate with the `MetaMaskController` via its `setupUntrustedCommunication(stream, domain)` method. - -### The MetaMask Controller - -The core functionality of MetaMask all lives in what we call [The MetaMask Controller](https://github.com/MetaMask/metamask-extension/blob/master/app/scripts/metamask-controller.js). Our goal for this file is for it to eventually be its own javascript module that can be imported into any JS-compatible context, allowing it to fully manage an app's relationship to Ethereum. - -#### Constructor - -When calling `new MetaMask(opts)`, many platform-specific options are configured. The keys on `opts` are as follows: - -- initState: The last emitted state, used for restoring persistent state between sessions. -- platform: The `platform` object defines a variety of platform-specific functions, including opening the confirmation view, and opening websites. -- encryptor - An object that provides access to the desired encryption methods. - -##### Encryptor - -An object that provides two simple methods, which can encrypt in any format you prefer. This parameter is optional, and will default to the browser-native WebCrypto API. - -- encrypt(password, object) - returns a Promise of a string that is ready for storage. -- decrypt(password, encryptedString) - Accepts the encrypted output of `encrypt` and returns a Promise of a restored `object` as it was encrypted. - - -##### Platform Options - -The `platform` object has a variety of options: - -- reload (function) - Will be called when MetaMask would like to reload its own context. -- openWindow ({ url }) - Will be called when MetaMask would like to open a web page. It will be passed a single `options` object with a `url` key, with a string value. -- getVersion() - Should return the current MetaMask version, as described in the current `CHANGELOG.md` or `app/manifest.json`. - -#### [metamask.getState()](https://github.com/MetaMask/metamask-extension/blob/master/app/scripts/metamask-controller.js#L241) - -This method returns a javascript object representing the current MetaMask state. This includes things like known accounts, sent transactions, current exchange rates, and more! The controller is also an event emitter, so you can subscribe to state updates via `metamask.on('update', handleStateUpdate)`. State examples available [here](https://github.com/MetaMask/metamask-extension/tree/master/development/states) under the `metamask` key. (Warning: some are outdated) - -#### [metamask.getApi()](https://github.com/MetaMask/metamask-extension/blob/master/app/scripts/metamask-controller.js#L274-L335) - -Returns a JavaScript object filled with callback functions representing every operation our user interface ever performs. Everything from creating new accounts, changing the current network, to sending a transaction, is provided via these API methods. We export this external API on an object because it allows us to easily expose this API over a port using [dnode](https://www.npmjs.com/package/dnode), which is how our WebExtension's UI works! - -### The UI - -The MetaMask UI is essentially just a website that can be configured by passing it the API and state subscriptions from above. Anyone could make a UI that consumes these, effectively reskinning MetaMask. - -You can see this in action in our file [ui/index.js](https://github.com/MetaMask/metamask-extension/blob/master/ui/index.js). There you can see an argument being passed in named `accountManager`, which is essentially a MetaMask controller (forgive its really outdated parameter name!). With access to that object, the UI is able to initialize a whole React/Redux app that relies on this API for its account/blockchain-related/persistent states. - -## Putting it Together - -As an example, a WebExtension is always defined by a `manifest.json` file. [In ours](https://github.com/MetaMask/metamask-extension/blob/master/app/manifest.json#L31), you can see that [background.js](https://github.com/MetaMask/metamask-extension/blob/master/app/scripts/background.js) is defined as a script to run in the background, and this is the file that we use to initialize the MetaMask controller. - -In that file, there's a lot going on, so it's maybe worth focusing on our MetaMask controller constructor to start. It looks something like this: - -```javascript -const controller = new MetamaskController({ - // User confirmation callbacks: - showUnconfirmedMessage: triggerUi, - unlockAccountMessage: triggerUi, - showUnapprovedTx: triggerUi, - // initial state - initState, - // platform specific api - platform, -}) -``` -Since `background.js` is essentially the Extension setup file, we can see it doing all the things specific to the extension platform: -- Defining how to open the UI for new messages, transactions, and even requests to unlock (reveal to the site) their account. -- Provide the instance's initial state, leaving MetaMask persistence to the platform. -- Providing a `platform` object. This is becoming our catch-all adapter for platforms to define a few other platform-variant features we require, like opening a web link. (Soon we will be moving encryption out here too, since our browser-encryption isn't portable enough!) - -## Ports, streams, and Web3! - -Everything so far has been enough to create a MetaMask wallet on virtually any platform that runs JS, but MetaMask's most unique feature isn't being a wallet, it's providing an Ethereum-enabled JavaScript context to websites. - -MetaMask has two kinds of [duplex stream APIs](https://github.com/substack/stream-handbook#duplex) that it exposes: -- [metamask.setupTrustedCommunication(connectionStream, originDomain)](https://github.com/MetaMask/metamask-extension/blob/master/app/scripts/metamask-controller.js#L352) - This stream is used to connect the user interface over a remote port, and may not be necessary for contexts where the interface and the metamask-controller share a process. -- [metamask.setupUntrustedCommunication(connectionStream, originDomain)](https://github.com/MetaMask/metamask-extension/blob/master/app/scripts/metamask-controller.js#L337) - This method is used to connect a new web site's web3 API to MetaMask's blockchain connection. Additionally, the `originDomain` is used to block detected phishing sites. - -### Web3 as a Stream - -If you are making a MetaMask-powered browser for a new platform, one of the trickiest tasks will be injecting the Web3 API into websites that are visited. On WebExtensions, we actually have to pipe data through a total of three JS contexts just to let sites talk to our background process (site -> contentscript -> background). - -To see how we do that, you can refer to the [inpage script](https://github.com/MetaMask/metamask-extension/blob/master/app/scripts/inpage.js) that we inject into every website. There you can see it creates a multiplex stream to the background, and uses it to initialize what we call the [MetamaskInpageProvider](https://github.com/MetaMask/metamask-inpage-provider/blob/master/index.js), which you can see stubs a few methods out, but mostly just passes calls to `sendAsync` through the stream it's passed! That's really all the magic that's needed to create a web3-like API in a remote context, once you have a stream to MetaMask available. - -In `inpage.js` you can see we create a `PortStream`, that's just a class we use to wrap WebExtension ports as streams, so we can reuse our favorite stream abstraction over the more irregular API surface of the WebExtension. In a new platform, you will probably need to construct this stream differently. The key is that you need to construct a stream that talks from the site context to the background. Once you have that set up, it works like magic! - -If streams seem new and confusing to you, that's ok, they can seem strange at first. To help learn them, we highly recommend reading Substack's [Stream Handbook](https://github.com/substack/stream-handbook), or going through NodeSchool's interactive command-line class [Stream Adventure](https://github.com/workshopper/stream-adventure), also maintained by Substack. - -## Conclusion - -I hope this has been helpful to you! If you have any other questions, or points you think need clarification in this guide, please [open an issue on our GitHub](https://github.com/MetaMask/metamask-plugin/issues/new)! - diff --git a/docs/publishing.md b/docs/publishing.md index 8d50e6869a8d..17192ee8a59c 100644 --- a/docs/publishing.md +++ b/docs/publishing.md @@ -20,9 +20,9 @@ We try to ensure certain criteria are met before deploying: ## Incrementing Version & Changelog -Version can be automatically incremented [using our bump script](./bumping-version.md). +Version can be automatically incremented by creating a branch with the name `Version-vX.Y.Z`, where `X`, `Y`, and `Z` are numbers. Branches should be created off of the main branch. [Branches can be created on GitHub.](https://help.github.com/en/articles/creating-and-deleting-branches-within-your-repository) -npm run version:bump `$BUMP_TYPE` where `$BUMP_TYPE` is one of `major`, `minor`, or `patch`. +Once a version branch has been created, a build on CircleCI will create a Pull Request for the release with the app manifest and changelog versions bumped. ## Preparing for Sensitive Changes @@ -41,7 +41,7 @@ With each pull request, the @MetaMaskBot will comment with a build of that new p 3. Publish to [firefox addon marketplace](http://addons.mozilla.org/en-us/firefox/addon/ether-metamask). 4. Publish to [Opera store](https://addons.opera.com/en/extensions/details/metamask/). 5. Post on [Github releases](https://github.com/MetaMask/metamask-extension/releases) page. -6. Run the `npm run announce` script, and post that announcement in our public places. +6. Run the `yarn announce` script, and post that announcement in our public places. ## Hotfix Differences diff --git a/docs/send-screen-QA-checklist.md b/docs/send-screen-QA-checklist.md deleted file mode 100644 index 52167b50baf9..000000000000 --- a/docs/send-screen-QA-checklist.md +++ /dev/null @@ -1,96 +0,0 @@ -# Send screen QA checklist: - -This checklist can be to guide QA of the send screen. It can also be used to guide e2e tests for the send screen. - -Once all of these are QA verified on master, resolutions to any bugs related to the send screen should include and update to this list. - -Additional features or functionality on the send screen should include an update to this list. - -## Send Eth mode - - [ ] **Header** _It should:_ - - [ ] have title "Send ETH" - - [ ] have sub title "Only send ETH to an Ethereum address." - - [ ] return user to main screen when top right X is clicked - - [ ] **From row** _It should:_ - - [ ] show the currently selected account by default - - [ ] show a dropdown with all of the users accounts - - [ ] contain the following info for each account: identicon, account name, balance in ETH, balance in current currency - - [ ] change the account selected in the dropdown (but not the app-wide selected account) when one in the dropdown is clicked - - [ ] close the dropdown, without changing the dropdown selected account, when the dropdown is open and then a click happens outside it - - [ ] **To row** _It should:_ - - [ ] Show a placeholder with the text 'Recipient Address' by default - - [ ] Show, when clicked, a dropdown list of all 'to accounts': the users accounts, plus any other accounts they have previously sent to - - [ ] Show account address, and account name if it exists, of each item in the dropdown list - - [ ] Show a dropdown list of all to accounts (see above) whose address matches an address currently being typed in - - [ ] Set the input text to the address of an account clicked in the dropdown list, and also hide the dropdown - - [ ] Hide the dropdown without changing what is in the input if the user clicks outside the dropdown list while it is open - - [ ] Select the text in the input (i.e. the address) if an address is displayed and then clicked - - [ ] Show a 'required' error if the dropdown is opened but no account is selected - - [ ] Show an 'invalid address' error if text is entered in the input that cannot be a valid hex address or ens address - - [ ] Support ens names. (enter dinodan.eth on mainnet) After entering the plain text address, the hex address should appear in the input with a green checkmark beside - - [ ] Should show a 'no such address' error if a non-existent ens address is entered - - [ ] **Amount row** _It should:_ - - [ ] allow user to enter any rational number >= 0 - - [ ] allow user to copy and paste into the field - - [ ] show an insufficient funds error if an amount > balance - gas fee - - [ ] display 'ETH' after the number amount. The position of 'ETH' should change as the length of the input amount text changes - - [ ] display the value of the amount of ETH in the current currency, formatted in that currency - - [ ] show a 'max' but if amount < balance - gas fee - - [ ] show no max button or error if amount === balance - gas fee - - [ ] set the amount to balance - gas fee if the 'max' button is clicked - - [ ] **Gas Fee Display row** _It should:_ - - [ ] Default to the fee given by the estimated gas price - - [ ] display the fee in ETH and the current currency - - [ ] update when changes are made using the customize gas modal - - [ ] **Cancel button** _It should:_ - - [ ] Take the user back to the main screen - - [ ] **submit button** _It should:_ - - [ ] be disabled if no recipient address is provided or if any field is in error - - [ ] sign a transaction with the info in the above form, and display the details of that transaction on the confirm screen - -## Send token mode -- [ ] **Header** _It should:_ - - [ ] have title "Send Tokens" - - [ ] have sub title "Only send [token symbol] to an Ethereum address." - - [ ] return user to main screen when top right X is clicked -- [ ] **From row** _It should:_ - - [ ] Behave the same as 'Send ETH mode' (see above) -- [ ] **To row** _It should:_ - - [ ] Behave the same as 'Send ETH mode' (see above) -- [ ] **Amount row** _It should:_ - - [ ] allow user to enter any rational number >= 0 - - [ ] allow user to copy and paste into the field - - [ ] show an 'insufficient tokens' error if an amount > token balance - - [ ] show an 'insufficient funds' error if an gas fee > eth balance - - [ ] display [token symbol] after the number amount. The position of [token symbol] should change as the length of the input amount text changes - - [ ] display the value of the amount of tokens in the current currency, formatted in that currency - - [ ] show a 'max' but if amount < token balance - - [ ] show no max button or error if amount === token balance - - [ ] set the amount to token balance if the 'max' button is clicked -- [ ] **Gas Fee Display row** _It should:_ - - [ ] Behave the same as 'Send ETH mode' (see above) -- [ ] **Cancel button** _It should:_ - - [ ] Take the user back to the main screen -- [ ] **submit button** _It should:_ - - [ ] be disabled if no recipient address is provided or if any field is in error - - [ ] sign a token transaction with the info in the above form, and display the details of that transaction on the confirm screen - -## Edit send Eth mode - - [ ] Say 'Editing transaction' in the header - - [ ] display a button to go back to the confirmation screen without applying update - - [ ] say 'update transaction' on the submit button - - [ ] update the existing transaction, instead of signing a new one, when clicking the submit button - - [ ] Otherwise, behave the same as 'Send ETH mode' (see above) - -## Edit send token mode - - [ ] Behave the same as 'Edit send Eth mode' (see above) - -## Specific cases to test - - [ ] Send eth to a hex address - - [ ] Send eth to an ENS address - - [ ] Donate to the faucet at https://faucet.metamask.io/ and edit the transaction before confirming - - [ ] Send a token that is available on the 'Add Token' screen search to a hex address - - [ ] Create a custom token at https://tokenfactory.surge.sh/ and send it to a hex address - - [ ] Send a token to an ENS address - - [ ] Create a token transaction using https://tokenfactory.surge.sh/#/, and edit the transaction before confirming - - [ ] Send each of MKR, EOS and ICON using myetherwallet, and edit the transaction before confirming diff --git a/docs/sensitive-release.md b/docs/sensitive-release.md index 288df57eb9a3..1ebae3932116 100644 --- a/docs/sensitive-release.md +++ b/docs/sensitive-release.md @@ -18,10 +18,9 @@ Simply follow the steps in [the publishing guide](./publishing.md). ### Prepare Rollback Release -1. Be on the new risky version branch. -2. Run `npm run rollback $ROLLBACK_TARGET_VERSION`. +Follow the steps in [the publishing guide](./publishing.md) with a different context: -The rollback version will now be a branch and tag on the origin. +Instead of creating a version branch off of the main branch, create a version branch off of the latest release. It is customary that this release increments the patch version number. ### Roll the normal release out diff --git a/docs/team.md b/docs/team.md deleted file mode 100644 index 72f9d3226407..000000000000 --- a/docs/team.md +++ /dev/null @@ -1,78 +0,0 @@ -# The Team - -Here is an overview of the current MetaMask team, and their primary roles and responsibilities, in the order they joined the team. - -## Core Team Members - -The core team maintains aspects of the main product (the extension) and the core libraries (the MetaMask Controller, provider-engine, etc). - -### Aaron Davis - -@kumavis -Founder / Technical Lead - -Especially in charge of connection to the blockchain. Wrote [provider-engine](https://github.com/MetaMask/provider-engine), and is currently working with @hermanjunge on our JavaScript light-client. - -### Dan Finlay - -@danfinlay -Software Engineer / Product Lead - -Focused on the deliverable, user-valuable aspects of MetaMask, including usability and documentation. Coordinates efforts between different branches of the team, and integrations with other projects. - -### Frankie Pangilinan - -@frankiebee -Software Engineer / Transaction Manager Lead - -Frankie contributes code throughout MetaMask, but has become especially specialized in the way MetaMask manages transactions. She is also the original lead of the [Mascara](https://github.com/MetaMask/mascara) project. - -### Kevin Serrano - -@Zanibas -Software Engineer / Project Management Lead - -Kevin is a software engineer, but also spends a lot of his time keeping the team's administrative operations running smoothly. - -### Thomas Huang - -@tmashuang -QA Engineer - -Thomas is the head of MetaMask Quality Assurance. He both takes the final pass of branches of code before we ship to production, and is also in charge of continuously improving our automated quality assurance process. - -### Christian Jeria - -@cjeria -User Experience Designer - -Christian is the lead of MetaMask's user experience. He is continuously designing prototypes, testing them with users, and refining them with our developers for production. - -### Paul Bouchon - -@bitpshr -Software Engineer - -The newest member of the team! Paul is currently being onboarded, and finding his niche within the team. - -## Laboratory Team Members - -These team members are working on projects that will benefit MetaMask, but are not directly working on the product itself. - -### Herman Junge - -@hermanjunge -Software Engineer - -Herman is currently leading the Mustekala project, a JavaScript, IPFS-based Ethereum light client. - -## Kyokan Team Members - -[Kyokan](http://kyokan.io/) is a consulting firm that has been working closely with the MetaMask team on the latest version of our user interface. Their team members are not members of ConsenSys LLC, but they contribute a lot to the project. - -- Daniel Tsui (@sdsui) -- Chi Kei Chan (@chikeichan) -- Dan Miller (@danjm) -- David Yoo (@yookd) -- Whymarrh Whitby (@whymarrh) - diff --git a/docs/video_script.txt b/docs/video_script.txt deleted file mode 100644 index d9e37a4e2088..000000000000 --- a/docs/video_script.txt +++ /dev/null @@ -1,34 +0,0 @@ -Hi, and welcome to MetaMask. - -Today we’re happy to share our gift to the Ethereum ecosystem. - -The MetaMask browser extension turns Google Chrome into an Ethereum browser, letting websites retrieve data from the blockchain, and letting users securely manage identities and sign transactions. - -When you start up MetaMask, you are given a seed phrase that can be used to restore all the accounts you ever create within MetaMask. - -You can switch the current account with the switch account button in the top right, and you can add more accounts at the bottom of the account list. - -Your account vault is encrypted and locally stored within your browser, meaning no account information ever touches our servers. However, with your secret phrase, you can easily restore your vault with the same accounts. - -At first glance, Metamask enables you to send ether like a normal wallet application, but Metamask's true strength lies in enabling your browser to visit Ethereum enabled websites. - -Here’s a simple Ethereum distributed app, or Ãapp, called Tokens, that lets you easily deploy your own currency. - -When you visit a Dapp like Tokens with MetaMask installed, that website has access to the Ethereum blockchain via the standard Web3 Javascript API. When it wants to write to the blockchain, it asks web3 to send the transaction, prompting MetaMask to ask for user confirmation. - -After you submit a transaction, wait for the next block for the change to be reflected on the website...and there it is! - -Now I have my own MetaMaskCoins! I can check my balance or, if I want to send some to another account, I can click the copy link on it. I check its balance, see it has none, then send it some meta-coins! - -This has been nice, but it’s all been on the Morden test net. But with Metamask, I can always switch what network I’m working on, say the main network, and I’m ready issue a token with the full security of the main Ethereum blockchain. - -MetaMask connects to these blockchains with no synchronization time because we host blockchain nodes by default. You can always point MetaMask at your own Ethereum RPC Server, and fully control your connection to the blockchain. - -And that’s how MetaMask lets ordinary websites talk to a trusted Ethereum provider, all while letting the user store and manage their own private keys. We hope this will make it easier than ever for people to get started creating and using a new wave of blockchain-enabled websites. - -If you’d like to get started with Metamask right now, go ahead and click here to get the Chrome extension. - -If you’d like to learn more about MetaMask, you can visit our website at metamask.io. - -You’re also welcome to join our slack, follow our twitter or read our source code. You can find all of those links and more at Metamask.io - diff --git a/fonts b/fonts deleted file mode 120000 index 043d139a94cd..000000000000 --- a/fonts +++ /dev/null @@ -1 +0,0 @@ -app/fonts \ No newline at end of file diff --git a/gentests.js b/gentests.js deleted file mode 100644 index a84c2079d65a..000000000000 --- a/gentests.js +++ /dev/null @@ -1,241 +0,0 @@ -const fs = require('fs') -const path = require('path') -const async = require('async') -const promisify = require('pify') - -// start(/\.selectors.js/, generateSelectorTest).catch(console.error) -// start(/\.utils.js/, generateUtilTest).catch(console.error) -startContainer(/\.container.js/, generateContainerTest).catch(console.error) - -async function getAllFileNames (dirName) { - const allNames = (await promisify(fs.readdir)(dirName)) - const fileNames = allNames.filter(name => name.match(/^.+\./)) - const dirNames = allNames.filter(name => name.match(/^[^.]+$/)) - - const fullPathDirNames = dirNames.map(d => `${dirName}/${d}`) - const subNameArrays = await promisify(async.map)(fullPathDirNames, getAllFileNames) - let subNames = [] - subNameArrays.forEach(subNameArray => { subNames = [...subNames, ...subNameArray] }) - - return [ - ...fileNames.map(name => dirName + '/' + name), - ...subNames, - ] -} - -/* -async function start (fileRegEx, testGenerator) { - const fileNames = await getAllFileNames('./ui/app') - const sFiles = fileNames.filter(name => name.match(fileRegEx)) - - let sFileMethodNames - let testFilePath - async.each(sFiles, async (sFile, cb) => { - const [, sRootPath, sPath] = sFile.match(/^(.+\/)([^/]+)$/) - sFileMethodNames = Object.keys(require(__dirname + '/' + sFile)) - - testFilePath = sPath.replace('.', '-').replace('.', '.test.') - - await promisify(fs.writeFile)( - `${__dirname}/${sRootPath}tests/${testFilePath}`, - testGenerator(sPath, sFileMethodNames), - 'utf8' - ) - }, (err) => { - console.log(err) - }) - -} -*/ - -async function startContainer (fileRegEx) { - const fileNames = await getAllFileNames('./ui/app') - const sFiles = fileNames.filter(name => name.match(fileRegEx)) - - async.each(sFiles, async (sFile) => { - console.log(`sFile`, sFile) - const [, sRootPath, sPath] = sFile.match(/^(.+\/)([^/]+)$/) - - const testFilePath = sPath.replace('.', '-').replace('.', '.test.') - - await promisify(fs.readFile)( - path.join(__dirname, sFile), - 'utf8', - async (err, result) => { - if (err) { - console.log('Error: ', err) - } else { - console.log(`result`, result.length) - const returnObjectStrings = result - .match(/return\s(\{[\s\S]+?})\n}/g) - .map(str => { - return str - .slice(0, str.length - 1) - .slice(7) - .replace(/\n/g, '') - .replace(/\s\s+/g, ' ') - - }) - const mapStateToPropsAssertionObject = returnObjectStrings[0] - .replace(/\w+:\s\w+\([\w,\s]+\),/g, str => { - const strKey = str.match(/^\w+/)[0] - return strKey + ': \'mock' + str.match(/^\w+/)[0].replace(/^./, c => c.toUpperCase()) + ':mockState\',\n' - }) - .replace(/{\s\w.+/, firstLinePair => `{\n ${firstLinePair.slice(2)}`) - .replace(/\w+:.+,/g, s => ` ${s}`) - .replace(/}/g, s => ` ${s}`) - let mapDispatchToPropsMethodNames - if (returnObjectStrings[1]) { - mapDispatchToPropsMethodNames = returnObjectStrings[1].match(/\s\w+:\s/g).map(str => str.match(/\w+/)[0]) - } - const proxyquireObject = ('{\n ' + result - .match(/import\s{[\s\S]+?}\sfrom\s.+/g) - .map(s => s.replace(/\n/g, '')) - .map((s) => { - const proxyKeys = s.match(/{.+}/)[0].match(/\w+/g) - return '\'' + s.match(/'(.+)'/)[1] + '\': { ' + (proxyKeys.length > 1 - ? '\n ' + proxyKeys.join(': () => {},\n ') + ': () => {},\n ' - : proxyKeys[0] + ': () => {},') + ' }' - }) - .join(',\n ') + '\n}') - .replace('{ connect: () => {}, },', `{ - connect: (ms, md) => { - mapStateToProps = ms - mapDispatchToProps = md - return () => ({}) - }, - },`) - // console.log(`proxyquireObject`, proxyquireObject); - // console.log(`mapStateToPropsAssertionObject`, mapStateToPropsAssertionObject); - // console.log(`mapDispatchToPropsMethodNames`, mapDispatchToPropsMethodNames); - - const containerTest = generateContainerTest(sPath, { - mapStateToPropsAssertionObject, - mapDispatchToPropsMethodNames, - proxyquireObject, - }) - // console.log(`containerTest`, `${__dirname}/${sRootPath}tests/${testFilePath}`, containerTest); - console.log('----') - console.log(`sRootPath`, sRootPath) - console.log(`testFilePath`, testFilePath) - await promisify(fs.writeFile)( - `${__dirname}/${sRootPath}tests/${testFilePath}`, - containerTest, - 'utf8' - ) - } - } - ) - }, (err) => { - console.log('123', err) - }) - -} -/* -function generateMethodList (methodArray) { - return methodArray.map(n => ' ' + n).join(',\n') + ',' -} - -function generateMethodDescribeBlock (methodName, index) { - const describeBlock = - `${index ? ' ' : ''}describe('${methodName}()', () => { - it('should', () => { - const state = {} - - assert.equal(${methodName}(state), ) - }) - })` - return describeBlock -} -*/ -function generateDispatchMethodDescribeBlock (methodName, index) { - const describeBlock = - `${index ? ' ' : ''}describe('${methodName}()', () => { - it('should dispatch an action', () => { - mapDispatchToPropsObject.${methodName}() - assert(dispatchSpy.calledOnce) - }) - })` - return describeBlock -} -/* -function generateMethodDescribeBlocks (methodArray) { - return methodArray - .map((methodName, index) => generateMethodDescribeBlock(methodName, index)) - .join('\n\n') -} -*/ - -function generateDispatchMethodDescribeBlocks (methodArray) { - return methodArray - .map((methodName, index) => generateDispatchMethodDescribeBlock(methodName, index)) - .join('\n\n') -} - -/* -function generateSelectorTest (name, methodArray) { -return `import assert from 'assert' -import { -${generateMethodList(methodArray)} -} from '../${name}' - -describe('${name.match(/^[^.]+/)} selectors', () => { - - ${generateMethodDescribeBlocks(methodArray)} - -})` -} - -function generateUtilTest (name, methodArray) { -return `import assert from 'assert' -import { -${generateMethodList(methodArray)} -} from '../${name}' - -describe('${name.match(/^[^.]+/)} utils', () => { - - ${generateMethodDescribeBlocks(methodArray)} - -})` -} -*/ - -function generateContainerTest (sPath, { - mapStateToPropsAssertionObject, - mapDispatchToPropsMethodNames, - proxyquireObject, -}) { -return `import assert from 'assert' -import proxyquire from 'proxyquire' -import sinon from 'sinon' - -let mapStateToProps -let mapDispatchToProps - -proxyquire('../${sPath}', ${proxyquireObject}) - -describe('${sPath.match(/^[^.]+/)} container', () => { - - describe('mapStateToProps()', () => { - - it('should map the correct properties to props', () => { - assert.deepEqual(mapStateToProps('mockState'), ${mapStateToPropsAssertionObject}) - }) - - }) - - describe('mapDispatchToProps()', () => { - let dispatchSpy - let mapDispatchToPropsObject - - beforeEach(() => { - dispatchSpy = sinon.spy() - mapDispatchToPropsObject = mapDispatchToProps(dispatchSpy) - }) - - ${mapDispatchToPropsMethodNames ? generateDispatchMethodDescribeBlocks(mapDispatchToPropsMethodNames) : 'delete'} - - }) - -})` -} diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100644 index 6ea02c52c7c7..000000000000 --- a/gulpfile.js +++ /dev/null @@ -1,632 +0,0 @@ -const watchify = require('watchify') -const browserify = require('browserify') -const envify = require('envify/custom') -const disc = require('disc') -const gulp = require('gulp') -const source = require('vinyl-source-stream') -const buffer = require('vinyl-buffer') -const gutil = require('gulp-util') -const watch = require('gulp-watch') -const sourcemaps = require('gulp-sourcemaps') -const jsoneditor = require('gulp-json-editor') -const zip = require('gulp-zip') -const assign = require('lodash.assign') -const livereload = require('gulp-livereload') -const del = require('del') -const fs = require('fs') -const path = require('path') -const manifest = require('./app/manifest.json') -const mkdirp = require('mkdirp') -const sass = require('gulp-sass') -const autoprefixer = require('gulp-autoprefixer') -const gulpStylelint = require('gulp-stylelint') -const stylefmt = require('gulp-stylefmt') -const uglify = require('gulp-uglify-es').default -const pify = require('pify') -const gulpMultiProcess = require('gulp-multi-process') -const endOfStream = pify(require('end-of-stream')) - -const packageJSON = require('./package.json') -const dependencies = Object.keys(packageJSON && packageJSON.dependencies || {}) -const materialUIDependencies = ['@material-ui/core'] -const reactDepenendencies = dependencies.filter(dep => dep.match(/react/)) -const d3Dependencies = ['c3', 'd3'] - -const uiDependenciesToBundle = [ - ...materialUIDependencies, - ...reactDepenendencies, - ...d3Dependencies, -] - -function gulpParallel (...args) { - return function spawnGulpChildProcess (cb) { - return gulpMultiProcess(args, cb, true) - } -} - -const browserPlatforms = [ - 'firefox', - 'chrome', - 'brave', - 'edge', - 'opera', -] -const commonPlatforms = [ - // browser extensions - ...browserPlatforms, -] - -// browser reload - -gulp.task('dev:reload', function () { - livereload.listen({ - port: 35729, - }) -}) - -// copy universal - -const copyTaskNames = [] -const copyDevTaskNames = [] - -createCopyTasks('locales', { - source: './app/_locales/', - destinations: commonPlatforms.map(platform => `./dist/${platform}/_locales`), -}) -createCopyTasks('images', { - source: './app/images/', - destinations: commonPlatforms.map(platform => `./dist/${platform}/images`), -}) -createCopyTasks('contractImages', { - source: './node_modules/eth-contract-metadata/images/', - destinations: commonPlatforms.map(platform => `./dist/${platform}/images/contract`), -}) -createCopyTasks('fonts', { - source: './app/fonts/', - destinations: commonPlatforms.map(platform => `./dist/${platform}/fonts`), -}) -createCopyTasks('vendor', { - source: './app/vendor/', - destinations: commonPlatforms.map(platform => `./dist/${platform}/vendor`), -}) -createCopyTasks('reload', { - devOnly: true, - source: './app/scripts/', - pattern: '/chromereload.js', - destinations: commonPlatforms.map(platform => `./dist/${platform}`), -}) -createCopyTasks('html', { - source: './app/', - pattern: '/*.html', - destinations: commonPlatforms.map(platform => `./dist/${platform}`), -}) - -// copy extension - -createCopyTasks('manifest', { - source: './app/', - pattern: '/*.json', - destinations: browserPlatforms.map(platform => `./dist/${platform}`), -}) - -function createCopyTasks (label, opts) { - if (!opts.devOnly) { - const copyTaskName = `copy:${label}` - copyTask(copyTaskName, opts) - copyTaskNames.push(copyTaskName) - } - const copyDevTaskName = `dev:copy:${label}` - copyTask(copyDevTaskName, Object.assign({ devMode: true }, opts)) - copyDevTaskNames.push(copyDevTaskName) -} - -function copyTask (taskName, opts) { - const source = opts.source - const destination = opts.destination - const destinations = opts.destinations || [destination] - const pattern = opts.pattern || '/**/*' - const devMode = opts.devMode - - return gulp.task(taskName, function () { - if (devMode) { - watch(source + pattern, (event) => { - livereload.changed(event.path) - performCopy() - }) - } - - return performCopy() - }) - - function performCopy () { - // stream from source - let stream = gulp.src(source + pattern, { base: source }) - - // copy to destinations - destinations.forEach(function (destination) { - stream = stream.pipe(gulp.dest(destination)) - }) - - return stream - } -} - -// manifest tinkering - -gulp.task('manifest:chrome', function () { - return gulp.src('./dist/chrome/manifest.json') - .pipe(jsoneditor(function (json) { - delete json.applications - return json - })) - .pipe(gulp.dest('./dist/chrome', { overwrite: true })) -}) - -gulp.task('manifest:opera', function () { - return gulp.src('./dist/opera/manifest.json') - .pipe(jsoneditor(function (json) { - json.permissions = [ - 'storage', - 'tabs', - 'clipboardWrite', - 'clipboardRead', - 'http://localhost:8545/', - ] - return json - })) - .pipe(gulp.dest('./dist/opera', { overwrite: true })) -}) - -gulp.task('manifest:production', function () { - return gulp.src([ - './dist/firefox/manifest.json', - './dist/chrome/manifest.json', - './dist/brave/manifest.json', - './dist/edge/manifest.json', - './dist/opera/manifest.json', - ], {base: './dist/'}) - - // Exclude chromereload script in production: - .pipe(jsoneditor(function (json) { - json.background.scripts = json.background.scripts.filter((script) => { - return !script.includes('chromereload') - }) - return json - })) - - .pipe(gulp.dest('./dist/', { overwrite: true })) -}) - -gulp.task('manifest:testing', function () { - return gulp.src([ - './dist/firefox/manifest.json', - './dist/chrome/manifest.json', - ], {base: './dist/'}) - - // Exclude chromereload script in production: - .pipe(jsoneditor(function (json) { - json.permissions = [...json.permissions, 'webRequestBlocking'] - return json - })) - - .pipe(gulp.dest('./dist/', { overwrite: true })) -}) - -gulp.task('copy', - gulp.series( - gulp.parallel(...copyTaskNames), - 'manifest:production', - 'manifest:chrome', - 'manifest:opera' - ) -) - -gulp.task('dev:copy', - gulp.series( - gulp.parallel(...copyDevTaskNames), - 'manifest:chrome', - 'manifest:opera' - ) -) - -gulp.task('test:copy', - gulp.series( - gulp.parallel(...copyDevTaskNames), - 'manifest:chrome', - 'manifest:opera', - 'manifest:testing' - ) -) - -// scss compilation and autoprefixing tasks - -gulp.task('build:scss', createScssBuildTask({ - src: 'ui/app/css/index.scss', - dest: 'ui/app/css/output', - devMode: false, -})) - -gulp.task('dev:scss', createScssBuildTask({ - src: 'ui/app/css/index.scss', - dest: 'ui/app/css/output', - devMode: true, - pattern: 'ui/app/**/*.scss', -})) - -function createScssBuildTask ({ src, dest, devMode, pattern }) { - return function () { - if (devMode) { - watch(pattern, async (event) => { - const stream = buildScss() - await endOfStream(stream) - livereload.changed(event.path) - }) - return buildScssWithSourceMaps() - } - return buildScss() - } - - function buildScssWithSourceMaps () { - return gulp.src(src) - .pipe(sourcemaps.init()) - .pipe(sass().on('error', sass.logError)) - .pipe(sourcemaps.write()) - .pipe(autoprefixer()) - .pipe(gulp.dest(dest)) - } - - function buildScss () { - return gulp.src(src) - .pipe(sass().on('error', sass.logError)) - .pipe(autoprefixer()) - .pipe(gulp.dest(dest)) - } -} - -gulp.task('lint-scss', function () { - return gulp - .src('ui/app/css/itcss/**/*.scss') - .pipe(gulpStylelint({ - reporters: [ - { formatter: 'string', console: true }, - ], - fix: true, - })) -}) - -gulp.task('fmt-scss', function () { - return gulp.src('ui/app/css/itcss/**/*.scss') - .pipe(stylefmt()) - .pipe(gulp.dest('ui/app/css/itcss')) -}) - -// build js - -const buildJsFiles = [ - 'inpage', - 'contentscript', - 'background', - 'ui', - 'phishing-detect', -] - -// bundle tasks -createTasksForBuildJsUIDeps({ dependenciesToBundle: uiDependenciesToBundle, filename: 'libs' }) -createTasksForBuildJsExtension({ buildJsFiles, taskPrefix: 'dev:extension:js', devMode: true }) -createTasksForBuildJsExtension({ buildJsFiles, taskPrefix: 'dev:test-extension:js', devMode: true, testing: 'true' }) -createTasksForBuildJsExtension({ buildJsFiles, taskPrefix: 'build:extension:js' }) -createTasksForBuildJsExtension({ buildJsFiles, taskPrefix: 'build:test:extension:js', testing: 'true' }) - -function createTasksForBuildJsUIDeps ({ filename }) { - const destinations = browserPlatforms.map(platform => `./dist/${platform}`) - - - const bundleTaskOpts = Object.assign({ - buildSourceMaps: true, - sourceMapDir: '../sourcemaps', - minifyBuild: true, - devMode: false, - }) - - gulp.task('build:extension:js:uideps', bundleTask(Object.assign({ - label: filename, - filename: `${filename}.js`, - destinations, - buildLib: true, - dependenciesToBundle: uiDependenciesToBundle, - }, bundleTaskOpts))) -} - - -function createTasksForBuildJsExtension ({ buildJsFiles, taskPrefix, devMode, testing, bundleTaskOpts = {} }) { - // inpage must be built before all other scripts: - const rootDir = './app/scripts' - const nonInpageFiles = buildJsFiles.filter(file => file !== 'inpage') - const buildPhase1 = ['inpage'] - const buildPhase2 = nonInpageFiles - const destinations = browserPlatforms.map(platform => `./dist/${platform}`) - bundleTaskOpts = Object.assign({ - buildSourceMaps: true, - sourceMapDir: '../sourcemaps', - minifyBuild: !devMode, - buildWithFullPaths: devMode, - watch: devMode, - devMode, - testing, - }, bundleTaskOpts) - createTasksForBuildJs({ rootDir, taskPrefix, bundleTaskOpts, destinations, buildPhase1, buildPhase2 }) -} - -function createTasksForBuildJs ({ rootDir, taskPrefix, bundleTaskOpts, destinations, buildPhase1 = [], buildPhase2 = [] }) { - // bundle task for each file - const jsFiles = [].concat(buildPhase1, buildPhase2) - jsFiles.forEach((jsFile) => { - gulp.task(`${taskPrefix}:${jsFile}`, bundleTask(Object.assign({ - label: jsFile, - filename: `${jsFile}.js`, - filepath: `${rootDir}/${jsFile}.js`, - externalDependencies: jsFile === 'ui' && !bundleTaskOpts.devMode && uiDependenciesToBundle, - destinations, - }, bundleTaskOpts))) - }) - // compose into larger task - const subtasks = [] - subtasks.push(gulp.parallel(buildPhase1.map(file => `${taskPrefix}:${file}`))) - if (buildPhase2.length) subtasks.push(gulp.parallel(buildPhase2.map(file => `${taskPrefix}:${file}`))) - - gulp.task(taskPrefix, gulp.series(subtasks)) -} - -// disc bundle analyzer tasks - -buildJsFiles.forEach((jsFile) => { - gulp.task(`disc:${jsFile}`, discTask({ label: jsFile, filename: `${jsFile}.js` })) -}) - -gulp.task('disc', gulp.parallel(buildJsFiles.map(jsFile => `disc:${jsFile}`))) - -// clean dist - -gulp.task('clean', function clean () { - return del(['./dist/*']) -}) - -// zip tasks for distribution -gulp.task('zip:chrome', zipTask('chrome')) -gulp.task('zip:firefox', zipTask('firefox')) -gulp.task('zip:edge', zipTask('edge')) -gulp.task('zip:opera', zipTask('opera')) -gulp.task('zip', gulp.parallel('zip:chrome', 'zip:firefox', 'zip:edge', 'zip:opera')) - -// high level tasks - -gulp.task('dev', - gulp.series( - 'clean', - 'dev:scss', - gulp.parallel( - 'dev:extension:js', - 'dev:copy', - 'dev:reload' - ) - ) -) - -gulp.task('dev:test', - gulp.series( - 'clean', - 'dev:scss', - gulp.parallel( - 'dev:test-extension:js', - 'test:copy', - 'dev:reload' - ) - ) -) - -gulp.task('dev:extension', - gulp.series( - 'clean', - 'dev:scss', - gulp.parallel( - 'dev:extension:js', - 'dev:copy', - 'dev:reload' - ) - ) -) - -gulp.task('build', - gulp.series( - 'clean', - 'build:scss', - gulpParallel( - 'build:extension:js:uideps', - 'build:extension:js', - 'copy' - ) - ) -) - -gulp.task('build:test', - gulp.series( - 'clean', - 'build:scss', - gulpParallel( - 'build:extension:js:uideps', - 'build:test:extension:js', - 'copy' - ), - 'manifest:testing' - ) -) - -gulp.task('build:extension', - gulp.series( - 'clean', - 'build:scss', - gulp.parallel( - 'build:extension:js', - 'copy' - ) - ) -) - -gulp.task('dist', - gulp.series( - 'build', - 'zip' - ) -) - -// task generators - -function zipTask (target) { - return () => { - return gulp.src(`dist/${target}/**`) - .pipe(zip(`metamask-${target}-${manifest.version}.zip`)) - .pipe(gulp.dest('builds')) - } -} - -function generateBundler (opts, performBundle) { - const browserifyOpts = assign({}, watchify.args, { - plugin: 'browserify-derequire', - debug: opts.buildSourceMaps, - fullPaths: opts.buildWithFullPaths, - }) - - if (!opts.buildLib) { - browserifyOpts['entries'] = [opts.filepath] - } - - let bundler = browserify(browserifyOpts) - - if (opts.buildLib) { - bundler = bundler.require(opts.dependenciesToBundle) - } - - if (opts.externalDependencies) { - bundler = bundler.external(opts.externalDependencies) - } - - // inject variables into bundle - bundler.transform(envify({ - METAMASK_DEBUG: opts.devMode, - NODE_ENV: opts.devMode ? 'development' : 'production', - IN_TEST: opts.testing, - PUBNUB_SUB_KEY: process.env.PUBNUB_SUB_KEY || '', - PUBNUB_PUB_KEY: process.env.PUBNUB_PUB_KEY || '', - }), { - global: true, - }) - - if (opts.watch) { - bundler = watchify(bundler) - // on any file update, re-runs the bundler - bundler.on('update', async (ids) => { - const stream = performBundle() - await endOfStream(stream) - livereload.changed(`${ids}`) - }) - } - - return bundler -} - -function discTask (opts) { - opts = Object.assign({ - buildWithFullPaths: true, - }, opts) - - const bundler = generateBundler(opts, performBundle) - // output build logs to terminal - bundler.on('log', gutil.log) - - return performBundle - - function performBundle () { - // start "disc" build - const discDir = path.join(__dirname, 'disc') - mkdirp.sync(discDir) - const discPath = path.join(discDir, `${opts.label}.html`) - - return ( - bundler.bundle() - .pipe(disc()) - .pipe(fs.createWriteStream(discPath)) - ) - } -} - - -function bundleTask (opts) { - const bundler = generateBundler(opts, performBundle) - // output build logs to terminal - bundler.on('log', gutil.log) - - return performBundle - - function performBundle () { - let buildStream = bundler.bundle() - - // handle errors - buildStream.on('error', (err) => { - beep() - if (opts.watch) { - console.warn(err.stack) - } else { - throw err - } - }) - - // process bundles - buildStream = buildStream - // convert bundle stream to gulp vinyl stream - .pipe(source(opts.filename)) - // buffer file contents (?) - .pipe(buffer()) - - // Initialize Source Maps - if (opts.buildSourceMaps) { - buildStream = buildStream - // loads map from browserify file - .pipe(sourcemaps.init({ loadMaps: true })) - } - - // Minification - if (opts.minifyBuild) { - buildStream = buildStream - .pipe(uglify({ - mangle: { - reserved: [ 'MetamaskInpageProvider' ], - }, - })) - } - - // Finalize Source Maps - if (opts.buildSourceMaps) { - if (opts.devMode) { - // Use inline source maps for development due to Chrome DevTools bug - // https://bugs.chromium.org/p/chromium/issues/detail?id=931675 - buildStream = buildStream - .pipe(sourcemaps.write()) - } else { - buildStream = buildStream - .pipe(sourcemaps.write(opts.sourceMapDir)) - } - } - - // write completed bundles - opts.destinations.forEach((dest) => { - buildStream = buildStream.pipe(gulp.dest(dest)) - }) - - return buildStream - - } -} - -function beep () { - process.stdout.write('\x07') -} diff --git a/images b/images deleted file mode 120000 index 2a4dbe89251c..000000000000 --- a/images +++ /dev/null @@ -1 +0,0 @@ -app/images \ No newline at end of file diff --git a/nyc.config.js b/nyc.config.js new file mode 100644 index 000000000000..8902e05716c4 --- /dev/null +++ b/nyc.config.js @@ -0,0 +1,6 @@ +module.exports = { + branches: 95, + lines: 95, + functions: 95, + statements: 95, +} diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 777cf424e0f3..000000000000 --- a/package-lock.json +++ /dev/null @@ -1,54592 +0,0 @@ -{ - "name": "metamask-crx", - "version": "0.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0-beta.31", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.31.tgz", - "integrity": "sha512-yd7CkUughvHQoEahQqcMdrZw6o/6PwUxiRkfZuVDVHCDe77mysD/suoNyk5mK6phTnRW1kyIbPHyCJgxw++LXg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.1.0", - "escape-string-regexp": "^1.0.5", - "supports-color": "^4.0.0" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } - } - } - }, - "@babel/core": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.5.tgz", - "integrity": "sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helpers": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.4.5", - "@babel/types": "^7.4.4", - "convert-source-map": "^1.1.0", - "debug": "^4.1.0", - "json5": "^2.1.0", - "lodash": "^4.17.11", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/types": "^7.4.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.11" - } - }, - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - }, - "dependencies": { - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", - "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", - "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.1.0", - "@babel/types": "^7.0.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-builder-react-jsx": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz", - "integrity": "sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0", - "esutils": "^2.0.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-call-delegate": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", - "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", - "dev": true - }, - "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/types": "^7.4.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.11" - } - }, - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.4.tgz", - "integrity": "sha512-UbBHIa2qeAGgyiNR9RszVF7bUHEdgS4JAUNT8SiqrAN6YJVxlOxeLr5pBzb5kan302dejJ9nla4RyKcR1XT6XA==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-member-expression-to-functions": "^7.0.0", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.4.4", - "@babel/helper-split-export-declaration": "^7.4.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-define-map": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz", - "integrity": "sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/types": "^7.4.4", - "lodash": "^4.17.11" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", - "dev": true - }, - "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", - "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", - "dev": true - }, - "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/types": "^7.4.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.11" - } - }, - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-function-name": { - "version": "7.0.0-beta.31", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.31.tgz", - "integrity": "sha512-c+DAyp8LMm2nzSs2uXEuxp4LYGSUYEyHtU3fU57avFChjsnTmmpWmXj2dv0yUxHTEydgVAv5fIzA+4KJwoqWDA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "7.0.0-beta.31", - "@babel/template": "7.0.0-beta.31", - "@babel/traverse": "7.0.0-beta.31", - "@babel/types": "7.0.0-beta.31" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0-beta.31", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.31.tgz", - "integrity": "sha512-m7rVVX/dMLbbB9NCzKYRrrFb0qZxgpmQ4Wv6y7zEsB6skoJHRuXVeb/hAFze79vXBbuD63ci7AVHXzAdZSk9KQ==", - "dev": true, - "requires": { - "@babel/types": "7.0.0-beta.31" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", - "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz", - "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-module-imports": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", - "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-module-transforms": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz", - "integrity": "sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/template": "^7.4.4", - "@babel/types": "^7.4.4", - "lodash": "^4.17.11" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", - "dev": true - }, - "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", - "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-plugin-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", - "dev": true - }, - "@babel/helper-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.4.4.tgz", - "integrity": "sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q==", - "dev": true, - "requires": { - "lodash": "^4.17.11" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", - "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-wrap-function": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", - "dev": true - }, - "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/types": "^7.4.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.11" - } - }, - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-replace-supers": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz", - "integrity": "sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.0.0", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", - "dev": true - }, - "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/types": "^7.4.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.11" - } - }, - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-simple-access": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", - "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", - "dev": true, - "requires": { - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", - "dev": true - }, - "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-wrap-function": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", - "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.2.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", - "dev": true - }, - "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/types": "^7.4.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.11" - } - }, - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helpers": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz", - "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==", - "dev": true, - "requires": { - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/types": "^7.4.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.11" - } - }, - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", - "dev": true - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", - "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0", - "@babel/plugin-syntax-async-generators": "^7.2.0" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.4.tgz", - "integrity": "sha512-WjKTI8g8d5w1Bc9zgwSz2nfrsNQsXcCf9J9cdCvrJV6RF56yztwm4TmJC0MgJ9tvwO9gUA/mcYe89bLdGfiXFg==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.4.4", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-proposal-decorators": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.0.tgz", - "integrity": "sha512-d08TLmXeK/XbgCo7ZeZ+JaeZDtDai/2ctapTRsWWkkmy7G/cqz8DQN/HlWG7RR4YmfXxmExsbU3SuCjlM7AtUg==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.4.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-decorators": "^7.2.0" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", - "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-json-strings": "^7.2.0" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz", - "integrity": "sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz", - "integrity": "sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.5.4" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, - "regexpu-core": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", - "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.0.2", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" - } - }, - "regjsgen": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", - "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", - "dev": true - }, - "regjsparser": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", - "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - } - } - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", - "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-decorators": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz", - "integrity": "sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", - "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-flow": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz", - "integrity": "sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", - "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz", - "integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", - "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz", - "integrity": "sha512-dGwbSMA1YhVS8+31CnPR7LB4pcbrzcV99wQzby4uAfrkZPYZlQ7ImwdpzLqi6Z6IL02b8IAL379CaMwo0x5Lag==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", - "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz", - "integrity": "sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", - "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz", - "integrity": "sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "lodash": "^4.17.11" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "@babel/plugin-transform-classes": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz", - "integrity": "sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.4.4", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.4.4", - "@babel/helper-split-export-declaration": "^7.4.4", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", - "dev": true - }, - "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", - "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz", - "integrity": "sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz", - "integrity": "sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.5.4" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, - "regexpu-core": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", - "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.0.2", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" - } - }, - "regjsgen": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", - "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", - "dev": true - }, - "regjsparser": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", - "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - } - } - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz", - "integrity": "sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", - "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-flow-strip-types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.4.tgz", - "integrity": "sha512-WyVedfeEIILYEaWGAUWzVNyqG4sfsNooMhXWsu/YzOvVGcsnPb5PguysjJqI3t3qiaYj0BR8T2f5njdjTGe44Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.2.0" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", - "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", - "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", - "dev": true - }, - "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/plugin-transform-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", - "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", - "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz", - "integrity": "sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz", - "integrity": "sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.4.4", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.4.tgz", - "integrity": "sha512-MSiModfILQc3/oqnG7NrP1jHaSPryO6tA2kOMmAQApz5dayPxWiHqmq4sWH2xF5LcQK56LlbKByCd8Aah/OIkQ==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.4.4", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", - "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz", - "integrity": "sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg==", - "dev": true, - "requires": { - "regexp-tree": "^0.1.6" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", - "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz", - "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.1.0" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", - "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", - "dev": true, - "requires": { - "@babel/helper-call-delegate": "^7.4.4", - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" - }, - "dependencies": { - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", - "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-react-constant-elements": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.2.0.tgz", - "integrity": "sha512-YYQFg6giRFMsZPKUM9v+VcHOdfSQdz9jHCx3akAi3UYgyjndmdYGSXylQ/V+HswQt4fL8IklchD9HTsaOCrWQQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz", - "integrity": "sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz", - "integrity": "sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg==", - "dev": true, - "requires": { - "@babel/helper-builder-react-jsx": "^7.3.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0" - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz", - "integrity": "sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0" - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.2.0.tgz", - "integrity": "sha512-A32OkKTp4i5U6aE88GwwcuV4HAprUgHcTq0sSafLxjr6AW0QahrCRCjxogkbbcdtpbXkuTOlgpjophCxb6sh5g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", - "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", - "dev": true, - "requires": { - "regenerator-transform": "^0.14.0" - }, - "dependencies": { - "regenerator-transform": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.0.tgz", - "integrity": "sha512-rtOelq4Cawlbmq9xuMR5gdFmv7ku/sFoB7sRiywx7aq53bc52b4j6zvH7Te1Vt/X2YveDKnCGUbioieU7FEL3w==", - "dev": true, - "requires": { - "private": "^0.1.6" - } - } - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", - "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.4.3.tgz", - "integrity": "sha512-7Q61bU+uEI7bCUFReT1NKn7/X6sDQsZ7wL1sJ9IYMAO7cI+eg6x9re1cEw2fCRMbbTVyoeUKWSV1M6azEfKCfg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "resolve": "^1.8.1", - "semver": "^5.5.1" - }, - "dependencies": { - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "resolve": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", - "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", - "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz", - "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", - "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", - "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", - "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.4.5.tgz", - "integrity": "sha512-RPB/YeGr4ZrFKNwfuQRlMf2lxoCUaU01MTw39/OFE/RiL8HDjtn68BwEPft1P7JN4akyEmjGWAMNldOV7o9V2g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-typescript": "^7.2.0" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz", - "integrity": "sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.5.4" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, - "regexpu-core": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", - "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.0.2", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" - } - }, - "regjsgen": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", - "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", - "dev": true - }, - "regjsparser": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", - "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - } - } - } - }, - "@babel/preset-env": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.5.tgz", - "integrity": "sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.2.0", - "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.4.4", - "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-syntax-async-generators": "^7.2.0", - "@babel/plugin-syntax-json-strings": "^7.2.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.4.4", - "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.4.4", - "@babel/plugin-transform-classes": "^7.4.4", - "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/plugin-transform-duplicate-keys": "^7.2.0", - "@babel/plugin-transform-exponentiation-operator": "^7.2.0", - "@babel/plugin-transform-for-of": "^7.4.4", - "@babel/plugin-transform-function-name": "^7.4.4", - "@babel/plugin-transform-literals": "^7.2.0", - "@babel/plugin-transform-member-expression-literals": "^7.2.0", - "@babel/plugin-transform-modules-amd": "^7.2.0", - "@babel/plugin-transform-modules-commonjs": "^7.4.4", - "@babel/plugin-transform-modules-systemjs": "^7.4.4", - "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5", - "@babel/plugin-transform-new-target": "^7.4.4", - "@babel/plugin-transform-object-super": "^7.2.0", - "@babel/plugin-transform-parameters": "^7.4.4", - "@babel/plugin-transform-property-literals": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.4.5", - "@babel/plugin-transform-reserved-words": "^7.2.0", - "@babel/plugin-transform-shorthand-properties": "^7.2.0", - "@babel/plugin-transform-spread": "^7.2.0", - "@babel/plugin-transform-sticky-regex": "^7.2.0", - "@babel/plugin-transform-template-literals": "^7.4.4", - "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "browserslist": "^4.6.0", - "core-js-compat": "^3.1.1", - "invariant": "^2.2.2", - "js-levenshtein": "^1.1.3", - "semver": "^5.5.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "browserslist": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.1.tgz", - "integrity": "sha512-1MC18ooMPRG2UuVFJTHFIAkk6mpByJfxCrnUyvSlu/hyQSFHMrlhM02SzNuCV+quTP4CKmqtOMAIjrifrpBJXQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000971", - "electron-to-chromium": "^1.3.137", - "node-releases": "^1.1.21" - } - }, - "caniuse-lite": { - "version": "1.0.30000973", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000973.tgz", - "integrity": "sha512-/F3t/Yo8LEdRSEPCmI15fLu5vepVh9UCg/9inJXF5AAfW7xRRJkbaM2ut52iRMQMnGCLQouLbFdbOA+VEFOIsg==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.146", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.146.tgz", - "integrity": "sha512-BrUq08sx7eR4PCwLbjFxXmjcbDro6DSoc1pN8VCxq76U+o9JQzJlWH/NVtcpAqcktwpE5CVvMyqHqTQfCETNoQ==", - "dev": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/preset-flow": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.0.0.tgz", - "integrity": "sha512-bJOHrYOPqJZCkPVbG1Lot2r5OSsB+iUOaxiHdlOeB1yPWS6evswVHwvkDLZ54WTaTRIk89ds0iHmGZSnxlPejQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0" - } - }, - "@babel/preset-react": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0.tgz", - "integrity": "sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0" - } - }, - "@babel/preset-typescript": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.3.3.tgz", - "integrity": "sha512-mzMVuIP4lqtn4du2ynEfdO0+RYcslwrZiJHXu4MGaC1ctJiW2fyaeDrtjJGs7R/KebZ1sgowcIoWf4uRpEfKEg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.3.2" - } - }, - "@babel/runtime": { - "version": "7.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0-beta.47.tgz", - "integrity": "sha512-3IaakAC5B4bHJ0aCUKVw0pt+GruavdgWDFbf7TfKh7ZJ8yQuUp7af7MNwf3e+jH8776cjqYmMO1JNDDAE9WfrA==", - "requires": { - "core-js": "^2.5.3", - "regenerator-runtime": "^0.11.1" - } - }, - "@babel/template": { - "version": "7.0.0-beta.31", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.31.tgz", - "integrity": "sha512-97IRmLvoDhIDSQkqklVt3UCxJsv0LUEVb/0DzXWtc8Lgiyxj567qZkmTG9aR21CmcJVVIvq2Y/moZj4oEpl5AA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.31", - "@babel/types": "7.0.0-beta.31", - "babylon": "7.0.0-beta.31", - "lodash": "^4.2.0" - }, - "dependencies": { - "babylon": { - "version": "7.0.0-beta.31", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.31.tgz", - "integrity": "sha512-6lm2mV3S51yEnKmQQNnswoABL1U1H1KHoCCVwdwI3hvIv+W7ya4ki7Aw4o4KxtUHjNKkK5WpZb22rrMMOcJXJQ==", - "dev": true - } - } - }, - "@babel/traverse": { - "version": "7.0.0-beta.31", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.31.tgz", - "integrity": "sha512-3N+VJW+KlezEjFBG7WSYeMyC5kIqVLPb/PGSzCDPFcJrnArluD1GIl7Y3xC7cjKiTq2/JohaLWHVPjJWHlo9Gg==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.31", - "@babel/helper-function-name": "7.0.0-beta.31", - "@babel/types": "7.0.0-beta.31", - "babylon": "7.0.0-beta.31", - "debug": "^3.0.1", - "globals": "^10.0.0", - "invariant": "^2.2.0", - "lodash": "^4.2.0" - }, - "dependencies": { - "babylon": { - "version": "7.0.0-beta.31", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.31.tgz", - "integrity": "sha512-6lm2mV3S51yEnKmQQNnswoABL1U1H1KHoCCVwdwI3hvIv+W7ya4ki7Aw4o4KxtUHjNKkK5WpZb22rrMMOcJXJQ==", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "globals": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz", - "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.0.0-beta.31", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.31.tgz", - "integrity": "sha512-exAHB+NeFGxkfQ5dSUD03xl3zYGneeSk2Mw2ldTt/nTvYxuDiuSp3DlxgUBgzbdTFG4fbwPk0WtKWOoTXCmNGg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.2.0", - "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@emotion/cache": { - "version": "10.0.9", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.9.tgz", - "integrity": "sha512-f7MblpE2xoimC4fCMZ9pivmsIn7hyWRIvY75owMDi8pdOSeh+w5tH3r4hBJv/LLrwiMM7cTQURqTPcYoL5pWnw==", - "dev": true, - "requires": { - "@emotion/sheet": "0.9.2", - "@emotion/stylis": "0.8.3", - "@emotion/utils": "0.11.1", - "@emotion/weak-memoize": "0.2.2" - } - }, - "@emotion/core": { - "version": "10.0.10", - "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.10.tgz", - "integrity": "sha512-U1aE2cOWUscjc8ZJ3Cx32udOzLeRoJwGxBH93xQD850oQFpwPKZARzdUtdc9SByUOwzSFYxhDhrpXnV34FJmWg==", - "dev": true, - "requires": { - "@emotion/cache": "^10.0.9", - "@emotion/css": "^10.0.9", - "@emotion/serialize": "^0.11.6", - "@emotion/sheet": "0.9.2", - "@emotion/utils": "0.11.1" - } - }, - "@emotion/css": { - "version": "10.0.9", - "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.9.tgz", - "integrity": "sha512-jtHhUSWw+L7yxYgNtC+KJ3Ory90/jiAtpG1qT+gTQQ/RR5AMiigs9/lDHu/vnwljaq2S48FoKb/FZZMlJcC4bw==", - "dev": true, - "requires": { - "@emotion/serialize": "^0.11.6", - "@emotion/utils": "0.11.1", - "babel-plugin-emotion": "^10.0.9" - } - }, - "@emotion/hash": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.7.1.tgz", - "integrity": "sha512-OYpa/Sg+2GDX+jibUfpZVn1YqSVRpYmTLF2eyAfrFTIJSbwyIrc+YscayoykvaOME/wV4BV0Sa0yqdMrgse6mA==", - "dev": true - }, - "@emotion/is-prop-valid": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.7.3.tgz", - "integrity": "sha512-uxJqm/sqwXw3YPA5GXX365OBcJGFtxUVkB6WyezqFHlNe9jqUWH5ur2O2M8dGBz61kn1g3ZBlzUunFQXQIClhA==", - "dev": true, - "requires": { - "@emotion/memoize": "0.7.1" - } - }, - "@emotion/memoize": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.1.tgz", - "integrity": "sha512-Qv4LTqO11jepd5Qmlp3M1YEjBumoTHcHFdgPTQ+sFlIL5myi/7xu/POwP7IRu6odBdmLXdtIs1D6TuW6kbwbbg==", - "dev": true - }, - "@emotion/serialize": { - "version": "0.11.6", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.6.tgz", - "integrity": "sha512-n4zVv2qGLmspF99jaEUwnMV0fnEGsyUMsC/8KZKUSUTZMYljHE+j+B6rSD8PIFtaUIhHaxCG2JawN6L+OgLN0Q==", - "dev": true, - "requires": { - "@emotion/hash": "0.7.1", - "@emotion/memoize": "0.7.1", - "@emotion/unitless": "0.7.3", - "@emotion/utils": "0.11.1", - "csstype": "^2.5.7" - }, - "dependencies": { - "csstype": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.5.tgz", - "integrity": "sha512-JsTaiksRsel5n7XwqPAfB0l3TFKdpjW/kgAELf9vrb5adGA7UCPLajKK5s3nFrcFm3Rkyp/Qkgl73ENc1UY3cA==", - "dev": true - } - } - }, - "@emotion/sheet": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.2.tgz", - "integrity": "sha512-pVBLzIbC/QCHDKJF2E82V2H/W/B004mDFQZiyo/MSR+VC4pV5JLG0TF/zgQDFvP3fZL/5RTPGEmXlYJBMUuJ+A==", - "dev": true - }, - "@emotion/styled": { - "version": "10.0.11", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-10.0.11.tgz", - "integrity": "sha512-c/M/JJHTQuqdY9viSZD41ccCJDe07/VMrj+JgOcyb8uDnRAr+3cCQ03tyrgl72bQD0YWcjXHhpA7Ja9S3+vuRw==", - "dev": true, - "requires": { - "@emotion/styled-base": "^10.0.10", - "babel-plugin-emotion": "^10.0.9" - } - }, - "@emotion/styled-base": { - "version": "10.0.10", - "resolved": "https://registry.npmjs.org/@emotion/styled-base/-/styled-base-10.0.10.tgz", - "integrity": "sha512-uZwKrBfcH7jCRAQi5ZxsEGIZ+1Zr9/lof4TMsIolC0LSwpnWkQ+JRJLy+p4ZyATee9SdmyCV0sG/VTngVSnrpA==", - "dev": true, - "requires": { - "@emotion/is-prop-valid": "0.7.3", - "@emotion/serialize": "^0.11.6", - "@emotion/utils": "0.11.1", - "object-assign": "^4.1.1" - } - }, - "@emotion/stylis": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.3.tgz", - "integrity": "sha512-M3nMfJ6ndJMYloSIbYEBq6G3eqoYD41BpDOxreE8j0cb4fzz/5qvmqU9Mb2hzsXcCnIlGlWhS03PCzVGvTAe0Q==", - "dev": true - }, - "@emotion/unitless": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.3.tgz", - "integrity": "sha512-4zAPlpDEh2VwXswwr/t8xGNDGg8RQiPxtxZ3qQEXyQsBV39ptTdESCjuBvGze1nLMVrxmTIKmnO/nAV8Tqjjzg==", - "dev": true - }, - "@emotion/utils": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.1.tgz", - "integrity": "sha512-8M3VN0hetwhsJ8dH8VkVy7xo5/1VoBsDOk/T4SJOeXwTO1c4uIqVNx2qyecLFnnUWD5vvUqHQ1gASSeUN6zcTg==", - "dev": true - }, - "@emotion/weak-memoize": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.2.tgz", - "integrity": "sha512-n/VQ4mbfr81aqkx/XmVicOLjviMuy02eenSdJY33SVA7S2J42EU0P1H0mOogfYedb3wXA0d/LVtBrgTSm04WEA==", - "dev": true - }, - "@gulp-sourcemaps/identity-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.1.tgz", - "integrity": "sha1-z6I7xYQPkQTOMqZedNt+epdLvuE=", - "dev": true, - "requires": { - "acorn": "^5.0.3", - "css": "^2.2.1", - "normalize-path": "^2.1.1", - "source-map": "^0.5.6", - "through2": "^2.0.3" - }, - "dependencies": { - "acorn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", - "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@gulp-sourcemaps/map-sources": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", - "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", - "dev": true, - "requires": { - "normalize-path": "^2.0.1", - "through2": "^2.0.3" - } - }, - "@icons/material": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz", - "integrity": "sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==", - "dev": true - }, - "@material-ui/core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-1.0.0.tgz", - "integrity": "sha512-BTLp4goHFKGqCVSjSWNSUZp3/fvN36L0B73Z68i4Hs6TRZaApW5M2JyKmWTsCf/hk4PNKTnZMh141qNQFhxzAw==", - "requires": { - "@babel/runtime": "^7.0.0-beta.42", - "@types/jss": "^9.5.3", - "@types/react-transition-group": "^2.0.8", - "brcast": "^3.0.1", - "classnames": "^2.2.5", - "deepmerge": "^2.0.1", - "dom-helpers": "^3.2.1", - "hoist-non-react-statics": "^2.5.0", - "jss": "^9.3.3", - "jss-camel-case": "^6.0.0", - "jss-default-unit": "^8.0.2", - "jss-global": "^3.0.0", - "jss-nested": "^6.0.1", - "jss-props-sort": "^6.0.0", - "jss-vendor-prefixer": "^7.0.0", - "keycode": "^2.1.9", - "lodash": "^4.2.0", - "normalize-scroll-left": "^0.1.2", - "prop-types": "^15.6.0", - "react-event-listener": "^0.5.1", - "react-jss": "^8.1.0", - "react-popper": "^0.10.0", - "react-scrollbar-size": "^2.0.2", - "react-transition-group": "^2.2.1", - "recompose": "^0.26.0 || ^0.27.0", - "scroll": "^2.0.3", - "warning": "^3.0.0" - }, - "dependencies": { - "@types/jss": { - "version": "9.5.3", - "resolved": "https://registry.npmjs.org/@types/jss/-/jss-9.5.3.tgz", - "integrity": "sha512-RQWhcpOVyIhGryKpnUyZARwsgmp+tB82O7c75lC4Tjbmr3hPiCnM1wc+pJipVEOsikYXW0IHgeiQzmxQXbnAIA==", - "requires": { - "csstype": "^2.0.0", - "indefinite-observable": "^1.0.1" - } - }, - "deepmerge": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.1.0.tgz", - "integrity": "sha512-Q89Z26KAfA3lpPGhbF6XMfYAm3jIV3avViy6KOJ2JLzFbeWHOvPQUu5aSJIWXap3gDZC2y1eF5HXEPI2wGqgvw==" - }, - "hoist-non-react-statics": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.0.tgz", - "integrity": "sha512-6Bl6XsDT1ntE0lHbIhr4Kp2PGcleGZ66qu5Jqk8lc0Xc/IeG6gVLmwUGs/K0Us+L8VWoKgj0uWdPMataOsm31w==" - }, - "recompose": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.27.0.tgz", - "integrity": "sha512-hivr1EopLhzjchhv2Y7VcLA2H5NGztwV/qfYqmIAhTkNowNQ9PyXdfq9Q8QCa0TMrPM1NtStlUyi5I/p8XfUNQ==", - "requires": { - "babel-runtime": "^6.26.0", - "change-emitter": "^0.1.2", - "fbjs": "^0.8.1", - "hoist-non-react-statics": "^2.3.1", - "react-lifecycles-compat": "^3.0.2", - "symbol-observable": "^1.0.4" - } - } - } - }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - }, - "dependencies": { - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - } - } - }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true - }, - "@reach/router": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@reach/router/-/router-1.2.1.tgz", - "integrity": "sha512-kTaX08X4g27tzIFQGRukaHmNbtMYDS3LEWIS8+l6OayGIw6Oyo1HIF/JzeuR2FoF9z6oV+x/wJSVSq4v8tcUGQ==", - "dev": true, - "requires": { - "create-react-context": "^0.2.1", - "invariant": "^2.2.3", - "prop-types": "^15.6.1", - "react-lifecycles-compat": "^3.0.4", - "warning": "^3.0.0" - }, - "dependencies": { - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "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 - } - } - }, - "@sentry/browser": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-4.2.3.tgz", - "integrity": "sha512-XvuIc1aclz4zuP2LamDuSy62/gl1mmNxzF+Ni5L8mcghBDq0urnOdkblVQgzqGoH8mc2QfjEctGa5djWxg3Bpg==", - "requires": { - "@sentry/core": "4.2.3", - "@sentry/types": "4.2.3", - "@sentry/utils": "4.2.3" - } - }, - "@sentry/cli": { - "version": "1.30.3", - "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-1.30.3.tgz", - "integrity": "sha1-AtD3eBwe5eG+WkMSoyX76LGzcjE=", - "dev": true, - "requires": { - "https-proxy-agent": "^2.1.1", - "node-fetch": "^1.7.3", - "progress": "2.0.0", - "proxy-from-env": "^1.0.0" - }, - "dependencies": { - "agent-base": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz", - "integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "https-proxy-agent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", - "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", - "dev": true, - "requires": { - "agent-base": "^4.1.0", - "debug": "^3.1.0" - } - } - } - }, - "@sentry/core": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-4.2.3.tgz", - "integrity": "sha512-xo5rvksftnaEdnKbdokyfuqgMnuqw1DFp0lDboIFHlEBcQde/AdThEgLujJWmbVNI3Cg7g8/HvP65f7QBjKfOw==", - "requires": { - "@sentry/hub": "4.2.3", - "@sentry/minimal": "4.2.3", - "@sentry/types": "4.2.3", - "@sentry/utils": "4.2.3" - } - }, - "@sentry/hub": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-4.2.3.tgz", - "integrity": "sha512-7Jc/wz3vybYm1RX2wk/4zAQS8fo3uxvXYBkRfpm3OmnGgTlwDEmJwtegeGWFqufxLl85brZ19V1KAdulmO206A==", - "requires": { - "@sentry/types": "4.2.3", - "@sentry/utils": "4.2.3" - } - }, - "@sentry/minimal": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-4.2.3.tgz", - "integrity": "sha512-Hus7LUeJDGsYpT2RTe6bUjG7mHG9uQoyDmW6pYUMN2dhD+cP5cPoTIXO4yxokwgAeDa+GH2/UXoASWc4s2eA2w==", - "requires": { - "@sentry/hub": "4.2.3", - "@sentry/types": "4.2.3" - } - }, - "@sentry/types": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-4.2.3.tgz", - "integrity": "sha512-Z7laXlLtLSEXcKzgcD2caWPMTM8sAvR86rssYM5uYb3azC5PO0aAvuhjokkdv1+Ke1Bg7lkaNZamiCSyaH/9xg==" - }, - "@sentry/utils": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-4.2.3.tgz", - "integrity": "sha512-D6+M1081wCwGp8adWV3KFOxrxFmVyjMJ45x6/TnYvXdgDyc+t28oil21FHeKhwjld9eMqgQ5Tf1OOvos1MNBQg==", - "requires": { - "@sentry/types": "4.2.3" - } - }, - "@sinonjs/commons": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.3.0.tgz", - "integrity": "sha512-j4ZwhaHmwsCb4DlDOIWnI5YyKDNMoNThsmwEpfHx6a1EpsGZ9qYLxP++LMlmBRjtGptGHFsGItJ768snllFWpA==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - }, - "dependencies": { - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - } - } - }, - "@sinonjs/formatio": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.1.0.tgz", - "integrity": "sha512-ZAR2bPHOl4Xg6eklUGpsdiIJ4+J1SNag1DHHrG/73Uz/nVwXqjgUtRPLoS+aVyieN9cSbc0E4LsU984tWcDyNg==", - "dev": true, - "requires": { - "@sinonjs/samsam": "^2 || ^3" - } - }, - "@sinonjs/samsam": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.1.0.tgz", - "integrity": "sha512-IXio+GWY+Q8XUjHUOgK7wx8fpvr7IFffgyXb1bnJFfX3001KmHt35Zq4tp7MXZyjJPCLPuadesDYNk41LYtVjw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.0.2", - "array-from": "^2.1.1", - "lodash.get": "^4.4.2" - } - }, - "@snyk/dep-graph": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@snyk/dep-graph/-/dep-graph-1.4.1.tgz", - "integrity": "sha512-7L096NNuNggcSjyOlITaU17n0dz0J4K4WpIHvatP4K0kIbhxolil1QbJF/+xKMRpW6OuaXILiP0hp7szhkEIzQ==", - "dev": true, - "requires": { - "graphlib": "^2.1.5", - "lodash": "^4", - "source-map-support": "^0.5.9", - "tslib": "^1.9.3" - }, - "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 - }, - "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "@snyk/gemfile": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@snyk/gemfile/-/gemfile-1.2.0.tgz", - "integrity": "sha512-nI7ELxukf7pT4/VraL4iabtNNMz8mUo7EXlqCFld8O5z6mIMLX9llps24iPpaIZOwArkY3FWA+4t+ixyvtTSIA==", - "dev": true - }, - "@storybook/addon-info": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@storybook/addon-info/-/addon-info-5.1.1.tgz", - "integrity": "sha512-E1uEx/+Erux5I/Ym5qans0oM1Dq3zA2fPROnxAp4N8LzqNTNZ/MoNDlxK0WWdNxvlotASu6McV1OSGIXjPinkw==", - "dev": true, - "requires": { - "@storybook/addons": "5.1.1", - "@storybook/client-logger": "5.1.1", - "@storybook/components": "5.1.1", - "@storybook/theming": "5.1.1", - "core-js": "^3.0.1", - "global": "^4.3.2", - "marksy": "^7.0.0", - "nested-object-assign": "^1.0.3", - "prop-types": "^15.7.2", - "react": "^16.8.4", - "react-addons-create-fragment": "^15.6.2", - "react-element-to-jsx-string": "^14.0.2", - "react-is": "^16.8.4", - "react-lifecycles-compat": "^3.0.4", - "util-deprecate": "^1.0.2" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", - "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "@storybook/components": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-5.1.1.tgz", - "integrity": "sha512-17rqqxant4zqCNxcESLZR0yAhz1mGHDz6THj8fz5rUncEnSrPYIcdvRKIfeao8yDaiK1Bh48jAjSPdfUO8BngA==", - "dev": true, - "requires": { - "@storybook/client-logger": "5.1.1", - "@storybook/theming": "5.1.1", - "core-js": "^3.0.1", - "global": "^4.3.2", - "markdown-to-jsx": "^6.9.1", - "memoizerific": "^1.11.3", - "polished": "^3.3.1", - "popper.js": "^1.14.7", - "prop-types": "^15.7.2", - "react": "^16.8.4", - "react-dom": "^16.8.4", - "react-focus-lock": "^1.18.3", - "react-helmet-async": "^1.0.2", - "react-popper-tooltip": "^2.8.3", - "react-syntax-highlighter": "^8.0.1", - "react-textarea-autosize": "^7.1.0", - "recompose": "^0.30.0", - "simplebar-react": "^1.0.0-alpha.6" - } - }, - "core-js": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.3.tgz", - "integrity": "sha512-PWZ+ZfuaKf178BIAg+CRsljwjIMRV8MY00CbZczkR6Zk5LfkSkjGoaab3+bqRQWVITNZxQB7TFYz+CFcyuamvA==", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "popper.js": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.15.0.tgz", - "integrity": "sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA==", - "dev": true - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "react": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react/-/react-16.8.6.tgz", - "integrity": "sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.13.6" - } - }, - "react-dom": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.8.6.tgz", - "integrity": "sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.13.6" - } - }, - "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", - "dev": true - }, - "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 - }, - "react-textarea-autosize": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-7.1.0.tgz", - "integrity": "sha512-c2FlR/fP0qbxmlrW96SdrbgP/v0XZMTupqB90zybvmDVDutytUgPl7beU35klwcTeMepUIQEpQUn3P3bdshGPg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.1.2", - "prop-types": "^15.6.0" - } - }, - "recompose": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.30.0.tgz", - "integrity": "sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w==", - "dev": true, - "requires": { - "@babel/runtime": "^7.0.0", - "change-emitter": "^0.1.2", - "fbjs": "^0.8.1", - "hoist-non-react-statics": "^2.3.1", - "react-lifecycles-compat": "^3.0.2", - "symbol-observable": "^1.0.4" - } - }, - "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", - "dev": true - } - } - }, - "@storybook/addon-knobs": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@storybook/addon-knobs/-/addon-knobs-3.4.3.tgz", - "integrity": "sha512-H/cq7zw435liFeL4zDwcNSH4pTjJtBwW6LekYUg9CrOkwTAN9Q165k48gbmZFoJU26hYuNonhaZUzMWzdKIrdQ==", - "dev": true, - "requires": { - "@storybook/components": "3.4.3", - "babel-runtime": "^6.26.0", - "deep-equal": "^1.0.1", - "global": "^4.3.2", - "insert-css": "^2.0.0", - "lodash.debounce": "^4.0.8", - "moment": "^2.21.0", - "prop-types": "^15.6.1", - "react-color": "^2.14.0", - "react-datetime": "^2.14.0", - "react-textarea-autosize": "^5.2.1", - "util-deprecate": "^1.0.2" - } - }, - "@storybook/addons": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-5.1.1.tgz", - "integrity": "sha512-k7EhHudEkVkv43ytaK3dh+51qWT3Mww3Ezz/uYffLDYIu3ya7KpleWnbdAJ7Zrd4Htc2Jl5RDmm8tz+JFSYtcw==", - "dev": true, - "requires": { - "@storybook/api": "5.1.1", - "@storybook/channels": "5.1.1", - "@storybook/client-logger": "5.1.1", - "core-js": "^3.0.1", - "global": "^4.3.2", - "util-deprecate": "^1.0.2" - }, - "dependencies": { - "@storybook/client-logger": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-5.1.1.tgz", - "integrity": "sha512-I0j9tGyjQpLC7dKhQuotJzaAl9j6++hJdUT5ieoqVIC4Hya15wIyc63lpa6ugXQLeRpW73x72CTFV8K+132Qow==", - "dev": true, - "requires": { - "core-js": "^3.0.1" - } - }, - "core-js": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.3.tgz", - "integrity": "sha512-PWZ+ZfuaKf178BIAg+CRsljwjIMRV8MY00CbZczkR6Zk5LfkSkjGoaab3+bqRQWVITNZxQB7TFYz+CFcyuamvA==", - "dev": true - } - } - }, - "@storybook/api": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@storybook/api/-/api-5.1.1.tgz", - "integrity": "sha512-/TuaqShnlr41guH5oH83cCOCT1JcvAhRrfxjpGjBYMxogI1/gi/07hcPsfNXIwpbH43zLvQ+sLIsRWcNeIaZGQ==", - "dev": true, - "requires": { - "@storybook/channels": "5.1.1", - "@storybook/client-logger": "5.1.1", - "@storybook/core-events": "5.1.1", - "@storybook/router": "5.1.1", - "@storybook/theming": "5.1.1", - "core-js": "^3.0.1", - "fast-deep-equal": "^2.0.1", - "global": "^4.3.2", - "lodash": "^4.17.11", - "memoizerific": "^1.11.3", - "prop-types": "^15.6.2", - "react": "^16.7.0", - "semver": "^6.0.0", - "shallow-equal": "^1.1.0", - "store2": "^2.7.1", - "telejson": "^2.2.1", - "util-deprecate": "^1.0.2" - }, - "dependencies": { - "@storybook/client-logger": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-5.1.1.tgz", - "integrity": "sha512-I0j9tGyjQpLC7dKhQuotJzaAl9j6++hJdUT5ieoqVIC4Hya15wIyc63lpa6ugXQLeRpW73x72CTFV8K+132Qow==", - "dev": true, - "requires": { - "core-js": "^3.0.1" - } - }, - "core-js": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.3.tgz", - "integrity": "sha512-PWZ+ZfuaKf178BIAg+CRsljwjIMRV8MY00CbZczkR6Zk5LfkSkjGoaab3+bqRQWVITNZxQB7TFYz+CFcyuamvA==", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "react": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react/-/react-16.8.6.tgz", - "integrity": "sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.13.6" - } - }, - "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", - "dev": true - }, - "semver": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", - "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", - "dev": true - } - } - }, - "@storybook/channel-postmessage": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-5.1.1.tgz", - "integrity": "sha512-kFsLv5Sbgbp431d3aNgrPioGE+oCtXlUVSFh9711ZulARfqgAZMDDWxVnTaiuHBIf5yjfpDLn9ZqohheZCKScg==", - "dev": true, - "requires": { - "@storybook/channels": "5.1.1", - "@storybook/client-logger": "5.1.1", - "core-js": "^3.0.1", - "global": "^4.3.2", - "telejson": "^2.2.1" - }, - "dependencies": { - "@storybook/client-logger": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-5.1.1.tgz", - "integrity": "sha512-I0j9tGyjQpLC7dKhQuotJzaAl9j6++hJdUT5ieoqVIC4Hya15wIyc63lpa6ugXQLeRpW73x72CTFV8K+132Qow==", - "dev": true, - "requires": { - "core-js": "^3.0.1" - } - }, - "core-js": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.3.tgz", - "integrity": "sha512-PWZ+ZfuaKf178BIAg+CRsljwjIMRV8MY00CbZczkR6Zk5LfkSkjGoaab3+bqRQWVITNZxQB7TFYz+CFcyuamvA==", - "dev": true - } - } - }, - "@storybook/channels": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-5.1.1.tgz", - "integrity": "sha512-IaOEFKdAYCMK5veEFEbauOqNOwD6ro02X50TN91Oz/t2kA1ktkSvBA/0+JjhP9KvkKFQ+fh6TltqpIJHIB4oqw==", - "dev": true, - "requires": { - "core-js": "^3.0.1" - }, - "dependencies": { - "core-js": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.3.tgz", - "integrity": "sha512-PWZ+ZfuaKf178BIAg+CRsljwjIMRV8MY00CbZczkR6Zk5LfkSkjGoaab3+bqRQWVITNZxQB7TFYz+CFcyuamvA==", - "dev": true - } - } - }, - "@storybook/client-api": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-5.1.1.tgz", - "integrity": "sha512-rCu1kpfM/Jg8rYz2HBD2j+TaZ0twUrZR5EYs5tJve4CBGpMFKbRxu4jLjkVCEkAwTVCT+glEs586+kktVSyOLQ==", - "dev": true, - "requires": { - "@storybook/addons": "5.1.1", - "@storybook/client-logger": "5.1.1", - "@storybook/core-events": "5.1.1", - "@storybook/router": "5.1.1", - "common-tags": "^1.8.0", - "core-js": "^3.0.1", - "eventemitter3": "^3.1.0", - "global": "^4.3.2", - "is-plain-object": "^3.0.0", - "lodash": "^4.17.11", - "memoizerific": "^1.11.3", - "qs": "^6.6.0" - }, - "dependencies": { - "@storybook/client-logger": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-5.1.1.tgz", - "integrity": "sha512-I0j9tGyjQpLC7dKhQuotJzaAl9j6++hJdUT5ieoqVIC4Hya15wIyc63lpa6ugXQLeRpW73x72CTFV8K+132Qow==", - "dev": true, - "requires": { - "core-js": "^3.0.1" - } - }, - "core-js": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.3.tgz", - "integrity": "sha512-PWZ+ZfuaKf178BIAg+CRsljwjIMRV8MY00CbZczkR6Zk5LfkSkjGoaab3+bqRQWVITNZxQB7TFYz+CFcyuamvA==", - "dev": true - }, - "is-plain-object": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", - "integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==", - "dev": true, - "requires": { - "isobject": "^4.0.0" - } - }, - "isobject": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", - "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - } - } - }, - "@storybook/client-logger": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-5.1.1.tgz", - "integrity": "sha512-I0j9tGyjQpLC7dKhQuotJzaAl9j6++hJdUT5ieoqVIC4Hya15wIyc63lpa6ugXQLeRpW73x72CTFV8K+132Qow==", - "dev": true, - "requires": { - "core-js": "^3.0.1" - }, - "dependencies": { - "core-js": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.3.tgz", - "integrity": "sha512-PWZ+ZfuaKf178BIAg+CRsljwjIMRV8MY00CbZczkR6Zk5LfkSkjGoaab3+bqRQWVITNZxQB7TFYz+CFcyuamvA==", - "dev": true - } - } - }, - "@storybook/components": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-3.4.3.tgz", - "integrity": "sha512-++sBqTD6V6nZ5EaY8ecW+rMtgLEQBP18d2b2OYAdMuDffIKL7olfcgmlW9bchm40zLecbV5TGTjZFGbXXJ4sWw==", - "dev": true, - "requires": { - "glamor": "^2.20.40", - "glamorous": "^4.12.1", - "prop-types": "^15.6.1" - } - }, - "@storybook/core": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@storybook/core/-/core-5.1.1.tgz", - "integrity": "sha512-09/EcL6Ev6HY1OlzE95CYrsb2U8gPxgvn1l/nQQwwG8XDwd5eQNWzTggCfu+jTdm/JIzfp6k6T1SruZsAX+YXA==", - "dev": true, - "requires": { - "@babel/plugin-proposal-class-properties": "^7.3.3", - "@babel/plugin-proposal-object-rest-spread": "^7.3.2", - "@babel/plugin-syntax-dynamic-import": "^7.2.0", - "@babel/plugin-transform-react-constant-elements": "^7.2.0", - "@babel/preset-env": "^7.4.5", - "@storybook/addons": "5.1.1", - "@storybook/channel-postmessage": "5.1.1", - "@storybook/client-api": "5.1.1", - "@storybook/client-logger": "5.1.1", - "@storybook/core-events": "5.1.1", - "@storybook/node-logger": "5.1.1", - "@storybook/router": "5.1.1", - "@storybook/theming": "5.1.1", - "@storybook/ui": "5.1.1", - "airbnb-js-shims": "^1 || ^2", - "autoprefixer": "^9.4.9", - "babel-plugin-add-react-displayname": "^0.0.5", - "babel-plugin-emotion": "^10.0.9", - "babel-plugin-macros": "^2.4.5", - "babel-preset-minify": "^0.5.0 || 0.6.0-alpha.5", - "boxen": "^3.0.0", - "case-sensitive-paths-webpack-plugin": "^2.2.0", - "chalk": "^2.4.2", - "cli-table3": "0.5.1", - "commander": "^2.19.0", - "common-tags": "^1.8.0", - "core-js": "^3.0.1", - "css-loader": "^2.1.1", - "detect-port": "^1.3.0", - "dotenv-webpack": "^1.7.0", - "ejs": "^2.6.1", - "express": "^4.17.0", - "file-loader": "^3.0.1", - "file-system-cache": "^1.0.5", - "find-cache-dir": "^3.0.0", - "fs-extra": "^8.0.1", - "global": "^4.3.2", - "html-webpack-plugin": "^4.0.0-beta.2", - "inquirer": "^6.2.0", - "interpret": "^1.2.0", - "ip": "^1.1.5", - "json5": "^2.1.0", - "lazy-universal-dotenv": "^2.0.0", - "node-fetch": "^2.6.0", - "open": "^6.1.0", - "postcss-flexbugs-fixes": "^4.1.0", - "postcss-loader": "^3.0.0", - "pretty-hrtime": "^1.0.3", - "qs": "^6.6.0", - "raw-loader": "^2.0.0", - "react-dev-utils": "^9.0.0", - "regenerator-runtime": "^0.12.1", - "resolve": "^1.11.0", - "resolve-from": "^5.0.0", - "semver": "^6.0.0", - "serve-favicon": "^2.5.0", - "shelljs": "^0.8.3", - "style-loader": "^0.23.1", - "terser-webpack-plugin": "^1.2.4", - "url-loader": "^1.1.2", - "util-deprecate": "^1.0.2", - "webpack": "^4.32.0", - "webpack-dev-middleware": "^3.7.0", - "webpack-hot-middleware": "^2.25.0" - }, - "dependencies": { - "@storybook/client-logger": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-5.1.1.tgz", - "integrity": "sha512-I0j9tGyjQpLC7dKhQuotJzaAl9j6++hJdUT5ieoqVIC4Hya15wIyc63lpa6ugXQLeRpW73x72CTFV8K+132Qow==", - "dev": true, - "requires": { - "core-js": "^3.0.1" - } - }, - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", - "dev": true - }, - "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", - "dev": true, - "requires": { - "string-width": "^3.0.0" - } - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "autoprefixer": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.0.tgz", - "integrity": "sha512-kuip9YilBqhirhHEGHaBTZKXL//xxGnzvsD0FtBQa6z+A69qZD6s/BAX9VzDF1i9VKDquTJDQaPLSEhOnL6FvQ==", - "dev": true, - "requires": { - "browserslist": "^4.6.1", - "caniuse-lite": "^1.0.30000971", - "chalk": "^2.4.2", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.16", - "postcss-value-parser": "^3.3.1" - } - }, - "boxen": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-3.2.0.tgz", - "integrity": "sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^2.4.2", - "cli-boxes": "^2.2.0", - "string-width": "^3.0.0", - "term-size": "^1.2.0", - "type-fest": "^0.3.0", - "widest-line": "^2.0.0" - } - }, - "browserslist": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.1.tgz", - "integrity": "sha512-1MC18ooMPRG2UuVFJTHFIAkk6mpByJfxCrnUyvSlu/hyQSFHMrlhM02SzNuCV+quTP4CKmqtOMAIjrifrpBJXQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000971", - "electron-to-chromium": "^1.3.137", - "node-releases": "^1.1.21" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30000973", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000973.tgz", - "integrity": "sha512-/F3t/Yo8LEdRSEPCmI15fLu5vepVh9UCg/9inJXF5AAfW7xRRJkbaM2ut52iRMQMnGCLQouLbFdbOA+VEFOIsg==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "cli-boxes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", - "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==", - "dev": true - }, - "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "dev": true - }, - "core-js": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.3.tgz", - "integrity": "sha512-PWZ+ZfuaKf178BIAg+CRsljwjIMRV8MY00CbZczkR6Zk5LfkSkjGoaab3+bqRQWVITNZxQB7TFYz+CFcyuamvA==", - "dev": true - }, - "css-loader": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz", - "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==", - "dev": true, - "requires": { - "camelcase": "^5.2.0", - "icss-utils": "^4.1.0", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.14", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^2.0.6", - "postcss-modules-scope": "^2.1.0", - "postcss-modules-values": "^2.0.0", - "postcss-value-parser": "^3.3.0", - "schema-utils": "^1.0.0" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.146", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.146.tgz", - "integrity": "sha512-BrUq08sx7eR4PCwLbjFxXmjcbDro6DSoc1pN8VCxq76U+o9JQzJlWH/NVtcpAqcktwpE5CVvMyqHqTQfCETNoQ==", - "dev": true - }, - "external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "file-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", - "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==", - "dev": true, - "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^1.0.0" - } - }, - "fs-extra": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.0.1.tgz", - "integrity": "sha512-W+XLrggcDzlle47X/XnS7FXrXu9sDo+Ze9zpndeBxdgv88FHLm1HtmkhEwavruS6koanBjp098rUpHs65EmG7A==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } - }, - "inquirer": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", - "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.11", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - } - } - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "postcss": { - "version": "7.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", - "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } - }, - "postcss-modules-local-by-default": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz", - "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0", - "postcss-value-parser": "^3.3.1" - } - }, - "postcss-modules-scope": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz", - "integrity": "sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - } - }, - "postcss-modules-values": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", - "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", - "dev": true, - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^7.0.6" - } - }, - "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", - "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", - "dev": true - }, - "resolve": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", - "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", - "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", - "dev": true - }, - "shelljs": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", - "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "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 - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "style-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - } - } - }, - "@storybook/core-events": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-5.1.1.tgz", - "integrity": "sha512-5mxaz4azHkeuZcejwY6NNWFzPrUqn7OnU/rrzgJbxXoKps9Q0p2EmVdD0sh9nLuhVqvOvMdzOiwSerra6aVJiw==", - "dev": true, - "requires": { - "core-js": "^3.0.1" - }, - "dependencies": { - "core-js": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.3.tgz", - "integrity": "sha512-PWZ+ZfuaKf178BIAg+CRsljwjIMRV8MY00CbZczkR6Zk5LfkSkjGoaab3+bqRQWVITNZxQB7TFYz+CFcyuamvA==", - "dev": true - } - } - }, - "@storybook/node-logger": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-5.1.1.tgz", - "integrity": "sha512-fQ3scxoc3+v9xU1q4C1UqMtJ8rOXW6j51q7mI8vxSzCauKCSdODp3YvsNeu9FmCohrH1TqZUYsq3y6Tk9oDZrw==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "core-js": "^3.0.1", - "npmlog": "^4.1.2", - "pretty-hrtime": "^1.0.3", - "regenerator-runtime": "^0.12.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "core-js": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.3.tgz", - "integrity": "sha512-PWZ+ZfuaKf178BIAg+CRsljwjIMRV8MY00CbZczkR6Zk5LfkSkjGoaab3+bqRQWVITNZxQB7TFYz+CFcyuamvA==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "regenerator-runtime": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", - "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@storybook/react": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-5.1.1.tgz", - "integrity": "sha512-6iAwEekEF0MKeVCogyeRHvKNShmHu4LQPqERRKwJnzbmK+Mr9cx4GS0t2lok9QNruNWNdoe8U3zOvlAI0FimBQ==", - "dev": true, - "requires": { - "@babel/plugin-transform-react-constant-elements": "^7.2.0", - "@babel/preset-flow": "^7.0.0", - "@babel/preset-react": "^7.0.0", - "@storybook/core": "5.1.1", - "@storybook/node-logger": "5.1.1", - "@svgr/webpack": "^4.0.3", - "babel-plugin-named-asset-import": "^0.3.1", - "babel-plugin-react-docgen": "^3.0.0", - "babel-preset-react-app": "^9.0.0", - "common-tags": "^1.8.0", - "core-js": "^3.0.1", - "global": "^4.3.2", - "lodash": "^4.17.11", - "mini-css-extract-plugin": "^0.7.0", - "prop-types": "^15.7.2", - "react-dev-utils": "^9.0.0", - "regenerator-runtime": "^0.12.1", - "semver": "^6.0.0", - "webpack": "^4.28.0" - }, - "dependencies": { - "core-js": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.3.tgz", - "integrity": "sha512-PWZ+ZfuaKf178BIAg+CRsljwjIMRV8MY00CbZczkR6Zk5LfkSkjGoaab3+bqRQWVITNZxQB7TFYz+CFcyuamvA==", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", - "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", - "dev": true - }, - "semver": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", - "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", - "dev": true - } - } - }, - "@storybook/router": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-5.1.1.tgz", - "integrity": "sha512-w8tREuJG6eav5uqJXqjkmcmymHqJ7HG9kLPqrp60VhliU7tnkcelDZmdIRk49C51AkHYj+s5hLo8HWSy76g21Q==", - "dev": true, - "requires": { - "@reach/router": "^1.2.1", - "core-js": "^3.0.1", - "global": "^4.3.2", - "memoizerific": "^1.11.3", - "qs": "^6.6.0" - }, - "dependencies": { - "core-js": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.3.tgz", - "integrity": "sha512-PWZ+ZfuaKf178BIAg+CRsljwjIMRV8MY00CbZczkR6Zk5LfkSkjGoaab3+bqRQWVITNZxQB7TFYz+CFcyuamvA==", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - } - } - }, - "@storybook/theming": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-5.1.1.tgz", - "integrity": "sha512-70Pf6XZnTI4wniItQxIhAOQjVi7fDRzR3xZUIBC+pEatbKD+OoyFOALwkww5uW66jeWBYC5AhRPEHWo7ylcXUQ==", - "dev": true, - "requires": { - "@emotion/core": "^10.0.9", - "@emotion/styled": "^10.0.7", - "@storybook/client-logger": "5.1.1", - "common-tags": "^1.8.0", - "core-js": "^3.0.1", - "deep-object-diff": "^1.1.0", - "emotion-theming": "^10.0.9", - "global": "^4.3.2", - "memoizerific": "^1.11.3", - "polished": "^3.3.1", - "prop-types": "^15.7.2", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "@storybook/client-logger": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-5.1.1.tgz", - "integrity": "sha512-I0j9tGyjQpLC7dKhQuotJzaAl9j6++hJdUT5ieoqVIC4Hya15wIyc63lpa6ugXQLeRpW73x72CTFV8K+132Qow==", - "dev": true, - "requires": { - "core-js": "^3.0.1" - } - }, - "core-js": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.3.tgz", - "integrity": "sha512-PWZ+ZfuaKf178BIAg+CRsljwjIMRV8MY00CbZczkR6Zk5LfkSkjGoaab3+bqRQWVITNZxQB7TFYz+CFcyuamvA==", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", - "dev": true - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@storybook/ui": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-5.1.1.tgz", - "integrity": "sha512-hIVH1HWak93p+jvWrlaA8SepLsdRxooqF9AEJkNM7M95f9P0DiwTeeEKmGkI6h2pmIxLSNNgrxZDHQXYGGCVAw==", - "dev": true, - "requires": { - "@storybook/addons": "5.1.1", - "@storybook/api": "5.1.1", - "@storybook/client-logger": "5.1.1", - "@storybook/components": "5.1.1", - "@storybook/core-events": "5.1.1", - "@storybook/router": "5.1.1", - "@storybook/theming": "5.1.1", - "copy-to-clipboard": "^3.0.8", - "core-js": "^3.0.1", - "core-js-pure": "^3.0.1", - "fast-deep-equal": "^2.0.1", - "fuse.js": "^3.4.4", - "global": "^4.3.2", - "lodash": "^4.17.11", - "markdown-to-jsx": "^6.9.3", - "memoizerific": "^1.11.3", - "polished": "^3.3.1", - "prop-types": "^15.7.2", - "qs": "^6.6.0", - "react": "^16.8.4", - "react-dom": "^16.8.4", - "react-draggable": "^3.1.1", - "react-helmet-async": "^1.0.2", - "react-hotkeys": "2.0.0-pre4", - "react-resize-detector": "^4.0.5", - "recompose": "^0.30.0", - "resolve-from": "^5.0.0", - "semver": "^6.0.0", - "store2": "^2.7.1", - "telejson": "^2.2.1", - "util-deprecate": "^1.0.2" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", - "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "@storybook/client-logger": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-5.1.1.tgz", - "integrity": "sha512-I0j9tGyjQpLC7dKhQuotJzaAl9j6++hJdUT5ieoqVIC4Hya15wIyc63lpa6ugXQLeRpW73x72CTFV8K+132Qow==", - "dev": true, - "requires": { - "core-js": "^3.0.1" - } - }, - "@storybook/components": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-5.1.1.tgz", - "integrity": "sha512-17rqqxant4zqCNxcESLZR0yAhz1mGHDz6THj8fz5rUncEnSrPYIcdvRKIfeao8yDaiK1Bh48jAjSPdfUO8BngA==", - "dev": true, - "requires": { - "@storybook/client-logger": "5.1.1", - "@storybook/theming": "5.1.1", - "core-js": "^3.0.1", - "global": "^4.3.2", - "markdown-to-jsx": "^6.9.1", - "memoizerific": "^1.11.3", - "polished": "^3.3.1", - "popper.js": "^1.14.7", - "prop-types": "^15.7.2", - "react": "^16.8.4", - "react-dom": "^16.8.4", - "react-focus-lock": "^1.18.3", - "react-helmet-async": "^1.0.2", - "react-popper-tooltip": "^2.8.3", - "react-syntax-highlighter": "^8.0.1", - "react-textarea-autosize": "^7.1.0", - "recompose": "^0.30.0", - "simplebar-react": "^1.0.0-alpha.6" - } - }, - "core-js": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.3.tgz", - "integrity": "sha512-PWZ+ZfuaKf178BIAg+CRsljwjIMRV8MY00CbZczkR6Zk5LfkSkjGoaab3+bqRQWVITNZxQB7TFYz+CFcyuamvA==", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fuse.js": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.4.5.tgz", - "integrity": "sha512-s9PGTaQIkT69HaeoTVjwGsLfb8V8ScJLx5XGFcKHg0MqLUH/UZ4EKOtqtXX9k7AFqCGxD1aJmYb8Q5VYDibVRQ==", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "popper.js": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.15.0.tgz", - "integrity": "sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA==", - "dev": true - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - }, - "react": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react/-/react-16.8.6.tgz", - "integrity": "sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.13.6" - } - }, - "react-dom": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.8.6.tgz", - "integrity": "sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.13.6" - } - }, - "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", - "dev": true - }, - "react-textarea-autosize": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-7.1.0.tgz", - "integrity": "sha512-c2FlR/fP0qbxmlrW96SdrbgP/v0XZMTupqB90zybvmDVDutytUgPl7beU35klwcTeMepUIQEpQUn3P3bdshGPg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.1.2", - "prop-types": "^15.6.0" - } - }, - "recompose": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.30.0.tgz", - "integrity": "sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w==", - "dev": true, - "requires": { - "@babel/runtime": "^7.0.0", - "change-emitter": "^0.1.2", - "fbjs": "^0.8.1", - "hoist-non-react-statics": "^2.3.1", - "react-lifecycles-compat": "^3.0.2", - "symbol-observable": "^1.0.4" - } - }, - "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", - "dev": true - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "semver": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", - "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", - "dev": true - } - } - }, - "@svgr/babel-plugin-add-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==", - "dev": true - }, - "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz", - "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==", - "dev": true - }, - "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz", - "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==", - "dev": true - }, - "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz", - "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==", - "dev": true - }, - "@svgr/babel-plugin-svg-dynamic-title": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.0.tgz", - "integrity": "sha512-3eI17Pb3jlg3oqV4Tie069n1SelYKBUpI90txDcnBWk4EGFW+YQGyQjy6iuJAReH0RnpUJ9jUExrt/xniGvhqw==", - "dev": true - }, - "@svgr/babel-plugin-svg-em-dimensions": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz", - "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==", - "dev": true - }, - "@svgr/babel-plugin-transform-react-native-svg": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz", - "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==", - "dev": true - }, - "@svgr/babel-plugin-transform-svg-component": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz", - "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==", - "dev": true - }, - "@svgr/babel-preset": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.0.tgz", - "integrity": "sha512-Lgy1RJiZumGtv6yJroOxzFuL64kG/eIcivJQ7y9ljVWL+0QXvFz4ix1xMrmjMD+rpJWwj50ayCIcFelevG/XXg==", - "dev": true, - "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", - "@svgr/babel-plugin-svg-dynamic-title": "^4.3.0", - "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", - "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", - "@svgr/babel-plugin-transform-svg-component": "^4.2.0" - } - }, - "@svgr/core": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.0.tgz", - "integrity": "sha512-Ycu1qrF5opBgKXI0eQg3ROzupalCZnSDETKCK/3MKN4/9IEmt3jPX/bbBjftklnRW+qqsCEpO0y/X9BTRw2WBg==", - "dev": true, - "requires": { - "@svgr/plugin-jsx": "^4.3.0", - "camelcase": "^5.3.1", - "cosmiconfig": "^5.2.0" - }, - "dependencies": { - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "@svgr/hast-util-to-babel-ast": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.2.0.tgz", - "integrity": "sha512-IvAeb7gqrGB5TH9EGyBsPrMRH/QCzIuAkLySKvH2TLfLb2uqk98qtJamordRQTpHH3e6TORfBXoTo7L7Opo/Ow==", - "dev": true, - "requires": { - "@babel/types": "^7.4.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@svgr/plugin-jsx": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.0.tgz", - "integrity": "sha512-0ab8zJdSOTqPfjZtl89cjq2IOmXXUYV3Fs7grLT9ur1Al3+x3DSp2+/obrYKUGbQUnLq96RMjSZ7Icd+13vwlQ==", - "dev": true, - "requires": { - "@babel/core": "^7.4.3", - "@svgr/babel-preset": "^4.3.0", - "@svgr/hast-util-to-babel-ast": "^4.2.0", - "rehype-parse": "^6.0.0", - "unified": "^7.1.0", - "vfile": "^4.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", - "dev": true - }, - "unified": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-7.1.0.tgz", - "integrity": "sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "@types/vfile": "^3.0.0", - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^1.1.0", - "trough": "^1.0.0", - "vfile": "^3.0.0", - "x-is-string": "^0.1.0" - }, - "dependencies": { - "vfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz", - "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==", - "dev": true, - "requires": { - "is-buffer": "^2.0.0", - "replace-ext": "1.0.0", - "unist-util-stringify-position": "^1.0.0", - "vfile-message": "^1.0.0" - } - } - } - }, - "vfile": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.0.1.tgz", - "integrity": "sha512-lRHFCuC4SQBFr7Uq91oJDJxlnftoTLQ7eKIpMdubhYcVMho4781a8MWXLy3qZrZ0/STD1kRiKc0cQOHm4OkPeA==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "replace-ext": "1.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - }, - "dependencies": { - "unist-util-stringify-position": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.1.tgz", - "integrity": "sha512-Zqlf6+FRI39Bah8Q6ZnNGrEHUhwJOkHde2MHVk96lLyftfJJckaPslKgzhVcviXj8KcE9UJM9F+a4JEiBUTYgA==", - "dev": true, - "requires": { - "@types/unist": "^2.0.2" - } - }, - "vfile-message": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.1.tgz", - "integrity": "sha512-KtasSV+uVU7RWhUn4Lw+wW1Zl/nW8JWx7JCPps10Y9JRRIDeDXf8wfBLoOSsJLyo27DqMyAi54C6Jf/d6Kr2Bw==", - "dev": true, - "requires": { - "@types/unist": "^2.0.2", - "unist-util-stringify-position": "^2.0.0" - } - } - } - } - } - }, - "@svgr/plugin-svgo": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.2.0.tgz", - "integrity": "sha512-zUEKgkT172YzHh3mb2B2q92xCnOAMVjRx+o0waZ1U50XqKLrVQ/8dDqTAtnmapdLsGurv8PSwenjLCUpj6hcvw==", - "dev": true, - "requires": { - "cosmiconfig": "^5.2.0", - "merge-deep": "^3.0.2", - "svgo": "^1.2.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dev": true, - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - } - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "css-select": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.0.2.tgz", - "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^2.1.2", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "dev": true - }, - "csso": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", - "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==", - "dev": true, - "requires": { - "css-tree": "1.0.0-alpha.29" - }, - "dependencies": { - "css-tree": { - "version": "1.0.0-alpha.29", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", - "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", - "dev": true, - "requires": { - "mdn-data": "~1.1.0", - "source-map": "^0.5.3" - } - } - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.values": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", - "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "svgo": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.2.2.tgz", - "integrity": "sha512-rAfulcwp2D9jjdGu+0CuqlrAUin6bBWrpoqXWwKDZZZJfXcUXQSxLJOFJCQCSA0x0pP2U0TxSlJu2ROq5Bq6qA==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.28", - "css-url-regex": "^1.1.0", - "csso": "^3.5.1", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - } - } - } - }, - "@svgr/webpack": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.0.tgz", - "integrity": "sha512-rYcwi1pUnaZoOUEa8xhrX10FHnONvube1WBoJ5PQf/Cbl0GuiUUSdXSVaFgxWdeyv6jCG0vWH1mrCHhspaJv1Q==", - "dev": true, - "requires": { - "@babel/core": "^7.4.3", - "@babel/plugin-transform-react-constant-elements": "^7.0.0", - "@babel/preset-env": "^7.4.3", - "@babel/preset-react": "^7.0.0", - "@svgr/core": "^4.3.0", - "@svgr/plugin-jsx": "^4.3.0", - "@svgr/plugin-svgo": "^4.2.0", - "loader-utils": "^1.2.3" - } - }, - "@types/debug": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.4.tgz", - "integrity": "sha512-D9MyoQFI7iP5VdpEyPZyjjqIJ8Y8EDNQFIFVLOmeg1rI1xiHOChyUPMPRUVfqFCerxfE+yS3vMyj37F6IdtOoQ==", - "dev": true - }, - "@types/invariant": { - "version": "2.2.29", - "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.29.tgz", - "integrity": "sha512-lRVw09gOvgviOfeUrKc/pmTiRZ7g7oDOU6OAutyuSHpm1/o2RaBQvRhgK8QEdu+FFuw/wnWb29A/iuxv9i8OpQ==" - }, - "@types/lodash": { - "version": "4.14.124", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.124.tgz", - "integrity": "sha512-6bKEUVbHJ8z34jisA7lseJZD2g31SIvee3cGX2KEZCS4XXWNbjPZpmO1/2rGNR9BhGtaYr6iYXPl1EzRrDAFTA==" - }, - "@types/node": { - "version": "8.5.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.5.5.tgz", - "integrity": "sha512-JRnfoh0Ll4ElmIXKxbUfcOodkGvcNHljct6mO1X9hE/mlrMzAx0hYCLAD7sgT53YAY1HdlpzUcV0CkmDqUqTuA==", - "dev": true - }, - "@types/q": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", - "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", - "dev": true - }, - "@types/react": { - "version": "16.3.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.3.14.tgz", - "integrity": "sha512-wNUGm49fPl7eE2fnYdF0v5vSOrUMdKMQD/4NwtQRnb6mnPwtkhabmuFz37eq90+hhyfz0pWd38jkZHOcaZ6LGw==", - "requires": { - "csstype": "^2.2.0" - } - }, - "@types/react-transition-group": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-2.0.9.tgz", - "integrity": "sha512-Id2MtQcmOgLymqqLqg1VjzNpN7O5vGoF47h3s7jxhzqWdMCtk2GwxFUqcKbGrRmHzzQGyRatfG8yahonIys74Q==", - "requires": { - "@types/react": "*" - } - }, - "@types/redux": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@types/redux/-/redux-3.6.0.tgz", - "integrity": "sha1-8evh5UEVGAcuT9/KXHbhbnTBOZo=", - "requires": { - "redux": "*" - } - }, - "@types/unist": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", - "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==", - "dev": true - }, - "@types/vfile": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/vfile/-/vfile-3.0.2.tgz", - "integrity": "sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/unist": "*", - "@types/vfile-message": "*" - } - }, - "@types/vfile-message": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-1.0.1.tgz", - "integrity": "sha512-mlGER3Aqmq7bqR1tTTIVHq8KSAFFRyGbrxuM8C/H82g6k7r2fS+IMEkIu3D7JHzG10NvPdR8DNx0jr0pwpp4dA==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/unist": "*" - } - }, - "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, - "@zxing/library": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@zxing/library/-/library-0.8.0.tgz", - "integrity": "sha512-D7oopukr7cJ0Va01Er2zXiSPXvmvc6D1PpOq/THRvd/57yEsBs+setRsiDo7tSRnYHcw7FrRZSZ7rwyzNSLJeA==", - "requires": { - "text-encoding": "^0.6.4", - "ts-custom-error": "^2.2.1" - } - }, - "JSONStream": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz", - "integrity": "sha1-wQI3G27Dp887hHygDCC7D85Mbeo=", - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "abab": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", - "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "abi-decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/abi-decoder/-/abi-decoder-1.2.0.tgz", - "integrity": "sha512-y2OKSEW4gf2838Eavc56vQY9V46zaXkf3Jl1WpTfUBbzAVrXSr4JRZAAWv55Tv9s5WNz1rVgBgz5d2aJIL1QCg==", - "requires": { - "web3": "^0.18.4" - }, - "dependencies": { - "bignumber.js": { - "version": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", - "from": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2" - }, - "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": "*" - } - } - } - }, - "abortcontroller-polyfill": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.3.0.tgz", - "integrity": "sha512-lbWQgf+eRvku3va8poBlDBO12FigTQr9Zb7NIjXrePrhxWVKdCP2wbDl1tLDaYa18PWTom3UEWwdH13S46I+yA==", - "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.4", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", - "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", - "dev": true, - "requires": { - "mime-types": "~2.1.16", - "negotiator": "0.6.1" - } - }, - "accounting": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/accounting/-/accounting-0.4.1.tgz", - "integrity": "sha1-h91BA+/39EYPHhhvXGd+1s9WaIM=" - }, - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" - }, - "acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", - "dev": true - }, - "acorn-globals": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz", - "integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==", - "dev": true, - "requires": { - "acorn": "^5.0.0" - }, - "dependencies": { - "acorn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", - "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==", - "dev": true - } - } - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "^3.0.4" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } - }, - "acorn-node": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.6.2.tgz", - "integrity": "sha512-rIhNEZuNI8ibQcL7ANm/mGyPukIaZsRNX9psFNQURyJW0nu6k8wjSDld20z6v2mDBWqX13pIEnk9gGZJHIlEXg==", - "dev": true, - "requires": { - "acorn": "^6.0.2", - "acorn-dynamic-import": "^4.0.0", - "acorn-walk": "^6.1.0", - "xtend": "^4.0.1" - }, - "dependencies": { - "acorn": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.4.tgz", - "integrity": "sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==", - "dev": true - }, - "acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", - "dev": true - } - } - }, - "acorn-walk": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", - "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", - "dev": true - }, - "addons-linter": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/addons-linter/-/addons-linter-1.10.0.tgz", - "integrity": "sha512-2i2qSayVPx4h1Aa2ZTdQlpgmjcCNIHZ4AJQS8V/QsBXIdmXl+Djmeyr096bjaC3Usq0rZfYhGgFdwR1dgHVItw==", - "dev": true, - "requires": { - "ajv": "6.10.0", - "ajv-merge-patch": "4.1.0", - "chalk": "2.4.2", - "cheerio": "1.0.0-rc.3", - "columnify": "1.5.4", - "common-tags": "1.8.0", - "crx-parser": "0.1.2", - "deepmerge": "3.2.0", - "dispensary": "0.37.0", - "es6-promisify": "6.0.1", - "eslint": "5.16.0", - "eslint-plugin-no-unsafe-innerhtml": "1.0.16", - "eslint-visitor-keys": "1.0.0", - "espree": "5.0.1", - "esprima": "4.0.1", - "first-chunk-stream": "3.0.0", - "fluent-syntax": "0.13.0", - "fsevents": "2.0.7", - "glob": "7.1.4", - "is-mergeable-object": "1.1.0", - "jed": "1.1.1", - "mdn-browser-compat-data": "0.0.82", - "os-locale": "3.1.0", - "pino": "5.12.6", - "po2json": "0.4.5", - "postcss": "7.0.16", - "probe-image-size": "4.0.0", - "regenerator-runtime": "0.13.2", - "relaxed-json": "1.0.3", - "semver": "6.1.1", - "source-map-support": "0.5.12", - "strip-bom-stream": "4.0.0", - "tosource": "1.0.0", - "upath": "1.1.2", - "whatwg-url": "7.0.0", - "yargs": "13.2.4", - "yauzl": "2.10.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", - "dev": true - }, - "acorn-jsx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", - "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", - "dev": true - }, - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "cheerio": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", - "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", - "dev": true, - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.1", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - } - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deepmerge": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.2.0.tgz", - "integrity": "sha512-6+LuZGU7QCNUnAJyX8cIrlzoEgggTM6B7mm+znKOX4t5ltluT9KLjN6g61ECMS0LTsLW7yDpNoxhix5FZcrIow==", - "dev": true - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "es6-promisify": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.0.1.tgz", - "integrity": "sha512-J3ZkwbEnnO+fGAKrjVpeUAnZshAdfZvbhQpqfIH9kSAspReRC4nJnu8ewm55b4y9ElyeuhCTzJD0XiH8Tsbhlw==", - "dev": true - }, - "eslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", - "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.13.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.11", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0" - }, - "dependencies": { - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - } - } - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "espree": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", - "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", - "dev": true, - "requires": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "fsevents": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.7.tgz", - "integrity": "sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==", - "dev": true, - "optional": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "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" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "inquirer": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", - "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.11", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "postcss": { - "version": "7.0.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", - "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", - "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, - "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 - }, - "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "table": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.0.tgz", - "integrity": "sha512-nHFDrxmbrkU7JAFKqKbDJXfzrX2UBsWmrieXFTGxiI5e4ncg3VqsZeI4EzNmX0ncp4XNGVeoxIWJXfCIXwrsvw==", - "dev": true, - "requires": { - "ajv": "^6.9.1", - "lodash": "^4.17.11", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "whatwg-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", - "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yargs": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", - "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "yargs-parser": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.0.tgz", - "integrity": "sha512-Yq+32PrijHRri0vVKQEm+ys8mbqWjLiwQkMFNXEENutzLPP0bE4Lcd4iA3OQY5HF+GD3xXxf0MEHb8E4/SA3AA==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - } - } - }, - "address": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.0.tgz", - "integrity": "sha512-4diPfzWbLEIElVG4AnqP+00SULlPzNuyJFNnmMrLgyaxG6tZXJ1sn7mjBu4fHrJE+Yp/jgylOweJn2xsLMFggQ==", - "dev": true - }, - "adjust-sourcemap-loader": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-1.2.0.tgz", - "integrity": "sha512-958oaHHVEXMvsY7v7cC5gEkNIcoaAVIhZ4mBReYVZJOTP9IgKmzLjIOhTtzpLMu+qriXvLsVjJ155EeInp45IQ==", - "dev": true, - "requires": { - "assert": "^1.3.0", - "camelcase": "^1.2.1", - "loader-utils": "^1.1.0", - "lodash.assign": "^4.0.1", - "lodash.defaults": "^3.1.2", - "object-path": "^0.9.2", - "regex-parser": "^2.2.9" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" - } - }, - "lodash.defaults": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz", - "integrity": "sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw=", - "dev": true, - "requires": { - "lodash.assign": "^3.0.0", - "lodash.restparam": "^3.0.0" - }, - "dependencies": { - "lodash.assign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", - "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", - "dev": true, - "requires": { - "lodash._baseassign": "^3.0.0", - "lodash._createassigner": "^3.0.0", - "lodash.keys": "^3.0.0" - } - } - } - } - } - }, - "adm-zip": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz", - "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==", - "dev": true - }, - "aes-js": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-0.2.4.tgz", - "integrity": "sha1-lLiBq3FyhtAV+iGeCPtmcJ3aWj0=" - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true - }, - "agent-base": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz", - "integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==", - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "agentkeepalive": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", - "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", - "requires": { - "humanize-ms": "^1.2.1" - } - }, - "airbnb-js-shims": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/airbnb-js-shims/-/airbnb-js-shims-2.2.0.tgz", - "integrity": "sha512-pcSQf1+Kx7/0ibRmxj6rmMYc5V8SHlKu+rkQ80h0bjSLDaIxHg/3PiiFJi4A9mDc01CoBHoc8Fls2G/W0/+s5g==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "array.prototype.flat": "^1.2.1", - "array.prototype.flatmap": "^1.2.1", - "es5-shim": "^4.5.13", - "es6-shim": "^0.35.5", - "function.prototype.name": "^1.1.0", - "globalthis": "^1.0.0", - "object.entries": "^1.1.0", - "object.fromentries": "^2.0.0 || ^1.0.0", - "object.getownpropertydescriptors": "^2.0.3", - "object.values": "^1.1.0", - "promise.allsettled": "^1.0.0", - "promise.prototype.finally": "^3.1.0", - "string.prototype.matchall": "^3.0.1", - "string.prototype.padend": "^3.0.0", - "string.prototype.padstart": "^3.0.0", - "symbol.prototype.description": "^1.0.0" - }, - "dependencies": { - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.0" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.entries": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", - "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "object.values": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", - "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - } - } - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true - }, - "ajv-merge-patch": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ajv-merge-patch/-/ajv-merge-patch-4.1.0.tgz", - "integrity": "sha512-0mAYXMSauA8RZ7r+B4+EAOYcZEcO9OK5EiQCR7W7Cv4E44pJj56ZnkKLJ9/PAcOc0dT+LlV9fdDcq2TxVJfOYw==", - "dev": true, - "requires": { - "fast-json-patch": "^2.0.6", - "json-merge-patch": "^0.2.3" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" - }, - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "dev": true, - "requires": { - "string-width": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "ansi-colors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.0.1.tgz", - "integrity": "sha512-yopkAU0ZD/WQ56Tms3xLn6jRuX3SyUMAVi0FdmDIbmmnHW3jHiI1sQFdUl3gfVddjnrsP3Y6ywFKvCRopvoVIA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-escapes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", - "dev": true - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", - "dev": true - }, - "any-promise": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-0.1.0.tgz", - "integrity": "sha1-gwtoCqflbzNFHUsEnzvYBESY7ic=" - }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" - } - }, - "app-root-dir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz", - "integrity": "sha1-OBh+wt6nV3//Az/8sSFyaS/24Rg=", - "dev": true - }, - "append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", - "dev": true, - "requires": { - "buffer-equal": "^1.0.0" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "arch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.0.tgz", - "integrity": "sha1-NhOqRhSQZLPB8GB5Gb8dR4boKIk=", - "dev": true - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "arr-filter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", - "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true - }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "array-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", - "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", - "dev": true - }, - "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.7.0" - } - }, - "array-initial": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", - "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", - "dev": true, - "requires": { - "array-slice": "^1.0.0", - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", - "dev": true, - "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", - "dev": true - }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", - "dev": true - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, - "array-sort": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", - "dev": true, - "requires": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "array.prototype.flat": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.1.tgz", - "integrity": "sha512-rVqIs330nLJvfC7JqYvEWwqVr5QjYF1ib02i3YJtR/fICO6527Tjpc/e4Mvmxh3GIePPreRXMdaGyC99YphWEw==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.10.0", - "function-bind": "^1.1.1" - } - }, - "array.prototype.flatmap": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.1.tgz", - "integrity": "sha512-i18e2APdsiezkcqDyZor78Pbfjfds3S94dG6dgIV2ZASJaUf1N0dz2tGdrmwrmlZuNUgxH+wz6Z0zYVH2c5xzQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.10.0", - "function-bind": "^1.1.1" - } - }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "asmcrypto.js": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/asmcrypto.js/-/asmcrypto.js-0.22.0.tgz", - "integrity": "sha512-usgMoyXjMbx/ZPdzTSXExhMPur2FTdz/Vo5PVx2gIaBcdAAJNOFlsdgqveM8Cff7W0v+xrf9BwjOV26JSAF9qA==" - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" - }, - "asn1.js": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", - "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "requires": { - "util": "0.10.3" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assertion-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", - "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "ast-types": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", - "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=" - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", - "requires": { - "lodash": "^4.14.0" - } - }, - "async-done": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.1.tgz", - "integrity": "sha512-R1BaUeJ4PMoLNJuk+0tLJgjmEqVsdN118+Z8O+alhnQDQgy0kmD5Mqi0DNEmMx2LM0Ed5yekKu+ZXYvIHceicg==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^1.0.7", - "stream-exhaust": "^1.0.1" - } - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, - "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-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true - }, - "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" - }, - "async-reduce": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/async-reduce/-/async-reduce-0.0.1.tgz", - "integrity": "sha1-sja183bW+uOBze2QBqp/LHOxfzE=" - }, - "async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", - "dev": true, - "requires": { - "async-done": "^1.2.2" - } - }, - "async.queue": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/async.queue/-/async.queue-0.5.2.tgz", - "integrity": "sha1-jV2QgS4UgQZrwJBOjMFxKxfDvXw=", - "dev": true, - "requires": { - "async.util.queue": "0.5.2" - } - }, - "async.util.arrayeach": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/async.util.arrayeach/-/async.util.arrayeach-0.5.2.tgz", - "integrity": "sha1-WMTpgCjVXWm/sFrrOvROClVagpw=", - "dev": true - }, - "async.util.isarray": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/async.util.isarray/-/async.util.isarray-0.5.2.tgz", - "integrity": "sha1-5i2sjyY29lh13PdSHC0k0N+yu98=", - "dev": true - }, - "async.util.map": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/async.util.map/-/async.util.map-0.5.2.tgz", - "integrity": "sha1-5YjvhuCzq18CfZevTWg10FXKadY=", - "dev": true - }, - "async.util.noop": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/async.util.noop/-/async.util.noop-0.5.2.tgz", - "integrity": "sha1-vdYrl8sKo/YLWGrRSEaGmJdeWLk=", - "dev": true - }, - "async.util.onlyonce": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/async.util.onlyonce/-/async.util.onlyonce-0.5.2.tgz", - "integrity": "sha1-uOb8AErckjFk154y8oE+5GXCT/I=", - "dev": true - }, - "async.util.queue": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/async.util.queue/-/async.util.queue-0.5.2.tgz", - "integrity": "sha1-V/Zavho83yc9MavSirlUJfgiLuU=", - "dev": true, - "requires": { - "async.util.arrayeach": "0.5.2", - "async.util.isarray": "0.5.2", - "async.util.map": "0.5.2", - "async.util.noop": "0.5.2", - "async.util.onlyonce": "0.5.2", - "async.util.setimmediate": "0.5.2" - } - }, - "async.util.setimmediate": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/async.util.setimmediate/-/async.util.setimmediate-0.5.2.tgz", - "integrity": "sha1-KBLrq/KlgCd1jUvHeT0cz68QJV8=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "atob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", - "dev": true - }, - "autoprefixer": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-8.1.0.tgz", - "integrity": "sha512-b6mjq6VZ0guW6evRkKXL5sSSvIXICAE9dyWReZ3l/riidU7bVaJMe5cQ512SmaLA4Pvgnhi5MFsMs/Mvyh9//Q==", - "dev": true, - "requires": { - "browserslist": "^3.1.1", - "caniuse-lite": "^1.0.30000810", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^6.0.19", - "postcss-value-parser": "^3.2.3" - }, - "dependencies": { - "browserslist": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.1.2.tgz", - "integrity": "sha512-iO5MiK7MZXejqfnCK8onktxxb+mcW+KMiL/5gGF/UCWvVgPzbgbkA5cyYfqj/IIHHo7X1z0znrSHPw9AIfpvrw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000813", - "electron-to-chromium": "^1.3.36" - } - }, - "caniuse-lite": { - "version": "1.0.30000813", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000813.tgz", - "integrity": "sha512-A8ITSmH5SFdMFdC704ggjg+x2z5PzQmVlG8tavwnfvbC33Q1UYrj0+G+Xm0SNAnd4He36fwUE/KEWytOEchw+A==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.37", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.37.tgz", - "integrity": "sha1-SpJzTgBEyM8LFVO+V+riGkxuX6s=", - "dev": true - } - } - }, - "await-semaphore": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/await-semaphore/-/await-semaphore-0.1.3.tgz", - "integrity": "sha512-d1W2aNSYcz/sxYO4pMGX9vq65qOTu0P800epMud+6cYYX0QcT7zyqcxec3VWzpgvdXo57UWmVbZpLMjX2m1I7Q==" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - }, - "dependencies": { - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "babel-eslint": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.1.2.tgz", - "integrity": "sha512-IE+glF8t0lLoldylN7JyR8gT7e3jwyuNH2ds8g3UVUwGob/U4iT7Xpsiq2kQ8QGLb0eX4RcQXNqeW6mgPysu9A==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.31", - "@babel/traverse": "7.0.0-beta.31", - "@babel/types": "7.0.0-beta.31", - "babylon": "7.0.0-beta.31", - "eslint-scope": "~3.7.1", - "eslint-visitor-keys": "^1.0.0" - }, - "dependencies": { - "babylon": { - "version": "7.0.0-beta.31", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.31.tgz", - "integrity": "sha512-6lm2mV3S51yEnKmQQNnswoABL1U1H1KHoCCVwdwI3hvIv+W7ya4ki7Aw4o4KxtUHjNKkK5WpZb22rrMMOcJXJQ==", - "dev": true - } - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "babel-helper-bindify-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", - "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "requires": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-builder-react-jsx": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", - "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "esutils": "^2.0.2" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-evaluate-path": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.5.0.tgz", - "integrity": "sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA==", - "dev": true - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-explode-class": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", - "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", - "dev": true, - "requires": { - "babel-helper-bindify-decorators": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-flip-expressions": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.4.3.tgz", - "integrity": "sha1-NpZzahKKwYvCUlS19AoizrPB0/0=", - "dev": true - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-is-nodes-equiv": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz", - "integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ=", - "dev": true - }, - "babel-helper-is-void-0": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.4.3.tgz", - "integrity": "sha1-fZwBtFYee5Xb2g9u7kj1tg5nMT4=", - "dev": true - }, - "babel-helper-mark-eval-scopes": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.4.3.tgz", - "integrity": "sha1-0kSjvvmESHJgP/tG4izorN9VFWI=", - "dev": true - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-remove-or-void": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.4.3.tgz", - "integrity": "sha1-pPA7QAd6D/6I5F0HAQ3uJB/1rmA=", - "dev": true - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-to-multiple-sequence-expressions": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.5.0.tgz", - "integrity": "sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA==", - "dev": true - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-add-react-displayname": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz", - "integrity": "sha1-M51M3be2X9YtHfnbn+BN4TQSK9U=", - "dev": true - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.2.0.tgz", - "integrity": "sha512-fP899ELUnTaBcIzmrW7nniyqqdYWrWuJUyPWHxFa/c7r7hS6KC8FscNfLlBNIoPSc55kYMGEEKjPjJGCLbE1qA==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-emotion": { - "version": "10.0.9", - "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.9.tgz", - "integrity": "sha512-IfWP12e9/wHtWHxVTzD692Nbcmrmcz2tip7acp6YUqtrP7slAyr5B+69hyZ8jd55GsyNSZwryNnmuDEVe0j+7w==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@emotion/hash": "0.7.1", - "@emotion/memoize": "0.7.1", - "@emotion/serialize": "^0.11.6", - "babel-plugin-macros": "^2.0.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^1.0.5", - "find-root": "^1.1.0", - "source-map": "^0.5.7" - }, - "dependencies": { - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "babel-plugin-macros": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.6.1.tgz", - "integrity": "sha512-6W2nwiXme6j1n2erPOnmRiWfObUhWH7Qw1LMi9XZy8cj+KtESu3T6asZvtk5bMQQjX8te35o7CFueiSdL/2NmQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.4.2", - "cosmiconfig": "^5.2.0", - "resolve": "^1.10.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", - "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", - "dev": true - }, - "resolve": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", - "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "babel-plugin-minify-builtins": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.5.0.tgz", - "integrity": "sha512-wpqbN7Ov5hsNwGdzuzvFcjgRlzbIeVv1gMIlICbPj0xkexnfoIDe7q+AZHMkQmAE/F9R5jkrB6TLfTegImlXag==", - "dev": true - }, - "babel-plugin-minify-constant-folding": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.5.0.tgz", - "integrity": "sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ==", - "dev": true, - "requires": { - "babel-helper-evaluate-path": "^0.5.0" - } - }, - "babel-plugin-minify-dead-code-elimination": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.5.0.tgz", - "integrity": "sha512-XQteBGXlgEoAKc/BhO6oafUdT4LBa7ARi55mxoyhLHNuA+RlzRmeMAfc31pb/UqU01wBzRc36YqHQzopnkd/6Q==", - "dev": true, - "requires": { - "babel-helper-evaluate-path": "^0.5.0", - "babel-helper-mark-eval-scopes": "^0.4.3", - "babel-helper-remove-or-void": "^0.4.3", - "lodash.some": "^4.6.0" - } - }, - "babel-plugin-minify-flip-comparisons": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.4.3.tgz", - "integrity": "sha1-AMqHDLjxO0XAOLPB68DyJyk8llo=", - "dev": true, - "requires": { - "babel-helper-is-void-0": "^0.4.3" - } - }, - "babel-plugin-minify-guarded-expressions": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.4.3.tgz", - "integrity": "sha1-zHCbRFP9IbHzAod0RMifiEJ845c=", - "dev": true, - "requires": { - "babel-helper-flip-expressions": "^0.4.3" - } - }, - "babel-plugin-minify-infinity": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.4.3.tgz", - "integrity": "sha1-37h2obCKBldjhO8/kuZTumB7Oco=", - "dev": true - }, - "babel-plugin-minify-mangle-names": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.5.0.tgz", - "integrity": "sha512-3jdNv6hCAw6fsX1p2wBGPfWuK69sfOjfd3zjUXkbq8McbohWy23tpXfy5RnToYWggvqzuMOwlId1PhyHOfgnGw==", - "dev": true, - "requires": { - "babel-helper-mark-eval-scopes": "^0.4.3" - } - }, - "babel-plugin-minify-numeric-literals": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.4.3.tgz", - "integrity": "sha1-jk/VYcefeAEob/YOjF/Z3u6TwLw=", - "dev": true - }, - "babel-plugin-minify-replace": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.5.0.tgz", - "integrity": "sha512-aXZiaqWDNUbyNNNpWs/8NyST+oU7QTpK7J9zFEFSA0eOmtUNMU3fczlTTTlnCxHmq/jYNFEmkkSG3DDBtW3Y4Q==", - "dev": true - }, - "babel-plugin-minify-simplify": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.5.0.tgz", - "integrity": "sha512-TM01J/YcKZ8XIQd1Z3nF2AdWHoDsarjtZ5fWPDksYZNsoOjQ2UO2EWm824Ym6sp127m44gPlLFiO5KFxU8pA5Q==", - "dev": true, - "requires": { - "babel-helper-flip-expressions": "^0.4.3", - "babel-helper-is-nodes-equiv": "^0.0.1", - "babel-helper-to-multiple-sequence-expressions": "^0.5.0" - } - }, - "babel-plugin-minify-type-constructors": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.4.3.tgz", - "integrity": "sha1-G8bxW4f3qxCF1CszC3F2V6IVZQA=", - "dev": true, - "requires": { - "babel-helper-is-void-0": "^0.4.3" - } - }, - "babel-plugin-named-asset-import": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.2.tgz", - "integrity": "sha512-CxwvxrZ9OirpXQ201Ec57OmGhmI8/ui/GwTDy0hSp6CmRvgRC0pSair6Z04Ck+JStA0sMPZzSJ3uE4n17EXpPQ==", - "dev": true - }, - "babel-plugin-react-docgen": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-react-docgen/-/babel-plugin-react-docgen-3.1.0.tgz", - "integrity": "sha512-W6xqZnZIWjZuE9IjP7XolxxgFGB5Y9GZk4cLPSWKa10MrT86q7bX4ke9jbrNhFVIRhbmzL8wE1Sn++mIWoJLbw==", - "dev": true, - "requires": { - "lodash": "^4.17.11", - "react-docgen": "^4.1.0", - "recast": "^0.14.7" - }, - "dependencies": { - "ast-types": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.3.tgz", - "integrity": "sha512-XA5o5dsNw8MhyW0Q7MWXJWc4oOzZKbdsEJq45h7c8q/d9DwWZ5F2ugUc1PuMLPGsUnphCt/cNDHu8JeBbxf1qA==", - "dev": true - }, - "recast": { - "version": "0.14.7", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.14.7.tgz", - "integrity": "sha512-/nwm9pkrcWagN40JeJhkPaRxiHXBRkXyRh/hgU088Z/v+qCy+zIHHY6bC6o7NaKAxPqtE6nD8zBH1LfU0/Wx6A==", - "dev": true, - "requires": { - "ast-types": "0.11.3", - "esprima": "~4.0.0", - "private": "~0.1.5", - "source-map": "~0.6.1" - } - }, - "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 - } - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" - }, - "babel-plugin-syntax-async-generators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", - "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", - "dev": true - }, - "babel-plugin-syntax-class-constructor-call": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", - "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=", - "dev": true - }, - "babel-plugin-syntax-class-properties": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", - "dev": true - }, - "babel-plugin-syntax-decorators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", - "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", - "dev": true - }, - "babel-plugin-syntax-do-expressions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz", - "integrity": "sha1-V0d1YTmqJtOQ0JQQsDdEugfkeW0=", - "dev": true - }, - "babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", - "dev": true - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" - }, - "babel-plugin-syntax-export-extensions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", - "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=", - "dev": true - }, - "babel-plugin-syntax-flow": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", - "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", - "dev": true - }, - "babel-plugin-syntax-function-bind": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz", - "integrity": "sha1-SMSV8Xe98xqYHnMvVa3AvdJgH0Y=", - "dev": true - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", - "dev": true - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" - }, - "babel-plugin-transform-async-generator-functions": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", - "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-generators": "^6.5.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-class-constructor-call": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", - "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", - "dev": true, - "requires": { - "babel-plugin-syntax-class-constructor-call": "^6.18.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-class-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", - "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-plugin-syntax-class-properties": "^6.8.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", - "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", - "dev": true, - "requires": { - "babel-helper-explode-class": "^6.24.1", - "babel-plugin-syntax-decorators": "^6.13.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-do-expressions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz", - "integrity": "sha1-KMyvkoEtlJws0SgfaQyP3EaK6bs=", - "dev": true, - "requires": { - "babel-plugin-syntax-do-expressions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-export-extensions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", - "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", - "dev": true, - "requires": { - "babel-plugin-syntax-export-extensions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-flow-strip-types": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", - "dev": true, - "requires": { - "babel-plugin-syntax-flow": "^6.18.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-function-bind": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz", - "integrity": "sha1-xvuOlqwpajELjPjqQBRiQH3fapc=", - "dev": true, - "requires": { - "babel-plugin-syntax-function-bind": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-inline-consecutive-adds": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.4.3.tgz", - "integrity": "sha1-Mj1Ho+pjqDp6w8gRro5pQfrysNE=", - "dev": true - }, - "babel-plugin-transform-member-expression-literals": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.4.tgz", - "integrity": "sha1-NwOcmgwzE6OUlfqsL/OmtbnQOL8=", - "dev": true - }, - "babel-plugin-transform-merge-sibling-variables": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.4.tgz", - "integrity": "sha1-hbQi/DN3tEnJ0c3kQIcgNTJAHa4=", - "dev": true - }, - "babel-plugin-transform-minify-booleans": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.4.tgz", - "integrity": "sha1-rLs+VqNVXdI5KOS1gtKFFi3SsZg=", - "dev": true - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" - } - }, - "babel-plugin-transform-property-literals": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.4.tgz", - "integrity": "sha1-mMHSHiVXNlc/k+zlRFn2ziSYXTk=", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "babel-plugin-transform-react-display-name": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", - "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", - "dev": true, - "requires": { - "babel-helper-builder-react-jsx": "^6.24.1", - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx-self": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", - "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", - "dev": true, - "requires": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx-source": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", - "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", - "dev": true, - "requires": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", - "dev": true - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "requires": { - "regenerator-transform": "^0.10.0" - } - }, - "babel-plugin-transform-regexp-constructors": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.4.3.tgz", - "integrity": "sha1-WLd3W2OvzzMyj66aX4j71PsLSWU=", - "dev": true - }, - "babel-plugin-transform-remove-console": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz", - "integrity": "sha1-uYA2DAZzhOJLNXpYjYB9PINSd4A=", - "dev": true - }, - "babel-plugin-transform-remove-debugger": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.4.tgz", - "integrity": "sha1-QrcnYxyXl44estGZp67IShgznvI=", - "dev": true - }, - "babel-plugin-transform-remove-undefined": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.5.0.tgz", - "integrity": "sha512-+M7fJYFaEE/M9CXa0/IRkDbiV3wRELzA1kKQFCJ4ifhrzLKn/9VCCgj9OFmYWwBd8IB48YdgPkHYtbYq+4vtHQ==", - "dev": true, - "requires": { - "babel-helper-evaluate-path": "^0.5.0" - } - }, - "babel-plugin-transform-runtime": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", - "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-simplify-comparison-operators": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.4.tgz", - "integrity": "sha1-9ir+CWyrDh9ootdT/fKDiIRxzrk=", - "dev": true - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-undefined-to-void": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.4.tgz", - "integrity": "sha1-viQcqBQEAwZ4t0hxcyK4nQyP4oA=", - "dev": true - }, - "babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - } - } - }, - "babel-preset-env": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", - "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^3.2.6", - "invariant": "^2.2.2", - "semver": "^5.3.0" - } - }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.24.1", - "babel-plugin-transform-es2015-classes": "^6.24.1", - "babel-plugin-transform-es2015-computed-properties": "^6.24.1", - "babel-plugin-transform-es2015-destructuring": "^6.22.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", - "babel-plugin-transform-es2015-for-of": "^6.22.0", - "babel-plugin-transform-es2015-function-name": "^6.24.1", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-umd": "^6.24.1", - "babel-plugin-transform-es2015-object-super": "^6.24.1", - "babel-plugin-transform-es2015-parameters": "^6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", - "babel-plugin-transform-regenerator": "^6.24.1" - } - }, - "babel-preset-flow": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", - "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", - "dev": true, - "requires": { - "babel-plugin-transform-flow-strip-types": "^6.22.0" - } - }, - "babel-preset-minify": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.5.0.tgz", - "integrity": "sha512-xj1s9Mon+RFubH569vrGCayA9Fm2GMsCgDRm1Jb8SgctOB7KFcrVc2o8K3YHUyMz+SWP8aea75BoS8YfsXXuiA==", - "dev": true, - "requires": { - "babel-plugin-minify-builtins": "^0.5.0", - "babel-plugin-minify-constant-folding": "^0.5.0", - "babel-plugin-minify-dead-code-elimination": "^0.5.0", - "babel-plugin-minify-flip-comparisons": "^0.4.3", - "babel-plugin-minify-guarded-expressions": "^0.4.3", - "babel-plugin-minify-infinity": "^0.4.3", - "babel-plugin-minify-mangle-names": "^0.5.0", - "babel-plugin-minify-numeric-literals": "^0.4.3", - "babel-plugin-minify-replace": "^0.5.0", - "babel-plugin-minify-simplify": "^0.5.0", - "babel-plugin-minify-type-constructors": "^0.4.3", - "babel-plugin-transform-inline-consecutive-adds": "^0.4.3", - "babel-plugin-transform-member-expression-literals": "^6.9.4", - "babel-plugin-transform-merge-sibling-variables": "^6.9.4", - "babel-plugin-transform-minify-booleans": "^6.9.4", - "babel-plugin-transform-property-literals": "^6.9.4", - "babel-plugin-transform-regexp-constructors": "^0.4.3", - "babel-plugin-transform-remove-console": "^6.9.4", - "babel-plugin-transform-remove-debugger": "^6.9.4", - "babel-plugin-transform-remove-undefined": "^0.5.0", - "babel-plugin-transform-simplify-comparison-operators": "^6.9.4", - "babel-plugin-transform-undefined-to-void": "^6.9.4", - "lodash.isplainobject": "^4.0.6" - } - }, - "babel-preset-react": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", - "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", - "dev": true, - "requires": { - "babel-plugin-syntax-jsx": "^6.3.13", - "babel-plugin-transform-react-display-name": "^6.23.0", - "babel-plugin-transform-react-jsx": "^6.24.1", - "babel-plugin-transform-react-jsx-self": "^6.22.0", - "babel-plugin-transform-react-jsx-source": "^6.22.0", - "babel-preset-flow": "^6.23.0" - } - }, - "babel-preset-react-app": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.0.0.tgz", - "integrity": "sha512-YVsDA8HpAKklhFLJtl9+AgaxrDaor8gGvDFlsg1ByOS0IPGUovumdv4/gJiAnLcDmZmKlH6+9sVOz4NVW7emAg==", - "dev": true, - "requires": { - "@babel/core": "7.4.3", - "@babel/plugin-proposal-class-properties": "7.4.0", - "@babel/plugin-proposal-decorators": "7.4.0", - "@babel/plugin-proposal-object-rest-spread": "7.4.3", - "@babel/plugin-syntax-dynamic-import": "7.2.0", - "@babel/plugin-transform-classes": "7.4.3", - "@babel/plugin-transform-destructuring": "7.4.3", - "@babel/plugin-transform-flow-strip-types": "7.4.0", - "@babel/plugin-transform-react-constant-elements": "7.2.0", - "@babel/plugin-transform-react-display-name": "7.2.0", - "@babel/plugin-transform-runtime": "7.4.3", - "@babel/preset-env": "7.4.3", - "@babel/preset-react": "7.0.0", - "@babel/preset-typescript": "7.3.3", - "@babel/runtime": "7.4.3", - "babel-plugin-dynamic-import-node": "2.2.0", - "babel-plugin-macros": "2.5.1", - "babel-plugin-transform-react-remove-prop-types": "0.4.24" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/core": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.3.tgz", - "integrity": "sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.0", - "@babel/helpers": "^7.4.3", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "convert-source-map": "^1.1.0", - "debug": "^4.1.0", - "json5": "^2.1.0", - "lodash": "^4.17.11", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.0.tgz", - "integrity": "sha512-t2ECPNOXsIeK1JxJNKmgbzQtoG27KIlVE61vTqX0DKR9E9sZlVVxWUtEW9D5FlZ8b8j7SBNCHY47GgPKCKlpPg==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.4.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.3.tgz", - "integrity": "sha512-xC//6DNSSHVjq8O2ge0dyYlhshsH4T7XdCVoxbi5HzLYWfsC5ooFlJjrXk8RcAT+hjHAK9UjBXdylzSoDK3t4g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.3.tgz", - "integrity": "sha512-PUaIKyFUDtG6jF5DUJOfkBdwAS/kFFV3XFk7Nn0a6vR7ZT8jYw5cGtIlat77wcnd0C6ViGqo/wyNf4ZHytF/nQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.4.0", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.4.0", - "@babel/helper-split-export-declaration": "^7.4.0", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.3.tgz", - "integrity": "sha512-rVTLLZpydDFDyN4qnXdzwoVpk1oaXHIvPEOkOLyr88o7oHxVc/LyrnDx+amuBWGOwUb7D1s/uLsKBNTx08htZg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-flow-strip-types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.0.tgz", - "integrity": "sha512-C4ZVNejHnfB22vI2TYN4RUp2oCmq6cSEAg4RygSvYZUECRqUu9O4PMEMNJ4wsemaRGg27BbgYctG4BZh+AgIHw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.2.0" - } - }, - "@babel/preset-env": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.3.tgz", - "integrity": "sha512-FYbZdV12yHdJU5Z70cEg0f6lvtpZ8jFSDakTm7WXeJbLXh4R0ztGEu/SW7G1nJ2ZvKwDhz8YrbA84eYyprmGqw==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.2.0", - "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.4.3", - "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.0", - "@babel/plugin-syntax-async-generators": "^7.2.0", - "@babel/plugin-syntax-json-strings": "^7.2.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.4.0", - "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.4.0", - "@babel/plugin-transform-classes": "^7.4.3", - "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.4.3", - "@babel/plugin-transform-dotall-regex": "^7.4.3", - "@babel/plugin-transform-duplicate-keys": "^7.2.0", - "@babel/plugin-transform-exponentiation-operator": "^7.2.0", - "@babel/plugin-transform-for-of": "^7.4.3", - "@babel/plugin-transform-function-name": "^7.4.3", - "@babel/plugin-transform-literals": "^7.2.0", - "@babel/plugin-transform-member-expression-literals": "^7.2.0", - "@babel/plugin-transform-modules-amd": "^7.2.0", - "@babel/plugin-transform-modules-commonjs": "^7.4.3", - "@babel/plugin-transform-modules-systemjs": "^7.4.0", - "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.2", - "@babel/plugin-transform-new-target": "^7.4.0", - "@babel/plugin-transform-object-super": "^7.2.0", - "@babel/plugin-transform-parameters": "^7.4.3", - "@babel/plugin-transform-property-literals": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.4.3", - "@babel/plugin-transform-reserved-words": "^7.2.0", - "@babel/plugin-transform-shorthand-properties": "^7.2.0", - "@babel/plugin-transform-spread": "^7.2.0", - "@babel/plugin-transform-sticky-regex": "^7.2.0", - "@babel/plugin-transform-template-literals": "^7.2.0", - "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.4.3", - "@babel/types": "^7.4.0", - "browserslist": "^4.5.2", - "core-js-compat": "^3.0.0", - "invariant": "^2.2.2", - "js-levenshtein": "^1.1.3", - "semver": "^5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - } - } - }, - "@babel/runtime": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.3.tgz", - "integrity": "sha512-9lsJwJLxDh/T3Q3SZszfWOTkk3pHbkmH+3KY+zwIDmsNlxsumuhS2TH3NIpktU4kNvfzy+k3eLT7aTJSPTo0OA==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/types": "^7.4.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.11" - } - }, - "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "babel-plugin-macros": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.5.1.tgz", - "integrity": "sha512-xN3KhAxPzsJ6OQTktCanNpIFnnMsCV+t8OloKxIL72D6+SUZYFn9qfklPgef5HyyDtzYZqqb+fs1S12+gQY82Q==", - "dev": true, - "requires": { - "@babel/runtime": "^7.4.2", - "cosmiconfig": "^5.2.0", - "resolve": "^1.10.0" - }, - "dependencies": { - "resolve": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", - "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "browserslist": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.1.tgz", - "integrity": "sha512-1MC18ooMPRG2UuVFJTHFIAkk6mpByJfxCrnUyvSlu/hyQSFHMrlhM02SzNuCV+quTP4CKmqtOMAIjrifrpBJXQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000971", - "electron-to-chromium": "^1.3.137", - "node-releases": "^1.1.21" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "caniuse-lite": { - "version": "1.0.30000973", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000973.tgz", - "integrity": "sha512-/F3t/Yo8LEdRSEPCmI15fLu5vepVh9UCg/9inJXF5AAfW7xRRJkbaM2ut52iRMQMnGCLQouLbFdbOA+VEFOIsg==", - "dev": true - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "electron-to-chromium": { - "version": "1.3.146", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.146.tgz", - "integrity": "sha512-BrUq08sx7eR4PCwLbjFxXmjcbDro6DSoc1pN8VCxq76U+o9JQzJlWH/NVtcpAqcktwpE5CVvMyqHqTQfCETNoQ==", - "dev": true - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", - "dev": true - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "babel-preset-stage-0": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz", - "integrity": "sha1-VkLRUEL5E4TX5a+LyIsduVsDnmo=", - "dev": true, - "requires": { - "babel-plugin-transform-do-expressions": "^6.22.0", - "babel-plugin-transform-function-bind": "^6.22.0", - "babel-preset-stage-1": "^6.24.1" - } - }, - "babel-preset-stage-1": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", - "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", - "dev": true, - "requires": { - "babel-plugin-transform-class-constructor-call": "^6.24.1", - "babel-plugin-transform-export-extensions": "^6.22.0", - "babel-preset-stage-2": "^6.24.1" - } - }, - "babel-preset-stage-2": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", - "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", - "dev": true, - "requires": { - "babel-plugin-syntax-dynamic-import": "^6.18.0", - "babel-plugin-transform-class-properties": "^6.24.1", - "babel-plugin-transform-decorators": "^6.24.1", - "babel-preset-stage-3": "^6.24.1" - } - }, - "babel-preset-stage-3": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", - "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", - "dev": true, - "requires": { - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-generator-functions": "^6.24.1", - "babel-plugin-transform-async-to-generator": "^6.24.1", - "babel-plugin-transform-exponentiation-operator": "^6.24.1", - "babel-plugin-transform-object-rest-spread": "^6.22.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-standalone": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-standalone/-/babel-standalone-6.26.0.tgz", - "integrity": "sha1-Ffs9NfLEVmlYFevx7Zb+fwFbaIY=", - "dev": true - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "babelify": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-8.0.0.tgz", - "integrity": "sha512-xVr63fKEvMWUrrIbqlHYsMcc5Zdw4FSVesAHgkgajyCE1W8gbm9rbMakqavhxKvikGYMhEcqxTwB/gQmQ6lBtw==", - "dev": true - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" - }, - "bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", - "dev": true, - "requires": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" - } - }, - "backbone": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.4.0.tgz", - "integrity": "sha512-RLmDrRXkVdouTg38jcgHhyQ/2zjg7a8E6sz2zxfz21Hh17xDJYUHBZimVIt5fUyS8vbfpeSmTL3gUjTEvUV3qQ==", - "dev": true, - "requires": { - "underscore": ">=1.8.3" - }, - "dependencies": { - "underscore": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", - "dev": true - } - } - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, - "backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", - "requires": { - "precond": "0.2" - } - }, - "bail": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.2.tgz", - "integrity": "sha1-99bBcxYwqfnw1NNe0fli4gdKF2Q=", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "base-x": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-1.1.0.tgz", - "integrity": "sha1-QtPXF0dPnqAiB/bRqh9CaRPut6w=" - }, - "base62": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/base62/-/base62-0.1.1.tgz", - "integrity": "sha1-e0F0wvlESXU7EcJlHAg9qEGnsIQ=" - }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", - "dev": true - }, - "base64-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==" - }, - "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", - "dev": true - }, - "bcrypt-pbkdf": { - "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.3" - } - }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", - "dev": true - }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, - "requires": { - "callsite": "1.0.0" - } - }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "bignumber.js": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.1.0.tgz", - "integrity": "sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA==" - }, - "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", - "dev": true - }, - "binaryextensions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-1.0.1.tgz", - "integrity": "sha1-HmN0iLNbWL2l9HdL+WpSEqjJB1U=", - "dev": true - }, - "bindings": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", - "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==" - }, - "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.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1", - "safe-buffer": "^5.0.1", - "unorm": "^1.3.3" - } - }, - "bip66": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", - "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "bl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", - "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", - "requires": { - "readable-stream": "^2.0.5" - } - }, - "blob": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", - "dev": true - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" - }, - "body": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", - "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=", - "dev": true, - "requires": { - "continuable-cache": "^0.3.1", - "error": "^7.0.0", - "raw-body": "~1.1.0", - "safe-json-parse": "~1.0.1" - }, - "dependencies": { - "bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", - "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=", - "dev": true - }, - "raw-body": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", - "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=", - "dev": true, - "requires": { - "bytes": "1", - "string_decoder": "0.10" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - } - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "boron": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/boron/-/boron-0.2.3.tgz", - "integrity": "sha1-Y6GAB3HAyysNj2Fmh8YsEkjPuKA=", - "requires": { - "domkit": "^0.0.1" - } - }, - "bowser": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.3.tgz", - "integrity": "sha512-/gp96UlcFw5DbV2KQPCqTqi0Mb9gZRyDAHiDsGEH+4B/KOQjeoE5lM1PxlVX8DQDvfEfitmC1rW2Oy8fk/XBDg==", - "dev": true - }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "dev": true, - "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "brcast": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/brcast/-/brcast-3.0.1.tgz", - "integrity": "sha512-eI3yqf9YEqyGl9PCNTR46MGvDylGtaHjalcz6Q3fAPnP/PhpKkkve52vFdfGpwp4VUvK6LUr4TQN+2stCrEwTg==" - }, - "brfs": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", - "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", - "dev": true, - "requires": { - "quote-stream": "^1.0.1", - "resolve": "^1.1.5", - "static-module": "^2.2.0", - "through2": "^2.0.0" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "browser-pack": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-5.0.1.tgz", - "integrity": "sha1-QZdxmyDG4KqglFHFER5T77b7wY0=", - "requires": { - "JSONStream": "^1.0.3", - "combine-source-map": "~0.6.1", - "defined": "^1.0.0", - "through2": "^1.0.0", - "umd": "^3.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "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=" - }, - "through2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", - "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", - "requires": { - "readable-stream": ">=1.1.13-1 <1.2.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "browser-passworder": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/browser-passworder/-/browser-passworder-2.0.3.tgz", - "integrity": "sha1-b90gguUWoXbtvLPc7gt/n85PeRc=", - "requires": { - "browserify-unibabel": "^3.0.0" - } - }, - "browser-process-hrtime": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz", - "integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44=", - "dev": true - }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "dev": true, - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } - }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, - "browser-unpack": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browser-unpack/-/browser-unpack-1.2.0.tgz", - "integrity": "sha1-NXruMfxGeDFoTQY+Q1XgcKeClw0=", - "requires": { - "acorn": "^4.0.3", - "browser-pack": "^5.0.1", - "concat-stream": "^1.5.0", - "minimist": "^1.1.1" - } - }, - "browserify": { - "version": "16.2.3", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz", - "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^1.11.0", - "browserify-zlib": "~0.2.0", - "buffer": "^5.0.2", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.0", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^2.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.0.0", - "labeled-stream-splicer": "^2.0.0", - "mkdirp": "^0.5.0", - "module-deps": "^6.0.0", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "~0.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^2.0.0", - "stream-http": "^2.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.10.1", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "browser-pack": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", - "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "combine-source-map": "~0.8.0", - "defined": "^1.0.0", - "safe-buffer": "^5.1.1", - "through2": "^2.0.0", - "umd": "^3.0.0" - } - }, - "combine-source-map": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", - "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", - "dev": true, - "requires": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "events": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", - "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", - "dev": true - }, - "inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", - "dev": true, - "requires": { - "source-map": "~0.5.3" - } - }, - "lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "dev": true - }, - "vm-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", - "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", - "dev": true - } - } - }, - "browserify-aes": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", - "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-derequire": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/browserify-derequire/-/browserify-derequire-0.9.4.tgz", - "integrity": "sha1-ZNYeVs/f8LjxdP2MV/i0Az4oeJU=", - "requires": { - "derequire": "^2.0.0", - "through2": "^1.1.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "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=" - }, - "through2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", - "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", - "requires": { - "readable-stream": ">=1.1.13-1 <1.2.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sha3": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.1.tgz", - "integrity": "sha1-P/NKMAbvFcD7NWflQbkaI0ASPRE=", - "requires": { - "js-sha3": "^0.3.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-unibabel": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/browserify-unibabel/-/browserify-unibabel-3.0.0.tgz", - "integrity": "sha1-WmuPD3BM44jTkn30czfiWDD3Hdo=" - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", - "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", - "requires": { - "caniuse-lite": "^1.0.30000844", - "electron-to-chromium": "^1.3.47" - }, - "dependencies": { - "electron-to-chromium": { - "version": "1.3.52", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz", - "integrity": "sha1-0tnxJwuko7lnuDHEDvcftNmrXOA=" - } - } - }, - "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" - } - }, - "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.0" - } - }, - "btoa": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", - "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==" - }, - "buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "builtins": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-0.0.3.tgz", - "integrity": "sha1-XQBhZtpxYQvCvPcwGfDwzEMwl1U=" - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "c3": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/c3/-/c3-0.6.10.tgz", - "integrity": "sha512-8HjpD1eSma75HI66hLQ+jD5KEvUMhSiiKfovQlyJk+Wxa1ebRL7Smxgu3ybBHkv9khe9m94TJRHpZ9Svcjo40w==", - "requires": { - "d3": "^5.0.0" - } - }, - "cacache": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", - "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", - "dev": true, - "requires": { - "bluebird": "^3.5.3", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.3", - "graceful-fs": "^4.1.15", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - }, - "dependencies": { - "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", - "dev": true - }, - "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "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" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "cached-path-relative": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", - "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", - "dev": true - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - }, - "dependencies": { - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - } - } - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "^0.2.0" - } - }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } - } - }, - "can-use-dom": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/can-use-dom/-/can-use-dom-0.1.0.tgz", - "integrity": "sha1-IsxKNKCrxDlQ9CxkEQJKP2NmtFo=", - "dev": true - }, - "caniuse-db": { - "version": "1.0.30000808", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000808.tgz", - "integrity": "sha1-MN/YMAnVcE8C3/s3clBo7RKjZrs=", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30000865", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz", - "integrity": "sha512-vs79o1mOSKRGv/1pSkp4EXgl4ZviWeYReXw60XfacPU64uQWZwJT6vZNmxRF9O+6zu71sJwMxLK5JXxbzuVrLw==" - }, - "capture-stack-trace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", - "dev": true - }, - "case-sensitive-paths-webpack-plugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.2.0.tgz", - "integrity": "sha512-u5ElzokS8A1pm9vM3/iDgTcI3xqHxuCao94Oz8etI3cf0Tio0p8izkDYbTIn09uP3yUUr6+veaE6IkjnTYS46g==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "catharsis": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.10.tgz", - "integrity": "sha512-l2OUaz/3PU3MZylspVFJvwHCVfWyvcduPq4lv3AzZ2pJzZCo7kNKFNyatwujD7XgvGkNAE/Jhhbh2uARNwNkfw==", - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - }, - "ccount": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.4.tgz", - "integrity": "sha512-fpZ81yYfzentuieinmGnphk0pLkOTMm6MZdVqwd77ROvhko6iujLNGrHH5E7utq3ygWklwfmwuG+A7P+NpqT6w==", - "dev": true - }, - "chai": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", - "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", - "dev": true, - "requires": { - "assertion-error": "^1.0.1", - "check-error": "^1.0.1", - "deep-eql": "^3.0.0", - "get-func-name": "^2.0.0", - "pathval": "^1.0.0", - "type-detect": "^4.0.0" - } - }, - "chain-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chain-function/-/chain-function-1.0.0.tgz", - "integrity": "sha1-DUqzfn4Y6tC9xHuSB2QRjOWHM9w=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "change-emitter": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/change-emitter/-/change-emitter-0.1.6.tgz", - "integrity": "sha1-6LL+PX8at9aaMhma/5HqaTFAlRU=" - }, - "character-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.1.tgz", - "integrity": "sha1-92hxvl72bdt/j440eOzDdMJ9bco=", - "dev": true - }, - "character-entities-legacy": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.1.tgz", - "integrity": "sha1-9Ad53xoQGHK7UQo9KV4fzPFHIC8=", - "dev": true - }, - "character-reference-invalid": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.1.tgz", - "integrity": "sha1-lCg191Dk7GGjCOYMLvjMEBEgLvw=", - "dev": true - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "charm": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/charm/-/charm-1.0.2.tgz", - "integrity": "sha1-it02cVOm2aWBMxBSxAkJkdqZXjU=", - "dev": true, - "requires": { - "inherits": "^2.0.1" - } - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "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.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", - "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", - "dev": true, - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - } - }, - "chokidar": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "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" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - } - } - } - } - }, - "chownr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "chromedriver": { - "version": "2.41.0", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-2.41.0.tgz", - "integrity": "sha512-6O9HxvrSuHqmRlIgMzi0/05GsDNHqs8kaF5gNTIyaZNwRzb/RBUWH1xNNXKNxyhXSnGSalH8hWsKP5mc/npSQQ==", - "dev": true, - "requires": { - "del": "^3.0.0", - "extract-zip": "^1.6.7", - "kew": "^0.7.0", - "mkdirp": "^0.5.1", - "request": "^2.87.0" - } - }, - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "dev": true - }, - "cids": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/cids/-/cids-0.5.8.tgz", - "integrity": "sha512-Ye8TZP3YQfy0j+i5k+LPHdTY3JOvTwN1pxds44p6BRUv8PTMOAF/Vt4Bc+oiIQ0Sktn0iftkUHgqKNHIMwhshA==", - "requires": { - "class-is": "^1.1.0", - "multibase": "~0.6.0", - "multicodec": "~0.5.0", - "multihashes": "~0.4.14" - }, - "dependencies": { - "base-x": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.5.tgz", - "integrity": "sha512-C3picSgzPSLE+jW3tcBzJoGwitOtazb5B+5YmAxZm2ybmTi9LNgAtDO/jjVEBZwHoXmDBZ9m/IELj3elJVRBcA==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "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" - } - }, - "multihashes": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.14.tgz", - "integrity": "sha512-V/g/EIN6nALXfS/xHUAgtfPP3mn3sPIF/i9beuGKf25QXS2QZYCpeVJbDPEannkz32B2fihzCe2D/KMrbcmefg==", - "requires": { - "bs58": "^4.0.1", - "varint": "^5.0.0" - } - }, - "varint": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.0.tgz", - "integrity": "sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8=" - } - } - }, - "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.1", - "safe-buffer": "^5.0.1" - } - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, - "class-is": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", - "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "classnames": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", - "integrity": "sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0=" - }, - "clean-css": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", - "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - }, - "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 - } - } - }, - "cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", - "dev": true, - "requires": { - "exit": "0.1.2", - "glob": "^7.1.1" - } - }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-table3": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", - "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", - "dev": true, - "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "colors": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "clipboard": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.4.tgz", - "integrity": "sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ==", - "dev": true, - "optional": true, - "requires": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" - } - }, - "clipboardy": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-1.2.3.tgz", - "integrity": "sha512-2WNImOvCRe6r63Gk9pShfkwXsVtKCroMAevIbiae021mS850UkWPbevxsBz3tnvjZIEGvlwaqCPsw+4ulzNgJA==", - "dev": true, - "requires": { - "arch": "^2.1.0", - "execa": "^0.8.0" - }, - "dependencies": { - "execa": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", - "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - } - } - }, - "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" - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-deep": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", - "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.0", - "shallow-clone": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "clone-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-1.0.0.tgz", - "integrity": "sha1-6uCiQT9VwJQvgYwin+/OhF1/Oxw=", - "dev": true, - "requires": { - "is-regexp": "^1.0.0", - "is-supported-regexp-flag": "^1.0.0" - } - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "cloneable-readable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz", - "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^1.0.6", - "through2": "^2.0.1" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "coinstring": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/coinstring/-/coinstring-2.3.0.tgz", - "integrity": "sha1-zbYzY6lhUCQEolr7gsLibV/2J6Q=", - "requires": { - "bs58": "^2.0.1", - "create-hash": "^1.1.1" - }, - "dependencies": { - "bs58": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-2.0.1.tgz", - "integrity": "sha1-VZCNWPGYKrogCPob7Y+RmYopv40=" - } - } - }, - "collection-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", - "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", - "dev": true, - "requires": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", - "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", - "requires": { - "clone": "^1.0.2", - "color-convert": "^1.3.0", - "color-string": "^0.3.0" - }, - "dependencies": { - "clone": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", - "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=" - } - } - }, - "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", - "requires": { - "color-name": "^1.1.1" - } - }, - "color-diff": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/color-diff/-/color-diff-0.1.7.tgz", - "integrity": "sha1-bbeM2UgqjkWdQIIer0tQMoPcuOI=", - "dev": true - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "requires": { - "color-name": "^1.0.0" - } - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "colorguard": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorguard/-/colorguard-1.2.1.tgz", - "integrity": "sha512-qYVKTg626qpDg4/eBnPXidEPXn5+krbYqHVfyyEFBWV5z3IF4p44HKY/eE2t1ohlcrlIkDgHmFJMfQ8qMLnSFw==", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "color-diff": "^0.1.3", - "log-symbols": "^1.0.2", - "object-assign": "^4.0.1", - "pipetteur": "^2.0.0", - "plur": "^2.0.0", - "postcss": "^5.0.4", - "postcss-reporter": "^1.2.1", - "text-table": "^0.2.0", - "yargs": "^1.2.6" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "postcss-reporter": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-1.4.1.tgz", - "integrity": "sha1-wTbwpbFhkV83ndN2XGEHX357mvI=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "lodash": "^4.1.0", - "log-symbols": "^1.0.2", - "postcss": "^5.0.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - }, - "yargs": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-1.3.3.tgz", - "integrity": "sha1-BU3oth8i7v23IHBZ6u+da4P7kxo=", - "dev": true - } - } - }, - "colors": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz", - "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=", - "dev": true - }, - "columnify": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz", - "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", - "dev": true, - "requires": { - "strip-ansi": "^3.0.0", - "wcwidth": "^1.0.0" - } - }, - "combine-source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.6.1.tgz", - "integrity": "sha1-m0oJwxYDPXaODxHgKfonMOB5rZY=", - "requires": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.5.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.4.2" - }, - "dependencies": { - "lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "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" - } - }, - "comma-separated-tokens": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.7.tgz", - "integrity": "sha512-Jrx3xsP4pPv4AwJUDWY9wOXGtwPXARej6Xd99h4TUGotmf8APuquKMpK+dnD3UgyxK7OEWaisjZz+3b5jtL6xQ==", - "dev": true - }, - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" - }, - "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", - "dev": true - }, - "commondir": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-0.0.1.tgz", - "integrity": "sha1-ifAP3NUbUZxXhzP+xWPmptp/W+I=" - }, - "commoner": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz", - "integrity": "sha1-NPw2cs0kOT6LtH5wyqApOBH08sU=", - "requires": { - "commander": "^2.5.0", - "detective": "^4.3.1", - "glob": "^5.0.15", - "graceful-fs": "^4.1.2", - "iconv-lite": "^0.4.5", - "mkdirp": "^0.5.0", - "private": "^0.1.6", - "q": "^1.1.2", - "recast": "^0.11.17" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "config-chain": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", - "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", - "dev": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", - "dev": true, - "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "dependencies": { - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - } - } - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "consolidate": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", - "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", - "dev": true, - "requires": { - "bluebird": "^3.1.1" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "content-hash": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.4.0.tgz", - "integrity": "sha512-T6LRy2xaOxgLT3jKj8N9xBiTbY+s60AWP7IUYsz+qmvon92r14z6EWgXt74y/5H+DPuBNPzdYH+jyhtDTTCRMA==", - "requires": { - "cids": "^0.5.7", - "multicodec": "^0.5.0", - "multihashes": "^0.4.14", - "varint": "^5.0.0" - }, - "dependencies": { - "base-x": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.5.tgz", - "integrity": "sha512-C3picSgzPSLE+jW3tcBzJoGwitOtazb5B+5YmAxZm2ybmTi9LNgAtDO/jjVEBZwHoXmDBZ9m/IELj3elJVRBcA==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "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" - } - }, - "multihashes": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.14.tgz", - "integrity": "sha512-V/g/EIN6nALXfS/xHUAgtfPP3mn3sPIF/i9beuGKf25QXS2QZYCpeVJbDPEannkz32B2fihzCe2D/KMrbcmefg==", - "requires": { - "bs58": "^4.0.1", - "varint": "^5.0.0" - } - }, - "varint": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.0.tgz", - "integrity": "sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8=" - } - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "content-type-parser": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz", - "integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==", - "dev": true - }, - "continuable-cache": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", - "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=", - "dev": true - }, - "convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-props": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", - "dev": true, - "requires": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" - } - }, - "copy-to-clipboard": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.0.8.tgz", - "integrity": "sha512-c3GdeY8qxCHGezVb1EFQfHYK/8NZRemgcTIzPq7PuxjHAf/raKibn2QdhHPb/y6q74PMgH6yizaDZlRmw6QyKw==", - "requires": { - "toggle-selection": "^1.0.3" - } - }, - "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" - }, - "core-js-compat": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.1.3.tgz", - "integrity": "sha512-EP018pVhgwsKHz3YoN1hTq49aRe+h017Kjz0NQz3nXV0cCRMvH3fLQl+vEPGr4r4J5sk4sU3tUC7U1aqTCeJeA==", - "dev": true, - "requires": { - "browserslist": "^4.6.0", - "core-js-pure": "3.1.3", - "semver": "^6.1.0" - }, - "dependencies": { - "browserslist": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.1.tgz", - "integrity": "sha512-1MC18ooMPRG2UuVFJTHFIAkk6mpByJfxCrnUyvSlu/hyQSFHMrlhM02SzNuCV+quTP4CKmqtOMAIjrifrpBJXQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000971", - "electron-to-chromium": "^1.3.137", - "node-releases": "^1.1.21" - } - }, - "caniuse-lite": { - "version": "1.0.30000973", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000973.tgz", - "integrity": "sha512-/F3t/Yo8LEdRSEPCmI15fLu5vepVh9UCg/9inJXF5AAfW7xRRJkbaM2ut52iRMQMnGCLQouLbFdbOA+VEFOIsg==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.146", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.146.tgz", - "integrity": "sha512-BrUq08sx7eR4PCwLbjFxXmjcbDro6DSoc1pN8VCxq76U+o9JQzJlWH/NVtcpAqcktwpE5CVvMyqHqTQfCETNoQ==", - "dev": true - }, - "semver": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", - "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", - "dev": true - } - } - }, - "core-js-pure": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.1.3.tgz", - "integrity": "sha512-k3JWTrcQBKqjkjI0bkfXS0lbpWPxYuHWfMMjC1VDmzU4Q58IwSbuXSo99YO/hUHlw/EB4AlfA2PVxOGkrIq6dA==", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "corser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", - "integrity": "sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c=", - "dev": true - }, - "cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", - "dev": true, - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.4.3", - "minimist": "^1.2.0", - "object-assign": "^4.1.0", - "os-homedir": "^1.0.1", - "parse-json": "^2.2.0", - "require-from-string": "^1.1.0" - } - }, - "coveralls": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.0.tgz", - "integrity": "sha512-ZppXR9y5PraUOrf/DzHJY6gzNUhXYE3b9D43xEXs4QYZ7/Oe0Gy0CS+IPKWFfvQFXB3RG9QduaQUFehzSpGAFw==", - "dev": true, - "requires": { - "js-yaml": "^3.6.1", - "lcov-parse": "^0.0.10", - "log-driver": "^1.2.5", - "minimist": "^1.2.0", - "request": "^2.79.0" - } - }, - "create-ecdh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, - "requires": { - "capture-stack-trace": "^1.0.0" - } - }, - "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.1", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "sha.js": "^2.4.0" - } - }, - "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.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "create-react-class": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.2.tgz", - "integrity": "sha1-zx7RXxKq1/FO9fLf4F5sQvke8Co=", - "requires": { - "fbjs": "^0.8.9", - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - } - }, - "create-react-context": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.3.tgz", - "integrity": "sha512-CQBmD0+QGgTaxDL3OX1IDXYqjkp2It4RIbcb99jS6AEg27Ga+a9G3JtK6SIu0HBwPLZlmwt9F7UwWA4Bn92Rag==", - "dev": true, - "requires": { - "fbjs": "^0.8.0", - "gud": "^1.0.0" - } - }, - "cross-env": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.1.4.tgz", - "integrity": "sha512-Mx8mw6JWhfpYoEk7PGvHxJMLQwQHORAs8+2bX+C1lGQ4h3GkDb1zbzC2Nw85YH9ZQMlO0BHZxMacgrfPmMFxbg==", - "dev": true, - "requires": { - "cross-spawn": "^5.1.0", - "is-windows": "^1.0.0" - } - }, - "cross-fetch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.3.tgz", - "integrity": "sha512-PrWWNH3yL2NYIb/7WF/5vFG3DCQiXDOVf8k3ijatbrtnwNuhMWLC7YF7uqf53tbTFDzHIUD8oITw4Bxt8ST3Nw==", - "requires": { - "node-fetch": "2.1.2", - "whatwg-fetch": "2.0.4" - }, - "dependencies": { - "node-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", - "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=" - }, - "whatwg-fetch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" - } - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crx-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/crx-parser/-/crx-parser-0.1.2.tgz", - "integrity": "sha1-fu7tnt3JXiLBiTguNGJARKiaWm0=", - "dev": true - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "crypto-js": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.8.tgz", - "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=" - }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", - "dev": true - }, - "css": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.3.tgz", - "integrity": "sha512-0W171WccAjQGGTKLhw4m2nnl0zPHUlTO/I8td4XzJgIB8Hg3ZZx71qT4G4eX8OVsSiaAKiUMy73E3nsbPlg2DQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "source-map": "^0.1.38", - "source-map-resolve": "^0.5.1", - "urix": "^0.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "css-color-list": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/css-color-list/-/css-color-list-0.0.1.tgz", - "integrity": "sha1-hxjoaVrnosyHh76HFfHACKfyixU=", - "dev": true, - "requires": { - "css-color-names": "0.0.1" - } - }, - "css-color-names": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.1.tgz", - "integrity": "sha1-XQVI+iVkVu3kqaDCrHqxnT6xrYE=", - "dev": true - }, - "css-in-js-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz", - "integrity": "sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==", - "dev": true, - "requires": { - "hyphenate-style-name": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "css-loader": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz", - "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==", - "dev": true, - "requires": { - "camelcase": "^5.2.0", - "icss-utils": "^4.1.0", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.14", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^2.0.6", - "postcss-modules-scope": "^2.1.0", - "postcss-modules-values": "^2.0.0", - "postcss-value-parser": "^3.3.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "postcss": { - "version": "7.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", - "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "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 - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - } - } - }, - "css-rule-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-rule-stream/-/css-rule-stream-1.1.0.tgz", - "integrity": "sha1-N4bnGYmD2WWibjGVfgkHjLt3BaI=", - "dev": true, - "requires": { - "css-tokenize": "^1.0.1", - "duplexer2": "0.0.2", - "ldjson-stream": "^1.2.1", - "through2": "^0.6.3" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "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=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true - }, - "css-tokenize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-tokenize/-/css-tokenize-1.0.1.tgz", - "integrity": "sha1-RiXLHtohwUOFi3+B1oA8HSb8FL4=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^1.0.33" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "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=", - "dev": true - } - } - }, - "css-tree": { - "version": "1.0.0-alpha.28", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.28.tgz", - "integrity": "sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w==", - "dev": true, - "requires": { - "mdn-data": "~1.1.0", - "source-map": "^0.5.3" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "css-url-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-url-regex/-/css-url-regex-1.1.0.tgz", - "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=", - "dev": true - }, - "css-vendor": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-0.3.8.tgz", - "integrity": "sha1-ZCHP0wNM5mT+dnOXL9ARn8KJQfo=", - "requires": { - "is-in-browser": "^1.0.2" - } - }, - "css-what": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "cssom": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", - "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=", - "dev": true - }, - "cssstyle": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", - "dev": true, - "requires": { - "cssom": "0.3.x" - } - }, - "csstype": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.4.2.tgz", - "integrity": "sha512-1TnkyZwDy0oUl//6685j2bTMNe61SzntWntijNdmmEzvpYbGmVMZkj204gv4glcQp6z/ypg+YRziT91XVFmOyg==" - }, - "currency-formatter": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/currency-formatter/-/currency-formatter-1.4.2.tgz", - "integrity": "sha512-rQ5HB3DenCZwfVPdpVTuVcAORodVO0VoqIbjhdUSuy0sE2b9jBdCaVKbA355NUc2KhPbu5ojHs3WypuEwPLfNg==", - "requires": { - "accounting": "^0.4.1", - "locale-currency": "0.0.1", - "object-assign": "^4.1.1" - } - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", - "dev": true - }, - "cycle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=", - "dev": true, - "optional": true - }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", - "dev": true - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "requires": { - "es5-ext": "^0.10.9" - } - }, - "d3": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-5.7.0.tgz", - "integrity": "sha512-8KEIfx+dFm8PlbJN9PI0suazrZ41QcaAufsKE9PRcqYPWLngHIyWJZX96n6IQKePGgeSu0l7rtlueSSNq8Zc3g==", - "requires": { - "d3-array": "1", - "d3-axis": "1", - "d3-brush": "1", - "d3-chord": "1", - "d3-collection": "1", - "d3-color": "1", - "d3-contour": "1", - "d3-dispatch": "1", - "d3-drag": "1", - "d3-dsv": "1", - "d3-ease": "1", - "d3-fetch": "1", - "d3-force": "1", - "d3-format": "1", - "d3-geo": "1", - "d3-hierarchy": "1", - "d3-interpolate": "1", - "d3-path": "1", - "d3-polygon": "1", - "d3-quadtree": "1", - "d3-random": "1", - "d3-scale": "2", - "d3-scale-chromatic": "1", - "d3-selection": "1", - "d3-shape": "1", - "d3-time": "1", - "d3-time-format": "2", - "d3-timer": "1", - "d3-transition": "1", - "d3-voronoi": "1", - "d3-zoom": "1" - } - }, - "d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" - }, - "d3-axis": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", - "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" - }, - "d3-brush": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.6.tgz", - "integrity": "sha512-lGSiF5SoSqO5/mYGD5FAeGKKS62JdA1EV7HPrU2b5rTX4qEJJtpjaGLJngjnkewQy7UnGstnFd3168wpf5z76w==", - "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "d3-chord": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", - "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", - "requires": { - "d3-array": "1", - "d3-path": "1" - } - }, - "d3-collection": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", - "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" - }, - "d3-color": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.2.3.tgz", - "integrity": "sha512-x37qq3ChOTLd26hnps36lexMRhNXEtVxZ4B25rL0DVdDsGQIJGB18S7y9XDwlDD6MD/ZBzITCf4JjGMM10TZkw==" - }, - "d3-contour": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", - "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", - "requires": { - "d3-array": "^1.1.1" - } - }, - "d3-dispatch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.5.tgz", - "integrity": "sha512-vwKx+lAqB1UuCeklr6Jh1bvC4SZgbSqbkGBLClItFBIYH4vqDJCA7qfoy14lXmJdnBOdxndAMxjCbImJYW7e6g==" - }, - "d3-drag": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.3.tgz", - "integrity": "sha512-8S3HWCAg+ilzjJsNtWW1Mutl74Nmzhb9yU6igspilaJzeZVFktmY6oO9xOh5TDk+BM2KrNFjttZNoJJmDnkjkg==", - "requires": { - "d3-dispatch": "1", - "d3-selection": "1" - } - }, - "d3-dsv": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.0.10.tgz", - "integrity": "sha512-vqklfpxmtO2ZER3fq/B33R/BIz3A1PV0FaZRuFM8w6jLo7sUX1BZDh73fPlr0s327rzq4H6EN1q9U+eCBCSN8g==", - "requires": { - "commander": "2", - "iconv-lite": "0.4", - "rw": "1" - } - }, - "d3-ease": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.5.tgz", - "integrity": "sha512-Ct1O//ly5y5lFM9YTdu+ygq7LleSgSE4oj7vUt9tPLHUi8VCV7QoizGpdWRWAwCO9LdYzIrQDg97+hGVdsSGPQ==" - }, - "d3-fetch": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.1.2.tgz", - "integrity": "sha512-S2loaQCV/ZeyTyIF2oP8D1K9Z4QizUzW7cWeAOAS4U88qOt3Ucf6GsmgthuYSdyB2HyEm4CeGvkQxWsmInsIVA==", - "requires": { - "d3-dsv": "1" - } - }, - "d3-force": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.1.2.tgz", - "integrity": "sha512-p1vcHAUF1qH7yR+e8ip7Bs61AHjLeKkIn8Z2gzwU2lwEf2wkSpWdjXG0axudTHsVFnYGlMkFaEsVy2l8tAg1Gw==", - "requires": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" - } - }, - "d3-format": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.3.2.tgz", - "integrity": "sha512-Z18Dprj96ExragQ0DeGi+SYPQ7pPfRMtUXtsg/ChVIKNBCzjO8XYJvRTC1usblx52lqge56V5ect+frYTQc8WQ==" - }, - "d3-geo": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.11.3.tgz", - "integrity": "sha512-n30yN9qSKREvV2fxcrhmHUdXP9TNH7ZZj3C/qnaoU0cVf/Ea85+yT7HY7i8ySPwkwjCNYtmKqQFTvLFngfkItQ==", - "requires": { - "d3-array": "1" - } - }, - "d3-hierarchy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz", - "integrity": "sha512-L+GHMSZNwTpiq4rt9GEsNcpLa4M96lXMR8M/nMG9p5hBE0jy6C+3hWtyZMenPQdwla249iJy7Nx0uKt3n+u9+w==" - }, - "d3-interpolate": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.3.2.tgz", - "integrity": "sha512-NlNKGopqaz9qM1PXh9gBF1KSCVh+jSFErrSlD/4hybwoNX/gt1d8CDbDW+3i+5UOHhjC6s6nMvRxcuoMVNgL2w==", - "requires": { - "d3-color": "1" - } - }, - "d3-path": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.7.tgz", - "integrity": "sha512-q0cW1RpvA5c5ma2rch62mX8AYaiLX0+bdaSM2wxSU9tXjU4DNvkx9qiUvjkuWCj3p22UO/hlPivujqMiR9PDzA==" - }, - "d3-polygon": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.5.tgz", - "integrity": "sha512-RHhh1ZUJZfhgoqzWWuRhzQJvO7LavchhitSTHGu9oj6uuLFzYZVeBzaWTQ2qSO6bz2w55RMoOCf0MsLCDB6e0w==" - }, - "d3-quadtree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.5.tgz", - "integrity": "sha512-U2tjwDFbZ75JRAg8A+cqMvqPg1G3BE7UTJn3h8DHjY/pnsAfWdbJKgyfcy7zKjqGtLAmI0q8aDSeG1TVIKRaHQ==" - }, - "d3-random": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", - "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" - }, - "d3-scale": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.1.2.tgz", - "integrity": "sha512-bESpd64ylaKzCDzvULcmHKZTlzA/6DGSVwx7QSDj/EnX9cpSevsdiwdHFYI9ouo9tNBbV3v5xztHS2uFeOzh8Q==", - "requires": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" - } - }, - "d3-scale-chromatic": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.3.3.tgz", - "integrity": "sha512-BWTipif1CimXcYfT02LKjAyItX5gKiwxuPRgr4xM58JwlLocWbjPLI7aMEjkcoOQXMkYsmNsvv3d2yl/OKuHHw==", - "requires": { - "d3-color": "1", - "d3-interpolate": "1" - } - }, - "d3-selection": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.3.2.tgz", - "integrity": "sha512-OoXdv1nZ7h2aKMVg3kaUFbLLK5jXUFAMLD/Tu5JA96mjf8f2a9ZUESGY+C36t8R1WFeWk/e55hy54Ml2I62CRQ==" - }, - "d3-shape": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.2.tgz", - "integrity": "sha512-hUGEozlKecFZ2bOSNt7ENex+4Tk9uc/m0TtTEHBvitCBxUNjhzm5hS2GrrVRD/ae4IylSmxGeqX5tWC2rASMlQ==", - "requires": { - "d3-path": "1" - } - }, - "d3-time": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.10.tgz", - "integrity": "sha512-hF+NTLCaJHF/JqHN5hE8HVGAXPStEq6/omumPE/SxyHVrR7/qQxusFDo0t0c/44+sCGHthC7yNGFZIEgju0P8g==" - }, - "d3-time-format": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.3.tgz", - "integrity": "sha512-6k0a2rZryzGm5Ihx+aFMuO1GgelgIz+7HhB4PH4OEndD5q2zGn1mDfRdNrulspOfR6JXkb2sThhDK41CSK85QA==", - "requires": { - "d3-time": "1" - } - }, - "d3-timer": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.9.tgz", - "integrity": "sha512-rT34J5HnQUHhcLvhSB9GjCkN0Ddd5Y8nCwDBG2u6wQEeYxT/Lf51fTFFkldeib/sE/J0clIe0pnCfs6g/lRbyg==" - }, - "d3-transition": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.1.3.tgz", - "integrity": "sha512-tEvo3qOXL6pZ1EzcXxFcPNxC/Ygivu5NoBY6mbzidATAeML86da+JfVIUzon3dNM6UX6zjDx+xbYDmMVtTSjuA==", - "requires": { - "d3-color": "1", - "d3-dispatch": "1", - "d3-ease": "1", - "d3-interpolate": "1", - "d3-selection": "^1.1.0", - "d3-timer": "1" - } - }, - "d3-voronoi": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", - "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" - }, - "d3-zoom": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.7.3.tgz", - "integrity": "sha512-xEBSwFx5Z9T3/VrwDkMt+mr0HCzv7XjpGURJ8lWmIC8wxe32L39eWHIasEe/e7Ox8MPU4p1hvH8PKN2olLzIBg==", - "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "dashdash": { - "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" - } - }, - "data-uri-to-buffer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", - "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==" - }, - "date-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.0.0.tgz", - "integrity": "sha512-M6UqVvZVgFYqZL1SfHsRGIQSz3ZL+qgbsV5Lp1Vj61LZVYuEwcMXYay7DRDtYs2HQQBK5hQtQ0fD9aEJ89V0LA==", - "dev": true - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", - "dev": true - }, - "debounce": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.1.0.tgz", - "integrity": "sha512-ZQVKfRVlwRfD150ndzEK8M90ABT+Y/JQKs4Y7U4MXdpuoUkkrr4DwKbVux3YjylA5bUMUj0Nc3pMxPJX6N2QQQ==" - }, - "debounce-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/debounce-stream/-/debounce-stream-2.0.0.tgz", - "integrity": "sha1-HjNADM/wFavY7DMGYaVitoQQsI8=", - "requires": { - "debounce": "^1.0.0", - "duplexer": "^0.1.1", - "through": "^2.3.6" - } - }, - "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" - } - }, - "debug-fabulous": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.0.0.tgz", - "integrity": "sha512-dsd50qQ1atDeurcxL7XOjPp4nZCGZzWIONDujDXzl1atSyC3hMbZD+v6440etw+Vt0Pr8ce4TQzHfX3KZM05Mw==", - "dev": true, - "requires": { - "debug": "3.X", - "memoizee": "0.4.X", - "object-assign": "4.X" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-diff": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz", - "integrity": "sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ=" - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" - }, - "deep-extend": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", - "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==" - }, - "deep-freeze-strict": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-freeze-strict/-/deep-freeze-strict-1.1.1.tgz", - "integrity": "sha1-d9BYPKJKab5LvZrC+uQV1VUj5bA=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "deep-object-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.0.tgz", - "integrity": "sha512-b+QLs5vHgS+IoSNcUE4n9HP2NwcHj7aqnJWsjPtuG75Rh5TOaGt0OjAYInh77d5T16V5cRDC+Pw/6ZZZiETBGw==", - "dev": true - }, - "deepmerge": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-0.2.10.tgz", - "integrity": "sha1-iQa/nlJaT78bIDsq/LRkAkmCEhk=", - "dev": true - }, - "default-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", - "dev": true, - "requires": { - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", - "dev": true - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - } - } - }, - "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.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "requires": { - "foreach": "^2.0.5", - "object-keys": "^1.0.8" - } - }, - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, - "degenerator": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", - "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", - "requires": { - "ast-types": "0.x.x", - "escodegen": "1.x.x", - "esprima": "3.x.x" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" - } - } - }, - "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", - "dev": true, - "requires": { - "globby": "^6.1.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "p-map": "^1.1.1", - "pify": "^3.0.0", - "rimraf": "^2.2.8" - }, - "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" - }, - "deps-sort": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", - "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "shasum": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" - } - }, - "derequire": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/derequire/-/derequire-2.0.6.tgz", - "integrity": "sha1-MaQUu3yhdiOfp4sRZjbvd9UX52g=", - "requires": { - "acorn": "^4.0.3", - "concat-stream": "^1.4.6", - "escope": "^3.6.0", - "through2": "^2.0.0", - "yargs": "^6.5.0" - } - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "requires": { - "repeating": "^2.0.0" - } - }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", - "dev": true - }, - "detect-node": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", - "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=" - }, - "detect-port": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", - "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", - "dev": true, - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - } - }, - "detective": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", - "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", - "requires": { - "acorn": "^5.2.1", - "defined": "^1.0.0" - }, - "dependencies": { - "acorn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", - "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==" - } - } - }, - "detectrtc": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/detectrtc/-/detectrtc-1.3.6.tgz", - "integrity": "sha1-2rwDU5gaPadzLelpBxwItt3dW1k=" - }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", - "dev": true - }, - "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" - }, - "dependencies": { - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - } - } - }, - "disc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/disc/-/disc-1.3.3.tgz", - "integrity": "sha512-ui/kegr2k3tDr2EU7cA9Ag+YofgmB3shwSFJuuf6r6Epom2cyHhd5jBtCOhwXKSDFMlYEMeSadujjRS2uSqRsw==", - "requires": { - "bl": "^1.2.0", - "browser-unpack": "^1.2.0", - "builtins": "0.0.3", - "commondir": "0.0.1", - "d3": "^3.4.3", - "duplexer": "^0.1.1", - "file-tree": "^1.0.0", - "flatten": "0.0.1", - "map-async": "^0.1.1", - "opener": "^1.3.0", - "optimist": "^0.6.1", - "plucker": "0.0.0", - "through": "^2.3.4", - "uniq": "^1.0.0" - }, - "dependencies": { - "d3": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", - "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=" - } - } - }, - "discontinuous-range": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", - "dev": true - }, - "dispensary": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/dispensary/-/dispensary-0.37.0.tgz", - "integrity": "sha512-Baqbt8MDkRYQZHB7XEd8iBUP8wRkRLjNWbm16nSDTOIoGvgF4Z8Q9wV1yD72TYjFC0kj1/o3nfPXPiAvWqjC8g==", - "dev": true, - "requires": { - "array-from": "~2.1.1", - "async": "~3.0.0", - "natural-compare-lite": "~1.4.0", - "pino": "~5.12.0", - "request": "~2.88.0", - "sha.js": "~2.4.4", - "snyk": "^1.165.1", - "source-map-support": "~0.5.4", - "yargs": "~13.2.0" - }, - "dependencies": { - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "async": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/async/-/async-3.0.1.tgz", - "integrity": "sha512-ZswD8vwPtmBZzbn9xyi8XBQWXH3AvOQ43Za1KWYq7JeycrZuUYzx01KvHcVbXltjqH4y0MWrQ33008uLTqXuDw==", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", - "dev": true - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "dev": true, - "requires": { - "mime-db": "1.40.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "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 - }, - "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yargs": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", - "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.0" - } - }, - "yargs-parser": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.0.tgz", - "integrity": "sha512-Yq+32PrijHRri0vVKQEm+ys8mbqWjLiwQkMFNXEENutzLPP0bE4Lcd4iA3OQY5HF+GD3xXxf0MEHb8E4/SA3AA==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "disposables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/disposables/-/disposables-1.0.2.tgz", - "integrity": "sha1-NsamdEdfVaLWkTVnpgFETkh7S24=" - }, - "dnd-core": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-3.0.2.tgz", - "integrity": "sha1-6UdXdiBTHH7jelGM1d3hfQ798PM=", - "requires": { - "@types/invariant": "^2.2.29", - "@types/lodash": "^4.14.107", - "@types/node": "^8.10.11", - "@types/redux": "^3.6.0", - "asap": "^2.0.6", - "invariant": "^2.0.0", - "lodash": "^4.2.0", - "redux": "^4.0.0" - }, - "dependencies": { - "@types/node": { - "version": "8.10.48", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.48.tgz", - "integrity": "sha512-c35YEBTkL4rzXY2ucpSKy+UYHjUBIIkuJbWYbsGIrKLEWU5dgJMmLkkIb3qeC3O3Tpb1ZQCwecscvJTDjDjkRw==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "redux": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.1.tgz", - "integrity": "sha512-R7bAtSkk7nY6O/OYMVR9RiBI+XghjF9rlbl5806HJbQph0LJVHZrU5oaO4q70eUKiqMRqm4y07KLTlMZ2BlVmg==", - "requires": { - "loose-envify": "^1.4.0", - "symbol-observable": "^1.2.0" - } - }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" - } - } - }, - "dnode": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/dnode/-/dnode-1.2.2.tgz", - "integrity": "sha1-SsPP4m4pKzs5uCWK59lO3FgTLvo=", - "requires": { - "dnode-protocol": "~0.2.2", - "jsonify": "~0.0.0", - "weak": "^1.0.0" - } - }, - "dnode-protocol": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dnode-protocol/-/dnode-protocol-0.2.2.tgz", - "integrity": "sha1-URUdFvw7X4SBXuC5SXoQYdDRlJ0=", - "requires": { - "jsonify": "~0.0.0", - "traverse": "~0.6.3" - } - }, - "dockerfile-ast": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/dockerfile-ast/-/dockerfile-ast-0.0.16.tgz", - "integrity": "sha512-+HZToHjjiLPl46TqBrok5dMrg5oCkZFPSROMQjRmvin0zG4FxK0DJXTpV/CUPYY2zpmEvVza55XLwSHFx/xZMw==", - "dev": true, - "requires": { - "vscode-languageserver-types": "^3.5.0" - } - }, - "doctrine": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.2.tgz", - "integrity": "sha512-y0tm5Pq6ywp3qSTZ1vPgVdAnbDEoeoc5wlOHXoY1c4Wug/a7JvqHIl7BTvwodaHmejWkK/9dSb3sCYfyo/om8A==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "doiuse": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/doiuse/-/doiuse-2.6.0.tgz", - "integrity": "sha1-GJLRC2Gpo1at2/K2FJM+gfi7ODQ=", - "dev": true, - "requires": { - "browserslist": "^1.1.1", - "caniuse-db": "^1.0.30000187", - "css-rule-stream": "^1.1.0", - "duplexer2": "0.0.2", - "jsonfilter": "^1.1.2", - "ldjson-stream": "^1.2.1", - "lodash": "^4.0.0", - "multimatch": "^2.0.0", - "postcss": "^5.0.8", - "source-map": "^0.4.2", - "through2": "^0.6.3", - "yargs": "^3.5.4" - }, - "dependencies": { - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", - "dev": true - }, - "yargs": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", - "dev": true, - "requires": { - "camelcase": "^2.0.1", - "cliui": "^3.0.3", - "decamelize": "^1.1.1", - "os-locale": "^1.4.0", - "string-width": "^1.0.1", - "window-size": "^0.1.4", - "y18n": "^3.2.0" - } - } - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "requires": { - "utila": "~0.4" - } - }, - "dom-helpers": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.3.1.tgz", - "integrity": "sha512-2Sm+JaYn74OiTM2wHvxJOo3roiq/h25Yi69Fqk269cNUwIXsCvATB6CRSFC9Am/20G2b28hGv/+7NiWydIrPvg==" - }, - "dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", - "dev": true, - "requires": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" - } - }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "dev": true, - "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - } - } - }, - "dom-walk": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true - }, - "domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.0.tgz", - "integrity": "sha512-WpwuBlZ2lQRFa4H/4w49deb9rJLot9KmqrKKjMc9qBl7CID+DdC2swoa34ccRl+anL2B6bLp6TjFdIdnzekMBQ==", - "dev": true - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domkit": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/domkit/-/domkit-0.0.1.tgz", - "integrity": "sha1-iDmdWGeU78EVT+xsIs/lDxm9Tbs=" - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "dev": true, - "requires": { - "is-obj": "^1.0.0" - } - }, - "dotenv": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", - "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==", - "dev": true - }, - "dotenv-defaults": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/dotenv-defaults/-/dotenv-defaults-1.0.2.tgz", - "integrity": "sha512-iXFvHtXl/hZPiFj++1hBg4lbKwGM+t/GlvELDnRtOFdjXyWP7mubkVr+eZGWG62kdsbulXAef6v/j6kiWc/xGA==", - "dev": true, - "requires": { - "dotenv": "^6.2.0" - } - }, - "dotenv-expand": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz", - "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=", - "dev": true - }, - "dotenv-webpack": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-1.7.0.tgz", - "integrity": "sha512-wwNtOBW/6gLQSkb8p43y0Wts970A3xtNiG/mpwj9MLUhtPCQG6i+/DSXXoNN7fbPCU/vQ7JjwGmgOeGZSSZnsw==", - "dev": true, - "requires": { - "dotenv-defaults": "^1.0.2" - } - }, - "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.2", - "create-hmac": "^1.1.4" - } - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" - }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "requires": { - "readable-stream": "~1.1.9" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "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=", - "dev": true - } - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "duplexify": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.1.tgz", - "integrity": "sha512-j5goxHTwVED1Fpe5hh3q9R93Kip0Bg2KVAt4f8CEYM3UEwYcPSvWbXaUQOzdX/HtiNomipv+gU7ASQPDbV7pGQ==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "each-props": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.1", - "object.defaults": "^1.1.0" - } - }, - "ecc-jsbn": { - "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.0" - } - }, - "ecstatic": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/ecstatic/-/ecstatic-3.3.2.tgz", - "integrity": "sha512-fLf9l1hnwrHI2xn9mEDT7KIi22UDqA2jaCwyCbSUJh9a1V+LEUSL/JO/6TIz/QyuBURWUHrFL5Kg2TtO1bkkog==", - "dev": true, - "requires": { - "he": "^1.1.1", - "mime": "^1.6.0", - "minimist": "^1.1.0", - "url-join": "^2.0.5" - }, - "dependencies": { - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - } - } - }, - "editorconfig": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.13.3.tgz", - "integrity": "sha512-WkjsUNVCu+ITKDj73QDvi0trvpdDWdkDyHybDGSXPfekLCqwmpD7CP7iPbvBgosNuLcI96XTDwNa75JyFl7tEQ==", - "dev": true, - "requires": { - "bluebird": "^3.0.5", - "commander": "^2.9.0", - "lru-cache": "^3.2.0", - "semver": "^5.1.0", - "sigmund": "^1.0.1" - }, - "dependencies": { - "lru-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz", - "integrity": "sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=", - "dev": true, - "requires": { - "pseudomap": "^1.0.1" - } - } - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "ejs": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", - "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", - "dev": true - }, - "electron-releases": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/electron-releases/-/electron-releases-2.1.0.tgz", - "integrity": "sha512-cyKFD1bTE/UgULXfaueIN1k5EPFzs+FRc/rvCY5tIynefAPqopQEgjr0EzY+U3Dqrk/G4m9tXSPuZ77v6dL/Rw==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.30", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.30.tgz", - "integrity": "sha512-zx1Prv7kYLfc4OA60FhxGbSo4qrEjgSzpo1/37i7l9ltXPYOoQBtjQxY9KmsgfHnBxHlBGXwLlsbt/gub1w5lw==", - "dev": true, - "requires": { - "electron-releases": "^2.1.0" - } - }, - "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "email-validator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.4.tgz", - "integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "emotion-theming": { - "version": "10.0.10", - "resolved": "https://registry.npmjs.org/emotion-theming/-/emotion-theming-10.0.10.tgz", - "integrity": "sha512-E4SQ3Y91avxxydDgubi/po/GaC5MM1XHm8kcClKg1PA/TeOye0PiLBzAzlgt9dBzDRV9+qHDunsayPvzVYIYng==", - "dev": true, - "requires": { - "@emotion/weak-memoize": "0.2.2", - "hoist-non-react-statics": "^3.3.0", - "object-assign": "^4.1.1" - }, - "dependencies": { - "hoist-non-react-statics": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", - "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", - "dev": true, - "requires": { - "react-is": "^16.7.0" - } - }, - "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", - "dev": true - } - } - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "~0.4.13" - } - }, - "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" - } - }, - "engine.io": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", - "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.0", - "ws": "~3.3.1" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "engine.io-client": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", - "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.1", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~3.3.1", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "engine.io-parser": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", - "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.4", - "has-binary2": "~1.0.2" - } - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" - } - }, - "ensure-posix-path": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ensure-posix-path/-/ensure-posix-path-1.0.2.tgz", - "integrity": "sha1-pls+QtC3HPxYXrd0+ZQ8jZuRsMI=", - "dev": true - }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", - "dev": true - }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - }, - "envify": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/envify/-/envify-4.1.0.tgz", - "integrity": "sha512-IKRVVoAYr4pIx4yIWNsz9mOsboxlNXiu7TNBnem/K/uTHdkyzXWDzHCK7UTolqBbgaBz0tQHsD3YNls0uIIjiw==", - "dev": true, - "requires": { - "esprima": "^4.0.0", - "through": "~2.3.4" - } - }, - "enzyme": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.6.0.tgz", - "integrity": "sha512-onsINzVLGqKIapTVfWkkw6bYvm1o4CyJ9s8POExtQhAkVa4qFDW6DGCQGRy/5bfZYk+gmUbMNyayXiWDzTkHFQ==", - "dev": true, - "requires": { - "array.prototype.flat": "^1.2.1", - "cheerio": "^1.0.0-rc.2", - "function.prototype.name": "^1.1.0", - "has": "^1.0.3", - "is-boolean-object": "^1.0.0", - "is-callable": "^1.1.4", - "is-number-object": "^1.0.3", - "is-string": "^1.0.4", - "is-subset": "^0.1.1", - "lodash.escape": "^4.0.1", - "lodash.isequal": "^4.5.0", - "object-inspect": "^1.6.0", - "object-is": "^1.0.1", - "object.assign": "^4.1.0", - "object.entries": "^1.0.4", - "object.values": "^1.0.4", - "raf": "^3.4.0", - "rst-selector-parser": "^2.2.3", - "string.prototype.trim": "^1.1.2" - }, - "dependencies": { - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true - }, - "lodash.escape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", - "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=", - "dev": true - }, - "object-inspect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", - "dev": true - } - } - }, - "enzyme-adapter-react-15": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/enzyme-adapter-react-15/-/enzyme-adapter-react-15-1.1.0.tgz", - "integrity": "sha512-2B2uz+UNIHLo+XnLGG6KtDYbVM2SDMAhFinWXalFOzs0971qzA1i2v9avd8Qx8Weo84TjG10Ox2EHfmyRckNMw==", - "dev": true, - "requires": { - "enzyme-adapter-utils": "^1.6.0", - "object.assign": "^4.1.0", - "object.values": "^1.0.4", - "prop-types": "^15.6.2", - "react-is": "^16.4.2" - }, - "dependencies": { - "prop-types": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", - "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", - "dev": true, - "requires": { - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - } - } - } - }, - "enzyme-adapter-utils": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.8.0.tgz", - "integrity": "sha512-K9U2RGr1pvWPGEAIRQRVH4UdlqzpfLsKonuHyAK6lxu46yfGsMDVlO3+YvQwQpVjVw8eviEVIOmlFAnMbIhv/w==", - "dev": true, - "requires": { - "function.prototype.name": "^1.1.0", - "object.assign": "^4.1.0", - "prop-types": "^15.6.2" - }, - "dependencies": { - "prop-types": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", - "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", - "dev": true, - "requires": { - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - } - } - } - }, - "errno": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.6.tgz", - "integrity": "sha512-IsORQDpaaSwcDP4ZZnHxgE85werpo34VYn1Ud3mq+eUsF593faR8oCZNXrROVkpFu2TsbrNhHin0aUrTsQ9vNw==", - "requires": { - "prr": "~1.0.1" - } - }, - "error": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", - "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", - "dev": true, - "requires": { - "string-template": "~0.2.1", - "xtend": "~4.0.0" - } - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz", - "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==", - "requires": { - "es-to-primitive": "^1.1.1", - "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" - } - }, - "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", - "requires": { - "is-callable": "^1.1.1", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.1" - } - }, - "es5-ext": { - "version": "0.10.37", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.37.tgz", - "integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=", - "requires": { - "es6-iterator": "~2.0.1", - "es6-symbol": "~3.1.1" - } - }, - "es5-shim": { - "version": "4.5.13", - "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.5.13.tgz", - "integrity": "sha512-xi6hh6gsvDE0MaW4Vp1lgNEBpVcCXRWfPXj5egDvtgLz4L9MEvNwYEMdJH+JJinWkwa8c3c3o5HduV7dB/e1Hw==", - "dev": true - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-promise": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", - "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==" - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "requires": { - "es6-promise": "^4.0.3" - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-shim": { - "version": "0.35.5", - "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.5.tgz", - "integrity": "sha512-E9kK/bjtCQRpN1K28Xh4BlmP8egvZBGJJ+9GtnzOwt7mdqtrjHFuVGr7QJfdjBIKqrlU5duPf3pCBoDrkjVYFg==", - "dev": true - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "requires": { - "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "escodegen": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", - "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", - "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true - } - } - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", - "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", - "dev": true, - "requires": { - "ajv": "^5.3.0", - "babel-code-frame": "^6.22.0", - "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^3.7.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^3.5.4", - "esquery": "^1.0.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.0.1", - "ignore": "^3.3.3", - "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^1.0.1", - "require-uncached": "^1.0.3", - "semver": "^5.3.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "4.0.2", - "text-table": "~0.2.0" - }, - "dependencies": { - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", - "dev": true, - "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "regexpp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", - "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "eslint-plugin-chai": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-chai/-/eslint-plugin-chai-0.0.1.tgz", - "integrity": "sha1-mh3qWLM1wxJCIZ0Fmzf/sUMJ9uE=", - "dev": true - }, - "eslint-plugin-json": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-json/-/eslint-plugin-json-1.2.0.tgz", - "integrity": "sha1-m6c7sL6Z1QCT6In1uWhGPSow764=", - "dev": true, - "requires": { - "jshint": "^2.8.0" - } - }, - "eslint-plugin-mocha": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-5.0.0.tgz", - "integrity": "sha512-mpRWWsjxRco2bY4qE5DL8SmGoVF0Onb6DZrbgOjFoNo1YNN299K2voIozd8Kce3qC/neWNr2XF27E1ZDMl1yZg==", - "dev": true, - "requires": { - "ramda": "^0.25.0" - }, - "dependencies": { - "ramda": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", - "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==", - "dev": true - } - } - }, - "eslint-plugin-no-unsafe-innerhtml": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsafe-innerhtml/-/eslint-plugin-no-unsafe-innerhtml-1.0.16.tgz", - "integrity": "sha1-fQKHjI6b95FriINtWsEitC8VGTI=", - "dev": true, - "requires": { - "eslint": "^3.7.1" - }, - "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" - } - }, - "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", - "dev": true - }, - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", - "dev": true - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "^1.0.1" - } - }, - "eslint": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", - "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", - "dev": true, - "requires": { - "babel-code-frame": "^6.16.0", - "chalk": "^1.1.3", - "concat-stream": "^1.5.2", - "debug": "^2.1.1", - "doctrine": "^2.0.0", - "escope": "^3.6.0", - "espree": "^3.4.0", - "esquery": "^1.0.0", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "glob": "^7.0.3", - "globals": "^9.14.0", - "ignore": "^3.2.0", - "imurmurhash": "^0.1.4", - "inquirer": "^0.12.0", - "is-my-json-valid": "^2.10.0", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.5.1", - "json-stable-stringify": "^1.0.0", - "levn": "^0.3.0", - "lodash": "^4.0.0", - "mkdirp": "^0.5.0", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.1", - "pluralize": "^1.2.1", - "progress": "^1.1.8", - "require-uncached": "^1.0.2", - "shelljs": "^0.7.5", - "strip-bom": "^3.0.0", - "strip-json-comments": "~2.0.1", - "table": "^3.7.8", - "text-table": "~0.2.0", - "user-home": "^2.0.0" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "inquirer": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", - "dev": true, - "requires": { - "ansi-escapes": "^1.1.0", - "ansi-regex": "^2.0.0", - "chalk": "^1.0.0", - "cli-cursor": "^1.0.1", - "cli-width": "^2.0.0", - "figures": "^1.3.5", - "lodash": "^4.3.0", - "readline2": "^1.0.1", - "run-async": "^0.1.0", - "rx-lite": "^3.1.2", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.0", - "through": "^2.3.6" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "onetime": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "pluralize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", - "dev": true - }, - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" - } - }, - "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", - "dev": true, - "requires": { - "once": "^1.3.0" - } - }, - "rx-lite": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", - "dev": true - }, - "shelljs": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "table": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", - "dev": true, - "requires": { - "ajv": "^4.7.0", - "ajv-keywords": "^1.0.0", - "chalk": "^1.1.1", - "lodash": "^4.0.0", - "slice-ansi": "0.0.4", - "string-width": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - } - } - }, - "eslint-plugin-react": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.5.1.tgz", - "integrity": "sha512-YGSjB9Qu6QbVTroUZi66pYky3DfoIPLdHQ/wmrBGyBRnwxQsBXAov9j2rpXt/55i8nyMv6IRWJv2s4d4YnduzQ==", - "dev": true, - "requires": { - "doctrine": "^2.0.0", - "has": "^1.0.1", - "jsx-ast-utils": "^2.0.0", - "prop-types": "^15.6.0" - } - }, - "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", - "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", - "dev": true - }, - "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", - "dev": true - }, - "espree": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz", - "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", - "dev": true, - "requires": { - "acorn": "^5.2.1", - "acorn-jsx": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", - "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true - }, - "esquery": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", - "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", - "requires": { - "estraverse": "^4.1.0", - "object-assign": "^4.0.1" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "eth-block-tracker": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-4.1.0.tgz", - "integrity": "sha512-991xTy6CzYYbizkHmgRFFI9iGx1OCISve8sSLuOlt7/yD7VFH1Jd8mOmBqxaG5ywGkIXdwAR78nQ2WDReETzBg==", - "requires": { - "eth-json-rpc-infura": "^3.1.2", - "eth-query": "^2.1.0", - "events": "^3.0.0", - "pify": "^3.0.0", - "safe-event-emitter": "^1.0.1" - }, - "dependencies": { - "babelify": { - "version": "7.3.0", - "resolved": "http://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } - }, - "eth-json-rpc-infura": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.0.tgz", - "integrity": "sha512-FLcpdxPRVBCUc7yoE+wHGvyYg2lATedP+/q7PsKvaSzQpJbgTG4ZjLnyrLanxDr6M1k/dSNa6V5QnILwjUKJcw==", - "requires": { - "cross-fetch": "^2.1.1", - "eth-json-rpc-middleware": "^1.5.0", - "json-rpc-engine": "^3.4.0", - "json-rpc-error": "^2.0.0", - "tape": "^4.8.0" - } - }, - "eth-json-rpc-middleware": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz", - "integrity": "sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==", - "requires": { - "async": "^2.5.0", - "eth-query": "^2.1.2", - "eth-tx-summary": "^3.1.2", - "ethereumjs-block": "^1.6.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.2", - "ethereumjs-vm": "^2.1.0", - "fetch-ponyfill": "^4.0.0", - "json-rpc-engine": "^3.6.0", - "json-rpc-error": "^2.0.0", - "json-stable-stringify": "^1.0.1", - "promise-to-callback": "^1.0.0", - "tape": "^4.6.3" - } - }, - "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" - } - }, - "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==" - }, - "json-rpc-engine": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz", - "integrity": "sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==", - "requires": { - "async": "^2.0.1", - "babel-preset-env": "^1.7.0", - "babelify": "^7.3.0", - "json-rpc-error": "^2.0.0", - "promise-to-callback": "^1.0.0", - "safe-event-emitter": "^1.0.1" - } - } - } - }, - "eth-contract-metadata": { - "version": "github:MetaMask/eth-contract-metadata#dc68506221859bc90792bc5e0279a6835f2484d8", - "from": "eth-contract-metadata@github:MetaMask/eth-contract-metadata#dc68506221859bc90792bc5e0279a6835f2484d8" - }, - "eth-ens-namehash": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", - "integrity": "sha1-IprEbsqG1S4MmR58sq74P/D2i88=", - "requires": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" - }, - "dependencies": { - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" - } - } - }, - "eth-hd-keyring": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/eth-hd-keyring/-/eth-hd-keyring-1.2.2.tgz", - "integrity": "sha1-rV9HkHRDapO0ObC5XHkJXCh5GII=", - "requires": { - "bip39": "^2.2.0", - "eth-sig-util": "^1.4.2", - "ethereumjs-util": "^5.1.1", - "ethereumjs-wallet": "^0.6.0", - "events": "^1.1.1", - "xtend": "^4.0.1" - }, - "dependencies": { - "eth-sig-util": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", - "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", - "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", - "ethereumjs-util": "^5.1.1" - } - }, - "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", - "from": "ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", - "requires": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - }, - "dependencies": { - "ethereumjs-util": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", - "integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.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" - } - } - } - }, - "eth-json-rpc-filters": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/eth-json-rpc-filters/-/eth-json-rpc-filters-3.0.4.tgz", - "integrity": "sha512-+prFjLT//J97Kvn1H9tbyIeggF3TRxbEtWoDDvnDUQ+Kw8z+baihBfhoA1sDAEuMRE0tNQRkNLWhrXoycxu45A==", - "requires": { - "await-semaphore": "^0.1.3", - "eth-json-rpc-middleware": "^2.6.1", - "ethjs-query": "^0.3.8", - "json-rpc-engine": "^3.8.0", - "lodash.flatmap": "^4.5.0", - "safe-event-emitter": "^1.0.1" - }, - "dependencies": { - "babelify": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } - }, - "eth-json-rpc-middleware": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-2.6.1.tgz", - "integrity": "sha512-Z7zGM4q76YNjZISEBtboSTBTxG6HQ5yImwP2YPeQtddkhS5kq62+Fz5Ts352GfGjtTVyJamfvy8ozxJbHrfoJw==", - "requires": { - "async": "^2.5.0", - "btoa": "^1.2.1", - "clone": "^2.1.1", - "eth-query": "^2.1.2", - "eth-sig-util": "^1.4.2", - "eth-tx-summary": "^3.2.4", - "ethereumjs-block": "^1.6.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.2", - "ethereumjs-vm": "^2.1.0", - "fetch-ponyfill": "^4.0.0", - "json-rpc-engine": "^3.6.3", - "json-rpc-error": "^2.0.0", - "json-stable-stringify": "^1.0.1", - "pify": "^3.0.0", - "promise-to-callback": "^1.0.0", - "safe-event-emitter": "^1.0.1", - "tape": "^4.6.3" - } - }, - "eth-sig-util": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", - "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", - "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", - "ethereumjs-util": "^5.1.1" - } - }, - "eth-tx-summary": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz", - "integrity": "sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg==", - "requires": { - "async": "^2.1.2", - "clone": "^2.0.0", - "concat-stream": "^1.5.1", - "end-of-stream": "^1.1.0", - "eth-query": "^2.0.2", - "ethereumjs-block": "^1.4.1", - "ethereumjs-tx": "^1.1.1", - "ethereumjs-util": "^5.0.1", - "ethereumjs-vm": "^2.6.0", - "through2": "^2.0.3" - }, - "dependencies": { - "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.0", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.0.tgz", - "integrity": "sha512-Ye+uG/L2wrp364Zihdlr/GfC3ft+zG8PdHcRtsBFNNH1CkOhxOwdB8friBU85n89uRZ9eIMAywCq0F4CwT1wAw==", - "requires": { - "async": "^2.0.1", - "ethereumjs-common": "^1.1.0", - "ethereumjs-tx": "^1.2.2", - "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" - } - } - } - }, - "ethereumjs-util": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", - "integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - } - } - } - } - }, - "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", - "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", - "requires": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - }, - "dependencies": { - "ethereumjs-util": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", - "integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - } - } - }, - "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" - } - }, - "ethjs-query": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/ethjs-query/-/ethjs-query-0.3.8.tgz", - "integrity": "sha512-/J5JydqrOzU8O7VBOwZKUWXxHDGr46VqNjBCJgBVNNda+tv7Xc8Y2uJc6aMHHVbeN3YOQ7YRElgIc0q1CI02lQ==", - "requires": { - "babel-runtime": "^6.26.0", - "ethjs-format": "0.2.7", - "ethjs-rpc": "0.2.0", - "promise-to-callback": "^1.0.0" - } - }, - "ethjs-rpc": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ethjs-rpc/-/ethjs-rpc-0.2.0.tgz", - "integrity": "sha512-RINulkNZTKnj4R/cjYYtYMnFFaBcVALzbtEJEONrrka8IeoarNB9Jbzn+2rT00Cv8y/CxAI+GgY1d0/i2iQeOg==", - "requires": { - "promise-to-callback": "^1.0.0" - } - }, - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "json-rpc-engine": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz", - "integrity": "sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==", - "requires": { - "async": "^2.0.1", - "babel-preset-env": "^1.7.0", - "babelify": "^7.3.0", - "json-rpc-error": "^2.0.0", - "promise-to-callback": "^1.0.0", - "safe-event-emitter": "^1.0.1" - } - }, - "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=" - } - } - }, - "rustbn.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" - } - } - }, - "eth-json-rpc-infura": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.0.tgz", - "integrity": "sha512-FLcpdxPRVBCUc7yoE+wHGvyYg2lATedP+/q7PsKvaSzQpJbgTG4ZjLnyrLanxDr6M1k/dSNa6V5QnILwjUKJcw==", - "requires": { - "cross-fetch": "^2.1.1", - "eth-json-rpc-middleware": "^1.5.0", - "json-rpc-engine": "^3.4.0", - "json-rpc-error": "^2.0.0", - "tape": "^4.8.0" - }, - "dependencies": { - "babelify": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } - }, - "eth-json-rpc-middleware": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz", - "integrity": "sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==", - "requires": { - "async": "^2.5.0", - "eth-query": "^2.1.2", - "eth-tx-summary": "^3.1.2", - "ethereumjs-block": "^1.6.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.2", - "ethereumjs-vm": "^2.1.0", - "fetch-ponyfill": "^4.0.0", - "json-rpc-engine": "^3.6.0", - "json-rpc-error": "^2.0.0", - "json-stable-stringify": "^1.0.1", - "promise-to-callback": "^1.0.0", - "tape": "^4.6.3" - } - }, - "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" - } - }, - "json-rpc-engine": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz", - "integrity": "sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==", - "requires": { - "async": "^2.0.1", - "babel-preset-env": "^1.7.0", - "babelify": "^7.3.0", - "json-rpc-error": "^2.0.0", - "promise-to-callback": "^1.0.0", - "safe-event-emitter": "^1.0.1" - } - } - } - }, - "eth-json-rpc-middleware": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-3.1.7.tgz", - "integrity": "sha512-w2B1QgBdA4yItLCfplF7LCsZc8LY0B416vfx4X0d738c2rUDPaLZOYeclDfRMeGq5X5WnVnWE4EE2wrfFG7pCw==", - "dev": true, - "requires": { - "babel-preset-es2015": "^6.24.1", - "btoa": "^1.2.1", - "clone": "^2.1.1", - "eth-query": "^2.1.2", - "eth-sig-util": "^1.4.2", - "eth-tx-summary": "^3.2.3", - "ethereumjs-block": "^1.6.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.2", - "ethereumjs-vm": "2.2.2", - "fetch-ponyfill": "^4.0.0", - "json-rpc-engine": "^3.8.0", - "json-rpc-error": "^2.0.0", - "json-stable-stringify": "^1.0.1", - "pify": "^3.0.0", - "safe-event-emitter": "^1.0.1" - }, - "dependencies": { - "babelify": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "dev": true, - "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } - }, - "eth-sig-util": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", - "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", - "dev": true, - "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", - "ethereumjs-util": "^5.1.1" - } - }, - "ethereum-common": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.1.0.tgz", - "integrity": "sha1-h03Q+uXpYqVsUOvyjvpv45SSsOc=", - "dev": true - }, - "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", - "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", - "dev": true, - "requires": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - }, - "dependencies": { - "ethereumjs-util": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", - "integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - } - } - }, - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "dev": true, - "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" - } - }, - "ethereumjs-vm": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.2.2.tgz", - "integrity": "sha512-sAus9UxYjUnA42G91Q1/hR7ff35IJRpcLrUfbaIH7V4cl8qKsNs3wqf3dHvtj3wRqy12ke2Wd0tYdARyGKdD6g==", - "dev": true, - "requires": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereum-common": "0.1.0", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~1.6.0", - "ethereumjs-util": "4.5.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.1.2", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "ethereumjs-block": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.6.0.tgz", - "integrity": "sha1-ze1JYt6soe7xc3K00pDoSzXIQ3I=", - "dev": true, - "requires": { - "async": "^2.0.1", - "ethereum-common": "0.0.18", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "ethereum-common": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", - "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=", - "dev": true - }, - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "dev": true, - "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" - } - } - } - }, - "ethereumjs-util": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz", - "integrity": "sha1-PpQosxfuvaPXJg2FT93alUsfG8Y=", - "dev": true, - "requires": { - "bn.js": "^4.8.0", - "create-hash": "^1.1.2", - "keccakjs": "^0.2.0", - "rlp": "^2.0.0", - "secp256k1": "^3.0.1" - } - } - } - }, - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "dev": true, - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "json-rpc-engine": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz", - "integrity": "sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==", - "dev": true, - "requires": { - "async": "^2.0.1", - "babel-preset-env": "^1.7.0", - "babelify": "^7.3.0", - "json-rpc-error": "^2.0.0", - "promise-to-callback": "^1.0.0", - "safe-event-emitter": "^1.0.1" - } - } - } - }, - "eth-keyring-controller": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/eth-keyring-controller/-/eth-keyring-controller-3.3.1.tgz", - "integrity": "sha512-Knz3alRHjgJ+/4LUBxXLApXeuoMsehaLOvVHpalSTkU//YPXBjvaITlc6653n+g1vvJ4sD2VbMNfFmYYyFHEtw==", - "requires": { - "bip39": "^2.4.0", - "bluebird": "^3.5.0", - "browser-passworder": "^2.0.3", - "eth-hd-keyring": "^1.2.2", - "eth-sig-util": "^1.4.0", - "eth-simple-keyring": "^1.3.0", - "ethereumjs-util": "^5.1.2", - "loglevel": "^1.5.0", - "obs-store": "^2.4.1", - "promise-filter": "^1.1.0" - }, - "dependencies": { - "babelify": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } - }, - "eth-sig-util": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", - "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", - "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", - "ethereumjs-util": "^5.1.1" - } - }, - "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", - "from": "ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", - "requires": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - }, - "dependencies": { - "ethereumjs-util": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", - "integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.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" - } - }, - "obs-store": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/obs-store/-/obs-store-2.4.1.tgz", - "integrity": "sha512-wpA8G4uSn8cnCKZ0pFTvqsamvy0Sm1hR2ot0Qonbfj5yBMwdAp/eD4vDI+U/ZCbV1hb2V5GapL8YKUdGCvahgg==", - "requires": { - "babel-preset-es2015": "^6.22.0", - "babelify": "^7.3.0", - "readable-stream": "^2.2.2", - "through2": "^2.0.3", - "xtend": "^4.0.1" - } - } - } - }, - "eth-ledger-bridge-keyring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eth-ledger-bridge-keyring/-/eth-ledger-bridge-keyring-0.2.0.tgz", - "integrity": "sha512-js8jhe5fIwnOib3ja8Nk8BWpwVYQreh+Hrq/0ry7iO26TH+SdH/gaBIJD2toyICIUYPYU9wpUw9RABsarxbNiQ==", - "requires": { - "eth-sig-util": "^1.4.2", - "ethereumjs-tx": "^1.3.4", - "ethereumjs-util": "^5.1.5", - "events": "^2.0.0", - "hdkey": "0.8.0" - }, - "dependencies": { - "eth-sig-util": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", - "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", - "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", - "ethereumjs-util": "^5.1.1" - } - }, - "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", - "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", - "requires": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - }, - "dependencies": { - "ethereumjs-util": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", - "integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - } - } - }, - "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" - } - }, - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "events": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", - "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==" - }, - "hdkey": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/hdkey/-/hdkey-0.8.0.tgz", - "integrity": "sha512-oYsdlK22eobT68N5faWI3776f6tOLyqxLLYwxMx+TP0rkWzuCs0oiOm2VbLWcxdpHFP4LtiRR8udaIX8VkEaZQ==", - "requires": { - "coinstring": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - } - } - }, - "eth-method-registry": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/eth-method-registry/-/eth-method-registry-1.2.0.tgz", - "integrity": "sha512-m+nphH4kOxz5KTvQ+BeIKVggxAul1sp4Ev09lfxRXIEHM1t/6NQEtaErL5ddTDFXXFVtTiW8uC9edTVUTnBZNg==", - "requires": { - "ethjs": "^0.3.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - }, - "ethjs": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/ethjs/-/ethjs-0.3.9.tgz", - "integrity": "sha512-gOQzA3tDUjoLpNONSOALJ/rUFtHi5tXl2mholHasF1cvXhoddqi06yU4OJFJu9AGd6n9v9ywzHlYeIKg1t1hdw==", - "requires": { - "bn.js": "4.11.6", - "ethjs-abi": "0.2.1", - "ethjs-contract": "0.2.2", - "ethjs-filter": "0.1.8", - "ethjs-provider-http": "0.1.6", - "ethjs-query": "0.3.7", - "ethjs-unit": "0.1.6", - "ethjs-util": "0.1.3", - "js-sha3": "0.5.5", - "number-to-bn": "1.7.0" - } - }, - "ethjs-abi": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ethjs-abi/-/ethjs-abi-0.2.1.tgz", - "integrity": "sha1-4KepOn6BFjqUR3utVu3lJKtt5TM=", - "requires": { - "bn.js": "4.11.6", - "js-sha3": "0.5.5", - "number-to-bn": "1.7.0" - } - }, - "ethjs-contract": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/ethjs-contract/-/ethjs-contract-0.2.2.tgz", - "integrity": "sha512-xxPqEjsULQ/QNWuvX6Ako0PGs5RxALA8N/H3+boLvnaXDFZVGpD7H63H1gBCRTZyYqCldPpVlVHuw/rD45vazw==", - "requires": { - "ethjs-abi": "0.2.0", - "ethjs-filter": "0.1.8", - "ethjs-util": "0.1.3", - "js-sha3": "0.5.5" - }, - "dependencies": { - "ethjs-abi": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ethjs-abi/-/ethjs-abi-0.2.0.tgz", - "integrity": "sha1-0+LCIQEVIPxJm3FoIDbBT8wvWyU=", - "requires": { - "bn.js": "4.11.6", - "js-sha3": "0.5.5", - "number-to-bn": "1.7.0" - } - } - } - }, - "ethjs-filter": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/ethjs-filter/-/ethjs-filter-0.1.8.tgz", - "integrity": "sha512-qTDPskDL2UadHwjvM8A+WG9HwM4/FoSY3p3rMJORkHltYcAuiQZd2otzOYKcL5w2Q3sbAkW/E3yt/FPFL/AVXA==" - }, - "ethjs-query": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/ethjs-query/-/ethjs-query-0.3.7.tgz", - "integrity": "sha512-TZnKUwfkWjy0SowFdPLtmsytCorHi0i4vvkQn7Jg8rZt33cRzKhuzOwKr/G3vdigCc+ePXOhUGMcJSAPlOG44A==", - "requires": { - "ethjs-format": "0.2.7", - "ethjs-rpc": "0.2.0", - "promise-to-callback": "^1.0.0" - } - }, - "ethjs-rpc": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ethjs-rpc/-/ethjs-rpc-0.2.0.tgz", - "integrity": "sha512-RINulkNZTKnj4R/cjYYtYMnFFaBcVALzbtEJEONrrka8IeoarNB9Jbzn+2rT00Cv8y/CxAI+GgY1d0/i2iQeOg==", - "requires": { - "promise-to-callback": "^1.0.0" - } - }, - "ethjs-util": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.3.tgz", - "integrity": "sha1-39XqSkANxeQhqInK9H4IGtp4u1U=", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "js-sha3": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.5.tgz", - "integrity": "sha1-uvDA6MVK1ZA0R9+Wreekobynmko=" - } - } - }, - "eth-phishing-detect": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/eth-phishing-detect/-/eth-phishing-detect-1.1.12.tgz", - "integrity": "sha512-wzEqAB4mUY0gkrn+ZOlzyxHmsouKT6rrzYIxy/FFalqoZVvX/9McPdFwWkHCYrv4KzTKgJJh8tKzvMnTae8Naw==", - "requires": { - "fast-levenshtein": "^2.0.6" - } - }, - "eth-query": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz", - "integrity": "sha1-1nQdkAAQa1FRDHLbktY2VFam2l4=", - "requires": { - "json-rpc-random-id": "^1.0.0", - "xtend": "^4.0.1" - } - }, - "eth-sig-util": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-2.0.2.tgz", - "integrity": "sha512-tB6E8jf/aZQ943bo3+iojl8xRe3Jzcl+9OT6v8K7kWis6PdIX19SB2vYvN849cB9G9m/XLjYFK381SgdbsnpTA==", - "requires": { - "ethereumjs-abi": "0.6.5", - "ethereumjs-util": "^5.1.1" - }, - "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" - } - } - } - }, - "eth-simple-keyring": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/eth-simple-keyring/-/eth-simple-keyring-1.3.1.tgz", - "integrity": "sha512-oOASghMej6WO+bjFF+/8bT2DU7D9QKgD81BbS+/qd26z25ueATcgwPNP2LrkoWUbe39OVVM4P5A4fTEEZpGAHg==", - "requires": { - "eth-sig-util": "^1.4.2", - "ethereumjs-util": "^5.1.1", - "ethereumjs-wallet": "^0.6.0", - "events": "^1.1.1", - "xtend": "^4.0.1" - }, - "dependencies": { - "eth-sig-util": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", - "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", - "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", - "ethereumjs-util": "^5.1.1" - } - }, - "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", - "from": "ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", - "requires": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - }, - "dependencies": { - "ethereumjs-util": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", - "integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.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" - } - } - } - }, - "eth-token-tracker": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/eth-token-tracker/-/eth-token-tracker-1.1.6.tgz", - "integrity": "sha512-p3tD2v65XHeFv7DoUUxvln6xOC/MYmmocLyvvcT/s38vcnQdUJ76oNaon98vTQr3Y61qbaiy19c4bvuKaezqlA==", - "requires": { - "deep-equal": "^1.0.1", - "eth-block-tracker": "^1.0.7", - "ethjs": "^0.3.6", - "ethjs-contract": "^0.2.1", - "ethjs-query": "^0.3.7", - "human-standard-token-abi": "^1.0.2", - "safe-event-emitter": "^1.0.1" - }, - "dependencies": { - "babelify": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } - }, - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - }, - "eth-block-tracker": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-1.1.3.tgz", - "integrity": "sha512-gDIknKCbY9npDA0JmBYCMDPLBj6GUe7xHYI2YTOQVuM8et6N2FxqrS1KhtThPWAeTgFPFkvyOj4eSBaJR0Oekg==", - "requires": { - "async-eventemitter": "^0.2.2", - "babelify": "^7.3.0", - "eth-query": "^2.1.0", - "ethjs-util": "^0.1.3", - "pify": "^2.3.0", - "tape": "^4.6.3" - } - }, - "ethjs": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/ethjs/-/ethjs-0.3.9.tgz", - "integrity": "sha512-gOQzA3tDUjoLpNONSOALJ/rUFtHi5tXl2mholHasF1cvXhoddqi06yU4OJFJu9AGd6n9v9ywzHlYeIKg1t1hdw==", - "requires": { - "bn.js": "4.11.6", - "ethjs-abi": "0.2.1", - "ethjs-contract": "0.2.2", - "ethjs-filter": "0.1.8", - "ethjs-provider-http": "0.1.6", - "ethjs-query": "0.3.7", - "ethjs-unit": "0.1.6", - "ethjs-util": "0.1.3", - "js-sha3": "0.5.5", - "number-to-bn": "1.7.0" - }, - "dependencies": { - "ethjs-contract": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/ethjs-contract/-/ethjs-contract-0.2.2.tgz", - "integrity": "sha512-xxPqEjsULQ/QNWuvX6Ako0PGs5RxALA8N/H3+boLvnaXDFZVGpD7H63H1gBCRTZyYqCldPpVlVHuw/rD45vazw==", - "requires": { - "ethjs-abi": "0.2.0", - "ethjs-filter": "0.1.8", - "ethjs-util": "0.1.3", - "js-sha3": "0.5.5" - }, - "dependencies": { - "ethjs-abi": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ethjs-abi/-/ethjs-abi-0.2.0.tgz", - "integrity": "sha1-0+LCIQEVIPxJm3FoIDbBT8wvWyU=", - "requires": { - "bn.js": "4.11.6", - "js-sha3": "0.5.5", - "number-to-bn": "1.7.0" - } - } - } - }, - "ethjs-query": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/ethjs-query/-/ethjs-query-0.3.7.tgz", - "integrity": "sha512-TZnKUwfkWjy0SowFdPLtmsytCorHi0i4vvkQn7Jg8rZt33cRzKhuzOwKr/G3vdigCc+ePXOhUGMcJSAPlOG44A==", - "requires": { - "ethjs-format": "0.2.7", - "ethjs-rpc": "0.2.0", - "promise-to-callback": "^1.0.0" - } - }, - "ethjs-util": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.3.tgz", - "integrity": "sha1-39XqSkANxeQhqInK9H4IGtp4u1U=", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - } - } - }, - "ethjs-abi": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ethjs-abi/-/ethjs-abi-0.2.1.tgz", - "integrity": "sha1-4KepOn6BFjqUR3utVu3lJKtt5TM=", - "requires": { - "bn.js": "4.11.6", - "js-sha3": "0.5.5", - "number-to-bn": "1.7.0" - } - }, - "ethjs-filter": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/ethjs-filter/-/ethjs-filter-0.1.8.tgz", - "integrity": "sha512-qTDPskDL2UadHwjvM8A+WG9HwM4/FoSY3p3rMJORkHltYcAuiQZd2otzOYKcL5w2Q3sbAkW/E3yt/FPFL/AVXA==" - }, - "ethjs-query": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/ethjs-query/-/ethjs-query-0.3.8.tgz", - "integrity": "sha512-/J5JydqrOzU8O7VBOwZKUWXxHDGr46VqNjBCJgBVNNda+tv7Xc8Y2uJc6aMHHVbeN3YOQ7YRElgIc0q1CI02lQ==", - "requires": { - "babel-runtime": "^6.26.0", - "ethjs-format": "0.2.7", - "ethjs-rpc": "0.2.0", - "promise-to-callback": "^1.0.0" - } - }, - "ethjs-rpc": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ethjs-rpc/-/ethjs-rpc-0.2.0.tgz", - "integrity": "sha512-RINulkNZTKnj4R/cjYYtYMnFFaBcVALzbtEJEONrrka8IeoarNB9Jbzn+2rT00Cv8y/CxAI+GgY1d0/i2iQeOg==", - "requires": { - "promise-to-callback": "^1.0.0" - } - }, - "human-standard-token-abi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/human-standard-token-abi/-/human-standard-token-abi-1.0.2.tgz", - "integrity": "sha1-IH14Rnlu5buF/dM252nLOARbKuA=" - }, - "js-sha3": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.5.tgz", - "integrity": "sha1-uvDA6MVK1ZA0R9+Wreekobynmko=" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "eth-trezor-keyring": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/eth-trezor-keyring/-/eth-trezor-keyring-0.4.0.tgz", - "integrity": "sha512-7F+C1ztxZStLzmG6r/2/MxjSuxw0aU9T26unJ03fQslktKG9izP+dU2IAJUnWxnyej2ZkfcgcH9M1t32LFbK2A==", - "requires": { - "eth-sig-util": "^1.4.2", - "ethereumjs-tx": "^1.3.4", - "ethereumjs-util": "^5.1.5", - "events": "^2.0.0", - "hdkey": "0.8.0", - "trezor-connect": "^7.0.1" - }, - "dependencies": { - "eth-sig-util": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", - "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", - "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", - "ethereumjs-util": "^5.1.1" - } - }, - "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", - "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", - "requires": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - }, - "dependencies": { - "ethereumjs-util": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", - "integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - } - } - }, - "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" - } - }, - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "events": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", - "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==" - }, - "hdkey": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/hdkey/-/hdkey-0.8.0.tgz", - "integrity": "sha512-oYsdlK22eobT68N5faWI3776f6tOLyqxLLYwxMx+TP0rkWzuCs0oiOm2VbLWcxdpHFP4LtiRR8udaIX8VkEaZQ==", - "requires": { - "coinstring": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - } - } - }, - "eth-tx-summary": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/eth-tx-summary/-/eth-tx-summary-3.2.3.tgz", - "integrity": "sha512-1gZpA5fKarJOVSb5OUlPnhDQuIazqAkI61zlVvf5LdG47nEgw+/qhyZnuj3CUdE/TLTKuRzPLeyXLjaB4qWTRQ==", - "requires": { - "async": "^2.1.2", - "bn.js": "^4.11.8", - "clone": "^2.0.0", - "concat-stream": "^1.5.1", - "end-of-stream": "^1.1.0", - "eth-query": "^2.0.2", - "ethereumjs-block": "^1.4.1", - "ethereumjs-tx": "^1.1.1", - "ethereumjs-util": "^5.0.1", - "ethereumjs-vm": "2.3.4", - "through2": "^2.0.3", - "treeify": "^1.0.1", - "web3-provider-engine": "^13.3.2" - }, - "dependencies": { - "babelify": { - "version": "7.3.0", - "resolved": "http://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } - }, - "eth-block-tracker": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-2.3.1.tgz", - "integrity": "sha512-NamWuMBIl8kmkJFVj8WzGatySTzQPQag4Xr677yFxdVtIxACFbL/dQowk0MzEqIKk93U1TwY3MjVU6mOcwZnKA==", - "requires": { - "async-eventemitter": "github:ahultgren/async-eventemitter#fa06e39e56786ba541c180061dbf2c0a5bbf951c", - "eth-query": "^2.1.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.3", - "ethjs-util": "^0.1.3", - "json-rpc-engine": "^3.6.0", - "pify": "^2.3.0", - "tape": "^4.6.3" - }, - "dependencies": { - "async-eventemitter": { - "version": "github:ahultgren/async-eventemitter#fa06e39e56786ba541c180061dbf2c0a5bbf951c", - "from": "async-eventemitter@github:ahultgren/async-eventemitter#fa06e39e56786ba541c180061dbf2c0a5bbf951c", - "requires": { - "async": "^2.4.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" - } - } - } - }, - "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", - "from": "ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", - "requires": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - }, - "dependencies": { - "ethereumjs-util": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", - "integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.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" - } - }, - "ethereumjs-vm": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.3.4.tgz", - "integrity": "sha512-Y4SlzNDqxrCO58jhp98HdnZVdjOqB+HC0hoU+N/DEp1aU+hFkRX/nru5F7/HkQRPIlA6aJlQp/xIA6xZs1kspw==", - "requires": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereum-common": "0.2.0", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~1.7.0", - "ethereumjs-util": "^5.1.3", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.1.2", - "rustbn.js": "~0.1.1", - "safe-buffer": "^5.1.1" - }, - "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" - } - } - } - }, - "json-rpc-engine": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-3.7.3.tgz", - "integrity": "sha512-+FO3UWu/wafh/+MZ6BXy0HZU+f5plwUn82FgxpC0scJkEh5snOjFrAAtqCITPDfvfLHRUFOG5pQDUx2pspfERQ==", - "requires": { - "async": "^2.0.1", - "babel-preset-env": "^1.3.2", - "babelify": "^7.3.0", - "clone": "^2.1.1", - "json-rpc-error": "^2.0.0", - "promise-to-callback": "^1.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "web3-provider-engine": { - "version": "13.8.0", - "resolved": "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-13.8.0.tgz", - "integrity": "sha512-fZXhX5VWwWpoFfrfocslyg6P7cN3YWPG/ASaevNfeO80R+nzgoPUBXcWQekSGSsNDkeRTis4aMmpmofYf1TNtQ==", - "requires": { - "async": "^2.5.0", - "clone": "^2.0.0", - "eth-block-tracker": "^2.2.2", - "eth-sig-util": "^1.4.2", - "ethereumjs-block": "^1.2.2", - "ethereumjs-tx": "^1.2.0", - "ethereumjs-util": "^5.1.1", - "ethereumjs-vm": "^2.0.2", - "fetch-ponyfill": "^4.0.0", - "json-rpc-error": "^2.0.0", - "json-stable-stringify": "^1.0.1", - "promise-to-callback": "^1.0.0", - "readable-stream": "^2.2.9", - "request": "^2.67.0", - "semaphore": "^1.0.3", - "solc": "^0.4.2", - "tape": "^4.4.0", - "xhr": "^2.2.0", - "xtend": "^4.0.1" - }, - "dependencies": { - "eth-sig-util": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", - "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", - "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", - "ethereumjs-util": "^5.1.1" - }, - "dependencies": { - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.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" - } - } - } - } - } - }, - "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==" - }, - "ethereum-ens-network-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ethereum-ens-network-map/-/ethereum-ens-network-map-1.0.0.tgz", - "integrity": "sha1-Q812ac6VCnieFRABEY1NZfIQ7rc=" - }, - "ethereumjs-abi": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz", - "integrity": "sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE=", - "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^4.3.0" - }, - "dependencies": { - "ethereumjs-util": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz", - "integrity": "sha1-PpQosxfuvaPXJg2FT93alUsfG8Y=", - "requires": { - "bn.js": "^4.8.0", - "create-hash": "^1.1.2", - "keccakjs": "^0.2.0", - "rlp": "^2.0.0", - "secp256k1": "^3.0.1" - } - } - } - }, - "ethereumjs-account": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.4.tgz", - "integrity": "sha1-+MMCMby3B/RRTYoFLB+doQNiTUc=", - "requires": { - "ethereumjs-util": "^4.0.1", - "rlp": "^2.0.0" - }, - "dependencies": { - "ethereumjs-util": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz", - "integrity": "sha1-PpQosxfuvaPXJg2FT93alUsfG8Y=", - "requires": { - "bn.js": "^4.8.0", - "create-hash": "^1.1.2", - "keccakjs": "^0.2.0", - "rlp": "^2.0.0", - "secp256k1": "^3.0.1" - } - } - } - }, - "ethereumjs-block": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.0.tgz", - "integrity": "sha512-4s4Hh7mWa1xr+Bggh3T3jsq9lmje5aYpJRFky00bo/xNgNe+RC8V2ulWYSR4YTEKqLbnLEsLNytjDe5hpblkZQ==", - "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-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" - } - } - } - }, - "ethereumjs-common": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.2.1.tgz", - "integrity": "sha512-VNr8MBdKHHuWgpYhRUhkp05P0mTcTH8Udb8wXcnnxUmwOWl388Sk/Lw2KL1rQNsV3gid2BB2auHT4vcfs9PFbw==" - }, - "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" - } - } - } - }, - "ethereumjs-util": { - "version": "github:ethereumjs/ethereumjs-util#ac5d0908536b447083ea422b435da27f26615de9", - "from": "ethereumjs-util@github:ethereumjs/ethereumjs-util#ac5d0908536b447083ea422b435da27f26615de9", - "requires": { - "bn.js": "^4.8.0", - "create-hash": "^1.1.2", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "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.0", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.0.tgz", - "integrity": "sha512-Ye+uG/L2wrp364Zihdlr/GfC3ft+zG8PdHcRtsBFNNH1CkOhxOwdB8friBU85n89uRZ9eIMAywCq0F4CwT1wAw==", - "requires": { - "async": "^2.0.1", - "ethereumjs-common": "^1.1.0", - "ethereumjs-tx": "^1.2.2", - "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" - } - } - } - }, - "ethereumjs-util": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", - "integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - }, - "dependencies": { - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "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" - } - } - } - }, - "rustbn.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" - } - } - }, - "ethereumjs-wallet": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-0.6.0.tgz", - "integrity": "sha1-gnY7Fpfuenlr5xVdqd+0my+Yz9s=", - "requires": { - "aes-js": "^0.2.3", - "bs58check": "^1.0.8", - "ethereumjs-util": "^4.4.0", - "hdkey": "^0.7.0", - "scrypt.js": "^0.2.0", - "utf8": "^2.1.1", - "uuid": "^2.0.1" - }, - "dependencies": { - "ethereumjs-util": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz", - "integrity": "sha1-PpQosxfuvaPXJg2FT93alUsfG8Y=", - "requires": { - "bn.js": "^4.8.0", - "create-hash": "^1.1.2", - "keccakjs": "^0.2.0", - "rlp": "^2.0.0", - "secp256k1": "^3.0.1" - } - } - } - }, - "etherscan-link": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/etherscan-link/-/etherscan-link-1.0.2.tgz", - "integrity": "sha1-x7kULEtZUJsziiBLYyiupA3Txk4=" - }, - "ethjs": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/ethjs/-/ethjs-0.4.0.tgz", - "integrity": "sha512-UnQeRMpQ+JETN2FviexEskUwByid+eO8rybjPnk2DNUzjUn0VKNrUbiCAud7Es6otDFwjUeOS58vMZwkZxIIog==", - "requires": { - "bn.js": "4.11.6", - "ethjs-abi": "0.2.1", - "ethjs-contract": "0.2.3", - "ethjs-filter": "0.1.8", - "ethjs-provider-http": "0.1.6", - "ethjs-query": "0.3.8", - "ethjs-unit": "0.1.6", - "ethjs-util": "0.1.3", - "js-sha3": "0.5.5", - "number-to-bn": "1.7.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - }, - "ethjs-abi": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ethjs-abi/-/ethjs-abi-0.2.1.tgz", - "integrity": "sha1-4KepOn6BFjqUR3utVu3lJKtt5TM=", - "requires": { - "bn.js": "4.11.6", - "js-sha3": "0.5.5", - "number-to-bn": "1.7.0" - } - }, - "ethjs-contract": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/ethjs-contract/-/ethjs-contract-0.2.3.tgz", - "integrity": "sha512-fKsHm57wxwHrZhVlD8AHU2lC2G3c1fmvoEz15BpqIkuGWiTbjuvrQo2Avc+3EQpSsTFWNdyxC0h1WKRcn5kkyQ==", - "requires": { - "babel-runtime": "^6.26.0", - "ethjs-abi": "0.2.0", - "ethjs-filter": "0.1.8", - "ethjs-util": "0.1.3", - "js-sha3": "0.5.5" - }, - "dependencies": { - "ethjs-abi": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ethjs-abi/-/ethjs-abi-0.2.0.tgz", - "integrity": "sha1-0+LCIQEVIPxJm3FoIDbBT8wvWyU=", - "requires": { - "bn.js": "4.11.6", - "js-sha3": "0.5.5", - "number-to-bn": "1.7.0" - } - } - } - }, - "ethjs-filter": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/ethjs-filter/-/ethjs-filter-0.1.8.tgz", - "integrity": "sha512-qTDPskDL2UadHwjvM8A+WG9HwM4/FoSY3p3rMJORkHltYcAuiQZd2otzOYKcL5w2Q3sbAkW/E3yt/FPFL/AVXA==" - }, - "ethjs-query": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/ethjs-query/-/ethjs-query-0.3.8.tgz", - "integrity": "sha512-/J5JydqrOzU8O7VBOwZKUWXxHDGr46VqNjBCJgBVNNda+tv7Xc8Y2uJc6aMHHVbeN3YOQ7YRElgIc0q1CI02lQ==", - "requires": { - "babel-runtime": "^6.26.0", - "ethjs-format": "0.2.7", - "ethjs-rpc": "0.2.0", - "promise-to-callback": "^1.0.0" - } - }, - "ethjs-rpc": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ethjs-rpc/-/ethjs-rpc-0.2.0.tgz", - "integrity": "sha512-RINulkNZTKnj4R/cjYYtYMnFFaBcVALzbtEJEONrrka8IeoarNB9Jbzn+2rT00Cv8y/CxAI+GgY1d0/i2iQeOg==", - "requires": { - "promise-to-callback": "^1.0.0" - } - }, - "ethjs-util": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.3.tgz", - "integrity": "sha1-39XqSkANxeQhqInK9H4IGtp4u1U=", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "js-sha3": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.5.tgz", - "integrity": "sha1-uvDA6MVK1ZA0R9+Wreekobynmko=" - } - } - }, - "ethjs-abi": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ethjs-abi/-/ethjs-abi-0.2.0.tgz", - "integrity": "sha1-0+LCIQEVIPxJm3FoIDbBT8wvWyU=", - "requires": { - "bn.js": "4.11.6", - "js-sha3": "0.5.5", - "number-to-bn": "1.7.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - }, - "js-sha3": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.5.tgz", - "integrity": "sha1-uvDA6MVK1ZA0R9+Wreekobynmko=" - } - } - }, - "ethjs-contract": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/ethjs-contract/-/ethjs-contract-0.2.3.tgz", - "integrity": "sha512-fKsHm57wxwHrZhVlD8AHU2lC2G3c1fmvoEz15BpqIkuGWiTbjuvrQo2Avc+3EQpSsTFWNdyxC0h1WKRcn5kkyQ==", - "requires": { - "babel-runtime": "^6.26.0", - "ethjs-abi": "0.2.0", - "ethjs-filter": "0.1.8", - "ethjs-util": "0.1.3", - "js-sha3": "0.5.5" - }, - "dependencies": { - "ethjs-filter": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/ethjs-filter/-/ethjs-filter-0.1.8.tgz", - "integrity": "sha512-qTDPskDL2UadHwjvM8A+WG9HwM4/FoSY3p3rMJORkHltYcAuiQZd2otzOYKcL5w2Q3sbAkW/E3yt/FPFL/AVXA==" - }, - "ethjs-util": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.3.tgz", - "integrity": "sha1-39XqSkANxeQhqInK9H4IGtp4u1U=", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "js-sha3": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.5.tgz", - "integrity": "sha1-uvDA6MVK1ZA0R9+Wreekobynmko=" - } - } - }, - "ethjs-ens": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ethjs-ens/-/ethjs-ens-2.0.1.tgz", - "integrity": "sha1-7aCiGqy9rC9gxKAQNN8hxIpaMls=", - "requires": { - "eth-ens-namehash": "^1.0.2", - "ethereum-ens-network-map": "^1.0.0", - "ethjs-contract": "^0.1.7", - "ethjs-query": "^0.2.4" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - }, - "eth-ens-namehash": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-1.0.2.tgz", - "integrity": "sha1-Bezda6wtf9e8XKhKmTxrrZ2k7bk=", - "requires": { - "idna-uts46": "^1.0.1", - "js-sha3": "^0.5.7" - }, - "dependencies": { - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" - } - } - }, - "ethjs-contract": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/ethjs-contract/-/ethjs-contract-0.1.9.tgz", - "integrity": "sha1-HCdmiWpW1H7B1tZhgpxJzDilUgo=", - "requires": { - "ethjs-abi": "0.2.0", - "ethjs-filter": "0.1.5", - "ethjs-util": "0.1.3", - "js-sha3": "0.5.5" - } - }, - "ethjs-format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/ethjs-format/-/ethjs-format-0.2.2.tgz", - "integrity": "sha1-1zs6YFwuElcHn3B3/VRI6ZjOD80=", - "requires": { - "bn.js": "4.11.6", - "ethjs-schema": "0.1.5", - "ethjs-util": "0.1.3", - "is-hex-prefixed": "1.0.0", - "number-to-bn": "1.7.0", - "strip-hex-prefix": "1.0.0" - } - }, - "ethjs-query": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/ethjs-query/-/ethjs-query-0.2.9.tgz", - "integrity": "sha1-om5rTzhpnpLzSyGE51x4lDKcQvE=", - "requires": { - "ethjs-format": "0.2.2", - "ethjs-rpc": "0.1.5" - } - }, - "ethjs-schema": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/ethjs-schema/-/ethjs-schema-0.1.5.tgz", - "integrity": "sha1-WXQOOzl3vNu5sRvDBoIB6Kzquw0=" - }, - "ethjs-util": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.3.tgz", - "integrity": "sha1-39XqSkANxeQhqInK9H4IGtp4u1U=", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "js-sha3": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.5.tgz", - "integrity": "sha1-uvDA6MVK1ZA0R9+Wreekobynmko=" - } - } - }, - "ethjs-filter": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/ethjs-filter/-/ethjs-filter-0.1.5.tgz", - "integrity": "sha1-ARKvYBfCRnfjK4/esg5hlgGbdZg=" - }, - "ethjs-format": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/ethjs-format/-/ethjs-format-0.2.7.tgz", - "integrity": "sha512-uNYAi+r3/mvR3xYu2AfSXx5teP4ovy9z2FrRsblU+h2logsaIKZPi9V3bn3V7wuRcnG0HZ3QydgZuVaRo06C4Q==", - "requires": { - "bn.js": "4.11.6", - "ethjs-schema": "0.2.1", - "ethjs-util": "0.1.3", - "is-hex-prefixed": "1.0.0", - "number-to-bn": "1.7.0", - "strip-hex-prefix": "1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - }, - "ethjs-util": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.3.tgz", - "integrity": "sha1-39XqSkANxeQhqInK9H4IGtp4u1U=", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - } - } - }, - "ethjs-provider-http": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-provider-http/-/ethjs-provider-http-0.1.6.tgz", - "integrity": "sha1-HsXZtL4lfvHValALIqdBmF6IlCA=", - "requires": { - "xhr2": "0.1.3" - } - }, - "ethjs-query": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/ethjs-query/-/ethjs-query-0.3.4.tgz", - "integrity": "sha512-RkeLtBwuXJkBIf/U+Az0GOT203UiBLmN7WA6WZIwSTbmhH2yNicggwaWKvN3TOtpErOsXnzYTZp82mElHdORUQ==", - "requires": { - "ethjs-format": "0.2.5", - "ethjs-rpc": "0.1.9" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - }, - "ethjs-format": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/ethjs-format/-/ethjs-format-0.2.5.tgz", - "integrity": "sha1-RPMKvuF7B01xYtLIhqv/0GWCiSU=", - "requires": { - "bn.js": "4.11.6", - "ethjs-schema": "0.2.0", - "ethjs-util": "0.1.3", - "is-hex-prefixed": "1.0.0", - "number-to-bn": "1.7.0", - "strip-hex-prefix": "1.0.0" - } - }, - "ethjs-rpc": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/ethjs-rpc/-/ethjs-rpc-0.1.9.tgz", - "integrity": "sha512-KJqT7cgTeCJQ2RY1AlVmTZVnKIUXMPg+niPN5VJKwRSzpjgfr3LTVHlGbkRCqZtOMDi0ogB2vHZaRQiZBXZTUg==" - }, - "ethjs-schema": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ethjs-schema/-/ethjs-schema-0.2.0.tgz", - "integrity": "sha1-B7RtT1W3kqhGyQp58zDTHREsyjg=" - }, - "ethjs-util": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.3.tgz", - "integrity": "sha1-39XqSkANxeQhqInK9H4IGtp4u1U=", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - } - } - }, - "ethjs-rpc": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/ethjs-rpc/-/ethjs-rpc-0.1.5.tgz", - "integrity": "sha1-CZ4i8n3EwYtpeKSF/DaxsPeWkIA=" - }, - "ethjs-schema": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ethjs-schema/-/ethjs-schema-0.2.1.tgz", - "integrity": "sha512-DXd8lwNrhT9sjsh/Vd2Z+4pfyGxhc0POVnLBUfwk5udtdoBzADyq+sK39dcb48+ZU+2VgtwHxtGWnLnCfmfW5g==" - }, - "ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", - "requires": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - } - } - }, - "ethjs-util": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.4.tgz", - "integrity": "sha1-HItoeSV0RO9NPz+7rC3tEs2ZfZM=", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "eve-raphael": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/eve-raphael/-/eve-raphael-0.5.0.tgz", - "integrity": "sha1-F8dUt5K+7z+maE15z1pHxjxM2jA=" - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", - "dev": true, - "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - } - }, - "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", - "dev": true - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - }, - "events-to-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", - "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", - "dev": true - }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - } - } - }, - "execall": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execall/-/execall-1.0.0.tgz", - "integrity": "sha1-c9CQTjlbPKsGWLCNCewlMH8pu3M=", - "dev": true, - "requires": { - "clone-regexp": "^1.0.0" - } - }, - "exists-stat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/exists-stat/-/exists-stat-1.0.0.tgz", - "integrity": "sha1-BmDjUlouidnkRhKUQMJy7foktSk=", - "dev": true - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - } - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", - "dev": true - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "dev": true, - "requires": { - "mime-db": "1.40.0" - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - } - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "extension-port-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/extension-port-stream/-/extension-port-stream-1.0.0.tgz", - "integrity": "sha512-FsFr64yr6ituPdaGP6Io5recGFWVjJoDYt7asz2AvPkYqGN9c923nmEtyHH+413066bjGcQZaF8w5wn9HbNXiQ==", - "requires": { - "readable-stream": "^2.3.6", - "util": "^0.11.0" - }, - "dependencies": { - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, - "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==", - "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" - } - }, - "util": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.0.tgz", - "integrity": "sha512-5n12uMzKCjvB2HPFHnbQSjaqAa98L5iIXmHrZCLavuZVe0qe/SJGbDGWlpaHk5lnBkWRDO+dRu1/PgmUYKPPTw==", - "requires": { - "inherits": "2.0.3" - } - } - } - }, - "extensionizer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/extensionizer/-/extensionizer-1.0.1.tgz", - "integrity": "sha512-UES5CSOYqshNsWFrpORcQR47+ph6UvQK25mguD44IyeMemt40CG+LTZrH1PgpGUHX3w7ACtNQnmM0J+qEe8G0Q==" - }, - "external-editor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", - "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", - "dev": true, - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "extract-zip": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", - "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", - "dev": true, - "requires": { - "concat-stream": "1.6.2", - "debug": "2.6.9", - "mkdirp": "0.5.1", - "yauzl": "2.4.1" - }, - "dependencies": { - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", - "dev": true, - "optional": true - }, - "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" - } - }, - "falafel": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz", - "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=", - "dev": true, - "requires": { - "acorn": "^5.0.0", - "foreach": "^2.0.5", - "isarray": "0.0.1", - "object-keys": "^1.0.6" - }, - "dependencies": { - "acorn": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.6.2.tgz", - "integrity": "sha512-zUzo1E5dI2Ey8+82egfnttyMlMZ2y0D8xOCO3PNPPlYXpl8NZvF6Qk9L9BEtJs+43FqEmfBViDqc5d1ckRDguw==", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } - } - }, - "fancy-log": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", - "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "time-stamp": "^1.0.0" - } - }, - "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" - }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "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" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - } - } - } - } - }, - "fast-json-patch": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-2.0.6.tgz", - "integrity": "sha1-hv/4+GYjkaqBlyKGTWMuYD5u5gU=", - "requires": { - "deep-equal": "^1.0.1" - } - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "fast-memoize": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.3.2.tgz", - "integrity": "sha512-h2avnhux4p3tXTA9xR7ntnQSFQdY4hAkyNj8wDXlVT2Die38JxVCInnrieuktdxzRevRWa3dBjN+SbQe1os0GQ==", - "dev": true - }, - "fast-redact": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-1.5.0.tgz", - "integrity": "sha512-Afo61CgUjkzdvOKDHn08qnZ0kwck38AOGcMlvSGzvJbIab6soAP5rdoQayecGCDsD69AiF9vJBXyq31eoEO2tQ==", - "dev": true - }, - "fast-safe-stringify": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz", - "integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg==", - "dev": true - }, - "fault": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.3.tgz", - "integrity": "sha512-sfFuP4X0hzrbGKjAUNXYvNqsZ5F6ohx/dZ9I0KQud/aiZNwg263r5L9yGB0clvXHCkzXh5W3t7RSHchggYIFmA==", - "dev": true, - "requires": { - "format": "^0.2.2" - } - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fbjs": { - "version": "0.8.16", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", - "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", - "requires": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.9" - }, - "dependencies": { - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" - } - } - }, - "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "fetch-mock": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/fetch-mock/-/fetch-mock-6.5.2.tgz", - "integrity": "sha512-EIvbpCLBTYyDLu4HJiqD7wC8psDwTUaPaWXNKZbhNO/peUYKiNp5PkZGKRJtnTxaPQu71ivqafvjpM7aL+MofQ==", - "dev": true, - "requires": { - "babel-polyfill": "^6.26.0", - "glob-to-regexp": "^0.4.0", - "path-to-regexp": "^2.2.1" - }, - "dependencies": { - "path-to-regexp": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.4.0.tgz", - "integrity": "sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w==", - "dev": true - } - } - }, - "fetch-ponyfill": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz", - "integrity": "sha1-rjzl9zLGReq4fkroeTQUcJsjmJM=", - "requires": { - "node-fetch": "~1.7.1" - } - }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "file-loader": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", - "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", - "dev": true, - "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^0.4.5" - }, - "dependencies": { - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" - } - } - } - }, - "file-size": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/file-size/-/file-size-0.0.5.tgz", - "integrity": "sha1-BX1Dw6Ptc12j+Q1gUqs4Dx5tXjs=", - "dev": true - }, - "file-system-cache": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/file-system-cache/-/file-system-cache-1.0.5.tgz", - "integrity": "sha1-hCWbNqK7uNPW6xAh0xMv/mTP/08=", - "dev": true, - "requires": { - "bluebird": "^3.3.5", - "fs-extra": "^0.30.0", - "ramda": "^0.21.0" - }, - "dependencies": { - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "ramda": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.21.0.tgz", - "integrity": "sha1-oAGr7bP/YQd9T/HVd9RN536NCjU=", - "dev": true - } - } - }, - "file-tree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-tree/-/file-tree-1.0.0.tgz", - "integrity": "sha1-/a2ZnLf6REODULUUx4+TWzBuk+M=", - "requires": { - "async-reduce": "0.0.1", - "commondir": "0.0.1", - "flat": "~1.0.0" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "filename-reserved-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz", - "integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=", - "dev": true - }, - "filenamify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz", - "integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=", - "dev": true, - "requires": { - "filename-reserved-regex": "^1.0.0", - "strip-outer": "^1.0.0", - "trim-repeated": "^1.0.0" - } - }, - "filenamify-url": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/filenamify-url/-/filenamify-url-1.0.0.tgz", - "integrity": "sha1-syvYExnvWGO3MHi+1Q9GpPeXX1A=", - "dev": true, - "requires": { - "filenamify": "^1.0.0", - "humanize-url": "^1.0.0" - } - }, - "filesize": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", - "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", - "dev": true - }, - "fill-keys": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", - "integrity": "sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA=", - "dev": true, - "requires": { - "is-object": "~1.0.1", - "merge-descriptors": "~1.0.0" - } - }, - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.0.0.tgz", - "integrity": "sha512-t7ulV1fmbxh5G9l/492O1p5+EBbr3uwpt6odhFTMc+nWyhmbloe+ja9BZ8pIBtqFWhOmCWVjx+pTW4zDkFoclw==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.0", - "pkg-dir": "^4.1.0" - }, - "dependencies": { - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", - "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", - "dev": true - } - } - }, - "find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true - }, - "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" - } - }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "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" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - } - } - } - } - }, - "fined": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", - "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "fireworm": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/fireworm/-/fireworm-0.7.1.tgz", - "integrity": "sha1-zPIPeUHxCIg/zduZOD2+bhhhx1g=", - "dev": true, - "requires": { - "async": "~0.2.9", - "is-type": "0.0.1", - "lodash.debounce": "^3.1.1", - "lodash.flatten": "^3.0.2", - "minimatch": "^3.0.2" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true - }, - "lodash.debounce": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-3.1.1.tgz", - "integrity": "sha1-gSIRw3ipTMKdWqTjNGzwv846ffU=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0" - } - }, - "lodash.flatten": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-3.0.2.tgz", - "integrity": "sha1-3hz1d1j49EeTGdNcPpzGDEUBk4w=", - "dev": true, - "requires": { - "lodash._baseflatten": "^3.0.0", - "lodash._isiterateecall": "^3.0.0" - } - } - } - }, - "first-chunk-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-3.0.0.tgz", - "integrity": "sha512-LNRvR4hr/S8cXXkIY5pTgVP7L3tq6LlYWcg9nWBuW7o1NMxKZo6oOVa/6GIekMGI0Iw7uC+HWimMe9u/VAeKqw==", - "dev": true - }, - "flagged-respawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz", - "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=", - "dev": true - }, - "flat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-1.0.0.tgz", - "integrity": "sha1-Ad/dW8vBScZrNe1AHh11PxqtjVk=" - }, - "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", - "dev": true, - "requires": { - "circular-json": "^0.3.1", - "del": "^2.0.2", - "graceful-fs": "^4.1.2", - "write": "^0.2.1" - }, - "dependencies": { - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - } - } - }, - "flatstr": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz", - "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==", - "dev": true - }, - "flatted": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", - "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", - "dev": true - }, - "flatten": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-0.0.1.tgz", - "integrity": "sha1-VURAdm2goNYDmZ9DNFP2wvxqdcE=" - }, - "fluent-syntax": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/fluent-syntax/-/fluent-syntax-0.13.0.tgz", - "integrity": "sha512-0Bk1AsliuYB550zr4JV9AYhsETsD3ELXUQzdXGJfIc1Ni/ukAfBdQInDhVMYJUaT2QxoamNslwkYF7MlOrPUwg==", - "dev": true - }, - "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" - } - }, - "focus-lock": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.6.4.tgz", - "integrity": "sha512-+waElh6m7dbNmEabXQIblZjJMIRQOoHMNqB8RZkyemK+vN1XQ9uHLi740DVwTcK5fzAq3g+tBglLjIqUDHX/Og==", - "dev": true - }, - "follow-redirects": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.0.tgz", - "integrity": "sha512-fdrt472/9qQ6Kgjvb935ig6vJCuofpBUD14f9Vb+SLlm7xIe4Qva5gey8EKtv8lp7ahE1wilg3xL1znpVGtZIA==", - "dev": true, - "requires": { - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "for-each": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.2.tgz", - "integrity": "sha1-LEBFC5NI6X8oEyJZO6lnBLmr1NQ=", - "requires": { - "is-function": "~1.0.0" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "fork-ts-checker-webpack-plugin": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-1.1.1.tgz", - "integrity": "sha512-gqWAEMLlae/oeVnN6RWCAhesOJMswAN1MaKNqhhjXHV5O0/rTUjWI4UbgQHdlrVbCnb+xLotXmJbBlC66QmpFw==", - "dev": true, - "requires": { - "babel-code-frame": "^6.22.0", - "chalk": "^2.4.1", - "chokidar": "^2.0.4", - "micromatch": "^3.1.10", - "minimatch": "^3.0.4", - "semver": "^5.6.0", - "tapable": "^1.0.0", - "worker-rpc": "^0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "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" - } - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - } - } - } - } - }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "1.0.6", - "mime-types": "^2.1.12" - }, - "dependencies": { - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "requires": { - "delayed-stream": "~1.0.0" - } - } - } - }, - "format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=", - "dev": true - }, - "formatio": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", - "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", - "dev": true, - "requires": { - "samsam": "1.x" - } - }, - "formidable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", - "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-access": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", - "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", - "dev": true, - "requires": { - "null-check": "^1.0.0" - } - }, - "fs-exists-sync": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", - "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", - "dev": true - }, - "fs-extra": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", - "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "dependencies": { - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - } - } - }, - "fs-minipass": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.6.tgz", - "integrity": "sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ==", - "dev": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - } - }, - "fs-promise": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-2.0.3.tgz", - "integrity": "sha1-9k5PhUvPaJqovdy6JokW2z20aFQ=", - "dev": true, - "requires": { - "any-promise": "^1.3.0", - "fs-extra": "^2.0.0", - "mz": "^2.6.0", - "thenify-all": "^1.6.0" - }, - "dependencies": { - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true - }, - "fs-extra": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", - "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0" - } - } - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "bundled": true, - "dev": true, - "optional": true, - "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" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "minipass": { - "version": "2.3.5", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "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" - } - }, - "rimraf": { - "version": "2.6.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "3.0.3", - "bundled": true, - "dev": true - } - } - }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "ftp": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", - "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", - "requires": { - "readable-stream": "1.1.x", - "xregexp": "2.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "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=" - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "function.prototype.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.0.tgz", - "integrity": "sha512-Bs0VRrTz4ghD8pTmbJQD1mZ8A/mN0ur/jGz+A6FBxPDUPkm1tNfF6bhTYPA7i7aF4lZJVr+OXTNNrnnIl58Wfg==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "is-callable": "^1.1.3" - } - }, - "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=" - }, - "fuse.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.2.0.tgz", - "integrity": "sha1-8ESOgGmFW/Kj5oPNwdMg5+KgfvQ=" - }, - "gaba": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/gaba/-/gaba-1.3.0.tgz", - "integrity": "sha512-Vt0dqv5d6UY1eKYsOlwBQOVH1gPcG7qWL/xXArTB59y7HmBKL/g7FpBbgxsYPJl/Ii5XP+9Of6uP7Os51BdYhQ==", - "requires": { - "await-semaphore": "^0.1.3", - "eth-contract-metadata": "github:MetaMask/eth-contract-metadata#faa4f56fb17b3ae8579df68708be59d617732f31", - "eth-json-rpc-infura": "^3.1.2", - "eth-keyring-controller": "^4.0.0", - "eth-method-registry": "1.1.0", - "eth-phishing-detect": "^1.1.13", - "eth-query": "^2.1.2", - "eth-sig-util": "^2.1.0", - "ethereumjs-util": "^5.2.0", - "ethereumjs-wallet": "0.6.0", - "ethjs-query": "^0.3.8", - "human-standard-collectible-abi": "^1.0.2", - "human-standard-token-abi": "^2.0.0", - "isomorphic-fetch": "^2.2.1", - "jsonschema": "^1.2.4", - "percentile": "^1.2.1", - "single-call-balance-checker-abi": "^1.0.0", - "uuid": "^3.3.2", - "web3": "^0.20.7", - "web3-provider-engine": "github:metamask/provider-engine#e91367bc2c2535fbf7add06244d9d4ec98620042" - }, - "dependencies": { - "babelify": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } - }, - "eth-contract-metadata": { - "version": "github:MetaMask/eth-contract-metadata#faa4f56fb17b3ae8579df68708be59d617732f31", - "from": "github:MetaMask/eth-contract-metadata#faa4f56fb17b3ae8579df68708be59d617732f31" - }, - "eth-hd-keyring": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eth-hd-keyring/-/eth-hd-keyring-2.0.0.tgz", - "integrity": "sha512-lTeANNPNj/j08sWU7LUQZTsx9NUJaUsiOdVxeP0UI5kke7L+Sd7zJWBmCShudEVG8PkqKLE1KJo08o430sl6rw==", - "requires": { - "bip39": "^2.2.0", - "eth-sig-util": "^2.0.1", - "ethereumjs-abi": "^0.6.5", - "ethereumjs-util": "^5.1.1", - "ethereumjs-wallet": "^0.6.0", - "events": "^1.1.1", - "xtend": "^4.0.1" - } - }, - "eth-keyring-controller": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eth-keyring-controller/-/eth-keyring-controller-4.0.1.tgz", - "integrity": "sha512-i+aff88wsDdgf99iPNE1/RwNos1EtMk0vmc1nsiaCBxrMJSMyNrqEB0njrv2TYWiJj5TnUaZ63vSUYoUYp2eHg==", - "requires": { - "bip39": "^2.4.0", - "bluebird": "^3.5.0", - "browser-passworder": "^2.0.3", - "eth-hd-keyring": "^2.0.0", - "eth-sig-util": "^1.4.0", - "eth-simple-keyring": "^2.0.0", - "ethereumjs-util": "^5.1.2", - "loglevel": "^1.5.0", - "obs-store": "^2.4.1", - "promise-filter": "^1.1.0" - }, - "dependencies": { - "eth-sig-util": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", - "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", - "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", - "ethereumjs-util": "^5.1.1" - } - }, - "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", - "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", - "requires": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - }, - "dependencies": { - "ethereumjs-util": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", - "integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - } - } - }, - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - } - } - }, - "eth-method-registry": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eth-method-registry/-/eth-method-registry-1.1.0.tgz", - "integrity": "sha512-jGbbGYd19XJCtoGFtUD2qJYWefKCCbFcu7F/AQ5sJXvqTIVAHnFn3paaV2zhN5t7iyKYp1qxc+ugOky+72xcbg==", - "requires": { - "ethjs": "^0.3.0" - } - }, - "eth-phishing-detect": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/eth-phishing-detect/-/eth-phishing-detect-1.1.13.tgz", - "integrity": "sha512-1KQcKvAQIjJgFMVwxaw2+BlzM9Momzl0e+/torPdMjg7WGq6LmCIS7ddg84diH5zIQp9quGyRVIEawCCuErgVQ==", - "requires": { - "fast-levenshtein": "^2.0.6" - } - }, - "eth-sig-util": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-2.2.0.tgz", - "integrity": "sha512-bAxW35bL4U2lrtjjV8rFGJ8B27z4Sn5v9eIaNdpPUnPfUAtrvx5j8atfyV+k+JOnbppcvKhWCO1rQSBk4kkAhw==", - "requires": { - "buffer": "^5.2.1", - "elliptic": "^6.4.0", - "ethereumjs-abi": "0.6.5", - "ethereumjs-util": "^5.1.1", - "tweetnacl": "^1.0.0", - "tweetnacl-util": "^0.15.0" - } - }, - "eth-simple-keyring": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eth-simple-keyring/-/eth-simple-keyring-2.0.0.tgz", - "integrity": "sha512-4dMbkIy2k1qotDTjWINvXG+7tBmofp0YUhlXgcG0+I3w684V46+MAHEkBtD2Y09iEeIB07RDXrezKP9WxOpynA==", - "requires": { - "eth-sig-util": "^2.0.1", - "ethereumjs-abi": "^0.6.5", - "ethereumjs-util": "^5.1.1", - "ethereumjs-wallet": "^0.6.0", - "events": "^1.1.1", - "xtend": "^4.0.1" - } - }, - "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" - } - }, - "ethjs": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/ethjs/-/ethjs-0.3.9.tgz", - "integrity": "sha512-gOQzA3tDUjoLpNONSOALJ/rUFtHi5tXl2mholHasF1cvXhoddqi06yU4OJFJu9AGd6n9v9ywzHlYeIKg1t1hdw==", - "requires": { - "bn.js": "4.11.6", - "ethjs-abi": "0.2.1", - "ethjs-contract": "0.2.2", - "ethjs-filter": "0.1.8", - "ethjs-provider-http": "0.1.6", - "ethjs-query": "0.3.7", - "ethjs-unit": "0.1.6", - "ethjs-util": "0.1.3", - "js-sha3": "0.5.5", - "number-to-bn": "1.7.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - }, - "ethjs-query": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/ethjs-query/-/ethjs-query-0.3.7.tgz", - "integrity": "sha512-TZnKUwfkWjy0SowFdPLtmsytCorHi0i4vvkQn7Jg8rZt33cRzKhuzOwKr/G3vdigCc+ePXOhUGMcJSAPlOG44A==", - "requires": { - "ethjs-format": "0.2.7", - "ethjs-rpc": "0.2.0", - "promise-to-callback": "^1.0.0" - } - }, - "ethjs-util": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.3.tgz", - "integrity": "sha1-39XqSkANxeQhqInK9H4IGtp4u1U=", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - } - } - }, - "ethjs-abi": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ethjs-abi/-/ethjs-abi-0.2.1.tgz", - "integrity": "sha1-4KepOn6BFjqUR3utVu3lJKtt5TM=", - "requires": { - "bn.js": "4.11.6", - "js-sha3": "0.5.5", - "number-to-bn": "1.7.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - } - } - }, - "ethjs-contract": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/ethjs-contract/-/ethjs-contract-0.2.2.tgz", - "integrity": "sha512-xxPqEjsULQ/QNWuvX6Ako0PGs5RxALA8N/H3+boLvnaXDFZVGpD7H63H1gBCRTZyYqCldPpVlVHuw/rD45vazw==", - "requires": { - "ethjs-abi": "0.2.0", - "ethjs-filter": "0.1.8", - "ethjs-util": "0.1.3", - "js-sha3": "0.5.5" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - }, - "ethjs-abi": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ethjs-abi/-/ethjs-abi-0.2.0.tgz", - "integrity": "sha1-0+LCIQEVIPxJm3FoIDbBT8wvWyU=", - "requires": { - "bn.js": "4.11.6", - "js-sha3": "0.5.5", - "number-to-bn": "1.7.0" - } - }, - "ethjs-util": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.3.tgz", - "integrity": "sha1-39XqSkANxeQhqInK9H4IGtp4u1U=", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - } - } - }, - "ethjs-filter": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/ethjs-filter/-/ethjs-filter-0.1.8.tgz", - "integrity": "sha512-qTDPskDL2UadHwjvM8A+WG9HwM4/FoSY3p3rMJORkHltYcAuiQZd2otzOYKcL5w2Q3sbAkW/E3yt/FPFL/AVXA==" - }, - "ethjs-query": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/ethjs-query/-/ethjs-query-0.3.8.tgz", - "integrity": "sha512-/J5JydqrOzU8O7VBOwZKUWXxHDGr46VqNjBCJgBVNNda+tv7Xc8Y2uJc6aMHHVbeN3YOQ7YRElgIc0q1CI02lQ==", - "requires": { - "babel-runtime": "^6.26.0", - "ethjs-format": "0.2.7", - "ethjs-rpc": "0.2.0", - "promise-to-callback": "^1.0.0" - } - }, - "ethjs-rpc": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ethjs-rpc/-/ethjs-rpc-0.2.0.tgz", - "integrity": "sha512-RINulkNZTKnj4R/cjYYtYMnFFaBcVALzbtEJEONrrka8IeoarNB9Jbzn+2rT00Cv8y/CxAI+GgY1d0/i2iQeOg==", - "requires": { - "promise-to-callback": "^1.0.0" - } - }, - "js-sha3": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.5.tgz", - "integrity": "sha1-uvDA6MVK1ZA0R9+Wreekobynmko=" - }, - "obs-store": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/obs-store/-/obs-store-2.4.1.tgz", - "integrity": "sha512-wpA8G4uSn8cnCKZ0pFTvqsamvy0Sm1hR2ot0Qonbfj5yBMwdAp/eD4vDI+U/ZCbV1hb2V5GapL8YKUdGCvahgg==", - "requires": { - "babel-preset-es2015": "^6.22.0", - "babelify": "^7.3.0", - "readable-stream": "^2.2.2", - "through2": "^2.0.3", - "xtend": "^4.0.1" - } - }, - "percentile": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/percentile/-/percentile-1.2.1.tgz", - "integrity": "sha512-lZtxLEQeDfWtYZf84T/qw3QqfbnKujhxKqTzHIfFAmcfYYcjUFwf3NuCnG3DDqBPjrESgNAhLI15SnSOALBQXw==" - }, - "tweetnacl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.1.tgz", - "integrity": "sha512-kcoMoKTPYnoeS50tzoqjPY3Uv9axeuuFAZY9M/9zFnhoVvRfxz9K29IMPD7jGmt2c8SW7i3gT9WqDl2+nV7p4A==" - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - } - } - }, - "ganache-cli": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.1.6.tgz", - "integrity": "sha512-S+mPguwQD8dt9T0O/7mH941U9IYDbmCsoenCr31Zlr9yxjSYdNbWYGj3xsNw8CViZsMRGwIYeCaHPqK4bx2YVw==", - "dev": true, - "requires": { - "source-map-support": "^0.5.3" - }, - "dependencies": { - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "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 - }, - "source-map-support": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.8.tgz", - "integrity": "sha512-WqAEWPdb78u25RfKzOF0swBpY0dKrNdjc4GvLwm7ScX/o9bj8Eh/YL8mcMhBHYDGl87UkkSXDOFnW4G7GhWhGg==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "ganache-core": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/ganache-core/-/ganache-core-2.5.5.tgz", - "integrity": "sha512-mrvPCtDjFLWmqygCx6LngWfA1hv6DH+iisEVYxRmCujstcMgzqi5UQdcKprxoO2Jx9st1fWVvDLi/tc6WHPGoA==", - "dev": true, - "requires": { - "abstract-leveldown": "3.0.0", - "async": "2.6.1", - "bip39": "2.5.0", - "bn.js": "4.11.8", - "cachedown": "1.0.0", - "clone": "2.1.2", - "debug": "3.1.0", - "encoding-down": "5.0.4", - "eth-sig-util": "2.0.2", - "ethereumjs-abi": "0.6.5", - "ethereumjs-account": "2.0.5", - "ethereumjs-block": "2.1.0", - "ethereumjs-tx": "1.3.7", - "ethereumjs-util": "5.2.0", - "ethereumjs-vm": "2.6.0", - "ethereumjs-wallet": "0.6.2", - "heap": "0.2.6", - "level-sublevel": "6.6.4", - "levelup": "3.1.1", - "lodash": "4.17.11", - "merkle-patricia-tree": "2.3.1", - "rlp": "2.1.0", - "seedrandom": "2.4.4", - "source-map-support": "0.5.9", - "tmp": "0.0.33", - "web3": "1.0.0-beta.35", - "web3-provider-engine": "14.1.0", - "websocket": "1.0.26" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/generator": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.4.tgz", - "integrity": "sha512-8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg==", - "requires": { - "@babel/types": "^7.3.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", - "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.4.tgz", - "integrity": "sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ==" - }, - "@babel/runtime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", - "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", - "requires": { - "regenerator-runtime": "^0.12.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", - "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" - } - } - }, - "@babel/template": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", - "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.2.2", - "@babel/types": "^7.2.2" - } - }, - "@babel/traverse": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.3.4.tgz", - "integrity": "sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.3.4", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.0.0", - "@babel/parser": "^7.3.4", - "@babel/types": "^7.3.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.11" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "globals": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", - "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==" - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "@babel/types": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.4.tgz", - "integrity": "sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - } - } - }, - "@iamstarkov/listr-update-renderer": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@iamstarkov/listr-update-renderer/-/listr-update-renderer-0.4.1.tgz", - "integrity": "sha512-IJyxQWsYDEkf8C8QthBn5N8tIUR9V9je6j3sMIpAkonaadjbvxmRC6RAhpa3RKxndhNnU2M6iNbtJwd7usQYIA==", - "requires": { - "chalk": "^1.1.3", - "cli-truncate": "^0.2.1", - "elegant-spinner": "^1.0.1", - "figures": "^1.7.0", - "indent-string": "^3.0.0", - "log-symbols": "^1.0.2", - "log-update": "^2.3.0", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "requires": { - "chalk": "^1.0.0" - } - } - } - }, - "@samverschueren/stream-to-observable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", - "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", - "requires": { - "any-observable": "^0.3.0" - } - }, - "@types/node": { - "version": "10.12.27", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.27.tgz", - "integrity": "sha512-e9wgeY6gaY21on3ve0xAjgBVjGDWq/xUteK0ujsE53bUoxycMkqfnkUgMt6ffZtykZ5X12Mg3T7Pw4TRCObDKg==" - }, - "@webassemblyjs/ast": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.5.13.tgz", - "integrity": "sha512-49nwvW/Hx9i+OYHg+mRhKZfAlqThr11Dqz8TsrvqGKMhdI2ijy3KBJOun2Z4770TPjrIJhR6KxChQIDaz8clDA==", - "requires": { - "@webassemblyjs/helper-module-context": "1.5.13", - "@webassemblyjs/helper-wasm-bytecode": "1.5.13", - "@webassemblyjs/wast-parser": "1.5.13", - "debug": "^3.1.0", - "mamacro": "^0.0.3" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz", - "integrity": "sha512-vrvvB18Kh4uyghSKb0NTv+2WZx871WL2NzwMj61jcq2bXkyhRC+8Q0oD7JGVf0+5i/fKQYQSBCNMMsDMRVAMqA==" - }, - "@webassemblyjs/helper-api-error": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz", - "integrity": "sha512-dBh2CWYqjaDlvMmRP/kudxpdh30uXjIbpkLj9HQe+qtYlwvYjPRjdQXrq1cTAAOUSMTtzqbXIxEdEZmyKfcwsg==" - }, - "@webassemblyjs/helper-buffer": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz", - "integrity": "sha512-v7igWf1mHcpJNbn4m7e77XOAWXCDT76Xe7Is1VQFXc4K5jRcFrl9D0NrqM4XifQ0bXiuTSkTKMYqDxu5MhNljA==", - "requires": { - "debug": "^3.1.0" - } - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz", - "integrity": "sha512-yN6ScQQDFCiAXnVctdVO/J5NQRbwyTbQzsGzEgXsAnrxhjp0xihh+nNHQTMrq5UhOqTb5LykpJAvEv9AT0jnAQ==", - "requires": { - "@webassemblyjs/wast-printer": "1.5.13" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz", - "integrity": "sha512-hSIKzbXjVMRvy3Jzhgu+vDd/aswJ+UMEnLRCkZDdknZO3Z9e6rp1DAs0tdLItjCFqkz9+0BeOPK/mk3eYvVzZg==" - }, - "@webassemblyjs/helper-module-context": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz", - "integrity": "sha512-zxJXULGPLB7r+k+wIlvGlXpT4CYppRz8fLUM/xobGHc9Z3T6qlmJD9ySJ2jknuktuuiR9AjnNpKYDECyaiX+QQ==", - "requires": { - "debug": "^3.1.0", - "mamacro": "^0.0.3" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz", - "integrity": "sha512-0n3SoNGLvbJIZPhtMFq0XmmnA/YmQBXaZKQZcW8maGKwLpVcgjNrxpFZHEOLKjXJYVN5Il8vSfG7nRX50Zn+aw==" - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz", - "integrity": "sha512-IJ/goicOZ5TT1axZFSnlAtz4m8KEjYr12BNOANAwGFPKXM4byEDaMNXYowHMG0yKV9a397eU/NlibFaLwr1fbw==", - "requires": { - "@webassemblyjs/ast": "1.5.13", - "@webassemblyjs/helper-buffer": "1.5.13", - "@webassemblyjs/helper-wasm-bytecode": "1.5.13", - "@webassemblyjs/wasm-gen": "1.5.13", - "debug": "^3.1.0" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz", - "integrity": "sha512-TseswvXEPpG5TCBKoLx9tT7+/GMACjC1ruo09j46ULRZWYm8XHpDWaosOjTnI7kr4SRJFzA6MWoUkAB+YCGKKg==", - "requires": { - "ieee754": "^1.1.11" - } - }, - "@webassemblyjs/leb128": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.5.13.tgz", - "integrity": "sha512-0NRMxrL+GG3eISGZBmLBLAVjphbN8Si15s7jzThaw1UE9e5BY1oH49/+MA1xBzxpf1OW5sf9OrPDOclk9wj2yg==", - "requires": { - "long": "4.0.0" - }, - "dependencies": { - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - } - } - }, - "@webassemblyjs/utf8": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.5.13.tgz", - "integrity": "sha512-Ve1ilU2N48Ew0lVGB8FqY7V7hXjaC4+PeZM+vDYxEd+R2iQ0q+Wb3Rw8v0Ri0+rxhoz6gVGsnQNb4FjRiEH/Ng==" - }, - "@webassemblyjs/wasm-edit": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz", - "integrity": "sha512-X7ZNW4+Hga4f2NmqENnHke2V/mGYK/xnybJSIXImt1ulxbCOEs/A+ZK/Km2jgihjyVxp/0z0hwIcxC6PrkWtgw==", - "requires": { - "@webassemblyjs/ast": "1.5.13", - "@webassemblyjs/helper-buffer": "1.5.13", - "@webassemblyjs/helper-wasm-bytecode": "1.5.13", - "@webassemblyjs/helper-wasm-section": "1.5.13", - "@webassemblyjs/wasm-gen": "1.5.13", - "@webassemblyjs/wasm-opt": "1.5.13", - "@webassemblyjs/wasm-parser": "1.5.13", - "@webassemblyjs/wast-printer": "1.5.13", - "debug": "^3.1.0" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz", - "integrity": "sha512-yfv94Se8R73zmr8GAYzezFHc3lDwE/lBXQddSiIZEKZFuqy7yWtm3KMwA1uGbv5G1WphimJxboXHR80IgX1hQA==", - "requires": { - "@webassemblyjs/ast": "1.5.13", - "@webassemblyjs/helper-wasm-bytecode": "1.5.13", - "@webassemblyjs/ieee754": "1.5.13", - "@webassemblyjs/leb128": "1.5.13", - "@webassemblyjs/utf8": "1.5.13" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz", - "integrity": "sha512-IkXSkgzVhQ0QYAdIayuCWMmXSYx0dHGU8Ah/AxJf1gBvstMWVnzJnBwLsXLyD87VSBIcsqkmZ28dVb0mOC3oBg==", - "requires": { - "@webassemblyjs/ast": "1.5.13", - "@webassemblyjs/helper-buffer": "1.5.13", - "@webassemblyjs/wasm-gen": "1.5.13", - "@webassemblyjs/wasm-parser": "1.5.13", - "debug": "^3.1.0" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz", - "integrity": "sha512-XnYoIcu2iqq8/LrtmdnN3T+bRjqYFjRHqWbqK3osD/0r/Fcv4d9ecRzjVtC29ENEuNTK4mQ9yyxCBCbK8S/cpg==", - "requires": { - "@webassemblyjs/ast": "1.5.13", - "@webassemblyjs/helper-api-error": "1.5.13", - "@webassemblyjs/helper-wasm-bytecode": "1.5.13", - "@webassemblyjs/ieee754": "1.5.13", - "@webassemblyjs/leb128": "1.5.13", - "@webassemblyjs/utf8": "1.5.13" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz", - "integrity": "sha512-Lbz65T0LQ1LgzKiUytl34CwuhMNhaCLgrh0JW4rJBN6INnBB8NMwUfQM+FxTnLY9qJ+lHJL/gCM5xYhB9oWi4A==", - "requires": { - "@webassemblyjs/ast": "1.5.13", - "@webassemblyjs/floating-point-hex-parser": "1.5.13", - "@webassemblyjs/helper-api-error": "1.5.13", - "@webassemblyjs/helper-code-frame": "1.5.13", - "@webassemblyjs/helper-fsm": "1.5.13", - "long": "^3.2.0", - "mamacro": "^0.0.3" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz", - "integrity": "sha512-QcwogrdqcBh8Z+eUF8SG+ag5iwQSXxQJELBEHmLkk790wgQgnIMmntT2sMAMw53GiFNckArf5X0bsCA44j3lWQ==", - "requires": { - "@webassemblyjs/ast": "1.5.13", - "@webassemblyjs/wast-parser": "1.5.13", - "long": "^3.2.0" - } - }, - "abstract-leveldown": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz", - "integrity": "sha512-KUWx9UWGQD12zsmLNj64/pndaz4iJh/Pj7nopgkfDG6RlCcbMZvT6+9l7dchK4idog2Is8VdC/PvNbFuFmalIQ==", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - }, - "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", - "dev": true, - "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" - } - }, - "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==" - }, - "acorn-dynamic-import": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", - "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", - "requires": { - "acorn": "^5.0.0" - }, - "dependencies": { - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" - } - } - }, - "acorn-jsx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", - "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==" - }, - "aes-js": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", - "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==", - "dev": true, - "optional": true - }, - "ajv": { - "version": "6.9.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.2.tgz", - "integrity": "sha512-4UFy0/LgDo7Oa/+wOAlj44tp9K78u38E5/359eSrqEp1Z5PdVfimCcs7SluXMP755RUQu6d2b4AvF0R1C9RZjg==", - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==" - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "any-observable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", - "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==" - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "requires": { - "util": "0.10.3" - } - }, - "assert-match": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/assert-match/-/assert-match-1.1.1.tgz", - "integrity": "sha512-c0QY2kpYVrH/jis6cCq9Mnt4/bIdGALDh1N8HY9ZARZedsMs5LSbgywxkjd5A1uNVLN0L8evANxBPxKiabVoZw==", - "requires": { - "assert": "^1.4.1", - "babel-runtime": "^6.23.0", - "es-to-primitive": "^1.1.1", - "lodash.merge": "^4.6.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" - }, - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "requires": { - "lodash": "^4.17.10" - } - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" - }, - "async-eventemitter": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", - "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", - "dev": true, - "requires": { - "async": "^2.4.0" - } - }, - "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true, - "requires": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", - "dev": true - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true, - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "dev": true, - "requires": { - "regenerator-transform": "^0.10.0" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-preset-env": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", - "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^3.2.6", - "invariant": "^2.2.2", - "semver": "^5.3.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - } - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "babelify": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "dev": true, - "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", - "dev": true, - "requires": { - "precond": "0.2" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base-x": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.5.tgz", - "integrity": "sha512-C3picSgzPSLE+jW3tcBzJoGwitOtazb5B+5YmAxZm2ybmTi9LNgAtDO/jjVEBZwHoXmDBZ9m/IELj3elJVRBcA==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "binary-extensions": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.0.tgz", - "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw==" - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bip39": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-2.5.0.tgz", - "integrity": "sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA==", - "dev": true, - "requires": { - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1", - "safe-buffer": "^5.0.1", - "unorm": "^1.3.3" - } - }, - "bip66": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", - "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "bl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", - "dev": true, - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "optional": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "bluebird": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", - "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==" - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" - }, - "body-parser": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", - "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", - "dev": true, - "requires": { - "bytes": "3.0.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "~1.6.3", - "iconv-lite": "0.4.23", - "on-finished": "~2.3.0", - "qs": "6.5.2", - "raw-body": "2.3.3", - "type-is": "~1.6.16" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "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==" - }, - "browserfs": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/browserfs/-/browserfs-1.4.3.tgz", - "integrity": "sha512-tz8HClVrzTJshcyIu8frE15cjqjcBIu15Bezxsvl/i+6f59iNCN3kznlWjz0FEb3DlnDx3gW5szxeT6D1x0s0w==", - "requires": { - "async": "^2.1.4", - "pako": "^1.0.4" - } - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "requires": { - "bn.js": "^4.1.0", - "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=", - "dev": true, - "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", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", - "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000844", - "electron-to-chromium": "^1.3.47" - } - }, - "bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", - "dev": true, - "optional": true, - "requires": { - "base-x": "^3.0.2" - } - }, - "bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "dev": true, - "optional": true, - "requires": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true, - "optional": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "buffer-to-arraybuffer": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "bytewise": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/bytewise/-/bytewise-1.1.0.tgz", - "integrity": "sha1-HRPL/3F65xWAlKqIGzXQgbOHJT4=", - "dev": true, - "requires": { - "bytewise-core": "^1.2.2", - "typewise": "^1.0.3" - } - }, - "bytewise-core": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bytewise-core/-/bytewise-core-1.2.3.tgz", - "integrity": "sha1-P7QQx+kVWOsasiqCg0V3qmvWHUI=", - "dev": true, - "requires": { - "typewise-core": "^1.2" - } - }, - "cacache": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", - "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", - "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "cachedown": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cachedown/-/cachedown-1.0.0.tgz", - "integrity": "sha1-1D8DbkUQaWsxJG19sx6/D3rDLRU=", - "dev": true, - "requires": { - "abstract-leveldown": "^2.4.1", - "lru-cache": "^3.2.0" - }, - "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==", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - } - } - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "requires": { - "callsites": "^2.0.0" - }, - "dependencies": { - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" - } - } - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "requires": { - "callsites": "^0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - }, - "caniuse-lite": { - "version": "1.0.30000939", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000939.tgz", - "integrity": "sha512-oXB23ImDJOgQpGjRv1tCtzAvJr4/OvrHi5SO2vUgB0g0xpdZZoA/BxfImiWfdwoYdUTtQrPsXsvYU/dmCSM8gg==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - }, - "checkpoint-store": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/checkpoint-store/-/checkpoint-store-1.1.0.tgz", - "integrity": "sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY=", - "dev": true, - "requires": { - "functional-red-black-tree": "^1.0.1" - } - }, - "chokidar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.2.tgz", - "integrity": "sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg==", - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.0" - } - }, - "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" - }, - "chrome-trace-event": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", - "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", - "requires": { - "tslib": "^1.9.0" - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "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.1", - "safe-buffer": "^5.0.1" - } - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-truncate": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", - "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", - "requires": { - "slice-ansi": "0.0.4", - "string-width": "^1.0.1" - }, - "dependencies": { - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=" - } - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" - }, - "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" - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "coinstring": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/coinstring/-/coinstring-2.3.0.tgz", - "integrity": "sha1-zbYzY6lhUCQEolr7gsLibV/2J6Q=", - "dev": true, - "optional": true, - "requires": { - "bs58": "^2.0.1", - "create-hash": "^1.1.1" - }, - "dependencies": { - "bs58": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-2.0.1.tgz", - "integrity": "sha1-VZCNWPGYKrogCPob7Y+RmYopv40=", - "dev": true, - "optional": true - } - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "requires": { - "date-now": "^0.1.4" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "dev": true - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "core-js": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", - "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "cosmiconfig": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.1.0.tgz", - "integrity": "sha512-kCNPvthka8gvLtzAxQXvWo4FxqRB+ftRZyPZNuab5ngvM9Y7yw7hbEysglptLgpkGX9nAOKTBVkHUAe8xtYR6Q==", - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "lodash.get": "^4.4.2", - "parse-json": "^4.0.0" - }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - } - } - }, - "coveralls": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.3.tgz", - "integrity": "sha512-viNfeGlda2zJr8Gj1zqXpDMRjw9uM54p7wzZdvLRyOgnAfCe974Dq4veZkjJdxQXbmdppu6flEajFYseHYaUhg==", - "requires": { - "growl": "~> 1.10.0", - "js-yaml": "^3.11.0", - "lcov-parse": "^0.0.10", - "log-driver": "^1.2.7", - "minimist": "^1.2.0", - "request": "^2.86.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-env": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.0.tgz", - "integrity": "sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg==", - "requires": { - "cross-spawn": "^6.0.5", - "is-windows": "^1.0.0" - } - }, - "cross-fetch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.3.tgz", - "integrity": "sha512-PrWWNH3yL2NYIb/7WF/5vFG3DCQiXDOVf8k3ijatbrtnwNuhMWLC7YF7uqf53tbTFDzHIUD8oITw4Bxt8ST3Nw==", - "dev": true, - "requires": { - "node-fetch": "2.1.2", - "whatwg-fetch": "2.0.4" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" - } - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" - }, - "dashdash": { - "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" - } - }, - "date-fns": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", - "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==" - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" - }, - "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" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "decompress": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", - "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", - "dev": true, - "optional": true, - "requires": { - "decompress-tar": "^4.0.0", - "decompress-tarbz2": "^4.0.0", - "decompress-targz": "^4.0.0", - "decompress-unzip": "^4.0.1", - "graceful-fs": "^4.1.10", - "make-dir": "^1.0.0", - "pify": "^2.3.0", - "strip-dirs": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "optional": true - } - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "decompress-tar": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", - "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", - "dev": true, - "requires": { - "file-type": "^5.2.0", - "is-stream": "^1.1.0", - "tar-stream": "^1.5.2" - } - }, - "decompress-tarbz2": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", - "dev": true, - "optional": true, - "requires": { - "decompress-tar": "^4.1.0", - "file-type": "^6.1.0", - "is-stream": "^1.1.0", - "seek-bzip": "^1.0.5", - "unbzip2-stream": "^1.0.9" - }, - "dependencies": { - "file-type": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", - "dev": true, - "optional": true - } - } - }, - "decompress-targz": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", - "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", - "dev": true, - "optional": true, - "requires": { - "decompress-tar": "^4.1.1", - "file-type": "^5.2.0", - "is-stream": "^1.1.0" - } - }, - "decompress-unzip": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", - "dev": true, - "optional": true, - "requires": { - "file-type": "^3.8.0", - "get-stream": "^2.2.0", - "pify": "^2.3.0", - "yauzl": "^2.4.2" - }, - "dependencies": { - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true, - "optional": true - }, - "get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", - "dev": true, - "optional": true, - "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "optional": true - } - } - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "deferred-leveldown": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", - "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", - "dev": true, - "requires": { - "abstract-leveldown": "~2.6.0" - }, - "dependencies": { - "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==", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - } - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - }, - "dependencies": { - "object-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", - "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==", - "dev": true - } - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", - "requires": { - "globby": "^6.1.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "p-map": "^1.1.1", - "pify": "^3.0.0", - "rimraf": "^2.2.8" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-walk": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=", - "dev": true - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" - }, - "drbg.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", - "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", - "dev": true, - "requires": { - "browserify-aes": "^1.0.6", - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.113", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz", - "integrity": "sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g==", - "dev": true - }, - "elegant-spinner": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", - "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=" - }, - "elliptic": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", - "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "encoding": { - "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" - } - }, - "encoding-down": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-5.0.4.tgz", - "integrity": "sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw==", - "dev": true, - "requires": { - "abstract-leveldown": "^5.0.0", - "inherits": "^2.0.3", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0", - "xtend": "^4.0.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz", - "integrity": "sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - } - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" - } - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" - }, - "dependencies": { - "object-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", - "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==", - "dev": true - } - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "eslint": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.7.0.tgz", - "integrity": "sha512-zYCeFQahsxffGl87U2aJ7DPyH8CbWgxBC213Y8+TCanhUTf2gEvfq3EKpHmEcozTLyPmGe9LZdMAwC/CpJBM5A==", - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.5.3", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^2.1.0", - "eslint-scope": "^4.0.0", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^4.0.0", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.6", - "imurmurhash": "^0.1.4", - "inquirer": "^6.1.0", - "is-resolvable": "^1.1.0", - "js-yaml": "^3.12.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.5", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "require-uncached": "^1.0.3", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^5.0.2", - "text-table": "^0.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "globals": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", - "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==" - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "eslint-config-standard": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", - "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==" - }, - "eslint-import-resolver-node": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", - "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", - "requires": { - "debug": "^2.6.9", - "resolve": "^1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "eslint-module-utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz", - "integrity": "sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w==", - "requires": { - "debug": "^2.6.8", - "pkg-dir": "^2.0.0" - }, - "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" - } - } - } - }, - "eslint-plugin-es": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz", - "integrity": "sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw==", - "requires": { - "eslint-utils": "^1.3.0", - "regexpp": "^2.0.1" - } - }, - "eslint-plugin-import": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", - "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", - "requires": { - "contains-path": "^0.1.0", - "debug": "^2.6.8", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.1", - "eslint-module-utils": "^2.2.0", - "has": "^1.0.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.3", - "read-pkg-up": "^2.0.0", - "resolve": "^1.6.0" - }, - "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" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "requires": { - "pify": "^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": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - } - } - }, - "eslint-plugin-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz", - "integrity": "sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw==", - "requires": { - "eslint-plugin-es": "^1.3.1", - "eslint-utils": "^1.3.1", - "ignore": "^4.0.2", - "minimatch": "^3.0.4", - "resolve": "^1.8.1", - "semver": "^5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" - } - } - }, - "eslint-plugin-promise": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", - "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==" - }, - "eslint-plugin-standard": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz", - "integrity": "sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA==" - }, - "eslint-scope": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", - "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", - "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==" - }, - "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==" - }, - "espree": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", - "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", - "requires": { - "acorn": "^6.0.2", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "eth-block-tracker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz", - "integrity": "sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug==", - "dev": true, - "requires": { - "eth-query": "^2.1.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.3", - "ethjs-util": "^0.1.3", - "json-rpc-engine": "^3.6.0", - "pify": "^2.3.0", - "tape": "^4.6.3" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "eth-json-rpc-infura": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.0.tgz", - "integrity": "sha512-FLcpdxPRVBCUc7yoE+wHGvyYg2lATedP+/q7PsKvaSzQpJbgTG4ZjLnyrLanxDr6M1k/dSNa6V5QnILwjUKJcw==", - "dev": true, - "requires": { - "cross-fetch": "^2.1.1", - "eth-json-rpc-middleware": "^1.5.0", - "json-rpc-engine": "^3.4.0", - "json-rpc-error": "^2.0.0", - "tape": "^4.8.0" - } - }, - "eth-json-rpc-middleware": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz", - "integrity": "sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==", - "dev": true, - "requires": { - "async": "^2.5.0", - "eth-query": "^2.1.2", - "eth-tx-summary": "^3.1.2", - "ethereumjs-block": "^1.6.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.2", - "ethereumjs-vm": "^2.1.0", - "fetch-ponyfill": "^4.0.0", - "json-rpc-engine": "^3.6.0", - "json-rpc-error": "^2.0.0", - "json-stable-stringify": "^1.0.1", - "promise-to-callback": "^1.0.0", - "tape": "^4.6.3" - }, - "dependencies": { - "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==", - "dev": true - }, - "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==", - "dev": true, - "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" - } - } - } - }, - "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==", - "dev": true, - "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", - "xhr-request-promise": "^0.1.2" - } - }, - "eth-query": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz", - "integrity": "sha1-1nQdkAAQa1FRDHLbktY2VFam2l4=", - "dev": true, - "requires": { - "json-rpc-random-id": "^1.0.0", - "xtend": "^4.0.1" - } - }, - "eth-sig-util": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-2.0.2.tgz", - "integrity": "sha512-tB6E8jf/aZQ943bo3+iojl8xRe3Jzcl+9OT6v8K7kWis6PdIX19SB2vYvN849cB9G9m/XLjYFK381SgdbsnpTA==", - "dev": true, - "requires": { - "ethereumjs-abi": "0.6.5", - "ethereumjs-util": "^5.1.1" - } - }, - "eth-tx-summary": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/eth-tx-summary/-/eth-tx-summary-3.2.3.tgz", - "integrity": "sha512-1gZpA5fKarJOVSb5OUlPnhDQuIazqAkI61zlVvf5LdG47nEgw+/qhyZnuj3CUdE/TLTKuRzPLeyXLjaB4qWTRQ==", - "dev": true, - "requires": { - "async": "^2.1.2", - "bn.js": "^4.11.8", - "clone": "^2.0.0", - "concat-stream": "^1.5.1", - "end-of-stream": "^1.1.0", - "eth-query": "^2.0.2", - "ethereumjs-block": "^1.4.1", - "ethereumjs-tx": "^1.1.1", - "ethereumjs-util": "^5.0.1", - "ethereumjs-vm": "2.3.4", - "through2": "^2.0.3", - "treeify": "^1.0.1", - "web3-provider-engine": "^13.3.2" - }, - "dependencies": { - "eth-block-tracker": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-2.3.1.tgz", - "integrity": "sha512-NamWuMBIl8kmkJFVj8WzGatySTzQPQag4Xr677yFxdVtIxACFbL/dQowk0MzEqIKk93U1TwY3MjVU6mOcwZnKA==", - "dev": true, - "requires": { - "async-eventemitter": "github:ahultgren/async-eventemitter#fa06e39e56786ba541c180061dbf2c0a5bbf951c", - "eth-query": "^2.1.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.3", - "ethjs-util": "^0.1.3", - "json-rpc-engine": "^3.6.0", - "pify": "^2.3.0", - "tape": "^4.6.3" - }, - "dependencies": { - "async-eventemitter": { - "version": "github:ahultgren/async-eventemitter#fa06e39e56786ba541c180061dbf2c0a5bbf951c", - "from": "github:ahultgren/async-eventemitter#fa06e39e56786ba541c180061dbf2c0a5bbf951c", - "dev": true, - "requires": { - "async": "^2.4.0" - } - } - } - }, - "eth-sig-util": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", - "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", - "dev": true, - "requires": { - "ethereumjs-util": "^5.1.1" - }, - "dependencies": { - "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", - "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", - "dev": true, - "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^5.0.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==", - "dev": true - }, - "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", - "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", - "requires": { - "bn.js": "^4.11.8" - } - }, - "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==", - "dev": true, - "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" - } - }, - "ethereumjs-vm": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.3.4.tgz", - "integrity": "sha512-Y4SlzNDqxrCO58jhp98HdnZVdjOqB+HC0hoU+N/DEp1aU+hFkRX/nru5F7/HkQRPIlA6aJlQp/xIA6xZs1kspw==", - "dev": true, - "requires": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereum-common": "0.2.0", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~1.7.0", - "ethereumjs-util": "^5.1.3", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.1.2", - "rustbn.js": "~0.1.1", - "safe-buffer": "^5.1.1" - } - }, - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "rustbn.js": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.1.2.tgz", - "integrity": "sha512-bAkNqSHYdJdFsBC7Z11JgzYktL31HIpB2o70jZcGiL1U1TVtPyvaVhDrGWwS8uZtaqwW2k6NOPGZCqW/Dgh5Lg==", - "dev": true - }, - "solc": { - "version": "0.4.25", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.25.tgz", - "integrity": "sha512-jU1YygRVy6zatgXrLY2rRm7HW1d7a8CkkEgNJwvH2VLpWhMFsMdWcJn6kUqZwcSz/Vm+w89dy7Z/aB5p6AFTrg==", - "dev": true, - "requires": { - "fs-extra": "^0.30.0", - "memorystream": "^0.3.1", - "require-from-string": "^1.1.0", - "semver": "^5.3.0", - "yargs": "^4.7.1" - } - }, - "web3-provider-engine": { - "version": "13.8.0", - "resolved": "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-13.8.0.tgz", - "integrity": "sha512-fZXhX5VWwWpoFfrfocslyg6P7cN3YWPG/ASaevNfeO80R+nzgoPUBXcWQekSGSsNDkeRTis4aMmpmofYf1TNtQ==", - "dev": true, - "requires": { - "async": "^2.5.0", - "clone": "^2.0.0", - "eth-block-tracker": "^2.2.2", - "eth-sig-util": "^1.4.2", - "ethereumjs-block": "^1.2.2", - "ethereumjs-tx": "^1.2.0", - "ethereumjs-util": "^5.1.1", - "ethereumjs-vm": "^2.0.2", - "fetch-ponyfill": "^4.0.0", - "json-rpc-error": "^2.0.0", - "json-stable-stringify": "^1.0.1", - "promise-to-callback": "^1.0.0", - "readable-stream": "^2.2.9", - "request": "^2.67.0", - "semaphore": "^1.0.3", - "solc": "^0.4.2", - "tape": "^4.4.0", - "xhr": "^2.2.0", - "xtend": "^4.0.1" - } - } - } - }, - "ethereum-common": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", - "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=", - "dev": true - }, - "ethereumjs-abi": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz", - "integrity": "sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE=", - "dev": true, - "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^4.3.0" - }, - "dependencies": { - "ethereumjs-util": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz", - "integrity": "sha1-PpQosxfuvaPXJg2FT93alUsfG8Y=", - "dev": true, - "requires": { - "bn.js": "^4.8.0", - "create-hash": "^1.1.2", - "keccakjs": "^0.2.0", - "rlp": "^2.0.0", - "secp256k1": "^3.0.1" - } - } - } - }, - "ethereumjs-account": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz", - "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==", - "dev": true, - "requires": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "ethereumjs-block": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.1.0.tgz", - "integrity": "sha512-ip+x4/7hUInX+TQfhEKsQh9MJK1Dbjp4AuPjf1UdX3udAV4beYD4EMCNIPzBLCsGS8WQZYXLpo83tVTISYNpow==", - "dev": true, - "requires": { - "async": "^2.0.1", - "ethereumjs-common": "^0.6.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - } - }, - "ethereumjs-common": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-0.6.1.tgz", - "integrity": "sha512-4jOrfDu9qOBTTGGb3zrfT1tE1Hyc6a8LJpEk0Vk9AYlLkBY7crjVICyJpRvjNI+KLDMpMITMw3eWVZOLMtZdhw==", - "dev": true - }, - "ethereumjs-tx": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", - "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", - "dev": true, - "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==", - "dev": true, - "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" - } - }, - "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==", - "dev": true, - "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.0", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.0.tgz", - "integrity": "sha512-Ye+uG/L2wrp364Zihdlr/GfC3ft+zG8PdHcRtsBFNNH1CkOhxOwdB8friBU85n89uRZ9eIMAywCq0F4CwT1wAw==", - "dev": true, - "requires": { - "async": "^2.0.1", - "ethereumjs-common": "^1.1.0", - "ethereumjs-tx": "^1.2.2", - "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==", - "dev": true, - "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" - } - } - } - }, - "ethereumjs-common": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.1.0.tgz", - "integrity": "sha512-LUmYkKV/HcZbWRyu3OU9YOevsH3VJDXtI6kEd8VZweQec+JjDGKCmAVKUyzhYUHqxRJu7JNALZ3A/b3NXOP6tA==", - "dev": true - }, - "ethereumjs-util": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", - "integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "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==", - "dev": true - }, - "level-errors": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", - "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", - "dev": true, - "requires": { - "errno": "~0.1.1" - } - }, - "levelup": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", - "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", - "dev": true, - "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==", - "dev": true - } - } - }, - "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==", - "dev": true, - "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=", - "dev": true - }, - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "dev": true, - "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" - } - } - } - } - } - }, - "ethereumjs-wallet": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-0.6.2.tgz", - "integrity": "sha512-DHEKPV9lYORM7dL8602dkb+AgdfzCYz2lxpdYQoD3OwG355LLDuivW9rGuLpDMCry/ORyBYV6n+QCo/71SwACg==", - "dev": true, - "optional": true, - "requires": { - "aes-js": "^3.1.1", - "bs58check": "^2.1.2", - "ethereumjs-util": "^5.2.0", - "hdkey": "^1.0.0", - "safe-buffer": "^5.1.2", - "scrypt.js": "^0.2.0", - "utf8": "^3.0.0", - "uuid": "^3.3.2" - } - }, - "ethers": { - "version": "4.0.26", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.26.tgz", - "integrity": "sha512-3hK4S8eAGhuWZ/feip5z17MswjGgjb4lEPJqWO/O0dNqToYLSHhvu6gGQPs8d9f+XfpEB2EYexfF0qjhWiZjUA==", - "requires": { - "@types/node": "^10.3.2", - "aes-js": "3.0.0", - "bn.js": "^4.4.0", - "elliptic": "6.3.3", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.4", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - }, - "dependencies": { - "aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" - }, - "elliptic": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.3.tgz", - "integrity": "sha1-VILZZG1UvLif19mU/J4ulWiHbj8=", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "inherits": "^2.0.1" - } - }, - "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" - } - }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" - }, - "setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=" - }, - "uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" - } - } - }, - "ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", - "dev": true, - "requires": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true - } - } - }, - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "dev": true, - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "eventemitter3": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.1.1.tgz", - "integrity": "sha1-R3hr2qCHyvext15zq8XH1UAVjNA=", - "dev": true - }, - "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==" - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "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" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "express": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", - "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "array-flatten": "1.1.1", - "body-parser": "1.18.3", - "content-disposition": "0.5.2", - "content-type": "~1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.1.1", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.4", - "qs": "6.5.2", - "range-parser": "~1.2.0", - "safe-buffer": "5.1.2", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "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=", - "dev": true, - "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", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "optional": true, - "requires": { - "pend": "~1.2.0" - } - }, - "fetch-ponyfill": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz", - "integrity": "sha1-rjzl9zLGReq4fkroeTQUcJsjmJM=", - "dev": true, - "requires": { - "node-fetch": "~1.7.1" - }, - "dependencies": { - "node-fetch": { - "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" - } - } - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", - "dev": true - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true - }, - "filesize": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", - "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==" - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" - } - }, - "find-parent-dir": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", - "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=" - }, - "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" - } - }, - "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", - "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" - } - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "fn-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fn-name/-/fn-name-2.0.1.tgz", - "integrity": "sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc=" - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "fs-extra": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", - "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0" - } - }, - "fs-promise": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-2.0.3.tgz", - "integrity": "sha1-9k5PhUvPaJqovdy6JokW2z20aFQ=", - "dev": true, - "optional": true, - "requires": { - "any-promise": "^1.3.0", - "fs-extra": "^2.0.0", - "mz": "^2.6.0", - "thenify-all": "^1.6.0" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", - "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", - "optional": true, - "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "bundled": true, - "optional": true, - "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" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true - }, - "minipass": { - "version": "2.3.5", - "bundled": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "needle": { - "version": "2.2.4", - "bundled": true, - "optional": true, - "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.10.3", - "bundled": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.5", - "bundled": true, - "optional": true - }, - "npm-packlist": { - "version": "1.2.0", - "bundled": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "optional": true, - "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" - } - }, - "rimraf": { - "version": "2.6.3", - "bundled": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "optional": true - }, - "semver": { - "version": "5.6.0", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "bundled": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - }, - "yallist": { - "version": "3.0.3", - "bundled": true - } - } - }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" - }, - "g-status": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/g-status/-/g-status-2.0.2.tgz", - "integrity": "sha512-kQoE9qH+T1AHKgSSD0Hkv98bobE90ILQcXAF4wvGgsr7uFqNvwmh8j+Lq3l0RVt3E3HjSbv2B9biEGcEtpHLCA==", - "requires": { - "arrify": "^1.0.1", - "matcher": "^1.0.0", - "simple-git": "^1.85.0" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, - "get-own-enumerable-property-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz", - "integrity": "sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg==" - }, - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==" - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getpass": { - "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" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "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" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "global": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", - "dev": true, - "requires": { - "min-document": "^2.19.0", - "process": "~0.5.1" - } - }, - "global-modules-path": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.1.tgz", - "integrity": "sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg==" - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "dev": true, - "requires": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" - }, - "graceful-readlink": { - "version": "1.0.1", - "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==" - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", - "dev": true - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" - }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "dev": true, - "requires": { - "has-symbol-support-x": "^1.4.1" - } - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hdkey": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/hdkey/-/hdkey-1.1.1.tgz", - "integrity": "sha512-DvHZ5OuavsfWs5yfVJZestsnc3wzPvLWNk6c2nRUfo6X+OtxypGt20vDDf7Ba+MJzjL3KS1og2nw2eBbLCOUTA==", - "dev": true, - "optional": true, - "requires": { - "coinstring": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" - }, - "heap": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.6.tgz", - "integrity": "sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw=", - "dev": true - }, - "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.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "http-https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=", - "dev": true - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" - }, - "humanize": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/humanize/-/humanize-0.0.9.tgz", - "integrity": "sha1-GZT/rs3+nEQe0r2sdFK3u0yeQaQ=" - }, - "husky": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/husky/-/husky-1.3.1.tgz", - "integrity": "sha512-86U6sVVVf4b5NYSZ0yvv88dRgBSSXXmHaiq5pP4KDj5JVzdwKgBjEtUPOm8hcoytezFwbU+7gotXNhpHdystlg==", - "requires": { - "cosmiconfig": "^5.0.7", - "execa": "^1.0.0", - "find-up": "^3.0.0", - "get-stdin": "^6.0.0", - "is-ci": "^2.0.0", - "pkg-dir": "^3.0.0", - "please-upgrade-node": "^3.1.1", - "read-pkg": "^4.0.1", - "run-node": "^1.0.0", - "slash": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", - "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "requires": { - "find-up": "^3.0.0" - } - }, - "read-pkg": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", - "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", - "requires": { - "normalize-package-data": "^2.3.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0" - } - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" - } - } - }, - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" - }, - "immediate": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", - "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=", - "dev": true - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "dependencies": { - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - } - } - }, - "import-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", - "requires": { - "pkg-dir": "^2.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "inquirer": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", - "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.11", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "strip-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", - "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", - "requires": { - "ansi-regex": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", - "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==" - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "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=" - }, - "ipaddr.js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-fn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fn/-/is-fn-1.0.0.tgz", - "integrity": "sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw=", - "dev": true - }, - "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" - } - }, - "is-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", - "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=", - "dev": true - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=", - "dev": true - }, - "is-natural-number": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", - "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=", - "dev": true, - "optional": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", - "dev": true - }, - "is-observable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", - "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", - "requires": { - "symbol-observable": "^1.1.0" - } - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "^1.0.1" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" - }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==" - }, - "istanbul-lib-instrument": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", - "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==", - "requires": { - "@babel/generator": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "istanbul-lib-coverage": "^2.0.3", - "semver": "^5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" - } - } - }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "dev": true, - "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - } - }, - "js-sha3": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.6.1.tgz", - "integrity": "sha1-W4n3enR3Z5h39YxKB1JAk0sflcA=", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.2.tgz", - "integrity": "sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "json-rpc-engine": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz", - "integrity": "sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==", - "dev": true, - "requires": { - "async": "^2.0.1", - "babel-preset-env": "^1.7.0", - "babelify": "^7.3.0", - "json-rpc-error": "^2.0.0", - "promise-to-callback": "^1.0.0", - "safe-event-emitter": "^1.0.1" - } - }, - "json-rpc-error": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/json-rpc-error/-/json-rpc-error-2.0.0.tgz", - "integrity": "sha1-p6+cICg4tekFxyUOVH8a/3cligI=", - "dev": true, - "requires": { - "inherits": "^2.0.1" - } - }, - "json-rpc-random-id": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz", - "integrity": "sha1-uknZat7RRE27jaPSA3SKy7zeyMg=", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "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=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "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" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsprim": { - "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" - } - }, - "keccak": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", - "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", - "dev": true, - "requires": { - "bindings": "^1.2.1", - "inherits": "^2.0.3", - "nan": "^2.2.1", - "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==", - "dev": true, - "requires": { - "browserify-sha3": "^0.0.4", - "sha3": "^1.2.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "requires": { - "graceful-fs": "^4.1.9" - } - }, - "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" - } - }, - "lcov-parse": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", - "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=" - }, - "level-codec": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.0.tgz", - "integrity": "sha512-OIpVvjCcZNP5SdhcNupnsI1zo5Y9Vpm+k/F1gfG5kXrtctlrwanisakweJtE0uA0OpLukRfOQae+Fg0M5Debhg==", - "dev": true - }, - "level-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.0.tgz", - "integrity": "sha512-AmY4HCp9h3OiU19uG+3YWkdELgy05OTP/r23aNHaQKWv8DO787yZgsEuGVkoph40uwN+YdUKnANlrxSsoOaaxg==", - "dev": true, - "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=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - }, - "dependencies": { - "level-errors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.1.2.tgz", - "integrity": "sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w==", - "dev": true, - "requires": { - "errno": "~0.1.1" - } - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, - "level-post": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/level-post/-/level-post-1.0.7.tgz", - "integrity": "sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew==", - "dev": true, - "requires": { - "ltgt": "^2.1.2" - } - }, - "level-sublevel": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-6.6.4.tgz", - "integrity": "sha512-pcCrTUOiO48+Kp6F1+UAzF/OtWqLcQVTVF39HLdZ3RO8XBoXt+XVPKZO1vVr1aUoxHZA9OtD2e1v7G+3S5KFDA==", - "dev": true, - "requires": { - "bytewise": "~1.1.0", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0", - "level-iterator-stream": "^2.0.3", - "ltgt": "~2.1.1", - "pull-defer": "^0.2.2", - "pull-level": "^2.0.3", - "pull-stream": "^3.6.8", - "typewiselite": "~1.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "level-iterator-stream": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-2.0.3.tgz", - "integrity": "sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.5", - "xtend": "^4.0.0" - } - }, - "ltgt": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.1.3.tgz", - "integrity": "sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ=", - "dev": true - } - } - }, - "level-ws": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", - "integrity": "sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=", - "dev": true, - "requires": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "dev": true, - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "levelup": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-3.1.1.tgz", - "integrity": "sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg==", - "dev": true, - "requires": { - "deferred-leveldown": "~4.0.0", - "level-errors": "~2.0.0", - "level-iterator-stream": "~3.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "abstract-leveldown": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz", - "integrity": "sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - }, - "deferred-leveldown": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-4.0.2.tgz", - "integrity": "sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww==", - "dev": true, - "requires": { - "abstract-leveldown": "~5.0.0", - "inherits": "^2.0.3" - } - }, - "level-iterator-stream": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-3.0.1.tgz", - "integrity": "sha512-nEIQvxEED9yRThxvOrq8Aqziy4EGzrxSZK+QzEFAVuJvQ8glfyZ96GB6BoI4sBbLfjMXm2w4vu3Tkcm9obcY0g==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "xtend": "^4.0.0" - } - } - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lint-staged": { - "version": "8.1.4", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-8.1.4.tgz", - "integrity": "sha512-oFbbhB/VzN8B3i/sIdb9gMfngGArI6jIfxSn+WPdQb2Ni3GJeS6T4j5VriSbQfxfMuYoQlMHOoFt+lfcWV0HfA==", - "requires": { - "@iamstarkov/listr-update-renderer": "0.4.1", - "chalk": "^2.3.1", - "commander": "^2.14.1", - "cosmiconfig": "^5.0.2", - "debug": "^3.1.0", - "dedent": "^0.7.0", - "del": "^3.0.0", - "execa": "^1.0.0", - "find-parent-dir": "^0.3.0", - "g-status": "^2.0.2", - "is-glob": "^4.0.0", - "is-windows": "^1.0.2", - "listr": "^0.14.2", - "lodash": "^4.17.11", - "log-symbols": "^2.2.0", - "micromatch": "^3.1.8", - "npm-which": "^3.0.1", - "p-map": "^1.1.1", - "path-is-inside": "^1.0.2", - "pify": "^3.0.0", - "please-upgrade-node": "^3.0.2", - "staged-git-files": "1.1.2", - "string-argv": "^0.0.2", - "stringify-object": "^3.2.2", - "yup": "^0.26.10" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "listr": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", - "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", - "requires": { - "@samverschueren/stream-to-observable": "^0.3.0", - "is-observable": "^1.1.0", - "is-promise": "^2.1.0", - "is-stream": "^1.1.0", - "listr-silent-renderer": "^1.1.1", - "listr-update-renderer": "^0.5.0", - "listr-verbose-renderer": "^0.5.0", - "p-map": "^2.0.0", - "rxjs": "^6.3.3" - }, - "dependencies": { - "p-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.0.0.tgz", - "integrity": "sha512-GO107XdrSUmtHxVoi60qc9tUl/KkNKm+X2CF4P9amalpGxv5YqVPJNfSb0wcA+syCopkZvYYIzW8OVTQW59x/w==" - } - } - }, - "listr-silent-renderer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", - "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=" - }, - "listr-update-renderer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", - "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", - "requires": { - "chalk": "^1.1.3", - "cli-truncate": "^0.2.1", - "elegant-spinner": "^1.0.1", - "figures": "^1.7.0", - "indent-string": "^3.0.0", - "log-symbols": "^1.0.2", - "log-update": "^2.3.0", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "requires": { - "chalk": "^1.0.0" - } - } - } - }, - "listr-verbose-renderer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", - "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", - "requires": { - "chalk": "^2.4.1", - "cli-cursor": "^2.1.0", - "date-fns": "^1.27.2", - "figures": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.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" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - } - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" - }, - "lodash.merge": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", - "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==" - }, - "log-driver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", - "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==" - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "requires": { - "chalk": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "log-update": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", - "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", - "requires": { - "ansi-escapes": "^3.0.0", - "cli-cursor": "^2.0.0", - "wrap-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", - "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0" - } - } - } - }, - "long": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" - }, - "looper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/looper/-/looper-2.0.0.tgz", - "integrity": "sha1-Zs0Md0rz1P7axTeU90LbVtqPCew=", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "lru-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz", - "integrity": "sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=", - "dev": true, - "requires": { - "pseudomap": "^1.0.1" - } - }, - "ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", - "dev": true - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==" - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, - "matcher": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-1.1.1.tgz", - "integrity": "sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg==", - "requires": { - "escape-string-regexp": "^1.0.4" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz", - "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==", - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "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=", - "dev": true, - "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==", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - } - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=" - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merkle-patricia-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.1.tgz", - "integrity": "sha512-Qp9Mpb3xazznXzzGQBqHbqCpT2AR9joUOHYYPiQjYCarrdCPCnLWXo4BFv77y4xN26KR224xoU1n/qYY7RYYgw==", - "dev": true, - "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=", - "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==", - "dev": true - }, - "level-errors": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", - "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", - "dev": true, - "requires": { - "errno": "~0.1.1" - } - }, - "levelup": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", - "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", - "dev": true, - "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==", - "dev": true - } - } - } - } - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "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" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true - }, - "mime-db": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", - "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==" - }, - "mime-types": { - "version": "2.1.22", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", - "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", - "requires": { - "mime-db": "~1.38.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "dev": true, - "requires": { - "dom-walk": "^0.1.0" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mississippi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", - "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^2.0.1", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "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" - } - }, - "mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", - "dev": true, - "optional": true, - "requires": { - "mkdirp": "*" - } - }, - "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==" - }, - "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" - } - }, - "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" - } - } - } - }, - "mocha-lcov-reporter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mocha-lcov-reporter/-/mocha-lcov-reporter-1.3.0.tgz", - "integrity": "sha1-Rpve9PivyaEWBW8HnfYYLQr7A4Q=" - }, - "mock-fs": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.8.0.tgz", - "integrity": "sha512-Gwj4KnJOW15YeTJKO5frFd/WDO5Mc0zxXqL9oHx3+e9rBqW8EVARqQHSaIXznUdljrD6pvbNGW2ZGXKPEfYJfw==", - "dev": true, - "optional": true - }, - "mout": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/mout/-/mout-0.11.1.tgz", - "integrity": "sha1-ujYR318OWx/7/QEWa48C0fX6K5k=", - "dev": true, - "optional": true - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "optional": true, - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" - }, - "nano-json-stream-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", - "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true - }, - "neo-async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", - "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==" - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "node-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", - "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=", - "dev": true - }, - "node-libs-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", - "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "requires": { - "inherits": "2.0.3" - } - } - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "npm-path": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz", - "integrity": "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==", - "requires": { - "which": "^1.2.10" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, - "npm-which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz", - "integrity": "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=", - "requires": { - "commander": "^2.9.0", - "npm-path": "^2.0.2", - "which": "^1.2.10" - }, - "dependencies": { - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" - } - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", - "dev": true, - "requires": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true - } - } - }, - "nyc": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.3.0.tgz", - "integrity": "sha512-P+FwIuro2aFG6B0Esd9ZDWUd51uZrAEoGutqZxzrVmYl3qSfkLgcQpBPBjtDFsUQLFY1dvTQJPOyeqr8S9GF8w==", - "requires": { - "archy": "^1.0.0", - "arrify": "^1.0.1", - "caching-transform": "^3.0.1", - "convert-source-map": "^1.6.0", - "find-cache-dir": "^2.0.0", - "find-up": "^3.0.0", - "foreground-child": "^1.5.6", - "glob": "^7.1.3", - "istanbul-lib-coverage": "^2.0.3", - "istanbul-lib-hook": "^2.0.3", - "istanbul-lib-instrument": "^3.1.0", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.2", - "istanbul-reports": "^2.1.1", - "make-dir": "^1.3.0", - "merge-source-map": "^1.1.0", - "resolve-from": "^4.0.0", - "rimraf": "^2.6.3", - "signal-exit": "^3.0.2", - "spawn-wrap": "^1.4.2", - "test-exclude": "^5.1.0", - "uuid": "^3.3.2", - "yargs": "^12.0.5", - "yargs-parser": "^11.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true - }, - "append-transform": { - "version": "1.0.0", - "bundled": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, - "archy": { - "version": "1.0.0", - "bundled": true - }, - "arrify": { - "version": "1.0.1", - "bundled": true - }, - "async": { - "version": "2.6.2", - "bundled": true, - "requires": { - "lodash": "^4.17.11" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "caching-transform": { - "version": "3.0.1", - "bundled": true, - "requires": { - "hasha": "^3.0.0", - "make-dir": "^1.3.0", - "package-hash": "^3.0.0", - "write-file-atomic": "^2.3.0" - } - }, - "camelcase": { - "version": "5.0.0", - "bundled": true - }, - "cliui": { - "version": "4.1.0", - "bundled": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "commander": { - "version": "2.17.1", - "bundled": true, - "optional": true - }, - "commondir": { - "version": "1.0.1", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "convert-source-map": { - "version": "1.6.0", - "bundled": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cross-spawn": { - "version": "4.0.2", - "bundled": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "debug": { - "version": "4.1.1", - "bundled": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "bundled": true - }, - "default-require-extensions": { - "version": "2.0.0", - "bundled": true, - "requires": { - "strip-bom": "^3.0.0" - } - }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, - "requires": { - "once": "^1.4.0" - } - }, - "error-ex": { - "version": "1.3.2", - "bundled": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es6-error": { - "version": "4.1.1", - "bundled": true - }, - "execa": { - "version": "1.0.0", - "bundled": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "bundled": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } - }, - "find-cache-dir": { - "version": "2.0.0", - "bundled": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "bundled": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "foreground-child": { - "version": "1.5.6", - "bundled": true, - "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true - }, - "get-caller-file": { - "version": "1.0.3", - "bundled": true - }, - "get-stream": { - "version": "4.1.0", - "bundled": true, - "requires": { - "pump": "^3.0.0" - } - }, - "glob": { - "version": "7.1.3", - "bundled": true, - "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" - } - }, - "graceful-fs": { - "version": "4.1.15", - "bundled": true - }, - "handlebars": { - "version": "4.1.0", - "bundled": true, - "requires": { - "async": "^2.5.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true - } - } - }, - "has-flag": { - "version": "3.0.0", - "bundled": true - }, - "hasha": { - "version": "3.0.0", - "bundled": true, - "requires": { - "is-stream": "^1.0.1" - } - }, - "hosted-git-info": { - "version": "2.7.1", - "bundled": true - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "invert-kv": { - "version": "2.0.0", - "bundled": true - }, - "is-arrayish": { - "version": "0.2.1", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true - }, - "is-stream": { - "version": "1.1.0", - "bundled": true - }, - "isexe": { - "version": "2.0.0", - "bundled": true - }, - "istanbul-lib-coverage": { - "version": "2.0.3", - "bundled": true - }, - "istanbul-lib-hook": { - "version": "2.0.3", - "bundled": true, - "requires": { - "append-transform": "^1.0.0" - } - }, - "istanbul-lib-report": { - "version": "2.0.4", - "bundled": true, - "requires": { - "istanbul-lib-coverage": "^2.0.3", - "make-dir": "^1.3.0", - "supports-color": "^6.0.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "bundled": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.2", - "bundled": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.3", - "make-dir": "^1.3.0", - "rimraf": "^2.6.2", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true - } - } - }, - "istanbul-reports": { - "version": "2.1.1", - "bundled": true, - "requires": { - "handlebars": "^4.1.0" - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "bundled": true - }, - "lcid": { - "version": "2.0.0", - "bundled": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "bundled": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "bundled": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "bundled": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "bundled": true - }, - "lru-cache": { - "version": "4.1.5", - "bundled": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "bundled": true, - "requires": { - "pify": "^3.0.0" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "bundled": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "mem": { - "version": "4.1.0", - "bundled": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^2.0.0" - } - }, - "merge-source-map": { - "version": "1.1.0", - "bundled": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true - } - } - }, - "mimic-fn": { - "version": "1.2.0", - "bundled": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.10", - "bundled": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "bundled": true - } - } - }, - "ms": { - "version": "2.1.1", - "bundled": true - }, - "nice-try": { - "version": "1.0.5", - "bundled": true - }, - "normalize-package-data": { - "version": "2.5.0", - "bundled": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "bundled": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1" - } - }, - "optimist": { - "version": "0.6.1", - "bundled": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true - }, - "os-locale": { - "version": "3.1.0", - "bundled": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "bundled": true - }, - "p-finally": { - "version": "1.0.0", - "bundled": true - }, - "p-is-promise": { - "version": "2.0.0", - "bundled": true - }, - "p-limit": { - "version": "2.1.0", - "bundled": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "bundled": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "bundled": true - }, - "package-hash": { - "version": "3.0.0", - "bundled": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^3.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "bundled": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-exists": { - "version": "3.0.0", - "bundled": true - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true - }, - "path-key": { - "version": "2.0.1", - "bundled": true - }, - "path-parse": { - "version": "1.0.6", - "bundled": true - }, - "path-type": { - "version": "3.0.0", - "bundled": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "bundled": true - }, - "pkg-dir": { - "version": "3.0.0", - "bundled": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "pseudomap": { - "version": "1.0.2", - "bundled": true - }, - "pump": { - "version": "3.0.0", - "bundled": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "read-pkg": { - "version": "3.0.0", - "bundled": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "bundled": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "release-zalgo": { - "version": "1.0.0", - "bundled": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "require-directory": { - "version": "2.1.1", - "bundled": true - }, - "require-main-filename": { - "version": "1.0.1", - "bundled": true - }, - "resolve": { - "version": "1.10.0", - "bundled": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "bundled": true - }, - "rimraf": { - "version": "2.6.3", - "bundled": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true - }, - "semver": { - "version": "5.6.0", - "bundled": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true - }, - "shebang-command": { - "version": "1.2.0", - "bundled": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "bundled": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true - }, - "spawn-wrap": { - "version": "1.4.2", - "bundled": true, - "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - } - }, - "spdx-correct": { - "version": "3.1.0", - "bundled": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "bundled": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "bundled": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.3", - "bundled": true - }, - "string-width": { - "version": "2.1.1", - "bundled": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "bundled": true - }, - "strip-eof": { - "version": "1.0.0", - "bundled": true - }, - "test-exclude": { - "version": "5.1.0", - "bundled": true, - "requires": { - "arrify": "^1.0.1", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^1.0.1" - } - }, - "uglify-js": { - "version": "3.4.9", - "bundled": true, - "optional": true, - "requires": { - "commander": "~2.17.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "optional": true - } - } - }, - "uuid": { - "version": "3.3.2", - "bundled": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "bundled": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "bundled": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "bundled": true - }, - "wordwrap": { - "version": "0.0.3", - "bundled": true - }, - "wrap-ansi": { - "version": "2.1.0", - "bundled": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "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", - "bundled": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - }, - "write-file-atomic": { - "version": "2.4.2", - "bundled": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "y18n": { - "version": "4.0.0", - "bundled": true - }, - "yallist": { - "version": "2.1.2", - "bundled": true - }, - "yargs": { - "version": "12.0.5", - "bundled": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "bundled": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-inspect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", - "dev": true - }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "^3.0.1" - } - }, - "oboe": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.3.tgz", - "integrity": "sha1-K0hl29Rr6BIlcT9Om/5Lz09oCk8=", - "dev": true, - "requires": { - "http-https": "^1.0.0" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "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" - } - }, - "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=" - }, - "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==", - "dev": true - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-is-promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", - "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==" - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==" - }, - "p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", - "dev": true, - "requires": { - "p-finally": "^1.0.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "pako": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz", - "integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA==" - }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "parse-asn1": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", - "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-headers": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.2.tgz", - "integrity": "sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg==", - "dev": true, - "requires": { - "for-each": "^0.3.3", - "string.prototype.trim": "^1.1.2" - } - }, - "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" - } - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, - "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-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "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" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true, - "optional": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "pify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.0.tgz", - "integrity": "sha512-zrSP/KDf9DH3K3VePONoCstgPiYJy9z0SCatZuTpOc7YdnWIqwkWdXOuwlr4uDc7em8QZRsFWsT/685x5InjYg==" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "requires": { - "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - } - } - }, - "please-upgrade-node": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz", - "integrity": "sha512-KY1uHnQ2NlQHqIJQpnh/i54rKkuxCEBx+voJIS/Mvb+L2iYd2NMotwduhKTMjfC1uKoX3VXOxLjIYG66dfJTVQ==", - "requires": { - "semver-compare": "^1.0.0" - } - }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" - }, - "portfinder": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", - "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", - "requires": { - "async": "^1.5.2", - "debug": "^2.2.0", - "mkdirp": "0.5.x" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, - "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" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - }, - "precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "prettier": { - "version": "1.16.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.4.tgz", - "integrity": "sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g==" - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" - }, - "promise-to-callback": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/promise-to-callback/-/promise-to-callback-1.0.0.tgz", - "integrity": "sha1-XSp0kBC/tn2WNZj805YHRqaP7vc=", - "dev": true, - "requires": { - "is-fn": "^1.0.0", - "set-immediate-shim": "^1.0.1" - } - }, - "property-expr": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-1.5.1.tgz", - "integrity": "sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g==" - }, - "proxy-addr": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", - "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.8.0" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pull-cat": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/pull-cat/-/pull-cat-1.1.11.tgz", - "integrity": "sha1-tkLdElXaN2pwa220+pYvX9t0wxs=", - "dev": true - }, - "pull-defer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/pull-defer/-/pull-defer-0.2.3.tgz", - "integrity": "sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA==", - "dev": true - }, - "pull-level": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pull-level/-/pull-level-2.0.4.tgz", - "integrity": "sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg==", - "dev": true, - "requires": { - "level-post": "^1.0.7", - "pull-cat": "^1.1.9", - "pull-live": "^1.0.1", - "pull-pushable": "^2.0.0", - "pull-stream": "^3.4.0", - "pull-window": "^2.1.4", - "stream-to-pull-stream": "^1.7.1" - } - }, - "pull-live": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pull-live/-/pull-live-1.0.1.tgz", - "integrity": "sha1-pOzuAeMwFV6RJLu89HYfIbOPUfU=", - "dev": true, - "requires": { - "pull-cat": "^1.1.9", - "pull-stream": "^3.4.0" - } - }, - "pull-pushable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pull-pushable/-/pull-pushable-2.2.0.tgz", - "integrity": "sha1-Xy867UethpGfAbEqLpnW8b13ZYE=", - "dev": true - }, - "pull-stream": { - "version": "3.6.9", - "resolved": "https://registry.npmjs.org/pull-stream/-/pull-stream-3.6.9.tgz", - "integrity": "sha512-hJn4POeBrkttshdNl0AoSCVjMVSuBwuHocMerUdoZ2+oIUzrWHFTwJMlbHND7OiKLVgvz6TFj8ZUVywUMXccbw==", - "dev": true - }, - "pull-window": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/pull-window/-/pull-window-2.1.4.tgz", - "integrity": "sha1-/DuG/uvRkgx64pdpHiP3BfiFUvA=", - "dev": true, - "requires": { - "looper": "^2.0.0" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "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==", - "dev": true, - "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "randomhex": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/randomhex/-/randomhex-0.1.5.tgz", - "integrity": "sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU=", - "dev": true - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "dev": true - }, - "raw-body": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", - "dev": true, - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", - "unpipe": "1.0.0" - } - }, - "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" - } - }, - "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==", - "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" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "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" - } - } - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true, - "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "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=" - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - } - }, - "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - } - } - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "resumer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", - "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", - "dev": true, - "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==" - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rlp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.1.0.tgz", - "integrity": "sha512-93U7IKH5j7nmXFVg19MeNBGzQW5uXW1pmCuKY8veeKIhYTE32C2d0mOegfiIAfXcHOKJjjPlJisn8iHDF5AezA==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.1" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "requires": { - "is-promise": "^2.1.0" - } - }, - "run-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/run-node/-/run-node-1.0.0.tgz", - "integrity": "sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==" - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "requires": { - "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==", - "dev": true - }, - "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-event-emitter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz", - "integrity": "sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==", - "dev": true, - "requires": { - "events": "^3.0.0" - } - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - }, - "scrypt": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/scrypt/-/scrypt-6.0.3.tgz", - "integrity": "sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0=", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.0.8" - } - }, - "scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" - }, - "scrypt.js": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.2.1.tgz", - "integrity": "sha512-XMoqxwABdotuW+l+qACmJ/h0kVSCgMPZXpbncA/zyBO90z/NnDISzVw+xJ4tUY+X/Hh0EFT269OYHm26VCPgmA==", - "dev": true, - "optional": true, - "requires": { - "scrypt": "^6.0.2", - "scryptsy": "^1.2.1" - } - }, - "scryptsy": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz", - "integrity": "sha1-oyJfpLJST4AnAHYeKFW987LZIWM=", - "dev": true, - "optional": true, - "requires": { - "pbkdf2": "^3.0.3" - } - }, - "secp256k1": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.6.2.tgz", - "integrity": "sha512-90nYt7yb0LmI4A2jJs1grglkTAXrBwxYAjP9bpeKjvJKOjG2fOeH/YI/lchDMIvjrOasd5QXwvV2jwN168xNng==", - "dev": true, - "requires": { - "bindings": "^1.2.1", - "bip66": "^1.1.3", - "bn.js": "^4.11.3", - "create-hash": "^1.1.2", - "drbg.js": "^1.0.1", - "elliptic": "^6.2.3", - "nan": "^2.2.1", - "safe-buffer": "^5.1.0" - } - }, - "seedrandom": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.4.tgz", - "integrity": "sha512-9A+PDmgm+2du77B5i0Ip2cxOqqHjgNxnBgglxLcX78A2D6c2rTo61z4jnVABpF4cKeDMDG+cmXXvdnqse2VqMA==", - "dev": true - }, - "seek-bzip": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", - "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", - "dev": true, - "optional": true, - "requires": { - "commander": "~2.8.1" - } - }, - "semaphore": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", - "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==", - "dev": true - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" - }, - "semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=" - }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz", - "integrity": "sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==" - }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" - } - }, - "servify": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", - "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", - "dev": true, - "requires": { - "body-parser": "^1.16.0", - "cors": "^2.8.1", - "express": "^4.14.0", - "request": "^2.79.0", - "xhr": "^2.3.3" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", - "dev": true - }, - "simple-get": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", - "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", - "dev": true, - "requires": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "simple-git": { - "version": "1.107.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.107.0.tgz", - "integrity": "sha512-t4OK1JRlp4ayKRfcW6owrWcRVLyHRUlhGd0uN6ZZTqfDq8a5XpcUdOKiGRNobHEuMtNqzp0vcJNvhYWwh5PsQA==", - "requires": { - "debug": "^4.0.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - } - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "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" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "solc": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.24.tgz", - "integrity": "sha512-2xd7Cf1HeVwrIb6Bu1cwY2/TaLRodrppCq3l7rhLimFQgmxptXhTC3+/wesVLpB09F1A2kZgvbMOgH7wvhFnBQ==", - "requires": { - "fs-extra": "^0.30.0", - "memorystream": "^0.3.1", - "require-from-string": "^1.1.0", - "semver": "^5.3.0", - "yargs": "^4.7.1" - }, - "dependencies": { - "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" - } - } - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", - "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==" - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", - "requires": { - "safe-buffer": "^5.1.1" - } - }, - "staged-git-files": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/staged-git-files/-/staged-git-files-1.1.2.tgz", - "integrity": "sha512-0Eyrk6uXW6tg9PYkhi/V/J4zHp33aNyi2hOCmhFLqLTIhbgqWn5jlSzI+IU0VqrZq6+DbHcabQl/WP6P3BG0QA==" - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" - }, - "stream-to-pull-stream": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/stream-to-pull-stream/-/stream-to-pull-stream-1.7.2.tgz", - "integrity": "sha1-dXYJrhzr0zx0MtSvvjH/eGULnd4=", - "dev": true, - "requires": { - "looper": "^3.0.0", - "pull-stream": "^3.2.3" - }, - "dependencies": { - "looper": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/looper/-/looper-3.0.0.tgz", - "integrity": "sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k=", - "dev": true - } - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, - "string-argv": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.0.2.tgz", - "integrity": "sha1-2sMECGkMIfPDYwo/86BYd73L1zY=" - }, - "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" - } - }, - "string.prototype.trim": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", - "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.0", - "function-bind": "^1.0.2" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.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" - } - }, - "strip-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", - "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", - "dev": true, - "optional": true, - "requires": { - "is-natural-number": "^4.0.1" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", - "dev": true, - "requires": { - "is-hex-prefixed": "1.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "swarm-js": { - "version": "0.1.37", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.37.tgz", - "integrity": "sha512-G8gi5fcXP/2upwiuOShJ258sIufBVztekgobr3cVgYXObZwJ5AXLqZn52AI+/ffft29pJexF9WNdUxjlkVehoQ==", - "dev": true, - "optional": true, - "requires": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "decompress": "^4.0.0", - "eth-lib": "^0.1.26", - "fs-extra": "^2.1.2", - "fs-promise": "^2.0.0", - "got": "^7.1.0", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar.gz": "^1.0.5", - "xhr-request-promise": "^0.1.2" - } - }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" - }, - "synchronous-promise": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.6.tgz", - "integrity": "sha512-TyOuWLwkmtPL49LHCX1caIwHjRzcVd62+GF6h8W/jHOeZUFHpnd2XJDVuUlaTaLPH1nuu2M69mfHr5XbQJnf/g==" - }, - "table": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/table/-/table-5.2.3.tgz", - "integrity": "sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ==", - "requires": { - "ajv": "^6.9.1", - "lodash": "^4.17.11", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", - "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.0.0.tgz", - "integrity": "sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.0.0" - } - }, - "strip-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", - "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", - "requires": { - "ansi-regex": "^4.0.0" - } - } - } - }, - "tapable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", - "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==" - }, - "tape": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/tape/-/tape-4.10.1.tgz", - "integrity": "sha512-G0DywYV1jQeY3axeYnXUOt6ktnxS9OPJh97FGR3nrua8lhWi1zPflLxcAHavZ7Jf3qUfY7cxcVIVFa4mY2IY1w==", - "dev": true, - "requires": { - "deep-equal": "~1.0.1", - "defined": "~1.0.0", - "for-each": "~0.3.3", - "function-bind": "~1.1.1", - "glob": "~7.1.3", - "has": "~1.0.3", - "inherits": "~2.0.3", - "minimist": "~1.2.0", - "object-inspect": "~1.6.0", - "resolve": "~1.10.0", - "resumer": "~0.0.0", - "string.prototype.trim": "~1.1.2", - "through": "~2.3.8" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "dev": true, - "optional": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" - } - }, - "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dev": true, - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - } - }, - "tar.gz": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/tar.gz/-/tar.gz-1.0.7.tgz", - "integrity": "sha512-uhGatJvds/3diZrETqMj4RxBR779LKlIE74SsMcn5JProZsfs9j0QBwWO1RW+IWNJxS2x8Zzra1+AW6OQHWphg==", - "dev": true, - "optional": true, - "requires": { - "bluebird": "^2.9.34", - "commander": "^2.8.1", - "fstream": "^1.0.8", - "mout": "^0.11.0", - "tar": "^2.1.1" - }, - "dependencies": { - "bluebird": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", - "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", - "dev": true, - "optional": true - } - } - }, - "temp": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", - "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", - "requires": { - "os-tmpdir": "^1.0.0", - "rimraf": "~2.2.6" - }, - "dependencies": { - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=" - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "thenify": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", - "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", - "dev": true, - "requires": { - "any-promise": "^1.0.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", - "dev": true, - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true - }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", - "requires": { - "setimmediate": "^1.0.4" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" - }, - "to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "toposort": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", - "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=" - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, - "treeify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", - "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", - "dev": true - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" - }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" - }, - "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.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.18" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typewise": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typewise/-/typewise-1.0.3.tgz", - "integrity": "sha1-EGeTZUCvl5N8xdz5kiSG6fooRlE=", - "dev": true, - "requires": { - "typewise-core": "^1.2.0" - } - }, - "typewise-core": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/typewise-core/-/typewise-core-1.2.0.tgz", - "integrity": "sha1-l+uRgFx/VdL5QXSPpQ0xXZke8ZU=", - "dev": true - }, - "typewiselite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typewiselite/-/typewiselite-1.0.0.tgz", - "integrity": "sha1-yIgvobsQksBgBal/NO9chQjjZk4=", - "dev": true - }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "requires": { - "commander": "~2.13.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==" - } - } - }, - "uglifyjs-webpack-plugin": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", - "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", - "requires": { - "cacache": "^10.0.4", - "find-cache-dir": "^1.0.0", - "schema-utils": "^0.4.5", - "serialize-javascript": "^1.4.0", - "source-map": "^0.6.1", - "uglify-es": "^3.3.4", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" - } - }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true - }, - "unbzip2-stream": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", - "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", - "dev": true, - "optional": true, - "requires": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unorm": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.5.0.tgz", - "integrity": "sha512-sMfSWoiRaXXeDZSXC+YRZ23H4xchQpwxjpw1tmfR+kgbBCaOgln4NI0LXejJIhnBuKINrB3WRn+ZI8IWssirVw==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - } - } - }, - "upath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==" - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - } - } - }, - "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=", - "dev": true, - "requires": { - "prepend-http": "^1.0.1" - } - }, - "url-set-query": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", - "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=", - "dev": true - }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", - "dev": true, - "optional": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - }, - "v8-compile-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz", - "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==" - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "verror": { - "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.2.0" - } - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "requires": { - "indexof": "0.0.1" - } - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - } - }, - "web3": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.0.0-beta.35.tgz", - "integrity": "sha512-xwDmUhvTcHQvvNnOPcPZZgCxKUsI2e+GbHy7JkTK3/Rmnutazy8x7fsAXT9myw7V1qpi3GgLoZ3fkglSUbg1Mg==", - "dev": true, - "optional": true, - "requires": { - "web3-bzz": "1.0.0-beta.35", - "web3-core": "1.0.0-beta.35", - "web3-eth": "1.0.0-beta.35", - "web3-eth-personal": "1.0.0-beta.35", - "web3-net": "1.0.0-beta.35", - "web3-shh": "1.0.0-beta.35", - "web3-utils": "1.0.0-beta.35" - } - }, - "web3-bzz": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.0.0-beta.35.tgz", - "integrity": "sha512-BhAU0qhlr8zltm4gs/+P1gki2VkxHJaM2Rrh4DGesDW0lzwufRoNvWFlwx1bKHoFPWNbSmm9PRkHOYOINL/Tgw==", - "dev": true, - "optional": true, - "requires": { - "got": "7.1.0", - "swarm-js": "0.1.37", - "underscore": "1.8.3" - } - }, - "web3-core": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.35.tgz", - "integrity": "sha512-ayGavbgVk4KL9Y88Uv411fBJ0SVgVfKhKEBweKYzmP0zOqneMzWt6YsyD1n6kRvjAbqA0AfUPEOKyMNjcx2tjw==", - "dev": true, - "requires": { - "web3-core-helpers": "1.0.0-beta.35", - "web3-core-method": "1.0.0-beta.35", - "web3-core-requestmanager": "1.0.0-beta.35", - "web3-utils": "1.0.0-beta.35" - } - }, - "web3-core-helpers": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.35.tgz", - "integrity": "sha512-APOu3sEsamyqWt//8o4yq9KF25/uqGm+pQShson/sC4gKzmfJB07fLo2ond0X30E8fIqAPeVCotPXQxGciGUmA==", - "dev": true, - "requires": { - "underscore": "1.8.3", - "web3-eth-iban": "1.0.0-beta.35", - "web3-utils": "1.0.0-beta.35" - } - }, - "web3-core-method": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.35.tgz", - "integrity": "sha512-jidImCide8q0GpfsO4L73qoHrbkeWgwU3uOH5DKtJtv0ccmG086knNMRgryb/o9ZgetDWLmDEsJnHjBSoIwcbA==", - "dev": true, - "requires": { - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.35", - "web3-core-promievent": "1.0.0-beta.35", - "web3-core-subscriptions": "1.0.0-beta.35", - "web3-utils": "1.0.0-beta.35" - } - }, - "web3-core-promievent": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.35.tgz", - "integrity": "sha512-GvqXqKq07OmHuVi5uNRg6k79a1/CI0ViCC+EtNv4CORHtDRmYEt5Bvdv6z6FJEiaaQkD0lKbFwNhLxutx7HItw==", - "dev": true, - "requires": { - "any-promise": "1.3.0", - "eventemitter3": "1.1.1" - } - }, - "web3-core-requestmanager": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.35.tgz", - "integrity": "sha512-S+zW2h17ZZQU9oe3yaCJE0E7aJS4C3Kf4kGPDv+nXjW0gKhQQhgVhw1Doq/aYQGqNSWJp7f1VHkz5gQWwg6RRg==", - "dev": true, - "requires": { - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.35", - "web3-providers-http": "1.0.0-beta.35", - "web3-providers-ipc": "1.0.0-beta.35", - "web3-providers-ws": "1.0.0-beta.35" - } - }, - "web3-core-subscriptions": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.35.tgz", - "integrity": "sha512-gXzLrWvcGkGiWq1y33Z4Y80XI8XMrwowiQJkrPSjQ81K5PBKquOGwcMffLaKcwdmEy/NpsOXDeFo3eLE1Ghvvw==", - "dev": true, - "requires": { - "eventemitter3": "1.1.1", - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.35" - } - }, - "web3-eth": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.0.0-beta.35.tgz", - "integrity": "sha512-04mcb2nGPXThawuuYICPOxv0xOHofvQKsjZeIq+89nyOC8DQMGTAErDkGyMHQYtjpth5XDhic0wuEsA80AmFZA==", - "dev": true, - "optional": true, - "requires": { - "underscore": "1.8.3", - "web3-core": "1.0.0-beta.35", - "web3-core-helpers": "1.0.0-beta.35", - "web3-core-method": "1.0.0-beta.35", - "web3-core-subscriptions": "1.0.0-beta.35", - "web3-eth-abi": "1.0.0-beta.35", - "web3-eth-accounts": "1.0.0-beta.35", - "web3-eth-contract": "1.0.0-beta.35", - "web3-eth-iban": "1.0.0-beta.35", - "web3-eth-personal": "1.0.0-beta.35", - "web3-net": "1.0.0-beta.35", - "web3-utils": "1.0.0-beta.35" - } - }, - "web3-eth-abi": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.35.tgz", - "integrity": "sha512-KUDC+EtFFYG8z01ZleKrASdjj327/rtWHzEt6RWsEj7bBa0bGp9nEh+nqdZx/Sdgz1O8tnfFzJlrRcXpfr1vGg==", - "dev": true, - "requires": { - "bn.js": "4.11.6", - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.35", - "web3-utils": "1.0.0-beta.35" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true - } - } - }, - "web3-eth-accounts": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.35.tgz", - "integrity": "sha512-duIgRsfht/0kAW/eQ0X9lKtVIykbETrnM2H7EnvplCzPHtQLodpib4o9JXfh9n6ZDgdDC7cuJoiVB9QJg089ew==", - "dev": true, - "optional": true, - "requires": { - "any-promise": "1.3.0", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.7", - "scrypt.js": "0.2.0", - "underscore": "1.8.3", - "uuid": "2.0.1", - "web3-core": "1.0.0-beta.35", - "web3-core-helpers": "1.0.0-beta.35", - "web3-core-method": "1.0.0-beta.35", - "web3-utils": "1.0.0-beta.35" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", - "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "scrypt.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.2.0.tgz", - "integrity": "sha1-r40UZbcemZARC+38WTuUeeA6ito=", - "dev": true, - "optional": true, - "requires": { - "scrypt": "^6.0.2", - "scryptsy": "^1.2.1" - } - }, - "uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=", - "dev": true, - "optional": true - } - } - }, - "web3-eth-contract": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.35.tgz", - "integrity": "sha512-foPohOg5O1UCGKGZOIs+kQK5IZdV2QQ7pAWwNxH8WHplUA+fre1MurXNpoxknUmH6mYplFhXjqgYq2MsrBpHrA==", - "dev": true, - "optional": true, - "requires": { - "underscore": "1.8.3", - "web3-core": "1.0.0-beta.35", - "web3-core-helpers": "1.0.0-beta.35", - "web3-core-method": "1.0.0-beta.35", - "web3-core-promievent": "1.0.0-beta.35", - "web3-core-subscriptions": "1.0.0-beta.35", - "web3-eth-abi": "1.0.0-beta.35", - "web3-utils": "1.0.0-beta.35" - } - }, - "web3-eth-iban": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.35.tgz", - "integrity": "sha512-H5wkcNcAIc+h/WoDIKv7ZYmrM2Xqu3O7jBQl1IWo73EDVQji+AoB2i3J8tuwI1yZRInRwrfpI3Zuwuf54hXHmQ==", - "dev": true, - "requires": { - "bn.js": "4.11.6", - "web3-utils": "1.0.0-beta.35" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true - } - } - }, - "web3-eth-personal": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.35.tgz", - "integrity": "sha512-AcM9nnlxu7ZRRxPvkrFB9eLxMM4A2cPfj2aCg21Wb2EpMnhR+b/O1cT33k7ApRowoMpM+T9M8vx2oPNwXfaCOQ==", - "dev": true, - "requires": { - "web3-core": "1.0.0-beta.35", - "web3-core-helpers": "1.0.0-beta.35", - "web3-core-method": "1.0.0-beta.35", - "web3-net": "1.0.0-beta.35", - "web3-utils": "1.0.0-beta.35" - } - }, - "web3-net": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.0.0-beta.35.tgz", - "integrity": "sha512-bbwaQ/KohGjIJ6HAKbZ6KrklCAaG6/B7hIbAbVLSFLxF+Yz9lmAgQYaDInpidpC/NLb3WOmcbRF+P77J4qMVIA==", - "dev": true, - "requires": { - "web3-core": "1.0.0-beta.35", - "web3-core-method": "1.0.0-beta.35", - "web3-utils": "1.0.0-beta.35" - } - }, - "web3-provider-engine": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-14.1.0.tgz", - "integrity": "sha512-vGZtqhSUzGTiMGhJXNnB/aRDlrPZLhLnBZ2NPArkZtr8XSrwg9m08tw4+PuWg5za0TJuoE/vuPQc501HddZZWw==", - "dev": true, - "requires": { - "async": "^2.5.0", - "backoff": "^2.5.0", - "clone": "^2.0.0", - "cross-fetch": "^2.1.0", - "eth-block-tracker": "^3.0.0", - "eth-json-rpc-infura": "^3.1.0", - "eth-sig-util": "^1.4.2", - "ethereumjs-block": "^1.2.2", - "ethereumjs-tx": "^1.2.0", - "ethereumjs-util": "^5.1.5", - "ethereumjs-vm": "^2.3.4", - "json-rpc-error": "^2.0.0", - "json-stable-stringify": "^1.0.1", - "promise-to-callback": "^1.0.0", - "readable-stream": "^2.2.9", - "request": "^2.85.0", - "semaphore": "^1.0.3", - "ws": "^5.1.1", - "xhr": "^2.2.0", - "xtend": "^4.0.1" - }, - "dependencies": { - "eth-sig-util": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", - "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", - "dev": true, - "requires": { - "ethereumjs-util": "^5.1.1" - }, - "dependencies": { - "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", - "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", - "dev": true, - "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^5.0.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==", - "dev": true - }, - "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", - "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", - "requires": { - "bn.js": "^4.11.8" - } - }, - "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==", - "dev": true, - "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" - } - }, - "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "web3-providers-http": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.0.0-beta.35.tgz", - "integrity": "sha512-DcIMFq52Fb08UpWyZ3ZlES6NsNqJnco4hBS/Ej6eOcASfuUayPI+GLkYVZsnF3cBYqlH+DOKuArcKSuIxK7jIA==", - "dev": true, - "requires": { - "web3-core-helpers": "1.0.0-beta.35", - "xhr2-cookies": "1.1.0" - } - }, - "web3-providers-ipc": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.35.tgz", - "integrity": "sha512-iB0FG0HcpUnayfa8pn4guqEQ4Y1nrroi/jffdtQgFkrNt0sD3fMSwwC0AbmECqj3tDLl0e1slBR0RENll+ZF0g==", - "dev": true, - "requires": { - "oboe": "2.1.3", - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.35" - } - }, - "web3-providers-ws": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.35.tgz", - "integrity": "sha512-Cx64NgDStynKaUGDIIOfaCd0fZusL8h5avKTkdTjUu2aHhFJhZoVBGVLhoDtUaqZGWIZGcBJOoVf2JkGUOjDRQ==", - "dev": true, - "requires": { - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.35" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "websocket": { - "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", - "from": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", - "dev": true, - "requires": { - "debug": "^2.2.0", - "nan": "^2.3.3", - "typedarray-to-buffer": "^3.1.2", - "yaeti": "^0.0.6" - } - } - } - }, - "web3-shh": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.0.0-beta.35.tgz", - "integrity": "sha512-8qSonk/x0xabERS9Sr6AIADN/Ty+5KwARkkGIfSYHKqFpdMDz+76F7cUCxtoCZoS8K04xgZlDKYe0TJXLYA0Fw==", - "dev": true, - "optional": true, - "requires": { - "web3-core": "1.0.0-beta.35", - "web3-core-method": "1.0.0-beta.35", - "web3-core-subscriptions": "1.0.0-beta.35", - "web3-net": "1.0.0-beta.35" - } - }, - "web3-utils": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.35.tgz", - "integrity": "sha512-Dq6f0SOKj3BDFRgOPnE6ALbzBDCKVIW8mKWVf7tGVhTDHf+wQaWwQSC3aArFSqdExB75BPBPyDpuMTNszhljpA==", - "dev": true, - "requires": { - "bn.js": "4.11.6", - "eth-lib": "0.1.27", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randomhex": "0.1.5", - "underscore": "1.8.3", - "utf8": "2.1.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true - }, - "utf8": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", - "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=", - "dev": true - } - } - }, - "webpack": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.17.1.tgz", - "integrity": "sha512-vdPYogljzWPhFKDj3Gcp01Vqgu7K3IQlybc3XIdKSQHelK1C3eIQuysEUR7MxKJmdandZlQB/9BG2Jb1leJHaw==", - "requires": { - "@webassemblyjs/ast": "1.5.13", - "@webassemblyjs/helper-module-context": "1.5.13", - "@webassemblyjs/wasm-edit": "1.5.13", - "@webassemblyjs/wasm-opt": "1.5.13", - "@webassemblyjs/wasm-parser": "1.5.13", - "acorn": "^5.6.2", - "acorn-dynamic-import": "^3.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", - "schema-utils": "^0.4.4", - "tapable": "^1.0.0", - "uglifyjs-webpack-plugin": "^1.2.4", - "watchpack": "^1.5.0", - "webpack-sources": "^1.0.1" - }, - "dependencies": { - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" - } - } - }, - "webpack-bundle-size-analyzer": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-size-analyzer/-/webpack-bundle-size-analyzer-2.7.0.tgz", - "integrity": "sha1-LsBTn9V/hxYIOJizi4kv6UyIxrw=", - "requires": { - "commander": "^2.7.1", - "filesize": "^3.1.2", - "humanize": "0.0.9" - } - }, - "webpack-cli": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.0.tgz", - "integrity": "sha512-p5NeKDtYwjZozUWq6kGNs9w+Gtw/CPvyuXjXn2HMdz8Tie+krjEg8oAtonvIyITZdvpF7XG9xDHwscLr2c+ugQ==", - "requires": { - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.0.0", - "global-modules-path": "^2.1.0", - "import-local": "^1.0.0", - "inquirer": "^6.0.0", - "interpret": "^1.1.0", - "loader-utils": "^1.1.0", - "supports-color": "^5.4.0", - "v8-compile-cache": "^2.0.0", - "yargs": "^12.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "requires": { - "invert-kv": "^2.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-limit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", - "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "websocket": { - "version": "1.0.26", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.26.tgz", - "integrity": "sha512-fjcrYDPIQxpTnqFQ9JjxUQcdvR89MFAOjPBlF+vjOt49w/XW4fJknUoMz/mDIn2eK1AdslVojcaOxOqyZZV8rw==", - "dev": true, - "requires": { - "debug": "^2.2.0", - "nan": "^2.3.3", - "typedarray-to-buffer": "^3.1.2", - "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==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "whatwg-fetch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - }, - "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=" - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - }, - "worker-farm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", - "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "requires": { - "mkdirp": "^0.5.1" - } - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } - }, - "xhr": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", - "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", - "dev": true, - "requires": { - "global": "~4.3.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "xhr-request": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", - "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", - "dev": true, - "requires": { - "buffer-to-arraybuffer": "^0.0.5", - "object-assign": "^4.1.1", - "query-string": "^5.0.1", - "simple-get": "^2.7.0", - "timed-out": "^4.0.1", - "url-set-query": "^1.0.0", - "xhr": "^2.0.4" - } - }, - "xhr-request-promise": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz", - "integrity": "sha1-NDxE0e53JrhkgGloLQ+EDIO0Jh0=", - "dev": true, - "requires": { - "xhr-request": "^1.0.1" - } - }, - "xhr2-cookies": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", - "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=", - "dev": true, - "requires": { - "cookiejar": "^2.1.1" - } - }, - "xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "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" - } - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "optional": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yup": { - "version": "0.26.10", - "resolved": "https://registry.npmjs.org/yup/-/yup-0.26.10.tgz", - "integrity": "sha512-keuNEbNSnsOTOuGCt3UJW69jDE3O4P+UHAakO7vSeFMnjaitcmlbij/a3oNb9g1Y1KvSKH/7O1R2PQ4m4TRylw==", - "requires": { - "@babel/runtime": "7.0.0", - "fn-name": "~2.0.1", - "lodash": "^4.17.10", - "property-expr": "^1.5.0", - "synchronous-promise": "^2.0.5", - "toposort": "^2.0.2" - } - } - } - }, - "gather-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gather-stream/-/gather-stream-1.0.0.tgz", - "integrity": "sha1-szmUr0V6gRVwDUEPMXczy+egkEs=", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "gaze": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", - "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", - "dev": true, - "requires": { - "globule": "^1.0.0" - } - }, - "geckodriver": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-1.16.2.tgz", - "integrity": "sha512-kXZP4QferAv57Ru4Fx2WYuu//ErKJP4hPEkJm4mSETo42jsdYFwdNxwQ4vCGhf14gsCdxU9YrwNupJ8gr1GxPg==", - "dev": true, - "requires": { - "adm-zip": "0.4.11", - "bluebird": "3.4.6", - "got": "5.6.0", - "https-proxy-agent": "2.2.1", - "tar": "4.4.2" - }, - "dependencies": { - "bluebird": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.6.tgz", - "integrity": "sha1-AdqNgh2HgT0ViWfnQ9X+bGLPjA8=", - "dev": true - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "got": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-5.6.0.tgz", - "integrity": "sha1-ux1+4WO3gIK7yOuDbz85UATqb78=", - "dev": true, - "requires": { - "create-error-class": "^3.0.1", - "duplexer2": "^0.1.4", - "is-plain-obj": "^1.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "node-status-codes": "^1.0.0", - "object-assign": "^4.0.1", - "parse-json": "^2.1.0", - "pinkie-promise": "^2.0.0", - "read-all-stream": "^3.0.0", - "readable-stream": "^2.0.5", - "timed-out": "^2.0.0", - "unzip-response": "^1.0.0", - "url-parse-lax": "^1.0.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "tar": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.2.tgz", - "integrity": "sha512-BfkE9CciGGgDsATqkikUHrQrraBCO+ke/1f6SFAEMnxyyfN9lxC+nW1NFWMpqH865DhHIy9vQi682gk1X7friw==", - "dev": true, - "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "timed-out": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz", - "integrity": "sha1-84sK6B03R9YoAB9B2vxlKs5nHAo=", - "dev": true - }, - "unzip-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", - "dev": true - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true - } - } - }, - "generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "dev": true, - "requires": { - "is-property": "^1.0.2" - } - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "^1.0.0" - } - }, - "get-assigned-identifiers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", - "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", - "dev": true - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "get-own-enumerable-property-symbols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz", - "integrity": "sha512-TtY/sbOemiMKPRUDDanGCSgBYe7Mf0vbRsWnBZ+9yghpZ1MvcpSpuZFjHdEeY/LZjZy0vdLjS77L6HosisFiug==", - "dev": true - }, - "get-stdin": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-3.0.2.tgz", - "integrity": "sha1-wc7SS5A5s43thb3xYeV3E7bdSr4=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "get-uri": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.2.tgz", - "integrity": "sha512-ZD325dMZOgerGqF/rF6vZXyFGTAay62svjQIT+X/oU2PtxYpFxvSkbsdi+oxIrsNxlZVd4y8wUDqkaExWTI/Cw==", - "requires": { - "data-uri-to-buffer": "1", - "debug": "2", - "extend": "3", - "file-uri-to-path": "1", - "ftp": "~0.3.10", - "readable-stream": "2" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "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" - } - }, - "gettext-parser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-1.1.0.tgz", - "integrity": "sha1-LFpmONiTk0ubVQN9CtgstwBLJnk=", - "dev": true, - "requires": { - "encoding": "^0.1.11" - } - }, - "gh-pages": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-1.2.0.tgz", - "integrity": "sha512-cGLYAvxtlQ1iTwAS4g7FreZPXoE/g62Fsxln2mmR19mgs4zZI+XJ+wVVUhBFCF/0+Nmvbq+abyTWue1m1BSnmg==", - "dev": true, - "requires": { - "async": "2.6.1", - "commander": "2.15.1", - "filenamify-url": "^1.0.0", - "fs-extra": "^5.0.0", - "globby": "^6.1.0", - "graceful-fs": "4.1.11", - "rimraf": "^2.6.2" - }, - "dependencies": { - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } - }, - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true - }, - "fs-extra": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "gifencoder": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/gifencoder/-/gifencoder-1.1.0.tgz", - "integrity": "sha512-MVh++nximxsp8NaNRfS1+MmCviZ4wi7HhuvX8eHrfNn//1mqi8Eb03tKs6Z+lIIcSEySJ6PmS1VPZ+HdtEMlfg==", - "dev": true - }, - "git-up": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.1.tgz", - "integrity": "sha512-LFTZZrBlrCrGCG07/dm1aCjjpL1z9L3+5aEeI9SBhAqSc+kiA9Or1bgZhQFNppJX6h/f5McrvJt1mQXTFm6Qrw==", - "dev": true, - "requires": { - "is-ssh": "^1.3.0", - "parse-url": "^5.0.0" - } - }, - "git-url-parse": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.1.2.tgz", - "integrity": "sha512-gZeLVGY8QVKMIkckncX+iCq2/L8PlwncvDFKiWkBn9EtCfYDbliRTTp6qzyQ1VMdITUfq7293zDzfpjdiGASSQ==", - "dev": true, - "requires": { - "git-up": "^4.0.0" - } - }, - "gl-mat4": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/gl-mat4/-/gl-mat4-1.1.4.tgz", - "integrity": "sha1-HolbVYkuVqiWhnq9g30483oXgIY=" - }, - "gl-vec3": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/gl-vec3/-/gl-vec3-1.0.3.tgz", - "integrity": "sha1-EQ/Yl9Byn2OYMHOBVn0JRJQb8is=" - }, - "glamor": { - "version": "2.20.40", - "resolved": "https://registry.npmjs.org/glamor/-/glamor-2.20.40.tgz", - "integrity": "sha512-DNXCd+c14N9QF8aAKrfl4xakPk5FdcFwmH7sD0qnC0Pr7xoZ5W9yovhUrY/dJc3psfGGXC58vqQyRtuskyUJxA==", - "dev": true, - "requires": { - "fbjs": "^0.8.12", - "inline-style-prefixer": "^3.0.6", - "object-assign": "^4.1.1", - "prop-types": "^15.5.10", - "through": "^2.3.8" - } - }, - "glamorous": { - "version": "4.12.5", - "resolved": "https://registry.npmjs.org/glamorous/-/glamorous-4.12.5.tgz", - "integrity": "sha512-k3w5+7iHLyS1BRWOrGpXAXIAq8vIdK762gIePr+WT30wQ9rw7Ve+5bjxSspM4rcw5pt+/4/CJAbbJvYLWB4PGg==", - "dev": true, - "requires": { - "brcast": "^3.0.0", - "csstype": "^2.2.0", - "fast-memoize": "^2.2.7", - "html-tag-names": "^1.1.1", - "is-function": "^1.0.1", - "is-plain-object": "^2.0.4", - "react-html-attributes": "^1.4.2", - "svg-tag-names": "^1.1.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" - } - }, - "glob-all": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.1.0.tgz", - "integrity": "sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs=", - "dev": true, - "requires": { - "glob": "^7.0.5", - "yargs": "~1.2.6" - }, - "dependencies": { - "minimist": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", - "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=", - "dev": true - }, - "yargs": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-1.2.6.tgz", - "integrity": "sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s=", - "dev": true, - "requires": { - "minimist": "^0.1.0" - } - } - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - }, - "dependencies": { - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-to-regexp": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.0.tgz", - "integrity": "sha512-fyPCII4vn9Gvjq2U/oDAfP433aiE64cyP/CJjRJcpVGjqqNdioUYn9+r0cSzT1XPwmGAHuTT7iv+rQT8u/YHKQ==", - "dev": true - }, - "global": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", - "requires": { - "min-document": "^2.19.0", - "process": "~0.5.1" - } - }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "dev": true, - "requires": { - "ini": "^1.3.4" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" - }, - "globalthis": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.0.tgz", - "integrity": "sha512-vcCAZTJ3r5Qcu5l8/2oyVdoFwxKgfYnMTR2vwWeux/NAVZK3PwcMaWkdUIn4GJbmKuRK7xcvDsLuK+CKcXyodg==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "object-keys": "^1.0.12" - }, - "dependencies": { - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - } - } - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "globjoin": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", - "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", - "dev": true - }, - "globule": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", - "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", - "dev": true, - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.4", - "minimatch": "~3.0.2" - } - }, - "glogg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", - "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "good-listener": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", - "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", - "dev": true, - "optional": true, - "requires": { - "delegate": "^3.1.2" - } - }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "dev": true, - "requires": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, - "graphlib": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.7.tgz", - "integrity": "sha512-TyI9jIy2J4j0qgPmOOrHTCtpPqJGN/aurBwc6ZT+bRii+di1I+Wv3obRhVrmBEXet+qkMaEX67dXrwsd3QQM6w==", - "dev": true, - "requires": { - "lodash": "^4.17.5" - } - }, - "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true - }, - "gud": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", - "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==", - "dev": true - }, - "gulp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", - "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", - "dev": true, - "requires": { - "glob-watcher": "^5.0.3", - "gulp-cli": "^2.2.0", - "undertaker": "^1.2.1", - "vinyl-fs": "^3.0.0" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chokidar": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - } - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-watcher": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", - "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-done": "^1.2.0", - "chokidar": "^2.0.0", - "is-negated-glob": "^1.0.0", - "just-debounce": "^1.0.0", - "object.defaults": "^1.1.0" - } - }, - "gulp-cli": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", - "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.1.0", - "isobject": "^3.0.1", - "liftoff": "^3.1.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.0.1", - "yargs": "^7.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "liftoff": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", - "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", - "dev": true, - "requires": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "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" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - } - } - }, - "undertaker": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", - "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" - } - }, - "upath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", - "dev": true - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "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.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - } - }, - "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "dev": true, - "requires": { - "camelcase": "^3.0.0" - } - } - } - }, - "gulp-autoprefixer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/gulp-autoprefixer/-/gulp-autoprefixer-5.0.0.tgz", - "integrity": "sha1-gjfCeKaXdScKHK/n1vEBz81YVUQ=", - "dev": true, - "requires": { - "autoprefixer": "^8.0.0", - "fancy-log": "^1.3.2", - "plugin-error": "^1.0.1", - "postcss": "^6.0.1", - "through2": "^2.0.0", - "vinyl-sourcemaps-apply": "^0.2.0" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - } - } - } - }, - "gulp-babel": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/gulp-babel/-/gulp-babel-7.0.1.tgz", - "integrity": "sha512-UqHS3AdxZyJCRxqnAX603Dj3k/Wx6hzcgmav3QcxvsIFq3Y8ZkU7iXd0O+JwD5ivqCc6o0r1S7tCB/xxLnuSNw==", - "dev": true, - "requires": { - "plugin-error": "^1.0.1", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl-sourcemaps-apply": "^0.2.0" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - } - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - } - } - }, - "gulp-debug": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/gulp-debug/-/gulp-debug-3.2.0.tgz", - "integrity": "sha512-2LZzP+ydczqz1rhqq/NYxvVvYTmOa0IgBl2B1sQTdkQgku9ayOUM/KHuGPjF4QA5aO1VcG+Sskw7iCcRUqHKkA==", - "dev": true, - "requires": { - "chalk": "^2.3.0", - "fancy-log": "^1.3.2", - "plur": "^2.0.0", - "stringify-object": "^3.0.0", - "through2": "^2.0.0", - "tildify": "^1.1.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "gulp-eslint": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/gulp-eslint/-/gulp-eslint-4.0.0.tgz", - "integrity": "sha512-+qsePo04v1O3JshpNvww9+bOgZEJ6Cc2/w3mEktfKz0NL0zsh1SWzjyIL2FIM2zzy6IYQYv+j8REZORF8dKX4g==", - "dev": true, - "requires": { - "eslint": "^4.0.0", - "gulp-util": "^3.0.8" - } - }, - "gulp-json-editor": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/gulp-json-editor/-/gulp-json-editor-2.2.1.tgz", - "integrity": "sha1-fE3XR36NBtxdxJwLgedFzbBPl7s=", - "dev": true, - "requires": { - "deepmerge": "~0.2.7", - "detect-indent": "^2.0.0", - "gulp-util": "~3.0.0", - "js-beautify": "~1.5.4", - "through2": "~0.5.0" - }, - "dependencies": { - "detect-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-2.0.0.tgz", - "integrity": "sha1-cg/1Hk2Xt2iE9r9XKSNIsT396Tk=", - "dev": true, - "requires": { - "get-stdin": "^3.0.0", - "minimist": "^1.1.0", - "repeating": "^1.1.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", - "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", - "dev": true, - "requires": { - "readable-stream": "~1.0.17", - "xtend": "~3.0.0" - } - }, - "xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", - "dev": true - } - } - }, - "gulp-livereload": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/gulp-livereload/-/gulp-livereload-4.0.0.tgz", - "integrity": "sha512-R4e9DIVKls8SQkmUIpOeMO/jnkMKJYO04o7Ut0nuex2FuQQSZSrmforKNUALmjSqsshjRj3HDEWBQkJNYK5daA==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "debug": "^3.1.0", - "event-stream": "^3.3.4", - "fancy-log": "^1.3.2", - "lodash.assign": "^4.2.0", - "tiny-lr": "^1.1.1", - "vinyl": "^2.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - } - } - }, - "gulp-multi-process": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/gulp-multi-process/-/gulp-multi-process-1.3.1.tgz", - "integrity": "sha512-okxYy3mxUkekM0RNjkBg8OPuzpnD2yXMAdnGOaQPSJ2wzBdE9R9pkTV+tzPZ65ORK7b57YUc6s+gROA4+EIOLg==", - "dev": true, - "requires": { - "async.queue": "^0.5.2" - } - }, - "gulp-replace": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-0.6.1.tgz", - "integrity": "sha1-Eb+Mj85TPjPi9qjy9DC5VboL4GY=", - "dev": true, - "requires": { - "istextorbinary": "1.0.2", - "readable-stream": "^2.0.1", - "replacestream": "^4.0.0" - } - }, - "gulp-sass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-4.0.1.tgz", - "integrity": "sha512-OMQEgWNggpog8Tc5v1MuI6eo+5iiPkVeLL76iBhDoEEScLUPfZlpvzmgTnLkpcqdrNodZxpz5qcv6mS2rulk3g==", - "dev": true, - "requires": { - "chalk": "^2.3.0", - "lodash.clonedeep": "^4.3.2", - "node-sass": "^4.8.3", - "plugin-error": "^1.0.1", - "replace-ext": "^1.0.0", - "strip-ansi": "^4.0.0", - "through2": "^2.0.0", - "vinyl-sourcemaps-apply": "^0.2.0" - }, - "dependencies": { - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, - "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", - "dev": true - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "dev": true, - "requires": { - "mime-db": "1.40.0" - } - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true - }, - "node-sass": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.12.0.tgz", - "integrity": "sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ==", - "dev": true, - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^1.1.1", - "cross-spawn": "^3.0.0", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "in-publish": "^2.0.0", - "lodash": "^4.17.11", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "nan": "^2.13.2", - "node-gyp": "^3.8.0", - "npmlog": "^4.0.0", - "request": "^2.88.0", - "sass-graph": "^2.2.4", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", - "dev": true, - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - } - } - }, - "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - } - } - }, - "gulp-sourcemaps": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.3.tgz", - "integrity": "sha1-EbAz91n5CeCl8Vt730esKcxU76Q=", - "dev": true, - "requires": { - "@gulp-sourcemaps/identity-map": "1.X", - "@gulp-sourcemaps/map-sources": "1.X", - "acorn": "5.X", - "convert-source-map": "1.X", - "css": "2.X", - "debug-fabulous": "1.X", - "detect-newline": "2.X", - "graceful-fs": "4.X", - "source-map": "0.X", - "strip-bom-string": "1.X", - "through2": "2.X" - }, - "dependencies": { - "acorn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", - "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==", - "dev": true - } - } - }, - "gulp-stylefmt": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/gulp-stylefmt/-/gulp-stylefmt-1.1.0.tgz", - "integrity": "sha1-euoAoKm9L72KJILcAfEz7cowPVI=", - "dev": true, - "requires": { - "gulp-util": "^3.0.7", - "postcss": "^5.0.21", - "postcss-scss": "^0.4.0", - "stylefmt": "^5.0.4", - "through2": "^2.0.1" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "gulp-stylelint": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/gulp-stylelint/-/gulp-stylelint-7.0.0.tgz", - "integrity": "sha512-0PI+tNTzaJz5+qO3i9Jyd04ZPSb+NCN7bZ2GaIArvbQpuyJha9p3lpWxPG+XJtrVT42bIiyLeYKPnLe7uW4dQQ==", - "dev": true, - "requires": { - "chalk": "^2.3.0", - "deep-extend": "^0.5.0", - "fancy-log": "^1.3.2", - "mkdirp": "^0.5.1", - "plugin-error": "^1.0.1", - "promise": "^8.0.1", - "source-map": "^0.5.6", - "strip-ansi": "^4.0.0", - "through2": "^2.0.3" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - } - }, - "promise": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.1.tgz", - "integrity": "sha1-5F1osAoXZHttpxG/he1u1HII9FA=", - "dev": true, - "requires": { - "asap": "~2.0.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "gulp-uglify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-3.0.0.tgz", - "integrity": "sha1-DfAzHXKg0wLj434QlIXd3zPG0co=", - "dev": true, - "requires": { - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash": "^4.13.1", - "make-error-cause": "^1.1.1", - "through2": "^2.0.0", - "uglify-js": "^3.0.5", - "vinyl-sourcemaps-apply": "^0.2.0" - }, - "dependencies": { - "commander": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", - "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==", - "dev": true - }, - "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 - }, - "uglify-js": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.11.tgz", - "integrity": "sha512-AKLsYcdV+sS5eAE4NtVXF6f2u/DCQynQm0jTGxF261+Vltu1dYNuHzjqDmk11gInj+H/zJIM2EAwXG3MzPb3VA==", - "dev": true, - "requires": { - "commander": "~2.14.1", - "source-map": "~0.6.1" - } - } - } - }, - "gulp-uglify-es": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gulp-uglify-es/-/gulp-uglify-es-1.0.1.tgz", - "integrity": "sha512-lwVTOhSPNJvoPZ8wC1mrDiqSszS8INK2R4kaslBKf9wyMVXLWckKs+LRh5bgcymeB5zsczGKT9bGCTNKeEoCvQ==", - "dev": true, - "requires": { - "o-stream": "^0.2.2", - "plugin-error": "^1.0.1", - "uglify-es": "^3.3.9", - "vinyl": "^2.1.0", - "vinyl-sourcemaps-apply": "^0.2.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - } - }, - "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 - }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "dev": true, - "requires": { - "commander": "~2.13.0", - "source-map": "~0.6.1" - } - } - } - }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^2.0.0", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "dependencies": { - "clone": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", - "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "gulp-watch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/gulp-watch/-/gulp-watch-5.0.1.tgz", - "integrity": "sha512-HnTSBdzAOFIT4wmXYPDUn783TaYAq9bpaN05vuZNP5eni3z3aRx0NAKbjhhMYtcq76x4R1wf4oORDGdlrEjuog==", - "dev": true, - "requires": { - "ansi-colors": "1.1.0", - "anymatch": "^1.3.0", - "chokidar": "^2.0.0", - "fancy-log": "1.3.2", - "glob-parent": "^3.0.1", - "object-assign": "^4.1.0", - "path-is-absolute": "^1.0.1", - "plugin-error": "1.0.1", - "readable-stream": "^2.2.2", - "slash": "^1.0.0", - "vinyl": "^2.1.0", - "vinyl-file": "^2.0.0" - }, - "dependencies": { - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chokidar": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - } - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "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" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - } - } - } - } - }, - "gulp-zip": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/gulp-zip/-/gulp-zip-4.1.0.tgz", - "integrity": "sha1-2rF4vZmvoZCSPx63irrw20eBdwQ=", - "dev": true, - "requires": { - "get-stream": "^3.0.0", - "plugin-error": "^0.1.2", - "through2": "^2.0.1", - "vinyl": "^2.1.0", - "yazl": "^2.1.0" - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - } - }, - "gzip-size": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.0.0.tgz", - "integrity": "sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "pify": "^3.0.0" - } - }, - "handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", - "dev": true, - "requires": { - "neo-async": "^2.6.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - }, - "dependencies": { - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "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", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "requires": { - "ajv": "^5.1.0", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", - "requires": { - "function-bind": "^1.0.2" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "dev": true, - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } - } - }, - "has-color": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", - "dev": true - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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.1" - } - }, - "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" - } - }, - "hasha": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", - "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", - "dev": true, - "optional": true, - "requires": { - "is-stream": "^1.0.1", - "pinkie-promise": "^2.0.0" - } - }, - "hast-util-from-parse5": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.1.tgz", - "integrity": "sha512-UfPzdl6fbxGAxqGYNThRUhRlDYY7sXu6XU9nQeX4fFZtV+IHbyEJtd+DUuwOqNV4z3K05E/1rIkoVr/JHmeWWA==", - "dev": true, - "requires": { - "ccount": "^1.0.3", - "hastscript": "^5.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.1.2", - "xtend": "^4.0.1" - } - }, - "hast-util-parse-selector": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.2.tgz", - "integrity": "sha512-jIMtnzrLTjzqgVEQqPEmwEZV+ea4zHRFTP8Z2Utw0I5HuBOXHzUPPQWr6ouJdJqDKLbFU/OEiYwZ79LalZkmmw==", - "dev": true - }, - "hastscript": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.0.tgz", - "integrity": "sha512-7mOQX5VfVs/gmrOGlN8/EDfp1GqV6P3gTNVt+KnX4gbYhpASTM8bklFdFQCbFRAadURXAmw0R1QQdBdqp7jswQ==", - "dev": true, - "requires": { - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.2.0", - "property-information": "^5.0.1", - "space-separated-tokens": "^1.0.0" - } - }, - "hdkey": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/hdkey/-/hdkey-0.7.1.tgz", - "integrity": "sha1-yu5L6BqneSHpCbjSKN0PKayu5jI=", - "requires": { - "coinstring": "^2.0.0", - "secp256k1": "^3.0.1" - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "highlight.js": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.12.0.tgz", - "integrity": "sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4=", - "dev": true - }, - "history": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz", - "integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==", - "requires": { - "invariant": "^2.2.1", - "loose-envify": "^1.2.0", - "resolve-pathname": "^2.2.0", - "value-equal": "^0.4.0", - "warning": "^3.0.0" - } - }, - "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.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoist-non-react-statics": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.3.1.tgz", - "integrity": "sha1-ND24TGAYxlB3iJgkATWhQg7iLOA=" - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==" - }, - "html-element-attributes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/html-element-attributes/-/html-element-attributes-1.3.1.tgz", - "integrity": "sha512-UrRKgp5sQmRnDy4TEwAUsu14XBUlzKB8U3hjIYDjcZ3Hbp86Jtftzxfgrv6E/ii/h78tsaZwAnAE8HwnHr0dPA==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.1" - } - }, - "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", - "dev": true - }, - "html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", - "dev": true, - "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" - }, - "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - } - } - }, - "html-tag-names": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/html-tag-names/-/html-tag-names-1.1.3.tgz", - "integrity": "sha512-kY/ck6Q0lGLxGocn86BM8Q4vCTUCY78VN43h0uMGeZ8p9LU3XdSNQR4Rs3JEjrKZSS5iXI1YgzY0g8U1AFDQzA==", - "dev": true - }, - "html-tags": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", - "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", - "dev": true - }, - "html-webpack-plugin": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.5.tgz", - "integrity": "sha512-y5l4lGxOW3pz3xBTFdfB9rnnrWRPVxlAhX6nrBYIcW+2k2zC3mSp/3DxlWVCMBfnO6UAnoF8OcFn0IMy6kaKAQ==", - "dev": true, - "requires": { - "html-minifier": "^3.5.20", - "loader-utils": "^1.1.0", - "lodash": "^4.17.11", - "pretty-error": "^2.1.1", - "tapable": "^1.1.0", - "util.promisify": "1.0.0" - } - }, - "htmlescape": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", - "dev": true - }, - "htmlparser2": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", - "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" - }, - "dependencies": { - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" - } - } - }, - "http-parser-js": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.9.tgz", - "integrity": "sha1-6hoE+2St/wJC6ZdPKX3Uw8rSceE=", - "dev": true - }, - "http-proxy": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", - "dev": true, - "requires": { - "eventemitter3": "^3.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "dependencies": { - "eventemitter3": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", - "dev": true - } - } - }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "requires": { - "agent-base": "4", - "debug": "3.1.0" - }, - "dependencies": { - "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" - } - } - } - }, - "http-server": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/http-server/-/http-server-0.11.1.tgz", - "integrity": "sha512-6JeGDGoujJLmhjiRGlt8yK8Z9Kl0vnl/dQoQZlc4oeqaUoAKQg94NILLfrY3oWzSyFaQCVNTcKE5PZ3cH8VP9w==", - "dev": true, - "requires": { - "colors": "1.0.3", - "corser": "~2.0.0", - "ecstatic": "^3.0.0", - "http-proxy": "^1.8.1", - "opener": "~1.4.0", - "optimist": "0.6.x", - "portfinder": "^1.0.13", - "union": "~0.4.3" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true - }, - "portfinder": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", - "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", - "dev": true, - "requires": { - "async": "^1.5.2", - "debug": "^2.2.0", - "mkdirp": "0.5.x" - } - } - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "https-proxy-agent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", - "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", - "requires": { - "agent-base": "^4.1.0", - "debug": "^3.1.0" - }, - "dependencies": { - "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" - } - } - } - }, - "human-standard-collectible-abi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/human-standard-collectible-abi/-/human-standard-collectible-abi-1.0.2.tgz", - "integrity": "sha512-nD3ITUuSAIBgkaCm9J2BGwlHL8iEzFjJfTleDAC5Wi8RBJEXXhxV0JeJjd95o+rTwf98uTE5MW+VoBKOIYQh0g==" - }, - "human-standard-token-abi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/human-standard-token-abi/-/human-standard-token-abi-2.0.0.tgz", - "integrity": "sha512-m1f5DiIvqaNmpgphNqx2OziyTCj4Lvmmk28uMSxGWrOc9/lMpAKH8UcMPhvb13DMNZPzxn07WYFhxOGKuPLryg==" - }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", - "requires": { - "ms": "^2.0.0" - } - }, - "humanize-url": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/humanize-url/-/humanize-url-1.0.1.tgz", - "integrity": "sha1-9KuZ4NKIF0yk4eUEB8VfuuRk7/8=", - "dev": true, - "requires": { - "normalize-url": "^1.0.0", - "strip-url-auth": "^1.0.0" - }, - "dependencies": { - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - } - } - }, - "hyphenate-style-name": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz", - "integrity": "sha1-MRYKNpMK2vH8BMYHT360FGXU7Es=" - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, - "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", - "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "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 - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "idna-uts46": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/idna-uts46/-/idna-uts46-1.1.0.tgz", - "integrity": "sha1-vgmLK3wcq/vvh6i4D2JvrDc2auo=", - "requires": { - "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - } - } - }, - "idna-uts46-hx": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", - "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", - "requires": { - "punycode": "2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=" - } - } - }, - "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", - "dev": true - }, - "image-size": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.6.2.tgz", - "integrity": "sha512-pH3vDzpczdsKHdZ9xxR3O46unSjisgVx0IImay7Zz2EdhRVbCkj+nthx9OuuWEhakx9FAO+fNVGrF0rZ2oMOvw==", - "dev": true - }, - "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", - "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==", - "dev": true - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", - "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "in-publish": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", - "dev": true - }, - "indefinite-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indefinite-observable/-/indefinite-observable-1.0.1.tgz", - "integrity": "sha1-CZFUI8yNb36xy3iCrRNGM8mm7cM=", - "requires": { - "symbol-observable": "1.0.4" - }, - "dependencies": { - "symbol-observable": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz", - "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0=" - } - } - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "inject-css": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inject-css/-/inject-css-0.1.1.tgz", - "integrity": "sha1-7z/8eOwCbJbiNV2g3zKRfjUmQVw=" - }, - "inline-source-map": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.5.0.tgz", - "integrity": "sha1-Skxd2OT7Xps82mDIIt+tyu5m4K8=", - "requires": { - "source-map": "~0.4.0" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "inline-style-prefixer": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-3.0.8.tgz", - "integrity": "sha1-hVG45bTVcyROZqNLBPfTIHaitTQ=", - "dev": true, - "requires": { - "bowser": "^1.7.3", - "css-in-js-utils": "^2.0.0" - } - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.1.0", - "escape-string-regexp": "^1.0.5", - "supports-color": "^4.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } - } - } - }, - "insert-css": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/insert-css/-/insert-css-2.0.0.tgz", - "integrity": "sha1-610Ql7dUL0x56jBg067gfQU4gPQ=", - "dev": true - }, - "insert-module-globals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", - "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "acorn-node": "^1.5.2", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "undeclared-identifiers": "^1.1.2", - "xtend": "^4.0.0" - }, - "dependencies": { - "combine-source-map": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", - "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", - "dev": true, - "requires": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" - } - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", - "dev": true, - "requires": { - "source-map": "~0.5.3" - } - }, - "lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "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=" - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", - "dev": true - }, - "irregular-plurals": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz", - "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=", - "dev": true - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "is-alphabetical": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.1.tgz", - "integrity": "sha1-x3B5zJHU76x3W+EDS/LSQ/lebwg=", - "dev": true - }, - "is-alphanumerical": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.1.tgz", - "integrity": "sha1-37SqTRCF4zvbYcLe6cgOnGwZ9Ts=", - "dev": true, - "requires": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-boolean-object": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz", - "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "requires": { - "builtin-modules": "^1.0.0" - } - }, - "is-callable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=" - }, - "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "dev": true, - "requires": { - "ci-info": "^1.5.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" - }, - "is-decimal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.1.tgz", - "integrity": "sha1-9ftqlJlq2ejjdh+/vQkfH8qMToI=", - "dev": true - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-dom": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/is-dom/-/is-dom-1.0.9.tgz", - "integrity": "sha1-SDgy1SlyBz3hK5/j9gMghw2oNw0=" - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-fn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fn/-/is-fn-1.0.0.tgz", - "integrity": "sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw=" - }, - "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" - } - }, - "is-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", - "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" - }, - "is-hexadecimal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.1.tgz", - "integrity": "sha1-bghLvJIGH7sJcexYts5tQE4k2mk=", - "dev": true - }, - "is-in-browser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", - "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" - }, - "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "dev": true, - "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - } - }, - "is-mergeable-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-mergeable-object/-/is-mergeable-object-1.1.0.tgz", - "integrity": "sha512-JfyDDwUdtS4yHCgUpxOyKB9dnfZ0gecufxB0eytX6BmSXSE+8dbxDGt+V7CNRIRJ9sYFV/WQt2KJG6hNob2sBw==", - "dev": true - }, - "is-my-ip-valid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", - "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", - "dev": true - }, - "is-my-json-valid": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.0.tgz", - "integrity": "sha512-XTHBZSIIxNsIsZXg7XB5l8z/OBFosl1Wao4tXLpeC7eKU4Vm/kdop2azkPqULwnfGQjmeDIyey9g7afMMtdWAA==", - "dev": true, - "requires": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "is-my-ip-valid": "^1.0.0", - "jsonpointer": "^4.0.0", - "xtend": "^4.0.0" - } - }, - "is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", - "dev": true - }, - "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", - "dev": true - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-number-object": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz", - "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=", - "dev": true - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", - "dev": true - }, - "is-odd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", - "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", - "dev": true, - "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", - "dev": true, - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true - }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "requires": { - "has": "^1.0.1" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", - "dev": true - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-resolvable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.1.tgz", - "integrity": "sha512-y5CXYbzvB3jTnWAZH1Nl7ykUWb6T3BcTs56HUruwBf8MhF56n1HWqhDWnVFo8GHrUPDgvUUNVhrc2U8W7iqz5g==", - "dev": true - }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true - }, - "is-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.0.0.tgz", - "integrity": "sha512-F/pJIk8QD6OX5DNhRB7hWamLsUilmkDGho48KbgZ6xg/lmAZXHxzXQ91jzB3yRSw5kdQGGGc4yz8HYhTYIMWPg==", - "dev": true - }, - "is-ssh": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.1.tgz", - "integrity": "sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg==", - "dev": true, - "requires": { - "protocols": "^1.1.0" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-string": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz", - "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=", - "dev": true - }, - "is-subset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", - "dev": true - }, - "is-supported-regexp-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.0.tgz", - "integrity": "sha1-i1IMhfrnolM4LUsCZS4EVXbhO7g=", - "dev": true - }, - "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=" - }, - "is-type": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/is-type/-/is-type-0.0.1.tgz", - "integrity": "sha1-9lHYXDZdRJVdFKUdjXBh8/a0d5w=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, - "is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", - "dev": true, - "requires": { - "buffer-alloc": "^1.2.0" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "istanbul-lib-instrument": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-2.3.2.tgz", - "integrity": "sha512-l7TD/VnBsIB2OJvSyxaLW/ab1+92dxZNH9wLH7uHPPioy3JZ8tnx2UXUdKmdkgmP2EFPzg64CToUP6dAS3U32Q==", - "dev": true, - "requires": { - "@babel/generator": "7.0.0-beta.51", - "@babel/parser": "7.0.0-beta.51", - "@babel/template": "7.0.0-beta.51", - "@babel/traverse": "7.0.0-beta.51", - "@babel/types": "7.0.0-beta.51", - "istanbul-lib-coverage": "^2.0.1", - "semver": "^5.5.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.51.tgz", - "integrity": "sha1-vXHZsZKvl435FYKdOdQJRFZDmgw=", - "dev": true, - "requires": { - "@babel/highlight": "7.0.0-beta.51" - } - }, - "@babel/generator": { - "version": "7.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.51.tgz", - "integrity": "sha1-bHV1/952HQdIXgS67cA5LG2eMPY=", - "dev": true, - "requires": { - "@babel/types": "7.0.0-beta.51", - "jsesc": "^2.5.1", - "lodash": "^4.17.5", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - } - }, - "@babel/helper-function-name": { - "version": "7.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.51.tgz", - "integrity": "sha1-IbSHSiJ8+Z7K/MMKkDAtpaJkBWE=", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "7.0.0-beta.51", - "@babel/template": "7.0.0-beta.51", - "@babel/types": "7.0.0-beta.51" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.51.tgz", - "integrity": "sha1-MoGy0EWvlcFyzpGyCCXYXqRnZBE=", - "dev": true, - "requires": { - "@babel/types": "7.0.0-beta.51" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.51.tgz", - "integrity": "sha1-imw/ZsTSZTUvwHdIT59ugKUauXg=", - "dev": true, - "requires": { - "@babel/types": "7.0.0-beta.51" - } - }, - "@babel/highlight": { - "version": "7.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.51.tgz", - "integrity": "sha1-6IRK4loVlcz9QriWI7Q3bKBtIl0=", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^3.0.0" - } - }, - "@babel/parser": { - "version": "7.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.0.0-beta.51.tgz", - "integrity": "sha1-J87C30Cd9gr1gnDtj2qlVAnqhvY=", - "dev": true - }, - "@babel/template": { - "version": "7.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.51.tgz", - "integrity": "sha1-lgKkCuvPNXrpZ34lMu9fyBD1+/8=", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.51", - "@babel/parser": "7.0.0-beta.51", - "@babel/types": "7.0.0-beta.51", - "lodash": "^4.17.5" - } - }, - "@babel/traverse": { - "version": "7.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.51.tgz", - "integrity": "sha1-mB2vLOw0emIx06odnhgDsDqqpKg=", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.51", - "@babel/generator": "7.0.0-beta.51", - "@babel/helper-function-name": "7.0.0-beta.51", - "@babel/helper-split-export-declaration": "7.0.0-beta.51", - "@babel/parser": "7.0.0-beta.51", - "@babel/types": "7.0.0-beta.51", - "debug": "^3.1.0", - "globals": "^11.1.0", - "invariant": "^2.2.0", - "lodash": "^4.17.5" - } - }, - "@babel/types": { - "version": "7.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.51.tgz", - "integrity": "sha1-2AK3tUO1g2x3iqaReXq/APPZfqk=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.5", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "istextorbinary": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-1.0.2.tgz", - "integrity": "sha1-rOGTVNGpoBc+/rEITOD4ewrX3s8=", - "dev": true, - "requires": { - "binaryextensions": "~1.0.0", - "textextensions": "~1.0.0" - } - }, - "jazzicon": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/jazzicon/-/jazzicon-1.5.0.tgz", - "integrity": "sha1-1/NrUWAj2znubqwRf0BU6Te2Xpk=", - "requires": { - "color": "^0.11.1", - "mersenne-twister": "^1.0.1", - "raphael": "^2.2.0" - } - }, - "jed": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/jed/-/jed-1.1.1.tgz", - "integrity": "sha1-elSbvZ/+FYWwzQoZHiAwVb7ldLQ=", - "dev": true - }, - "js-base64": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", - "integrity": "sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw==", - "dev": true - }, - "js-beautify": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.5.10.tgz", - "integrity": "sha1-TZU3FwJpk0SlFsomv1nwonu3Vxk=", - "dev": true, - "requires": { - "config-chain": "~1.1.5", - "mkdirp": "~0.5.0", - "nopt": "~3.0.1" - } - }, - "js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", - "dev": true - }, - "js-reporters": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/js-reporters/-/js-reporters-1.2.0.tgz", - "integrity": "sha1-fPLLaYGWaEeQNQ0MTKB/Su2ewX4=", - "dev": true - }, - "js-sha3": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.3.1.tgz", - "integrity": "sha1-hhIoAhQvCChQKg0d7h2V4lO7AkM=" - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "js2xmlparser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.0.tgz", - "integrity": "sha512-WuNgdZOXVmBk5kUPMcTcVUpbGRzLfNkv7+7APq7WiDihpXVKrgxo6wwRpRl9OQeEBgKCVk9mR7RbzrnNWC8oBw==", - "dev": true, - "requires": { - "xmlcreate": "^2.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true - }, - "jsdoc": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.2.tgz", - "integrity": "sha512-S2vzg99C5+gb7FWlrK4TVdyzVPGGkdvpDkCEJH1JABi2PKzPeLu5/zZffcJUifgWUJqXWl41Hoc+MmuM2GukIg==", - "dev": true, - "requires": { - "@babel/parser": "^7.4.4", - "bluebird": "^3.5.4", - "catharsis": "^0.8.10", - "escape-string-regexp": "^2.0.0", - "js2xmlparser": "^4.0.0", - "klaw": "^3.0.0", - "markdown-it": "^8.4.2", - "markdown-it-anchor": "^5.0.2", - "marked": "^0.6.2", - "mkdirp": "^0.5.1", - "requizzle": "^0.2.2", - "strip-json-comments": "^3.0.1", - "taffydb": "2.6.2", - "underscore": "~1.9.1" - }, - "dependencies": { - "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", - "dev": true - }, - "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", - "dev": true - }, - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - }, - "klaw": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", - "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.9" - } - }, - "marked": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.6.2.tgz", - "integrity": "sha512-LqxwVH3P/rqKX4EKGz7+c2G9r98WeM/SW34ybhgNGhUQNKtf1GmmSkJ6cDGJ/t6tiyae49qRkpyTw2B9HOrgUA==", - "dev": true - }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true - }, - "underscore": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", - "dev": true - } - } - }, - "jsdom": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.5.1.tgz", - "integrity": "sha512-89ztIZ03aYK9f1uUrLXLsZndRge/JnZjzjpaN+lrse3coqz+8PR/dX4WLHpbF5fIKTXhDjFODOJw2328lPJ90g==", - "dev": true, - "requires": { - "abab": "^1.0.3", - "acorn": "^5.1.2", - "acorn-globals": "^4.0.0", - "array-equal": "^1.0.0", - "browser-process-hrtime": "^0.1.2", - "content-type-parser": "^1.0.1", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": ">= 0.2.37 < 0.3.0", - "domexception": "^1.0.0", - "escodegen": "^1.9.0", - "html-encoding-sniffer": "^1.0.1", - "left-pad": "^1.2.0", - "nwmatcher": "^1.4.3", - "parse5": "^3.0.2", - "pn": "^1.0.0", - "request": "^2.83.0", - "request-promise-native": "^1.0.3", - "sax": "^1.2.1", - "symbol-tree": "^3.2.1", - "tough-cookie": "^2.3.3", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.1", - "whatwg-url": "^6.3.0", - "xml-name-validator": "^2.0.1" - }, - "dependencies": { - "acorn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", - "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==", - "dev": true - }, - "escodegen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz", - "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==", - "dev": true, - "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.5.6" - } - }, - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true - } - } - }, - "jsdom-global": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsdom-global/-/jsdom-global-3.0.2.tgz", - "integrity": "sha1-a9KZwTsMRiay2iwDk81DhdYGrLk=", - "dev": true - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" - }, - "jshint": { - "version": "2.9.6", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.6.tgz", - "integrity": "sha512-KO9SIAKTlJQOM4lE64GQUtGBRpTOuvbrRrSZw3AhUxMNG266nX9hK2cKA4SBhXOj0irJGyNyGSLT62HGOVDEOA==", - "dev": true, - "requires": { - "cli": "~1.0.0", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "~4.17.10", - "minimatch": "~3.0.2", - "phantom": "~4.0.1", - "phantomjs-prebuilt": "~2.1.7", - "shelljs": "0.3.x", - "strip-json-comments": "1.0.x", - "unicode-5.2.0": "^0.7.5" - }, - "dependencies": { - "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", - "dev": true - }, - "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "dev": true, - "requires": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "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=", - "dev": true - }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "dev": true - } - } - }, - "json-merge-patch": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-merge-patch/-/json-merge-patch-0.2.3.tgz", - "integrity": "sha1-+ixrWvh9p3uuKWalidUuI+2B/kA=", - "dev": true, - "requires": { - "deep-equal": "^1.0.0" - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-rpc-engine": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-4.0.0.tgz", - "integrity": "sha512-SvOcy0SFqdMyWH/8muc8G88CvrlzQW4XC0/HA+ukc1nFlj4im3rcwGjivhznBMa5xiEK4EzO404Qi1cB0svU0g==", - "requires": { - "async": "^2.0.1", - "babel-preset-env": "^1.7.0", - "babelify": "^7.3.0", - "json-rpc-error": "^2.0.0", - "promise-to-callback": "^1.0.0", - "safe-event-emitter": "^1.0.1" - }, - "dependencies": { - "babelify": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } - } - } - }, - "json-rpc-error": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/json-rpc-error/-/json-rpc-error-2.0.0.tgz", - "integrity": "sha1-p6+cICg4tekFxyUOVH8a/3cligI=", - "requires": { - "inherits": "^2.0.1" - } - }, - "json-rpc-middleware-stream": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json-rpc-middleware-stream/-/json-rpc-middleware-stream-2.1.1.tgz", - "integrity": "sha512-WZheufPN+/RKkjXQP3lK5tFYblqG0n+oYv5qpammwwY2vsJRB7mM4Txhr4ajzvYEZi1UkENnplrmaYiqaqafaA==", - "requires": { - "readable-stream": "^2.3.3", - "safe-event-emitter": "^1.0.1" - } - }, - "json-rpc-random-id": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz", - "integrity": "sha1-uknZat7RRE27jaPSA3SKy7zeyMg=" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" - }, - "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" - } - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json2mq": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", - "integrity": "sha1-tje9O6nqvhIsg+lyBIOusQ0skEo=", - "requires": { - "string-convert": "^0.2.0" - } - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, - "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" - } - }, - "jsonfilter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/jsonfilter/-/jsonfilter-1.1.2.tgz", - "integrity": "sha1-Ie987cdRk4E8dZMulqmL4gW6WhE=", - "dev": true, - "requires": { - "JSONStream": "^0.8.4", - "minimist": "^1.1.0", - "stream-combiner": "^0.2.1", - "through2": "^0.6.3" - }, - "dependencies": { - "JSONStream": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", - "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=", - "dev": true, - "requires": { - "jsonparse": "0.0.5", - "through": ">=2.2.7 <3" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "jsonparse": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", - "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", - "dev": true, - "requires": { - "duplexer": "~0.1.1", - "through": "~2.3.4" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" - }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, - "jsonschema": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz", - "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==" - }, - "jsprim": { - "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" - } - }, - "jss": { - "version": "9.8.1", - "resolved": "https://registry.npmjs.org/jss/-/jss-9.8.1.tgz", - "integrity": "sha512-a9dXInEPTRmdSmzw3LNhbAwdQVZgCRmFU7dFzrpLTMAcdolHXNamhxQ6J+PNIqUtWa9yRbZIzWX6aUlI55LZ/A==", - "requires": { - "is-in-browser": "^1.1.3", - "symbol-observable": "^1.1.0", - "warning": "^3.0.0" - } - }, - "jss-camel-case": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jss-camel-case/-/jss-camel-case-6.1.0.tgz", - "integrity": "sha512-HPF2Q7wmNW1t79mCqSeU2vdd/vFFGpkazwvfHMOhPlMgXrJDzdj9viA2SaHk9ZbD5pfL63a8ylp4++irYbbzMQ==", - "requires": { - "hyphenate-style-name": "^1.0.2" - } - }, - "jss-compose": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/jss-compose/-/jss-compose-5.0.0.tgz", - "integrity": "sha512-YofRYuiA0+VbeOw0VjgkyO380sA4+TWDrW52nSluD9n+1FWOlDzNbgpZ/Sb3Y46+DcAbOS21W5jo6SAqUEiuwA==", - "requires": { - "warning": "^3.0.0" - } - }, - "jss-default-unit": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/jss-default-unit/-/jss-default-unit-8.0.2.tgz", - "integrity": "sha512-WxNHrF/18CdoAGw2H0FqOEvJdREXVXLazn7PQYU7V6/BWkCV0GkmWsppNiExdw8dP4TU1ma1dT9zBNJ95feLmg==" - }, - "jss-expand": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/jss-expand/-/jss-expand-5.3.0.tgz", - "integrity": "sha512-NiM4TbDVE0ykXSAw6dfFmB1LIqXP/jdd0ZMnlvlGgEMkMt+weJIl8Ynq1DsuBY9WwkNyzWktdqcEW2VN0RAtQg==" - }, - "jss-extend": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jss-extend/-/jss-extend-6.2.0.tgz", - "integrity": "sha512-YszrmcB6o9HOsKPszK7NeDBNNjVyiW864jfoiHoMlgMIg2qlxKw70axZHqgczXHDcoyi/0/ikP1XaHDPRvYtEA==", - "requires": { - "warning": "^3.0.0" - } - }, - "jss-global": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jss-global/-/jss-global-3.0.0.tgz", - "integrity": "sha512-wxYn7vL+TImyQYGAfdplg7yaxnPQ9RaXY/cIA8hawaVnmmWxDHzBK32u1y+RAvWboa3lW83ya3nVZ/C+jyjZ5Q==" - }, - "jss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jss-nested/-/jss-nested-6.0.1.tgz", - "integrity": "sha512-rn964TralHOZxoyEgeq3hXY8hyuCElnvQoVrQwKHVmu55VRDd6IqExAx9be5HgK0yN/+hQdgAXQl/GUrBbbSTA==", - "requires": { - "warning": "^3.0.0" - } - }, - "jss-preset-default": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/jss-preset-default/-/jss-preset-default-4.5.0.tgz", - "integrity": "sha512-qZbpRVtHT7hBPpZEBPFfafZKWmq3tA/An5RNqywDsZQGrlinIF/mGD9lmj6jGqu8GrED2SMHZ3pPKLmjCZoiaQ==", - "requires": { - "jss-camel-case": "^6.1.0", - "jss-compose": "^5.0.0", - "jss-default-unit": "^8.0.2", - "jss-expand": "^5.3.0", - "jss-extend": "^6.2.0", - "jss-global": "^3.0.0", - "jss-nested": "^6.0.1", - "jss-props-sort": "^6.0.0", - "jss-template": "^1.0.1", - "jss-vendor-prefixer": "^7.0.0" - } - }, - "jss-props-sort": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/jss-props-sort/-/jss-props-sort-6.0.0.tgz", - "integrity": "sha512-E89UDcrphmI0LzmvYk25Hp4aE5ZBsXqMWlkFXS0EtPkunJkRr+WXdCNYbXbksIPnKlBenGB9OxzQY+mVc70S+g==" - }, - "jss-template": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/jss-template/-/jss-template-1.0.1.tgz", - "integrity": "sha512-m5BqEWha17fmIVXm1z8xbJhY6GFJxNB9H68GVnCWPyGYfxiAgY9WTQyvDAVj+pYRgrXSOfN5V1T4+SzN1sJTeg==", - "requires": { - "warning": "^3.0.0" - } - }, - "jss-vendor-prefixer": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/jss-vendor-prefixer/-/jss-vendor-prefixer-7.0.0.tgz", - "integrity": "sha512-Agd+FKmvsI0HLcYXkvy8GYOw3AAASBUpsmIRvVQheps+JWaN892uFOInTr0DRydwaD91vSSUCU4NssschvF7MA==", - "requires": { - "css-vendor": "^0.3.8" - } - }, - "jstransform": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/jstransform/-/jstransform-10.1.0.tgz", - "integrity": "sha1-tMSb9j8WLBCLA0g5moc3xxOwqDo=", - "requires": { - "base62": "0.1.1", - "esprima-fb": "13001.1001.0-dev-harmony-fb", - "source-map": "0.1.31" - }, - "dependencies": { - "esprima-fb": { - "version": "13001.1001.0-dev-harmony-fb", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-13001.1001.0-dev-harmony-fb.tgz", - "integrity": "sha1-YzrNtA2b1NuKHB1owGqUKVn60rA=" - }, - "source-map": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.31.tgz", - "integrity": "sha1-n3BNDWnZ4TioG63267T94z0VHGE=", - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "jsx-ast-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", - "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", - "dev": true, - "requires": { - "array-includes": "^3.0.3" - } - }, - "jszip": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", - "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", - "dev": true, - "requires": { - "core-js": "~2.3.0", - "es6-promise": "~3.0.2", - "lie": "~3.1.0", - "pako": "~1.0.2", - "readable-stream": "~2.0.6" - }, - "dependencies": { - "core-js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", - "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", - "dev": true - }, - "es6-promise": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", - "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", - "dev": true - }, - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "just-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", - "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", - "dev": true - }, - "just-extend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", - "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", - "dev": true - }, - "karma": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/karma/-/karma-4.1.0.tgz", - "integrity": "sha512-xckiDqyNi512U4dXGOOSyLKPwek6X/vUizSy2f3geYevbLj+UIdvNwbn7IwfUIL2g1GXEPWt/87qFD1fBbl/Uw==", - "dev": true, - "requires": { - "bluebird": "^3.3.0", - "body-parser": "^1.16.1", - "braces": "^2.3.2", - "chokidar": "^2.0.3", - "colors": "^1.1.0", - "connect": "^3.6.0", - "core-js": "^2.2.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.0", - "flatted": "^2.0.0", - "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "http-proxy": "^1.13.0", - "isbinaryfile": "^3.0.0", - "lodash": "^4.17.11", - "log4js": "^4.0.0", - "mime": "^2.3.1", - "minimatch": "^3.0.2", - "optimist": "^0.6.1", - "qjobs": "^1.1.4", - "range-parser": "^1.2.0", - "rimraf": "^2.6.0", - "safe-buffer": "^5.0.1", - "socket.io": "2.1.1", - "source-map": "^0.6.1", - "tmp": "0.0.33", - "useragent": "2.3.0" - }, - "dependencies": { - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - } - }, - "colors": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "mime": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.3.tgz", - "integrity": "sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw==", - "dev": true - }, - "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 - } - } - }, - "karma-chrome-launcher": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", - "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", - "dev": true, - "requires": { - "fs-access": "^1.0.0", - "which": "^1.2.1" - } - }, - "karma-cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-1.0.1.tgz", - "integrity": "sha1-rmw8WKMTodALRRZMRVubhs4X+WA=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "karma-firefox-launcher": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-1.1.0.tgz", - "integrity": "sha512-LbZ5/XlIXLeQ3cqnCbYLn+rOVhuMIK9aZwlP6eOLGzWdo1UVp7t6CN3DP4SafiRLjexKwHeKHDm0c38Mtd3VxA==", - "dev": true - }, - "karma-qunit": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/karma-qunit/-/karma-qunit-1.2.1.tgz", - "integrity": "sha1-iCUq/SEnvAOwzDGXjtaIKxOfRwo=", - "dev": true - }, - "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" - } - }, - "keccakjs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.1.tgz", - "integrity": "sha1-HWM6+QfvMFu/ny+mFtVsRFYd+k0=", - "requires": { - "browserify-sha3": "^0.0.1", - "sha3": "^1.1.0" - } - }, - "kew": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", - "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", - "dev": true - }, - "keycode": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", - "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ=" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "requires": { - "graceful-fs": "^4.1.9" - } - }, - "known-css-properties": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.2.0.tgz", - "integrity": "sha512-UTCzU28rRI9wkb8qSGoZa9pgWvxr4LjP2MEhi9XHb/1XMOJy0uTnIxaxzj8My/PORG+kQG6VzAcGvRw66eIOfA==", - "dev": true - }, - "labeled-stream-splicer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz", - "integrity": "sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "isarray": "^2.0.4", - "stream-splicer": "^2.0.0" - }, - "dependencies": { - "isarray": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz", - "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==", - "dev": true - }, - "stream-splicer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", - "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - } - } - }, - "last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", - "dev": true, - "requires": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - } - }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "dev": true, - "requires": { - "package-json": "^4.0.0" - } - }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", - "dev": true - }, - "lazy-universal-dotenv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-2.0.0.tgz", - "integrity": "sha512-1Wi0zgZMfRLaRAK21g3odYuU+HE1d85Loe2tb44YhcNwIzhmD49mTPR9aKckpB9Q9Q9mA+hUMLI2xlkcCAe3yw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.0.0", - "app-root-dir": "^1.0.2", - "core-js": "^2.5.7", - "dotenv": "^6.0.0", - "dotenv-expand": "^4.2.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", - "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", - "dev": true - } - } - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "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" - } - }, - "lcov-parse": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", - "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", - "dev": true - }, - "ldjson-stream": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ldjson-stream/-/ldjson-stream-1.2.1.tgz", - "integrity": "sha1-kb7O2lrE7SsX5kn7d356v6AYnCs=", - "dev": true, - "requires": { - "split2": "^0.2.1", - "through2": "^0.6.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "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=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", - "dev": true, - "requires": { - "flush-write-stream": "^1.0.2" - } - }, - "left-pad": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.2.0.tgz", - "integrity": "sha1-0wpzxrggHY99jnlWupYWCHpo4O4=", - "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": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "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": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "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" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", - "dev": true, - "requires": { - "immediate": "~3.0.5" - }, - "dependencies": { - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", - "dev": true - } - } - }, - "lil-uuid": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/lil-uuid/-/lil-uuid-0.1.1.tgz", - "integrity": "sha1-+e3PI/AOQr9D8PhD2Y2LU/M0HxY=" - }, - "linkify-it": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.1.0.tgz", - "integrity": "sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg==", - "dev": true, - "requires": { - "uc.micro": "^1.0.1" - } - }, - "livereload-js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", - "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", - "dev": true - }, - "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" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "locale-currency": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/locale-currency/-/locale-currency-0.0.1.tgz", - "integrity": "sha1-yeFaIv9XW0tLuUekv5KsI2vR/ps=" - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" - }, - "lodash-es": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.4.tgz", - "integrity": "sha1-3MHXVS4VCgZABzupyzHXDwMpUOc=" - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._baseflatten": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/lodash._baseflatten/-/lodash._baseflatten-3.1.4.tgz", - "integrity": "sha1-B3D/gBMa9uNPO1EXlqe6UhTmX/c=", - "dev": true, - "requires": { - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", - "dev": true - }, - "lodash._createassigner": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", - "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", - "dev": true, - "requires": { - "lodash._bindcallback": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash.restparam": "^3.0.0" - } - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" - }, - "lodash.assignin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=", - "dev": true - }, - "lodash.castarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", - "integrity": "sha1-wCUTUV4wna3dTCTGDP3c9ZdtkRU=", - "dev": true - }, - "lodash.clone": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", - "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", - "dev": true - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true, - "requires": { - "lodash._root": "^3.0.0" - } - }, - "lodash.find": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz", - "integrity": "sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E=", - "dev": true - }, - "lodash.flatmap": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.flatmap/-/lodash.flatmap-4.5.0.tgz", - "integrity": "sha1-74y/QI9uSCaGYzRTBcaswLd4cC4=" - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "dev": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "lodash.set": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", - "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", - "dev": true - }, - "lodash.shuffle": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.shuffle/-/lodash.shuffle-4.2.0.tgz", - "integrity": "sha1-FFtQU8+HX29cKjP0i26ZSMbse0s=" - }, - "lodash.some": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", - "dev": true - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, - "lodash.tail": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", - "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", - "dev": true - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" - } - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" - } - }, - "lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=", - "dev": true - }, - "lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", - "dev": true - }, - "log-driver": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", - "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", - "dev": true - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, - "requires": { - "chalk": "^1.0.0" - } - }, - "log4js": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.3.1.tgz", - "integrity": "sha512-nPGS7w7kBnzNm1j8JycFxwLCbIMae8tHCo0cCdx/khB20Tcod8SZThYEB9E0c27ObcTGA1mlPowaf3hantQ/FA==", - "dev": true, - "requires": { - "date-format": "^2.0.0", - "debug": "^4.1.1", - "flatted": "^2.0.0", - "rfdc": "^1.1.2", - "streamroller": "^1.0.5" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "loglevel": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.0.tgz", - "integrity": "sha1-rgyqVhERSYxboTcj1vtjHSQAOTQ=" - }, - "lolex": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.3.2.tgz", - "integrity": "sha512-A5pN2tkFj7H0dGIAM6MFvHKMJcPnjZsOMvR7ujCjfgW5TbV6H9vb1PgxLtHvjqNZTHsUolz+6/WEO0N1xNx2ng==", - "dev": true - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "requires": { - "js-tokens": "^3.0.0" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "lowlight": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.9.2.tgz", - "integrity": "sha512-Ek18ElVCf/wF/jEm1b92gTnigh94CtBNWiZ2ad+vTgW7cTmQxUY3I98BjHK68gZAJEWmybGBZgx9qv3QxLQB/Q==", - "dev": true, - "requires": { - "fault": "^1.0.2", - "highlight.js": "~9.12.0" - } - }, - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", - "dev": true, - "requires": { - "es5-ext": "~0.10.2" - } - }, - "ltgt": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.0.tgz", - "integrity": "sha1-tlul/LNJopkkyOMz98alVi8uSEI=" - }, - "luxon": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.8.2.tgz", - "integrity": "sha512-TPShotrkafGXEksxvEagZ1peYb9gE3ADppq8IPWG6wqYS/4k9ucRUXipBHy/PrMIfUPxy/llfsQXRvQmOXmVcA==" - }, - "macos-release": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.2.0.tgz", - "integrity": "sha512-iV2IDxZaX8dIcM7fG6cI46uNmHUxHE4yN+Z8tKHAW1TBPMZDIKHf/3L+YnOuj/FK9il14UaVdHmiQ1tsi90ltA==", - "dev": true - }, - "magic-string": { - "version": "0.22.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", - "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", - "dev": true, - "requires": { - "vlq": "^0.2.2" - } - }, - "make-dir": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", - "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "make-error": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", - "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", - "dev": true - }, - "make-error-cause": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-1.2.2.tgz", - "integrity": "sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0=", - "dev": true, - "requires": { - "make-error": "^1.2.0" - } - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-async": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/map-async/-/map-async-0.1.1.tgz", - "integrity": "sha1-yJfARJ+Fhkx0taPxlu20IVZDF0U=" - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "map-or-similar": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", - "integrity": "sha1-beJlMXSt+12e3DPGnT6Sobdvrwg=", - "dev": true - }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "markdown-it": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", - "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "entities": "~1.1.1", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - } - }, - "markdown-it-anchor": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.2.4.tgz", - "integrity": "sha512-n8zCGjxA3T+Mx1pG8HEgbJbkB8JFUuRkeTZQuIM8iPY6oQ8sWOPRZJDFC9a/pNg2QkHEjjGkhBEl/RSyzaDZ3A==", - "dev": true - }, - "markdown-to-jsx": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-6.10.2.tgz", - "integrity": "sha512-eDCsRobOkbQ4PqCphrxNi/U8geA8DGf52dMP4BrrYsVFyQ2ILFnXIB5sRcIxnRK2nPl8k5hUYdRNRXLlQNYLYg==", - "dev": true, - "requires": { - "prop-types": "^15.6.2", - "unquote": "^1.1.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", - "dev": true - } - } - }, - "marked": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.6.2.tgz", - "integrity": "sha512-LqxwVH3P/rqKX4EKGz7+c2G9r98WeM/SW34ybhgNGhUQNKtf1GmmSkJ6cDGJ/t6tiyae49qRkpyTw2B9HOrgUA==", - "dev": true - }, - "marksy": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/marksy/-/marksy-7.0.1.tgz", - "integrity": "sha512-tB4cQxIY7f8PWTcIouJO/V60rl9JVVOmCDjmukYVO7mdpGM1JWl4qIP98iDYItexSXZ0DkEqk6yXFxgdmZRMxA==", - "dev": true, - "requires": { - "babel-standalone": "^6.26.0", - "he": "^1.1.1", - "marked": "^0.6.2" - } - }, - "matchdep": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", - "dev": true, - "requires": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", - "stack-trace": "0.0.10" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "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" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - } - } - } - } - }, - "matcher-collection": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/matcher-collection/-/matcher-collection-1.0.5.tgz", - "integrity": "sha512-nUCmzKipcJEwYsBVAFh5P+d7JBuhJaW1xs85Hara9xuMLqtCVUrW6DSC0JVIkluxEH2W45nPBM/wjHtBXa/tYA==", - "dev": true, - "requires": { - "minimatch": "^3.0.2" - } - }, - "material-colors": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.5.tgz", - "integrity": "sha1-UpJZPmdUyxvMK5gDDk4Najr8nqE=", - "dev": true - }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", - "dev": true - }, - "mathml-tag-names": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.0.1.tgz", - "integrity": "sha1-jUEmgWi/htEQK5gQnijlMeejRXg=", - "dev": true - }, - "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - }, - "dependencies": { - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - } - } - }, - "mdn-browser-compat-data": { - "version": "0.0.82", - "resolved": "https://registry.npmjs.org/mdn-browser-compat-data/-/mdn-browser-compat-data-0.0.82.tgz", - "integrity": "sha512-RmC87C45AgXLuNlkrGLCK2wh0zRwpFnnro5jsNxmS90xLCxfKmTLPtqM9cocKFD7Ro9pWmtvkIkRiesGakd1Ig==", - "dev": true, - "requires": { - "extend": "3.0.2" - }, - "dependencies": { - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - } - } - }, - "mdn-data": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", - "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==", - "dev": true - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "^1.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" - } - } - } - }, - "memoizee": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.11.tgz", - "integrity": "sha1-vemBdmPJ5A/bKk6hw2cpYIeujI8=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.30", - "es6-weak-map": "^2.0.2", - "event-emitter": "^0.3.5", - "is-promise": "^2.1", - "lru-queue": "0.1", - "next-tick": "1", - "timers-ext": "^0.1.2" - } - }, - "memoizerific": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", - "integrity": "sha1-fIekZGREwy11Q4VwkF8tvRsagFo=", - "dev": true, - "requires": { - "map-or-similar": "^1.5.0" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=" - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, - "merge-deep": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", - "integrity": "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "clone-deep": "^0.2.4", - "kind-of": "^3.0.2" - }, - "dependencies": { - "clone-deep": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", - "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", - "dev": true, - "requires": { - "for-own": "^0.1.3", - "is-plain-object": "^2.0.1", - "kind-of": "^3.0.2", - "lazy-cache": "^1.0.3", - "shallow-clone": "^0.1.2" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "shallow-clone": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", - "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", - "dev": true, - "requires": { - "is-extendable": "^0.1.1", - "kind-of": "^2.0.1", - "lazy-cache": "^0.2.3", - "mixin-object": "^2.0.1" - }, - "dependencies": { - "kind-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", - "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", - "dev": true, - "requires": { - "is-buffer": "^1.0.2" - } - }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", - "dev": true - } - } - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-source-map": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", - "integrity": "sha1-pd5GU42uhNQRTMXqArR3KmNGcB8=", - "dev": true, - "requires": { - "source-map": "^0.5.6" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "merge2": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", - "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", - "dev": true - }, - "merkle-patricia-tree": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.0.tgz", - "integrity": "sha512-LKd2OoIT9Re/OG38zXbd5pyHIk2IfcOUczCwkYXl5iJIbufg9nqpweh66VfPwMkUlrEvc7YVvtQdmSrB9V9TkQ==", - "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" - } - } - } - }, - "mersenne-twister": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mersenne-twister/-/mersenne-twister-1.1.0.tgz", - "integrity": "sha1-+RZhjuQ9cXnvz2Qb7EUx65Zwl4o=" - }, - "metamask-inpage-provider": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/metamask-inpage-provider/-/metamask-inpage-provider-1.3.0.tgz", - "integrity": "sha512-3pi6YTFgrhPFLTq03yf/vOMzoc9wOqbPkOx2ske4RBgs9oXN6fndv9eGM+vkq4ZxrwkapRG1YXiA+OA50UYIhg==", - "requires": { - "json-rpc-engine": "^3.7.4", - "json-rpc-middleware-stream": "^2.0.0", - "loglevel": "^1.6.1", - "obj-multiplex": "^1.0.0", - "obs-store": "^3.0.0", - "pump": "^3.0.0", - "safe-event-emitter": "^1.0.1" - }, - "dependencies": { - "babelify": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } - }, - "json-rpc-engine": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz", - "integrity": "sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==", - "requires": { - "async": "^2.0.1", - "babel-preset-env": "^1.7.0", - "babelify": "^7.3.0", - "json-rpc-error": "^2.0.0", - "promise-to-callback": "^1.0.0", - "safe-event-emitter": "^1.0.1" - } - }, - "loglevel": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", - "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=" - } - } - }, - "metamask-logo": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/metamask-logo/-/metamask-logo-2.1.4.tgz", - "integrity": "sha512-hg/FzMfijpzGgLdZWH+KJKS56cRYaMEwcOq8UcnL/MznpgK4OMlJEaIfO8lg7P2F4Z74Ki+ulrTrFW6jf9L2bw==", - "requires": { - "gl-mat4": "1.1.4", - "gl-vec3": "1.0.3" - } - }, - "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": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" - }, - "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" - }, - "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", - "requires": { - "mime-db": "~1.30.0" - } - }, - "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", - "dev": true - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "requires": { - "dom-walk": "^0.1.0" - } - }, - "mini-css-extract-plugin": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.7.0.tgz", - "integrity": "sha512-RQIw6+7utTYn8DBGsf/LpRgZCJMpZt+kuawJ/fju0KiOL6nAaTBNmCJwS7HtwSCXfS47gCkmtBFS7HdsquhdxQ==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - }, - "dependencies": { - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - } - } - }, - "minimalistic-assert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "minipass": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true - } - } - }, - "minizlib": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", - "dev": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mixin-object": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", - "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", - "dev": true, - "requires": { - "for-in": "^0.1.3", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-in": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", - "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", - "dev": true - } - } - }, - "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=" - } - } - }, - "mocha": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.0.tgz", - "integrity": "sha512-ukB2dF+u4aeJjc6IGtPNnJXfeby5d4ZqySlIBT0OEyva/DrMjVm5HkQxKnHDLKEfEQBsEnwTg9HHhtPHJdTd8w==", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.3.1", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } - } - } - }, - "mocha-eslint": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mocha-eslint/-/mocha-eslint-4.1.0.tgz", - "integrity": "sha512-y+TIaoozAiuksnsr/7GVw7F2nAqotrZ06SHIw8wMR6PVWipXre5Hz59bsqLX1n2Lqu2YDebUX1A4qF/rtmWsYQ==", - "dev": true, - "requires": { - "chalk": "^1.1.0", - "eslint": "^4.2.0", - "glob-all": "^3.0.1", - "replaceall": "^0.1.6" - } - }, - "mocha-jsdom": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mocha-jsdom/-/mocha-jsdom-1.1.0.tgz", - "integrity": "sha1-4VdvvQYBzInTWKIToOVYXRt8egE=", - "dev": true - }, - "mocha-sinon": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mocha-sinon/-/mocha-sinon-2.0.0.tgz", - "integrity": "sha1-cjqTEOfXN9e3fHpmghI3QlsDLUg=", - "dev": true - }, - "module-deps": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.0.tgz", - "integrity": "sha512-hKPmO06so6bL/ZvqVNVqdTVO8UAYsi3tQWlCa+z9KuWhoN4KDQtb5hcqQQv58qYiDE21wIvnttZEPiDgEbpwbA==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "browser-resolve": "^1.7.0", - "cached-path-relative": "^1.0.0", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.0.2", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "detective": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.1.0.tgz", - "integrity": "sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ==", - "dev": true, - "requires": { - "acorn-node": "^1.3.0", - "defined": "^1.0.0", - "minimist": "^1.1.1" - } - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - } - } - }, - "module-not-found-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", - "integrity": "sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA=", - "dev": true - }, - "moment": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.1.tgz", - "integrity": "sha512-shJkRTSebXvsVqk56I+lkb2latjBs8I+pc2TzWc545y2iFnSjm7Wg0QMh+ZWcdSLQyGEau5jI8ocnmkyTgr9YQ==", - "dev": true - }, - "moo": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.4.3.tgz", - "integrity": "sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw==", - "dev": true - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multibase": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.0.tgz", - "integrity": "sha512-R9bNLQhbD7MsitPm1NeY7w9sDgu6d7cuj25snAWH7k5PSNPSwIQQBpcpj8jx1W96dLbdigZqmUWOdQRMnAmgjA==", - "requires": { - "base-x": "3.0.4" - }, - "dependencies": { - "base-x": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.4.tgz", - "integrity": "sha512-UYOadoSIkEI/VrRGSG6qp93rp2WdokiAiNYDfGW5qURAY8GiAQkvMbwNNSDYiVJopqv4gCna7xqf4rrNGp+5AA==", - "requires": { - "safe-buffer": "^5.0.1" - } - } - } - }, - "multicodec": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.0.tgz", - "integrity": "sha512-lKsJeT4cKeSq0rVEWhO3oSBgDN4sMY1sNZKlvl68g/ZAahjPS1KIVyF4IqhuYmCdtOyKs4Q4hQ6M0C3iqRnuqQ==", - "requires": { - "varint": "^5.0.0" - }, - "dependencies": { - "varint": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.0.tgz", - "integrity": "sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8=" - } - } - }, - "multihashes": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.13.tgz", - "integrity": "sha512-HwJGEKPCpLlNlgGQA56CYh/Wsqa+c4JAq8+mheIgw7OK5T4QvNJqgp6TH8gZ4q4l1aiWeNat/H/MrFXmTuoFfQ==", - "requires": { - "bs58": "^4.0.1", - "varint": "^5.0.0" - }, - "dependencies": { - "base-x": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.4.tgz", - "integrity": "sha512-UYOadoSIkEI/VrRGSG6qp93rp2WdokiAiNYDfGW5qURAY8GiAQkvMbwNNSDYiVJopqv4gCna7xqf4rrNGp+5AA==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "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" - } - }, - "varint": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.0.tgz", - "integrity": "sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8=" - } - } - }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "minimatch": "^3.0.0" - } - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true, - "requires": { - "duplexer2": "0.0.2" - } - }, - "mustache": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-3.0.1.tgz", - "integrity": "sha512-jFI/4UVRsRYdUbuDTKT7KzfOp7FiD5WzYmmwNwXyUVypC0xjoTL78Fqc0jHUPIvvGD+6DQSPHIt1NE7D1ArsqA==", - "dev": true - }, - "mute-stdout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", - "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - }, - "dependencies": { - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true - } - } - }, - "nan": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", - "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=" - }, - "nanomatch": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", - "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-odd": "^2.0.0", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha1-F7CVgZiJef3a/gIB6TG6kzyWy7Q=", - "dev": true - }, - "nconf": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.10.0.tgz", - "integrity": "sha512-fKiXMQrpP7CYWJQzKkPPx9hPgmq+YLDyxcG9N8RpiE9FoCkCbzD0NyW0YhE3xn3Aupe7nnDeIx4PFzYehpHT9Q==", - "dev": true, - "requires": { - "async": "^1.4.0", - "ini": "^1.3.0", - "secure-keys": "^1.0.0", - "yargs": "^3.19.0" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", - "dev": true - }, - "yargs": { - "version": "3.32.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", - "dev": true, - "requires": { - "camelcase": "^2.0.1", - "cliui": "^3.0.3", - "decamelize": "^1.1.1", - "os-locale": "^1.4.0", - "string-width": "^1.0.1", - "window-size": "^0.1.4", - "y18n": "^3.2.0" - } - } - } - }, - "nearley": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.15.1.tgz", - "integrity": "sha512-8IUY/rUrKz2mIynUGh8k+tul1awMKEjeHHC5G3FHvvyAW6oq4mQfNp2c0BMea+sYZJvYcrrM6GmZVIle/GRXGw==", - "dev": true, - "requires": { - "moo": "^0.4.3", - "nomnom": "~1.6.2", - "railroad-diagrams": "^1.0.0", - "randexp": "0.4.6", - "semver": "^5.4.1" - } - }, - "needle": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", - "dev": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true - }, - "neo-async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.0.tgz", - "integrity": "sha512-nJmSswG4As/MkRq7QZFuH/sf/yuv8ODdMZrY4Bedjp77a5MK4A6s7YbBB64c9u79EBUOfXUXBvArmvzTD0X+6g==", - "dev": true - }, - "nested-object-assign": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/nested-object-assign/-/nested-object-assign-1.0.3.tgz", - "integrity": "sha512-kgq1CuvLyUcbcIuTiCA93cQ2IJFSlRwXcN+hLcb2qLJwC2qrePHGZZa7IipyWqaWF6tQjdax2pQnVxdq19Zzwg==", - "dev": true - }, - "netmask": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", - "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=" - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "nise": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.8.tgz", - "integrity": "sha512-kGASVhuL4tlAV0tvA34yJYZIVihrUt/5bDwpp4tTluigxUr2bBlJeDXmivb6NuEdFkqvdv/Ybb9dm16PSKUhtw==", - "dev": true, - "requires": { - "@sinonjs/formatio": "^3.1.0", - "just-extend": "^4.0.2", - "lolex": "^2.3.2", - "path-to-regexp": "^1.7.0", - "text-encoding": "^0.6.4" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", - "dev": true, - "requires": { - "isarray": "0.0.1" - } - } - } - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, - "requires": { - "lower-case": "^1.1.1" - } - }, - "nock": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/nock/-/nock-9.1.5.tgz", - "integrity": "sha512-ukkBUhGU73CmSKTpTl6N/Qjvb7Hev4rCEjgOuEBKvHmsOqz7jGh2vUXL3dPnX3ndfcmVjsFBPfKpNuJbK94SKg==", - "dev": true, - "requires": { - "chai": ">=1.9.2 <4.0.0", - "debug": "^2.2.0", - "deep-equal": "^1.0.0", - "json-stringify-safe": "^5.0.1", - "lodash": "~4.17.2", - "mkdirp": "^0.5.0", - "propagate": "0.4.0", - "qs": "^6.5.1", - "semver": "^5.3.0" - }, - "dependencies": { - "chai": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", - "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", - "dev": true, - "requires": { - "assertion-error": "^1.0.1", - "deep-eql": "^0.1.3", - "type-detect": "^1.0.0" - } - }, - "deep-eql": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", - "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", - "dev": true, - "requires": { - "type-detect": "0.1.1" - }, - "dependencies": { - "type-detect": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", - "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", - "dev": true - } - } - }, - "type-detect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", - "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", - "dev": true - } - } - }, - "node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=", - "dev": true, - "requires": { - "minimatch": "^3.0.2" - } - }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - }, - "node-libs-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", - "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - } - } - }, - "node-notifier": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", - "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", - "dev": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" - }, - "dependencies": { - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - } - } - }, - "node-releases": { - "version": "1.1.23", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.23.tgz", - "integrity": "sha512-uq1iL79YjfYC0WXoHbC/z28q/9pOl8kSHaXdWmAAc8No+bDwqkZbzIJz55g/MUsPgSGm9LZ7QSUbzTcH5tz47w==", - "dev": true, - "requires": { - "semver": "^5.3.0" - } - }, - "node-sass": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.12.0.tgz", - "integrity": "sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ==", - "dev": true, - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^1.1.1", - "cross-spawn": "^3.0.0", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "in-publish": "^2.0.0", - "lodash": "^4.17.11", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "nan": "^2.13.2", - "node-gyp": "^3.8.0", - "npmlog": "^4.0.0", - "request": "^2.88.0", - "sass-graph": "^2.2.4", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.0.2" - }, - "dependencies": { - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", - "dev": true - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "dev": true, - "requires": { - "mime-db": "1.40.0" - } - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true - }, - "node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", - "dev": true, - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - } - } - }, - "node-status-codes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", - "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=", - "dev": true - }, - "nomnom": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.6.2.tgz", - "integrity": "sha1-hKZqJgF0QI/Ft3oY+IjszET7aXE=", - "dev": true, - "requires": { - "colors": "0.5.x", - "underscore": "~1.4.4" - } - }, - "nonce-tracker": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nonce-tracker/-/nonce-tracker-1.0.0.tgz", - "integrity": "sha512-hxKokxgLvOZx9A5qPQKwL34G1/YwMC5xJWZHFUKfvwxypkn2nP0KVJjbcoXwY6pXsRRa11KdFEPW61N4YCGnWQ==", - "requires": { - "assert": "^1.4.1", - "await-semaphore": "^0.1.3", - "ethjs-query": "^0.3.8" - }, - "dependencies": { - "ethjs-query": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/ethjs-query/-/ethjs-query-0.3.8.tgz", - "integrity": "sha512-/J5JydqrOzU8O7VBOwZKUWXxHDGr46VqNjBCJgBVNNda+tv7Xc8Y2uJc6aMHHVbeN3YOQ7YRElgIc0q1CI02lQ==", - "requires": { - "babel-runtime": "^6.26.0", - "ethjs-format": "0.2.7", - "ethjs-rpc": "0.2.0", - "promise-to-callback": "^1.0.0" - } - }, - "ethjs-rpc": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ethjs-rpc/-/ethjs-rpc-0.2.0.tgz", - "integrity": "sha512-RINulkNZTKnj4R/cjYYtYMnFFaBcVALzbtEJEONrrka8IeoarNB9Jbzn+2rT00Cv8y/CxAI+GgY1d0/i2iQeOg==", - "requires": { - "promise-to-callback": "^1.0.0" - } - } - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-scroll-left": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-scroll-left/-/normalize-scroll-left-0.1.2.tgz", - "integrity": "sha512-F9YMRls0zCF6BFIE2YnXDRpHPpfd91nOIaNdDgrx5YMoPLo8Wqj+6jNXHQsYBavJeXP4ww8HCt0xQAKc5qk2Fg==" - }, - "normalize-selector": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz", - "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=", - "dev": true - }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", - "dev": true - }, - "now-and-later": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.0.tgz", - "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=", - "dev": true, - "requires": { - "once": "^1.3.2" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nth-check": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "null-check": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", - "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", - "dev": true - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", - "requires": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - } - } - }, - "nwmatcher": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.3.tgz", - "integrity": "sha512-IKdSTiDWCarf2JTS5e9e2+5tPZGdkRJ79XjYV0pzK8Q9BpsFyBq1RGKxzs7Q8UBushGw7m6TzVKz6fcY99iSWw==", - "dev": true - }, - "nyc": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.0.0.tgz", - "integrity": "sha512-aQo5UssY25uCJ6M3yNjem0C3KJ1z4IYLp9iR2KqRsuwAII1YofEnRDrHOzp/0Zk2YMYXXxuvWUzjr24i4nmfDA==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "arrify": "^1.0.1", - "caching-transform": "^1.0.1", - "convert-source-map": "^1.5.1", - "debug-log": "^1.0.1", - "find-cache-dir": "^1.0.0", - "find-up": "^2.1.0", - "foreground-child": "^1.5.6", - "glob": "^7.1.2", - "istanbul-lib-coverage": "^2.0.0", - "istanbul-lib-hook": "^2.0.0", - "istanbul-lib-instrument": "^2.2.0", - "istanbul-lib-report": "^2.0.0", - "istanbul-lib-source-maps": "^2.0.0", - "istanbul-reports": "^1.5.0", - "make-dir": "^1.3.0", - "md5-hex": "^2.0.0", - "merge-source-map": "^1.1.0", - "resolve-from": "^4.0.0", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "spawn-wrap": "^1.4.2", - "test-exclude": "^4.2.2", - "yargs": "11.1.0", - "yargs-parser": "^9.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", - "dev": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "caching-transform": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz", - "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=", - "dev": true, - "requires": { - "md5-hex": "^1.2.0", - "mkdirp": "^0.5.1", - "write-file-atomic": "^1.1.4" - }, - "dependencies": { - "md5-hex": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", - "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=", - "dev": true, - "requires": { - "md5-o-matic": "^0.1.1" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true - }, - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "debug-log": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", - "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", - "dev": true, - "requires": { - "strip-bom": "^3.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } - }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "foreground-child": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", - "dev": true, - "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "hosted-git-info": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "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=", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.0.tgz", - "integrity": "sha512-yMSw5xLIbdaxiVXHk3amfNM2WeBxLrwH/BCyZ9HvA/fylwziAIJOG2rKqWyLqEJqwKT725vxxqidv+SyynnGAA==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.0.tgz", - "integrity": "sha512-qm3dt628HKpCVtIjbdZLuQyXn0+LO8qz+YHQDfkeXuSk5D+p299SEV5DrnUUnPi2SXvdMmWapMYWiuE75o2rUQ==", - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, - "istanbul-lib-report": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.0.tgz", - "integrity": "sha512-RiELmy9oIRYUv36ITOAhVum9PUvuj6bjyXVEKEHNiD1me6qXtxfx7vSEJWnjOGk2QmYw/GRFjLXWJv3qHpLceQ==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.0", - "make-dir": "^1.3.0", - "supports-color": "^5.4.0" - } - }, - "istanbul-lib-source-maps": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-2.0.0.tgz", - "integrity": "sha512-jenUeC0gMSSMGkvqD9xuNfs3nD7XWeXLhqaIkqHsNZ3DJBWPdlKEydE7Ya5aTgdWjrEQhrCYTv+J606cGC2vuQ==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^2.0.0", - "make-dir": "^1.3.0", - "rimraf": "^2.6.2", - "source-map": "^0.6.1" - }, - "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 - } - } - }, - "istanbul-reports": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.0.tgz", - "integrity": "sha512-HeZG0WHretI9FXBni5wZ9DOgNziqDCEwetxnme5k1Vv5e81uTqcsy3fMH99gXGDGKr1ea87TyGseDMa2h4HEUA==", - "dev": true, - "requires": { - "handlebars": "^4.0.11" - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, - "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "md5-hex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz", - "integrity": "sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM=", - "dev": true, - "requires": { - "md5-o-matic": "^0.1.1" - } - }, - "md5-o-matic": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", - "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", - "dev": true - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "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 - } - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "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", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "^7.0.5" - } - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", - "dev": true - }, - "spawn-wrap": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", - "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", - "dev": true, - "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - } - }, - "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "test-exclude": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.2.tgz", - "integrity": "sha512-2kTGf+3tykCfrWVREgyTR0bmVO0afE6i7zVXi/m+bZZ8ujV89Aulxdcdv32yH+unVFg3Y5o6GA8IzsHnGQuFgQ==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "minimatch": "^3.0.4", - "read-pkg-up": "^3.0.0", - "require-main-filename": "^1.0.1" - }, - "dependencies": { - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.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=", - "dev": true - }, - "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=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "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=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "slide": "^1.1.5" - } - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", - "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } - } - } - } - }, - "o-stream": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/o-stream/-/o-stream-0.2.2.tgz", - "integrity": "sha512-V3j76KU3g/Gyl8rpdi2z72rn5zguMvTCQgAXfBe3pxEefKqXmOUOD7mvx/mNjykdxGqDVfpSoo8r+WdrkWg/1Q==", - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" - }, - "obj-multiplex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/obj-multiplex/-/obj-multiplex-1.0.0.tgz", - "integrity": "sha1-Lyrmv9SuEb7+dC6p6ls2Y26r/8E=", - "requires": { - "end-of-stream": "^1.4.0", - "once": "^1.4.0", - "readable-stream": "^2.3.3" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - } - } - }, - "object-inspect": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.3.0.tgz", - "integrity": "sha512-OHHnLgLNXpM++GnJRyyhbr2bwl3pPVm4YvaraHrRvDt/N3r+s/gDVHciA7EJBTkijKXj61ssgSAikq1fb0IBRg==" - }, - "object-is": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", - "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", - "dev": true - }, - "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" - }, - "object-path": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.9.2.tgz", - "integrity": "sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "object.assign": { - "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", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "object.entries": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz", - "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.6.1", - "function-bind": "^1.1.0", - "has": "^1.0.1" - } - }, - "object.fromentries": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.0.tgz", - "integrity": "sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.11.0", - "function-bind": "^1.1.1", - "has": "^1.0.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" - }, - "dependencies": { - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - } - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.0" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - } - } - }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "object.reduce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } - } - }, - "object.values": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", - "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.6.1", - "function-bind": "^1.1.0", - "has": "^1.0.1" - } - }, - "obs-store": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/obs-store/-/obs-store-3.0.2.tgz", - "integrity": "sha512-GzBr7KM2TYWoJSlF3sVo1cMIOeyxgXpEdegXLZyYONRpunFHsBdKwOba0ki17kN2stLaEwTNolJChGHafqM7Fw==", - "requires": { - "babel-preset-es2015": "^6.22.0", - "babelify": "^7.3.0", - "readable-stream": "^2.2.2", - "through2": "^2.0.3", - "xtend": "^4.0.1" - }, - "dependencies": { - "babelify": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } - } - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onecolor": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/onecolor/-/onecolor-3.0.5.tgz", - "integrity": "sha1-Nu/zIgE3nv3xGA+0ReUajiQl+fY=", - "dev": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "open": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.3.0.tgz", - "integrity": "sha512-6AHdrJxPvAXIowO/aIaeHZ8CeMdDf7qCyRNq8NwJpinmCdXhz+NZR7ie1Too94lpciCDsG+qHGO9Mt0svA4OqA==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "opener": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.4.3.tgz", - "integrity": "sha1-XG2ixdflgx6P+jlklQ+NZnSskLg=" - }, - "opn": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.2.0.tgz", - "integrity": "sha512-Jd/GpzPyHF4P2/aNOVmS3lfMSWV9J7cOhCG1s08XCEAsPkB7lp6ddiU0J7XzyQRDUh8BqJ7PchfINjR8jyofRQ==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "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=" - } - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - }, - "dependencies": { - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - } - } - }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "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" - } - }, - "os-name": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", - "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", - "dev": true, - "requires": { - "macos-release": "^2.2.0", - "windows-release": "^3.1.0" - } - }, - "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=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "outpipe": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz", - "integrity": "sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I=", - "dev": true, - "requires": { - "shell-quote": "^1.4.2" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, - "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", - "dev": true - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pac-proxy-agent": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-2.0.2.tgz", - "integrity": "sha512-cDNAN1Ehjbf5EHkNY5qnRhGPUCp6SnpyVof5fRzN800QV1Y2OkzbH9rmjZkbBRa8igof903yOnjIl6z0SlAhxA==", - "requires": { - "agent-base": "^4.2.0", - "debug": "^3.1.0", - "get-uri": "^2.0.0", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1", - "pac-resolver": "^3.0.0", - "raw-body": "^2.2.0", - "socks-proxy-agent": "^3.0.0" - }, - "dependencies": { - "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" - } - } - } - }, - "pac-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz", - "integrity": "sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==", - "requires": { - "co": "^4.6.0", - "degenerator": "^1.0.4", - "ip": "^1.1.5", - "netmask": "^1.0.6", - "thunkify": "^2.1.2" - } - }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "dev": true, - "requires": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" - } - }, - "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", - "dev": true - }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "dev": true, - "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - } - } - }, - "parents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", - "dev": true, - "requires": { - "path-platform": "~0.11.15" - } - }, - "parse-asn1": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" - } - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - } - }, - "parse-headers": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz", - "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=", - "requires": { - "for-each": "^0.3.2", - "trim": "0.0.1" - } - }, - "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" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parse-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.1.tgz", - "integrity": "sha512-d7yhga0Oc+PwNXDvQ0Jv1BuWkLVPXcAoQ/WREgd6vNNoKYaW52KI+RdOFjI63wjkmps9yUE8VS4veP+AgpQ/hA==", - "dev": true, - "requires": { - "is-ssh": "^1.3.0", - "protocols": "^1.4.0" - } - }, - "parse-url": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-5.0.1.tgz", - "integrity": "sha512-flNUPP27r3vJpROi0/R3/2efgKkyXqnXwyP1KQ2U0SfFRgdizOdWfvrrvJg1LuOoxs7GQhmxJlq23IpQ/BkByg==", - "dev": true, - "requires": { - "is-ssh": "^1.3.0", - "normalize-url": "^3.3.0", - "parse-path": "^4.0.0", - "protocols": "^1.4.0" - } - }, - "parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", - "dev": true, - "requires": { - "process": "^0.11.1", - "util": "^0.10.3" - }, - "dependencies": { - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - } - } - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "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-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" - }, - "path-platform": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", - "dev": true - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "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" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", - "dev": true - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "requires": { - "through": "~2.3" - } - }, - "pbkdf2": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", - "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "percentile": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/percentile/-/percentile-1.2.0.tgz", - "integrity": "sha1-+jsFwf/TVbNSKFKYNOX6N/C9Rl0=" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "phantom": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/phantom/-/phantom-4.0.12.tgz", - "integrity": "sha512-Tz82XhtPmwCk1FFPmecy7yRGZG2btpzY2KI9fcoPT7zT9det0CcMyfBFPp1S8DqzsnQnm8ZYEfdy528mwVtksA==", - "dev": true, - "optional": true, - "requires": { - "phantomjs-prebuilt": "^2.1.16", - "split": "^1.0.1", - "winston": "^2.4.0" - }, - "dependencies": { - "async": { - "version": "1.0.0", - "resolved": "http://registry.npmjs.org/async/-/async-1.0.0.tgz", - "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=", - "dev": true, - "optional": true - }, - "colors": { - "version": "1.0.3", - "resolved": "http://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true, - "optional": true - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "optional": true, - "requires": { - "through": "2" - } - }, - "winston": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz", - "integrity": "sha512-NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q==", - "dev": true, - "optional": true, - "requires": { - "async": "~1.0.0", - "colors": "1.0.x", - "cycle": "1.0.x", - "eyes": "0.1.x", - "isstream": "0.1.x", - "stack-trace": "0.0.x" - } - } - } - }, - "phantomjs-prebuilt": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", - "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", - "dev": true, - "optional": true, - "requires": { - "es6-promise": "^4.0.3", - "extract-zip": "^1.6.5", - "fs-extra": "^1.0.0", - "hasha": "^2.2.0", - "kew": "^0.7.0", - "progress": "^1.1.8", - "request": "^2.81.0", - "request-progress": "^2.0.1", - "which": "^1.2.10" - }, - "dependencies": { - "fs-extra": { - "version": "1.0.0", - "resolved": "http://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0" - } - }, - "progress": { - "version": "1.1.8", - "resolved": "http://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true, - "optional": true - } - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } - }, - "pino": { - "version": "5.12.6", - "resolved": "https://registry.npmjs.org/pino/-/pino-5.12.6.tgz", - "integrity": "sha512-LM5ug2b27uymIIkaBw54ncF+9DSf8S4z1uzw+Y5I94dRu3Z+lFuB13j0kg1InAeyxy+CsLGnWHKy9+zgTreFOg==", - "dev": true, - "requires": { - "fast-redact": "^1.4.4", - "fast-safe-stringify": "^2.0.6", - "flatstr": "^1.0.9", - "pino-std-serializers": "^2.3.0", - "quick-format-unescaped": "^3.0.2", - "sonic-boom": "^0.7.3" - } - }, - "pino-std-serializers": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-2.4.2.tgz", - "integrity": "sha512-WaL504dO8eGs+vrK+j4BuQQq6GLKeCCcHaMB2ItygzVURcL1CycwNEUHTD/lHFHs/NL5qAz2UKrjYWXKSf4aMQ==", - "dev": true - }, - "pipetteur": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pipetteur/-/pipetteur-2.0.3.tgz", - "integrity": "sha1-GVV2CVno0aEcsqUOyD7sRwYz5J8=", - "dev": true, - "requires": { - "onecolor": "^3.0.4", - "synesthesia": "^1.0.1" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.0.0.tgz", - "integrity": "sha512-zoH7ZWPkRdgwYCDVoQTzqjG8JSPANhtvLhh4KVUHyKnaUJJrNeFmWIkTcNuJmR3GLMEmGYEf2S2bjgx26JTF+Q==", - "dev": true, - "requires": { - "locate-path": "^5.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - } - } - }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - } - } - }, - "plucker": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/plucker/-/plucker-0.0.0.tgz", - "integrity": "sha1-L/ok4Dqyz/pOda3B33DyViPEXQk=" - }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "dev": true, - "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - }, - "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "^1.1.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true - } - } - }, - "plur": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", - "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", - "dev": true, - "requires": { - "irregular-plurals": "^1.0.0" - } - }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true - }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "dev": true - }, - "png-file-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/png-file-stream/-/png-file-stream-1.1.0.tgz", - "integrity": "sha512-uZuSd4yuLXik2H/XqR+7hcGU30nCeBHhPsejR8JA91oKom57aeL379hO5ZJ4SS1Nujk/hDUN0VE8UiT+FuwNZg==", - "dev": true, - "requires": { - "glob-stream": "^6.1.0", - "png-js": "~0.1.1", - "through2": "~0.2.3" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "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=", - "dev": true - }, - "through2": { - "version": "0.2.3", - "resolved": "http://registry.npmjs.org/through2/-/through2-0.2.3.tgz", - "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", - "dev": true, - "requires": { - "readable-stream": "~1.1.9", - "xtend": "~2.1.1" - } - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "dev": true, - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "png-js": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/png-js/-/png-js-0.1.1.tgz", - "integrity": "sha1-HMfCEjA6yr50Jj7DrHgAlYAkLZM=", - "dev": true - }, - "po2json": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/po2json/-/po2json-0.4.5.tgz", - "integrity": "sha1-R7spUtoy1Yob4vJWpZjuvAt0URg=", - "dev": true, - "requires": { - "gettext-parser": "1.1.0", - "nomnom": "1.8.1" - }, - "dependencies": { - "ansi-styles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", - "dev": true - }, - "chalk": { - "version": "0.4.0", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", - "dev": true, - "requires": { - "ansi-styles": "~1.0.0", - "has-color": "~0.1.0", - "strip-ansi": "~0.1.0" - } - }, - "nomnom": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", - "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", - "dev": true, - "requires": { - "chalk": "~0.4.0", - "underscore": "~1.6.0" - } - }, - "strip-ansi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", - "dev": true - }, - "underscore": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", - "dev": true - } - } - }, - "polished": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/polished/-/polished-3.4.0.tgz", - "integrity": "sha512-GiuavmunMIKMOEoSPkXoqBYM2ZcI4YIwCaiwmTOQ55Zq4HG2kD0YZt3WlLZ2l3U9XhJ1LM/fgjCFHHffiZP0YQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.4.4" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", - "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", - "dev": true - } - } - }, - "polyfill-crypto.getrandomvalues": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/polyfill-crypto.getrandomvalues/-/polyfill-crypto.getrandomvalues-1.0.0.tgz", - "integrity": "sha1-XJVgKXbrthVbFjy2XXe57t47YaQ=", - "requires": { - "mersenne-twister": "^1.0.1" - } - }, - "popper.js": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.12.9.tgz", - "integrity": "sha1-DfvC3/lsRRuzMu3Pz6r1ZtMx1bM=" - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "post-message-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/post-message-stream/-/post-message-stream-3.0.0.tgz", - "integrity": "sha1-kNn1S9IJ5rb110eVuHWIIFtUcEg=", - "requires": { - "readable-stream": "^2.1.4" - } - }, - "postcss": { - "version": "6.0.19", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.19.tgz", - "integrity": "sha512-f13HRz0HtVwVaEuW6J6cOUCBLFtymhgyLPV7t4QEk2UD3twRI9IluDcQNdzQdBpiixkXj2OmzejhhTbSbDxNTg==", - "dev": true, - "requires": { - "chalk": "^2.3.1", - "source-map": "^0.6.1", - "supports-color": "^5.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "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 - }, - "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-flexbugs-fixes": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz", - "integrity": "sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", - "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "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 - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-less": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-0.14.0.tgz", - "integrity": "sha1-xjGwicbM5CK5oQ86lY0r7dOBkyQ=", - "dev": true, - "requires": { - "postcss": "^5.0.21" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-load-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", - "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", - "dev": true, - "requires": { - "cosmiconfig": "^4.0.0", - "import-cwd": "^2.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", - "dev": true, - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "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==", - "dev": true - } - } - }, - "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "postcss": { - "version": "7.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", - "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "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 - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - } - } - }, - "postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=", - "dev": true - }, - "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", - "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "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 - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-local-by-default": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz", - "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0", - "postcss-value-parser": "^3.3.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", - "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "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 - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-scope": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz", - "integrity": "sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", - "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "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 - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-values": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", - "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", - "dev": true, - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^7.0.6" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "postcss": { - "version": "7.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", - "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "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 - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-reporter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-3.0.0.tgz", - "integrity": "sha1-CeoPN6RExWk4eGBuCbAY6+/3z48=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "lodash": "^4.1.0", - "log-symbols": "^1.0.2", - "postcss": "^5.0.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", - "dev": true - }, - "postcss-scss": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-0.4.1.tgz", - "integrity": "sha1-rXcbgfD3L19IRdCKpg+TVXZT1Uw=", - "dev": true, - "requires": { - "postcss": "^5.2.13" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "dependencies": { - "flatten": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", - "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", - "dev": true - } - } - }, - "postcss-sorting": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-2.1.0.tgz", - "integrity": "sha1-MrHpr6kTuyJaatB21QPY+YO7SoI=", - "dev": true, - "requires": { - "lodash": "^4.17.4", - "postcss": "^5.2.17" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "postcss-value-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", - "dev": true - }, - "precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=" - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "prepend-file": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/prepend-file/-/prepend-file-1.3.1.tgz", - "integrity": "sha1-g7FuC0rBkB/OiNvZRaIvTMgd9Xk=", - "dev": true, - "requires": { - "tmp": "0.0.31" - }, - "dependencies": { - "tmp": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", - "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.1" - } - } - } - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", - "dev": true, - "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" - } - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "printf": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/printf/-/printf-0.5.1.tgz", - "integrity": "sha512-UaE/jO0hNsrvPGQEb4LyNzcrJv9Z00tsreBduOSxMtrebvoUhxiEJ4YCHX8YHf6akwfKsC2Gyv5zv47UXhMiLg==", - "dev": true - }, - "prismjs": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.16.0.tgz", - "integrity": "sha512-OA4MKxjFZHSvZcisLGe14THYsug/nF6O1f0pAJc0KN0wTyAcLqmsbE+lTGKSpyh+9pEW57+k6pg2AfYR+coyHA==", - "dev": true, - "requires": { - "clipboard": "^2.0.0" - } - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" - }, - "probe-image-size": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-4.0.0.tgz", - "integrity": "sha512-nm7RvWUxps+2+jZKNLkd04mNapXNariS6G5WIEVzvAqjx7EUuKcY1Dp3e6oUK7GLwzJ+3gbSbPLFAASHFQrPcQ==", - "dev": true, - "requires": { - "any-promise": "^1.3.0", - "deepmerge": "^2.0.1", - "inherits": "^2.0.3", - "next-tick": "^1.0.0", - "request": "^2.83.0", - "stream-parser": "~0.3.1" - }, - "dependencies": { - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true - }, - "deepmerge": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", - "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", - "dev": true - } - } - }, - "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - }, - "progress": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", - "dev": true - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "requires": { - "asap": "~2.0.3" - } - }, - "promise-filter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/promise-filter/-/promise-filter-1.1.0.tgz", - "integrity": "sha1-fsPOmQyGfMud6GONvRnuF6UqS1k=", - "requires": { - "any-promise": "^0.1.0" - } - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "promise-to-callback": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/promise-to-callback/-/promise-to-callback-1.0.0.tgz", - "integrity": "sha1-XSp0kBC/tn2WNZj805YHRqaP7vc=", - "requires": { - "is-fn": "^1.0.0", - "set-immediate-shim": "^1.0.1" - } - }, - "promise.allsettled": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.1.tgz", - "integrity": "sha512-3ST7RS7TY3TYLOIe+OACZFvcWVe1osbgz2x07nTb446pa3t4GUZWidMDzQ4zf9jC2l6mRa1/3X81icFYbi+D/g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.13.0", - "function-bind": "^1.1.1" - }, - "dependencies": { - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.0" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - } - } - }, - "promise.prototype.finally": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/promise.prototype.finally/-/promise.prototype.finally-3.1.0.tgz", - "integrity": "sha512-7p/K2f6dI+dM8yjRQEGrTQs5hTQixUAdOGpMEA3+pVxpX5oHKRSKAXyLw9Q9HUWDTdwtoo39dSHGQtN90HcEwQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.9.0", - "function-bind": "^1.1.1" - } - }, - "prop-types": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", - "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", - "requires": { - "fbjs": "^0.8.16", - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - } - }, - "propagate": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-0.4.0.tgz", - "integrity": "sha1-8/zKCm/gZzanulcpZgaWF8EwtIE=", - "dev": true - }, - "property-information": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.1.0.tgz", - "integrity": "sha512-tODH6R3+SwTkAQckSp2S9xyYX8dEKYkeXw+4TmJzTxnNzd6mQPu1OD4f9zPrvw/Rm4wpPgI+Zp63mNSGNzUgHg==", - "dev": true, - "requires": { - "xtend": "^4.0.1" - } - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", - "dev": true - }, - "protocols": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.7.tgz", - "integrity": "sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg==", - "dev": true - }, - "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" - } - }, - "proxy-agent": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-2.3.1.tgz", - "integrity": "sha512-CNKuhC1jVtm8KJYFTS2ZRO71VCBx3QSA92So/e6NrY6GoJonkx3Irnk4047EsCcswczwqAekRj3s8qLRGahSKg==", - "requires": { - "agent-base": "^4.2.0", - "debug": "^3.1.0", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1", - "lru-cache": "^4.1.2", - "pac-proxy-agent": "^2.0.1", - "proxy-from-env": "^1.0.0", - "socks-proxy-agent": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=" - }, - "proxyquire": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.0.1.tgz", - "integrity": "sha512-fQr3VQrbdzHrdaDn3XuisVoJlJNDJizHAvUXw9IuXRR8BpV2x0N7LsCxrpJkeKfPbNjiNU/V5vc008cI0TmzzQ==", - "dev": true, - "requires": { - "fill-keys": "^1.0.2", - "module-not-found-error": "^1.0.0", - "resolve": "~1.5.0" - }, - "dependencies": { - "resolve": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", - "dev": true, - "requires": { - "path-parse": "^1.0.5" - } - } - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "ps-tree": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz", - "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=", - "dev": true, - "requires": { - "event-stream": "~3.3.0" - } - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "psl": { - "version": "1.1.32", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.32.tgz", - "integrity": "sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g==", - "dev": true - }, - "public-encrypt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "pubnub": { - "version": "4.21.7", - "resolved": "https://registry.npmjs.org/pubnub/-/pubnub-4.21.7.tgz", - "integrity": "sha512-TZ96GuY+gZIu9rJaqcO2cZ6tl4JPLruoUcN01sljm1CcDgzIZbOfcDSZp4NcZas4ECSqAAwo/izMMiImRRS4Yg==", - "requires": { - "agentkeepalive": "^3.5.2", - "lil-uuid": "^0.1.1", - "superagent": "^3.8.1", - "superagent-proxy": "^1.0.3" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.3.5.tgz", - "integrity": "sha1-G2ccYZlAq8rqwK0OOjwWS+dgmTs=", - "dev": true, - "requires": { - "duplexify": "^3.1.2", - "inherits": "^2.0.1", - "pump": "^1.0.0" - }, - "dependencies": { - "pump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", - "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" - }, - "qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true - }, - "qrcode-generator": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/qrcode-generator/-/qrcode-generator-1.4.1.tgz", - "integrity": "sha512-KOdSAyFBPf0/5Z3mra4JfSbjrDlUn2J3YH8Rm33tRGbptxP4vhogLWysvkQp8mp5ix9u80Wfr4vxHXTeR9o0Ug==" - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", - "dev": true - }, - "quick-format-unescaped": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-3.0.2.tgz", - "integrity": "sha512-FXTaCkwvpIlkdKeGDNgcq07SXWS383noQUuZjvdE1QcTt+eLuqof6/BDiEPqB59FWLie/l91+HtlJSw7iCViSA==", - "dev": true - }, - "qunitjs": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/qunitjs/-/qunitjs-2.4.1.tgz", - "integrity": "sha512-by/2zYvsNdS6Q6Ev6UJ3qJK+OYVlTzWlQ4afaeYMhVh1dd2K3N1ZZKCrCm3WSWPnz5ELMT8WyJRcVy5PXT2y+Q==", - "dev": true, - "requires": { - "chokidar": "1.6.1", - "commander": "2.9.0", - "exists-stat": "1.0.0", - "findup-sync": "0.4.3", - "js-reporters": "1.2.0", - "resolve": "1.3.2", - "walk-sync": "0.3.1" - }, - "dependencies": { - "chokidar": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.6.1.tgz", - "integrity": "sha1-L0RHq16W5Q+z14n9kNTHLg5McMI=", - "dev": true, - "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" - } - }, - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "detect-file": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz", - "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=", - "dev": true, - "requires": { - "fs-exists-sync": "^0.1.0" - } - }, - "expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", - "dev": true, - "requires": { - "os-homedir": "^1.0.1" - } - }, - "findup-sync": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz", - "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=", - "dev": true, - "requires": { - "detect-file": "^0.1.0", - "is-glob": "^2.0.1", - "micromatch": "^2.3.7", - "resolve-dir": "^0.1.0" - } - }, - "global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", - "dev": true, - "requires": { - "global-prefix": "^0.1.4", - "is-windows": "^0.2.0" - } - }, - "global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.0", - "ini": "^1.3.4", - "is-windows": "^0.2.0", - "which": "^1.2.12" - } - }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", - "dev": true - }, - "resolve": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.2.tgz", - "integrity": "sha1-HwRCyeDLuBNuh7kwX5MvRsfygjU=", - "dev": true, - "requires": { - "path-parse": "^1.0.5" - } - }, - "resolve-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", - "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", - "dev": true, - "requires": { - "expand-tilde": "^1.2.2", - "global-modules": "^0.2.3" - } - } - } - }, - "quote-stream": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", - "integrity": "sha1-hJY/jJwmuULhU/7rU6rnRlK34LI=", - "dev": true, - "requires": { - "buffer-equal": "0.0.1", - "minimist": "^1.1.3", - "through2": "^2.0.0" - }, - "dependencies": { - "buffer-equal": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", - "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=", - "dev": true - } - } - }, - "radgrad-jsdoc-template": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/radgrad-jsdoc-template/-/radgrad-jsdoc-template-1.1.3.tgz", - "integrity": "sha512-yk1XB6NlrP6JIr3xHzCrNwCmkONNgqM+sZxFAdmTU/CsaT7N/lns2/Wfa048li3wrao5b6KwYrdu6KgiGh9nIQ==", - "dev": true - }, - "raf": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", - "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", - "requires": { - "performance-now": "^2.1.0" - } - }, - "raf-schd": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.1.tgz", - "integrity": "sha512-/QTXV4+Tf81CmJgTZac47N63ZzKmaVe+1cQX/grCFeLrs4Mcc6oq+KJfbF3tFjeS1NF91lmTvgmwYjk02UTo9A==", - "dev": true - }, - "rafl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/rafl/-/rafl-1.2.2.tgz", - "integrity": "sha1-/pMPdYIRAg1H44gV9Rlqi+QVB0A=", - "requires": { - "global": "~4.3.0" - } - }, - "railroad-diagrams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", - "dev": true - }, - "ramda": { - "version": "0.24.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.24.1.tgz", - "integrity": "sha1-w7d1UZfzW43DUCIoJixMkd22uFc=" - }, - "randexp": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", - "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", - "dev": true, - "requires": { - "discontinuous-range": "1.0.0", - "ret": "~0.1.10" - } - }, - "randomatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", - "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", - "dev": true, - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "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.0" - } - }, - "randomfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", - "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raphael": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/raphael/-/raphael-2.2.7.tgz", - "integrity": "sha1-IxsZFB+NCGmG2PrOtm+LVi7iyBA=", - "requires": { - "eve-raphael": "0.5.0" - } - }, - "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "unpipe": "1.0.0" - } - }, - "raw-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-2.0.0.tgz", - "integrity": "sha512-kZnO5MoIyrojfrPWqrhFNLZemIAX8edMOCp++yC5RKxzFB3m92DqKNhKlU6+FvpOhWtvyh3jOaD7J6/9tpdIKg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - } - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - } - } - }, - "react": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/react/-/react-15.6.2.tgz", - "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=", - "requires": { - "create-react-class": "^15.6.0", - "fbjs": "^0.8.9", - "loose-envify": "^1.1.0", - "object-assign": "^4.1.0", - "prop-types": "^15.5.10" - } - }, - "react-addons-create-fragment": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/react-addons-create-fragment/-/react-addons-create-fragment-15.6.2.tgz", - "integrity": "sha1-o5TefCx77Na1R1uhuXrEcs58dPg=", - "dev": true, - "requires": { - "fbjs": "^0.8.4", - "loose-envify": "^1.3.1", - "object-assign": "^4.1.0" - } - }, - "react-addons-css-transition-group": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/react-addons-css-transition-group/-/react-addons-css-transition-group-15.6.2.tgz", - "integrity": "sha1-nkN2vPQLUhfRTsaFUwgc7ksIptY=", - "requires": { - "react-transition-group": "^1.2.0" - }, - "dependencies": { - "react-transition-group": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-1.2.1.tgz", - "integrity": "sha512-CWaL3laCmgAFdxdKbhhps+c0HRGF4c+hdM4H23+FI1QBNUyx/AMeIJGWorehPNSaKnQNOAxL7PQmqMu78CDj3Q==", - "requires": { - "chain-function": "^1.0.0", - "dom-helpers": "^3.2.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.5.6", - "warning": "^3.0.0" - } - } - } - }, - "react-clientside-effect": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.0.tgz", - "integrity": "sha512-cVIsGG7SNHsQsCP4+fw7KFUB0HiYiU8hbvL640XaLCbZ31aK8/lj0qOKJ2K+xRjuQz/IM4Q4qclI0aEqTtcXtA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.0.0", - "shallowequal": "^1.1.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", - "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", - "dev": true - } - } - }, - "react-color": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.17.3.tgz", - "integrity": "sha512-1dtO8LqAVotPIChlmo6kLtFS1FP89ll8/OiA8EcFRDR+ntcK+0ukJgByuIQHRtzvigf26dV5HklnxDIvhON9VQ==", - "dev": true, - "requires": { - "@icons/material": "^0.2.4", - "lodash": "^4.17.11", - "material-colors": "^1.2.1", - "prop-types": "^15.5.10", - "reactcss": "^1.2.0", - "tinycolor2": "^1.4.1" - } - }, - "react-datetime": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/react-datetime/-/react-datetime-2.14.0.tgz", - "integrity": "sha512-BUWIzMLRGzWQSYyJf0mivLyDgw4KCTFYn8zW50UTl2qB3xd/BH/TgPzfgDvAScNbiXwWpXei/GCoc6nI2J3GgA==", - "dev": true, - "requires": { - "create-react-class": "^15.5.2", - "object-assign": "^3.0.0", - "prop-types": "^15.5.7", - "react-onclickoutside": "^6.5.0" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - } - } - }, - "react-dev-utils": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-9.0.1.tgz", - "integrity": "sha512-pnaeMo/Pxel8aZpxk1WwxT3uXxM3tEwYvsjCYn5R7gNxjhN1auowdcLDzFB8kr7rafAj2rxmvfic/fbac5CzwQ==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0", - "address": "1.0.3", - "browserslist": "4.5.4", - "chalk": "2.4.2", - "cross-spawn": "6.0.5", - "detect-port-alt": "1.1.6", - "escape-string-regexp": "1.0.5", - "filesize": "3.6.1", - "find-up": "3.0.0", - "fork-ts-checker-webpack-plugin": "1.1.1", - "global-modules": "2.0.0", - "globby": "8.0.2", - "gzip-size": "5.0.0", - "immer": "1.10.0", - "inquirer": "6.2.2", - "is-root": "2.0.0", - "loader-utils": "1.2.3", - "opn": "5.4.0", - "pkg-up": "2.0.0", - "react-error-overlay": "^5.1.6", - "recursive-readdir": "2.2.2", - "shell-quote": "1.6.1", - "sockjs-client": "1.3.0", - "strip-ansi": "5.2.0", - "text-table": "0.2.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "address": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/address/-/address-1.0.3.tgz", - "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg==", - "dev": true - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "browserslist": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.4.tgz", - "integrity": "sha512-rAjx494LMjqKnMPhFkuLmLp8JWEX0o8ADTGeAbOqaF+XCvYLreZrG5uVjnPBlAQ8REZK4pzXGvp0bWgrFtKaag==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000955", - "electron-to-chromium": "^1.3.122", - "node-releases": "^1.1.13" - } - }, - "caniuse-lite": { - "version": "1.0.30000973", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000973.tgz", - "integrity": "sha512-/F3t/Yo8LEdRSEPCmI15fLu5vepVh9UCg/9inJXF5AAfW7xRRJkbaM2ut52iRMQMnGCLQouLbFdbOA+VEFOIsg==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "dev": true, - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - } - }, - "electron-to-chromium": { - "version": "1.3.146", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.146.tgz", - "integrity": "sha512-BrUq08sx7eR4PCwLbjFxXmjcbDro6DSoc1pN8VCxq76U+o9JQzJlWH/NVtcpAqcktwpE5CVvMyqHqTQfCETNoQ==", - "dev": true - }, - "external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globby": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "inquirer": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", - "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.11", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.0.0", - "through": "^2.3.6" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "opn": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", - "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "react-dnd": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-3.0.2.tgz", - "integrity": "sha1-sMI9jYKWn1t740y8T4T6H/xcfdw=", - "requires": { - "disposables": "^1.0.1", - "dnd-core": "^3.0.2", - "hoist-non-react-statics": "^2.5.0", - "invariant": "^2.1.0", - "lodash": "^4.2.0", - "prop-types": "^15.5.10", - "shallowequal": "^1.0.2" - }, - "dependencies": { - "hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" - }, - "shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - } - } - }, - "react-dnd-html5-backend": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-7.4.4.tgz", - "integrity": "sha512-X/lP92ateY0glHan8mU0JzjBuZL6VHv2Gc/H9OBBxaf/ZCN1oC16MLKdesqG4x1f/NWFTNtuG3W4B99r5gPVog==", - "requires": { - "dnd-core": "^7.4.4" - }, - "dependencies": { - "dnd-core": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-7.4.4.tgz", - "integrity": "sha512-xR8SINDCJG9AmKSjXUMJ1PEl8ih1+xSHH8x4DgBtzScXnEtpCnV1ibDZNV0uyps9VgkXTTbYYzJdF04y0v0e3Q==", - "requires": { - "asap": "^2.0.6", - "invariant": "^2.2.4", - "redux": "^4.0.1" - } - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "redux": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.1.tgz", - "integrity": "sha512-R7bAtSkk7nY6O/OYMVR9RiBI+XghjF9rlbl5806HJbQph0LJVHZrU5oaO4q70eUKiqMRqm4y07KLTlMZ2BlVmg==", - "requires": { - "loose-envify": "^1.4.0", - "symbol-observable": "^1.2.0" - }, - "dependencies": { - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - } - } - }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" - } - } - }, - "react-docgen": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-4.1.1.tgz", - "integrity": "sha512-o1wdswIxbgJRI4pckskE7qumiFyqkbvCO++TylEDOo2RbMiueIOg8YzKU4X9++r0DjrbXePw/LHnh81GRBTWRw==", - "dev": true, - "requires": { - "@babel/core": "^7.0.0", - "@babel/runtime": "^7.0.0", - "async": "^2.1.4", - "commander": "^2.19.0", - "doctrine": "^3.0.0", - "node-dir": "^0.1.10", - "recast": "^0.17.3" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", - "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "ast-types": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.12.4.tgz", - "integrity": "sha512-ky/YVYCbtVAS8TdMIaTiPFHwEpRB5z1hctepJplTr3UW5q8TDrpIMCILyk8pmLxGtn2KCtC/lSn7zOsaI7nzDw==", - "dev": true - }, - "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "dev": true - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "recast": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.17.6.tgz", - "integrity": "sha512-yoQRMRrK1lszNtbkGyM4kN45AwylV5hMiuEveUBlxytUViWevjvX6w+tzJt1LH4cfUhWt4NZvy3ThIhu6+m5wQ==", - "dev": true, - "requires": { - "ast-types": "0.12.4", - "esprima": "~4.0.0", - "private": "^0.1.8", - "source-map": "~0.6.1" - } - }, - "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", - "dev": true - }, - "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 - } - } - }, - "react-dom": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz", - "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=", - "requires": { - "fbjs": "^0.8.9", - "loose-envify": "^1.1.0", - "object-assign": "^4.1.0", - "prop-types": "^15.5.10" - } - }, - "react-draggable": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-3.3.0.tgz", - "integrity": "sha512-U7/jD0tAW4T0S7DCPK0kkKLyL0z61sC/eqU+NUfDjnq+JtBKaYKDHpsK2wazctiA4alEzCXUnzkREoxppOySVw==", - "dev": true, - "requires": { - "classnames": "^2.2.5", - "prop-types": "^15.6.0" - } - }, - "react-element-to-jsx-string": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-14.0.2.tgz", - "integrity": "sha512-eYcPUg3FJisgAb8q3sSdce8F/xMZD/iFEjMZYnkE3b7gPi5OamGr2Hst/1pE72mzn7//dfYPXb+UqPK2xdSGsg==", - "dev": true, - "requires": { - "is-plain-object": "2.0.4", - "stringify-object": "3.2.2" - } - }, - "react-error-overlay": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-5.1.6.tgz", - "integrity": "sha512-X1Y+0jR47ImDVr54Ab6V9eGk0Hnu7fVWGeHQSOXHf/C2pF9c6uy3gef8QUeuUiWlNb0i08InPSE5a/KJzNzw1Q==", - "dev": true - }, - "react-event-listener": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/react-event-listener/-/react-event-listener-0.5.3.tgz", - "integrity": "sha512-fTGYvhe7eTsqq0m664Km0rxKQcqLIGZWZINmy1LU0fu312tay8Mt3Twq2P5Xj1dfDVvvzT1Ql3/FDkiMPJ1MOg==", - "requires": { - "babel-runtime": "^6.26.0", - "fbjs": "^0.8.16", - "prop-types": "^15.6.0", - "warning": "^3.0.0" - } - }, - "react-fast-compare": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", - "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==", - "dev": true - }, - "react-focus-lock": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-1.19.1.tgz", - "integrity": "sha512-TPpfiack1/nF4uttySfpxPk4rGZTLXlaZl7ncZg/ELAk24Iq2B1UUaUioID8H8dneUXqznT83JTNDHDj+kwryw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.0.0", - "focus-lock": "^0.6.3", - "prop-types": "^15.6.2", - "react-clientside-effect": "^1.2.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", - "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", - "dev": true - } - } - }, - "react-helmet-async": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.0.2.tgz", - "integrity": "sha512-qzzchrM/ibHuPS/60ief8jaibPunuRdeta4iBDQV+ri2SFKwOV+X2NlEpvevZOauhmHrH/I6dI4E90EPVfJBBg==", - "dev": true, - "requires": { - "@babel/runtime": "7.3.4", - "invariant": "2.2.4", - "prop-types": "15.7.2", - "react-fast-compare": "2.0.4", - "shallowequal": "1.1.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.4.tgz", - "integrity": "sha512-IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.12.0" - } - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - }, - "dependencies": { - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - } - } - }, - "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", - "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", - "dev": true - } - } - }, - "react-hotkeys": { - "version": "2.0.0-pre4", - "resolved": "https://registry.npmjs.org/react-hotkeys/-/react-hotkeys-2.0.0-pre4.tgz", - "integrity": "sha512-oa+UncSWyOwMK3GExt+oELXaR7T3ItgcMolsupQFdKvwkEhVAluJd5rYczsRSQpQlVkdNoHG46De2NUeuS+88Q==", - "dev": true, - "requires": { - "prop-types": "^15.6.1" - } - }, - "react-html-attributes": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/react-html-attributes/-/react-html-attributes-1.4.2.tgz", - "integrity": "sha1-DSzPE0/Hmy01Q4N9wVkdMre5A/k=", - "dev": true, - "requires": { - "html-element-attributes": "^1.0.0" - } - }, - "react-hyperscript": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/react-hyperscript/-/react-hyperscript-3.0.0.tgz", - "integrity": "sha1-PBYBCzMXXea8Af0eutChapptyas=" - }, - "react-idle-timer": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/react-idle-timer/-/react-idle-timer-4.2.5.tgz", - "integrity": "sha512-8B/OwjG8E/DTx1fHYKTpZ4cnCbL9+LOc5I9t8SYe8tbEkP14KChiYg0xPIuyRpO33wUZHcgmQl93CVePaDhmRA==" - }, - "react-input-autosize": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.1.2.tgz", - "integrity": "sha512-uAfIE4XEfBNXqjqQvd31Eoo20UkVk0xHJpfgP8HRT8gLczaN4LEmB1e2d8CJ5ziEt4clWnsk/1+QhTN27iO/EA==", - "requires": { - "prop-types": "^15.5.8" - } - }, - "react-inspector": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/react-inspector/-/react-inspector-2.3.0.tgz", - "integrity": "sha512-aIcbWb0fKFhEMB+RadoOYawlr1JoMMfrQ1oRgPUG/f/e4zERVJ6nYcIaQmrQmdHCZ63BOqe2cEkoeY0kyLBzNg==", - "requires": { - "babel-runtime": "^6.26.0", - "is-dom": "^1.0.9" - } - }, - "react-is": { - "version": "16.4.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.4.2.tgz", - "integrity": "sha512-rI3cGFj/obHbBz156PvErrS5xc6f1eWyTwyV4mo0vF2lGgXgS+mm7EKD5buLJq6jNgIagQescGSVG2YzgXt8Yg==", - "dev": true - }, - "react-jss": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/react-jss/-/react-jss-8.4.0.tgz", - "integrity": "sha512-yIi4udcTIIh5u4KJ47wsL3UZYMuSrp5xR1YBvPeRNshpCdRoJxt5BWmCu1RA3LIa+//dnRsAtAQmMAYeg1W9oQ==", - "requires": { - "hoist-non-react-statics": "^2.3.1", - "jss": "^9.7.0", - "jss-preset-default": "^4.3.0", - "prop-types": "^15.6.0", - "theming": "^1.3.0" - } - }, - "react-lifecycles-compat": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.2.tgz", - "integrity": "sha512-pbZOSMVVkvppW7XRn9fcHK5OgEDnYLwMva7P6TgS44/SN9uGGjfh3Z1c8tomO+y4IsHQ6Fsz2EGwmE7sMeNZgQ==" - }, - "react-media": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/react-media/-/react-media-1.8.0.tgz", - "integrity": "sha512-XcfqkDQj5/hmJod/kXUAZljJyMVkWrBWOkzwynAR8BXOGlbFLGBwezM0jQHtp2BrSymhf14/XrQrb3gGBnGK4g==", - "requires": { - "invariant": "^2.2.2", - "json2mq": "^0.2.0", - "prop-types": "^15.5.10" - } - }, - "react-motion": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/react-motion/-/react-motion-0.5.2.tgz", - "integrity": "sha512-9q3YAvHoUiWlP3cK0v+w1N5Z23HXMj4IF4YuvjvWegWqNPfLXsOBE/V7UvQGpXxHFKRQQcNcVQE31g9SB/6qgQ==", - "requires": { - "performance-now": "^0.2.0", - "prop-types": "^15.5.8", - "raf": "^3.1.0" - }, - "dependencies": { - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" - } - } - }, - "react-onclickoutside": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.7.1.tgz", - "integrity": "sha512-p84kBqGaMoa7VYT0vZ/aOYRfJB+gw34yjpda1Z5KeLflg70HipZOT+MXQenEhdkPAABuE2Astq4zEPdMqUQxcg==", - "dev": true - }, - "react-popper": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-0.10.4.tgz", - "integrity": "sha1-rypBXqIike3VBGeNev2opu4ylao=", - "requires": { - "popper.js": "^1.14.1", - "prop-types": "^15.6.1" - }, - "dependencies": { - "popper.js": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.3.tgz", - "integrity": "sha1-FDj5jQRqz3tNeM1QK/QYrGTU8JU=" - } - } - }, - "react-popper-tooltip": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/react-popper-tooltip/-/react-popper-tooltip-2.8.3.tgz", - "integrity": "sha512-g5tfxmuj8ClNVwH4zswYJcD3GKoc5RMeRawd/WZnbyZGEDecsRKaVL+Kj7L3BG7w5qb6/MHcLTG8yE4CidwezQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.4.5", - "react-popper": "^1.3.3" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", - "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "create-react-context": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.2.tgz", - "integrity": "sha512-KkpaLARMhsTsgp0d2NA/R94F/eDLbhXERdIq3LvX2biCAXcDvHYoOqHfWCHf1+OLj+HKBotLG3KqaOOf+C1C+A==", - "dev": true, - "requires": { - "fbjs": "^0.8.0", - "gud": "^1.0.0" - } - }, - "popper.js": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.15.0.tgz", - "integrity": "sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA==", - "dev": true - }, - "react-popper": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.3.tgz", - "integrity": "sha512-ynMZBPkXONPc5K4P5yFWgZx5JGAUIP3pGGLNs58cfAPgK67olx7fmLp+AdpZ0+GoQ+ieFDa/z4cdV6u7sioH6w==", - "dev": true, - "requires": { - "@babel/runtime": "^7.1.2", - "create-react-context": "<=0.2.2", - "popper.js": "^1.14.4", - "prop-types": "^15.6.1", - "typed-styles": "^0.0.7", - "warning": "^4.0.2" - } - }, - "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", - "dev": true - }, - "warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - } - } - }, - "react-redux": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.0.6.tgz", - "integrity": "sha512-8taaaGu+J7PMJQDJrk/xiWEYQmdo3mkXw6wPr3K3LxvXis3Fymiq7c13S+Tpls/AyNUAsoONkU81AP0RA6y6Vw==", - "requires": { - "hoist-non-react-statics": "^2.2.1", - "invariant": "^2.0.0", - "lodash": "^4.2.0", - "lodash-es": "^4.2.0", - "loose-envify": "^1.1.0", - "prop-types": "^15.5.10" - } - }, - "react-resize-detector": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-4.1.4.tgz", - "integrity": "sha512-aceA2+5BtNjcbnmF0PzxPsBZhvM1rPKWWglxcx1TUIQI3Lng4DtB2ipLJ3o0w2LAbCbtWCFyO3EctikJzTowNQ==", - "dev": true, - "requires": { - "lodash": "^4.17.11", - "lodash-es": "^4.17.11", - "prop-types": "^15.7.2", - "raf-schd": "^4.0.0", - "resize-observer-polyfill": "^1.5.1" - }, - "dependencies": { - "lodash-es": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.11.tgz", - "integrity": "sha512-DHb1ub+rMjjrxqlB3H56/6MXtm1lSksDp2rA2cNWjG8mlDUYFhUj3Di2Zn5IwSU87xLv8tNIQ7sSwE/YOX/D/Q==", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", - "dev": true - } - } - }, - "react-router": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.2.0.tgz", - "integrity": "sha512-DY6pjwRhdARE4TDw7XjxjZsbx9lKmIcyZoZ+SDO7SBJ1KUeWNxT22Kara2AC7u6/c2SYEHlEDLnzBCcNhLE8Vg==", - "requires": { - "history": "^4.7.2", - "hoist-non-react-statics": "^2.3.0", - "invariant": "^2.2.2", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.5.4", - "warning": "^3.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", - "requires": { - "isarray": "0.0.1" - } - } - } - }, - "react-router-dom": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.2.2.tgz", - "integrity": "sha512-cHMFC1ZoLDfEaMFoKTjN7fry/oczMgRt5BKfMAkTu5zEuJvUiPp1J8d0eXSVTnBh6pxlbdqDhozunOOLtmKfPA==", - "requires": { - "history": "^4.7.2", - "invariant": "^2.2.2", - "loose-envify": "^1.3.1", - "prop-types": "^15.5.4", - "react-router": "^4.2.0", - "warning": "^3.0.0" - } - }, - "react-scrollbar-size": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/react-scrollbar-size/-/react-scrollbar-size-2.1.0.tgz", - "integrity": "sha512-9dDUJvk7S48r0TRKjlKJ9e/LkLLYgc9LdQR6W21I8ZqtSrEsedPOoMji4nU3DHy7fx2l8YMScJS/N7qiloYzXQ==", - "requires": { - "babel-runtime": "^6.26.0", - "prop-types": "^15.6.0", - "react-event-listener": "^0.5.1", - "stifle": "^1.0.2" - } - }, - "react-select": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-1.1.0.tgz", - "integrity": "sha512-c4CdxweEHN9ra85HGWjSjIMBlJ5c0fsIXOymLFZS5UbZEQCiJGHnZTVLTt6/wDh8RKQnxl85gHUwzhG5XZLcyw==", - "requires": { - "classnames": "^2.2.4", - "prop-types": "^15.5.8", - "react-input-autosize": "^2.1.0" - } - }, - "react-simple-file-input": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/react-simple-file-input/-/react-simple-file-input-2.0.1.tgz", - "integrity": "sha1-Fa1P/Hj+sbiCZJrWsBwDPvJ1ceY=", - "requires": { - "prop-types": "^15.5.7" - } - }, - "react-syntax-highlighter": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-8.1.0.tgz", - "integrity": "sha512-G2bkZxmF3VOa4atEdXIDSfwwCqjw6ZQX5znfTaHcErA1WqHIS0o6DaSCDKFPVaOMXQEB9Hf1UySYQvuJmV8CXg==", - "dev": true, - "requires": { - "babel-runtime": "^6.18.0", - "highlight.js": "~9.12.0", - "lowlight": "~1.9.1", - "prismjs": "^1.8.4", - "refractor": "^2.4.1" - } - }, - "react-test-renderer": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-15.6.2.tgz", - "integrity": "sha1-0DM0NPwsQ4CSaWyncNpe1IA376g=", - "dev": true, - "requires": { - "fbjs": "^0.8.9", - "object-assign": "^4.1.0" - } - }, - "react-textarea-autosize": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-5.2.1.tgz", - "integrity": "sha512-bx6z2I35aapr71ggw2yZIA4qhmqeTa4ZVsSaTeFvtf9kfcZppDBh2PbMt8lvbdmzEk7qbSFhAxR9vxEVm6oiMg==", - "dev": true, - "requires": { - "prop-types": "^15.6.0" - } - }, - "react-tippy": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/react-tippy/-/react-tippy-1.2.2.tgz", - "integrity": "sha512-xqmymAhKub1JGtLJ+HncUauBpwJjHAp6EkKBLeGtuhneaGQ3GnRp5aEd/YRNc4NmIb6o1lbf/Z6R9G3/VjnjYA==", - "requires": { - "popper.js": "^1.11.1" - } - }, - "react-toggle-button": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/react-toggle-button/-/react-toggle-button-2.2.0.tgz", - "integrity": "sha1-obkhQ6oN9BRkL8sUHwh59UW8Wok=", - "requires": { - "prop-types": "^15.6.0", - "react-motion": "^0.5.2" - } - }, - "react-tools": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/react-tools/-/react-tools-0.13.3.tgz", - "integrity": "sha1-2mrH1Nd3elml6VHPRucv1La0Ciw=", - "requires": { - "commoner": "^0.10.0", - "jstransform": "^10.1.0" - } - }, - "react-tooltip-component": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/react-tooltip-component/-/react-tooltip-component-0.3.0.tgz", - "integrity": "sha1-+z7HjDJw/pGWkrwx8UBBCLz0eF4=" - }, - "react-transition-group": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.2.1.tgz", - "integrity": "sha512-q54UBM22bs/CekG8r3+vi9TugSqh0t7qcEVycaRc9M0p0aCEu+h6rp/RFiW7fHfgd1IKpd9oILFTl5QK+FpiPA==", - "requires": { - "chain-function": "^1.0.0", - "classnames": "^2.2.5", - "dom-helpers": "^3.2.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.5.8", - "warning": "^3.0.0" - } - }, - "react-trigger-change": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/react-trigger-change/-/react-trigger-change-1.0.2.tgz", - "integrity": "sha1-r1czmOzvJHU2K4T4wIwH/qI5FMM=" - }, - "reactcss": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz", - "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==", - "dev": true, - "requires": { - "lodash": "^4.0.1" - } - }, - "reactify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/reactify/-/reactify-1.1.1.tgz", - "integrity": "sha1-qPEZWWJzwNS/savqDBTCYB6gO7o=", - "requires": { - "react-tools": "~0.13.0", - "through": "~2.3.4" - } - }, - "read-all-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", - "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0", - "readable-stream": "^2.0.0" - } - }, - "read-file-stdin": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/read-file-stdin/-/read-file-stdin-0.2.1.tgz", - "integrity": "sha1-JezP86FTtoCa+ssj7hU4fbng7mE=", - "dev": true, - "requires": { - "gather-stream": "^1.0.0" - } - }, - "read-only-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", - "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "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" - } - }, - "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.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "readable-stream": "^2.0.2", - "set-immediate-shim": "^1.0.1" - } - }, - "readline2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "mute-stream": "0.0.5" - }, - "dependencies": { - "mute-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", - "dev": true - } - } - }, - "recast": { - "version": "0.11.23", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", - "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", - "requires": { - "ast-types": "0.9.6", - "esprima": "~3.1.0", - "private": "~0.1.5", - "source-map": "~0.5.0" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "recompose": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.25.1.tgz", - "integrity": "sha512-EwFAv6UBrHbLIsIKHUZJ+BKdjTmyEsIrRlGO3R7PKu0S7hkgNznVDRvb+1upQUntURtBvxhYnTVQ3AcWOlsmWA==", - "requires": { - "change-emitter": "^0.1.2", - "fbjs": "^0.8.1", - "hoist-non-react-statics": "^2.3.1", - "symbol-observable": "^1.0.4" - } - }, - "recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", - "dev": true, - "requires": { - "minimatch": "3.0.4" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "redux": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", - "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", - "requires": { - "lodash": "^4.2.1", - "lodash-es": "^4.2.1", - "loose-envify": "^1.1.0", - "symbol-observable": "^1.0.3" - } - }, - "redux-logger": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz", - "integrity": "sha1-91VZZvMJjzyIYExEnPC69XeCdL8=", - "requires": { - "deep-diff": "^0.3.5" - } - }, - "redux-mock-store": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/redux-mock-store/-/redux-mock-store-1.5.3.tgz", - "integrity": "sha512-ryhkkb/4D4CUGpAV2ln1GOY/uh51aczjcRz9k2L2bPx/Xja3c5pSGJJPyR25GNVRXtKIExScdAgFdiXp68GmJA==", - "dev": true, - "requires": { - "lodash.isplainobject": "^4.0.6" - } - }, - "redux-test-utils": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/redux-test-utils/-/redux-test-utils-0.2.2.tgz", - "integrity": "sha512-+YsUHpzZJ7G85wYgllmGLJ75opIlWrCuKThaVTsHW5xLOrzaLE4abQ3AbYcHkx/vFOReG2D8XUwMfGnFKH8hGw==", - "dev": true - }, - "redux-thunk": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.2.0.tgz", - "integrity": "sha1-5hWhbha0ehmlFXZhM9Hj6Zt4UuU=" - }, - "refractor": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/refractor/-/refractor-2.9.0.tgz", - "integrity": "sha512-lCnCYvXpqd8hC7ksuvo516rz5q4NwzBbq0X5qjH5pxRfcQKiQxKZ8JctrSQmrR/7pcV2TRrs9TT+Whmq/wtluQ==", - "dev": true, - "requires": { - "hastscript": "^5.0.0", - "parse-entities": "^1.1.2", - "prismjs": "~1.16.0" - }, - "dependencies": { - "parse-entities": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", - "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", - "dev": true, - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - } - } - }, - "regenerate": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==" - }, - "regenerate-unicode-properties": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", - "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - }, - "dependencies": { - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - } - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, - "regex-not": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.0.tgz", - "integrity": "sha1-Qvg+OXcWIt+CawKvF2Ul1qXxV/k=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1" - } - }, - "regex-parser": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.9.tgz", - "integrity": "sha512-VncXxOF6uFlYog5prG2j+e2UGJeam5MfNiJnB/qEgo4KTnMm2XrELCg4rNZ6IlaEUZnGlb8aB6lXowCRQtTkkA==", - "dev": true - }, - "regexp-tree": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.10.tgz", - "integrity": "sha512-K1qVSbcedffwuIslMwpe6vGlj+ZXRnGkvjAtFHfDZZZuEdA/h0dxljAPu9vhUo6Rrx2U2AwJ+nSQ6hK+lrP5MQ==", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", - "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", - "dev": true, - "requires": { - "define-properties": "^1.1.2" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "registry-auth-token": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", - "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", - "dev": true, - "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "dev": true, - "requires": { - "rc": "^1.0.1" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - } - } - }, - "rehype-parse": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.0.tgz", - "integrity": "sha512-V2OjMD0xcSt39G4uRdMTqDXXm6HwkUbLMDayYKA/d037j8/OtVSQ+tqKwYWOuyBeoCs/3clXRe30VUjeMDTBSA==", - "dev": true, - "requires": { - "hast-util-from-parse5": "^5.0.0", - "parse5": "^5.0.0", - "xtend": "^4.0.1" - }, - "dependencies": { - "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", - "dev": true - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "relaxed-json": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/relaxed-json/-/relaxed-json-1.0.3.tgz", - "integrity": "sha512-b7wGPo7o2KE/g7SqkJDDbav6zmrEeP4TK2VpITU72J/M949TLe/23y/ZHJo+pskcGM52xIfFoT9hydwmgr1AEg==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "commander": "^2.6.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - } - }, - "remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "dev": true, - "requires": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "renderkid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", - "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", - "dev": true, - "requires": { - "css-select": "^1.1.0", - "dom-converter": "^0.2", - "htmlparser2": "^3.3.0", - "strip-ansi": "^3.0.0", - "utila": "^0.4.0" - } - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "requires": { - "is-finite": "^1.0.0" - } - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "replace-homedir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", - "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" - } - }, - "replaceall": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/replaceall/-/replaceall-0.1.6.tgz", - "integrity": "sha1-gdgax663LX9cSUKt8ml6MiBojY4=", - "dev": true - }, - "replacestream": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", - "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.3", - "object-assign": "^4.0.1", - "readable-stream": "^2.0.2" - } - }, - "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", - "requires": { - "aws-sign2": "~0.7.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.3.1", - "har-validator": "~5.0.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", - "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" - }, - "dependencies": { - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" - } - } - }, - "request-progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", - "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", - "dev": true, - "optional": true, - "requires": { - "throttleit": "^1.0.0" - } - }, - "request-promise": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.2.tgz", - "integrity": "sha1-0epG1lSm7k+O5qT+oQGMIpEZBLQ=", - "requires": { - "bluebird": "^3.5.0", - "request-promise-core": "1.1.1", - "stealthy-require": "^1.1.0", - "tough-cookie": ">=2.3.3" - } - }, - "request-promise-core": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", - "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", - "requires": { - "lodash": "^4.13.1" - } - }, - "request-promise-native": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", - "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", - "dev": true, - "requires": { - "request-promise-core": "1.1.1", - "stealthy-require": "^1.1.0", - "tough-cookie": ">=2.3.3" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "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=" - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - } - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "requizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.2.tgz", - "integrity": "sha512-oJ6y7JcUJkblRGhMByGNcszeLgU0qDxNKFCiUZR1XyzHyVsev+Mxb1tyygxLd1ORsKee1SA5BInFdUwY64GE/A==", - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - }, - "reselect": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-3.0.1.tgz", - "integrity": "sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc=" - }, - "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 - }, - "resolve": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", - "requires": { - "path-parse": "^1.0.5" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - }, - "resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", - "dev": true, - "requires": { - "value-or-function": "^3.0.0" - } - }, - "resolve-pathname": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", - "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "resolve-url-loader": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-2.3.0.tgz", - "integrity": "sha512-RaEUWgF/B6aTg9VKaOv2o6dfm5f75/lGh8S+SQwoMcBm48WkA2nhLR+V7KEawkxXjU4lLB16IVeHCe7F69nyVw==", - "dev": true, - "requires": { - "adjust-sourcemap-loader": "^1.1.0", - "camelcase": "^4.1.0", - "convert-source-map": "^1.5.1", - "loader-utils": "^1.1.0", - "lodash.defaults": "^4.0.0", - "rework": "^1.0.1", - "rework-visit": "^1.0.0", - "source-map": "^0.5.7", - "urix": "^0.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "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==", - "dev": true - }, - "rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", - "dev": true, - "requires": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" - }, - "dependencies": { - "convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", - "dev": true - } - } - }, - "rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=", - "dev": true - }, - "rfdc": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", - "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", - "dev": true - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "requires": { - "glob": "^7.0.5" - } - }, - "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.0", - "inherits": "^2.0.1" - } - }, - "rlp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.0.0.tgz", - "integrity": "sha1-nbOE/0uJqPYVY9kjldhiWxjzr7A=" - }, - "rst-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", - "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", - "dev": true, - "requires": { - "lodash.flattendeep": "^4.4.0", - "nearley": "^2.7.10" - } - }, - "rtcpeerconnection-shim": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/rtcpeerconnection-shim/-/rtcpeerconnection-shim-1.2.13.tgz", - "integrity": "sha512-Xz4zQLZNs9lFBvqbaHGIjLWtyZ1V82ec5r+WNEo7NlIx3zF5M3ytn9mkkfYeZmpE032cNg3Vvf0rP8kNXUNd9w==", - "requires": { - "sdp": "^2.6.0" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rustbn.js": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.1.1.tgz", - "integrity": "sha512-+Xq0RaL+HEErm4vaTUSWq8uq94OuzOu2UR16LowDvj/C8gclDsoYGp8hKpmakKW2dKqL433v2tkf8HCa2za+Eg==" - }, - "rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "requires": { - "rx-lite": "*" - } - }, - "rxjs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", - "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "safe-event-emitter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz", - "integrity": "sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==", - "requires": { - "events": "^3.0.0" - }, - "dependencies": { - "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==" - } - } - }, - "safe-json-parse": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", - "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "samsam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", - "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", - "dev": true - }, - "sass-graph": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", - "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^7.0.0" - }, - "dependencies": { - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "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.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - } - }, - "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "dev": true, - "requires": { - "camelcase": "^3.0.0" - } - } - } - }, - "sass-loader": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.0.1.tgz", - "integrity": "sha512-MeVVJFejJELlAbA7jrRchi88PGP6U9yIfqyiG+bBC4a9s2PX+ulJB9h8bbEohtPBfZmlLhNZ0opQM9hovRXvlw==", - "dev": true, - "requires": { - "clone-deep": "^2.0.1", - "loader-utils": "^1.0.1", - "lodash.tail": "^4.1.1", - "neo-async": "^2.5.0", - "pify": "^3.0.0" - }, - "dependencies": { - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" - } - } - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "scheduler": { - "version": "0.13.6", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz", - "integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "schema-utils": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", - "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - }, - "dependencies": { - "ajv": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", - "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", - "dev": true, - "requires": { - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0", - "uri-js": "^3.0.2" - } - }, - "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", - "dev": true - } - } - }, - "scroll": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/scroll/-/scroll-2.0.3.tgz", - "integrity": "sha512-3ncZzf8gUW739h3LeS68nSssO60O+GGjT3SxzgofQmT8PIoyHzebql9HHPJopZX8iT6TKOdwaWFMqL6LzUN3DQ==", - "requires": { - "rafl": "~1.2.1" - } - }, - "scrollbarwidth": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/scrollbarwidth/-/scrollbarwidth-0.1.3.tgz", - "integrity": "sha1-Gw3mTiiMOMQn9KAf4ApGKgS5T98=", - "dev": true - }, - "scrypt": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/scrypt/-/scrypt-6.0.3.tgz", - "integrity": "sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0=", - "requires": { - "nan": "^2.0.8" - } - }, - "scrypt.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.2.0.tgz", - "integrity": "sha1-r40UZbcemZARC+38WTuUeeA6ito=", - "requires": { - "scrypt": "^6.0.2", - "scryptsy": "^1.2.1" - } - }, - "scryptsy": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz", - "integrity": "sha1-oyJfpLJST4AnAHYeKFW987LZIWM=", - "requires": { - "pbkdf2": "^3.0.3" - } - }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "dev": true, - "requires": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "sdp": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/sdp/-/sdp-2.8.0.tgz", - "integrity": "sha512-wRSES07rAwKWAR7aev9UuClT7kdf9ZTdeUK5gTgHue9vlhs19Fbm3ccNEGJO4y2IitH4/JzS4sdzyPl6H2KQLw==" - }, - "secp256k1": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.4.0.tgz", - "integrity": "sha512-eC120ESQ6MB3gMkxj0PVcSjv/9VtSUmm9uPGNc58yTs93iMCUQZ1xeGPidQMY1z1O4psbCtOxRu3vNqpbuck6Q==", - "requires": { - "bindings": "^1.2.1", - "bip66": "^1.1.3", - "bn.js": "^4.11.3", - "create-hash": "^1.1.2", - "drbg.js": "^1.0.1", - "elliptic": "^6.2.3", - "nan": "^2.2.1", - "safe-buffer": "^5.1.0" - } - }, - "secure-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", - "integrity": "sha1-8MgtmKOxOah3aogIBQuCRDEIf8o=", - "dev": true - }, - "select": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", - "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", - "dev": true, - "optional": true - }, - "selenium-webdriver": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", - "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", - "dev": true, - "requires": { - "jszip": "^3.1.3", - "rimraf": "^2.5.4", - "tmp": "0.0.30", - "xml2js": "^0.4.17" - }, - "dependencies": { - "tmp": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", - "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.1" - } - } - } - }, - "semaphore": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", - "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==" - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" - }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "dev": true, - "requires": { - "semver": "^5.0.3" - } - }, - "semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", - "dev": true, - "requires": { - "sver-compat": "^1.5.0" - } - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", - "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==", - "dev": true - }, - "serve-favicon": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", - "integrity": "sha1-k10kDN/g9YBTB/3+ln2IlCosvPA=", - "dev": true, - "requires": { - "etag": "~1.8.1", - "fresh": "0.5.2", - "ms": "2.1.1", - "parseurl": "~1.3.2", - "safe-buffer": "5.1.1" - }, - "dependencies": { - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - }, - "dependencies": { - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - } - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" - }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "sha.js": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", - "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", - "requires": { - "inherits": "^2.0.1", - "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": "1.0.0", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", - "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", - "dev": true, - "requires": { - "is-extendable": "^0.1.1", - "kind-of": "^5.0.0", - "mixin-object": "^2.0.1" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "shallow-copy": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", - "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=", - "dev": true - }, - "shallow-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.1.0.tgz", - "integrity": "sha512-0SW1nWo1hnabO62SEeHsl8nmTVVEzguVWZCj5gaQrgWAxz/BaCja4OWdJBWLVPDxdtE/WU7c98uUCCXyPHSCvw==", - "dev": true - }, - "shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "dev": true - }, - "shasum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", - "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", - "dev": true, - "requires": { - "json-stable-stringify": "~0.0.0", - "sha.js": "~2.4.4" - }, - "dependencies": { - "json-stable-stringify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", - "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - } - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shell-parallel": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/shell-parallel/-/shell-parallel-1.0.3.tgz", - "integrity": "sha512-h8uh4DChqYYstF2QXEyU1DaWIy0S9MaeH1HHWQfV91BV2ORJftRw3XjJtVHL9GopTpKXvTUYJ6uvcdwkxSFr9w==", - "dev": true, - "requires": { - "once": "^1.4.0", - "pify": "^3.0.0", - "ps-tree": "^1.1.0", - "yargs": "^11.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.0.0.tgz", - "integrity": "sha512-nY3W5Gu2racvdDk//ELReY+dHjb9PlIcVDFXP72nVIhq2Gy3LuVXYwJoPVudwQnv1shtohpgkdCKT2YaKY0CKw==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "yargs": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.0.0.tgz", - "integrity": "sha512-Rjp+lMYQOWtgqojx1dEWorjCofi1YN7AoFvYV7b1gx/7dAAeuI4kN5SZiEvr0ZmsZTOpDRcCqrpI10L31tFkBw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - } - }, - "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "dev": true, - "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" - } - }, - "shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", - "dev": true - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", - "dev": true - }, - "simplebar": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/simplebar/-/simplebar-4.0.0.tgz", - "integrity": "sha512-td6vJVhqIXfa3JgNZR5OgETPLfmHNSSpt+OXIbk6WH/nOrUtX3Qcyio30+5rdxxAV/61+F5eJ4jJV4Ek7/KJYQ==", - "dev": true, - "requires": { - "can-use-dom": "^0.1.0", - "core-js": "^3.0.1", - "lodash.debounce": "^4.0.8", - "lodash.memoize": "^4.1.2", - "lodash.throttle": "^4.1.1", - "resize-observer-polyfill": "^1.5.1", - "scrollbarwidth": "^0.1.3" - }, - "dependencies": { - "core-js": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.3.tgz", - "integrity": "sha512-PWZ+ZfuaKf178BIAg+CRsljwjIMRV8MY00CbZczkR6Zk5LfkSkjGoaab3+bqRQWVITNZxQB7TFYz+CFcyuamvA==", - "dev": true - } - } - }, - "simplebar-react": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simplebar-react/-/simplebar-react-1.0.0.tgz", - "integrity": "sha512-FbM2yn7D/UzrJGCY60CKeLkZ3gOs7tYr7KmyamteUt9SKh2x4yW5KVM4IQBw86x4ofRoD6FT19MWmfMKv4Onhw==", - "dev": true, - "requires": { - "prop-types": "^15.6.1", - "simplebar": "^4.0.0" - } - }, - "single-call-balance-checker-abi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/single-call-balance-checker-abi/-/single-call-balance-checker-abi-1.0.0.tgz", - "integrity": "sha512-T5fRBJHmGEMe76JFGB36gcZnOh1ip2S7Qsp7cwmwrfMRjadxTe02zJHtXERpnQf2yvSqNWRxvae5f6e8v4rhng==" - }, - "sinon": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-5.0.0.tgz", - "integrity": "sha512-dMX7ZB2E1iQ5DOEOePoNJQp03uyhdMfb+kLXlNPbquv2FwfezD+0GbbHSgCw4MFhpSSS9NMoYJfOPMjCMJtXWA==", - "dev": true, - "requires": { - "diff": "^3.1.0", - "formatio": "1.2.0", - "lodash.get": "^4.4.2", - "lolex": "^2.2.0", - "nise": "^1.2.0", - "supports-color": "^4.4.0", - "type-detect": "^4.0.5" - }, - "dependencies": { - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } - } - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - } - } - }, - "smart-buffer": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", - "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=" - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "use": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", - "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - } - }, - "snyk": { - "version": "1.173.0", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.173.0.tgz", - "integrity": "sha512-VZZYZ9tB3QoCWN8yx/zs9O4xrI2ROc9pgM4GzKxfntMRhNMXT+qhIqt2bOOaQ3XNrq45SaHnRZesDnDfYUQV/g==", - "dev": true, - "requires": { - "@snyk/dep-graph": "1.4.1", - "@snyk/gemfile": "1.2.0", - "abbrev": "^1.1.1", - "ansi-escapes": "^4.1.0", - "chalk": "^2.4.2", - "configstore": "^3.1.2", - "debug": "^3.1.0", - "diff": "^4.0.1", - "git-url-parse": "11.1.2", - "glob": "^7.1.3", - "inquirer": "^6.2.2", - "lodash": "^4.17.11", - "needle": "^2.2.4", - "opn": "^5.5.0", - "os-name": "^3.0.0", - "proxy-agent": "^3.1.0", - "proxy-from-env": "^1.0.0", - "semver": "^6.0.0", - "snyk-config": "^2.2.1", - "snyk-docker-plugin": "1.25.0", - "snyk-go-plugin": "1.9.0", - "snyk-gradle-plugin": "2.12.0", - "snyk-module": "1.9.1", - "snyk-mvn-plugin": "2.3.0", - "snyk-nodejs-lockfile-parser": "1.13.0", - "snyk-nuget-plugin": "1.10.0", - "snyk-php-plugin": "1.5.3", - "snyk-policy": "1.13.5", - "snyk-python-plugin": "1.10.1", - "snyk-resolve": "1.0.1", - "snyk-resolve-deps": "4.0.3", - "snyk-sbt-plugin": "2.2.0", - "snyk-tree": "^1.0.0", - "snyk-try-require": "1.3.1", - "source-map-support": "^0.5.11", - "strip-ansi": "^5.2.0", - "tempfile": "^2.0.0", - "then-fs": "^2.0.0", - "update-notifier": "^2.5.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "ansi-escapes": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.1.0.tgz", - "integrity": "sha512-2VY/iCUZTDLD/qxptS3Zn3c6k2MeIbYqjRXqM8T5oC7N2mMjh3xIU3oYru6cHGbldFa9h5i8N0fP65UaUqrMWA==", - "dev": true, - "requires": { - "type-fest": "^0.3.0" - } - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "diff": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", - "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", - "dev": true - }, - "external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "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" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "inquirer": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", - "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.11", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - } - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "pac-proxy-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-3.0.0.tgz", - "integrity": "sha512-AOUX9jES/EkQX2zRz0AW7lSx9jD//hQS8wFXBvcnd/J2Py9KaMJMqV/LPqJssj1tgGufotb2mmopGPR15ODv1Q==", - "dev": true, - "requires": { - "agent-base": "^4.2.0", - "debug": "^3.1.0", - "get-uri": "^2.0.0", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1", - "pac-resolver": "^3.0.0", - "raw-body": "^2.2.0", - "socks-proxy-agent": "^4.0.1" - } - }, - "proxy-agent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.1.0.tgz", - "integrity": "sha512-IkbZL4ClW3wwBL/ABFD2zJ8iP84CY0uKMvBPk/OceQe/cEjrxzN1pMHsLwhbzUoRhG9QbSxYC+Z7LBkTiBNvrA==", - "dev": true, - "requires": { - "agent-base": "^4.2.0", - "debug": "^3.1.0", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1", - "lru-cache": "^4.1.2", - "pac-proxy-agent": "^3.0.0", - "proxy-from-env": "^1.0.0", - "socks-proxy-agent": "^4.0.1" - } - }, - "semver": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", - "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", - "dev": true - }, - "smart-buffer": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.2.tgz", - "integrity": "sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw==", - "dev": true - }, - "socks": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.2.tgz", - "integrity": "sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ==", - "dev": true, - "requires": { - "ip": "^1.1.5", - "smart-buffer": "4.0.2" - } - }, - "socks-proxy-agent": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", - "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", - "dev": true, - "requires": { - "agent-base": "~4.2.1", - "socks": "~2.3.2" - }, - "dependencies": { - "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - } - } - }, - "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 - }, - "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - } - } - }, - "snyk-config": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/snyk-config/-/snyk-config-2.2.1.tgz", - "integrity": "sha512-eCsFKHHE4J2DpD/1NzAtCmkmVDK310OXRtmoW0RlLnld1ESprJ5A/QRJ5Zxx1JbA8gjuwERY5vfUFA8lEJeopA==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "lodash": "^4.17.11", - "nconf": "^0.10.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "snyk-docker-plugin": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/snyk-docker-plugin/-/snyk-docker-plugin-1.25.0.tgz", - "integrity": "sha512-vJY7KpN+055cehFAmoUUrbdIao8DbeZ6qU+PLanJ5VkLWHmonEMrhptIy134oagHewb4P2ZfpvdKxGJwGKafDw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "dockerfile-ast": "0.0.16", - "semver": "^6.1.0", - "tslib": "^1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "semver": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", - "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", - "dev": true - } - } - }, - "snyk-go-parser": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/snyk-go-parser/-/snyk-go-parser-1.3.0.tgz", - "integrity": "sha512-qXzmvPyehnrqXMqROtM2PqkvRG7AEBPDDOAywxHdumgDgMPOwOQOZj9t94halDlqb3qVTYgNTupox9kg0tqovA==", - "dev": true, - "requires": { - "toml": "^3.0.0", - "tslib": "^1.9.3" - } - }, - "snyk-go-plugin": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/snyk-go-plugin/-/snyk-go-plugin-1.9.0.tgz", - "integrity": "sha512-8keL4KKHZUXHK2R9DSaejzs4/UPokT1LsSLBxNsqxC9PJ8JSfXIErNmUCyZbCraVt3TPUbUyAfIYoekhokMgpQ==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "graphlib": "^2.1.1", - "snyk-go-parser": "1.3.0", - "tmp": "0.0.33" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "snyk-gradle-plugin": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/snyk-gradle-plugin/-/snyk-gradle-plugin-2.12.0.tgz", - "integrity": "sha512-9J3wiqbd/CR6MbmqRfmXxvlGdQHo9cINwxsAoLKTErexGMXzlrEUVUiQ5F3XzUNajVCn+Kf9ukZdsLJF3JhA8A==", - "dev": true, - "requires": { - "@types/debug": "^4.1.4", - "chalk": "^2.4.2", - "clone-deep": "^0.3.0", - "debug": "^4.1.1", - "tmp": "0.0.33", - "tslib": "^1.9.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "clone-deep": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.3.0.tgz", - "integrity": "sha1-NIxhrpzb4O3+BT2R/0zFIdeQ7eg=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "is-plain-object": "^2.0.1", - "kind-of": "^3.2.2", - "shallow-clone": "^0.1.2" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "shallow-clone": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", - "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", - "dev": true, - "requires": { - "is-extendable": "^0.1.1", - "kind-of": "^2.0.1", - "lazy-cache": "^0.2.3", - "mixin-object": "^2.0.1" - }, - "dependencies": { - "kind-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", - "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", - "dev": true, - "requires": { - "is-buffer": "^1.0.2" - } - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "snyk-module": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/snyk-module/-/snyk-module-1.9.1.tgz", - "integrity": "sha512-A+CCyBSa4IKok5uEhqT+hV/35RO6APFNLqk9DRRHg7xW2/j//nPX8wTSZUPF8QeRNEk/sX+6df7M1y6PBHGSHA==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "hosted-git-info": "^2.7.1" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "snyk-mvn-plugin": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/snyk-mvn-plugin/-/snyk-mvn-plugin-2.3.0.tgz", - "integrity": "sha512-LOSiJu+XUPVqKCXcnQPLhlyTGm3ikDwjvYw5fpiEnvjMWkMDd8IfzZqulqreebJDmadUpP7Cn0fabfx7TszqxA==", - "dev": true, - "requires": { - "lodash": "4.17.11", - "tslib": "1.9.3" - } - }, - "snyk-nodejs-lockfile-parser": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.13.0.tgz", - "integrity": "sha512-fC1o9SJ+iM+IYeBUYtvCIYh005WAvWMzqhEH3hI4zGPdCYQqGYIfVpXf29aCOKoorkTR345k5g6Etx54+BbrTQ==", - "dev": true, - "requires": { - "@yarnpkg/lockfile": "^1.0.2", - "graphlib": "^2.1.5", - "lodash": "^4.17.11", - "source-map-support": "^0.5.7", - "tslib": "^1.9.3", - "uuid": "^3.3.2" - }, - "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 - }, - "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - } - } - }, - "snyk-nuget-plugin": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/snyk-nuget-plugin/-/snyk-nuget-plugin-1.10.0.tgz", - "integrity": "sha512-V69AIWcHw4KrgEFC8kNWoqHo54wZkWGfqyVv+kJjQxARWYmQqV4YL/vxfLAoZ7mDsNXgjPn5M4ZEaeHFCeWcyA==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "jszip": "^3.1.5", - "lodash": "^4.17.10", - "snyk-paket-parser": "1.4.3", - "xml2js": "^0.4.17" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "snyk-paket-parser": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/snyk-paket-parser/-/snyk-paket-parser-1.4.3.tgz", - "integrity": "sha512-6m736zGVoeT/zS9KEtlmqTSPEPjAfLe8iYoQ3AwbyxDhzuLY49lTaV67MyZtGwjhi1x4KBe+XOgeWwyf6Avf/A==", - "dev": true, - "requires": { - "tslib": "^1.9.3" - } - }, - "snyk-php-plugin": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/snyk-php-plugin/-/snyk-php-plugin-1.5.3.tgz", - "integrity": "sha512-iZB3UpleLbeOL1D1bNLMFfh5hSflbQnepxmtXxXSD3S+euAhqJTZz/26QrsUIAtLQ2eHl3LfAXGTp6131tWyGw==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "lodash": "^4.17.5" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "snyk-policy": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/snyk-policy/-/snyk-policy-1.13.5.tgz", - "integrity": "sha512-KI6GHt+Oj4fYKiCp7duhseUj5YhyL/zJOrrJg0u6r59Ux9w8gmkUYT92FHW27ihwuT6IPzdGNEuy06Yv2C9WaQ==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "email-validator": "^2.0.4", - "js-yaml": "^3.13.1", - "lodash.clonedeep": "^4.5.0", - "semver": "^6.0.0", - "snyk-module": "^1.9.1", - "snyk-resolve": "^1.0.1", - "snyk-try-require": "^1.3.1", - "then-fs": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "semver": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", - "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", - "dev": true - } - } - }, - "snyk-python-plugin": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/snyk-python-plugin/-/snyk-python-plugin-1.10.1.tgz", - "integrity": "sha512-1UAYRBTgnHgzPyX/PUAh9Wb9Udp6Q162IAfftK9uhN1o+KVN3RzsP/jeR0MhOXqECu7f4eABUv4rh+bn25/3hw==", - "dev": true, - "requires": { - "tmp": "0.0.33" - } - }, - "snyk-resolve": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/snyk-resolve/-/snyk-resolve-1.0.1.tgz", - "integrity": "sha512-7+i+LLhtBo1Pkth01xv+RYJU8a67zmJ8WFFPvSxyCjdlKIcsps4hPQFebhz+0gC5rMemlaeIV6cqwqUf9PEDpw==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "then-fs": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "snyk-resolve-deps": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/snyk-resolve-deps/-/snyk-resolve-deps-4.0.3.tgz", - "integrity": "sha512-GP3VBrkz1iDDw2q8ftTqppHqzIAxmsUIoXR+FRWDKcipkKHXHJyUmtEo11QVT5fNRV0D0RCsssk2S5CTxTCu6A==", - "dev": true, - "requires": { - "ansicolors": "^0.3.2", - "debug": "^3.2.5", - "lodash.assign": "^4.2.0", - "lodash.assignin": "^4.2.0", - "lodash.clone": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.get": "^4.4.2", - "lodash.set": "^4.3.2", - "lru-cache": "^4.0.0", - "semver": "^5.5.1", - "snyk-module": "^1.6.0", - "snyk-resolve": "^1.0.0", - "snyk-tree": "^1.0.0", - "snyk-try-require": "^1.1.1", - "then-fs": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - } - } - }, - "snyk-sbt-plugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/snyk-sbt-plugin/-/snyk-sbt-plugin-2.2.0.tgz", - "integrity": "sha512-me/Su5J0ZVoOag3SrbfezHD6kkFymovGhZ0eK2P3T8607iWAOeGVEIbOXAAwMLSFmv8TpihQeWmnRgrCvPLfKw==", - "dev": true - }, - "snyk-tree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/snyk-tree/-/snyk-tree-1.0.0.tgz", - "integrity": "sha1-D7cxdtvzLngvGRAClBYESPkRHMg=", - "dev": true, - "requires": { - "archy": "^1.0.0" - } - }, - "snyk-try-require": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/snyk-try-require/-/snyk-try-require-1.3.1.tgz", - "integrity": "sha1-bgJvkuZK9/zM6h7lPVJIQeQYohI=", - "dev": true, - "requires": { - "debug": "^3.1.0", - "lodash.clonedeep": "^4.3.0", - "lru-cache": "^4.0.0", - "then-fs": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "socket.io": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", - "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", - "dev": true, - "requires": { - "debug": "~3.1.0", - "engine.io": "~3.2.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.1.1", - "socket.io-parser": "~3.2.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "socket.io-adapter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", - "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", - "dev": true - }, - "socket.io-client": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", - "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", - "dev": true, - "requires": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "engine.io-client": "~3.2.0", - "has-binary2": "~1.0.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "~3.2.0", - "to-array": "0.1.4" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "socket.io-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", - "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } - } - }, - "sockjs-client": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", - "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", - "dev": true, - "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "faye-websocket": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "socks": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", - "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=", - "requires": { - "ip": "^1.1.4", - "smart-buffer": "^1.0.13" - } - }, - "socks-proxy-agent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz", - "integrity": "sha512-ZwEDymm204mTzvdqyUqOdovVr2YRd2NYskrYrF2LXyZ9qDiMAoFESGK8CRphiO7rtbo2Y757k2Nia3x2hGtalA==", - "requires": { - "agent-base": "^4.1.0", - "socks": "^1.1.10" - } - }, - "solc": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.24.tgz", - "integrity": "sha512-2xd7Cf1HeVwrIb6Bu1cwY2/TaLRodrppCq3l7rhLimFQgmxptXhTC3+/wesVLpB09F1A2kZgvbMOgH7wvhFnBQ==", - "requires": { - "fs-extra": "^0.30.0", - "memorystream": "^0.3.1", - "require-from-string": "^1.1.0", - "semver": "^5.3.0", - "yargs": "^4.7.1" - }, - "dependencies": { - "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" - } - }, - "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" - } - } - } - }, - "sonic-boom": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-0.7.4.tgz", - "integrity": "sha512-8JRAJg0RxZtFLQMxolwETvWd2JSlH3ZGo/Z4xPxMbpqF14xCgVYPVeFCFOR3zyr3pcfG82QDVj6537Sx5ZWdNw==", - "dev": true, - "requires": { - "flatstr": "^1.0.9" - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", - "dev": true - }, - "source-map": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.2.tgz", - "integrity": "sha512-NDJB/R2BS7YJG0tP9SbE4DKwKj1idLT5RJqfVYZ7dreFX7wulZT3xxVhbYKrQo9n0JkRptl51TrX/5VK3HodMA==", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", - "dev": true, - "requires": { - "atob": "^2.0.0", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "requires": { - "source-map": "^0.5.6" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "space-separated-tokens": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.4.tgz", - "integrity": "sha512-UyhMSmeIqZrQn2UdjYpxEkwY9JUrn8pP+7L4f91zRzOQuI8MF1FGLfYU9DKCYeLdo7LXMxwrX5zKFy7eeeVHuA==", - "dev": true - }, - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", - "dev": true - }, - "spawn-args": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/spawn-args/-/spawn-args-0.2.0.tgz", - "integrity": "sha1-+30L0dcP1DFr2ePew4nmX51jYbs=", - "dev": true - }, - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "requires": { - "spdx-license-ids": "^1.0.2" - } - }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" - }, - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" - }, - "specificity": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.3.2.tgz", - "integrity": "sha512-Nc/QN/A425Qog7j9aHmwOrlwX2e7pNI47ciwxwy4jOlvbbMHkNNJchit+FX+UjF3IAdiaaV5BKeWuDUnws6G1A==", - "dev": true - }, - "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", - "dev": true, - "requires": { - "through": "2" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "split2": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/split2/-/split2-0.2.1.tgz", - "integrity": "sha1-At2smtwD7Au3jBKC7Aecpuha6QA=", - "dev": true, - "requires": { - "through2": "~0.6.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "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=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", - "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true - }, - "static-eval": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", - "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", - "dev": true, - "requires": { - "escodegen": "^1.8.1" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "static-module": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz", - "integrity": "sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==", - "dev": true, - "requires": { - "concat-stream": "~1.6.0", - "convert-source-map": "^1.5.1", - "duplexer2": "~0.1.4", - "escodegen": "~1.9.0", - "falafel": "^2.1.0", - "has": "^1.0.1", - "magic-string": "^0.22.4", - "merge-source-map": "1.0.4", - "object-inspect": "~1.4.0", - "quote-stream": "~1.0.2", - "readable-stream": "~2.3.3", - "shallow-copy": "~0.0.1", - "static-eval": "^2.0.0", - "through2": "~2.0.3" - }, - "dependencies": { - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "object-inspect": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz", - "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==", - "dev": true - } - } - }, - "static-server": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/static-server/-/static-server-2.2.1.tgz", - "integrity": "sha512-j5eeW6higxYNmXMIT8iHjsdiViTpQDthg7o+SHsRtqdbxscdHqBHXwrXjHC8hL3F0Tsu34ApUpDkwzMBPBsrLw==", - "dev": true, - "requires": { - "chalk": "^0.5.1", - "commander": "^2.3.0", - "file-size": "0.0.5", - "mime": "^1.2.11", - "opn": "^5.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", - "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", - "dev": true - }, - "ansi-styles": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", - "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", - "dev": true - }, - "chalk": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", - "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", - "dev": true, - "requires": { - "ansi-styles": "^1.1.0", - "escape-string-regexp": "^1.0.0", - "has-ansi": "^0.1.0", - "strip-ansi": "^0.3.0", - "supports-color": "^0.2.0" - } - }, - "has-ansi": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", - "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", - "dev": true, - "requires": { - "ansi-regex": "^0.2.0" - } - }, - "strip-ansi": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", - "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", - "dev": true, - "requires": { - "ansi-regex": "^0.2.1" - } - }, - "supports-color": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", - "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", - "dev": true - } - } - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" - }, - "stdin": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/stdin/-/stdin-0.0.1.tgz", - "integrity": "sha1-0wQZgarsPf28d6GzjWNy449ftx4=", - "dev": true - }, - "stdout-stream": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", - "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" - }, - "stifle": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stifle/-/stifle-1.0.4.tgz", - "integrity": "sha1-izvN9SQZsKnHnjWtrc5QEjwdjpk=" - }, - "store2": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/store2/-/store2-2.7.1.tgz", - "integrity": "sha512-zzzP5ZY6QWumnAFV6kBRbS44pUMcpZBNER5DWUe1HETlaKXqLcCQxbNu6IHaKr1pUsjuhUGBdOy8sWKmMkL6pQ==", - "dev": true - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", - "dev": true, - "requires": { - "duplexer": "~0.1.1" - } - }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", - "dev": true, - "requires": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - } - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", - "dev": true - }, - "stream-http": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.2.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-parser": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", - "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=", - "dev": true, - "requires": { - "debug": "2" - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "streamroller": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.5.tgz", - "integrity": "sha512-iGVaMcyF5PcUY0cPbW3xFQUXnr9O4RZXNBBjhuLZgrjLO4XCLLGfx4T2sGqygSeylUjwgWRsnNbT9aV0Zb8AYw==", - "dev": true, - "requires": { - "async": "^2.6.2", - "date-format": "^2.0.0", - "debug": "^3.2.6", - "fs-extra": "^7.0.1", - "lodash": "^4.17.11" - }, - "dependencies": { - "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, - "string-convert": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", - "integrity": "sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c=" - }, - "string-template": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", - "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", - "dev": true - }, - "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" - } - }, - "string.prototype.matchall": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-3.0.1.tgz", - "integrity": "sha512-NSiU0ILQr9PQ1SZmM1X327U5LsM+KfDTassJfqN1al1+0iNpKzmQ4BfXOJwRnTEqv8nKJ67mFpqRoPaGWwvy5A==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "regexp.prototype.flags": "^1.2.0" - }, - "dependencies": { - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.0" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - } - } - }, - "string.prototype.padend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", - "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.4.3", - "function-bind": "^1.0.2" - } - }, - "string.prototype.padstart": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.padstart/-/string.prototype.padstart-3.0.0.tgz", - "integrity": "sha1-W8+tOfRkm7LQMSkuGbzwtRDUskI=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.4.3", - "function-bind": "^1.0.2" - } - }, - "string.prototype.trim": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", - "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.0", - "function-bind": "^1.0.2" - } - }, - "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.0" - } - }, - "stringify-object": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.2.2.tgz", - "integrity": "sha512-O696NF21oLiDy8PhpWu8AEqoZHw++QW6mUv0UvKZe8gWSdSvMXkiLufK7OmnP27Dro4GU5kb9U7JIO0mBuCRQg==", - "dev": true, - "requires": { - "get-own-enumerable-property-symbols": "^2.0.1", - "is-obj": "^1.0.1", - "is-regexp": "^1.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" - } - }, - "strip-bom-buf": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-2.0.0.tgz", - "integrity": "sha512-gLFNHucd6gzb8jMsl5QmZ3QgnUJmp7qn4uUSHNwEXumAp7YizoGYw19ZUVfuq4aBOQUtyn2k8X/CwzWB73W2lQ==", - "dev": true, - "requires": { - "is-utf8": "^0.2.1" - } - }, - "strip-bom-stream": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-4.0.0.tgz", - "integrity": "sha512-0ApK3iAkHv6WbgLICw/J4nhwHeDZsBxIIsOD+gHgZICL6SeJ0S9f/WZqemka9cjkTyMN5geId6e8U5WGFAn3cQ==", - "dev": true, - "requires": { - "first-chunk-stream": "^3.0.0", - "strip-bom-buf": "^2.0.0" - } - }, - "strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", - "requires": { - "is-hex-prefixed": "1.0.0" - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - }, - "dependencies": { - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - } - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "strip-outer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.2" - } - }, - "strip-url-auth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-url-auth/-/strip-url-auth-1.0.1.tgz", - "integrity": "sha1-IrD6OkE4WzO+PzMVUbu4N/oM164=", - "dev": true - }, - "style-loader": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.21.0.tgz", - "integrity": "sha512-T+UNsAcl3Yg+BsPKs1vd22Fr8sVT+CJMtzqc6LEw9bbJZb43lm9GoeIfUcDEefBSWC0BhYbcdupV1GtI4DGzxg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^0.4.5" - }, - "dependencies": { - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" - } - } - } - }, - "style-search": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=", - "dev": true - }, - "styled_string": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/styled_string/-/styled_string-0.0.1.tgz", - "integrity": "sha1-0ieCvYEpVFm8Tx3xjEutjpTdEko=", - "dev": true - }, - "stylefmt": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/stylefmt/-/stylefmt-5.3.2.tgz", - "integrity": "sha1-MgE0N6pU2MUlPLwQeskU37Xunuo=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "css-color-list": "0.0.1", - "diff": "^3.1.0", - "editorconfig": "^0.13.2", - "globby": "^6.1.0", - "minimist": "^1.2.0", - "postcss": "^5.2.5", - "postcss-scss": "^0.4.0", - "postcss-sorting": "^2.0.1", - "postcss-value-parser": "^3.3.0", - "stdin": "0.0.1", - "stylelint": "^7.5.0", - "stylelint-order": "0.4.x" - }, - "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "stylehacks": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-2.3.2.tgz", - "integrity": "sha1-ZMg+BDimjJ7fRJ6MVSp9mrYAmws=", - "dev": true, - "requires": { - "browserslist": "^1.1.3", - "chalk": "^1.1.1", - "log-symbols": "^1.0.2", - "minimist": "^1.2.0", - "plur": "^2.1.2", - "postcss": "^5.0.18", - "postcss-reporter": "^1.3.3", - "postcss-selector-parser": "^2.0.0", - "read-file-stdin": "^0.2.1", - "text-table": "^0.2.0", - "write-file-stdout": "0.0.2" - }, - "dependencies": { - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "postcss-reporter": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-1.4.1.tgz", - "integrity": "sha1-wTbwpbFhkV83ndN2XGEHX357mvI=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "lodash": "^4.1.0", - "log-symbols": "^1.0.2", - "postcss": "^5.0.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "stylelint": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-7.13.0.tgz", - "integrity": "sha1-ER+Xttpy53XICADWu29fhpmXeF0=", - "dev": true, - "requires": { - "autoprefixer": "^6.0.0", - "balanced-match": "^0.4.0", - "chalk": "^2.0.1", - "colorguard": "^1.2.0", - "cosmiconfig": "^2.1.1", - "debug": "^2.6.0", - "doiuse": "^2.4.1", - "execall": "^1.0.0", - "file-entry-cache": "^2.0.0", - "get-stdin": "^5.0.0", - "globby": "^6.0.0", - "globjoin": "^0.1.4", - "html-tags": "^2.0.0", - "ignore": "^3.2.0", - "imurmurhash": "^0.1.4", - "known-css-properties": "^0.2.0", - "lodash": "^4.17.4", - "log-symbols": "^1.0.2", - "mathml-tag-names": "^2.0.0", - "meow": "^3.3.0", - "micromatch": "^2.3.11", - "normalize-selector": "^0.2.0", - "pify": "^2.3.0", - "postcss": "^5.0.20", - "postcss-less": "^0.14.0", - "postcss-media-query-parser": "^0.2.0", - "postcss-reporter": "^3.0.0", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-scss": "^0.4.0", - "postcss-selector-parser": "^2.1.1", - "postcss-value-parser": "^3.1.1", - "resolve-from": "^3.0.0", - "specificity": "^0.3.0", - "string-width": "^2.0.0", - "style-search": "^0.1.0", - "stylehacks": "^2.3.2", - "sugarss": "^0.2.0", - "svg-tags": "^1.0.0", - "table": "^4.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "autoprefixer": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", - "dev": true, - "requires": { - "browserslist": "^1.7.6", - "caniuse-db": "^1.0.30000634", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^5.2.16", - "postcss-value-parser": "^3.2.3" - } - }, - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true - }, - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" - } - }, - "chalk": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", - "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", - "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "get-stdin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", - "dev": true - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - } - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "stylelint-config-recommended": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-2.1.0.tgz", - "integrity": "sha512-ajMbivOD7JxdsnlS5945KYhvt7L/HwN6YeYF2BH6kE4UCLJR0YvXMf+2j7nQpJyYLZx9uZzU5G1ZOSBiWAc6yA==", - "dev": true - }, - "stylelint-config-standard": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-18.2.0.tgz", - "integrity": "sha512-07x0TaSIzvXlbOioUU4ORkCIM07kyIuojkbSVCyFWNVgXMXYHfhnQSCkqu+oHWJf3YADAnPGWzdJ53NxkoJ7RA==", - "dev": true, - "requires": { - "stylelint-config-recommended": "^2.1.0" - } - }, - "stylelint-order": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-0.4.4.tgz", - "integrity": "sha1-2338oFQbUGIBDH4uIedFeR/AiKw=", - "dev": true, - "requires": { - "lodash": "^4.17.4", - "postcss": "^5.2.16", - "stylelint": "^7.9.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", - "dev": true, - "requires": { - "minimist": "^1.1.0" - } - }, - "sugarss": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-0.2.0.tgz", - "integrity": "sha1-rDQjdWMyfG/4l7ZHQr9q7BkK054=", - "dev": true, - "requires": { - "postcss": "^5.2.4" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "requires": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, - "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==", - "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" - } - } - } - }, - "superagent-proxy": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/superagent-proxy/-/superagent-proxy-1.0.3.tgz", - "integrity": "sha512-79Ujg1lRL2ICfuHUdX+H2MjIw73kB7bXsIkxLwHURz3j0XUmEEEoJ+u/wq+mKwna21Uejsm2cGR3OESA00TIjA==", - "requires": { - "debug": "^3.1.0", - "proxy-agent": "2" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "sver-compat": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", - "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", - "dev": true, - "requires": { - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "svg-tag-names": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/svg-tag-names/-/svg-tag-names-1.1.1.tgz", - "integrity": "sha1-lkGynvcQJe4JTHBD983efZn71Qo=", - "dev": true - }, - "svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", - "dev": true - }, - "swappable-obj-proxy": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/swappable-obj-proxy/-/swappable-obj-proxy-1.1.0.tgz", - "integrity": "sha512-bXbKO85b0YNbZi/61TjRAbNtY49ABKu7rQ4k2+RFXPL7TA2mphttfqAqCeJ+lrlKlkYc5pvm6erFk6vOWJSpdw==" - }, - "symbol-observable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.1.0.tgz", - "integrity": "sha512-dQoid9tqQ+uotGhuTKEY11X4xhyYePVnqGSoSm3OGKh2E8LZ6RPULp1uXTctk33IeERlrRJYoVSBglsL05F5Uw==" - }, - "symbol-tree": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", - "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", - "dev": true - }, - "symbol.prototype.description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/symbol.prototype.description/-/symbol.prototype.description-1.0.0.tgz", - "integrity": "sha512-I9mrbZ5M96s7QeJDv95toF1svkUjeBybe8ydhY7foPaBmr0SPJMFupArmMkDrOKTTj0sJVr+nvQNxWLziQ7nDQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.0" - } - }, - "synesthesia": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/synesthesia/-/synesthesia-1.0.1.tgz", - "integrity": "sha1-XvlepUjA1cbm+btLDQcx3/hkp3c=", - "dev": true, - "requires": { - "css-color-names": "0.0.3" - }, - "dependencies": { - "css-color-names": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.3.tgz", - "integrity": "sha1-3gzvFvTYqoIioyDVttfpu62nufY=", - "dev": true - } - } - }, - "syntax-error": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", - "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", - "dev": true, - "requires": { - "acorn-node": "^1.2.0" - } - }, - "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", - "dev": true, - "requires": { - "ajv": "^5.2.3", - "ajv-keywords": "^2.1.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.1.0", - "escape-string-regexp": "^1.0.5", - "supports-color": "^4.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } - } - } - }, - "taffydb": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", - "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=", - "dev": true - }, - "tap-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-7.0.0.tgz", - "integrity": "sha512-05G8/LrzqOOFvZhhAk32wsGiPZ1lfUrl+iV7+OkKgfofZxiceZWMHkKmow71YsyVQ8IvGBP2EjcIjE5gL4l5lA==", - "dev": true, - "requires": { - "events-to-array": "^1.0.1", - "js-yaml": "^3.2.7", - "minipass": "^2.2.0" - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "tape": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/tape/-/tape-4.8.0.tgz", - "integrity": "sha512-TWILfEnvO7I8mFe35d98F6T5fbLaEtbFTG/lxWvid8qDfFTxt19EBijWmB4j3+Hoh5TfHE2faWs73ua+EphuBA==", - "requires": { - "deep-equal": "~1.0.1", - "defined": "~1.0.0", - "for-each": "~0.3.2", - "function-bind": "~1.1.0", - "glob": "~7.1.2", - "has": "~1.0.1", - "inherits": "~2.0.3", - "minimist": "~1.2.0", - "object-inspect": "~1.3.0", - "resolve": "~1.4.0", - "resumer": "~0.0.0", - "string.prototype.trim": "~1.1.2", - "through": "~2.3.8" - } - }, - "tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" - }, - "dependencies": { - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - } - } - }, - "telejson": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/telejson/-/telejson-2.2.1.tgz", - "integrity": "sha512-JtFAnITek+Z9t+uQjVl4Fxur9Z3Bi3flytBLc3KZVXmMUHLXdtAxiP0g8IBkHvKn1kQIYZC57IG0jjGH1s64HQ==", - "dev": true, - "requires": { - "global": "^4.3.2", - "is-function": "^1.0.1", - "is-regex": "^1.0.4", - "is-symbol": "^1.0.2", - "isobject": "^3.0.1", - "lodash.get": "^4.4.2", - "memoizerific": "^1.11.3" - }, - "dependencies": { - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.0" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", - "dev": true - }, - "tempfile": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", - "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=", - "dev": true, - "requires": { - "temp-dir": "^1.0.0", - "uuid": "^3.0.1" - }, - "dependencies": { - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - } - } - }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "dev": true, - "requires": { - "execa": "^0.7.0" - }, - "dependencies": { - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - } - } - }, - "terser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.0.0.tgz", - "integrity": "sha512-dOapGTU0hETFl1tCo4t56FN+2jffoKyER9qBGoUFyZ6y7WLoKT0bF+lAYi6B6YsILcGF3q1C2FBh8QcKSCgkgA==", - "dev": true, - "requires": { - "commander": "^2.19.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.10" - }, - "dependencies": { - "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "dev": true - }, - "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 - }, - "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "terser-webpack-plugin": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.3.0.tgz", - "integrity": "sha512-W2YWmxPjjkUcOWa4pBEv4OP4er1aeQJlSo2UhtCFQCuRXEHjOFscO8VyWHj9JLlA0RzQb8Y2/Ta78XZvT54uGg==", - "dev": true, - "requires": { - "cacache": "^11.3.2", - "find-cache-dir": "^2.0.0", - "is-wsl": "^1.1.0", - "loader-utils": "^1.2.3", - "schema-utils": "^1.0.0", - "serialize-javascript": "^1.7.0", - "source-map": "^0.6.1", - "terser": "^4.0.0", - "webpack-sources": "^1.3.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - }, - "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 - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - } - } - }, - "testem": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/testem/-/testem-2.16.0.tgz", - "integrity": "sha512-yDuRp2f1wP1/1kCtSNzowHxPvtHBhJpSPQUy1py9LtFrZUliJQfUHU8402Ac6C4l9KOb5I+heMMVWRyYdPOu4g==", - "dev": true, - "requires": { - "backbone": "^1.1.2", - "bluebird": "^3.4.6", - "charm": "^1.0.0", - "commander": "^2.6.0", - "consolidate": "^0.15.1", - "execa": "^1.0.0", - "express": "^4.10.7", - "fireworm": "^0.7.0", - "glob": "^7.0.4", - "http-proxy": "^1.13.1", - "js-yaml": "^3.2.5", - "lodash.assignin": "^4.1.0", - "lodash.castarray": "^4.4.0", - "lodash.clonedeep": "^4.4.1", - "lodash.find": "^4.5.1", - "lodash.uniqby": "^4.7.0", - "mkdirp": "^0.5.1", - "mustache": "^3.0.0", - "node-notifier": "^5.0.1", - "npmlog": "^4.0.0", - "printf": "^0.5.1", - "rimraf": "^2.4.4", - "socket.io": "^2.1.0", - "spawn-args": "^0.2.0", - "styled_string": "0.0.1", - "tap-parser": "^7.0.0", - "tmp": "0.0.33", - "xmldom": "^0.1.19" - } - }, - "text-encoding": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", - "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=" - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "textarea-caret": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/textarea-caret/-/textarea-caret-3.0.2.tgz", - "integrity": "sha1-82DEhpmqGr9xhoCkOjGoUGZcLK8=" - }, - "textextensions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-1.0.2.tgz", - "integrity": "sha1-ZUhjk+4fK7A5pgy7oFsLaL2VAdI=", - "dev": true - }, - "theming": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/theming/-/theming-1.3.0.tgz", - "integrity": "sha512-ya5Ef7XDGbTPBv5ENTwrwkPUexrlPeiAg/EI9kdlUAZhNlRbCdhMKRgjNX1IcmsmiPcqDQZE6BpSaH+cr31FKw==", - "requires": { - "brcast": "^3.0.1", - "is-function": "^1.0.1", - "is-plain-object": "^2.0.1", - "prop-types": "^15.5.8" - } - }, - "then-fs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/then-fs/-/then-fs-2.0.0.tgz", - "integrity": "sha1-cveS3Z0xcFqRrhnr/Piz+WjIHaI=", - "dev": true, - "requires": { - "promise": ">=3.2 <8" - } - }, - "thenify": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", - "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", - "dev": true, - "requires": { - "any-promise": "^1.0.0" - }, - "dependencies": { - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true - } - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", - "dev": true, - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, - "throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", - "dev": true, - "optional": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - } - }, - "through2-filter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", - "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, - "thunkify": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", - "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=" - }, - "tildify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", - "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0" - } - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true - }, - "timers-browserify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", - "dev": true, - "requires": { - "process": "~0.11.0" - }, - "dependencies": { - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - } - } - }, - "timers-ext": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.2.tgz", - "integrity": "sha1-YcxHp2wavTGV8UUn+XjViulMUgQ=", - "dev": true, - "requires": { - "es5-ext": "~0.10.14", - "next-tick": "1" - } - }, - "tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", - "dev": true, - "optional": true - }, - "tiny-lr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz", - "integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==", - "dev": true, - "requires": { - "body": "^5.1.0", - "debug": "^3.1.0", - "faye-websocket": "~0.10.0", - "livereload-js": "^2.3.0", - "object-assign": "^4.1.0", - "qs": "^6.4.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "tinycolor2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", - "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - } - }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "to-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.1.tgz", - "integrity": "sha1-FTWL7kosg712N3uh3ASdDxiDeq4=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "regex-not": "^1.0.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - } - } - }, - "to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", - "dev": true, - "requires": { - "through2": "^2.0.3" - } - }, - "toggle-selection": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "toml": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", - "dev": true - }, - "tosource": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tosource/-/tosource-1.0.0.tgz", - "integrity": "sha1-QtiN0RZhi88A1hBt1URvNCeQL/E=", - "dev": true - }, - "tough-cookie": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", - "requires": { - "punycode": "^1.4.1" - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dev": true, - "requires": { - "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", - "dev": true - } - } - }, - "traverse": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=" - }, - "treeify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", - "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==" - }, - "trezor-connect": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/trezor-connect/-/trezor-connect-7.0.3.tgz", - "integrity": "sha512-1Y1ajCDF8dC5d2yrCUmVkNqXeOlucamQ6j6Ko7kaqNdge3g9KZ+O48jUwP/eGzei8oUvPZUHd7o4OhDHTlpLCw==", - "requires": { - "@babel/runtime": "^7.3.1", - "events": "^3.0.0", - "whatwg-fetch": "^3.0.0" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", - "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==" - }, - "regenerator-runtime": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" - }, - "whatwg-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" - } - } - }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.2" - } - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" - }, - "trough": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.1.tgz", - "integrity": "sha1-qf2LA5Swro//guBjOgo2zK1bX4Y=", - "dev": true - }, - "true-case-path": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz", - "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=", - "dev": true, - "requires": { - "glob": "^6.0.4" - }, - "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "ts-custom-error": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ts-custom-error/-/ts-custom-error-2.2.1.tgz", - "integrity": "sha512-lHKZtU+PXkVuap6nlFZybIAFLUO8B3jbCs1VynBL8AUSAHfeG6HpztcBTDRp5I+fN5820N9kGg+eTIvr+le2yg==" - }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "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.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true - }, - "tweetnacl-util": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.0.tgz", - "integrity": "sha1-RXbBzuXi1j0gf+5S8boCgZSAvHU=" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.5.tgz", - "integrity": "sha512-N9IvkQslUGYGC24RkJk1ba99foK6TkwC2FHAEBlQFBP0RxQZS8ZpJuAZcwiY/w9ZJHFQb1aOXBI60OdxhTrwEQ==", - "dev": true - }, - "type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "dependencies": { - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", - "dev": true - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "dev": true, - "requires": { - "mime-db": "1.40.0" - } - } - } - }, - "typed-styles": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", - "integrity": "sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "ua-parser-js": { - "version": "0.7.17", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", - "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==" - }, - "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true - }, - "uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", - "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", - "dev": true, - "requires": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true - }, - "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 - } - } - }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true - }, - "umd": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.1.tgz", - "integrity": "sha1-iuVW4RAR9jwllnCKiDclnwGz1g4=" - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "undeclared-identifiers": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.2.tgz", - "integrity": "sha512-13EaeocO4edF/3JKime9rD7oB6QI8llAGhgn5fKOPyfkJbRb6NFv9pYV6dFEmpa4uRjKeBqLZP8GpuzqHlKDMQ==", - "dev": true, - "requires": { - "acorn-node": "^1.3.0", - "get-assigned-identifiers": "^1.2.0", - "simple-concat": "^1.0.0", - "xtend": "^4.0.1" - } - }, - "underscore": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", - "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=", - "dev": true - }, - "undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", - "dev": true - }, - "unicode-5.2.0": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/unicode-5.2.0/-/unicode-5.2.0-0.7.5.tgz", - "integrity": "sha512-KVGLW1Bri30x00yv4HNM8kBxoqFXr0Sbo55735nvrlsx4PYBZol3UtoWgO492fSwmsetzPEZzy73rbU8OGXJcA==", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", - "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", - "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", - "dev": true - }, - "union": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/union/-/union-0.4.6.tgz", - "integrity": "sha1-GY+9rrolTniLDvy2MLwR8kopWeA=", - "dev": true, - "requires": { - "qs": "~2.3.3" - }, - "dependencies": { - "qs": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz", - "integrity": "sha1-6eha2+ddoLvkyOBHaghikPhjtAQ=", - "dev": true - } - } - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unique-stream": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", - "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", - "dev": true, - "requires": { - "json-stable-stringify": "^1.0.0", - "through2-filter": "^2.0.0" - } - }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "dev": true, - "requires": { - "crypto-random-string": "^1.0.0" - } - }, - "unist-util-stringify-position": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.1.tgz", - "integrity": "sha1-PMvcU2ee7W7PN3fdf14yKcG2qjw=", - "dev": true - }, - "universalify": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", - "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", - "dev": true - }, - "unorm": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.4.1.tgz", - "integrity": "sha1-NkIA1fE2RsqLzURJAnEzVhR5IwA=" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", - "dev": true - }, - "upath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", - "dev": true - }, - "update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", - "dev": true, - "requires": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, - "uri-js": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", - "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", - "dev": true, - "requires": { - "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", - "dev": true - } - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-join": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-2.0.5.tgz", - "integrity": "sha1-WvIvGMBSoACkjXuCxenC4v7tpyg=", - "dev": true - }, - "url-loader": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", - "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "mime": "^2.0.3", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "mime": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.3.tgz", - "integrity": "sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - } - } - }, - "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "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=", - "dev": true, - "requires": { - "prepend-http": "^1.0.1" - } - }, - "user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0" - } - }, - "useragent": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", - "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", - "dev": true, - "requires": { - "lru-cache": "4.1.x", - "tmp": "0.0.x" - } - }, - "utf8": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", - "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" - }, - "v8flags": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.1.tgz", - "integrity": "sha512-iw/1ViSEaff8NJ3HLyEjawk/8hjJib3E7pvG4pddVXfUg1983s3VGsiClDjhK64MQVDGqc1Q8r18S4VKQZS9EQ==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "valid-url": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", - "integrity": "sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=" - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "requires": { - "spdx-correct": "~1.0.0", - "spdx-expression-parse": "~1.0.0" - } - }, - "value-equal": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.4.0.tgz", - "integrity": "sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw==" - }, - "value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "verror": { - "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.2.0" - } - }, - "vfile-message": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.0.0.tgz", - "integrity": "sha512-HPREhzTOB/sNDc9/Mxf8w0FmHnThg5CRSJdR9VRFkD2riqYWs+fuXlj5z8mIpv2LrD7uU41+oPWFOL4Mjlf+dw==", - "dev": true, - "requires": { - "unist-util-stringify-position": "^1.1.1" - } - }, - "vinyl": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", - "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, - "vinyl-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vinyl-buffer/-/vinyl-buffer-1.0.1.tgz", - "integrity": "sha1-lsGjR5uMU5JULGEgKQE7Wyf4i78=", - "dev": true, - "requires": { - "bl": "^1.2.1", - "through2": "^2.0.3" - } - }, - "vinyl-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz", - "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.3.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0", - "strip-bom-stream": "^2.0.0", - "vinyl": "^1.1.0" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, - "first-chunk-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", - "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "strip-bom-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", - "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", - "dev": true, - "requires": { - "first-chunk-stream": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "dev": true, - "requires": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - } - }, - "vinyl-source-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-2.0.0.tgz", - "integrity": "sha1-84pa+53R6Ttl1VBGmsYYKsT1S44=", - "dev": true, - "requires": { - "through2": "^2.0.3", - "vinyl": "^2.1.0" - } - }, - "vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", - "dev": true, - "requires": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" - }, - "dependencies": { - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - } - } - }, - "vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "dev": true, - "requires": { - "source-map": "^0.5.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "vlq": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", - "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", - "dev": true - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } - }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", - "dev": true - }, - "vscode-languageserver-types": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz", - "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==", - "dev": true - }, - "walk-sync": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/walk-sync/-/walk-sync-0.3.1.tgz", - "integrity": "sha1-VYoWrqyMDbWcAotzxm85doTs5GU=", - "dev": true, - "requires": { - "ensure-posix-path": "^1.0.0", - "matcher-collection": "^1.0.0" - } - }, - "warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "watchify": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/watchify/-/watchify-3.11.1.tgz", - "integrity": "sha512-WwnUClyFNRMB2NIiHgJU9RQPQNqVeFk7OmZaWf5dC5EnNa0Mgr7imBydbaJ7tGTuPM2hz1Cb4uiBvK9NVxMfog==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "browserify": "^16.1.0", - "chokidar": "^2.1.1", - "defined": "^1.0.0", - "outpipe": "^1.1.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chokidar": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - } - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "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" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - } - } - } - } - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "dev": true, - "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "weak": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/weak/-/weak-1.0.1.tgz", - "integrity": "sha1-q5mqswcGlZqgIAy4z1RbucszuZ4=", - "optional": true, - "requires": { - "bindings": "^1.2.1", - "nan": "^2.0.5" - } - }, - "web-namespaces": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.3.tgz", - "integrity": "sha512-r8sAtNmgR0WKOKOxzuSgk09JsHlpKlB+uHi937qypOu3PZ17UxPrierFKDye/uNHjNTTEshu5PId8rojIPj/tA==", - "dev": true - }, - "web3": { - "version": "0.20.7", - "resolved": "https://registry.npmjs.org/web3/-/web3-0.20.7.tgz", - "integrity": "sha512-VU6/DSUX93d1fCzBz7WP/SGCQizO1rKZi4Px9j/3yRyfssHyFcZamMw2/sj4E8TlfMXONvZLoforR8B4bRoyTQ==", - "requires": { - "bignumber.js": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", - "crypto-js": "^3.1.4", - "utf8": "^2.1.1", - "xhr2-cookies": "^1.1.0", - "xmlhttprequest": "*" - }, - "dependencies": { - "bignumber.js": { - "version": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", - "from": "git+https://github.com/frozeman/bignumber.js-nolookahead.git" - } - } - }, - "web3-provider-engine": { - "version": "github:metamask/provider-engine#e91367bc2c2535fbf7add06244d9d4ec98620042", - "from": "github:metamask/provider-engine#e91367bc2c2535fbf7add06244d9d4ec98620042", - "requires": { - "async": "^2.5.0", - "backoff": "^2.5.0", - "clone": "^2.0.0", - "cross-fetch": "^2.1.0", - "eth-block-tracker": "^3.0.0", - "eth-json-rpc-infura": "^3.1.0", - "eth-sig-util": "^1.4.2", - "ethereumjs-block": "^1.2.2", - "ethereumjs-tx": "^1.2.0", - "ethereumjs-util": "^5.1.5", - "ethereumjs-vm": "^2.3.4", - "json-rpc-error": "^2.0.0", - "json-stable-stringify": "^1.0.1", - "promise-to-callback": "^1.0.0", - "readable-stream": "^2.2.9", - "request": "^2.85.0", - "semaphore": "^1.0.3", - "ws": "^5.1.1", - "xhr": "^2.2.0", - "xtend": "^4.0.1" - }, - "dependencies": { - "babelify": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } - }, - "eth-block-tracker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz", - "integrity": "sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug==", - "requires": { - "eth-query": "^2.1.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.3", - "ethjs-util": "^0.1.3", - "json-rpc-engine": "^3.6.0", - "pify": "^2.3.0", - "tape": "^4.6.3" - } - }, - "eth-sig-util": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", - "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", - "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", - "ethereumjs-util": "^5.1.1" - } - }, - "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#8431eab7b3384e65e8126a4602520b78031666fb", - "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", - "requires": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - }, - "dependencies": { - "ethereumjs-util": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", - "integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "0.1.6", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.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" - } - }, - "json-rpc-engine": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz", - "integrity": "sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==", - "requires": { - "async": "^2.0.1", - "babel-preset-env": "^1.7.0", - "babelify": "^7.3.0", - "json-rpc-error": "^2.0.0", - "promise-to-callback": "^1.0.0", - "safe-event-emitter": "^1.0.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "web3-stream-provider": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/web3-stream-provider/-/web3-stream-provider-3.0.1.tgz", - "integrity": "sha1-9aWTqO7+gI+F61+x80Tlg4BQ+BQ=", - "requires": { - "readable-stream": "^2.0.5" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "webpack": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.33.0.tgz", - "integrity": "sha512-ggWMb0B2QUuYso6FPZKUohOgfm+Z0sVFs8WwWuSH1IAvkWs428VDNmOlAxvHGTB9Dm/qOB/qtE5cRx5y01clxw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.0.5", - "acorn-dynamic-import": "^4.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", - "schema-utils": "^1.0.0", - "tapable": "^1.1.0", - "terser-webpack-plugin": "^1.1.0", - "watchpack": "^1.5.0", - "webpack-sources": "^1.3.0" - }, - "dependencies": { - "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", - "dev": true - }, - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "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" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - } - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - } - } - }, - "webpack-dev-middleware": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz", - "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==", - "dev": true, - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.2", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - }, - "dependencies": { - "mime": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.3.tgz", - "integrity": "sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw==", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - } - } - }, - "webpack-hot-middleware": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.0.tgz", - "integrity": "sha512-xs5dPOrGPCzuRXNi8F6rwhawWvQQkeli5Ro48PRuQh8pYPCPmNnltP9itiUPT4xI8oW+y0m59lyyeQk54s5VgA==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "html-entities": "^1.2.0", - "querystring": "^0.2.0", - "strip-ansi": "^3.0.0" - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - } - } - }, - "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "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 - } - } - }, - "webrtc-adapter": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/webrtc-adapter/-/webrtc-adapter-6.3.2.tgz", - "integrity": "sha512-7pFMXpZCka7ScIQyk8Wo+fOr3OlKLtGd6YHqkHVT74zerpY2Siyds8sxsmkE0bNqsi/J1b0vDzN7WpB34dQzAA==", - "requires": { - "rtcpeerconnection-shim": "^1.2.10", - "sdp": "^2.7.0" - } - }, - "websocket-driver": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", - "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", - "dev": true, - "requires": { - "http-parser-js": ">=0.4.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz", - "integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.19" - } - }, - "whatwg-fetch": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", - "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" - }, - "whatwg-url": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz", - "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.0", - "webidl-conversions": "^4.0.1" - } - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" - }, - "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==", - "dev": true, - "requires": { - "string-width": "^1.0.2" - } - }, - "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", - "dev": true, - "requires": { - "string-width": "^2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "window-size": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=" - }, - "windows-release": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.2.0.tgz", - "integrity": "sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA==", - "dev": true, - "requires": { - "execa": "^1.0.0" - } - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - }, - "dependencies": { - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - } - } - }, - "worker-rpc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", - "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", - "dev": true, - "requires": { - "microevent.ts": "~0.1.1" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "write-file-stdout": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/write-file-stdout/-/write-file-stdout-0.0.2.tgz", - "integrity": "sha1-wlLXx8WxtAKJdjDjRTx7/mkNnKE=", - "dev": true - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } - }, - "x-is-string": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", - "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=", - "dev": true - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", - "dev": true - }, - "xhr": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.4.1.tgz", - "integrity": "sha512-pAIU5vBr9Hiy5cpFIbPnwf0C18ZF86DBsZKrlsf87N5De/JbA6RJ83UP/cv+aljl4S40iRVMqP4pr4sF9Dnj0A==", - "requires": { - "global": "~4.3.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "xhr2": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.3.tgz", - "integrity": "sha1-y/xHWaabSoiOeM9PILBRA4dXvRE=" - }, - "xhr2-cookies": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", - "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=", - "requires": { - "cookiejar": "^2.1.1" - } - }, - "xml-name-validator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", - "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=", - "dev": true - }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - } - }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "dev": true - }, - "xmlcreate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.1.tgz", - "integrity": "sha512-MjGsXhKG8YjTKrDCXseFo3ClbMGvUD4en29H2Cev1dv4P/chlpw6KdYmlCWDkhosBVKRDjM836+3e3pm1cBNJA==", - "dev": true - }, - "xmldom": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", - "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", - "dev": true - }, - "xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" - }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", - "dev": true - }, - "xregexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", - "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=" - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "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.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^4.2.0" - } - }, - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "requires": { - "camelcase": "^3.0.0" - } - }, - "yauzl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", - "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", - "dev": true, - "requires": { - "fd-slicer": "~1.0.1" - } - }, - "yazl": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.4.3.tgz", - "integrity": "sha1-7CblzIfVYBud+EMtvdPNLlFzoHE=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3" - } - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true - } - } -} diff --git a/package.json b/package.json index af4c83af5c56..12e0a56452a1 100644 --- a/package.json +++ b/package.json @@ -3,104 +3,115 @@ "version": "0.0.0", "private": true, "scripts": { - "start": "gulp dev:extension", - "dist": "gulp dist", - "doc": "jsdoc -c development/tools/.jsdoc.json", - "publish-docs": "gh-pages -d docs/jsdocs", - "start:test": "gulp dev:test", - "build:test": "gulp build:test", - "test": "npm run test:unit && npm run test:integration && npm run lint", - "dapp": "static-server test/e2e/beta/contract-test --port 8080", - "dapp-chain": "shell-parallel -s 'npm run ganache:start -- -b 2' -x 'sleep 5 && static-server test/e2e/beta/contract-test --port 8080'", - "watch:test:unit": "nodemon --exec \"npm run test:unit\" ./test ./app ./ui", - "test:unit": "cross-env METAMASK_ENV=test mocha --exit --require test/setup.js --recursive \"test/unit/**/*.js\" \"ui/app/**/*.test.js\"", - "test:single": "cross-env METAMASK_ENV=test mocha --require test/helper.js", - "test:integration": "npm run test:integration:build && npm run test:flat", - "test:integration:build": "gulp build:scss", - "test:e2e:drizzle:beta": "SELENIUM_BROWSER=chrome test/e2e/beta/run-drizzle.sh", - "test:e2e:chrome": "SELENIUM_BROWSER=chrome test/e2e/beta/run-all.sh", - "test:web3:chrome": "SELENIUM_BROWSER=chrome test/e2e/beta/run-web3.sh", - "test:web3:firefox": "SELENIUM_BROWSER=firefox test/e2e/beta/run-web3.sh", - "test:e2e:firefox": "SELENIUM_BROWSER=firefox test/e2e/beta/run-all.sh", - "test:screens": "shell-parallel -s 'npm run ganache:start' -x 'sleep 3 && npm run test:screens:run'", - "test:screens:run": "node test/screens/new-ui.js", - "test:coverage": "nyc --reporter=text --reporter=html npm run test:unit && npm run test:coveralls-upload", - "test:coveralls-upload": "if [ $COVERALLS_REPO_TOKEN ]; then nyc report --reporter=text-lcov | coveralls; fi", - "test:flat": "npm run test:flat:build && karma start test/flat.conf.js", - "test:flat:build": "npm run test:flat:build:ui && npm run test:flat:build:tests && npm run test:flat:build:locales", - "test:flat:build:tests": "node test/integration/index.js", - "test:flat:build:states": "node development/genStates.js", - "test:flat:build:locales": "mkdirp dist/chrome && cp -R app/_locales dist/chrome/_locales", - "test:flat:build:ui": "npm run test:flat:build:states && browserify ./development/mock-dev.js -o ./development/bundle.js", - "ganache:start": "ganache-cli --noVMErrorsOnRPCResponse -i 5777 -m 'phrase upgrade clock rough situate wedding elder clever doctor stamp excess tent'", + "start": "yarn build dev", + "dist": "yarn build prod", + "build": "node development/build/index.js", + "start:test": "yarn build testDev", + "benchmark:chrome": "SELENIUM_BROWSER=chrome node test/e2e/benchmark.js", + "benchmark:firefox": "SELENIUM_BROWSER=firefox node test/e2e/benchmark.js", + "build:test": "yarn build test", + "test": "yarn test:unit && yarn lint", + "dapp": "node development/static-server.js node_modules/@metamask/test-dapp/dist --port 8080", + "dapp-chain": "GANACHE_ARGS='-b 2' concurrently -k -n ganache,dapp -p '[{time}][{name}]' 'yarn ganache:start' 'sleep 5 && yarn dapp'", + "forwarder": "node ./development/static-server.js ./node_modules/@metamask/forwarder/dist/ --port 9010", + "dapp-forwarder": "concurrently -k -n forwarder,dapp -p '[{time}][{name}]' 'yarn forwarder' 'yarn dapp'", + "sendwithprivatedapp": "node development/static-server.js test/e2e/send-eth-with-private-key-test --port 8080", + "test:unit": "mocha --exit --require test/env.js --require test/setup.js --recursive \"test/unit/**/*.js\" \"ui/app/**/*.test.js\"", + "test:unit:global": "mocha --exit --require test/env.js --require test/setup.js --recursive mocha test/unit-global/*", + "test:unit:lax": "mocha --exit --require test/env.js --require test/setup.js --recursive \"test/unit/{,**/!(permissions)}/*.js\" \"ui/app/**/*.test.js\"", + "test:unit:strict": "mocha --exit --require test/env.js --require test/setup.js --recursive \"test/unit/**/permissions/*.js\"", + "test:unit:path": "mocha --exit --require test/env.js --require test/setup.js --recursive", + "test:e2e:chrome": "SELENIUM_BROWSER=chrome test/e2e/run-all.sh", + "test:e2e:firefox": "SELENIUM_BROWSER=firefox test/e2e/run-all.sh", + "test:coverage": "nyc --silent --check-coverage yarn test:unit:strict && nyc --silent --no-clean yarn test:unit:lax && nyc report --reporter=text --reporter=html", + "test:coverage:strict": "nyc --check-coverage yarn test:unit:strict", + "test:coveralls-upload": "if [ \"$COVERALLS_REPO_TOKEN\" ]; then nyc report --reporter=text-lcov | coveralls; fi", + "ganache:start": "./development/run-ganache", "sentry:publish": "node ./development/sentry-publish.js", - "lint": "eslint .", - "lint:fix": "eslint . --fix", + "lint": "eslint . --ext js,json && yarn lint:styles", + "lint:fix": "eslint . --ext js,json --fix", + "lint:changed": "{ git ls-files --others --exclude-standard ; git diff-index --name-only --diff-filter=d HEAD ; } | grep --regexp='[.]js$' --regexp='[.]json$' | tr '\\n' '\\0' | xargs -0 eslint", + "lint:changed:fix": "{ git ls-files --others --exclude-standard ; git diff-index --name-only --diff-filter=d HEAD ; } | grep --regexp='[.]js$' --regexp='[.]json$' | tr '\\n' '\\0' | xargs -0 eslint --fix", + "lint:shellcheck": "./development/shellcheck.sh", + "lint:styles": "stylelint '*/**/*.scss'", + "lint:lockfile": "lockfile-lint --path yarn.lock --allowed-hosts npm yarn github.com codeload.github.com --empty-hostname false --allowed-schemes \"https:\" \"git+https:\"", + "validate-source-maps": "node ./development/sourcemap-validator.js", + "verify-locales": "node ./development/verify-locale-strings.js", + "verify-locales:fix": "node ./development/verify-locale-strings.js --fix", "mozilla-lint": "addons-linter dist/firefox", - "watch": "cross-env METAMASK_ENV=test mocha --watch --require test/setup.js --reporter min --recursive \"test/unit/**/*.js\" \"ui/app/**/*.test.js\"", - "disc": "gulp disc --debug", + "watch": "mocha --watch --require test/env.js --require test/setup.js --reporter min --recursive \"test/unit/**/*.js\" \"ui/app/**/*.test.js\"", + "devtools:react": "react-devtools", + "devtools:redux": "remotedev --hostname=localhost --port=8000", + "start:dev": "concurrently -k -n build,react,redux yarn:start yarn:devtools:react yarn:devtools:redux", "announce": "node development/announcer.js", - "version:bump": "node development/run-version-bump.js", - "storybook": "start-storybook -p 6006 -c .storybook", + "storybook": "start-storybook -p 6006 -c .storybook --static-dir ./app", + "storybook:build": "build-storybook -c .storybook -o .out --static-dir ./app", + "storybook:deploy": "storybook-to-ghpages --existing-output-dir .out --remote storybook --branch master", "update-changelog": "./development/auto-changelog.sh", - "rollback": "./development/rollback.sh" + "generate:migration": "./development/generate-migration.sh" }, - "browserify": { - "transform": [ - "babelify", - "brfs" - ] + "resolutions": { + "**/configstore/dot-prop": "^5.1.1", + "**/ethers/elliptic": "^6.5.3", + "**/knex/minimist": "^1.2.5", + "**/optimist/minimist": "^1.2.5", + "**/socketcluster/minimist": "^1.2.5", + "3box/ipfs/ipld-zcash/zcash-bitcore-lib/lodash": "^4.17.19", + "3box/ipfs/ipld-zcash/zcash-bitcore-lib/elliptic": "^6.5.3", + "ganache-core/lodash": "^4.17.19" }, "dependencies": { - "@material-ui/core": "1.0.0", - "@sentry/browser": "^4.1.1", + "3box": "^1.10.2", + "@babel/runtime": "^7.5.5", + "@download/blockies": "^1.0.3", + "@formatjs/intl-relativetimeformat": "^5.2.6", + "@fortawesome/fontawesome-free": "^5.13.0", + "@material-ui/core": "^4.11.0", + "@metamask/controllers": "^2.0.5", + "@metamask/eth-ledger-bridge-keyring": "^0.2.6", + "@metamask/eth-token-tracker": "^3.0.0", + "@metamask/etherscan-link": "^1.1.0", + "@metamask/inpage-provider": "^6.1.0", + "@metamask/logo": "^2.5.0", + "@popperjs/core": "^2.4.0", + "@reduxjs/toolkit": "^1.3.2", + "@sentry/browser": "^5.11.1", + "@sentry/integrations": "^5.11.1", "@zxing/library": "^0.8.0", "abi-decoder": "^1.2.0", - "asmcrypto.js": "0.22.0", - "async": "^2.5.0", + "abortcontroller-polyfill": "^1.4.0", "await-semaphore": "^0.1.1", - "babel-runtime": "^6.23.0", "bignumber.js": "^4.1.0", "bip39": "^2.2.0", - "bluebird": "^3.5.0", "bn.js": "^4.11.7", - "boron": "^0.2.3", - "browser-passworder": "^2.0.3", - "browserify-derequire": "^0.9.4", - "browserify-unibabel": "^3.0.0", - "c3": "^0.6.7", - "classnames": "^2.2.5", - "clone": "^2.1.2", - "content-hash": "^2.3.2", + "c3": "^0.7.10", + "classnames": "^2.2.6", + "content-hash": "^2.5.2", "copy-to-clipboard": "^3.0.8", "currency-formatter": "^1.4.2", - "d3": "^5.7.0", - "debounce": "1.1.0", + "d3": "^5.15.0", "debounce-stream": "^2.0.0", - "deep-extend": "^0.5.1", - "detect-node": "^2.0.3", - "detectrtc": "^1.3.6", - "disc": "^1.3.2", + "deep-freeze-strict": "1.1.1", "dnode": "^1.2.2", - "end-of-stream": "^1.1.0", - "eth-block-tracker": "^4.1.0", - "eth-contract-metadata": "github:MetaMask/eth-contract-metadata#dc68506221859bc90792bc5e0279a6835f2484d8", + "end-of-stream": "^1.4.4", + "eth-block-tracker": "^4.4.2", + "eth-contract-metadata": "^1.15.0", "eth-ens-namehash": "^2.0.8", - "eth-json-rpc-filters": "^3.0.4", - "eth-json-rpc-infura": "^3.2.0", - "eth-keyring-controller": "^3.3.1", - "eth-ledger-bridge-keyring": "^0.2.0", + "eth-json-rpc-errors": "^2.0.2", + "eth-json-rpc-filters": "^4.1.1", + "eth-json-rpc-infura": "^4.0.2", + "eth-json-rpc-middleware": "^5.0.2", + "eth-keyring-controller": "^6.1.0", "eth-method-registry": "^1.2.0", "eth-phishing-detect": "^1.1.4", "eth-query": "^2.1.2", - "eth-sig-util": "^2.0.2", - "eth-token-tracker": "^1.1.5", + "eth-sig-util": "^2.3.0", "eth-trezor-keyring": "^0.4.0", + "ethereum-ens-network-map": "^1.0.2", "ethereumjs-abi": "^0.6.4", "ethereumjs-tx": "1.3.7", - "ethereumjs-util": "github:ethereumjs/ethereumjs-util#ac5d0908536b447083ea422b435da27f26615de9", + "ethereumjs-util": "5.1.0", "ethereumjs-wallet": "^0.6.0", - "etherscan-link": "^1.0.2", "ethjs": "^0.4.0", "ethjs-contract": "^0.2.3", "ethjs-ens": "^2.0.0", @@ -109,182 +120,168 @@ "extensionizer": "^1.0.1", "fast-json-patch": "^2.0.4", "fuse.js": "^3.2.0", - "gaba": "^1.3.0", "human-standard-token-abi": "^2.0.0", - "inject-css": "^0.1.1", - "jazzicon": "^1.2.0", - "json-rpc-engine": "^4.0.0", + "jazzicon": "^2.0.0", + "json-rpc-engine": "^5.2.0", "json-rpc-middleware-stream": "^2.1.1", "jsonschema": "^1.2.4", - "lodash.debounce": "^4.0.8", - "lodash.shuffle": "^4.2.0", + "lodash": "^4.17.19", "loglevel": "^1.4.1", - "luxon": "^1.8.2", - "metamask-inpage-provider": "^1.3.0", - "metamask-logo": "^2.1.4", - "mkdirp": "^0.5.1", + "luxon": "^1.24.1", "multihashes": "^0.4.12", + "nanoid": "^2.1.6", "nonce-tracker": "^1.0.0", - "number-to-bn": "^1.7.0", "obj-multiplex": "^1.0.0", - "obs-store": "^3.0.2", - "percentile": "^1.2.0", - "pify": "^3.0.0", - "polyfill-crypto.getrandomvalues": "^1.0.0", + "obs-store": "^4.0.3", + "pify": "^5.0.0", "post-message-stream": "^3.0.0", - "promise-filter": "^1.1.0", "promise-to-callback": "^1.0.0", "prop-types": "^15.6.1", - "pubnub": "^4.21.5", + "pubnub": "4.27.3", "pump": "^3.0.0", + "punycode": "^2.1.1", "qrcode-generator": "1.4.1", - "ramda": "^0.24.1", - "react": "^15.6.2", - "react-addons-css-transition-group": "^15.6.0", + "react": "^16.12.0", "react-dnd": "^3.0.2", "react-dnd-html5-backend": "^7.4.4", - "react-dom": "^15.6.2", - "react-hyperscript": "^3.0.0", + "react-dom": "^16.12.0", "react-idle-timer": "^4.2.5", "react-inspector": "^2.3.0", - "react-media": "^1.8.0", - "react-redux": "^5.0.5", - "react-router-dom": "^4.2.2", + "react-popper": "^2.2.3", + "react-redux": "^7.2.0", + "react-router-dom": "^5.1.2", "react-select": "^1.0.0", "react-simple-file-input": "^2.0.0", "react-tippy": "^1.2.2", "react-toggle-button": "^2.2.0", - "react-tooltip-component": "^0.3.0", - "react-transition-group": "^2.2.1", - "react-trigger-change": "^1.0.2", - "reactify": "^1.1.1", + "react-transition-group": "^1.2.1", "readable-stream": "^2.3.3", - "recompose": "^0.25.0", - "redux": "^3.0.5", - "redux-logger": "^3.0.6", - "redux-thunk": "^2.2.0", - "request-promise": "^4.2.1", + "redux": "^4.0.5", + "redux-thunk": "^2.3.0", "reselect": "^3.0.1", + "rpc-cap": "^3.1.0", "safe-event-emitter": "^1.0.1", + "safe-json-stringify": "^1.2.0", "single-call-balance-checker-abi": "^1.0.0", "swappable-obj-proxy": "^1.1.0", "textarea-caret": "^3.0.1", "valid-url": "^1.0.9", "web3": "^0.20.7", - "web3-stream-provider": "^3.0.1", - "webrtc-adapter": "^6.3.0", - "xtend": "^4.0.1" + "web3-stream-provider": "^4.0.0" }, "devDependencies": { - "@sentry/cli": "^1.30.3", - "@storybook/addon-info": "^5.1.1", - "@storybook/addon-knobs": "^3.4.2", - "@storybook/react": "^5.1.1", - "abortcontroller-polyfill": "^1.3.0", - "addons-linter": "^1.10.0", - "babel-core": "^6.26.3", - "babel-eslint": "^8.0.0", - "babel-plugin-transform-async-to-generator": "^6.24.1", - "babel-plugin-transform-runtime": "^6.23.0", - "babel-polyfill": "^6.23.0", - "babel-preset-env": "^1.7.0", - "babel-preset-react": "^6.24.1", - "babel-preset-stage-0": "^6.24.1", - "babel-register": "^6.7.2", - "babelify": "^8.0.0", - "brfs": "^1.6.1", - "browserify": "^16.2.3", + "@babel/core": "^7.5.5", + "@babel/plugin-proposal-class-properties": "^7.5.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", + "@babel/plugin-proposal-optional-chaining": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.5.5", + "@babel/preset-env": "^7.5.5", + "@babel/preset-react": "^7.0.0", + "@babel/register": "^7.5.5", + "@metamask/eslint-config": "^3.1.0", + "@metamask/forwarder": "^1.1.0", + "@metamask/test-dapp": "^3.1.0", + "@sentry/cli": "^1.49.0", + "@storybook/addon-actions": "^5.3.14", + "@storybook/addon-backgrounds": "^5.3.14", + "@storybook/addon-knobs": "^5.3.14", + "@storybook/core": "^5.3.14", + "@storybook/react": "^5.3.14", + "@storybook/storybook-deployer": "^2.8.6", + "@testing-library/react": "^10.4.8", + "@testing-library/react-hooks": "^3.2.1", + "addons-linter": "1.14.0", + "babel-eslint": "^10.1.0", + "babel-loader": "^8.0.6", + "babelify": "^10.0.0", + "brfs": "^2.0.2", + "browserify": "^16.5.1", + "browserify-derequire": "^1.0.1", + "browserify-transform-tools": "^1.7.0", "chai": "^4.1.0", - "chromedriver": "^2.41.0", - "clipboardy": "^1.2.3", + "chalk": "^3.0.0", + "chromedriver": "^79.0.0", + "concurrently": "^5.2.0", + "copy-webpack-plugin": "^6.0.3", "coveralls": "^3.0.0", - "cross-env": "^5.1.4", "css-loader": "^2.1.1", - "deep-freeze-strict": "^1.1.1", "del": "^3.0.0", - "envify": "^4.0.0", - "enzyme": "^3.4.4", - "enzyme-adapter-react-15": "^1.0.6", - "eslint-plugin-chai": "0.0.1", + "deps-dump": "^1.1.0", + "envify": "^4.1.0", + "enzyme": "^3.10.0", + "enzyme-adapter-react-16": "^1.15.1", + "eslint": "^6.8.0", + "eslint-plugin-babel": "^5.3.0", + "eslint-plugin-import": "^2.22.0", "eslint-plugin-json": "^1.2.0", - "eslint-plugin-mocha": "^5.0.0", - "eslint-plugin-react": "^7.4.0", - "eth-json-rpc-middleware": "^3.1.7", - "fetch-mock": "^6.5.2", + "eslint-plugin-mocha": "^6.3.0", + "eslint-plugin-react": "^7.18.3", + "eslint-plugin-react-hooks": "^4.0.4", + "fancy-log": "^1.3.3", + "fast-glob": "^3.2.2", "file-loader": "^1.1.11", - "fs-extra": "^6.0.1", - "fs-promise": "^2.0.3", - "ganache-cli": "^6.1.0", - "ganache-core": "^2.5.5", - "geckodriver": "^1.16.2", - "gh-pages": "^1.2.0", - "gifencoder": "^1.1.0", - "gulp": "^4.0.0", + "fs-extra": "^8.1.0", + "ganache-cli": "^6.9.1", + "ganache-core": "^2.10.2", + "geckodriver": "^1.19.1", + "get-port": "^5.1.0", + "gulp": "^4.0.2", "gulp-autoprefixer": "^5.0.0", - "gulp-babel": "^7.0.0", + "gulp-babel": "^8.0.0", "gulp-debug": "^3.2.0", - "gulp-eslint": "^4.0.0", - "gulp-json-editor": "^2.2.1", + "gulp-imagemin": "^6.1.0", "gulp-livereload": "4.0.0", "gulp-multi-process": "^1.3.1", - "gulp-replace": "^0.6.1", + "gulp-rename": "^2.0.0", + "gulp-replace": "^1.0.0", + "gulp-rtlcss": "^1.4.0", "gulp-sass": "^4.0.0", "gulp-sourcemaps": "^2.6.0", - "gulp-stylefmt": "^1.1.0", - "gulp-stylelint": "^7.0.0", - "gulp-uglify": "^3.0.0", - "gulp-uglify-es": "^1.0.1", - "gulp-util": "^3.0.7", + "gulp-stylelint": "^13.0.0", + "gulp-terser-js": "^5.2.2", "gulp-watch": "^5.0.1", "gulp-zip": "^4.0.0", - "http-server": "^0.11.1", - "image-size": "^0.6.2", - "isomorphic-fetch": "^2.2.1", - "jsdoc": "^3.6.2", "jsdom": "^11.2.0", - "jsdom-global": "^3.0.2", - "karma": "^4.1.0", - "karma-chrome-launcher": "^2.2.0", - "karma-cli": "^1.0.1", - "karma-firefox-launcher": "^1.0.1", - "karma-qunit": "^1.2.1", - "lodash.assign": "^4.0.6", - "mocha": "^5.0.0", - "mocha-eslint": "^4.0.0", - "mocha-jsdom": "^1.1.0", - "mocha-sinon": "^2.0.0", + "koa": "^2.7.0", + "lockfile-lint": "^4.0.0", + "mocha": "^7.2.0", "nock": "^9.0.14", - "node-sass": "^4.12.0", - "nyc": "^13.0.0", - "path": "^0.12.7", - "png-file-stream": "^1.1.0", - "prepend-file": "^1.3.1", - "proxyquire": "2.0.1", - "qs": "^6.2.0", - "qunitjs": "^2.4.1", - "radgrad-jsdoc-template": "^1.1.3", - "react-test-renderer": "^15.6.2", - "redux-mock-store": "^1.5.3", - "redux-test-utils": "^0.2.2", + "node-fetch": "^2.6.0", + "node-sass": "^4.14.1", + "nyc": "^15.0.0", + "polyfill-crypto.getrandomvalues": "^1.0.0", + "proxyquire": "^2.1.3", + "randomcolor": "^0.5.4", + "rc": "^1.2.8", + "react-devtools": "^4.8.0", + "react-test-renderer": "^16.12.0", + "read-installed": "^4.0.3", + "redux-mock-store": "^1.5.4", + "regenerator-runtime": "^0.13.3", + "remote-redux-devtools": "^0.5.16", + "remotedev-server": "^0.3.1", "resolve-url-loader": "^2.3.0", - "rimraf": "^2.6.2", "sass-loader": "^7.0.1", - "selenium-webdriver": "^3.5.0", - "shell-parallel": "1.0.3", - "sinon": "^5.0.0", + "selenium-webdriver": "^4.0.0-alpha.5", + "serve-handler": "^6.1.2", + "sesify": "^4.2.1", + "sesify-viz": "^3.0.10", + "sinon": "^9.0.0", "source-map": "^0.7.2", - "static-server": "^2.2.1", + "source-map-explorer": "^2.4.2", + "string.prototype.matchall": "^4.0.2", "style-loader": "^0.21.0", - "stylelint-config-standard": "^18.2.0", - "tape": "^4.5.1", - "testem": "^2.16.0", + "stylelint": "^13.6.1", "through2": "^2.0.3", + "ttest": "^2.1.1", "vinyl-buffer": "^1.0.1", "vinyl-source-stream": "^2.0.0", - "watchify": "^3.11.1" + "watchify": "^3.11.1", + "webpack": "^4.41.6" }, "engines": { - "node": "8.11.3", - "npm": "^6.1.0" + "node": "^10.16.0", + "yarn": "^1.16.0" } } diff --git a/stylelint.config.js b/stylelint.config.js new file mode 100644 index 000000000000..3582b90ef052 --- /dev/null +++ b/stylelint.config.js @@ -0,0 +1,122 @@ +module.exports = { + rules: { + // stylelint-config-standard + + 'at-rule-empty-line-before': [ + 'always', + { + except: ['blockless-after-same-name-blockless', 'first-nested'], + ignore: ['after-comment'], + }, + ], + 'at-rule-name-case': 'lower', + 'at-rule-name-space-after': 'always-single-line', + 'at-rule-semicolon-newline-after': 'always', + 'block-closing-brace-empty-line-before': 'never', + 'block-closing-brace-newline-after': 'always', + 'block-closing-brace-newline-before': 'always-multi-line', + 'block-closing-brace-space-before': 'always-single-line', + 'block-opening-brace-newline-after': 'always-multi-line', + 'block-opening-brace-space-after': 'always-single-line', + 'block-opening-brace-space-before': 'always', + 'color-hex-case': 'lower', + 'color-hex-length': 'short', + 'comment-empty-line-before': [ + 'always', + { + except: ['first-nested'], + ignore: ['stylelint-commands'], + }, + ], + // 'comment-whitespace-inside': 'always', + 'custom-property-empty-line-before': [ + 'always', + { + except: ['after-custom-property', 'first-nested'], + ignore: ['after-comment', 'inside-single-line-block'], + }, + ], + 'declaration-bang-space-after': 'never', + 'declaration-bang-space-before': 'always', + 'declaration-block-semicolon-newline-after': 'always-multi-line', + 'declaration-block-semicolon-space-after': 'always-single-line', + 'declaration-block-semicolon-space-before': 'never', + 'declaration-block-single-line-max-declarations': 1, + 'declaration-block-trailing-semicolon': 'always', + 'declaration-colon-newline-after': 'always-multi-line', + 'declaration-colon-space-after': 'always-single-line', + 'declaration-colon-space-before': 'never', + 'declaration-empty-line-before': [ + 'always', + { + except: ['after-declaration', 'first-nested'], + ignore: ['after-comment', 'inside-single-line-block'], + }, + ], + 'function-comma-newline-after': 'always-multi-line', + 'function-comma-space-after': 'always-single-line', + 'function-comma-space-before': 'never', + 'function-max-empty-lines': 0, + 'function-name-case': 'lower', + 'function-parentheses-newline-inside': 'always-multi-line', + 'function-parentheses-space-inside': 'never-single-line', + 'function-whitespace-after': 'always', + indentation: 2, + 'length-zero-no-unit': true, + // 'max-empty-lines': 1, + 'media-feature-colon-space-after': 'always', + 'media-feature-colon-space-before': 'never', + 'media-feature-name-case': 'lower', + 'media-feature-parentheses-space-inside': 'never', + 'media-feature-range-operator-space-after': 'always', + 'media-feature-range-operator-space-before': 'always', + 'media-query-list-comma-newline-after': 'always-multi-line', + 'media-query-list-comma-space-after': 'always-single-line', + 'media-query-list-comma-space-before': 'never', + 'no-eol-whitespace': true, + 'no-missing-end-of-source-newline': true, + 'number-leading-zero': 'always', + 'number-no-trailing-zeros': true, + 'property-case': 'lower', + 'rule-empty-line-before': [ + 'always-multi-line', + { + except: ['first-nested'], + ignore: ['after-comment'], + }, + ], + 'selector-attribute-brackets-space-inside': 'never', + 'selector-attribute-operator-space-after': 'never', + 'selector-attribute-operator-space-before': 'never', + 'selector-combinator-space-after': 'always', + 'selector-combinator-space-before': 'always', + 'selector-descendant-combinator-no-non-space': true, + 'selector-list-comma-newline-after': 'always', + 'selector-list-comma-space-before': 'never', + 'selector-max-empty-lines': 0, + 'selector-pseudo-class-case': 'lower', + 'selector-pseudo-class-parentheses-space-inside': 'never', + 'selector-pseudo-element-case': 'lower', + 'selector-pseudo-element-colon-notation': 'double', + 'selector-type-case': 'lower', + 'unit-case': 'lower', + // 'value-keyword-case': 'lower', + 'value-list-comma-newline-after': 'always-multi-line', + 'value-list-comma-space-after': 'always-single-line', + 'value-list-comma-space-before': 'never', + 'value-list-max-empty-lines': 0, + + // custom rules + + // 'color-named': 'never', + // 'font-family-name-quotes': 'always-where-recommended', + // 'font-weight-notation': 'numeric', + // 'function-url-quotes': 'always', + 'value-no-vendor-prefix': true, + 'value-list-comma-newline-before': 'never-multi-line', + // 'selector-attribute-quotes': 'always', + // 'selector-max-specificity': '0,5,2', + // 'max-nesting-depth': 3, + 'no-unknown-animations': true, + }, +} diff --git a/test/base.conf.js b/test/base.conf.js deleted file mode 100644 index ccb91cc65b90..000000000000 --- a/test/base.conf.js +++ /dev/null @@ -1,68 +0,0 @@ -// Karma configuration -// Generated on Mon Sep 11 2017 18:45:48 GMT-0700 (PDT) - -module.exports = function (config) { - return { - // base path that will be used to resolve all patterns (eg. files, exclude) - basePath: process.cwd(), - - // Uncomment to allow for longer timeouts - // browserNoActivityTimeout: 100000000, - - browserConsoleLogOptions: { - terminal: false, - }, - - // frameworks to use - // available frameworks: https://npmjs.org/browse/keyword/karma-adapter - frameworks: ['qunit'], - - // list of files / patterns to load in the browser - files: [ - 'test/integration/jquery-3.1.0.min.js', - { pattern: 'dist/chrome/images/**/*.*', watched: false, included: false, served: true }, - { pattern: 'dist/chrome/fonts/**/*.*', watched: false, included: false, served: true }, - { pattern: 'dist/chrome/_locales/**/*.*', watched: false, included: false, served: true }, - ], - - proxies: { - '/images/': '/base/dist/chrome/images/', - '/fonts/': '/base/dist/chrome/fonts/', - '/_locales/': '/base/dist/chrome/_locales/', - }, - - // test results reporter to use - // possible values: 'dots', 'progress' - // available reporters: https://npmjs.org/browse/keyword/karma-reporter - reporters: ['progress'], - - // web server port - port: 9876, - - // enable / disable colors in the output (reporters and logs) - colors: true, - - // level of logging - // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG - logLevel: config.LOG_INFO, - - // enable / disable watching file and executing tests whenever any file changes - autoWatch: false, - - // start these browsers - // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher - browsers: process.env.browsers ? - JSON.parse(process.env.browsers) - : ['Chrome', 'Firefox'], - - // Continuous Integration mode - // if true, Karma captures browsers, runs the tests and exits - singleRun: true, - - // Concurrency level - // how many browser should be started simultaneous - concurrency: 1, - - nocache: true, - } -} diff --git a/test/data/2-state.json b/test/data/2-state.json deleted file mode 100644 index d41a403ff0d1..000000000000 --- a/test/data/2-state.json +++ /dev/null @@ -1,70 +0,0 @@ -{ "isInitialized": true, - "provider": { "type": "rpc", "rpcTarget": "http://localhost:8545" }, - "network": "loading", - "accounts": { - "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc": { - "address": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", - "balance": "0x0" - }, - "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b": { - "address": "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b", - "balance": "0x0" - } - }, - "currentBlockGasLimit": "", - "unapprovedTxs": {}, - "selectedAddressTxList": [], - "computedBalances": {}, - "unapprovedMsgs": {}, - "unapprovedMsgCount": 0, - "unapprovedPersonalMsgs": {}, - "unapprovedPersonalMsgCount": 0, - "unapprovedTypedMessages": {}, - "unapprovedTypedMessagesCount": 0, - "isUnlocked": true, - "keyringTypes": [ "Simple Key Pair", "HD Key Tree" ], - "keyrings":[ - { "type": "HD Key Tree", - "accounts": [ - "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc" - ] - }, - { - "type": "Simple Key Pair", - "accounts": [ - "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b" - ] - } - ], - "frequentRpcList": [], - "currentAccountTab": "history", - "tokens": [], - "useBlockie": false, - "featureFlags": {}, - "currentLocale": null, - "identities": { - "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc": { - "name": "Account 1", - "address": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc" - }, - "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b": { - "name": "Account 2", - "address": "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b" - } - }, - - "lostIdentities": {}, - "selectedAddress": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", - "recentBlocks": [], - "addressBook": [], - "currentCurrency": "usd", - "conversionRate": 288.45, - "conversionDate": 1506444677, - "nextUnreadNotice": null, - "noActiveNotices": true, - "shapeShiftTxList": [], - "infuraNetworkStatus": {}, - "lostAccounts": [], - "seedWords": "debris dizzy just program just float decrease vacant alarm reduce speak stadium", - "forgottenPassword": null -} \ No newline at end of file diff --git a/test/data/fetch-mocks.json b/test/data/fetch-mocks.json new file mode 100644 index 000000000000..1be8290bed21 --- /dev/null +++ b/test/data/fetch-mocks.json @@ -0,0 +1,5922 @@ +{ + "ethGasBasic": { + "average": 85, + "fastestWait": 0.6, + "fastWait": 0.6, + "fast": 200, + "safeLowWait": 4.8, + "blockNum": 6648312, + "avgWait": 4.2, + "block_time": 15.516129032258064, + "speed": 0.7828720873342716, + "fastest": 400, + "safeLow": 80 + }, + "ethGasPredictTable": [ + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 7.2632423756, + "pct_remaining5m": 0, + "sum": 7.029975, + "tx_atabove": 4136, + "hashpower_accepting": 10.4166666667, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 1.2, + "pct_mined_5m": 0, + "total_seen_5m": 1, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 7.433788122, + "pct_remaining5m": 0, + "sum": 7.01731875, + "tx_atabove": 4136, + "hashpower_accepting": 10.9375, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 1.5, + "pct_mined_5m": 0, + "total_seen_5m": 84, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 7.433788122, + "pct_remaining5m": 0, + "sum": 7.01731875, + "tx_atabove": 4136, + "hashpower_accepting": 10.9375, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 1.7, + "pct_mined_5m": 0, + "total_seen_5m": 5, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 7.4638844302, + "pct_remaining5m": 0, + "sum": 7.01731875, + "tx_atabove": 4136, + "hashpower_accepting": 10.9375, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 1.8, + "pct_mined_5m": 0, + "total_seen_5m": 20, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 7.4839486356, + "pct_remaining5m": 0, + "sum": 7.01731875, + "tx_atabove": 4136, + "hashpower_accepting": 10.9375, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 1.9, + "pct_mined_5m": 0, + "total_seen_5m": 8, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 7.7347512039, + "pct_remaining5m": 0, + "sum": 7.0046625, + "tx_atabove": 4136, + "hashpower_accepting": 11.4583333333, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 2, + "pct_mined_5m": 0, + "total_seen_5m": 52, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 17, + "hashpower_accepting2": 7.7447833066, + "pct_remaining5m": 1, + "sum": 7.0046625, + "tx_atabove": 4136, + "hashpower_accepting": 11.4583333333, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 2.1, + "pct_mined_5m": 0, + "total_seen_5m": 97, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 20, + "hashpower_accepting2": 7.7447833066, + "pct_remaining5m": 1, + "sum": 7.0040625, + "tx_atabove": 4135, + "hashpower_accepting": 11.4583333333, + "hpa_coef2": -0.067, + "total_seen_30m": 6, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 2.2, + "pct_mined_5m": 0, + "total_seen_5m": 433, + "pct_mined_30m": 0, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 68, + "hashpower_accepting2": 7.7447833066, + "pct_remaining5m": 0, + "sum": 6.9986625, + "tx_atabove": 4126, + "hashpower_accepting": 11.4583333333, + "hpa_coef2": -0.067, + "total_seen_30m": 2, + "int2": 6.9238, + "pct_remaining30m": 50, + "gasprice": 2.3, + "pct_mined_5m": 0, + "total_seen_5m": 14, + "pct_mined_30m": 0, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 7.7447833066, + "pct_remaining5m": 0, + "sum": 6.9980625, + "tx_atabove": 4125, + "hashpower_accepting": 11.4583333333, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 2.4, + "pct_mined_5m": 0, + "total_seen_5m": 4, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 20, + "hashpower_accepting2": 7.7447833066, + "pct_remaining5m": 37, + "sum": 6.9956625, + "tx_atabove": 4121, + "hashpower_accepting": 11.4583333333, + "hpa_coef2": -0.067, + "total_seen_30m": 4, + "int2": 6.9238, + "pct_remaining30m": 75, + "gasprice": 2.5, + "pct_mined_5m": 0, + "total_seen_5m": 45, + "pct_mined_30m": 0, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 79, + "hashpower_accepting2": 7.7447833066, + "pct_remaining5m": 0, + "sum": 6.9788625, + "tx_atabove": 4093, + "hashpower_accepting": 11.4583333333, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 100, + "gasprice": 2.6, + "pct_mined_5m": 0, + "total_seen_5m": 3, + "pct_mined_30m": 0, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 27.5, + "hashpower_accepting2": 7.7447833066, + "pct_remaining5m": 100, + "sum": 6.9764625, + "tx_atabove": 4089, + "hashpower_accepting": 11.4583333333, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 2.7, + "pct_mined_5m": 0, + "total_seen_5m": 3, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 22.5, + "hashpower_accepting2": 7.7447833066, + "pct_remaining5m": 66, + "sum": 6.9740625, + "tx_atabove": 4085, + "hashpower_accepting": 11.4583333333, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 2.8, + "pct_mined_5m": 0, + "total_seen_5m": 6, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 20, + "hashpower_accepting2": 7.7548154093, + "pct_remaining5m": 38, + "sum": 6.9686625, + "tx_atabove": 4076, + "hashpower_accepting": 11.4583333333, + "hpa_coef2": -0.067, + "total_seen_30m": 2, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 2.9, + "pct_mined_5m": 2, + "total_seen_5m": 36, + "pct_mined_30m": 0, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 27, + "hashpower_accepting2": 11.5268860353, + "pct_remaining5m": 77, + "sum": 6.8307, + "tx_atabove": 4057, + "hashpower_accepting": 16.6666666667, + "hpa_coef2": -0.067, + "total_seen_30m": 127, + "int2": 6.9238, + "pct_remaining30m": 48, + "gasprice": 3, + "pct_mined_5m": 0, + "total_seen_5m": 322, + "pct_mined_30m": 39, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 67, + "hashpower_accepting2": 11.5268860353, + "pct_remaining5m": 100, + "sum": 6.5697, + "tx_atabove": 3622, + "hashpower_accepting": 16.6666666667, + "hpa_coef2": -0.067, + "total_seen_30m": 85, + "int2": 6.9238, + "pct_remaining30m": 98, + "gasprice": 3.1, + "pct_mined_5m": 0, + "total_seen_5m": 79, + "pct_mined_30m": 0, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 71, + "hashpower_accepting2": 11.5268860353, + "pct_remaining5m": 100, + "sum": 6.4311, + "tx_atabove": 3391, + "hashpower_accepting": 16.6666666667, + "hpa_coef2": -0.067, + "total_seen_30m": 7, + "int2": 6.9238, + "pct_remaining30m": 100, + "gasprice": 3.2, + "pct_mined_5m": 0, + "total_seen_5m": 4, + "pct_mined_30m": 0, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 62, + "hashpower_accepting2": 11.5268860353, + "pct_remaining5m": 100, + "sum": 6.4209, + "tx_atabove": 3374, + "hashpower_accepting": 16.6666666667, + "hpa_coef2": -0.067, + "total_seen_30m": 14, + "int2": 6.9238, + "pct_remaining30m": 92, + "gasprice": 3.3, + "pct_mined_5m": 0, + "total_seen_5m": 7, + "pct_mined_30m": 0, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 1472, + "hashpower_accepting2": 11.5569823435, + "pct_remaining5m": 100, + "sum": 6.3951, + "tx_atabove": 3331, + "hashpower_accepting": 16.6666666667, + "hpa_coef2": -0.067, + "total_seen_30m": 29, + "int2": 6.9238, + "pct_remaining30m": 100, + "gasprice": 3.4, + "pct_mined_5m": 0, + "total_seen_5m": 27, + "pct_mined_30m": 0, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 307, + "hashpower_accepting2": 11.5670144462, + "pct_remaining5m": 100, + "sum": 6.1521, + "tx_atabove": 2926, + "hashpower_accepting": 16.6666666667, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 3.7, + "pct_mined_5m": 0, + "total_seen_5m": 1, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 1399, + "hashpower_accepting2": 11.577046549, + "pct_remaining5m": 100, + "sum": 6.1395, + "tx_atabove": 2905, + "hashpower_accepting": 16.6666666667, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 3.9, + "pct_mined_5m": 0, + "total_seen_5m": 1, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 1005, + "hashpower_accepting2": 11.5971107544, + "pct_remaining5m": 88, + "sum": 6.1035, + "tx_atabove": 2845, + "hashpower_accepting": 16.6666666667, + "hpa_coef2": -0.067, + "total_seen_30m": 9, + "int2": 6.9238, + "pct_remaining30m": 88, + "gasprice": 4, + "pct_mined_5m": 0, + "total_seen_5m": 9, + "pct_mined_30m": 0, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 1546, + "hashpower_accepting2": 11.6171749599, + "pct_remaining5m": null, + "sum": 5.6151, + "tx_atabove": 2031, + "hashpower_accepting": 16.6666666667, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 100, + "gasprice": 4.1, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 0, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 1065, + "hashpower_accepting2": 11.6171749599, + "pct_remaining5m": 100, + "sum": 5.5509, + "tx_atabove": 1924, + "hashpower_accepting": 16.6666666667, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 4.3, + "pct_mined_5m": 0, + "total_seen_5m": 2, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 459, + "hashpower_accepting2": 11.6171749599, + "pct_remaining5m": 50, + "sum": 5.5137, + "tx_atabove": 1862, + "hashpower_accepting": 16.6666666667, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 4.4, + "pct_mined_5m": 0, + "total_seen_5m": 2, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 298, + "hashpower_accepting2": 11.6171749599, + "pct_remaining5m": null, + "sum": 5.4903, + "tx_atabove": 1823, + "hashpower_accepting": 16.6666666667, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 100, + "gasprice": 4.7, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 0, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 812, + "hashpower_accepting2": 11.6472712681, + "pct_remaining5m": 0, + "sum": 5.4831, + "tx_atabove": 1811, + "hashpower_accepting": 16.6666666667, + "hpa_coef2": -0.067, + "total_seen_30m": 2, + "int2": 6.9238, + "pct_remaining30m": 100, + "gasprice": 4.8, + "pct_mined_5m": 0, + "total_seen_5m": 1, + "pct_mined_30m": 0, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 541, + "hashpower_accepting2": 11.6472712681, + "pct_remaining5m": 100, + "sum": 5.4375, + "tx_atabove": 1735, + "hashpower_accepting": 16.6666666667, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 4.9, + "pct_mined_5m": 0, + "total_seen_5m": 1, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 1134, + "hashpower_accepting2": 11.7375601926, + "pct_remaining5m": 100, + "sum": 5.41824375, + "tx_atabove": 1724, + "hashpower_accepting": 17.1875, + "hpa_coef2": -0.067, + "total_seen_30m": 6, + "int2": 6.9238, + "pct_remaining30m": 100, + "gasprice": 5, + "pct_mined_5m": 0, + "total_seen_5m": 5, + "pct_mined_30m": 0, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 1958, + "hashpower_accepting2": 11.7676565008, + "pct_remaining5m": null, + "sum": 4.9567875, + "tx_atabove": 976, + "hashpower_accepting": 17.7083333333, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 100, + "gasprice": 5.2, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 0, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 1203.5, + "hashpower_accepting2": 11.8077849117, + "pct_remaining5m": null, + "sum": 4.9507875, + "tx_atabove": 966, + "hashpower_accepting": 17.7083333333, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 100, + "gasprice": 5.3, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 0, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 677.5, + "hashpower_accepting2": 11.8378812199, + "pct_remaining5m": null, + "sum": 4.9141875, + "tx_atabove": 905, + "hashpower_accepting": 17.7083333333, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 100, + "gasprice": 5.5, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 0, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 250.99, + "avgdiff": 0, + "expectedWait": 1000, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 3, + "hashpower_accepting2": 13.3928571429, + "pct_remaining5m": 0, + "sum": 3.16120625, + "tx_atabove": 832, + "hashpower_accepting": 20.3125, + "hpa_coef2": -0.067, + "total_seen_30m": 9, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 6, + "pct_mined_5m": 100, + "total_seen_5m": 12, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 5.92, + "avgdiff": 1, + "expectedWait": 23.5990451154, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 14.0248796148, + "pct_remaining5m": 0, + "sum": 3.10120625, + "tx_atabove": 732, + "hashpower_accepting": 20.3125, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 6.1, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 5.58, + "avgdiff": 1, + "expectedWait": 22.2247437161, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0, + "hashpower_accepting2": 14.1753611557, + "pct_remaining5m": 0, + "sum": 3.09640625, + "tx_atabove": 724, + "hashpower_accepting": 20.3125, + "hpa_coef2": -0.067, + "total_seen_30m": 3, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 6.2, + "pct_mined_5m": 100, + "total_seen_5m": 3, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 5.55, + "avgdiff": 1, + "expectedWait": 22.1183205662, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 14.3459069021, + "pct_remaining5m": 0, + "sum": 3.09580625, + "tx_atabove": 723, + "hashpower_accepting": 20.3125, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 6.3, + "pct_mined_5m": 100, + "total_seen_5m": 4, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 5.55, + "avgdiff": 1, + "expectedWait": 22.1050535543, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 14.3960674157, + "pct_remaining5m": 0, + "sum": 3.09460625, + "tx_atabove": 721, + "hashpower_accepting": 20.3125, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 6.4, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 5.54, + "avgdiff": 1, + "expectedWait": 22.0785433993, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 14.5465489567, + "pct_remaining5m": 0, + "sum": 3.09460625, + "tx_atabove": 721, + "hashpower_accepting": 20.3125, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 6.5, + "pct_mined_5m": 100, + "total_seen_5m": 3, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 5.54, + "avgdiff": 1, + "expectedWait": 22.0785433993, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 14.5666131621, + "pct_remaining5m": null, + "sum": 3.09460625, + "tx_atabove": 721, + "hashpower_accepting": 20.3125, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 6.6, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 5.54, + "avgdiff": 1, + "expectedWait": 22.0785433993, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 2, + "hashpower_accepting2": 14.6769662921, + "pct_remaining5m": null, + "sum": 3.09460625, + "tx_atabove": 721, + "hashpower_accepting": 20.3125, + "hpa_coef2": -0.067, + "total_seen_30m": 2, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 6.7, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 5.54, + "avgdiff": 1, + "expectedWait": 22.0785433993, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 14.7070626003, + "pct_remaining5m": null, + "sum": 3.09400625, + "tx_atabove": 720, + "hashpower_accepting": 20.3125, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 6.8, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 5.54, + "avgdiff": 1, + "expectedWait": 22.0653002466, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 14.7271268058, + "pct_remaining5m": 0, + "sum": 3.09400625, + "tx_atabove": 720, + "hashpower_accepting": 20.3125, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 6.9, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 5.54, + "avgdiff": 1, + "expectedWait": 22.0653002466, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 3, + "hashpower_accepting2": 15.4795345104, + "pct_remaining5m": 0, + "sum": 3.06749375, + "tx_atabove": 718, + "hashpower_accepting": 21.3541666667, + "hpa_coef2": -0.067, + "total_seen_30m": 11, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 7, + "pct_mined_5m": 100, + "total_seen_5m": 6, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 5.39, + "avgdiff": 1, + "expectedWait": 21.4879808804, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0, + "hashpower_accepting2": 15.5898876404, + "pct_remaining5m": 0, + "sum": 3.06089375, + "tx_atabove": 707, + "hashpower_accepting": 21.3541666667, + "hpa_coef2": -0.067, + "total_seen_30m": 4, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 7.1, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 5.36, + "avgdiff": 1, + "expectedWait": 21.3466271869, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 15.5999197432, + "pct_remaining5m": null, + "sum": 3.06029375, + "tx_atabove": 706, + "hashpower_accepting": 21.3541666667, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 7.2, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 5.35, + "avgdiff": 1, + "expectedWait": 21.3338230522, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0, + "hashpower_accepting2": 15.8507223114, + "pct_remaining5m": 0, + "sum": 3.05969375, + "tx_atabove": 705, + "hashpower_accepting": 21.3541666667, + "hpa_coef2": -0.067, + "total_seen_30m": 5, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 7.6, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 5.35, + "avgdiff": 1, + "expectedWait": 21.3210265977, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 15.8607544141, + "pct_remaining5m": null, + "sum": 3.05909375, + "tx_atabove": 704, + "hashpower_accepting": 21.3541666667, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 7.7, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 0, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 5.35, + "avgdiff": 1, + "expectedWait": 21.3082378187, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0, + "hashpower_accepting2": 18.86035313, + "pct_remaining5m": 0, + "sum": 2.8933625, + "tx_atabove": 702, + "hashpower_accepting": 28.125, + "hpa_coef2": -0.067, + "total_seen_30m": 30, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 8, + "pct_mined_5m": 100, + "total_seen_5m": 37, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 4.53, + "avgdiff": 1, + "expectedWait": 18.053913939, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 1, + "hashpower_accepting2": 19.1011235955, + "pct_remaining5m": 0, + "sum": 2.85250625, + "tx_atabove": 655, + "hashpower_accepting": 28.6458333333, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 8.1, + "pct_mined_5m": 100, + "total_seen_5m": 5, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 4.35, + "avgdiff": 1, + "expectedWait": 17.331163684, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 19.1613162119, + "pct_remaining5m": 0, + "sum": 2.84890625, + "tx_atabove": 649, + "hashpower_accepting": 28.6458333333, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 8.2, + "pct_mined_5m": 100, + "total_seen_5m": 3, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 4.33, + "avgdiff": 1, + "expectedWait": 17.268883666, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 19.231540931, + "pct_remaining5m": 0, + "sum": 2.8097375, + "tx_atabove": 647, + "hashpower_accepting": 30.2083333333, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 8.4, + "pct_mined_5m": 100, + "total_seen_5m": 6, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 4.17, + "avgdiff": 1, + "expectedWait": 16.6055586875, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 1, + "hashpower_accepting2": 19.5224719101, + "pct_remaining5m": 0, + "sum": 2.777225, + "tx_atabove": 635, + "hashpower_accepting": 31.25, + "hpa_coef2": -0.067, + "total_seen_30m": 7, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 8.5, + "pct_mined_5m": 100, + "total_seen_5m": 12, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 4.03, + "avgdiff": 1, + "expectedWait": 16.0743526708, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0, + "hashpower_accepting2": 19.7331460674, + "pct_remaining5m": 0, + "sum": 2.774225, + "tx_atabove": 630, + "hashpower_accepting": 31.25, + "hpa_coef2": -0.067, + "total_seen_30m": 5, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 8.6, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 4.02, + "avgdiff": 1, + "expectedWait": 16.0262018751, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 19.8033707865, + "pct_remaining5m": 0, + "sum": 2.72905625, + "tx_atabove": 618, + "hashpower_accepting": 32.8125, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 8.8, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 3.84, + "avgdiff": 1, + "expectedWait": 15.3184234339, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 19.9638844302, + "pct_remaining5m": 0, + "sum": 2.6954, + "tx_atabove": 583, + "hashpower_accepting": 33.3333333333, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 8.9, + "pct_mined_5m": 100, + "total_seen_5m": 6, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 3.72, + "avgdiff": 1, + "expectedWait": 14.8114421454, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0, + "hashpower_accepting2": 23.6155698234, + "pct_remaining5m": 0, + "sum": 2.3937875, + "tx_atabove": 460, + "hashpower_accepting": 42.7083333333, + "hpa_coef2": -0.067, + "total_seen_30m": 43, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 9, + "pct_mined_5m": 100, + "total_seen_5m": 120, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 2.75, + "avgdiff": 1, + "expectedWait": 10.9549071782, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 24.0268860353, + "pct_remaining5m": 0, + "sum": 2.30313125, + "tx_atabove": 330, + "hashpower_accepting": 43.2291666667, + "hpa_coef2": -0.067, + "total_seen_30m": 2, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 9.1, + "pct_mined_5m": 100, + "total_seen_5m": 23, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 2.51, + "avgdiff": 1, + "expectedWait": 10.0054630618, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0, + "hashpower_accepting2": 24.1472712681, + "pct_remaining5m": 0, + "sum": 2.287475, + "tx_atabove": 325, + "hashpower_accepting": 43.75, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 9.2, + "pct_mined_5m": 100, + "total_seen_5m": 3, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 2.47, + "avgdiff": 1, + "expectedWait": 9.8500349165, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 24.2174959872, + "pct_remaining5m": 0, + "sum": 2.2609625, + "tx_atabove": 323, + "hashpower_accepting": 44.7916666667, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 9.3, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 2.41, + "avgdiff": 1, + "expectedWait": 9.5923173304, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 24.3880417335, + "pct_remaining5m": 0, + "sum": 2.22239375, + "tx_atabove": 322, + "hashpower_accepting": 46.3541666667, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 9.4, + "pct_mined_5m": 100, + "total_seen_5m": 7, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 2.32, + "avgdiff": 1, + "expectedWait": 9.2293973144, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 1, + "hashpower_accepting2": 24.5284911717, + "pct_remaining5m": 0, + "sum": 2.2091375, + "tx_atabove": 321, + "hashpower_accepting": 46.875, + "hpa_coef2": -0.067, + "total_seen_30m": 5, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 9.5, + "pct_mined_5m": 100, + "total_seen_5m": 3, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 2.29, + "avgdiff": 1, + "expectedWait": 9.1078574773, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 24.7391653291, + "pct_remaining5m": 0, + "sum": 2.2073375, + "tx_atabove": 318, + "hashpower_accepting": 46.875, + "hpa_coef2": -0.067, + "total_seen_30m": 9, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 9.6, + "pct_mined_5m": 100, + "total_seen_5m": 8, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 2.28, + "avgdiff": 1, + "expectedWait": 9.0914780797, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 24.9699036918, + "pct_remaining5m": 0, + "sum": 2.182025, + "tx_atabove": 318, + "hashpower_accepting": 47.9166666667, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 9.7, + "pct_mined_5m": 88, + "total_seen_5m": 9, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 2.22, + "avgdiff": 1, + "expectedWait": 8.8642381788, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 2, + "hashpower_accepting2": 25.1203852327, + "pct_remaining5m": 0, + "sum": 2.16936875, + "tx_atabove": 318, + "hashpower_accepting": 48.4375, + "hpa_coef2": -0.067, + "total_seen_30m": 6, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 9.8, + "pct_mined_5m": 75, + "total_seen_5m": 4, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 2.2, + "avgdiff": 1, + "expectedWait": 8.7527571186, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 25.1705457464, + "pct_remaining5m": 0, + "sum": 2.1561125, + "tx_atabove": 317, + "hashpower_accepting": 48.9583333333, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 9.9, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 2.17, + "avgdiff": 1, + "expectedWait": 8.637494048, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0, + "hashpower_accepting2": 36.3864365971, + "pct_remaining5m": 0, + "sum": 1.769825, + "tx_atabove": 306, + "hashpower_accepting": 64.5833333333, + "hpa_coef2": -0.067, + "total_seen_30m": 353, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 10, + "pct_mined_5m": 99, + "total_seen_5m": 245, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 1.47, + "avgdiff": 1, + "expectedWait": 5.8698260519, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 36.536918138, + "pct_remaining5m": 0, + "sum": 1.733225, + "tx_atabove": 245, + "hashpower_accepting": 64.5833333333, + "hpa_coef2": -0.067, + "total_seen_30m": 7, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 10.1, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 1.42, + "avgdiff": 1, + "expectedWait": 5.658874382, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 36.7576243981, + "pct_remaining5m": 0, + "sum": 1.733225, + "tx_atabove": 245, + "hashpower_accepting": 64.5833333333, + "hpa_coef2": -0.067, + "total_seen_30m": 6, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 10.2, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 1.42, + "avgdiff": 1, + "expectedWait": 5.658874382, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0, + "hashpower_accepting2": 36.8378812199, + "pct_remaining5m": 0, + "sum": 1.732625, + "tx_atabove": 244, + "hashpower_accepting": 64.5833333333, + "hpa_coef2": -0.067, + "total_seen_30m": 2, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 10.3, + "pct_mined_5m": 100, + "total_seen_5m": 3, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 1.42, + "avgdiff": 1, + "expectedWait": 5.6554800758, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 36.8679775281, + "pct_remaining5m": 0, + "sum": 1.732025, + "tx_atabove": 243, + "hashpower_accepting": 64.5833333333, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 10.4, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 1.42, + "avgdiff": 1, + "expectedWait": 5.6520878055, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 1, + "hashpower_accepting2": 37.8109951846, + "pct_remaining5m": 0, + "sum": 1.69405625, + "tx_atabove": 243, + "hashpower_accepting": 66.1458333333, + "hpa_coef2": -0.067, + "total_seen_30m": 12, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 10.5, + "pct_mined_5m": 100, + "total_seen_5m": 53, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 1.37, + "avgdiff": 1, + "expectedWait": 5.4415081179, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 37.871187801, + "pct_remaining5m": 0, + "sum": 1.69285625, + "tx_atabove": 241, + "hashpower_accepting": 66.1458333333, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 10.7, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 1.36, + "avgdiff": 1, + "expectedWait": 5.4349822245, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0, + "hashpower_accepting2": 38.1019261637, + "pct_remaining5m": 0, + "sum": 1.69285625, + "tx_atabove": 241, + "hashpower_accepting": 66.1458333333, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 10.8, + "pct_mined_5m": 100, + "total_seen_5m": 6, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 1.36, + "avgdiff": 1, + "expectedWait": 5.4349822245, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 38.1821829856, + "pct_remaining5m": 0, + "sum": 1.68565625, + "tx_atabove": 229, + "hashpower_accepting": 66.1458333333, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 10.9, + "pct_mined_5m": 100, + "total_seen_5m": 3, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 1.35, + "avgdiff": 1, + "expectedWait": 5.3959908897, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0, + "hashpower_accepting2": 40.7002407705, + "pct_remaining5m": 0, + "sum": 1.520525, + "tx_atabove": 228, + "hashpower_accepting": 72.9166666667, + "hpa_coef2": -0.067, + "total_seen_30m": 84, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 11, + "pct_mined_5m": 100, + "total_seen_5m": 84, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 1.15, + "avgdiff": 1, + "expectedWait": 4.5746262436, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 40.8206260032, + "pct_remaining5m": 0, + "sum": 1.507325, + "tx_atabove": 206, + "hashpower_accepting": 72.9166666667, + "hpa_coef2": -0.067, + "total_seen_30m": 5, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 11.1, + "pct_mined_5m": 100, + "total_seen_5m": 4, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 1.13, + "avgdiff": 1, + "expectedWait": 4.5146379708, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 40.8908507223, + "pct_remaining5m": 0, + "sum": 1.507325, + "tx_atabove": 206, + "hashpower_accepting": 72.9166666667, + "hpa_coef2": -0.067, + "total_seen_30m": 2, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 11.2, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 1.13, + "avgdiff": 1, + "expectedWait": 4.5146379708, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 41.4024879615, + "pct_remaining5m": 0, + "sum": 1.49466875, + "tx_atabove": 206, + "hashpower_accepting": 73.4375, + "hpa_coef2": -0.067, + "total_seen_30m": 15, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 11.4, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 1.12, + "avgdiff": 1, + "expectedWait": 4.4578596422, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 41.4827447833, + "pct_remaining5m": 0, + "sum": 1.49466875, + "tx_atabove": 206, + "hashpower_accepting": 73.4375, + "hpa_coef2": -0.067, + "total_seen_30m": 2, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 11.5, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 1.12, + "avgdiff": 1, + "expectedWait": 4.4578596422, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 41.6131621188, + "pct_remaining5m": 0, + "sum": 1.49406875, + "tx_atabove": 205, + "hashpower_accepting": 73.4375, + "hpa_coef2": -0.067, + "total_seen_30m": 8, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 11.6, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 1.12, + "avgdiff": 1, + "expectedWait": 4.4551857287, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 41.6332263242, + "pct_remaining5m": 0, + "sum": 1.49406875, + "tx_atabove": 205, + "hashpower_accepting": 73.4375, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 11.7, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 1.12, + "avgdiff": 1, + "expectedWait": 4.4551857287, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 41.753611557, + "pct_remaining5m": 0, + "sum": 1.49406875, + "tx_atabove": 205, + "hashpower_accepting": 73.4375, + "hpa_coef2": -0.067, + "total_seen_30m": 2, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 11.8, + "pct_mined_5m": 100, + "total_seen_5m": 6, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 1.12, + "avgdiff": 1, + "expectedWait": 4.4551857287, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 41.7736757624, + "pct_remaining5m": null, + "sum": 1.49406875, + "tx_atabove": 205, + "hashpower_accepting": 73.4375, + "hpa_coef2": -0.067, + "total_seen_30m": 2, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 11.9, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 1.12, + "avgdiff": 1, + "expectedWait": 4.4551857287, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 1, + "hashpower_accepting2": 44.7030497592, + "pct_remaining5m": 0, + "sum": 1.41813125, + "tx_atabove": 205, + "hashpower_accepting": 76.5625, + "hpa_coef2": -0.067, + "total_seen_30m": 96, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 12, + "pct_mined_5m": 100, + "total_seen_5m": 39, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 1.04, + "avgdiff": 1, + "expectedWait": 4.1293964158, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 44.9036918138, + "pct_remaining5m": 0, + "sum": 1.399475, + "tx_atabove": 195, + "hashpower_accepting": 77.0833333333, + "hpa_coef2": -0.067, + "total_seen_30m": 11, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 12.1, + "pct_mined_5m": 100, + "total_seen_5m": 6, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 1.02, + "avgdiff": 1, + "expectedWait": 4.0530715456, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0, + "hashpower_accepting2": 45.0341091493, + "pct_remaining5m": null, + "sum": 1.38681875, + "tx_atabove": 195, + "hashpower_accepting": 77.6041666667, + "hpa_coef2": -0.067, + "total_seen_30m": 3, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 12.2, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 1, + "avgdiff": 1, + "expectedWait": 4.0020981056, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 45.1845906902, + "pct_remaining5m": 0, + "sum": 1.3735625, + "tx_atabove": 194, + "hashpower_accepting": 78.125, + "hpa_coef2": -0.067, + "total_seen_30m": 9, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 12.3, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.99, + "avgdiff": 1, + "expectedWait": 3.9493953846, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 45.1946227929, + "pct_remaining5m": null, + "sum": 1.3735625, + "tx_atabove": 194, + "hashpower_accepting": 78.125, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 12.4, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.99, + "avgdiff": 1, + "expectedWait": 3.9493953846, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 45.3752006421, + "pct_remaining5m": 0, + "sum": 1.36090625, + "tx_atabove": 194, + "hashpower_accepting": 78.6458333333, + "hpa_coef2": -0.067, + "total_seen_30m": 10, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 12.5, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.98, + "avgdiff": 1, + "expectedWait": 3.8997258274, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 45.4955858748, + "pct_remaining5m": 0, + "sum": 1.36090625, + "tx_atabove": 194, + "hashpower_accepting": 78.6458333333, + "hpa_coef2": -0.067, + "total_seen_30m": 4, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 12.6, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.98, + "avgdiff": 1, + "expectedWait": 3.8997258274, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 45.525682183, + "pct_remaining5m": null, + "sum": 1.36090625, + "tx_atabove": 194, + "hashpower_accepting": 78.6458333333, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 12.7, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.98, + "avgdiff": 1, + "expectedWait": 3.8997258274, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 45.5858747994, + "pct_remaining5m": 0, + "sum": 1.36090625, + "tx_atabove": 194, + "hashpower_accepting": 78.6458333333, + "hpa_coef2": -0.067, + "total_seen_30m": 4, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 12.8, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.98, + "avgdiff": 1, + "expectedWait": 3.8997258274, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 45.636035313, + "pct_remaining5m": 0, + "sum": 1.36090625, + "tx_atabove": 194, + "hashpower_accepting": 78.6458333333, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 12.9, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.98, + "avgdiff": 1, + "expectedWait": 3.8997258274, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 1, + "hashpower_accepting2": 46.9903691814, + "pct_remaining5m": 0, + "sum": 1.31028125, + "tx_atabove": 194, + "hashpower_accepting": 80.7291666667, + "hpa_coef2": -0.067, + "total_seen_30m": 47, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 13, + "pct_mined_5m": 100, + "total_seen_5m": 34, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.93, + "avgdiff": 1, + "expectedWait": 3.7072162202, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 47.5321027287, + "pct_remaining5m": 0, + "sum": 1.292825, + "tx_atabove": 186, + "hashpower_accepting": 81.25, + "hpa_coef2": -0.067, + "total_seen_30m": 9, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 13.2, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.91, + "avgdiff": 1, + "expectedWait": 3.6430636874, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 47.5621990369, + "pct_remaining5m": 0, + "sum": 1.292825, + "tx_atabove": 186, + "hashpower_accepting": 81.25, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 13.3, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.91, + "avgdiff": 1, + "expectedWait": 3.6430636874, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 47.632423756, + "pct_remaining5m": null, + "sum": 1.292825, + "tx_atabove": 186, + "hashpower_accepting": 81.25, + "hpa_coef2": -0.067, + "total_seen_30m": 2, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 13.4, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.91, + "avgdiff": 1, + "expectedWait": 3.6430636874, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0.5, + "hashpower_accepting2": 48.1440609952, + "pct_remaining5m": 0, + "sum": 1.28016875, + "tx_atabove": 186, + "hashpower_accepting": 81.7708333333, + "hpa_coef2": -0.067, + "total_seen_30m": 2, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 13.5, + "pct_mined_5m": 100, + "total_seen_5m": 21, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.9, + "avgdiff": 1, + "expectedWait": 3.5972467097, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 48.4550561798, + "pct_remaining5m": 0, + "sum": 1.2651125, + "tx_atabove": 182, + "hashpower_accepting": 82.2916666667, + "hpa_coef2": -0.067, + "total_seen_30m": 10, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 13.6, + "pct_mined_5m": 100, + "total_seen_5m": 10, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.89, + "avgdiff": 1, + "expectedWait": 3.5434913565, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 1, + "hashpower_accepting2": 55.9590690209, + "pct_remaining5m": 0, + "sum": 1.2398, + "tx_atabove": 182, + "hashpower_accepting": 83.3333333333, + "hpa_coef2": -0.067, + "total_seen_30m": 253, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 13.7, + "pct_mined_5m": 100, + "total_seen_5m": 212, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.87, + "avgdiff": 1, + "expectedWait": 3.4549224112, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 56.0593900482, + "pct_remaining5m": 0, + "sum": 1.226, + "tx_atabove": 159, + "hashpower_accepting": 83.3333333333, + "hpa_coef2": -0.067, + "total_seen_30m": 6, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 13.8, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.86, + "avgdiff": 1, + "expectedWait": 3.4075719515, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 56.1095505618, + "pct_remaining5m": 0, + "sum": 1.226, + "tx_atabove": 159, + "hashpower_accepting": 83.3333333333, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 13.9, + "pct_mined_5m": 100, + "total_seen_5m": 4, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.86, + "avgdiff": 1, + "expectedWait": 3.4075719515, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0.5, + "hashpower_accepting2": 59.6408507223, + "pct_remaining5m": 0, + "sum": 1.13740625, + "tx_atabove": 159, + "hashpower_accepting": 86.9791666667, + "hpa_coef2": -0.067, + "total_seen_30m": 119, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 14, + "pct_mined_5m": 100, + "total_seen_5m": 115, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.78, + "avgdiff": 1, + "expectedWait": 3.1186688184, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 59.7311396469, + "pct_remaining5m": 0, + "sum": 1.13440625, + "tx_atabove": 154, + "hashpower_accepting": 86.9791666667, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 14.1, + "pct_mined_5m": 100, + "total_seen_5m": 5, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.78, + "avgdiff": 1, + "expectedWait": 3.1093268319, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 59.8214285714, + "pct_remaining5m": 0, + "sum": 1.13440625, + "tx_atabove": 154, + "hashpower_accepting": 86.9791666667, + "hpa_coef2": -0.067, + "total_seen_30m": 4, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 14.2, + "pct_mined_5m": 100, + "total_seen_5m": 4, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.78, + "avgdiff": 1, + "expectedWait": 3.1093268319, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 1, + "hashpower_accepting2": 60.1524879615, + "pct_remaining5m": 0, + "sum": 1.13380625, + "tx_atabove": 153, + "hashpower_accepting": 86.9791666667, + "hpa_coef2": -0.067, + "total_seen_30m": 5, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 14.4, + "pct_mined_5m": 100, + "total_seen_5m": 3, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.78, + "avgdiff": 1, + "expectedWait": 3.1074617954, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 60.1725521669, + "pct_remaining5m": 0, + "sum": 1.13320625, + "tx_atabove": 152, + "hashpower_accepting": 86.9791666667, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 14.5, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.78, + "avgdiff": 1, + "expectedWait": 3.1055978775, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 60.2528089888, + "pct_remaining5m": 0, + "sum": 1.13320625, + "tx_atabove": 152, + "hashpower_accepting": 86.9791666667, + "hpa_coef2": -0.067, + "total_seen_30m": 3, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 14.6, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.78, + "avgdiff": 1, + "expectedWait": 3.1055978775, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 60.6440609952, + "pct_remaining5m": 0, + "sum": 1.13320625, + "tx_atabove": 152, + "hashpower_accepting": 86.9791666667, + "hpa_coef2": -0.067, + "total_seen_30m": 10, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 14.7, + "pct_mined_5m": 100, + "total_seen_5m": 10, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.78, + "avgdiff": 1, + "expectedWait": 3.1055978775, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 60.6641252006, + "pct_remaining5m": 0, + "sum": 1.13320625, + "tx_atabove": 152, + "hashpower_accepting": 86.9791666667, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 14.8, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.78, + "avgdiff": 1, + "expectedWait": 3.1055978775, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 60.6942215088, + "pct_remaining5m": null, + "sum": 1.13320625, + "tx_atabove": 152, + "hashpower_accepting": 86.9791666667, + "hpa_coef2": -0.067, + "total_seen_30m": 2, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 14.9, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.78, + "avgdiff": 1, + "expectedWait": 3.1055978775, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0, + "hashpower_accepting2": 62.9113162119, + "pct_remaining5m": 0, + "sum": 1.0952375, + "tx_atabove": 152, + "hashpower_accepting": 88.5416666667, + "hpa_coef2": -0.067, + "total_seen_30m": 65, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 15, + "pct_mined_5m": 100, + "total_seen_5m": 48, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.75, + "avgdiff": 1, + "expectedWait": 2.9898926986, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 63.4129213483, + "pct_remaining5m": 0, + "sum": 1.0910375, + "tx_atabove": 145, + "hashpower_accepting": 88.5416666667, + "hpa_coef2": -0.067, + "total_seen_30m": 11, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 15.1, + "pct_mined_5m": 100, + "total_seen_5m": 8, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.75, + "avgdiff": 1, + "expectedWait": 2.9773614832, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 1, + "hashpower_accepting2": 64.4161316212, + "pct_remaining5m": 0, + "sum": 1.0886375, + "tx_atabove": 141, + "hashpower_accepting": 88.5416666667, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 15.5, + "pct_mined_5m": 100, + "total_seen_5m": 4, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.75, + "avgdiff": 1, + "expectedWait": 2.9702243836, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 64.4863563403, + "pct_remaining5m": 0, + "sum": 1.0820375, + "tx_atabove": 130, + "hashpower_accepting": 88.5416666667, + "hpa_coef2": -0.067, + "total_seen_30m": 5, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 15.6, + "pct_mined_5m": 50, + "total_seen_5m": 2, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.74, + "avgdiff": 1, + "expectedWait": 2.9506854521, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 1, + "hashpower_accepting2": 66.1817817014, + "pct_remaining5m": 0, + "sum": 1.0820375, + "tx_atabove": 130, + "hashpower_accepting": 88.5416666667, + "hpa_coef2": -0.067, + "total_seen_30m": 24, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 15.7, + "pct_mined_5m": 100, + "total_seen_5m": 17, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.74, + "avgdiff": 1, + "expectedWait": 2.9506854521, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 66.2620385233, + "pct_remaining5m": 0, + "sum": 1.0766375, + "tx_atabove": 121, + "hashpower_accepting": 88.5416666667, + "hpa_coef2": -0.067, + "total_seen_30m": 2, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 15.8, + "pct_mined_5m": 83, + "total_seen_5m": 6, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.74, + "avgdiff": 1, + "expectedWait": 2.9347946943, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0, + "hashpower_accepting2": 67.2853130016, + "pct_remaining5m": 0, + "sum": 1.0766375, + "tx_atabove": 121, + "hashpower_accepting": 88.5416666667, + "hpa_coef2": -0.067, + "total_seen_30m": 15, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 16, + "pct_mined_5m": 100, + "total_seen_5m": 11, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.74, + "avgdiff": 1, + "expectedWait": 2.9347946943, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 67.2953451043, + "pct_remaining5m": null, + "sum": 1.0748375, + "tx_atabove": 118, + "hashpower_accepting": 88.5416666667, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 16.1, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.74, + "avgdiff": 1, + "expectedWait": 2.9295168154, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 67.4458266453, + "pct_remaining5m": 0, + "sum": 1.0748375, + "tx_atabove": 118, + "hashpower_accepting": 88.5416666667, + "hpa_coef2": -0.067, + "total_seen_30m": 3, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 16.2, + "pct_mined_5m": 100, + "total_seen_5m": 7, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.74, + "avgdiff": 1, + "expectedWait": 2.9295168154, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 67.455858748, + "pct_remaining5m": 0, + "sum": 1.0748375, + "tx_atabove": 118, + "hashpower_accepting": 88.5416666667, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 16.3, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.74, + "avgdiff": 1, + "expectedWait": 2.9295168154, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 67.6565008026, + "pct_remaining5m": 0, + "sum": 1.0748375, + "tx_atabove": 118, + "hashpower_accepting": 88.5416666667, + "hpa_coef2": -0.067, + "total_seen_30m": 5, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 16.4, + "pct_mined_5m": 100, + "total_seen_5m": 7, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.74, + "avgdiff": 1, + "expectedWait": 2.9295168154, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 67.7267255217, + "pct_remaining5m": 0, + "sum": 1.0742375, + "tx_atabove": 117, + "hashpower_accepting": 88.5416666667, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 16.5, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.73, + "avgdiff": 1, + "expectedWait": 2.9277596325, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 1, + "hashpower_accepting2": 68.6697431782, + "pct_remaining5m": 0, + "sum": 1.0742375, + "tx_atabove": 117, + "hashpower_accepting": 88.5416666667, + "hpa_coef2": -0.067, + "total_seen_30m": 42, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 16.7, + "pct_mined_5m": 100, + "total_seen_5m": 27, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.73, + "avgdiff": 1, + "expectedWait": 2.9277596325, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 68.8904494382, + "pct_remaining5m": 0, + "sum": 1.0718375, + "tx_atabove": 113, + "hashpower_accepting": 88.5416666667, + "hpa_coef2": -0.067, + "total_seen_30m": 11, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 17, + "pct_mined_5m": 100, + "total_seen_5m": 3, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.73, + "avgdiff": 1, + "expectedWait": 2.9207414346, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0, + "hashpower_accepting2": 69.0308988764, + "pct_remaining5m": 0, + "sum": 1.0712375, + "tx_atabove": 112, + "hashpower_accepting": 88.5416666667, + "hpa_coef2": -0.067, + "total_seen_30m": 8, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 17.1, + "pct_mined_5m": 100, + "total_seen_5m": 3, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.73, + "avgdiff": 1, + "expectedWait": 2.9189895153, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 69.0409309791, + "pct_remaining5m": null, + "sum": 1.0706375, + "tx_atabove": 111, + "hashpower_accepting": 88.5416666667, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 17.3, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.73, + "avgdiff": 1, + "expectedWait": 2.9172386469, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 69.0710272873, + "pct_remaining5m": 0, + "sum": 1.0706375, + "tx_atabove": 111, + "hashpower_accepting": 88.5416666667, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 17.5, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.73, + "avgdiff": 1, + "expectedWait": 2.9172386469, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 69.08105939, + "pct_remaining5m": 0, + "sum": 1.0706375, + "tx_atabove": 111, + "hashpower_accepting": 88.5416666667, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 17.6, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.73, + "avgdiff": 1, + "expectedWait": 2.9172386469, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 69.1011235955, + "pct_remaining5m": null, + "sum": 1.0706375, + "tx_atabove": 111, + "hashpower_accepting": 88.5416666667, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 17.8, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.73, + "avgdiff": 1, + "expectedWait": 2.9172386469, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 69.1111556982, + "pct_remaining5m": 0, + "sum": 1.0706375, + "tx_atabove": 111, + "hashpower_accepting": 88.5416666667, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 17.9, + "pct_mined_5m": 0, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.73, + "avgdiff": 1, + "expectedWait": 2.9172386469, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 69.7632423756, + "pct_remaining5m": 0, + "sum": 1.05798125, + "tx_atabove": 111, + "hashpower_accepting": 89.0625, + "hpa_coef2": -0.067, + "total_seen_30m": 16, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 18, + "pct_mined_5m": 100, + "total_seen_5m": 16, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.72, + "avgdiff": 1, + "expectedWait": 2.8805500054, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 69.7732744783, + "pct_remaining5m": 0, + "sum": 1.05618125, + "tx_atabove": 108, + "hashpower_accepting": 89.0625, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 18.1, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.72, + "avgdiff": 1, + "expectedWait": 2.875369679, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 69.8134028892, + "pct_remaining5m": 0, + "sum": 1.05618125, + "tx_atabove": 108, + "hashpower_accepting": 89.0625, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 18.5, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.72, + "avgdiff": 1, + "expectedWait": 2.875369679, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 69.823434992, + "pct_remaining5m": 0, + "sum": 1.05618125, + "tx_atabove": 108, + "hashpower_accepting": 89.0625, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 18.7, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.72, + "avgdiff": 1, + "expectedWait": 2.875369679, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 69.8535313002, + "pct_remaining5m": null, + "sum": 1.05618125, + "tx_atabove": 108, + "hashpower_accepting": 89.0625, + "hpa_coef2": -0.067, + "total_seen_30m": 2, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 18.8, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.72, + "avgdiff": 1, + "expectedWait": 2.875369679, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 69.8735955056, + "pct_remaining5m": 0, + "sum": 1.05618125, + "tx_atabove": 108, + "hashpower_accepting": 89.0625, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 18.9, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.72, + "avgdiff": 1, + "expectedWait": 2.875369679, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 70.3150080257, + "pct_remaining5m": 0, + "sum": 1.043525, + "tx_atabove": 108, + "hashpower_accepting": 89.5833333333, + "hpa_coef2": -0.067, + "total_seen_30m": 13, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 19, + "pct_mined_5m": 100, + "total_seen_5m": 11, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.71, + "avgdiff": 1, + "expectedWait": 2.8392076024, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 70.3350722311, + "pct_remaining5m": 0, + "sum": 1.042325, + "tx_atabove": 106, + "hashpower_accepting": 89.5833333333, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 19.3, + "pct_mined_5m": 66, + "total_seen_5m": 3, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.71, + "avgdiff": 1, + "expectedWait": 2.8358025967, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 70.3752006421, + "pct_remaining5m": 0, + "sum": 1.042325, + "tx_atabove": 106, + "hashpower_accepting": 89.5833333333, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 19.4, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.71, + "avgdiff": 1, + "expectedWait": 2.8358025967, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 70.3852327448, + "pct_remaining5m": null, + "sum": 1.042325, + "tx_atabove": 106, + "hashpower_accepting": 89.5833333333, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 19.5, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.71, + "avgdiff": 1, + "expectedWait": 2.8358025967, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 70.4052969502, + "pct_remaining5m": null, + "sum": 1.042325, + "tx_atabove": 106, + "hashpower_accepting": 89.5833333333, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 19.8, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.71, + "avgdiff": 1, + "expectedWait": 2.8358025967, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 70.8266452648, + "pct_remaining5m": 0, + "sum": 1.042325, + "tx_atabove": 106, + "hashpower_accepting": 89.5833333333, + "hpa_coef2": -0.067, + "total_seen_30m": 18, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 19.9, + "pct_mined_5m": 100, + "total_seen_5m": 10, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.71, + "avgdiff": 1, + "expectedWait": 2.8358025967, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0, + "hashpower_accepting2": 75.2708667737, + "pct_remaining5m": 0, + "sum": 0.90310625, + "tx_atabove": 106, + "hashpower_accepting": 95.3125, + "hpa_coef2": -0.067, + "total_seen_30m": 144, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 20, + "pct_mined_5m": 100, + "total_seen_5m": 185, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.62, + "avgdiff": 1, + "expectedWait": 2.4672551317, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 75.3009630819, + "pct_remaining5m": null, + "sum": 0.89650625, + "tx_atabove": 95, + "hashpower_accepting": 95.3125, + "hpa_coef2": -0.067, + "total_seen_30m": 3, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 20.2, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.62, + "avgdiff": 1, + "expectedWait": 2.4510248666, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 75.3210272873, + "pct_remaining5m": 0, + "sum": 0.89650625, + "tx_atabove": 95, + "hashpower_accepting": 95.3125, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 20.3, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.62, + "avgdiff": 1, + "expectedWait": 2.4510248666, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 77.7387640449, + "pct_remaining5m": 0, + "sum": 0.88385, + "tx_atabove": 95, + "hashpower_accepting": 95.8333333333, + "hpa_coef2": -0.067, + "total_seen_30m": 24, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 20.5, + "pct_mined_5m": 100, + "total_seen_5m": 9, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.61, + "avgdiff": 1, + "expectedWait": 2.420199561, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 77.7688603531, + "pct_remaining5m": 0, + "sum": 0.88325, + "tx_atabove": 94, + "hashpower_accepting": 95.8333333333, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 20.7, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.61, + "avgdiff": 1, + "expectedWait": 2.4187478768, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 77.9093097913, + "pct_remaining5m": null, + "sum": 0.87059375, + "tx_atabove": 94, + "hashpower_accepting": 96.3541666667, + "hpa_coef2": -0.067, + "total_seen_30m": 7, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 20.9, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.6, + "avgdiff": 1, + "expectedWait": 2.3883285027, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0, + "hashpower_accepting2": 79.7752808989, + "pct_remaining5m": 0, + "sum": 0.87059375, + "tx_atabove": 94, + "hashpower_accepting": 96.3541666667, + "hpa_coef2": -0.067, + "total_seen_30m": 39, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 21, + "pct_mined_5m": 100, + "total_seen_5m": 36, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.6, + "avgdiff": 1, + "expectedWait": 2.3883285027, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 79.7953451043, + "pct_remaining5m": 0, + "sum": 0.86819375, + "tx_atabove": 90, + "hashpower_accepting": 96.3541666667, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 21.1, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.6, + "avgdiff": 1, + "expectedWait": 2.3826033871, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 79.8154093098, + "pct_remaining5m": null, + "sum": 0.86819375, + "tx_atabove": 90, + "hashpower_accepting": 96.3541666667, + "hpa_coef2": -0.067, + "total_seen_30m": 2, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 21.4, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.6, + "avgdiff": 1, + "expectedWait": 2.3826033871, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 79.845505618, + "pct_remaining5m": 0, + "sum": 0.86819375, + "tx_atabove": 90, + "hashpower_accepting": 96.3541666667, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 21.7, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.6, + "avgdiff": 1, + "expectedWait": 2.3826033871, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 80.3069823435, + "pct_remaining5m": 0, + "sum": 0.86819375, + "tx_atabove": 90, + "hashpower_accepting": 96.3541666667, + "hpa_coef2": -0.067, + "total_seen_30m": 9, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 21.9, + "pct_mined_5m": 100, + "total_seen_5m": 3, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.6, + "avgdiff": 1, + "expectedWait": 2.3826033871, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 80.8888443018, + "pct_remaining5m": 0, + "sum": 0.8555375, + "tx_atabove": 90, + "hashpower_accepting": 96.875, + "hpa_coef2": -0.067, + "total_seen_30m": 13, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 22, + "pct_mined_5m": 100, + "total_seen_5m": 13, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.59, + "avgdiff": 1, + "expectedWait": 2.352638584, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 80.9089085072, + "pct_remaining5m": null, + "sum": 0.8555375, + "tx_atabove": 90, + "hashpower_accepting": 96.875, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 22.1, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.59, + "avgdiff": 1, + "expectedWait": 2.352638584, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 80.91894061, + "pct_remaining5m": 0, + "sum": 0.8555375, + "tx_atabove": 90, + "hashpower_accepting": 96.875, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 22.2, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.59, + "avgdiff": 1, + "expectedWait": 2.352638584, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 80.9289727127, + "pct_remaining5m": null, + "sum": 0.8555375, + "tx_atabove": 90, + "hashpower_accepting": 96.875, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 22.3, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.59, + "avgdiff": 1, + "expectedWait": 2.352638584, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 80.9490369181, + "pct_remaining5m": 0, + "sum": 0.8555375, + "tx_atabove": 90, + "hashpower_accepting": 96.875, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 22.5, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.59, + "avgdiff": 1, + "expectedWait": 2.352638584, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 80.9791332263, + "pct_remaining5m": 0, + "sum": 0.8555375, + "tx_atabove": 90, + "hashpower_accepting": 96.875, + "hpa_coef2": -0.067, + "total_seen_30m": 2, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 22.8, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.59, + "avgdiff": 1, + "expectedWait": 2.352638584, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 80.9891653291, + "pct_remaining5m": null, + "sum": 0.8555375, + "tx_atabove": 90, + "hashpower_accepting": 96.875, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 22.9, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.59, + "avgdiff": 1, + "expectedWait": 2.352638584, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0, + "hashpower_accepting2": 81.47070626, + "pct_remaining5m": 0, + "sum": 0.8555375, + "tx_atabove": 90, + "hashpower_accepting": 96.875, + "hpa_coef2": -0.067, + "total_seen_30m": 15, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 23, + "pct_mined_5m": 100, + "total_seen_5m": 19, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.59, + "avgdiff": 1, + "expectedWait": 2.352638584, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 81.4907704655, + "pct_remaining5m": 0, + "sum": 0.8531375, + "tx_atabove": 86, + "hashpower_accepting": 96.875, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 23.1, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.59, + "avgdiff": 1, + "expectedWait": 2.3469990216, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 81.5108346709, + "pct_remaining5m": 0, + "sum": 0.8525375, + "tx_atabove": 85, + "hashpower_accepting": 96.875, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 23.3, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.59, + "avgdiff": 1, + "expectedWait": 2.3455912446, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 81.6011235955, + "pct_remaining5m": 0, + "sum": 0.8525375, + "tx_atabove": 85, + "hashpower_accepting": 96.875, + "hpa_coef2": -0.067, + "total_seen_30m": 3, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 23.7, + "pct_mined_5m": 100, + "total_seen_5m": 3, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.59, + "avgdiff": 1, + "expectedWait": 2.3455912446, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 81.621187801, + "pct_remaining5m": 0, + "sum": 0.8525375, + "tx_atabove": 85, + "hashpower_accepting": 96.875, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 23.9, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.59, + "avgdiff": 1, + "expectedWait": 2.3455912446, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0, + "hashpower_accepting2": 81.8719903692, + "pct_remaining5m": 0, + "sum": 0.8525375, + "tx_atabove": 85, + "hashpower_accepting": 96.875, + "hpa_coef2": -0.067, + "total_seen_30m": 7, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 24, + "pct_mined_5m": 100, + "total_seen_5m": 9, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.59, + "avgdiff": 1, + "expectedWait": 2.3455912446, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 81.8820224719, + "pct_remaining5m": 0, + "sum": 0.8501375, + "tx_atabove": 81, + "hashpower_accepting": 96.875, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 24.3, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.59, + "avgdiff": 1, + "expectedWait": 2.3399685755, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 81.9121187801, + "pct_remaining5m": 0, + "sum": 0.8501375, + "tx_atabove": 81, + "hashpower_accepting": 96.875, + "hpa_coef2": -0.067, + "total_seen_30m": 2, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 24.6, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.59, + "avgdiff": 1, + "expectedWait": 2.3399685755, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 81.9321829856, + "pct_remaining5m": 0, + "sum": 0.8501375, + "tx_atabove": 81, + "hashpower_accepting": 96.875, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 24.7, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.59, + "avgdiff": 1, + "expectedWait": 2.3399685755, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0, + "hashpower_accepting2": 83.3868378812, + "pct_remaining5m": 0, + "sum": 0.83688125, + "tx_atabove": 80, + "hashpower_accepting": 97.3958333333, + "hpa_coef2": -0.067, + "total_seen_30m": 24, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 25, + "pct_mined_5m": 100, + "total_seen_5m": 32, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.58, + "avgdiff": 1, + "expectedWait": 2.3091540608, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 83.6276083467, + "pct_remaining5m": 0, + "sum": 0.82128125, + "tx_atabove": 54, + "hashpower_accepting": 97.3958333333, + "hpa_coef2": -0.067, + "total_seen_30m": 10, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 26, + "pct_mined_5m": 100, + "total_seen_5m": 7, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.57, + "avgdiff": 1, + "expectedWait": 2.2734107799, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0, + "hashpower_accepting2": 83.7379614767, + "pct_remaining5m": 0, + "sum": 0.82008125, + "tx_atabove": 52, + "hashpower_accepting": 97.3958333333, + "hpa_coef2": -0.067, + "total_seen_30m": 5, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 27, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.57, + "avgdiff": 1, + "expectedWait": 2.2706843231, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 83.9887640449, + "pct_remaining5m": 0, + "sum": 0.81948125, + "tx_atabove": 51, + "hashpower_accepting": 97.3958333333, + "hpa_coef2": -0.067, + "total_seen_30m": 13, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 28, + "pct_mined_5m": 100, + "total_seen_5m": 7, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.57, + "avgdiff": 1, + "expectedWait": 2.2693223212, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 84.0690208668, + "pct_remaining5m": 0, + "sum": 0.806825, + "tx_atabove": 51, + "hashpower_accepting": 97.9166666667, + "hpa_coef2": -0.067, + "total_seen_30m": 4, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 29, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.56, + "avgdiff": 1, + "expectedWait": 2.240782197, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0, + "hashpower_accepting2": 85.8447030498, + "pct_remaining5m": 0, + "sum": 0.7809125, + "tx_atabove": 50, + "hashpower_accepting": 98.9583333333, + "hpa_coef2": -0.067, + "total_seen_30m": 55, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 30, + "pct_mined_5m": 100, + "total_seen_5m": 49, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.55, + "avgdiff": 1, + "expectedWait": 2.1834637674, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 85.9751203852, + "pct_remaining5m": 0, + "sum": 0.7743125, + "tx_atabove": 39, + "hashpower_accepting": 98.9583333333, + "hpa_coef2": -0.067, + "total_seen_30m": 6, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 31, + "pct_mined_5m": 100, + "total_seen_5m": 5, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.54, + "avgdiff": 1, + "expectedWait": 2.169100358, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 86.1356340289, + "pct_remaining5m": 0, + "sum": 0.7743125, + "tx_atabove": 39, + "hashpower_accepting": 98.9583333333, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 32, + "pct_mined_5m": 100, + "total_seen_5m": 4, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.54, + "avgdiff": 1, + "expectedWait": 2.169100358, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 86.2760834671, + "pct_remaining5m": 0, + "sum": 0.7743125, + "tx_atabove": 39, + "hashpower_accepting": 98.9583333333, + "hpa_coef2": -0.067, + "total_seen_30m": 3, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 33, + "pct_mined_5m": 100, + "total_seen_5m": 6, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.54, + "avgdiff": 1, + "expectedWait": 2.169100358, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 86.4165329053, + "pct_remaining5m": 0, + "sum": 0.7737125, + "tx_atabove": 38, + "hashpower_accepting": 98.9583333333, + "hpa_coef2": -0.067, + "total_seen_30m": 6, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 34, + "pct_mined_5m": 60, + "total_seen_5m": 5, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.54, + "avgdiff": 1, + "expectedWait": 2.1677992881, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0.5, + "hashpower_accepting2": 86.7475922953, + "pct_remaining5m": 0, + "sum": 0.7737125, + "tx_atabove": 38, + "hashpower_accepting": 98.9583333333, + "hpa_coef2": -0.067, + "total_seen_30m": 10, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 35, + "pct_mined_5m": 100, + "total_seen_5m": 17, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.54, + "avgdiff": 1, + "expectedWait": 2.1677992881, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 86.7877207063, + "pct_remaining5m": 0, + "sum": 0.7725125, + "tx_atabove": 36, + "hashpower_accepting": 98.9583333333, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 36, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.54, + "avgdiff": 1, + "expectedWait": 2.1651994891, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 86.8579454254, + "pct_remaining5m": 0, + "sum": 0.7725125, + "tx_atabove": 36, + "hashpower_accepting": 98.9583333333, + "hpa_coef2": -0.067, + "total_seen_30m": 2, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 37, + "pct_mined_5m": 66, + "total_seen_5m": 3, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.54, + "avgdiff": 1, + "expectedWait": 2.1651994891, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 86.908105939, + "pct_remaining5m": 0, + "sum": 0.7725125, + "tx_atabove": 36, + "hashpower_accepting": 98.9583333333, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 38, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.54, + "avgdiff": 1, + "expectedWait": 2.1651994891, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 86.9783306581, + "pct_remaining5m": 0, + "sum": 0.7725125, + "tx_atabove": 36, + "hashpower_accepting": 98.9583333333, + "hpa_coef2": -0.067, + "total_seen_30m": 3, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 39, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.54, + "avgdiff": 1, + "expectedWait": 2.1651994891, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 1, + "hashpower_accepting2": 87.4498394864, + "pct_remaining5m": 0, + "sum": 0.75985625, + "tx_atabove": 36, + "hashpower_accepting": 99.4791666667, + "hpa_coef2": -0.067, + "total_seen_30m": 16, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 40, + "pct_mined_5m": 100, + "total_seen_5m": 14, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.54, + "avgdiff": 1, + "expectedWait": 2.1379688654, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 1, + "hashpower_accepting2": 89.6167736758, + "pct_remaining5m": 0, + "sum": 0.75805625, + "tx_atabove": 33, + "hashpower_accepting": 99.4791666667, + "hpa_coef2": -0.067, + "total_seen_30m": 112, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 41, + "pct_mined_5m": 100, + "total_seen_5m": 57, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.54, + "avgdiff": 1, + "expectedWait": 2.1341239829, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 89.6869983949, + "pct_remaining5m": 0, + "sum": 0.75445625, + "tx_atabove": 27, + "hashpower_accepting": 99.4791666667, + "hpa_coef2": -0.067, + "total_seen_30m": 2, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 42, + "pct_mined_5m": 100, + "total_seen_5m": 3, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.53, + "avgdiff": 1, + "expectedWait": 2.1264549491, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 89.7070626003, + "pct_remaining5m": null, + "sum": 0.75385625, + "tx_atabove": 26, + "hashpower_accepting": 99.4791666667, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 43, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.53, + "avgdiff": 1, + "expectedWait": 2.1251794588, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 1, + "hashpower_accepting2": 89.9478330658, + "pct_remaining5m": 0, + "sum": 0.75385625, + "tx_atabove": 26, + "hashpower_accepting": 99.4791666667, + "hpa_coef2": -0.067, + "total_seen_30m": 9, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 44, + "pct_mined_5m": 100, + "total_seen_5m": 9, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.53, + "avgdiff": 1, + "expectedWait": 2.1251794588, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 90.088282504, + "pct_remaining5m": 0, + "sum": 0.7394, + "tx_atabove": 23, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 8, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 45, + "pct_mined_5m": 100, + "total_seen_5m": 5, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.53, + "avgdiff": 1, + "expectedWait": 2.0946783304, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 1, + "hashpower_accepting2": 90.4995987159, + "pct_remaining5m": 0, + "sum": 0.7394, + "tx_atabove": 23, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 17, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 46, + "pct_mined_5m": 100, + "total_seen_5m": 19, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.53, + "avgdiff": 1, + "expectedWait": 2.0946783304, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 90.5999197432, + "pct_remaining5m": 0, + "sum": 0.7382, + "tx_atabove": 21, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 4, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 47, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.53, + "avgdiff": 1, + "expectedWait": 2.0921662239, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 90.6199839486, + "pct_remaining5m": null, + "sum": 0.7382, + "tx_atabove": 21, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 2, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 48, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.53, + "avgdiff": 1, + "expectedWait": 2.0921662239, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 90.6500802568, + "pct_remaining5m": null, + "sum": 0.7382, + "tx_atabove": 21, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 2, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 49, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.53, + "avgdiff": 1, + "expectedWait": 2.0921662239, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 1, + "hashpower_accepting2": 94.1412520064, + "pct_remaining5m": 0, + "sum": 0.7382, + "tx_atabove": 21, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 62, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 50, + "pct_mined_5m": 100, + "total_seen_5m": 71, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.53, + "avgdiff": 1, + "expectedWait": 2.0921662239, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 94.2114767255, + "pct_remaining5m": 0, + "sum": 0.7358, + "tx_atabove": 17, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 51, + "pct_mined_5m": 100, + "total_seen_5m": 3, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0871510456, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 94.4422150883, + "pct_remaining5m": 0, + "sum": 0.7358, + "tx_atabove": 17, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 5, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 52, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0871510456, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 94.4723113965, + "pct_remaining5m": null, + "sum": 0.7358, + "tx_atabove": 17, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 2, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 54, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0871510456, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 94.4823434992, + "pct_remaining5m": null, + "sum": 0.7346, + "tx_atabove": 15, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 56, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0846479665, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0, + "hashpower_accepting2": 95.0140449438, + "pct_remaining5m": 0, + "sum": 0.7346, + "tx_atabove": 15, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 27, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 60, + "pct_mined_5m": 100, + "total_seen_5m": 17, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0846479665, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0, + "hashpower_accepting2": 95.6059390048, + "pct_remaining5m": 0, + "sum": 0.7334, + "tx_atabove": 13, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 28, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 61, + "pct_mined_5m": 100, + "total_seen_5m": 14, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0821478893, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 96.8699839486, + "pct_remaining5m": 0, + "sum": 0.7322, + "tx_atabove": 11, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 21, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 63, + "pct_mined_5m": 100, + "total_seen_5m": 25, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0796508104, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 1, + "hashpower_accepting2": 98.3948635634, + "pct_remaining5m": 0, + "sum": 0.7298, + "tx_atabove": 7, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 83, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 64, + "pct_mined_5m": 100, + "total_seen_5m": 38, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0746656331, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 98.4149277689, + "pct_remaining5m": 0, + "sum": 0.728, + "tx_atabove": 4, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 65, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0709345939, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 98.4951845907, + "pct_remaining5m": 0, + "sum": 0.7274, + "tx_atabove": 3, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 3, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 66, + "pct_mined_5m": 100, + "total_seen_5m": 3, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0696924058, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 98.5052166934, + "pct_remaining5m": null, + "sum": 0.7274, + "tx_atabove": 3, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 69, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0696924058, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 98.5152487961, + "pct_remaining5m": null, + "sum": 0.7274, + "tx_atabove": 3, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 70, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0696924058, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 98.5553772071, + "pct_remaining5m": 0, + "sum": 0.7274, + "tx_atabove": 3, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 72, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0696924058, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 98.5754414125, + "pct_remaining5m": 0, + "sum": 0.7274, + "tx_atabove": 3, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 73, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0696924058, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 98.5854735152, + "pct_remaining5m": 0, + "sum": 0.7274, + "tx_atabove": 3, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 77, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0696924058, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 98.6055377207, + "pct_remaining5m": null, + "sum": 0.7274, + "tx_atabove": 3, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 79, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0696924058, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 98.8663723917, + "pct_remaining5m": 0, + "sum": 0.7274, + "tx_atabove": 3, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 14, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 80, + "pct_mined_5m": 100, + "total_seen_5m": 6, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0696924058, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 98.8864365971, + "pct_remaining5m": 0, + "sum": 0.7268, + "tx_atabove": 2, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 84, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0684509628, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 98.9466292135, + "pct_remaining5m": 0, + "sum": 0.7268, + "tx_atabove": 2, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 88, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0684509628, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 98.9566613162, + "pct_remaining5m": null, + "sum": 0.7268, + "tx_atabove": 2, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 90, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0684509628, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 99.0469502408, + "pct_remaining5m": 0, + "sum": 0.7268, + "tx_atabove": 2, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 4, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 91, + "pct_mined_5m": 100, + "total_seen_5m": 3, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0684509628, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 99.1272070626, + "pct_remaining5m": 0, + "sum": 0.7268, + "tx_atabove": 2, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 3, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 96, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0684509628, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 99.1372391653, + "pct_remaining5m": 0, + "sum": 0.7268, + "tx_atabove": 2, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 97, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0684509628, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 99.1472712681, + "pct_remaining5m": 0, + "sum": 0.7268, + "tx_atabove": 2, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 99, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0684509628, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 99.7090690209, + "pct_remaining5m": 0, + "sum": 0.7268, + "tx_atabove": 2, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 23, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 100, + "pct_mined_5m": 100, + "total_seen_5m": 22, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0684509628, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 99.8394863563, + "pct_remaining5m": 0, + "sum": 0.7268, + "tx_atabove": 2, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 7, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 101, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0684509628, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 99.9097110754, + "pct_remaining5m": 0, + "sum": 0.7268, + "tx_atabove": 2, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 2, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 120, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0684509628, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 99.9297752809, + "pct_remaining5m": 0, + "sum": 0.7268, + "tx_atabove": 2, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": null, + "int2": 6.9238, + "pct_remaining30m": null, + "gasprice": 134, + "pct_mined_5m": 100, + "total_seen_5m": 2, + "pct_mined_30m": null, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0684509628, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": 0, + "hashpower_accepting2": 99.9498394864, + "pct_remaining5m": 0, + "sum": 0.7268, + "tx_atabove": 2, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 137, + "pct_mined_5m": 100, + "total_seen_5m": 1, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0684509628, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + }, + { + "intercept": 4.8015, + "age": null, + "hashpower_accepting2": 99.9699036918, + "pct_remaining5m": null, + "sum": 0.7256, + "tx_atabove": 0, + "hashpower_accepting": 100, + "hpa_coef2": -0.067, + "total_seen_30m": 1, + "int2": 6.9238, + "pct_remaining30m": 0, + "gasprice": 180, + "pct_mined_5m": null, + "total_seen_5m": null, + "pct_mined_30m": 100, + "tx_atabove_coef": 0.0006, + "average": 600, + "safelow": 600, + "nomine": 550, + "expectedTime": 0.52, + "avgdiff": 1, + "expectedWait": 2.0659703104, + "avgdiff_coef": -1.6459, + "hpa_coef": -0.0243 + } + ], + "metametrics": { + "mockMetaMetricsResponse": true + } +} diff --git a/test/data/mock-state.json b/test/data/mock-state.json index 6716971822ce..44edee3b8521 100644 --- a/test/data/mock-state.json +++ b/test/data/mock-state.json @@ -1,5 +1,8 @@ { "metamask": { + "featureFlags": { + "showIncomingTransactions": true + }, "network": "4", "identities": { "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc": { @@ -12,6 +15,7 @@ } }, "cachedBalances": {}, + "incomingTransactions": {}, "unapprovedTxs": { "8393540981007587": { "id": 8393540981007587, @@ -47,21 +51,6 @@ "path": "/loadingDefaults", "value": false, "timestamp": 1536268017685 - }, - { - "op": "add", - "path": "/gasPriceSpecified", - "value": true - }, - { - "op": "add", - "path": "/gasLimitSpecified", - "value": true - }, - { - "op": "add", - "path": "/estimatedGas", - "value": "0x5208" } ], [ @@ -74,9 +63,6 @@ } ] ], - "gasPriceSpecified": true, - "gasLimitSpecified": true, - "estimatedGas": "0x5208", "origin": "MetaMask" } }, @@ -116,17 +102,25 @@ "currentCurrency": "usd", "nativeCurrency": "ETH", "conversionRate": 556.12, - "addressBook": [ - { - "address": "0xc42edfcc21ed14dda456aa0756c153f7985d8813", - "name": "" + "addressBook": { + "4": { + "0xc42edfcc21ed14dda456aa0756c153f7985d8813": { + "address": "0xc42edfcc21ed14dda456aa0756c153f7985d8813", + "chainId": "4", + "isEns": false, + "memo": "", + "name": "Address Book Account 1" + } } - ], - "selectedTokenAddress": "0x108cf70c7d384c552f42c07c41c0e1e46d77ea0d", + }, "unapprovedMsgs": {}, "unapprovedMsgCount": 0, "unapprovedPersonalMsgs": {}, "unapprovedPersonalMsgCount": 0, + "unapprovedDecryptMsgs": {}, + "unapprovedDecryptMsgCount": 0, + "unapprovedEncryptionPublicKeyMsgs": {}, + "unapprovedEncryptionPublicKeyMsgCount": 0, "unapprovedTypedMessages": {}, "unapprovedTypedMessagesCount": 0, "send": { @@ -141,10 +135,9 @@ "errors": {}, "maxModeOn": false, "editingTransactionId": null, - "forceGasMin": null, "toNickname": "" }, - "selectedAddressTxList": [ + "currentNetworkTxList": [ { "id": 3387511061307736, "time": 1528133130531, @@ -180,21 +173,6 @@ "path": "/loadingDefaults", "value": false, "timestamp": 1528133130666 - }, - { - "op": "add", - "path": "/gasPriceSpecified", - "value": true - }, - { - "op": "add", - "path": "/gasLimitSpecified", - "value": true - }, - { - "op": "add", - "path": "/estimatedGas", - "value": "0xcf08" } ], [ @@ -312,9 +290,6 @@ } ] ], - "gasPriceSpecified": true, - "gasLimitSpecified": true, - "estimatedGas": "0xcf08", "origin": "MetaMask", "nonceDetails": { "params": { @@ -378,21 +353,6 @@ "path": "/loadingDefaults", "value": false, "timestamp": 1528133150011 - }, - { - "op": "add", - "path": "/gasPriceSpecified", - "value": true - }, - { - "op": "add", - "path": "/gasLimitSpecified", - "value": true - }, - { - "op": "add", - "path": "/estimatedGas", - "value": "0xcf08" } ], [ @@ -510,9 +470,6 @@ } ] ], - "gasPriceSpecified": true, - "gasLimitSpecified": true, - "estimatedGas": "0xcf08", "origin": "MetaMask", "nonceDetails": { "params": { @@ -576,21 +533,6 @@ "path": "/loadingDefaults", "value": false, "timestamp": 1528133180720 - }, - { - "op": "add", - "path": "/gasPriceSpecified", - "value": true - }, - { - "op": "add", - "path": "/gasLimitSpecified", - "value": true - }, - { - "op": "add", - "path": "/estimatedGas", - "value": "0xcf08" } ], [ @@ -708,9 +650,6 @@ } ] ], - "gasPriceSpecified": true, - "gasLimitSpecified": true, - "estimatedGas": "0xcf08", "origin": "MetaMask", "nonceDetails": { "params": { @@ -780,32 +719,11 @@ "op": "replace", "path": "/loadingDefaults", "value": false - }, - { - "op": "add", - "path": "/gasPriceSpecified", - "value": true - }, - { - "op": "add", - "path": "/gasLimitSpecified", - "value": false - }, - { - "op": "add", - "path": "/estimatedGas", - "value": "40f14" } ], [ { - "op": "replace", - "path": "/estimatedGas", - "value": "40f14", "note": "#newUnapprovedTransaction - adding the origin", - "timestamp": 1528133225492 - }, - { "op": "add", "path": "/origin", "value": "crypko.ai" @@ -917,9 +835,6 @@ } ] ], - "gasPriceSpecified": true, - "gasLimitSpecified": false, - "estimatedGas": "40f14", "origin": "crypko.ai", "nonceDetails": { "params": { @@ -985,21 +900,6 @@ "path": "/loadingDefaults", "value": false, "timestamp": 1528133291486 - }, - { - "op": "add", - "path": "/gasPriceSpecified", - "value": true - }, - { - "op": "add", - "path": "/gasLimitSpecified", - "value": true - }, - { - "op": "add", - "path": "/estimatedGas", - "value": "0xd508" } ], [ @@ -1117,9 +1017,6 @@ } ] ], - "gasPriceSpecified": true, - "gasLimitSpecified": true, - "estimatedGas": "0xd508", "origin": "MetaMask", "nonceDetails": { "params": { @@ -1194,26 +1091,6 @@ "op": "replace", "path": "/loadingDefaults", "value": false - }, - { - "op": "add", - "path": "/gasPriceSpecified", - "value": false - }, - { - "op": "add", - "path": "/gasLimitSpecified", - "value": false - }, - { - "op": "add", - "path": "/simpleSend", - "value": true - }, - { - "op": "add", - "path": "/estimatedGas", - "value": "0x5208" } ], [ @@ -1235,10 +1112,6 @@ } ] ], - "gasPriceSpecified": false, - "gasLimitSpecified": false, - "simpleSend": true, - "estimatedGas": "0x5208", "origin": "tmashuang.github.io" } ] diff --git a/test/data/mock-tx-history.json b/test/data/mock-tx-history.json new file mode 100644 index 000000000000..5a78af315065 --- /dev/null +++ b/test/data/mock-tx-history.json @@ -0,0 +1,2100 @@ +{ + "TransactionsController": { + "transactions": [ + { + "id": 6616756286038869, + "time": 1502438908445, + "status": "confirmed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d", + "chainId": 3 + }, + "history": [ + { + "id": 6616756286038869, + "time": 1502438908445, + "status": "unapproved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "3b9aca00", + "gas": "0x7b0d" + } + }, + { + "id": 6616756286038869, + "time": 1502438908445, + "status": "unapproved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "3b9aca00", + "gas": "0x7b0d" + } + }, + { + "id": 6616756286038869, + "time": 1502438908445, + "status": "approved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "3b9aca00", + "gas": "0x7b0d" + } + }, + { + "id": 6616756286038869, + "time": 1502438908445, + "status": "approved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "3b9aca00", + "gas": "0x7b0d" + } + }, + { + "id": 6616756286038869, + "time": 1502438908445, + "status": "approved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "3b9aca00", + "gas": "0x7b0d", + "nonce": 0 + }, + "nonceDetails": { + "blockNumber": "0x16643c", + "baseCount": 0, + "baseCountHex": "0x0", + "pendingCount": 0 + } + }, + { + "id": 6616756286038869, + "time": 1502438908445, + "status": "approved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "3b9aca00", + "gas": "0x7b0d", + "nonce": 0 + }, + "nonceDetails": { + "blockNumber": "0x16643c", + "baseCount": 0, + "baseCountHex": "0x0", + "pendingCount": 0 + } + }, + { + "id": 6616756286038869, + "time": 1502438908445, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16643c", + "baseCount": 0, + "baseCountHex": "0x0", + "pendingCount": 0 + } + }, + { + "id": 6616756286038869, + "time": 1502438908445, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16643c", + "baseCount": 0, + "baseCountHex": "0x0", + "pendingCount": 0 + } + }, + { + "id": 6616756286038869, + "time": 1502438908445, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16643c", + "baseCount": 0, + "baseCountHex": "0x0", + "pendingCount": 0 + }, + "rawTx": "0xf86380843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a02e45f61129f0c97634e37a1823b858df7b0dfc867a44949aae7dd9bcea1c1b5aa03b1f002cda0872d40517d5b26caefa3e407ec8fd03bc7dc2d995b84726961264" + }, + { + "id": 6616756286038869, + "time": 1502438908445, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16643c", + "baseCount": 0, + "baseCountHex": "0x0", + "pendingCount": 0 + }, + "rawTx": "0xf86380843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a02e45f61129f0c97634e37a1823b858df7b0dfc867a44949aae7dd9bcea1c1b5aa03b1f002cda0872d40517d5b26caefa3e407ec8fd03bc7dc2d995b84726961264" + }, + { + "id": 6616756286038869, + "time": 1502438908445, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16643c", + "baseCount": 0, + "baseCountHex": "0x0", + "pendingCount": 0 + }, + "rawTx": "0xf86380843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a02e45f61129f0c97634e37a1823b858df7b0dfc867a44949aae7dd9bcea1c1b5aa03b1f002cda0872d40517d5b26caefa3e407ec8fd03bc7dc2d995b84726961264", + "hash": "0x38c254639139c94303a3141aee041b15301509e743f08569ffac6aca17518012" + }, + { + "id": 6616756286038869, + "time": 1502438908445, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16643c", + "baseCount": 0, + "baseCountHex": "0x0", + "pendingCount": 0 + }, + "rawTx": "0xf86380843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a02e45f61129f0c97634e37a1823b858df7b0dfc867a44949aae7dd9bcea1c1b5aa03b1f002cda0872d40517d5b26caefa3e407ec8fd03bc7dc2d995b84726961264", + "hash": "0x38c254639139c94303a3141aee041b15301509e743f08569ffac6aca17518012" + }, + { + "id": 6616756286038869, + "time": 1502438908445, + "status": "submitted", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16643c", + "baseCount": 0, + "baseCountHex": "0x0", + "pendingCount": 0 + }, + "rawTx": "0xf86380843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a02e45f61129f0c97634e37a1823b858df7b0dfc867a44949aae7dd9bcea1c1b5aa03b1f002cda0872d40517d5b26caefa3e407ec8fd03bc7dc2d995b84726961264", + "hash": "0x38c254639139c94303a3141aee041b15301509e743f08569ffac6aca17518012" + }, + { + "id": 6616756286038869, + "time": 1502438908445, + "status": "submitted", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16643c", + "baseCount": 0, + "baseCountHex": "0x0", + "pendingCount": 0 + }, + "rawTx": "0xf86380843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a02e45f61129f0c97634e37a1823b858df7b0dfc867a44949aae7dd9bcea1c1b5aa03b1f002cda0872d40517d5b26caefa3e407ec8fd03bc7dc2d995b84726961264", + "hash": "0x38c254639139c94303a3141aee041b15301509e743f08569ffac6aca17518012" + }, + { + "id": 6616756286038869, + "time": 1502438908445, + "status": "confirmed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16643c", + "baseCount": 0, + "baseCountHex": "0x0", + "pendingCount": 0 + }, + "rawTx": "0xf86380843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a02e45f61129f0c97634e37a1823b858df7b0dfc867a44949aae7dd9bcea1c1b5aa03b1f002cda0872d40517d5b26caefa3e407ec8fd03bc7dc2d995b84726961264", + "hash": "0x38c254639139c94303a3141aee041b15301509e743f08569ffac6aca17518012", + "retryCount": 1 + }, + { + "id": 6616756286038869, + "time": 1502438908445, + "status": "confirmed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16643c", + "baseCount": 0, + "baseCountHex": "0x0", + "pendingCount": 0 + }, + "rawTx": "0xf86380843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a02e45f61129f0c97634e37a1823b858df7b0dfc867a44949aae7dd9bcea1c1b5aa03b1f002cda0872d40517d5b26caefa3e407ec8fd03bc7dc2d995b84726961264", + "hash": "0x38c254639139c94303a3141aee041b15301509e743f08569ffac6aca17518012", + "retryCount": 1 + } + ], + "nonceDetails": { + "blockNumber": "0x16643c", + "baseCount": 0, + "baseCountHex": "0x0", + "pendingCount": 0 + }, + "rawTx": "0xf86380843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a02e45f61129f0c97634e37a1823b858df7b0dfc867a44949aae7dd9bcea1c1b5aa03b1f002cda0872d40517d5b26caefa3e407ec8fd03bc7dc2d995b84726961264", + "hash": "0x38c254639139c94303a3141aee041b15301509e743f08569ffac6aca17518012", + "retryCount": 1 + }, + { + "id": 6616756286038870, + "time": 1502573153664, + "status": "rejected", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "28fa6ae00", + "gas": "0x7b0d" + }, + "history": [ + { + "id": 6616756286038870, + "time": 1502573153664, + "status": "rejected", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "28fa6ae00", + "gas": "0x7b0d" + } + }, + { + "id": 6616756286038870, + "time": 1502573153664, + "status": "rejected", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "28fa6ae00", + "gas": "0x7b0d" + } + } + ] + }, + { + "id": 6616756286038871, + "time": 1502573157128, + "status": "confirmed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x28fa6ae00", + "gas": "0x7b0d", + "nonce": "0x01", + "chainId": 3 + }, + "history": [ + { + "id": 6616756286038871, + "time": 1502573157128, + "status": "unapproved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "28fa6ae00", + "gas": "0x7b0d" + } + }, + { + "id": 6616756286038871, + "time": 1502573157128, + "status": "unapproved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "28fa6ae00", + "gas": "0x7b0d" + } + }, + { + "id": 6616756286038871, + "time": 1502573157128, + "status": "approved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "28fa6ae00", + "gas": "0x7b0d" + } + }, + { + "id": 6616756286038871, + "time": 1502573157128, + "status": "approved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "28fa6ae00", + "gas": "0x7b0d" + } + }, + { + "id": 6616756286038871, + "time": 1502573157128, + "status": "approved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "28fa6ae00", + "gas": "0x7b0d", + "nonce": 1 + }, + "nonceDetails": { + "blockNumber": "0x168739", + "baseCount": 1, + "baseCountHex": "0x1", + "pendingCount": 0 + } + }, + { + "id": 6616756286038871, + "time": 1502573157128, + "status": "approved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "28fa6ae00", + "gas": "0x7b0d", + "nonce": 1 + }, + "nonceDetails": { + "blockNumber": "0x168739", + "baseCount": 1, + "baseCountHex": "0x1", + "pendingCount": 0 + } + }, + { + "id": 6616756286038871, + "time": 1502573157128, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x28fa6ae00", + "gas": "0x7b0d", + "nonce": "0x01", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x168739", + "baseCount": 1, + "baseCountHex": "0x1", + "pendingCount": 0 + } + }, + { + "id": 6616756286038871, + "time": 1502573157128, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x28fa6ae00", + "gas": "0x7b0d", + "nonce": "0x01", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x168739", + "baseCount": 1, + "baseCountHex": "0x1", + "pendingCount": 0 + } + }, + { + "id": 6616756286038871, + "time": 1502573157128, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x28fa6ae00", + "gas": "0x7b0d", + "nonce": "0x01", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x168739", + "baseCount": 1, + "baseCountHex": "0x1", + "pendingCount": 0 + }, + "rawTx": "0xf8640185028fa6ae00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a06261831b3d599a90dc24fac67bc648fd58cab2036e4e8dfbbb5c00c3fd9cf66ba00e2ea6ebc63ba715a94dc94e24120639c4ad60832d3285dd558929a61cc18cc0" + }, + { + "id": 6616756286038871, + "time": 1502573157128, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x28fa6ae00", + "gas": "0x7b0d", + "nonce": "0x01", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x168739", + "baseCount": 1, + "baseCountHex": "0x1", + "pendingCount": 0 + }, + "rawTx": "0xf8640185028fa6ae00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a06261831b3d599a90dc24fac67bc648fd58cab2036e4e8dfbbb5c00c3fd9cf66ba00e2ea6ebc63ba715a94dc94e24120639c4ad60832d3285dd558929a61cc18cc0" + }, + { + "id": 6616756286038871, + "time": 1502573157128, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x28fa6ae00", + "gas": "0x7b0d", + "nonce": "0x01", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x168739", + "baseCount": 1, + "baseCountHex": "0x1", + "pendingCount": 0 + }, + "rawTx": "0xf8640185028fa6ae00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a06261831b3d599a90dc24fac67bc648fd58cab2036e4e8dfbbb5c00c3fd9cf66ba00e2ea6ebc63ba715a94dc94e24120639c4ad60832d3285dd558929a61cc18cc0", + "hash": "0xeb1c57dec9df8410bcc65374c7f684fc8ebfcda6865a149e38bb000fa706a150" + }, + { + "id": 6616756286038871, + "time": 1502573157128, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x28fa6ae00", + "gas": "0x7b0d", + "nonce": "0x01", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x168739", + "baseCount": 1, + "baseCountHex": "0x1", + "pendingCount": 0 + }, + "rawTx": "0xf8640185028fa6ae00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a06261831b3d599a90dc24fac67bc648fd58cab2036e4e8dfbbb5c00c3fd9cf66ba00e2ea6ebc63ba715a94dc94e24120639c4ad60832d3285dd558929a61cc18cc0", + "hash": "0xeb1c57dec9df8410bcc65374c7f684fc8ebfcda6865a149e38bb000fa706a150" + }, + { + "id": 6616756286038871, + "time": 1502573157128, + "status": "submitted", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x28fa6ae00", + "gas": "0x7b0d", + "nonce": "0x01", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x168739", + "baseCount": 1, + "baseCountHex": "0x1", + "pendingCount": 0 + }, + "rawTx": "0xf8640185028fa6ae00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a06261831b3d599a90dc24fac67bc648fd58cab2036e4e8dfbbb5c00c3fd9cf66ba00e2ea6ebc63ba715a94dc94e24120639c4ad60832d3285dd558929a61cc18cc0", + "hash": "0xeb1c57dec9df8410bcc65374c7f684fc8ebfcda6865a149e38bb000fa706a150" + }, + { + "id": 6616756286038871, + "time": 1502573157128, + "status": "submitted", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x28fa6ae00", + "gas": "0x7b0d", + "nonce": "0x01", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x168739", + "baseCount": 1, + "baseCountHex": "0x1", + "pendingCount": 0 + }, + "rawTx": "0xf8640185028fa6ae00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a06261831b3d599a90dc24fac67bc648fd58cab2036e4e8dfbbb5c00c3fd9cf66ba00e2ea6ebc63ba715a94dc94e24120639c4ad60832d3285dd558929a61cc18cc0", + "hash": "0xeb1c57dec9df8410bcc65374c7f684fc8ebfcda6865a149e38bb000fa706a150" + }, + { + "id": 6616756286038871, + "time": 1502573157128, + "status": "confirmed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x28fa6ae00", + "gas": "0x7b0d", + "nonce": "0x01", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x168739", + "baseCount": 1, + "baseCountHex": "0x1", + "pendingCount": 0 + }, + "rawTx": "0xf8640185028fa6ae00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a06261831b3d599a90dc24fac67bc648fd58cab2036e4e8dfbbb5c00c3fd9cf66ba00e2ea6ebc63ba715a94dc94e24120639c4ad60832d3285dd558929a61cc18cc0", + "hash": "0xeb1c57dec9df8410bcc65374c7f684fc8ebfcda6865a149e38bb000fa706a150", + "retryCount": 1 + }, + { + "id": 6616756286038871, + "time": 1502573157128, + "status": "confirmed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x28fa6ae00", + "gas": "0x7b0d", + "nonce": "0x01", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x168739", + "baseCount": 1, + "baseCountHex": "0x1", + "pendingCount": 0 + }, + "rawTx": "0xf8640185028fa6ae00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a06261831b3d599a90dc24fac67bc648fd58cab2036e4e8dfbbb5c00c3fd9cf66ba00e2ea6ebc63ba715a94dc94e24120639c4ad60832d3285dd558929a61cc18cc0", + "hash": "0xeb1c57dec9df8410bcc65374c7f684fc8ebfcda6865a149e38bb000fa706a150", + "retryCount": 1 + } + ], + "nonceDetails": { + "blockNumber": "0x168739", + "baseCount": 1, + "baseCountHex": "0x1", + "pendingCount": 0 + }, + "rawTx": "0xf8640185028fa6ae00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a06261831b3d599a90dc24fac67bc648fd58cab2036e4e8dfbbb5c00c3fd9cf66ba00e2ea6ebc63ba715a94dc94e24120639c4ad60832d3285dd558929a61cc18cc0", + "hash": "0xeb1c57dec9df8410bcc65374c7f684fc8ebfcda6865a149e38bb000fa706a150", + "retryCount": 1 + }, + { + "id": 6616756286038872, + "time": 1502734903652, + "status": "confirmed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x02", + "chainId": 3 + }, + "history": [ + { + "id": 6616756286038872, + "time": 1502734903652, + "status": "unapproved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "4a817c800", + "gas": "0x7b0d" + } + }, + { + "id": 6616756286038872, + "time": 1502734903652, + "status": "unapproved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "4a817c800", + "gas": "0x7b0d" + } + }, + { + "id": 6616756286038872, + "time": 1502734903652, + "status": "approved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "4a817c800", + "gas": "0x7b0d" + } + }, + { + "id": 6616756286038872, + "time": 1502734903652, + "status": "approved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "4a817c800", + "gas": "0x7b0d" + } + }, + { + "id": 6616756286038872, + "time": 1502734903652, + "status": "approved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "4a817c800", + "gas": "0x7b0d", + "nonce": 2 + }, + "nonceDetails": { + "blockNumber": "0x16b066", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 0 + } + }, + { + "id": 6616756286038872, + "time": 1502734903652, + "status": "approved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "4a817c800", + "gas": "0x7b0d", + "nonce": 2 + }, + "nonceDetails": { + "blockNumber": "0x16b066", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 0 + } + }, + { + "id": 6616756286038872, + "time": 1502734903652, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x02", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b066", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 0 + } + }, + { + "id": 6616756286038872, + "time": 1502734903652, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x02", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b066", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 0 + } + }, + { + "id": 6616756286038872, + "time": 1502734903652, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x02", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b066", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 0 + }, + "rawTx": "0xf864028504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa057380f9007a48d4bce31792859b1a25cb2b45ba615e7951d8e8a925360a0b301a042393e72d1a96a2605c0da95705c5f3f7c744f0affcac01e0a64721037f04adc" + }, + { + "id": 6616756286038872, + "time": 1502734903652, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x02", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b066", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 0 + }, + "rawTx": "0xf864028504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa057380f9007a48d4bce31792859b1a25cb2b45ba615e7951d8e8a925360a0b301a042393e72d1a96a2605c0da95705c5f3f7c744f0affcac01e0a64721037f04adc" + }, + { + "id": 6616756286038872, + "time": 1502734903652, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x02", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b066", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 0 + }, + "rawTx": "0xf864028504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa057380f9007a48d4bce31792859b1a25cb2b45ba615e7951d8e8a925360a0b301a042393e72d1a96a2605c0da95705c5f3f7c744f0affcac01e0a64721037f04adc", + "hash": "0xc28ceb1e2c4e5c61b805b181e3cc99dd7bade58935233fab76c63cedfd494270" + }, + { + "id": 6616756286038872, + "time": 1502734903652, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x02", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b066", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 0 + }, + "rawTx": "0xf864028504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa057380f9007a48d4bce31792859b1a25cb2b45ba615e7951d8e8a925360a0b301a042393e72d1a96a2605c0da95705c5f3f7c744f0affcac01e0a64721037f04adc", + "hash": "0xc28ceb1e2c4e5c61b805b181e3cc99dd7bade58935233fab76c63cedfd494270" + }, + { + "id": 6616756286038872, + "time": 1502734903652, + "status": "submitted", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x02", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b066", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 0 + }, + "rawTx": "0xf864028504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa057380f9007a48d4bce31792859b1a25cb2b45ba615e7951d8e8a925360a0b301a042393e72d1a96a2605c0da95705c5f3f7c744f0affcac01e0a64721037f04adc", + "hash": "0xc28ceb1e2c4e5c61b805b181e3cc99dd7bade58935233fab76c63cedfd494270" + }, + { + "id": 6616756286038872, + "time": 1502734903652, + "status": "submitted", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x02", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b066", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 0 + }, + "rawTx": "0xf864028504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa057380f9007a48d4bce31792859b1a25cb2b45ba615e7951d8e8a925360a0b301a042393e72d1a96a2605c0da95705c5f3f7c744f0affcac01e0a64721037f04adc", + "hash": "0xc28ceb1e2c4e5c61b805b181e3cc99dd7bade58935233fab76c63cedfd494270" + }, + { + "id": 6616756286038872, + "time": 1502734903652, + "status": "confirmed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x02", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b066", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 0 + }, + "rawTx": "0xf864028504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa057380f9007a48d4bce31792859b1a25cb2b45ba615e7951d8e8a925360a0b301a042393e72d1a96a2605c0da95705c5f3f7c744f0affcac01e0a64721037f04adc", + "hash": "0xc28ceb1e2c4e5c61b805b181e3cc99dd7bade58935233fab76c63cedfd494270", + "retryCount": 1 + }, + { + "id": 6616756286038872, + "time": 1502734903652, + "status": "confirmed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x02", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b066", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 0 + }, + "rawTx": "0xf864028504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa057380f9007a48d4bce31792859b1a25cb2b45ba615e7951d8e8a925360a0b301a042393e72d1a96a2605c0da95705c5f3f7c744f0affcac01e0a64721037f04adc", + "hash": "0xc28ceb1e2c4e5c61b805b181e3cc99dd7bade58935233fab76c63cedfd494270", + "retryCount": 1 + } + ], + "nonceDetails": { + "blockNumber": "0x16b066", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 0 + }, + "rawTx": "0xf864028504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa057380f9007a48d4bce31792859b1a25cb2b45ba615e7951d8e8a925360a0b301a042393e72d1a96a2605c0da95705c5f3f7c744f0affcac01e0a64721037f04adc", + "hash": "0xc28ceb1e2c4e5c61b805b181e3cc99dd7bade58935233fab76c63cedfd494270", + "retryCount": 1 + }, + { + "id": 6616756286038873, + "time": 1502734910224, + "status": "confirmed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d", + "nonce": "0x03", + "chainId": 3 + }, + "history": [ + { + "id": 6616756286038873, + "time": 1502734910224, + "status": "unapproved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d" + } + }, + { + "id": 6616756286038873, + "time": 1502734910224, + "status": "unapproved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d" + } + }, + { + "id": 6616756286038873, + "time": 1502734910224, + "status": "approved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d" + } + }, + { + "id": 6616756286038873, + "time": 1502734910224, + "status": "approved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d" + } + }, + { + "id": 6616756286038873, + "time": 1502734910224, + "status": "approved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d", + "nonce": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 1 + } + }, + { + "id": 6616756286038873, + "time": 1502734910224, + "status": "approved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d", + "nonce": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 1 + } + }, + { + "id": 6616756286038873, + "time": 1502734910224, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d", + "nonce": "0x03", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 1 + } + }, + { + "id": 6616756286038873, + "time": 1502734910224, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d", + "nonce": "0x03", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 1 + } + }, + { + "id": 6616756286038873, + "time": 1502734910224, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d", + "nonce": "0x03", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 1 + }, + "rawTx": "0xf86303843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0e442afe9386066936f556d852a296d22b8392652aa2ddb26969d83d661759ee1a06dc55b164f666a37107e86d575d2701602fc100f0ef4875736d45995150d4897" + }, + { + "id": 6616756286038873, + "time": 1502734910224, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d", + "nonce": "0x03", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 1 + }, + "rawTx": "0xf86303843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0e442afe9386066936f556d852a296d22b8392652aa2ddb26969d83d661759ee1a06dc55b164f666a37107e86d575d2701602fc100f0ef4875736d45995150d4897" + }, + { + "id": 6616756286038873, + "time": 1502734910224, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d", + "nonce": "0x03", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 1 + }, + "rawTx": "0xf86303843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0e442afe9386066936f556d852a296d22b8392652aa2ddb26969d83d661759ee1a06dc55b164f666a37107e86d575d2701602fc100f0ef4875736d45995150d4897", + "hash": "0xfcc66b8002c64a5aaa076adea7f7e48d194de10e40eb64924c8de344805c8cb7" + }, + { + "id": 6616756286038873, + "time": 1502734910224, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d", + "nonce": "0x03", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 1 + }, + "rawTx": "0xf86303843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0e442afe9386066936f556d852a296d22b8392652aa2ddb26969d83d661759ee1a06dc55b164f666a37107e86d575d2701602fc100f0ef4875736d45995150d4897", + "hash": "0xfcc66b8002c64a5aaa076adea7f7e48d194de10e40eb64924c8de344805c8cb7" + }, + { + "id": 6616756286038873, + "time": 1502734910224, + "status": "submitted", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d", + "nonce": "0x03", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 1 + }, + "rawTx": "0xf86303843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0e442afe9386066936f556d852a296d22b8392652aa2ddb26969d83d661759ee1a06dc55b164f666a37107e86d575d2701602fc100f0ef4875736d45995150d4897", + "hash": "0xfcc66b8002c64a5aaa076adea7f7e48d194de10e40eb64924c8de344805c8cb7" + }, + { + "id": 6616756286038873, + "time": 1502734910224, + "status": "submitted", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d", + "nonce": "0x03", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 1 + }, + "rawTx": "0xf86303843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0e442afe9386066936f556d852a296d22b8392652aa2ddb26969d83d661759ee1a06dc55b164f666a37107e86d575d2701602fc100f0ef4875736d45995150d4897", + "hash": "0xfcc66b8002c64a5aaa076adea7f7e48d194de10e40eb64924c8de344805c8cb7" + }, + { + "id": 6616756286038873, + "time": 1502734910224, + "status": "confirmed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d", + "nonce": "0x03", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 1 + }, + "rawTx": "0xf86303843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0e442afe9386066936f556d852a296d22b8392652aa2ddb26969d83d661759ee1a06dc55b164f666a37107e86d575d2701602fc100f0ef4875736d45995150d4897", + "hash": "0xfcc66b8002c64a5aaa076adea7f7e48d194de10e40eb64924c8de344805c8cb7", + "retryCount": 2 + }, + { + "id": 6616756286038873, + "time": 1502734910224, + "status": "confirmed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x3b9aca00", + "gas": "0x7b0d", + "nonce": "0x03", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 1 + }, + "rawTx": "0xf86303843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0e442afe9386066936f556d852a296d22b8392652aa2ddb26969d83d661759ee1a06dc55b164f666a37107e86d575d2701602fc100f0ef4875736d45995150d4897", + "hash": "0xfcc66b8002c64a5aaa076adea7f7e48d194de10e40eb64924c8de344805c8cb7", + "retryCount": 2 + } + ], + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 1 + }, + "rawTx": "0xf86303843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0e442afe9386066936f556d852a296d22b8392652aa2ddb26969d83d661759ee1a06dc55b164f666a37107e86d575d2701602fc100f0ef4875736d45995150d4897", + "hash": "0xfcc66b8002c64a5aaa076adea7f7e48d194de10e40eb64924c8de344805c8cb7", + "retryCount": 2 + }, + { + "id": 6616756286038874, + "time": 1502734917414, + "status": "confirmed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x04", + "chainId": 3 + }, + "history": [ + { + "id": 6616756286038874, + "time": 1502734917414, + "status": "unapproved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "4a817c800", + "gas": "0x7b0d" + } + }, + { + "id": 6616756286038874, + "time": 1502734917414, + "status": "unapproved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "4a817c800", + "gas": "0x7b0d" + } + }, + { + "id": 6616756286038874, + "time": 1502734917414, + "status": "approved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "4a817c800", + "gas": "0x7b0d" + } + }, + { + "id": 6616756286038874, + "time": 1502734917414, + "status": "approved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "4a817c800", + "gas": "0x7b0d" + } + }, + { + "id": 6616756286038874, + "time": 1502734917414, + "status": "approved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "4a817c800", + "gas": "0x7b0d", + "nonce": 4 + }, + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 2 + } + }, + { + "id": 6616756286038874, + "time": 1502734917414, + "status": "approved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "4a817c800", + "gas": "0x7b0d", + "nonce": 4 + }, + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 2 + } + }, + { + "id": 6616756286038874, + "time": 1502734917414, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x04", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 2 + } + }, + { + "id": 6616756286038874, + "time": 1502734917414, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x04", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 2 + } + }, + { + "id": 6616756286038874, + "time": 1502734917414, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x04", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 2 + }, + "rawTx": "0xf864048504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a04be1c01535745fa7ec7aeb6e0b64d009981713808ca443b181fad802ce941352a03887e90375d9225b8dfd0d42324eed8eb4982fd14ea7b4069290237b29d1dcd3" + }, + { + "id": 6616756286038874, + "time": 1502734917414, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x04", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 2 + }, + "rawTx": "0xf864048504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a04be1c01535745fa7ec7aeb6e0b64d009981713808ca443b181fad802ce941352a03887e90375d9225b8dfd0d42324eed8eb4982fd14ea7b4069290237b29d1dcd3" + }, + { + "id": 6616756286038874, + "time": 1502734917414, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x04", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 2 + }, + "rawTx": "0xf864048504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a04be1c01535745fa7ec7aeb6e0b64d009981713808ca443b181fad802ce941352a03887e90375d9225b8dfd0d42324eed8eb4982fd14ea7b4069290237b29d1dcd3", + "hash": "0x9258ed7e451402612f572cbef52b63cd63cc2c59f443a207b7b4f8d317958635" + }, + { + "id": 6616756286038874, + "time": 1502734917414, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x04", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 2 + }, + "rawTx": "0xf864048504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a04be1c01535745fa7ec7aeb6e0b64d009981713808ca443b181fad802ce941352a03887e90375d9225b8dfd0d42324eed8eb4982fd14ea7b4069290237b29d1dcd3", + "hash": "0x9258ed7e451402612f572cbef52b63cd63cc2c59f443a207b7b4f8d317958635" + }, + { + "id": 6616756286038874, + "time": 1502734917414, + "status": "submitted", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x04", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 2 + }, + "rawTx": "0xf864048504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a04be1c01535745fa7ec7aeb6e0b64d009981713808ca443b181fad802ce941352a03887e90375d9225b8dfd0d42324eed8eb4982fd14ea7b4069290237b29d1dcd3", + "hash": "0x9258ed7e451402612f572cbef52b63cd63cc2c59f443a207b7b4f8d317958635" + }, + { + "id": 6616756286038874, + "time": 1502734917414, + "status": "submitted", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x04", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 2 + }, + "rawTx": "0xf864048504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a04be1c01535745fa7ec7aeb6e0b64d009981713808ca443b181fad802ce941352a03887e90375d9225b8dfd0d42324eed8eb4982fd14ea7b4069290237b29d1dcd3", + "hash": "0x9258ed7e451402612f572cbef52b63cd63cc2c59f443a207b7b4f8d317958635" + }, + { + "id": 6616756286038874, + "time": 1502734917414, + "status": "confirmed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x04", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 2 + }, + "rawTx": "0xf864048504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a04be1c01535745fa7ec7aeb6e0b64d009981713808ca443b181fad802ce941352a03887e90375d9225b8dfd0d42324eed8eb4982fd14ea7b4069290237b29d1dcd3", + "hash": "0x9258ed7e451402612f572cbef52b63cd63cc2c59f443a207b7b4f8d317958635", + "retryCount": 4 + }, + { + "id": 6616756286038874, + "time": 1502734917414, + "status": "confirmed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x04", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 2 + }, + "rawTx": "0xf864048504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a04be1c01535745fa7ec7aeb6e0b64d009981713808ca443b181fad802ce941352a03887e90375d9225b8dfd0d42324eed8eb4982fd14ea7b4069290237b29d1dcd3", + "hash": "0x9258ed7e451402612f572cbef52b63cd63cc2c59f443a207b7b4f8d317958635", + "retryCount": 4 + } + ], + "nonceDetails": { + "blockNumber": "0x16b067", + "baseCount": 2, + "baseCountHex": "0x2", + "pendingCount": 2 + }, + "rawTx": "0xf864048504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a04be1c01535745fa7ec7aeb6e0b64d009981713808ca443b181fad802ce941352a03887e90375d9225b8dfd0d42324eed8eb4982fd14ea7b4069290237b29d1dcd3", + "hash": "0x9258ed7e451402612f572cbef52b63cd63cc2c59f443a207b7b4f8d317958635", + "retryCount": 4 + }, + { + "id": 6616756286038875, + "time": 1502734922745, + "status": "confirmed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x05", + "chainId": 3 + }, + "history": [ + { + "id": 6616756286038875, + "time": 1502734922745, + "status": "unapproved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "4a817c800", + "gas": "0x7b0d" + } + }, + { + "id": 6616756286038875, + "time": 1502734922745, + "status": "unapproved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "4a817c800", + "gas": "0x7b0d" + } + }, + { + "id": 6616756286038875, + "time": 1502734922745, + "status": "approved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "4a817c800", + "gas": "0x7b0d" + } + }, + { + "id": 6616756286038875, + "time": 1502734922745, + "status": "approved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "4a817c800", + "gas": "0x7b0d" + } + }, + { + "id": 6616756286038875, + "time": 1502734922745, + "status": "approved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "4a817c800", + "gas": "0x7b0d", + "nonce": 5 + }, + "nonceDetails": { + "blockNumber": "0x16b068", + "baseCount": 3, + "baseCountHex": "0x3", + "pendingCount": 2 + } + }, + { + "id": 6616756286038875, + "time": 1502734922745, + "status": "approved", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "4a817c800", + "gas": "0x7b0d", + "nonce": 5 + }, + "nonceDetails": { + "blockNumber": "0x16b068", + "baseCount": 3, + "baseCountHex": "0x3", + "pendingCount": 2 + } + }, + { + "id": 6616756286038875, + "time": 1502734922745, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x05", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b068", + "baseCount": 3, + "baseCountHex": "0x3", + "pendingCount": 2 + } + }, + { + "id": 6616756286038875, + "time": 1502734922745, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x05", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b068", + "baseCount": 3, + "baseCountHex": "0x3", + "pendingCount": 2 + } + }, + { + "id": 6616756286038875, + "time": 1502734922745, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x05", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b068", + "baseCount": 3, + "baseCountHex": "0x3", + "pendingCount": 2 + }, + "rawTx": "0xf864058504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a0dac4756e84c008714b3b8b43807157ed63737450780bc57590e930c8a360750ca00b43ac8ec5235f57ccca7e68ce8fbf77f43d6ffa5fbff296cba66cef47889cf5" + }, + { + "id": 6616756286038875, + "time": 1502734922745, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x05", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b068", + "baseCount": 3, + "baseCountHex": "0x3", + "pendingCount": 2 + }, + "rawTx": "0xf864058504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a0dac4756e84c008714b3b8b43807157ed63737450780bc57590e930c8a360750ca00b43ac8ec5235f57ccca7e68ce8fbf77f43d6ffa5fbff296cba66cef47889cf5" + }, + { + "id": 6616756286038875, + "time": 1502734922745, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x05", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b068", + "baseCount": 3, + "baseCountHex": "0x3", + "pendingCount": 2 + }, + "rawTx": "0xf864058504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a0dac4756e84c008714b3b8b43807157ed63737450780bc57590e930c8a360750ca00b43ac8ec5235f57ccca7e68ce8fbf77f43d6ffa5fbff296cba66cef47889cf5", + "hash": "0x67cdff49c1f8ed506c759fc8fd7ffe93d59fcb3bfd926b964cad47e2e504dc9e" + }, + { + "id": 6616756286038875, + "time": 1502734922745, + "status": "signed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x05", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b068", + "baseCount": 3, + "baseCountHex": "0x3", + "pendingCount": 2 + }, + "rawTx": "0xf864058504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a0dac4756e84c008714b3b8b43807157ed63737450780bc57590e930c8a360750ca00b43ac8ec5235f57ccca7e68ce8fbf77f43d6ffa5fbff296cba66cef47889cf5", + "hash": "0x67cdff49c1f8ed506c759fc8fd7ffe93d59fcb3bfd926b964cad47e2e504dc9e" + }, + { + "id": 6616756286038875, + "time": 1502734922745, + "status": "submitted", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x05", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b068", + "baseCount": 3, + "baseCountHex": "0x3", + "pendingCount": 2 + }, + "rawTx": "0xf864058504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a0dac4756e84c008714b3b8b43807157ed63737450780bc57590e930c8a360750ca00b43ac8ec5235f57ccca7e68ce8fbf77f43d6ffa5fbff296cba66cef47889cf5", + "hash": "0x67cdff49c1f8ed506c759fc8fd7ffe93d59fcb3bfd926b964cad47e2e504dc9e" + }, + { + "id": 6616756286038875, + "time": 1502734922745, + "status": "submitted", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x05", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b068", + "baseCount": 3, + "baseCountHex": "0x3", + "pendingCount": 2 + }, + "rawTx": "0xf864058504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a0dac4756e84c008714b3b8b43807157ed63737450780bc57590e930c8a360750ca00b43ac8ec5235f57ccca7e68ce8fbf77f43d6ffa5fbff296cba66cef47889cf5", + "hash": "0x67cdff49c1f8ed506c759fc8fd7ffe93d59fcb3bfd926b964cad47e2e504dc9e" + }, + { + "id": 6616756286038875, + "time": 1502734922745, + "status": "confirmed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x05", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b068", + "baseCount": 3, + "baseCountHex": "0x3", + "pendingCount": 2 + }, + "rawTx": "0xf864058504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a0dac4756e84c008714b3b8b43807157ed63737450780bc57590e930c8a360750ca00b43ac8ec5235f57ccca7e68ce8fbf77f43d6ffa5fbff296cba66cef47889cf5", + "hash": "0x67cdff49c1f8ed506c759fc8fd7ffe93d59fcb3bfd926b964cad47e2e504dc9e", + "retryCount": 3 + }, + { + "id": 6616756286038875, + "time": 1502734922745, + "status": "confirmed", + "metamaskNetworkId": "3", + "txParams": { + "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", + "value": "0x0", + "gasPrice": "0x4a817c800", + "gas": "0x7b0d", + "nonce": "0x05", + "chainId": 3 + }, + "nonceDetails": { + "blockNumber": "0x16b068", + "baseCount": 3, + "baseCountHex": "0x3", + "pendingCount": 2 + }, + "rawTx": "0xf864058504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a0dac4756e84c008714b3b8b43807157ed63737450780bc57590e930c8a360750ca00b43ac8ec5235f57ccca7e68ce8fbf77f43d6ffa5fbff296cba66cef47889cf5", + "hash": "0x67cdff49c1f8ed506c759fc8fd7ffe93d59fcb3bfd926b964cad47e2e504dc9e", + "retryCount": 3 + } + ], + "nonceDetails": { + "blockNumber": "0x16b068", + "baseCount": 3, + "baseCountHex": "0x3", + "pendingCount": 2 + }, + "rawTx": "0xf864058504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a0dac4756e84c008714b3b8b43807157ed63737450780bc57590e930c8a360750ca00b43ac8ec5235f57ccca7e68ce8fbf77f43d6ffa5fbff296cba66cef47889cf5", + "hash": "0x67cdff49c1f8ed506c759fc8fd7ffe93d59fcb3bfd926b964cad47e2e504dc9e", + "retryCount": 3 + } + ] + } +} diff --git a/test/data/transaction-data.json b/test/data/transaction-data.json new file mode 100644 index 000000000000..dfbdb735ad18 --- /dev/null +++ b/test/data/transaction-data.json @@ -0,0 +1,499 @@ +[ + { + "nonce": "0xc", + "initialTransaction": { + "id": 4243712234858512, + "time": 1589314601567, + "status": "confirmed", + "metamaskNetworkId": "4", + "loadingDefaults": false, + "txParams": { + "from": "0x9eca64466f257793eaa52fcfff5066894b76a149", + "to": "0xffe5bc4e8f1f969934d773fa67da095d2e491a97", + "nonce": "0xc", + "value": "0xde0b6b3a7640000", + "gas": "0x5208", + "gasPrice": "0x2540be400" + }, + "type": "standard", + "origin": "metamask", + "transactionCategory": "sentEther", + "nonceDetails": { + "params": { + "highestLocallyConfirmed": 12, + "highestSuggested": 12, + "nextNetworkNonce": 12 + }, + "local": { + "name": "local", + "nonce": 12, + "details": { + "startPoint": 12, + "highest": 12 + } + }, + "network": { + "name": "network", + "nonce": 12, + "details": { + "blockNumber": "0x62d5dc", + "baseCount": 12 + } + } + }, + "r": "0xe0b79a8e33b15460ea79b05a5fb16bc067a796592eeb4edc5007c88615c12595", + "s": "0x1c834a25f1df07af5122996a40e99e554a40dc971a25041bc6e31638846c4f58", + "v": "0x2c", + "rawTx": "0xf86c0c8502540be40082520894ffe5bc4e8f1f969934d773fa67da095d2e491a97880de0b6b3a7640000802ca0e0b79a8e33b15460ea79b05a5fb16bc067a796592eeb4edc5007c88615c12595a01c834a25f1df07af5122996a40e99e554a40dc971a25041bc6e31638846c4f58", + "hash": "0x06bb79b856f5eb67025e4c4ffff44bca26ae135d1c3e6bd9a4193f422dcecca2", + "submittedTime": 1589314602908, + "txReceipt": { + "blockHash": "0xb9d2d71153b66146fde74b14b1c1ffc0588eb4a02ff464e32a4db9ae4bbfad8a", + "blockNumber": "62d5de", + "contractAddress": null, + "cumulativeGasUsed": "5208", + "from": "0x9eca64466f257793eaa52fcfff5066894b76a149", + "gasUsed": "5208", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "status": "0x1", + "to": "0xffe5bc4e8f1f969934d773fa67da095d2e491a97", + "transactionHash": "0x06bb79b856f5eb67025e4c4ffff44bca26ae135d1c3e6bd9a4193f422dcecca2", + "transactionIndex": "0" + } + }, + "primaryTransaction": { + "id": 4243712234858512, + "time": 1589314601567, + "status": "confirmed", + "metamaskNetworkId": "4", + "loadingDefaults": false, + "txParams": { + "from": "0x9eca64466f257793eaa52fcfff5066894b76a149", + "to": "0xffe5bc4e8f1f969934d773fa67da095d2e491a97", + "nonce": "0xc", + "value": "0xde0b6b3a7640000", + "gas": "0x5208", + "gasPrice": "0x2540be400" + }, + "type": "standard", + "origin": "metamask", + "transactionCategory": "sentEther", + "nonceDetails": { + "params": { + "highestLocallyConfirmed": 12, + "highestSuggested": 12, + "nextNetworkNonce": 12 + }, + "local": { + "name": "local", + "nonce": 12, + "details": { + "startPoint": 12, + "highest": 12 + } + }, + "network": { + "name": "network", + "nonce": 12, + "details": { + "blockNumber": "0x62d5dc", + "baseCount": 12 + } + } + }, + "r": "0xe0b79a8e33b15460ea79b05a5fb16bc067a796592eeb4edc5007c88615c12595", + "s": "0x1c834a25f1df07af5122996a40e99e554a40dc971a25041bc6e31638846c4f58", + "v": "0x2c", + "rawTx": "0xf86c0c8502540be40082520894ffe5bc4e8f1f969934d773fa67da095d2e491a97880de0b6b3a7640000802ca0e0b79a8e33b15460ea79b05a5fb16bc067a796592eeb4edc5007c88615c12595a01c834a25f1df07af5122996a40e99e554a40dc971a25041bc6e31638846c4f58", + "hash": "0x06bb79b856f5eb67025e4c4ffff44bca26ae135d1c3e6bd9a4193f422dcecca2", + "submittedTime": 1589314602908, + "txReceipt": { + "blockHash": "0xb9d2d71153b66146fde74b14b1c1ffc0588eb4a02ff464e32a4db9ae4bbfad8a", + "blockNumber": "62d5de", + "contractAddress": null, + "cumulativeGasUsed": "5208", + "from": "0x9eca64466f257793eaa52fcfff5066894b76a149", + "gasUsed": "5208", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "status": "0x1", + "to": "0xffe5bc4e8f1f969934d773fa67da095d2e491a97", + "transactionHash": "0x06bb79b856f5eb67025e4c4ffff44bca26ae135d1c3e6bd9a4193f422dcecca2", + "transactionIndex": "0" + } + }, + "hasRetried": false, + "hasCancelled": false + }, + { + "nonce": "0xb", + "initialTransaction": { + "id": 4243712234858507, + "time": 1589314355872, + "status": "confirmed", + "metamaskNetworkId": "4", + "loadingDefaults": false, + "txParams": { + "from": "0x9eca64466f257793eaa52fcfff5066894b76a149", + "to": "0x0ccc8aeeaf5ce790f3b448325981a143fdef8848", + "nonce": "0xb", + "value": "0x1bc16d674ec80000", + "gas": "0x5208", + "gasPrice": "0x2540be400" + }, + "type": "standard", + "origin": "metamask", + "transactionCategory": "sentEther", + "nonceDetails": { + "params": { + "highestLocallyConfirmed": 0, + "highestSuggested": 10, + "nextNetworkNonce": 10 + }, + "local": { + "name": "local", + "nonce": 11, + "details": { + "startPoint": 10, + "highest": 11 + } + }, + "network": { + "name": "network", + "nonce": 10, + "details": { + "blockNumber": "0x62d5cc", + "baseCount": 10 + } + } + }, + "r": "0xe6828baea0a93a52779ffa5ea55e927781fb7d4be58107a29c75d314d433d055", + "s": "0x10613f984c57b8928d8ed9fce16ddda5746767e5f68f4c8fc29542e86a61f458", + "v": "0x2b", + "rawTx": "0xf86c0b8502540be400825208940ccc8aeeaf5ce790f3b448325981a143fdef8848881bc16d674ec80000802ba0e6828baea0a93a52779ffa5ea55e927781fb7d4be58107a29c75d314d433d055a010613f984c57b8928d8ed9fce16ddda5746767e5f68f4c8fc29542e86a61f458", + "hash": "0x2ccb9e2c0c64399ebc5c4ac70bebc5b537248458dee6cbce32df4b50c9e73bbd", + "submittedTime": 1589314356907, + "txReceipt": { + "blockHash": "0xfa3c8b63aaba2ef64ab328af72811dd5110a7641bd435cc6fbdfd9ea0d334542", + "blockNumber": "62d5ce", + "contractAddress": null, + "cumulativeGasUsed": "5208", + "from": "0x9eca64466f257793eaa52fcfff5066894b76a149", + "gasUsed": "5208", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "status": "0x1", + "to": "0x0ccc8aeeaf5ce790f3b448325981a143fdef8848", + "transactionHash": "0x2ccb9e2c0c64399ebc5c4ac70bebc5b537248458dee6cbce32df4b50c9e73bbd", + "transactionIndex": "0" + } + }, + "primaryTransaction": { + "id": 4243712234858507, + "time": 1589314355872, + "status": "confirmed", + "metamaskNetworkId": "4", + "loadingDefaults": false, + "txParams": { + "from": "0x9eca64466f257793eaa52fcfff5066894b76a149", + "to": "0x0ccc8aeeaf5ce790f3b448325981a143fdef8848", + "nonce": "0xb", + "value": "0x1bc16d674ec80000", + "gas": "0x5208", + "gasPrice": "0x2540be400" + }, + "type": "standard", + "origin": "metamask", + "transactionCategory": "sentEther", + "nonceDetails": { + "params": { + "highestLocallyConfirmed": 0, + "highestSuggested": 10, + "nextNetworkNonce": 10 + }, + "local": { + "name": "local", + "nonce": 11, + "details": { + "startPoint": 10, + "highest": 11 + } + }, + "network": { + "name": "network", + "nonce": 10, + "details": { + "blockNumber": "0x62d5cc", + "baseCount": 10 + } + } + }, + "r": "0xe6828baea0a93a52779ffa5ea55e927781fb7d4be58107a29c75d314d433d055", + "s": "0x10613f984c57b8928d8ed9fce16ddda5746767e5f68f4c8fc29542e86a61f458", + "v": "0x2b", + "rawTx": "0xf86c0b8502540be400825208940ccc8aeeaf5ce790f3b448325981a143fdef8848881bc16d674ec80000802ba0e6828baea0a93a52779ffa5ea55e927781fb7d4be58107a29c75d314d433d055a010613f984c57b8928d8ed9fce16ddda5746767e5f68f4c8fc29542e86a61f458", + "hash": "0x2ccb9e2c0c64399ebc5c4ac70bebc5b537248458dee6cbce32df4b50c9e73bbd", + "submittedTime": 1589314356907, + "txReceipt": { + "blockHash": "0xfa3c8b63aaba2ef64ab328af72811dd5110a7641bd435cc6fbdfd9ea0d334542", + "blockNumber": "62d5ce", + "contractAddress": null, + "cumulativeGasUsed": "5208", + "from": "0x9eca64466f257793eaa52fcfff5066894b76a149", + "gasUsed": "5208", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "status": "0x1", + "to": "0x0ccc8aeeaf5ce790f3b448325981a143fdef8848", + "transactionHash": "0x2ccb9e2c0c64399ebc5c4ac70bebc5b537248458dee6cbce32df4b50c9e73bbd", + "transactionIndex": "0" + } + }, + "hasRetried": false, + "hasCancelled": false + }, + { + "nonce": "0xa", + "initialTransaction": { + "id": 4243712234858506, + "time": 1589314345433, + "status": "confirmed", + "metamaskNetworkId": "4", + "loadingDefaults": false, + "txParams": { + "from": "0x9eca64466f257793eaa52fcfff5066894b76a149", + "to": "0xffe5bc4e8f1f969934d773fa67da095d2e491a97", + "nonce": "0xa", + "value": "0x1bc16d674ec80000", + "gas": "0x5208", + "gasPrice": "0x306dc4200" + }, + "type": "standard", + "origin": "metamask", + "transactionCategory": "sentEther", + "nonceDetails": { + "params": { + "highestLocallyConfirmed": 0, + "highestSuggested": 10, + "nextNetworkNonce": 10 + }, + "local": { + "name": "local", + "nonce": 10, + "details": { + "startPoint": 10, + "highest": 10 + } + }, + "network": { + "name": "network", + "nonce": 10, + "details": { + "blockNumber": "0x62d5cb", + "baseCount": 10 + } + } + }, + "r": "0x94b120a1df80be3dfad057b7ccac866b6b7583b63d61e5b021811c8b7ffc9a3b", + "s": "0x1778de08e29a4c8dfc3aa3e2c2338e98494ebd2c380c901d0dfba95126dde65f", + "v": "0x2c", + "rawTx": "0xf86c0a850306dc420082520894ffe5bc4e8f1f969934d773fa67da095d2e491a97881bc16d674ec80000802ca094b120a1df80be3dfad057b7ccac866b6b7583b63d61e5b021811c8b7ffc9a3ba01778de08e29a4c8dfc3aa3e2c2338e98494ebd2c380c901d0dfba95126dde65f", + "hash": "0x52604fd8d329894a747d8cf521cbbc4adb35eb9a91e3a3ba3ee32d8729c16536", + "submittedTime": 1589314348235, + "firstRetryBlockNumber": "0x62d5cc", + "txReceipt": { + "blockHash": "0x3d61a8d8a0e79e0e7a3a9206bf62f9a8e47791c527cd85cb4fcf800609234115", + "blockNumber": "62d5cd", + "contractAddress": null, + "cumulativeGasUsed": "a810", + "from": "0x9eca64466f257793eaa52fcfff5066894b76a149", + "gasUsed": "5208", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "status": "0x1", + "to": "0xffe5bc4e8f1f969934d773fa67da095d2e491a97", + "transactionHash": "0x52604fd8d329894a747d8cf521cbbc4adb35eb9a91e3a3ba3ee32d8729c16536", + "transactionIndex": "1" + } + }, + "primaryTransaction": { + "id": 4243712234858506, + "time": 1589314345433, + "status": "confirmed", + "metamaskNetworkId": "4", + "loadingDefaults": false, + "txParams": { + "from": "0x9eca64466f257793eaa52fcfff5066894b76a149", + "to": "0xffe5bc4e8f1f969934d773fa67da095d2e491a97", + "nonce": "0xa", + "value": "0x1bc16d674ec80000", + "gas": "0x5208", + "gasPrice": "0x306dc4200" + }, + "type": "standard", + "origin": "metamask", + "transactionCategory": "sentEther", + "nonceDetails": { + "params": { + "highestLocallyConfirmed": 0, + "highestSuggested": 10, + "nextNetworkNonce": 10 + }, + "local": { + "name": "local", + "nonce": 10, + "details": { + "startPoint": 10, + "highest": 10 + } + }, + "network": { + "name": "network", + "nonce": 10, + "details": { + "blockNumber": "0x62d5cb", + "baseCount": 10 + } + } + }, + "r": "0x94b120a1df80be3dfad057b7ccac866b6b7583b63d61e5b021811c8b7ffc9a3b", + "s": "0x1778de08e29a4c8dfc3aa3e2c2338e98494ebd2c380c901d0dfba95126dde65f", + "v": "0x2c", + "rawTx": "0xf86c0a850306dc420082520894ffe5bc4e8f1f969934d773fa67da095d2e491a97881bc16d674ec80000802ca094b120a1df80be3dfad057b7ccac866b6b7583b63d61e5b021811c8b7ffc9a3ba01778de08e29a4c8dfc3aa3e2c2338e98494ebd2c380c901d0dfba95126dde65f", + "hash": "0x52604fd8d329894a747d8cf521cbbc4adb35eb9a91e3a3ba3ee32d8729c16536", + "submittedTime": 1589314348235, + "firstRetryBlockNumber": "0x62d5cc", + "txReceipt": { + "blockHash": "0x3d61a8d8a0e79e0e7a3a9206bf62f9a8e47791c527cd85cb4fcf800609234115", + "blockNumber": "62d5cd", + "contractAddress": null, + "cumulativeGasUsed": "a810", + "from": "0x9eca64466f257793eaa52fcfff5066894b76a149", + "gasUsed": "5208", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "status": "0x1", + "to": "0xffe5bc4e8f1f969934d773fa67da095d2e491a97", + "transactionHash": "0x52604fd8d329894a747d8cf521cbbc4adb35eb9a91e3a3ba3ee32d8729c16536", + "transactionIndex": "1" + } + }, + "hasRetried": false, + "hasCancelled": false + }, + { + "initialTransaction": { + "blockNumber": "6477257", + "id": 4243712234858505, + "metamaskNetworkId": "4", + "status": "confirmed", + "time": 1589314295000, + "txParams": { + "from": "0x31b98d14007bdee637298086988a0bbd31184523", + "gas": "0x5208", + "gasPrice": "0x3b9aca00", + "nonce": "0x56540", + "to": "0x9eca64466f257793eaa52fcfff5066894b76a149", + "value": "0x1043561a882930000" + }, + "hash": "0x5ca26d1cdcabef1ac2ad5b2b38604c9ced65d143efc7525f848c46f28e0e4116", + "transactionCategory": "incoming" + }, + "primaryTransaction": { + "blockNumber": "6477257", + "id": 4243712234858505, + "metamaskNetworkId": "4", + "status": "confirmed", + "time": 1589314295000, + "txParams": { + "from": "0x31b98d14007bdee637298086988a0bbd31184523", + "gas": "0x5208", + "gasPrice": "0x3b9aca00", + "nonce": "0x56540", + "to": "0x9eca64466f257793eaa52fcfff5066894b76a149", + "value": "0x1043561a882930000" + }, + "hash": "0x5ca26d1cdcabef1ac2ad5b2b38604c9ced65d143efc7525f848c46f28e0e4116", + "transactionCategory": "incoming" + }, + "hasRetried": false, + "hasCancelled": false + }, + { + "initialTransaction": { + "blockNumber": "6454493", + "id": 4243712234858475, + "metamaskNetworkId": "4", + "status": "confirmed", + "time": 1588972833000, + "txParams": { + "from": "0x9eca64466f257793eaa52fcfff5066894b76a149", + "gas": "0x5208", + "gasPrice": "0x24e160300", + "nonce": "0x8", + "to": "0x9eca64466f257793eaa52fcfff5066894b76a149", + "value": "0x0" + }, + "hash": "0xa42b2b433e5bd2616b52e30792aedb6a3c374a752a95d43d99e2a8b143937889", + "transactionCategory": "incoming" + }, + "primaryTransaction": { + "blockNumber": "6454493", + "id": 4243712234858475, + "metamaskNetworkId": "4", + "status": "confirmed", + "time": 1588972833000, + "txParams": { + "from": "0x9eca64466f257793eaa52fcfff5066894b76a149", + "gas": "0x5208", + "gasPrice": "0x24e160300", + "nonce": "0x8", + "to": "0x9eca64466f257793eaa52fcfff5066894b76a149", + "value": "0x0" + }, + "hash": "0xa42b2b433e5bd2616b52e30792aedb6a3c374a752a95d43d99e2a8b143937889", + "transactionCategory": "incoming" + }, + "hasRetried": false, + "hasCancelled": false + }, + { + "initialTransaction": { + "blockNumber": "6195526", + "id": 4243712234858466, + "metamaskNetworkId": "4", + "status": "confirmed", + "time": 1585087013000, + "txParams": { + "from": "0xee014609ef9e09776ac5fe00bdbfef57bcdefebb", + "gas": "0x5208", + "gasPrice": "0x77359400", + "nonce": "0x3", + "to": "0x9eca64466f257793eaa52fcfff5066894b76a149", + "value": "0xde0b6b3a7640000" + }, + "hash": "0xbcb195f393f4468945b4045cd41bcdbc2f19ad75ae92a32cf153a3004e42009a", + "transactionCategory": "incoming" + }, + "primaryTransaction": { + "blockNumber": "6195526", + "id": 4243712234858466, + "metamaskNetworkId": "4", + "status": "confirmed", + "time": 1585087013000, + "txParams": { + "from": "0xee014609ef9e09776ac5fe00bdbfef57bcdefebb", + "gas": "0x5208", + "gasPrice": "0x77359400", + "nonce": "0x3", + "to": "0x9eca64466f257793eaa52fcfff5066894b76a149", + "value": "0xde0b6b3a7640000" + }, + "hash": "0xbcb195f393f4468945b4045cd41bcdbc2f19ad75ae92a32cf153a3004e42009a", + "transactionCategory": "incoming" + }, + "hasRetried": false, + "hasCancelled": false + } +] diff --git a/test/data/v17-long-history.json b/test/data/v17-long-history.json deleted file mode 100644 index cccb1ef9632a..000000000000 --- a/test/data/v17-long-history.json +++ /dev/null @@ -1,3054 +0,0 @@ -{ - "meta": { - "version": 17 - }, - "data": { - "config": {}, - "NetworkController": { - "provider": { - "type": "ropsten", - "rpcTarget": "https://ropsten.infura.io/metamask" - }, - "network": "3" - }, - "NoticeController": { - "noticesList": [ - { - "read": true, - "date": "Thu Feb 09 2017", - "title": "Terms of Use", - "body": "", - "id": 0 - }, - { - "read": true, - "date": "Mon May 08 2017", - "title": "Privacy Notice", - "body": "", - "id": 2 - } - ] - }, - "CurrencyController": { - "currentCurrency": "USD", - "conversionRate": 295.81988556, - "conversionDate": 1502734981 - }, - "KeyringController": { - "vault": "{\"data\":\"fFwVD3Msyq1o9NsDbjMlyJ1ZfoMcqfTgjR9cium0C5Vnpk9IM6f/RTVXfk0J4c4UkbgbKd++q8t1S+D22s7Ddz/BT/fe0GrbwPvAYQi1oJuOI9/Lf7I0JbESGv4PheijCIH4h/FiO+tIAuqM0Co3PULM4mOHdzXD8SWmzxbDGx+4wG84EQE9a1NEbqEjyqrX02h3NwZsjrSeuV5TibpGJB9vnKNpDu9wF0DVKLtLCG5n67uoTI/ve9Z7hIDa03vNi/71iE4avFb6ogE2SAkFDncEcU0xXVkBMapBXjrpe5sIq08Ddo0Hhi4fkd4yFW77sAH4TKzd6bWSn2AK8HL8Gpcrk4R6Cvv8EtyjUqsOJfE4AmYI6rWfFutLqEAp\",\"iv\":\"9fJ/OGDVwUnu3H0U71qOGA==\",\"salt\":\"5yGOu/+yrrb3DyP+cvMKIZqjhSjrEY+bnceHnz9n8gM=\"}", - "walletNicknames": { - "0x3ae39e89dc7e736cce53091057a45bf44b1a566c": "Account 1", - "0xa7a467edcb16a51976418ec6133f14f7939dc378": "Account 2", - "0x03ce38bd04b4ad7581a7070570381a530951ebbe": "Account 3" - } - }, - "PreferencesController": { - "frequentRpcList": [], - "currentAccountTab": "history", - "tokens": [], - "selectedAddress": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c" - }, - "seedWords": null, - "InfuraController": { - "infuraNetworkStatus": { - "mainnet": "degraded", - "ropsten": "ok", - "kovan": "ok", - "rinkeby": "ok", - "goerli": "ok" - } - }, - "BlacklistController": { - "phishing": { - "version": 2, - "tolerance": 2, - "fuzzylist": [ - "metamask.io", - "myetherwallet.com" - ], - "whitelist": [ - "metamask.io", - "myetherwallet.com", - "ethereum.org", - "myetheroll.com", - "myetherapi.com", - "ledgerwallet.com", - "etherscan.io", - "etherid.org", - "ether.cards", - "etheroll.com", - "ethnews.com", - "ethex.market", - "ethereumdev.io", - "ethereumdev.kr", - "dether.io", - "ethermine.org", - "slaask.com", - "etherbtc.io", - "ethereal.capital", - "etherisc.com", - "m.famalk.net", - "etherecho.com", - "ethereum.os.tc", - "theethereum.wiki", - "metajack.im", - "etherhub.io", - "ethereum.network", - "ethereum.link", - "ethereum.com", - "prethereum.org", - "ethereumj.io", - "etheraus.com", - "ethereum.dev", - "1ethereum.ru", - "ethereum.nz", - "nethereum.com", - "metabank.com", - "metamas.com", - "metabase.com" - ], - "blacklist": [ - "numerai.tech", - "decentraiand.org", - "blockcrein.info", - "blockchealn.info", - "bllookchain.info", - "blockcbhain.info", - "myetherwallet.com.ethpromonodes.com", - "mettamask.io", - "tokenswap.org", - "netherum.com", - "etherexx.org", - "etherume.io", - "ethereum.plus", - "ehtereum.org", - "etereurm.org", - "etheream.com", - "ethererum.org", - "ethereum.io", - "0xtoken.com", - "cryptoalliance.herokuapp.com", - "bitspark2.com", - "indorsetoken.com", - "bittreat.com", - "iconexus.tk", - "iconexus.ml", - "iconexus.ga", - "iconexus.cf", - "etherwallet.online", - "wallet-ethereum.net", - "bitsdigit.com", - "etherswap.org", - "eos.ac", - "uasfwallet.com", - "ziber.io", - "multiply-ethereum.info", - "bittrex.comze.com", - "karbon.vacau.com", - "etherdelta.gitlhub.io", - "etherdelta.glthub.io", - "digitaldevelopersfund.vacau.com", - "district-0x.io", - "coin-dash.com", - "coindash.ru", - "district0x.net", - "aragonproject.io", - "coin-wallet.info", - "coinswallet.info", - "contribute-status.im", - "ether-api.com", - "ether-wall.com", - "mycoinwallet.net", - "ethereumchamber.com", - "ethereumchamber.net", - "ethereumchest.com", - "myetherweb.com.de", - "myetherieumwallet.com", - "myetehrwallet.com", - "myeterwalet.com", - "myetherwaiiet.com", - "myetherwallet.info", - "myetherwallet.ch", - "myetherwallet.om", - "myethervallet.com", - "myetherwallet.com.cm", - "myetherwallet.com.co", - "myetherwallet.com.de", - "myetherwallet.com.gl", - "myetherwallet.com.im", - "myetherwallet.com.ua", - "secure-myetherwallet.com", - "update-myetherwallet.com", - "wwwmyetherwallet.com", - "myeatherwallet.com", - "myetharwallet.com", - "myelherwallel.com", - "myetherwaillet.com", - "myetherwaliet.com", - "myetherwallel.com", - "myetherwallet.cam", - "myetherwallet.cc", - "myetherwallet.co", - "myetherwallet.cm", - "myetherwallet.cz", - "myetherwallet.org", - "myetherwallet.tech", - "myetherwallet.top", - "myetherwallet.net", - "etherclassicwallet.com", - "omg-omise.co", - "omise-go.com", - "tenx-tech.com", - "tokensale-tenx.tech", - "ubiqcoin.org", - "metamask.com", - "ethtrade.io", - "myetcwallet.com", - "account-kigo.net", - "bitcoin-wallet.net", - "blocklichan.info", - "bloclkicihan.info", - "coindash.ml", - "eos-bonus.com", - "eos-io.info", - "ether-wallet.net", - "ethereum-wallet.info", - "ethereum-wallet.net", - "ethereumchest.net", - "reservations-kigo.net", - "reservations-lodgix.com", - "secure-liverez.com", - "secure-onerooftop.com", - "settings-liverez.com", - "software-liverez.com", - "software-lodgix.com", - "unhackableetherwallets.com", - "www-myetherwallet.com", - "etherwallet.co.za", - "etherwalletchain.com", - "etherwallets.net", - "etherwallets.nl", - "my-ethwallet.com", - "my.ether-wallet.co", - "myetherwallet.com.am", - "myetherwallet.com.ht", - "myetherwalletcom.com", - "xn--myetherwalle-xoc.com", - "xn--myetherwalle-44i.com", - "xn--myetherwalle-xhk.com", - "xn--myetherwallt-cfb.com", - "xn--myetherwallt-6tb.com", - "xn--myetherwallt-xub.com", - "xn--myetherwallt-ovb.com", - "xn--myetherwallt-fwb.com", - "xn--myetherwallt-5wb.com", - "xn--myetherwallt-jzi.com", - "xn--myetherwallt-2ck.com", - "xn--myetherwallt-lok.com", - "xn--myetherwallt-lsl.com", - "xn--myetherwallt-ce6f.com", - "xn--myetherwalet-mcc.com", - "xn--myetherwalet-xhf.com", - "xn--myetherwalet-lcc.com", - "xn--myetherwaet-15ba.com", - "xn--myetherwalet-whf.com", - "xn--myetherwaet-v2ea.com", - "xn--myetherwllet-59a.com", - "xn--myetherwllet-jbb.com", - "xn--myetherwllet-wbb.com", - "xn--myetherwllet-9bb.com", - "xn--myetherwllet-ncb.com", - "xn--myetherwllet-0cb.com", - "xn--myetherwllet-5nb.com", - "xn--myetherwllet-ktd.com", - "xn--myetherwllet-mre.com", - "xn--myetherwllet-76e.com", - "xn--myetherwllet-o0l.com", - "xn--myetherwllet-c45f.com", - "xn--myetherallet-ejn.com", - "xn--myethewallet-4nf.com", - "xn--myethewallet-iof.com", - "xn--myethewallet-mpf.com", - "xn--myethewallet-6bk.com", - "xn--myethewallet-i31f.com", - "xn--myethrwallet-feb.com", - "xn--myethrwallt-fbbf.com", - "xn--myethrwallet-seb.com", - "xn--myethrwallt-rbbf.com", - "xn--myethrwallet-5eb.com", - "xn--myethrwallt-3bbf.com", - "xn--myethrwallet-0tb.com", - "xn--myethrwallt-tpbf.com", - "xn--myethrwallet-rub.com", - "xn--myethrwallt-iqbf.com", - "xn--myethrwallet-ivb.com", - "xn--myethrwallt-6qbf.com", - "xn--myethrwallet-8vb.com", - "xn--myethrwallt-vrbf.com", - "xn--myethrwallet-zwb.com", - "xn--myethrwallt-ksbf.com", - "xn--myethrwallet-dzi.com", - "xn--myethrwallt-wbif.com", - "xn--myethrwallet-wck.com", - "xn--myethrwallt-skjf.com", - "xn--myethrwallet-fok.com", - "xn--myethrwallt-fvjf.com", - "xn--myethrwallet-fsl.com", - "xn--myethrwallt-fwkf.com", - "xn--myethrwallet-5d6f.com", - "xn--myethrwallt-319ef.com", - "xn--myeterwallet-ufk.com", - "xn--myeterwallet-nrl.com", - "xn--myeterwallet-von.com", - "xn--myeterwallet-jl6c.com", - "xn--myeherwallet-ooc.com", - "xn--myeherwalle-6hci.com", - "xn--myeherwallet-v4i.com", - "xn--myeherwalle-zgii.com", - "xn--myeherwallet-ohk.com", - "xn--myeherwalle-6oji.com", - "xn--mytherwallet-ceb.com", - "xn--mythrwallet-cbbc.com", - "xn--mythrwallt-c7acf.com", - "xn--mytherwallet-peb.com", - "xn--mythrwallet-obbc.com", - "xn--mythrwallt-n7acf.com", - "xn--mytherwallet-2eb.com", - "xn--mythrwallet-0bbc.com", - "xn--mythrwallt-y7acf.com", - "xn--mytherwallet-xtb.com", - "xn--mythrwallet-qpbc.com", - "xn--mythrwallt-jlbcf.com", - "xn--mytherwallet-oub.com", - "xn--mythrwallet-fqbc.com", - "xn--mythrwallt-5lbcf.com", - "xn--mythrwallet-3qbc.com", - "xn--mythrwallt-smbcf.com", - "xn--mytherwallet-5vb.com", - "xn--mythrwallet-srbc.com", - "xn--mythrwallt-fnbcf.com", - "xn--mytherwallet-wwb.com", - "xn--mythrwallet-hsbc.com", - "xn--mythrwallt-1nbcf.com", - "xn--mytherwallet-9yi.com", - "xn--mythrwallet-tbic.com", - "xn--mythrwallt-dnhcf.com", - "xn--mytherwallet-tck.com", - "xn--mythrwallet-pkjc.com", - "xn--mythrwallt-lsicf.com", - "xn--mytherwallet-cok.com", - "xn--mythrwallet-cvjc.com", - "xn--mythrwallt-c2icf.com", - "xn--mytherwallet-csl.com", - "xn--mythrwallet-cwkc.com", - "xn--mythrwallt-c0jcf.com", - "xn--mytherwallet-2d6f.com", - "xn--mythrwallet-019ec.com", - "xn--mythrwallt-yq3ecf.com", - "xn--metherwallet-qlb.com", - "xn--metherwallet-1uf.com", - "xn--metherwallet-iyi.com", - "xn--metherwallet-zhk.com", - "xn--metherwallet-3ml.com", - "xn--mytherwallet-fvb.com", - "xn--myetherwallt-7db.com", - "xn--myetherwallt-leb.com", - "xn--myetherwallt-yeb.com", - "xn--yetherwallet-vjf.com", - "xn--yetherwallet-dfk.com", - "xn--yetherwallet-1t1f.com", - "xn--yetherwallet-634f.com" - ] - } - }, - "AddressBookController": { - "addressBook": [] - }, - "TransactionController": { - "transactions": [ - { - "id": 6616756286038869, - "time": 1502438908445, - "status": "confirmed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d", - "chainId": 3 - }, - "history": [ - { - "id": 6616756286038869, - "time": 1502438908445, - "status": "unapproved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "3b9aca00", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038869, - "time": 1502438908445, - "status": "unapproved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "3b9aca00", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038869, - "time": 1502438908445, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "3b9aca00", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038869, - "time": 1502438908445, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "3b9aca00", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038869, - "time": 1502438908445, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "3b9aca00", - "gas": "0x7b0d", - "nonce": 0 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16643c", - "baseCount": 0, - "baseCountHex": "0x0", - "pendingCount": 0 - } - }, - { - "id": 6616756286038869, - "time": 1502438908445, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "3b9aca00", - "gas": "0x7b0d", - "nonce": 0 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16643c", - "baseCount": 0, - "baseCountHex": "0x0", - "pendingCount": 0 - } - }, - { - "id": 6616756286038869, - "time": 1502438908445, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16643c", - "baseCount": 0, - "baseCountHex": "0x0", - "pendingCount": 0 - } - }, - { - "id": 6616756286038869, - "time": 1502438908445, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16643c", - "baseCount": 0, - "baseCountHex": "0x0", - "pendingCount": 0 - } - }, - { - "id": 6616756286038869, - "time": 1502438908445, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16643c", - "baseCount": 0, - "baseCountHex": "0x0", - "pendingCount": 0 - }, - "rawTx": "0xf86380843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a02e45f61129f0c97634e37a1823b858df7b0dfc867a44949aae7dd9bcea1c1b5aa03b1f002cda0872d40517d5b26caefa3e407ec8fd03bc7dc2d995b84726961264" - }, - { - "id": 6616756286038869, - "time": 1502438908445, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16643c", - "baseCount": 0, - "baseCountHex": "0x0", - "pendingCount": 0 - }, - "rawTx": "0xf86380843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a02e45f61129f0c97634e37a1823b858df7b0dfc867a44949aae7dd9bcea1c1b5aa03b1f002cda0872d40517d5b26caefa3e407ec8fd03bc7dc2d995b84726961264" - }, - { - "id": 6616756286038869, - "time": 1502438908445, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16643c", - "baseCount": 0, - "baseCountHex": "0x0", - "pendingCount": 0 - }, - "rawTx": "0xf86380843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a02e45f61129f0c97634e37a1823b858df7b0dfc867a44949aae7dd9bcea1c1b5aa03b1f002cda0872d40517d5b26caefa3e407ec8fd03bc7dc2d995b84726961264", - "hash": "0x38c254639139c94303a3141aee041b15301509e743f08569ffac6aca17518012" - }, - { - "id": 6616756286038869, - "time": 1502438908445, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16643c", - "baseCount": 0, - "baseCountHex": "0x0", - "pendingCount": 0 - }, - "rawTx": "0xf86380843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a02e45f61129f0c97634e37a1823b858df7b0dfc867a44949aae7dd9bcea1c1b5aa03b1f002cda0872d40517d5b26caefa3e407ec8fd03bc7dc2d995b84726961264", - "hash": "0x38c254639139c94303a3141aee041b15301509e743f08569ffac6aca17518012" - }, - { - "id": 6616756286038869, - "time": 1502438908445, - "status": "submitted", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16643c", - "baseCount": 0, - "baseCountHex": "0x0", - "pendingCount": 0 - }, - "rawTx": "0xf86380843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a02e45f61129f0c97634e37a1823b858df7b0dfc867a44949aae7dd9bcea1c1b5aa03b1f002cda0872d40517d5b26caefa3e407ec8fd03bc7dc2d995b84726961264", - "hash": "0x38c254639139c94303a3141aee041b15301509e743f08569ffac6aca17518012" - }, - { - "id": 6616756286038869, - "time": 1502438908445, - "status": "submitted", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16643c", - "baseCount": 0, - "baseCountHex": "0x0", - "pendingCount": 0 - }, - "rawTx": "0xf86380843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a02e45f61129f0c97634e37a1823b858df7b0dfc867a44949aae7dd9bcea1c1b5aa03b1f002cda0872d40517d5b26caefa3e407ec8fd03bc7dc2d995b84726961264", - "hash": "0x38c254639139c94303a3141aee041b15301509e743f08569ffac6aca17518012" - }, - { - "id": 6616756286038869, - "time": 1502438908445, - "status": "confirmed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16643c", - "baseCount": 0, - "baseCountHex": "0x0", - "pendingCount": 0 - }, - "rawTx": "0xf86380843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a02e45f61129f0c97634e37a1823b858df7b0dfc867a44949aae7dd9bcea1c1b5aa03b1f002cda0872d40517d5b26caefa3e407ec8fd03bc7dc2d995b84726961264", - "hash": "0x38c254639139c94303a3141aee041b15301509e743f08569ffac6aca17518012", - "retryCount": 1 - }, - { - "id": 6616756286038869, - "time": 1502438908445, - "status": "confirmed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16643c", - "baseCount": 0, - "baseCountHex": "0x0", - "pendingCount": 0 - }, - "rawTx": "0xf86380843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a02e45f61129f0c97634e37a1823b858df7b0dfc867a44949aae7dd9bcea1c1b5aa03b1f002cda0872d40517d5b26caefa3e407ec8fd03bc7dc2d995b84726961264", - "hash": "0x38c254639139c94303a3141aee041b15301509e743f08569ffac6aca17518012", - "retryCount": 1 - } - ], - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16643c", - "baseCount": 0, - "baseCountHex": "0x0", - "pendingCount": 0 - }, - "rawTx": "0xf86380843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a02e45f61129f0c97634e37a1823b858df7b0dfc867a44949aae7dd9bcea1c1b5aa03b1f002cda0872d40517d5b26caefa3e407ec8fd03bc7dc2d995b84726961264", - "hash": "0x38c254639139c94303a3141aee041b15301509e743f08569ffac6aca17518012", - "retryCount": 1 - }, - { - "id": 6616756286038870, - "time": 1502573153664, - "status": "rejected", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "28fa6ae00", - "gas": "0x7b0d" - }, - "history": [ - { - "id": 6616756286038870, - "time": 1502573153664, - "status": "rejected", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "28fa6ae00", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038870, - "time": 1502573153664, - "status": "rejected", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "28fa6ae00", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - } - ], - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038871, - "time": 1502573157128, - "status": "confirmed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x28fa6ae00", - "gas": "0x7b0d", - "nonce": "0x01", - "chainId": 3 - }, - "history": [ - { - "id": 6616756286038871, - "time": 1502573157128, - "status": "unapproved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "28fa6ae00", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038871, - "time": 1502573157128, - "status": "unapproved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "28fa6ae00", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038871, - "time": 1502573157128, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "28fa6ae00", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038871, - "time": 1502573157128, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "28fa6ae00", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038871, - "time": 1502573157128, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "28fa6ae00", - "gas": "0x7b0d", - "nonce": 1 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x168739", - "baseCount": 1, - "baseCountHex": "0x1", - "pendingCount": 0 - } - }, - { - "id": 6616756286038871, - "time": 1502573157128, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "28fa6ae00", - "gas": "0x7b0d", - "nonce": 1 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x168739", - "baseCount": 1, - "baseCountHex": "0x1", - "pendingCount": 0 - } - }, - { - "id": 6616756286038871, - "time": 1502573157128, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x28fa6ae00", - "gas": "0x7b0d", - "nonce": "0x01", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x168739", - "baseCount": 1, - "baseCountHex": "0x1", - "pendingCount": 0 - } - }, - { - "id": 6616756286038871, - "time": 1502573157128, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x28fa6ae00", - "gas": "0x7b0d", - "nonce": "0x01", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x168739", - "baseCount": 1, - "baseCountHex": "0x1", - "pendingCount": 0 - } - }, - { - "id": 6616756286038871, - "time": 1502573157128, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x28fa6ae00", - "gas": "0x7b0d", - "nonce": "0x01", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x168739", - "baseCount": 1, - "baseCountHex": "0x1", - "pendingCount": 0 - }, - "rawTx": "0xf8640185028fa6ae00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a06261831b3d599a90dc24fac67bc648fd58cab2036e4e8dfbbb5c00c3fd9cf66ba00e2ea6ebc63ba715a94dc94e24120639c4ad60832d3285dd558929a61cc18cc0" - }, - { - "id": 6616756286038871, - "time": 1502573157128, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x28fa6ae00", - "gas": "0x7b0d", - "nonce": "0x01", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x168739", - "baseCount": 1, - "baseCountHex": "0x1", - "pendingCount": 0 - }, - "rawTx": "0xf8640185028fa6ae00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a06261831b3d599a90dc24fac67bc648fd58cab2036e4e8dfbbb5c00c3fd9cf66ba00e2ea6ebc63ba715a94dc94e24120639c4ad60832d3285dd558929a61cc18cc0" - }, - { - "id": 6616756286038871, - "time": 1502573157128, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x28fa6ae00", - "gas": "0x7b0d", - "nonce": "0x01", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x168739", - "baseCount": 1, - "baseCountHex": "0x1", - "pendingCount": 0 - }, - "rawTx": "0xf8640185028fa6ae00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a06261831b3d599a90dc24fac67bc648fd58cab2036e4e8dfbbb5c00c3fd9cf66ba00e2ea6ebc63ba715a94dc94e24120639c4ad60832d3285dd558929a61cc18cc0", - "hash": "0xeb1c57dec9df8410bcc65374c7f684fc8ebfcda6865a149e38bb000fa706a150" - }, - { - "id": 6616756286038871, - "time": 1502573157128, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x28fa6ae00", - "gas": "0x7b0d", - "nonce": "0x01", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x168739", - "baseCount": 1, - "baseCountHex": "0x1", - "pendingCount": 0 - }, - "rawTx": "0xf8640185028fa6ae00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a06261831b3d599a90dc24fac67bc648fd58cab2036e4e8dfbbb5c00c3fd9cf66ba00e2ea6ebc63ba715a94dc94e24120639c4ad60832d3285dd558929a61cc18cc0", - "hash": "0xeb1c57dec9df8410bcc65374c7f684fc8ebfcda6865a149e38bb000fa706a150" - }, - { - "id": 6616756286038871, - "time": 1502573157128, - "status": "submitted", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x28fa6ae00", - "gas": "0x7b0d", - "nonce": "0x01", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x168739", - "baseCount": 1, - "baseCountHex": "0x1", - "pendingCount": 0 - }, - "rawTx": "0xf8640185028fa6ae00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a06261831b3d599a90dc24fac67bc648fd58cab2036e4e8dfbbb5c00c3fd9cf66ba00e2ea6ebc63ba715a94dc94e24120639c4ad60832d3285dd558929a61cc18cc0", - "hash": "0xeb1c57dec9df8410bcc65374c7f684fc8ebfcda6865a149e38bb000fa706a150" - }, - { - "id": 6616756286038871, - "time": 1502573157128, - "status": "submitted", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x28fa6ae00", - "gas": "0x7b0d", - "nonce": "0x01", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x168739", - "baseCount": 1, - "baseCountHex": "0x1", - "pendingCount": 0 - }, - "rawTx": "0xf8640185028fa6ae00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a06261831b3d599a90dc24fac67bc648fd58cab2036e4e8dfbbb5c00c3fd9cf66ba00e2ea6ebc63ba715a94dc94e24120639c4ad60832d3285dd558929a61cc18cc0", - "hash": "0xeb1c57dec9df8410bcc65374c7f684fc8ebfcda6865a149e38bb000fa706a150" - }, - { - "id": 6616756286038871, - "time": 1502573157128, - "status": "confirmed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x28fa6ae00", - "gas": "0x7b0d", - "nonce": "0x01", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x168739", - "baseCount": 1, - "baseCountHex": "0x1", - "pendingCount": 0 - }, - "rawTx": "0xf8640185028fa6ae00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a06261831b3d599a90dc24fac67bc648fd58cab2036e4e8dfbbb5c00c3fd9cf66ba00e2ea6ebc63ba715a94dc94e24120639c4ad60832d3285dd558929a61cc18cc0", - "hash": "0xeb1c57dec9df8410bcc65374c7f684fc8ebfcda6865a149e38bb000fa706a150", - "retryCount": 1 - }, - { - "id": 6616756286038871, - "time": 1502573157128, - "status": "confirmed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x28fa6ae00", - "gas": "0x7b0d", - "nonce": "0x01", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x168739", - "baseCount": 1, - "baseCountHex": "0x1", - "pendingCount": 0 - }, - "rawTx": "0xf8640185028fa6ae00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a06261831b3d599a90dc24fac67bc648fd58cab2036e4e8dfbbb5c00c3fd9cf66ba00e2ea6ebc63ba715a94dc94e24120639c4ad60832d3285dd558929a61cc18cc0", - "hash": "0xeb1c57dec9df8410bcc65374c7f684fc8ebfcda6865a149e38bb000fa706a150", - "retryCount": 1 - } - ], - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x168739", - "baseCount": 1, - "baseCountHex": "0x1", - "pendingCount": 0 - }, - "rawTx": "0xf8640185028fa6ae00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a06261831b3d599a90dc24fac67bc648fd58cab2036e4e8dfbbb5c00c3fd9cf66ba00e2ea6ebc63ba715a94dc94e24120639c4ad60832d3285dd558929a61cc18cc0", - "hash": "0xeb1c57dec9df8410bcc65374c7f684fc8ebfcda6865a149e38bb000fa706a150", - "retryCount": 1 - }, - { - "id": 6616756286038872, - "time": 1502734903652, - "status": "confirmed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x02", - "chainId": 3 - }, - "history": [ - { - "id": 6616756286038872, - "time": 1502734903652, - "status": "unapproved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "4a817c800", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038872, - "time": 1502734903652, - "status": "unapproved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "4a817c800", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038872, - "time": 1502734903652, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "4a817c800", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038872, - "time": 1502734903652, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "4a817c800", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038872, - "time": 1502734903652, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "4a817c800", - "gas": "0x7b0d", - "nonce": 2 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b066", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 0 - } - }, - { - "id": 6616756286038872, - "time": 1502734903652, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "4a817c800", - "gas": "0x7b0d", - "nonce": 2 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b066", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 0 - } - }, - { - "id": 6616756286038872, - "time": 1502734903652, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x02", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b066", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 0 - } - }, - { - "id": 6616756286038872, - "time": 1502734903652, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x02", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b066", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 0 - } - }, - { - "id": 6616756286038872, - "time": 1502734903652, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x02", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b066", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 0 - }, - "rawTx": "0xf864028504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa057380f9007a48d4bce31792859b1a25cb2b45ba615e7951d8e8a925360a0b301a042393e72d1a96a2605c0da95705c5f3f7c744f0affcac01e0a64721037f04adc" - }, - { - "id": 6616756286038872, - "time": 1502734903652, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x02", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b066", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 0 - }, - "rawTx": "0xf864028504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa057380f9007a48d4bce31792859b1a25cb2b45ba615e7951d8e8a925360a0b301a042393e72d1a96a2605c0da95705c5f3f7c744f0affcac01e0a64721037f04adc" - }, - { - "id": 6616756286038872, - "time": 1502734903652, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x02", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b066", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 0 - }, - "rawTx": "0xf864028504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa057380f9007a48d4bce31792859b1a25cb2b45ba615e7951d8e8a925360a0b301a042393e72d1a96a2605c0da95705c5f3f7c744f0affcac01e0a64721037f04adc", - "hash": "0xc28ceb1e2c4e5c61b805b181e3cc99dd7bade58935233fab76c63cedfd494270" - }, - { - "id": 6616756286038872, - "time": 1502734903652, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x02", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b066", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 0 - }, - "rawTx": "0xf864028504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa057380f9007a48d4bce31792859b1a25cb2b45ba615e7951d8e8a925360a0b301a042393e72d1a96a2605c0da95705c5f3f7c744f0affcac01e0a64721037f04adc", - "hash": "0xc28ceb1e2c4e5c61b805b181e3cc99dd7bade58935233fab76c63cedfd494270" - }, - { - "id": 6616756286038872, - "time": 1502734903652, - "status": "submitted", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x02", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b066", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 0 - }, - "rawTx": "0xf864028504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa057380f9007a48d4bce31792859b1a25cb2b45ba615e7951d8e8a925360a0b301a042393e72d1a96a2605c0da95705c5f3f7c744f0affcac01e0a64721037f04adc", - "hash": "0xc28ceb1e2c4e5c61b805b181e3cc99dd7bade58935233fab76c63cedfd494270" - }, - { - "id": 6616756286038872, - "time": 1502734903652, - "status": "submitted", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x02", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b066", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 0 - }, - "rawTx": "0xf864028504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa057380f9007a48d4bce31792859b1a25cb2b45ba615e7951d8e8a925360a0b301a042393e72d1a96a2605c0da95705c5f3f7c744f0affcac01e0a64721037f04adc", - "hash": "0xc28ceb1e2c4e5c61b805b181e3cc99dd7bade58935233fab76c63cedfd494270" - }, - { - "id": 6616756286038872, - "time": 1502734903652, - "status": "confirmed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x02", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b066", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 0 - }, - "rawTx": "0xf864028504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa057380f9007a48d4bce31792859b1a25cb2b45ba615e7951d8e8a925360a0b301a042393e72d1a96a2605c0da95705c5f3f7c744f0affcac01e0a64721037f04adc", - "hash": "0xc28ceb1e2c4e5c61b805b181e3cc99dd7bade58935233fab76c63cedfd494270", - "retryCount": 1 - }, - { - "id": 6616756286038872, - "time": 1502734903652, - "status": "confirmed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x02", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b066", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 0 - }, - "rawTx": "0xf864028504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa057380f9007a48d4bce31792859b1a25cb2b45ba615e7951d8e8a925360a0b301a042393e72d1a96a2605c0da95705c5f3f7c744f0affcac01e0a64721037f04adc", - "hash": "0xc28ceb1e2c4e5c61b805b181e3cc99dd7bade58935233fab76c63cedfd494270", - "retryCount": 1 - } - ], - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b066", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 0 - }, - "rawTx": "0xf864028504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa057380f9007a48d4bce31792859b1a25cb2b45ba615e7951d8e8a925360a0b301a042393e72d1a96a2605c0da95705c5f3f7c744f0affcac01e0a64721037f04adc", - "hash": "0xc28ceb1e2c4e5c61b805b181e3cc99dd7bade58935233fab76c63cedfd494270", - "retryCount": 1 - }, - { - "id": 6616756286038873, - "time": 1502734910224, - "status": "confirmed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d", - "nonce": "0x03", - "chainId": 3 - }, - "history": [ - { - "id": 6616756286038873, - "time": 1502734910224, - "status": "unapproved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038873, - "time": 1502734910224, - "status": "unapproved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038873, - "time": 1502734910224, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038873, - "time": 1502734910224, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038873, - "time": 1502734910224, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d", - "nonce": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 1 - } - }, - { - "id": 6616756286038873, - "time": 1502734910224, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d", - "nonce": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 1 - } - }, - { - "id": 6616756286038873, - "time": 1502734910224, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d", - "nonce": "0x03", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 1 - } - }, - { - "id": 6616756286038873, - "time": 1502734910224, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d", - "nonce": "0x03", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 1 - } - }, - { - "id": 6616756286038873, - "time": 1502734910224, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d", - "nonce": "0x03", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 1 - }, - "rawTx": "0xf86303843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0e442afe9386066936f556d852a296d22b8392652aa2ddb26969d83d661759ee1a06dc55b164f666a37107e86d575d2701602fc100f0ef4875736d45995150d4897" - }, - { - "id": 6616756286038873, - "time": 1502734910224, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d", - "nonce": "0x03", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 1 - }, - "rawTx": "0xf86303843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0e442afe9386066936f556d852a296d22b8392652aa2ddb26969d83d661759ee1a06dc55b164f666a37107e86d575d2701602fc100f0ef4875736d45995150d4897" - }, - { - "id": 6616756286038873, - "time": 1502734910224, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d", - "nonce": "0x03", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 1 - }, - "rawTx": "0xf86303843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0e442afe9386066936f556d852a296d22b8392652aa2ddb26969d83d661759ee1a06dc55b164f666a37107e86d575d2701602fc100f0ef4875736d45995150d4897", - "hash": "0xfcc66b8002c64a5aaa076adea7f7e48d194de10e40eb64924c8de344805c8cb7" - }, - { - "id": 6616756286038873, - "time": 1502734910224, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d", - "nonce": "0x03", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 1 - }, - "rawTx": "0xf86303843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0e442afe9386066936f556d852a296d22b8392652aa2ddb26969d83d661759ee1a06dc55b164f666a37107e86d575d2701602fc100f0ef4875736d45995150d4897", - "hash": "0xfcc66b8002c64a5aaa076adea7f7e48d194de10e40eb64924c8de344805c8cb7" - }, - { - "id": 6616756286038873, - "time": 1502734910224, - "status": "submitted", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d", - "nonce": "0x03", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 1 - }, - "rawTx": "0xf86303843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0e442afe9386066936f556d852a296d22b8392652aa2ddb26969d83d661759ee1a06dc55b164f666a37107e86d575d2701602fc100f0ef4875736d45995150d4897", - "hash": "0xfcc66b8002c64a5aaa076adea7f7e48d194de10e40eb64924c8de344805c8cb7" - }, - { - "id": 6616756286038873, - "time": 1502734910224, - "status": "submitted", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d", - "nonce": "0x03", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 1 - }, - "rawTx": "0xf86303843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0e442afe9386066936f556d852a296d22b8392652aa2ddb26969d83d661759ee1a06dc55b164f666a37107e86d575d2701602fc100f0ef4875736d45995150d4897", - "hash": "0xfcc66b8002c64a5aaa076adea7f7e48d194de10e40eb64924c8de344805c8cb7" - }, - { - "id": 6616756286038873, - "time": 1502734910224, - "status": "confirmed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d", - "nonce": "0x03", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 1 - }, - "rawTx": "0xf86303843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0e442afe9386066936f556d852a296d22b8392652aa2ddb26969d83d661759ee1a06dc55b164f666a37107e86d575d2701602fc100f0ef4875736d45995150d4897", - "hash": "0xfcc66b8002c64a5aaa076adea7f7e48d194de10e40eb64924c8de344805c8cb7", - "retryCount": 2 - }, - { - "id": 6616756286038873, - "time": 1502734910224, - "status": "confirmed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x3b9aca00", - "gas": "0x7b0d", - "nonce": "0x03", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 1 - }, - "rawTx": "0xf86303843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0e442afe9386066936f556d852a296d22b8392652aa2ddb26969d83d661759ee1a06dc55b164f666a37107e86d575d2701602fc100f0ef4875736d45995150d4897", - "hash": "0xfcc66b8002c64a5aaa076adea7f7e48d194de10e40eb64924c8de344805c8cb7", - "retryCount": 2 - } - ], - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 1 - }, - "rawTx": "0xf86303843b9aca00827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0e442afe9386066936f556d852a296d22b8392652aa2ddb26969d83d661759ee1a06dc55b164f666a37107e86d575d2701602fc100f0ef4875736d45995150d4897", - "hash": "0xfcc66b8002c64a5aaa076adea7f7e48d194de10e40eb64924c8de344805c8cb7", - "retryCount": 2 - }, - { - "id": 6616756286038874, - "time": 1502734917414, - "status": "confirmed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x04", - "chainId": 3 - }, - "history": [ - { - "id": 6616756286038874, - "time": 1502734917414, - "status": "unapproved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "4a817c800", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038874, - "time": 1502734917414, - "status": "unapproved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "4a817c800", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038874, - "time": 1502734917414, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "4a817c800", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038874, - "time": 1502734917414, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "4a817c800", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038874, - "time": 1502734917414, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "4a817c800", - "gas": "0x7b0d", - "nonce": 4 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 2 - } - }, - { - "id": 6616756286038874, - "time": 1502734917414, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "4a817c800", - "gas": "0x7b0d", - "nonce": 4 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 2 - } - }, - { - "id": 6616756286038874, - "time": 1502734917414, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x04", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 2 - } - }, - { - "id": 6616756286038874, - "time": 1502734917414, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x04", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 2 - } - }, - { - "id": 6616756286038874, - "time": 1502734917414, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x04", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 2 - }, - "rawTx": "0xf864048504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a04be1c01535745fa7ec7aeb6e0b64d009981713808ca443b181fad802ce941352a03887e90375d9225b8dfd0d42324eed8eb4982fd14ea7b4069290237b29d1dcd3" - }, - { - "id": 6616756286038874, - "time": 1502734917414, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x04", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 2 - }, - "rawTx": "0xf864048504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a04be1c01535745fa7ec7aeb6e0b64d009981713808ca443b181fad802ce941352a03887e90375d9225b8dfd0d42324eed8eb4982fd14ea7b4069290237b29d1dcd3" - }, - { - "id": 6616756286038874, - "time": 1502734917414, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x04", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 2 - }, - "rawTx": "0xf864048504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a04be1c01535745fa7ec7aeb6e0b64d009981713808ca443b181fad802ce941352a03887e90375d9225b8dfd0d42324eed8eb4982fd14ea7b4069290237b29d1dcd3", - "hash": "0x9258ed7e451402612f572cbef52b63cd63cc2c59f443a207b7b4f8d317958635" - }, - { - "id": 6616756286038874, - "time": 1502734917414, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x04", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 2 - }, - "rawTx": "0xf864048504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a04be1c01535745fa7ec7aeb6e0b64d009981713808ca443b181fad802ce941352a03887e90375d9225b8dfd0d42324eed8eb4982fd14ea7b4069290237b29d1dcd3", - "hash": "0x9258ed7e451402612f572cbef52b63cd63cc2c59f443a207b7b4f8d317958635" - }, - { - "id": 6616756286038874, - "time": 1502734917414, - "status": "submitted", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x04", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 2 - }, - "rawTx": "0xf864048504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a04be1c01535745fa7ec7aeb6e0b64d009981713808ca443b181fad802ce941352a03887e90375d9225b8dfd0d42324eed8eb4982fd14ea7b4069290237b29d1dcd3", - "hash": "0x9258ed7e451402612f572cbef52b63cd63cc2c59f443a207b7b4f8d317958635" - }, - { - "id": 6616756286038874, - "time": 1502734917414, - "status": "submitted", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x04", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 2 - }, - "rawTx": "0xf864048504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a04be1c01535745fa7ec7aeb6e0b64d009981713808ca443b181fad802ce941352a03887e90375d9225b8dfd0d42324eed8eb4982fd14ea7b4069290237b29d1dcd3", - "hash": "0x9258ed7e451402612f572cbef52b63cd63cc2c59f443a207b7b4f8d317958635" - }, - { - "id": 6616756286038874, - "time": 1502734917414, - "status": "confirmed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x04", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 2 - }, - "rawTx": "0xf864048504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a04be1c01535745fa7ec7aeb6e0b64d009981713808ca443b181fad802ce941352a03887e90375d9225b8dfd0d42324eed8eb4982fd14ea7b4069290237b29d1dcd3", - "hash": "0x9258ed7e451402612f572cbef52b63cd63cc2c59f443a207b7b4f8d317958635", - "retryCount": 4 - }, - { - "id": 6616756286038874, - "time": 1502734917414, - "status": "confirmed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x04", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 2 - }, - "rawTx": "0xf864048504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a04be1c01535745fa7ec7aeb6e0b64d009981713808ca443b181fad802ce941352a03887e90375d9225b8dfd0d42324eed8eb4982fd14ea7b4069290237b29d1dcd3", - "hash": "0x9258ed7e451402612f572cbef52b63cd63cc2c59f443a207b7b4f8d317958635", - "retryCount": 4 - } - ], - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b067", - "baseCount": 2, - "baseCountHex": "0x2", - "pendingCount": 2 - }, - "rawTx": "0xf864048504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a04be1c01535745fa7ec7aeb6e0b64d009981713808ca443b181fad802ce941352a03887e90375d9225b8dfd0d42324eed8eb4982fd14ea7b4069290237b29d1dcd3", - "hash": "0x9258ed7e451402612f572cbef52b63cd63cc2c59f443a207b7b4f8d317958635", - "retryCount": 4 - }, - { - "id": 6616756286038875, - "time": 1502734922745, - "status": "confirmed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x05", - "chainId": 3 - }, - "history": [ - { - "id": 6616756286038875, - "time": 1502734922745, - "status": "unapproved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "4a817c800", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038875, - "time": 1502734922745, - "status": "unapproved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "4a817c800", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038875, - "time": 1502734922745, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "4a817c800", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038875, - "time": 1502734922745, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "4a817c800", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038875, - "time": 1502734922745, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "4a817c800", - "gas": "0x7b0d", - "nonce": 5 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 2 - } - }, - { - "id": 6616756286038875, - "time": 1502734922745, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "4a817c800", - "gas": "0x7b0d", - "nonce": 5 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 2 - } - }, - { - "id": 6616756286038875, - "time": 1502734922745, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x05", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 2 - } - }, - { - "id": 6616756286038875, - "time": 1502734922745, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x05", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 2 - } - }, - { - "id": 6616756286038875, - "time": 1502734922745, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x05", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 2 - }, - "rawTx": "0xf864058504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a0dac4756e84c008714b3b8b43807157ed63737450780bc57590e930c8a360750ca00b43ac8ec5235f57ccca7e68ce8fbf77f43d6ffa5fbff296cba66cef47889cf5" - }, - { - "id": 6616756286038875, - "time": 1502734922745, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x05", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 2 - }, - "rawTx": "0xf864058504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a0dac4756e84c008714b3b8b43807157ed63737450780bc57590e930c8a360750ca00b43ac8ec5235f57ccca7e68ce8fbf77f43d6ffa5fbff296cba66cef47889cf5" - }, - { - "id": 6616756286038875, - "time": 1502734922745, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x05", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 2 - }, - "rawTx": "0xf864058504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a0dac4756e84c008714b3b8b43807157ed63737450780bc57590e930c8a360750ca00b43ac8ec5235f57ccca7e68ce8fbf77f43d6ffa5fbff296cba66cef47889cf5", - "hash": "0x67cdff49c1f8ed506c759fc8fd7ffe93d59fcb3bfd926b964cad47e2e504dc9e" - }, - { - "id": 6616756286038875, - "time": 1502734922745, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x05", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 2 - }, - "rawTx": "0xf864058504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a0dac4756e84c008714b3b8b43807157ed63737450780bc57590e930c8a360750ca00b43ac8ec5235f57ccca7e68ce8fbf77f43d6ffa5fbff296cba66cef47889cf5", - "hash": "0x67cdff49c1f8ed506c759fc8fd7ffe93d59fcb3bfd926b964cad47e2e504dc9e" - }, - { - "id": 6616756286038875, - "time": 1502734922745, - "status": "submitted", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x05", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 2 - }, - "rawTx": "0xf864058504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a0dac4756e84c008714b3b8b43807157ed63737450780bc57590e930c8a360750ca00b43ac8ec5235f57ccca7e68ce8fbf77f43d6ffa5fbff296cba66cef47889cf5", - "hash": "0x67cdff49c1f8ed506c759fc8fd7ffe93d59fcb3bfd926b964cad47e2e504dc9e" - }, - { - "id": 6616756286038875, - "time": 1502734922745, - "status": "submitted", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x05", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 2 - }, - "rawTx": "0xf864058504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a0dac4756e84c008714b3b8b43807157ed63737450780bc57590e930c8a360750ca00b43ac8ec5235f57ccca7e68ce8fbf77f43d6ffa5fbff296cba66cef47889cf5", - "hash": "0x67cdff49c1f8ed506c759fc8fd7ffe93d59fcb3bfd926b964cad47e2e504dc9e" - }, - { - "id": 6616756286038875, - "time": 1502734922745, - "status": "confirmed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x05", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 2 - }, - "rawTx": "0xf864058504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a0dac4756e84c008714b3b8b43807157ed63737450780bc57590e930c8a360750ca00b43ac8ec5235f57ccca7e68ce8fbf77f43d6ffa5fbff296cba66cef47889cf5", - "hash": "0x67cdff49c1f8ed506c759fc8fd7ffe93d59fcb3bfd926b964cad47e2e504dc9e", - "retryCount": 3 - }, - { - "id": 6616756286038875, - "time": 1502734922745, - "status": "confirmed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x05", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 2 - }, - "rawTx": "0xf864058504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a0dac4756e84c008714b3b8b43807157ed63737450780bc57590e930c8a360750ca00b43ac8ec5235f57ccca7e68ce8fbf77f43d6ffa5fbff296cba66cef47889cf5", - "hash": "0x67cdff49c1f8ed506c759fc8fd7ffe93d59fcb3bfd926b964cad47e2e504dc9e", - "retryCount": 3 - } - ], - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 2 - }, - "rawTx": "0xf864058504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c808029a0dac4756e84c008714b3b8b43807157ed63737450780bc57590e930c8a360750ca00b43ac8ec5235f57ccca7e68ce8fbf77f43d6ffa5fbff296cba66cef47889cf5", - "hash": "0x67cdff49c1f8ed506c759fc8fd7ffe93d59fcb3bfd926b964cad47e2e504dc9e", - "retryCount": 3 - }, - { - "id": 6616756286038876, - "time": 1502734928623, - "status": "confirmed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x06", - "chainId": 3 - }, - "history": [ - { - "id": 6616756286038876, - "time": 1502734928623, - "status": "unapproved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "4a817c800", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038876, - "time": 1502734928623, - "status": "unapproved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "4a817c800", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038876, - "time": 1502734928623, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "4a817c800", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038876, - "time": 1502734928623, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "4a817c800", - "gas": "0x7b0d" - }, - "gasLimitSpecified": false, - "estimatedGas": "5209" - }, - { - "id": 6616756286038876, - "time": 1502734928623, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "4a817c800", - "gas": "0x7b0d", - "nonce": 6 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 3 - } - }, - { - "id": 6616756286038876, - "time": 1502734928623, - "status": "approved", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "4a817c800", - "gas": "0x7b0d", - "nonce": 6 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 3 - } - }, - { - "id": 6616756286038876, - "time": 1502734928623, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x06", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 3 - } - }, - { - "id": 6616756286038876, - "time": 1502734928623, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x06", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 3 - } - }, - { - "id": 6616756286038876, - "time": 1502734928623, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x06", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 3 - }, - "rawTx": "0xf864068504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0d983a744f58179522b4bb75f6320dbcf0a699506f2470139282a2ad02e92554fa030d818c35e997ba5d004df65a0c4ebcb49d098ec7dc190d7287a72f9c96f89e7" - }, - { - "id": 6616756286038876, - "time": 1502734928623, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x06", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 3 - }, - "rawTx": "0xf864068504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0d983a744f58179522b4bb75f6320dbcf0a699506f2470139282a2ad02e92554fa030d818c35e997ba5d004df65a0c4ebcb49d098ec7dc190d7287a72f9c96f89e7" - }, - { - "id": 6616756286038876, - "time": 1502734928623, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x06", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 3 - }, - "rawTx": "0xf864068504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0d983a744f58179522b4bb75f6320dbcf0a699506f2470139282a2ad02e92554fa030d818c35e997ba5d004df65a0c4ebcb49d098ec7dc190d7287a72f9c96f89e7", - "hash": "0x2c12c403aeb62a92bd5eabd3edcc38ab9e63bb0c93f706520bd2042894737ad1" - }, - { - "id": 6616756286038876, - "time": 1502734928623, - "status": "signed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x06", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 3 - }, - "rawTx": "0xf864068504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0d983a744f58179522b4bb75f6320dbcf0a699506f2470139282a2ad02e92554fa030d818c35e997ba5d004df65a0c4ebcb49d098ec7dc190d7287a72f9c96f89e7", - "hash": "0x2c12c403aeb62a92bd5eabd3edcc38ab9e63bb0c93f706520bd2042894737ad1" - }, - { - "id": 6616756286038876, - "time": 1502734928623, - "status": "submitted", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x06", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 3 - }, - "rawTx": "0xf864068504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0d983a744f58179522b4bb75f6320dbcf0a699506f2470139282a2ad02e92554fa030d818c35e997ba5d004df65a0c4ebcb49d098ec7dc190d7287a72f9c96f89e7", - "hash": "0x2c12c403aeb62a92bd5eabd3edcc38ab9e63bb0c93f706520bd2042894737ad1" - }, - { - "id": 6616756286038876, - "time": 1502734928623, - "status": "submitted", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x06", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 3 - }, - "rawTx": "0xf864068504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0d983a744f58179522b4bb75f6320dbcf0a699506f2470139282a2ad02e92554fa030d818c35e997ba5d004df65a0c4ebcb49d098ec7dc190d7287a72f9c96f89e7", - "hash": "0x2c12c403aeb62a92bd5eabd3edcc38ab9e63bb0c93f706520bd2042894737ad1" - }, - { - "id": 6616756286038876, - "time": 1502734928623, - "status": "confirmed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x06", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 3 - }, - "rawTx": "0xf864068504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0d983a744f58179522b4bb75f6320dbcf0a699506f2470139282a2ad02e92554fa030d818c35e997ba5d004df65a0c4ebcb49d098ec7dc190d7287a72f9c96f89e7", - "hash": "0x2c12c403aeb62a92bd5eabd3edcc38ab9e63bb0c93f706520bd2042894737ad1", - "retryCount": 5 - }, - { - "id": 6616756286038876, - "time": 1502734928623, - "status": "confirmed", - "metamaskNetworkId": "3", - "txParams": { - "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", - "value": "0x0", - "gasPrice": "0x4a817c800", - "gas": "0x7b0d", - "nonce": "0x06", - "chainId": 3 - }, - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 3 - }, - "rawTx": "0xf864068504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0d983a744f58179522b4bb75f6320dbcf0a699506f2470139282a2ad02e92554fa030d818c35e997ba5d004df65a0c4ebcb49d098ec7dc190d7287a72f9c96f89e7", - "hash": "0x2c12c403aeb62a92bd5eabd3edcc38ab9e63bb0c93f706520bd2042894737ad1", - "retryCount": 5 - } - ], - "gasLimitSpecified": false, - "estimatedGas": "5209", - "nonceDetails": { - "blockNumber": "0x16b068", - "baseCount": 3, - "baseCountHex": "0x3", - "pendingCount": 3 - }, - "rawTx": "0xf864068504a817c800827b0d943ae39e89dc7e736cce53091057a45bf44b1a566c80802aa0d983a744f58179522b4bb75f6320dbcf0a699506f2470139282a2ad02e92554fa030d818c35e997ba5d004df65a0c4ebcb49d098ec7dc190d7287a72f9c96f89e7", - "hash": "0x2c12c403aeb62a92bd5eabd3edcc38ab9e63bb0c93f706520bd2042894737ad1", - "retryCount": 5 - } - ] - } - } -} diff --git a/test/e2e/address-book.spec.js b/test/e2e/address-book.spec.js new file mode 100644 index 000000000000..85cef65de669 --- /dev/null +++ b/test/e2e/address-book.spec.js @@ -0,0 +1,245 @@ +const assert = require('assert') +const { By, until } = require('selenium-webdriver') + +const enLocaleMessages = require('../../app/_locales/en/messages.json') +const { + tinyDelayMs, + regularDelayMs, + largeDelayMs, +} = require('./helpers') +const { buildWebDriver } = require('./webdriver') +const Ganache = require('./ganache') + +const ganacheServer = new Ganache() + +describe('MetaMask', function () { + let driver + + const testSeedPhrase = 'forum vessel pink push lonely enact gentle tail admit parrot grunt dress' + + this.timeout(0) + this.bail(true) + + before(async function () { + await ganacheServer.start({ + accounts: [ + { + secretKey: '0x53CB0AB5226EEBF4D872113D98332C1555DC304443BEE1CF759D15798D3C55A9', + balance: 25000000000000000000, + }, + ], + }) + const result = await buildWebDriver() + driver = result.driver + }) + + afterEach(async function () { + if (process.env.SELENIUM_BROWSER === 'chrome') { + const errors = await driver.checkBrowserForConsoleErrors() + if (errors.length) { + const errorReports = errors.map((err) => err.message) + const errorMessage = `Errors found in browser console:\n${errorReports.join('\n')}` + console.error(new Error(errorMessage)) + } + } + if (this.currentTest.state === 'failed') { + await driver.verboseReportOnFailure(this.currentTest.title) + } + }) + + after(async function () { + await ganacheServer.quit() + await driver.quit() + }) + + describe('Going through the first time flow', function () { + it('clicks the continue button on the welcome screen', async function () { + await driver.findElement(By.css('.welcome-page__header')) + await driver.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.getStarted.message}')]`)) + await driver.delay(largeDelayMs) + }) + + it('clicks the "Create New Wallet" option', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Create a Wallet')]`)) + await driver.delay(largeDelayMs) + }) + + it('clicks the "No thanks" option on the metametrics opt-in screen', async function () { + await driver.clickElement(By.css('.btn-default')) + await driver.delay(largeDelayMs) + }) + + it('accepts a secure password', async function () { + const passwordBox = await driver.findElement(By.css('.first-time-flow__form #create-password')) + const passwordBoxConfirm = await driver.findElement(By.css('.first-time-flow__form #confirm-password')) + + await passwordBox.sendKeys('correct horse battery staple') + await passwordBoxConfirm.sendKeys('correct horse battery staple') + + await driver.clickElement(By.css('.first-time-flow__checkbox')) + await driver.clickElement(By.css('.first-time-flow__form button')) + await driver.delay(regularDelayMs) + }) + + let seedPhrase + + it('reveals the seed phrase', async function () { + const byRevealButton = By.css('.reveal-seed-phrase__secret-blocker .reveal-seed-phrase__reveal-button') + await driver.clickElement(byRevealButton) + await driver.delay(regularDelayMs) + + const revealedSeedPhrase = await driver.findElement(By.css('.reveal-seed-phrase__secret-words')) + seedPhrase = await revealedSeedPhrase.getText() + assert.equal(seedPhrase.split(' ').length, 12) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.next.message}')]`)) + await driver.delay(regularDelayMs) + }) + + async function clickWordAndWait (word) { + await driver.clickElement(By.css(`[data-testid="seed-phrase-sorted"] [data-testid="draggable-seed-${word}"]`)) + await driver.delay(tinyDelayMs) + } + + it('can retype the seed phrase', async function () { + const words = seedPhrase.split(' ') + + for (const word of words) { + await clickWordAndWait(word) + } + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Confirm')]`)) + await driver.delay(regularDelayMs) + }) + + it('clicks through the success screen', async function () { + await driver.findElement(By.xpath(`//div[contains(text(), 'Congratulations')]`)) + await driver.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.endOfFlowMessage10.message}')]`)) + await driver.delay(regularDelayMs) + }) + }) + + describe('Import seed phrase', function () { + it('logs out of the vault', async function () { + await driver.clickElement(By.css('.account-menu__icon')) + await driver.delay(regularDelayMs) + + const lockButton = await driver.findClickableElement(By.css('.account-menu__lock-button')) + assert.equal(await lockButton.getText(), 'Lock') + await lockButton.click() + await driver.delay(regularDelayMs) + }) + + it('imports seed phrase', async function () { + const restoreSeedLink = await driver.findClickableElement(By.css('.unlock-page__link--import')) + assert.equal(await restoreSeedLink.getText(), 'Import using account seed phrase') + await restoreSeedLink.click() + await driver.delay(regularDelayMs) + + const seedTextArea = await driver.findElement(By.css('textarea')) + await seedTextArea.sendKeys(testSeedPhrase) + await driver.delay(regularDelayMs) + + const passwordInputs = await driver.findElements(By.css('input')) + await driver.delay(regularDelayMs) + + await passwordInputs[0].sendKeys('correct horse battery staple') + await passwordInputs[1].sendKeys('correct horse battery staple') + await driver.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.restore.message}')]`)) + await driver.delay(regularDelayMs) + }) + + it('balance renders', async function () { + const balance = await driver.findElement(By.css('[data-testid="wallet-balance"] .list-item__heading')) + await driver.wait(until.elementTextMatches(balance, /25\s*ETH/u)) + await driver.delay(regularDelayMs) + }) + }) + + describe('Adds an entry to the address book and sends eth to that address', function () { + it('starts a send transaction', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Send')]`)) + await driver.delay(regularDelayMs) + + const inputAddress = await driver.findElement(By.css('input[placeholder="Search, public address (0x), or ENS"]')) + await inputAddress.sendKeys('0x2f318C334780961FB129D2a6c30D0763d9a5C970') + await driver.delay(regularDelayMs) + + await driver.clickElement(By.css('.dialog.send__dialog.dialog--message')) + + const addressBookAddModal = await driver.findElement(By.css('span .modal')) + await driver.findElement(By.css('.add-to-address-book-modal')) + const addressBookInput = await driver.findElement(By.css('.add-to-address-book-modal__input')) + await addressBookInput.sendKeys('Test Name 1') + await driver.delay(tinyDelayMs) + await driver.clickElement(By.css('.add-to-address-book-modal__footer .btn-primary')) + + await driver.wait(until.stalenessOf(addressBookAddModal)) + + const inputAmount = await driver.findElement(By.css('.unit-input__input')) + await inputAmount.sendKeys('1') + + const inputValue = await inputAmount.getAttribute('value') + assert.equal(inputValue, '1') + await driver.delay(regularDelayMs) + + // Continue to next screen + await driver.clickElement(By.xpath(`//button[contains(text(), 'Next')]`)) + await driver.delay(regularDelayMs) + }) + + it('confirms the transaction', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Confirm')]`)) + await driver.delay(largeDelayMs * 2) + }) + + it('finds the transaction in the transactions list', async function () { + await driver.clickElement(By.css('[data-testid="home__activity-tab"]')) + await driver.wait(async () => { + const confirmedTxes = await driver.findElements(By.css('.transaction-list__completed-transactions .transaction-list-item')) + return confirmedTxes.length === 1 + }, 10000) + + const txValues = await driver.findElement(By.css('.transaction-list-item__primary-currency')) + await driver.wait(until.elementTextMatches(txValues, /-1\s*ETH/u), 10000) + }) + }) + + describe('Sends to an address book entry', function () { + it('starts a send transaction by clicking address book entry', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Send')]`)) + await driver.delay(regularDelayMs) + + const recipientRowTitle = await driver.findElement(By.css('.send__select-recipient-wrapper__group-item__title')) + const recipientRowTitleString = await recipientRowTitle.getText() + assert.equal(recipientRowTitleString, 'Test Name 1') + + await driver.clickElement(By.css('.send__select-recipient-wrapper__group-item')) + + await driver.delay(regularDelayMs) + const inputAmount = await driver.findElement(By.css('.unit-input__input')) + await inputAmount.sendKeys('2') + await driver.delay(regularDelayMs) + + // Continue to next screen + await driver.clickElement(By.xpath(`//button[contains(text(), 'Next')]`)) + await driver.delay(regularDelayMs) + }) + + it('confirms the transaction', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Confirm')]`)) + await driver.delay(largeDelayMs * 2) + }) + + it('finds the transaction in the transactions list', async function () { + await driver.wait(async () => { + const confirmedTxes = await driver.findElements(By.css('.transaction-list__completed-transactions .transaction-list-item')) + return confirmedTxes.length === 2 + }, 10000) + + const txValues = await driver.findElement(By.css('.transaction-list-item__primary-currency')) + await driver.wait(until.elementTextMatches(txValues, /-2\s*ETH/u), 10000) + }) + }) +}) diff --git a/test/e2e/benchmark.js b/test/e2e/benchmark.js new file mode 100644 index 000000000000..d8b79a9eba2b --- /dev/null +++ b/test/e2e/benchmark.js @@ -0,0 +1,173 @@ +#!/usr/bin/env node + +const path = require('path') +const { promises: fs, constants: fsConstants } = require('fs') +const ttest = require('ttest') +const { By, Key } = require('selenium-webdriver') +const { withFixtures } = require('./helpers') +const { PAGES } = require('./webdriver/driver') + +const DEFAULT_NUM_SAMPLES = 20 +const ALL_PAGES = Object.values(PAGES) + +async function measurePage (pageName) { + let metrics + await withFixtures({ fixtures: 'imported-account' }, async ({ driver }) => { + const passwordField = await driver.findElement(By.css('#password')) + await passwordField.sendKeys('correct horse battery staple') + await passwordField.sendKeys(Key.ENTER) + await driver.findElement(By.css('.selected-account__name')) + await driver.navigate(pageName) + await driver.delay(1000) + metrics = await driver.collectMetrics() + }) + return metrics +} + +function calculateResult (calc) { + return (result) => { + const calculatedResult = {} + for (const key of Object.keys(result)) { + calculatedResult[key] = calc(result[key]) + } + return calculatedResult + } +} +const calculateSum = (array) => array.reduce((sum, val) => sum + val) +const calculateAverage = (array) => calculateSum(array) / array.length +const minResult = calculateResult((array) => Math.min(...array)) +const maxResult = calculateResult((array) => Math.max(...array)) +const averageResult = calculateResult((array) => calculateAverage(array)) +const standardDeviationResult = calculateResult((array) => { + const average = calculateAverage(array) + const squareDiffs = array.map((value) => Math.pow(value - average, 2)) + return Math.sqrt(calculateAverage(squareDiffs)) +}) +// 95% margin of error calculated using Student's t-distribution +const calculateMarginOfError = (array) => ttest(array).confidence()[1] - calculateAverage(array) +const marginOfErrorResult = calculateResult((array) => calculateMarginOfError(array)) + +async function profilePageLoad (pages, numSamples) { + const results = {} + for (const pageName of pages) { + const runResults = [] + for (let i = 0; i < numSamples; i += 1) { + runResults.push(await measurePage(pageName)) + } + + if (runResults.some((result) => result.navigation.lenth > 1)) { + throw new Error(`Multiple navigations not supported`) + } else if (runResults.some((result) => result.navigation[0].type !== 'navigate')) { + throw new Error(`Navigation type ${runResults.find((result) => result.navigation[0].type !== 'navigate').navigation[0].type} not supported`) + } + + const result = { + firstPaint: runResults.map((metrics) => metrics.paint['first-paint']), + domContentLoaded: runResults.map((metrics) => metrics.navigation[0] && metrics.navigation[0].domContentLoaded), + load: runResults.map((metrics) => metrics.navigation[0] && metrics.navigation[0].load), + domInteractive: runResults.map((metrics) => metrics.navigation[0] && metrics.navigation[0].domInteractive), + } + + results[pageName] = { + min: minResult(result), + max: maxResult(result), + average: averageResult(result), + standardDeviation: standardDeviationResult(result), + marginOfError: marginOfErrorResult(result), + } + } + return results +} + +async function isWritable (directory) { + try { + await fs.access(directory, fsConstants.W_OK) + return true + } catch (error) { + if (error.code !== 'EACCES') { + throw error + } + return false + } +} + +async function getFirstParentDirectoryThatExists (directory) { + let nextDirectory = directory + for (;;) { + try { + await fs.access(nextDirectory, fsConstants.F_OK) + return nextDirectory + } catch (error) { + if (error.code !== 'ENOENT') { + throw error + } else if (nextDirectory === path.dirname(nextDirectory)) { + throw new Error('Failed to find parent directory that exists') + } + nextDirectory = path.dirname(nextDirectory) + } + } +} + +async function main () { + const args = process.argv.slice(2) + + let pages = ['home'] + let numSamples = DEFAULT_NUM_SAMPLES + let outputPath + let outputDirectory + let existingParentDirectory + + while (args.length) { + if ((/^(--pages|-p)$/u).test(args[0])) { + if (args[1] === undefined) { + throw new Error('Missing pages argument') + } + pages = args[1].split(',') + for (const page of pages) { + if (!ALL_PAGES.includes(page)) { + throw new Error(`Invalid page: '${page}`) + } + } + args.splice(0, 2) + } else if ((/^(--samples|-s)$/u).test(args[0])) { + if (args[1] === undefined) { + throw new Error('Missing number of samples') + } + numSamples = parseInt(args[1], 10) + if (isNaN(numSamples)) { + throw new Error(`Invalid 'samples' argument given: '${args[1]}'`) + } + args.splice(0, 2) + } else if ((/^(--out|-o)$/u).test(args[0])) { + if (args[1] === undefined) { + throw new Error('Missing output filename') + } + outputPath = path.resolve(args[1]) + outputDirectory = path.dirname(outputPath) + existingParentDirectory = await getFirstParentDirectoryThatExists(outputDirectory) + if (!await isWritable(existingParentDirectory)) { + throw new Error(`Specified directory is not writable: '${args[1]}'`) + } + args.splice(0, 2) + } else { + throw new Error(`Unrecognized argument: '${args[0]}'`) + } + } + + const results = await profilePageLoad(pages, numSamples) + + if (outputPath) { + if (outputDirectory !== existingParentDirectory) { + await fs.mkdir(outputDirectory, { recursive: true }) + } + await fs.writeFile(outputPath, JSON.stringify(results, null, 2)) + } else { + console.log(JSON.stringify(results, null, 2)) + } +} + +main() + .catch((e) => { + console.error(e) + process.exit(1) + }) diff --git a/test/e2e/beta/contract-test/contract.js b/test/e2e/beta/contract-test/contract.js deleted file mode 100644 index 3f22b442ae96..000000000000 --- a/test/e2e/beta/contract-test/contract.js +++ /dev/null @@ -1,167 +0,0 @@ -/* -The `piggybankContract` is compiled from: - - pragma solidity ^0.4.0; - contract PiggyBank { - - uint private balance; - address public owner; - - function PiggyBank() public { - owner = msg.sender; - balance = 0; - } - - function deposit() public payable returns (uint) { - balance += msg.value; - return balance; - } - - function withdraw(uint withdrawAmount) public returns (uint remainingBal) { - require(msg.sender == owner); - balance -= withdrawAmount; - - msg.sender.transfer(withdrawAmount); - - return balance; - } - } -*/ - -web3.currentProvider.enable().then(() => { - var piggybankContract = web3.eth.contract([{'constant': false, 'inputs': [{'name': 'withdrawAmount', 'type': 'uint256'}], 'name': 'withdraw', 'outputs': [{'name': 'remainingBal', 'type': 'uint256'}], 'payable': false, 'stateMutability': 'nonpayable', 'type': 'function'}, {'constant': true, 'inputs': [], 'name': 'owner', 'outputs': [{'name': '', 'type': 'address'}], 'payable': false, 'stateMutability': 'view', 'type': 'function'}, {'constant': false, 'inputs': [], 'name': 'deposit', 'outputs': [{'name': '', 'type': 'uint256'}], 'payable': true, 'stateMutability': 'payable', 'type': 'function'}, {'inputs': [], 'payable': false, 'stateMutability': 'nonpayable', 'type': 'constructor'}]) - const deployButton = document.getElementById('deployButton') - const depositButton = document.getElementById('depositButton') - const withdrawButton = document.getElementById('withdrawButton') - const sendButton = document.getElementById('sendButton') - const createToken = document.getElementById('createToken') - const transferTokens = document.getElementById('transferTokens') - const approveTokens = document.getElementById('approveTokens') - const transferTokensWithoutGas = document.getElementById('transferTokensWithoutGas') - const approveTokensWithoutGas = document.getElementById('approveTokensWithoutGas') - - deployButton.addEventListener('click', async function () { - document.getElementById('contractStatus').innerHTML = 'Deploying' - - var piggybank = await piggybankContract.new( - { - from: web3.eth.accounts[0], - data: '0x608060405234801561001057600080fd5b5033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000808190555061023b806100686000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632e1a7d4d1461005c5780638da5cb5b1461009d578063d0e30db0146100f4575b600080fd5b34801561006857600080fd5b5061008760048036038101908080359060200190929190505050610112565b6040518082815260200191505060405180910390f35b3480156100a957600080fd5b506100b26101d0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100fc6101f6565b6040518082815260200191505060405180910390f35b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561017057600080fd5b8160008082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156101c5573d6000803e3d6000fd5b506000549050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003460008082825401925050819055506000549050905600a165627a7a72305820f237db3ec816a52589d82512117bc85bc08d3537683ffeff9059108caf3e5d400029', - gas: '4700000', - }, function (e, contract) { - if (e) { - throw e - } - if (typeof contract.address !== 'undefined') { - console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash) - - document.getElementById('contractStatus').innerHTML = 'Deployed' - - depositButton.addEventListener('click', function () { - document.getElementById('contractStatus').innerHTML = 'Deposit initiated' - contract.deposit({ from: web3.eth.accounts[0], value: '0x3782dace9d900000' }, function (result) { - console.log(result) - document.getElementById('contractStatus').innerHTML = 'Deposit completed' - }) - }) - - withdrawButton.addEventListener('click', function () { - contract.withdraw('0xde0b6b3a7640000', { from: web3.eth.accounts[0] }, function (result) { - console.log(result) - document.getElementById('contractStatus').innerHTML = 'Withdrawn' - }) - }) - } - }) - - console.log(piggybank) - }) - - sendButton.addEventListener('click', function () { - web3.eth.sendTransaction({ - from: web3.eth.accounts[0], - to: '0x2f318C334780961FB129D2a6c30D0763d9a5C970', - value: '0x29a2241af62c0000', - gas: 21000, - gasPrice: 20000000000, - }, (result) => { - console.log(result) - }) - }) - - - createToken.addEventListener('click', async function () { - var _initialAmount = 100 - var _tokenName = 'TST' - var _decimalUnits = 0 - var _tokenSymbol = 'TST' - var humanstandardtokenContract = web3.eth.contract([{'constant': true, 'inputs': [], 'name': 'name', 'outputs': [{'name': '', 'type': 'string'}], 'payable': false, 'stateMutability': 'view', 'type': 'function'}, {'constant': false, 'inputs': [{'name': '_spender', 'type': 'address'}, {'name': '_value', 'type': 'uint256'}], 'name': 'approve', 'outputs': [{'name': 'success', 'type': 'bool'}], 'payable': false, 'stateMutability': 'nonpayable', 'type': 'function'}, {'constant': true, 'inputs': [], 'name': 'totalSupply', 'outputs': [{'name': '', 'type': 'uint256'}], 'payable': false, 'stateMutability': 'view', 'type': 'function'}, {'constant': false, 'inputs': [{'name': '_from', 'type': 'address'}, {'name': '_to', 'type': 'address'}, {'name': '_value', 'type': 'uint256'}], 'name': 'transferFrom', 'outputs': [{'name': 'success', 'type': 'bool'}], 'payable': false, 'stateMutability': 'nonpayable', 'type': 'function'}, {'constant': true, 'inputs': [], 'name': 'decimals', 'outputs': [{'name': '', 'type': 'uint8'}], 'payable': false, 'stateMutability': 'view', 'type': 'function'}, {'constant': true, 'inputs': [], 'name': 'version', 'outputs': [{'name': '', 'type': 'string'}], 'payable': false, 'stateMutability': 'view', 'type': 'function'}, {'constant': true, 'inputs': [{'name': '_owner', 'type': 'address'}], 'name': 'balanceOf', 'outputs': [{'name': 'balance', 'type': 'uint256'}], 'payable': false, 'stateMutability': 'view', 'type': 'function'}, {'constant': true, 'inputs': [], 'name': 'symbol', 'outputs': [{'name': '', 'type': 'string'}], 'payable': false, 'stateMutability': 'view', 'type': 'function'}, {'constant': false, 'inputs': [{'name': '_to', 'type': 'address'}, {'name': '_value', 'type': 'uint256'}], 'name': 'transfer', 'outputs': [{'name': 'success', 'type': 'bool'}], 'payable': false, 'stateMutability': 'nonpayable', 'type': 'function'}, {'constant': false, 'inputs': [{'name': '_spender', 'type': 'address'}, {'name': '_value', 'type': 'uint256'}, {'name': '_extraData', 'type': 'bytes'}], 'name': 'approveAndCall', 'outputs': [{'name': 'success', 'type': 'bool'}], 'payable': false, 'stateMutability': 'nonpayable', 'type': 'function'}, {'constant': true, 'inputs': [{'name': '_owner', 'type': 'address'}, {'name': '_spender', 'type': 'address'}], 'name': 'allowance', 'outputs': [{'name': 'remaining', 'type': 'uint256'}], 'payable': false, 'stateMutability': 'view', 'type': 'function'}, {'inputs': [{'name': '_initialAmount', 'type': 'uint256'}, {'name': '_tokenName', 'type': 'string'}, {'name': '_decimalUnits', 'type': 'uint8'}, {'name': '_tokenSymbol', 'type': 'string'}], 'payable': false, 'stateMutability': 'nonpayable', 'type': 'constructor'}, {'payable': false, 'stateMutability': 'nonpayable', 'type': 'fallback'}, {'anonymous': false, 'inputs': [{'indexed': true, 'name': '_from', 'type': 'address'}, {'indexed': true, 'name': '_to', 'type': 'address'}, {'indexed': false, 'name': '_value', 'type': 'uint256'}], 'name': 'Transfer', 'type': 'event'}, {'anonymous': false, 'inputs': [{'indexed': true, 'name': '_owner', 'type': 'address'}, {'indexed': true, 'name': '_spender', 'type': 'address'}, {'indexed': false, 'name': '_value', 'type': 'uint256'}], 'name': 'Approval', 'type': 'event'}]) - return humanstandardtokenContract.new( - _initialAmount, - _tokenName, - _decimalUnits, - _tokenSymbol, - { - from: web3.eth.accounts[0], - data: '0x60806040523480156200001157600080fd5b506040516200156638038062001566833981018060405260808110156200003757600080fd5b8101908080516401000000008111156200005057600080fd5b828101905060208101848111156200006757600080fd5b81518560018202830111640100000000821117156200008557600080fd5b50509291906020018051640100000000811115620000a257600080fd5b82810190506020810184811115620000b957600080fd5b8151856001820283011164010000000082111715620000d757600080fd5b5050929190602001805190602001909291908051906020019092919050505083838382600390805190602001906200011192919062000305565b5081600490805190602001906200012a92919062000305565b5080600560006101000a81548160ff021916908360ff1602179055505050506200016433826200016e640100000000026401000000009004565b50505050620003b4565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515620001ab57600080fd5b620001d081600254620002e36401000000000262001155179091906401000000009004565b60028190555062000237816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620002e36401000000000262001155179091906401000000009004565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000808284019050838110151515620002fb57600080fd5b8091505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200034857805160ff191683800117855562000379565b8280016001018555821562000379579182015b82811115620003785782518255916020019190600101906200035b565b5b5090506200038891906200038c565b5090565b620003b191905b80821115620003ad57600081600090555060010162000393565b5090565b90565b6111a280620003c46000396000f3fe6080604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b4578063095ea7b31461014457806318160ddd146101b757806323b872dd146101e2578063313ce5671461027557806339509351146102a657806370a082311461031957806395d89b411461037e578063a457c2d71461040e578063a9059cbb14610481578063dd62ed3e146104f4575b600080fd5b3480156100c057600080fd5b506100c9610579565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101095780820151818401526020810190506100ee565b50505050905090810190601f1680156101365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015057600080fd5b5061019d6004803603604081101561016757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061061b565b604051808215151515815260200191505060405180910390f35b3480156101c357600080fd5b506101cc610748565b6040518082815260200191505060405180910390f35b3480156101ee57600080fd5b5061025b6004803603606081101561020557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610752565b604051808215151515815260200191505060405180910390f35b34801561028157600080fd5b5061028a61095a565b604051808260ff1660ff16815260200191505060405180910390f35b3480156102b257600080fd5b506102ff600480360360408110156102c957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610971565b604051808215151515815260200191505060405180910390f35b34801561032557600080fd5b506103686004803603602081101561033c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ba8565b6040518082815260200191505060405180910390f35b34801561038a57600080fd5b50610393610bf0565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103d35780820151818401526020810190506103b8565b50505050905090810190601f1680156104005780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561041a57600080fd5b506104676004803603604081101561043157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c92565b604051808215151515815260200191505060405180910390f35b34801561048d57600080fd5b506104da600480360360408110156104a457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610ec9565b604051808215151515815260200191505060405180910390f35b34801561050057600080fd5b506105636004803603604081101561051757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ee0565b6040518082815260200191505060405180910390f35b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106115780601f106105e657610100808354040283529160200191610611565b820191906000526020600020905b8154815290600101906020018083116105f457829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561065857600080fd5b81600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600254905090565b60006107e382600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f6790919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061086e848484610f89565b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600190509392505050565b6000600560009054906101000a900460ff16905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156109ae57600080fd5b610a3d82600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461115590919063ffffffff16565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c885780601f10610c5d57610100808354040283529160200191610c88565b820191906000526020600020905b815481529060010190602001808311610c6b57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610ccf57600080fd5b610d5e82600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f6790919063ffffffff16565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000610ed6338484610f89565b6001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000828211151515610f7857600080fd5b600082840390508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610fc557600080fd5b611016816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f6790919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506110a9816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461115590919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b600080828401905083811015151561116c57600080fd5b809150509291505056fea165627a7a723058205fcdfea06f4d97b442bc9f444b1e92524bc66398eb4f37ed5a99f2093a8842640029000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000186a00000000000000000000000000000000000000000000000000000000000000003545354000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035453540000000000000000000000000000000000000000000000000000000000', - gas: '4700000', - gasPrice: '20000000000', - }, function (e, contract) { - console.log(e, contract) - if (typeof contract.address !== 'undefined') { - console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash) - - document.getElementById('tokenAddress').innerHTML = contract.address - - transferTokens.addEventListener('click', function (event) { - console.log(`event`, event) - contract.transfer('0x2f318C334780961FB129D2a6c30D0763d9a5C970', '15000', { - from: web3.eth.accounts[0], - to: contract.address, - data: '0xa9059cbb0000000000000000000000002f318c334780961fb129d2a6c30d0763d9a5c9700000000000000000000000000000000000000000000000000000000000003a98', - gas: 60000, - gasPrice: '20000000000', - }, function (result) { - console.log('result', result) - }) - }) - - approveTokens.addEventListener('click', function () { - contract.approve('0x2f318C334780961FB129D2a6c30D0763d9a5C970', '70000', { - from: web3.eth.accounts[0], - to: contract.address, - data: '0x095ea7b30000000000000000000000002f318C334780961FB129D2a6c30D0763d9a5C9700000000000000000000000000000000000000000000000000000000000000005', - gas: 60000, - gasPrice: '20000000000', - }, function (result) { - console.log(result) - }) - }) - - transferTokensWithoutGas.addEventListener('click', function (event) { - console.log(`event`, event) - contract.transfer('0x2f318C334780961FB129D2a6c30D0763d9a5C970', '15000', { - from: web3.eth.accounts[0], - to: contract.address, - data: '0xa9059cbb0000000000000000000000002f318c334780961fb129d2a6c30d0763d9a5c9700000000000000000000000000000000000000000000000000000000000003a98', - gasPrice: '20000000000', - }, function (result) { - console.log('result', result) - }) - }) - - approveTokensWithoutGas.addEventListener('click', function () { - contract.approve('0x2f318C334780961FB129D2a6c30D0763d9a5C970', '70000', { - from: web3.eth.accounts[0], - to: contract.address, - data: '0x095ea7b30000000000000000000000002f318C334780961FB129D2a6c30D0763d9a5C9700000000000000000000000000000000000000000000000000000000000000005', - gasPrice: '20000000000', - }, function (result) { - console.log(result) - }) - }) - } - }) - - }) -}) diff --git a/test/e2e/beta/contract-test/index.html b/test/e2e/beta/contract-test/index.html deleted file mode 100644 index 6e134dc36bfd..000000000000 --- a/test/e2e/beta/contract-test/index.html +++ /dev/null @@ -1,38 +0,0 @@ - - - E2E Test Dapp - - -
-
Contract
-
- - - -
-
- Not clicked -
-
-
-
Send eth
-
- -
-
-
-
Send tokens
-
-
- - - - - -
-
- - - - - \ No newline at end of file diff --git a/test/e2e/beta/drizzle.spec.js b/test/e2e/beta/drizzle.spec.js deleted file mode 100644 index 309df952c26f..000000000000 --- a/test/e2e/beta/drizzle.spec.js +++ /dev/null @@ -1,286 +0,0 @@ -const path = require('path') -const assert = require('assert') -const webdriver = require('selenium-webdriver') -const { By, until } = webdriver -const { - delay, - buildChromeWebDriver, - buildFirefoxWebdriver, - installWebExt, - getExtensionIdChrome, - getExtensionIdFirefox, -} = require('../func') -const { - checkBrowserForConsoleErrors, - closeAllWindowHandlesExcept, - findElement, - findElements, - loadExtension, - openNewPage, - verboseReportOnFailure, - waitUntilXWindowHandles, - switchToWindowWithTitle, -} = require('./helpers') - -describe('MetaMask', function () { - let extensionId - let driver - - const tinyDelayMs = 200 - const regularDelayMs = tinyDelayMs * 2 - const largeDelayMs = regularDelayMs * 2 - - this.timeout(0) - this.bail(true) - - before(async function () { - switch (process.env.SELENIUM_BROWSER) { - case 'chrome': { - const extPath = path.resolve('dist/chrome') - driver = buildChromeWebDriver(extPath) - extensionId = await getExtensionIdChrome(driver) - await driver.get(`chrome-extension://${extensionId}/popup.html`) - break - } - case 'firefox': { - const extPath = path.resolve('dist/firefox') - driver = buildFirefoxWebdriver() - await installWebExt(driver, extPath) - await delay(700) - extensionId = await getExtensionIdFirefox(driver) - await driver.get(`moz-extension://${extensionId}/popup.html`) - } - } - }) - - afterEach(async function () { - if (process.env.SELENIUM_BROWSER === 'chrome') { - const errors = await checkBrowserForConsoleErrors(driver) - if (errors.length) { - const errorReports = errors.map(err => err.message) - const errorMessage = `Errors found in browser console:\n${errorReports.join('\n')}` - console.error(new Error(errorMessage)) - } - } - if (this.currentTest.state === 'failed') { - await verboseReportOnFailure(driver, this.currentTest) - } - }) - - after(async function () { - await driver.quit() - }) - - - describe('New UI setup', async function () { - it('switches to first tab', async function () { - await delay(tinyDelayMs) - const [firstTab] = await driver.getAllWindowHandles() - await driver.switchTo().window(firstTab) - await delay(regularDelayMs) - }) - - it('selects the new UI option', async () => { - // Close all other tabs - const [tab0, tab1, tab2] = await driver.getAllWindowHandles() - await driver.switchTo().window(tab0) - await delay(tinyDelayMs) - - let selectedUrl = await driver.getCurrentUrl() - await delay(tinyDelayMs) - if (tab0 && selectedUrl.match(/popup.html/)) { - await closeAllWindowHandlesExcept(driver, tab0) - } else if (tab1) { - await driver.switchTo().window(tab1) - selectedUrl = await driver.getCurrentUrl() - await delay(tinyDelayMs) - if (selectedUrl.match(/popup.html/)) { - await closeAllWindowHandlesExcept(driver, tab1) - } else if (tab2) { - await driver.switchTo().window(tab2) - selectedUrl = await driver.getCurrentUrl() - selectedUrl.match(/popup.html/) && await closeAllWindowHandlesExcept(driver, tab2) - } - } else { - throw new Error('popup.html not found') - } - await delay(regularDelayMs) - const [appTab] = await driver.getAllWindowHandles() - await driver.switchTo().window(appTab) - await delay(tinyDelayMs) - - await loadExtension(driver, extensionId) - await delay(regularDelayMs) - - const continueBtn = await findElement(driver, By.css('.first-time-flow__button')) - await continueBtn.click() - await delay(regularDelayMs) - }) - }) - - describe('Going through the first time flow', () => { - it('accepts a secure password', async () => { - const passwordBox = await findElement(driver, By.css('.first-time-flow__form #create-password')) - const passwordBoxConfirm = await findElement(driver, By.css('.first-time-flow__form #confirm-password')) - const button = await findElement(driver, By.css('.first-time-flow__form button')) - - await passwordBox.sendKeys('correct horse battery staple') - await passwordBoxConfirm.sendKeys('correct horse battery staple') - await button.click() - await delay(regularDelayMs) - }) - - it('clicks through the unique image screen', async () => { - await findElement(driver, By.css('.first-time-flow__unique-image')) - const nextScreen = await findElement(driver, By.css('button.first-time-flow__button')) - await nextScreen.click() - await delay(regularDelayMs) - }) - - it('clicks through the ToS', async () => { - // terms of use - await findElement(driver, By.css('.first-time-flow__markdown')) - const canClickThrough = await driver.findElement(By.css('button.first-time-flow__button')).isEnabled() - assert.equal(canClickThrough, false, 'disabled continue button') - const bottomOfTos = await findElement(driver, By.linkText('Attributions')) - await driver.executeScript('arguments[0].scrollIntoView(true)', bottomOfTos) - await delay(regularDelayMs) - const acceptTos = await findElement(driver, By.css('button.first-time-flow__button')) - driver.wait(until.elementIsEnabled(acceptTos)) - await acceptTos.click() - await delay(regularDelayMs) - }) - - it('clicks through the privacy notice', async () => { - // privacy notice - const nextScreen = await findElement(driver, By.css('button.first-time-flow__button')) - await nextScreen.click() - await delay(regularDelayMs) - }) - - it('clicks through the phishing notice', async () => { - // phishing notice - const noticeElement = await driver.findElement(By.css('.first-time-flow__markdown')) - await driver.executeScript('arguments[0].scrollTop = arguments[0].scrollHeight', noticeElement) - await delay(regularDelayMs) - const nextScreen = await findElement(driver, By.css('button.first-time-flow__button')) - await nextScreen.click() - await delay(regularDelayMs) - }) - - let seedPhrase - - it('reveals the seed phrase', async () => { - const byRevealButton = By.css('.reveal-seed-phrase__secret-blocker .reveal-seed-phrase__reveal-button') - await driver.wait(until.elementLocated(byRevealButton, 10000)) - const revealSeedPhraseButton = await findElement(driver, byRevealButton, 10000) - await revealSeedPhraseButton.click() - await delay(regularDelayMs) - - seedPhrase = await driver.findElement(By.css('.reveal-seed-phrase__secret-words')).getText() - assert.equal(seedPhrase.split(' ').length, 12) - await delay(regularDelayMs) - - const nextScreen = await findElement(driver, By.css('button.first-time-flow__button')) - await nextScreen.click() - await delay(regularDelayMs) - }) - - async function clickWordAndWait (word) { - const xpath = `//div[contains(@class, 'confirm-seed-phrase__seed-word--shuffled') and not(contains(@class, 'confirm-seed-phrase__seed-word--selected')) and contains(text(), '${word}')]` - const word0 = await findElement(driver, By.xpath(xpath), 10000) - - await word0.click() - await delay(tinyDelayMs) - } - - async function retypeSeedPhrase (words, wasReloaded, count = 0) { - try { - if (wasReloaded) { - const byRevealButton = By.css('.reveal-seed-phrase__secret-blocker .reveal-seed-phrase__reveal-button') - await driver.wait(until.elementLocated(byRevealButton, 10000)) - const revealSeedPhraseButton = await findElement(driver, byRevealButton, 10000) - await revealSeedPhraseButton.click() - await delay(regularDelayMs) - - const nextScreen = await findElement(driver, By.css('button.first-time-flow__button')) - await nextScreen.click() - await delay(regularDelayMs) - } - - for (let i = 0; i < 12; i++) { - await clickWordAndWait(words[i]) - } - } catch (e) { - if (count > 2) { - throw e - } else { - await loadExtension(driver, extensionId) - await retypeSeedPhrase(words, true, count + 1) - } - } - } - - it('can retype the seed phrase', async () => { - const words = seedPhrase.split(' ') - - await retypeSeedPhrase(words) - - const confirm = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`)) - await confirm.click() - await delay(regularDelayMs) - }) - - it('clicks through the deposit modal', async () => { - const byBuyModal = By.css('span .modal') - const buyModal = await driver.wait(until.elementLocated(byBuyModal)) - const closeModal = await findElement(driver, By.css('.page-container__header-close')) - await closeModal.click() - await driver.wait(until.stalenessOf(buyModal)) - await delay(regularDelayMs) - }) - - it('switches to localhost', async () => { - const networkDropdown = await findElement(driver, By.css('.network-name')) - await networkDropdown.click() - await delay(regularDelayMs) - - const [localhost] = await findElements(driver, By.xpath(`//span[contains(text(), 'Localhost')]`)) - await localhost.click() - await delay(largeDelayMs * 2) - }) - }) - - describe('Drizzle', () => { - let windowHandles - let extension - let popup - let dapp - - it('should be able to connect the account', async () => { - await openNewPage(driver, 'http://127.0.0.1:3000/') - await delay(regularDelayMs) - - await waitUntilXWindowHandles(driver, 3) - windowHandles = await driver.getAllWindowHandles() - - extension = windowHandles[0] - popup = await switchToWindowWithTitle(driver, 'MetaMask Notification', windowHandles) - dapp = windowHandles.find(handle => handle !== extension && handle !== popup) - - await delay(regularDelayMs) - const approveButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Connect')]`)) - await approveButton.click() - }) - - it('should be able to detect our eth address', async () => { - // Check if address exposed - await driver.switchTo().window(dapp) - await delay(regularDelayMs) - - const addressElement = await findElement(driver, By.css(`.pure-u-1-1 h4`)) - const addressText = await addressElement.getText() - assert(addressText.match(/^0x[a-fA-F0-9]{40}$/)) - }) - }) -}) diff --git a/test/e2e/beta/fetch-mocks.js b/test/e2e/beta/fetch-mocks.js deleted file mode 100644 index 6b885cc10130..000000000000 --- a/test/e2e/beta/fetch-mocks.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - ethGasBasic: JSON.stringify({'average': 85.0, 'fastestWait': 0.6, 'fastWait': 0.6, 'fast': 200.0, 'safeLowWait': 4.8, 'blockNum': 6648312, 'avgWait': 4.2, 'block_time': 15.516129032258064, 'speed': 0.7828720873342716, 'fastest': 400.0, 'safeLow': 80.0}), - ethGasPredictTable: JSON.stringify([{'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 7.2632423756, 'pct_remaining5m': 0.0, 'sum': 7.029975, 'tx_atabove': 4136.0, 'hashpower_accepting': 10.4166666667, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 1.2, 'pct_mined_5m': 0.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 7.433788122, 'pct_remaining5m': 0.0, 'sum': 7.01731875, 'tx_atabove': 4136.0, 'hashpower_accepting': 10.9375, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 1.5, 'pct_mined_5m': 0.0, 'total_seen_5m': 84.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 7.433788122, 'pct_remaining5m': 0.0, 'sum': 7.01731875, 'tx_atabove': 4136.0, 'hashpower_accepting': 10.9375, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 1.7, 'pct_mined_5m': 0.0, 'total_seen_5m': 5.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 7.4638844302, 'pct_remaining5m': 0.0, 'sum': 7.01731875, 'tx_atabove': 4136.0, 'hashpower_accepting': 10.9375, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 1.8, 'pct_mined_5m': 0.0, 'total_seen_5m': 20.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 7.4839486356, 'pct_remaining5m': 0.0, 'sum': 7.01731875, 'tx_atabove': 4136.0, 'hashpower_accepting': 10.9375, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 1.9, 'pct_mined_5m': 0.0, 'total_seen_5m': 8.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 7.7347512039, 'pct_remaining5m': 0.0, 'sum': 7.0046625, 'tx_atabove': 4136.0, 'hashpower_accepting': 11.4583333333, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 2.0, 'pct_mined_5m': 0.0, 'total_seen_5m': 52.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 17.0, 'hashpower_accepting2': 7.7447833066, 'pct_remaining5m': 1.0, 'sum': 7.0046625, 'tx_atabove': 4136.0, 'hashpower_accepting': 11.4583333333, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 2.1, 'pct_mined_5m': 0.0, 'total_seen_5m': 97.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 20.0, 'hashpower_accepting2': 7.7447833066, 'pct_remaining5m': 1.0, 'sum': 7.0040625, 'tx_atabove': 4135.0, 'hashpower_accepting': 11.4583333333, 'hpa_coef2': -0.067, 'total_seen_30m': 6.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 2.2, 'pct_mined_5m': 0.0, 'total_seen_5m': 433.0, 'pct_mined_30m': 0.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 68.0, 'hashpower_accepting2': 7.7447833066, 'pct_remaining5m': 0.0, 'sum': 6.9986625, 'tx_atabove': 4126.0, 'hashpower_accepting': 11.4583333333, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 50.0, 'gasprice': 2.3, 'pct_mined_5m': 0.0, 'total_seen_5m': 14.0, 'pct_mined_30m': 0.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 7.7447833066, 'pct_remaining5m': 0.0, 'sum': 6.9980625, 'tx_atabove': 4125.0, 'hashpower_accepting': 11.4583333333, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 2.4, 'pct_mined_5m': 0.0, 'total_seen_5m': 4.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 20.0, 'hashpower_accepting2': 7.7447833066, 'pct_remaining5m': 37.0, 'sum': 6.9956625, 'tx_atabove': 4121.0, 'hashpower_accepting': 11.4583333333, 'hpa_coef2': -0.067, 'total_seen_30m': 4.0, 'int2': 6.9238, 'pct_remaining30m': 75.0, 'gasprice': 2.5, 'pct_mined_5m': 0.0, 'total_seen_5m': 45.0, 'pct_mined_30m': 0.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 79.0, 'hashpower_accepting2': 7.7447833066, 'pct_remaining5m': 0.0, 'sum': 6.9788625, 'tx_atabove': 4093.0, 'hashpower_accepting': 11.4583333333, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 100.0, 'gasprice': 2.6, 'pct_mined_5m': 0.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 0.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 27.5, 'hashpower_accepting2': 7.7447833066, 'pct_remaining5m': 100.0, 'sum': 6.9764625, 'tx_atabove': 4089.0, 'hashpower_accepting': 11.4583333333, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 2.7, 'pct_mined_5m': 0.0, 'total_seen_5m': 3.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 22.5, 'hashpower_accepting2': 7.7447833066, 'pct_remaining5m': 66.0, 'sum': 6.9740625, 'tx_atabove': 4085.0, 'hashpower_accepting': 11.4583333333, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 2.8, 'pct_mined_5m': 0.0, 'total_seen_5m': 6.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 20.0, 'hashpower_accepting2': 7.7548154093, 'pct_remaining5m': 38.0, 'sum': 6.9686625, 'tx_atabove': 4076.0, 'hashpower_accepting': 11.4583333333, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 2.9, 'pct_mined_5m': 2.0, 'total_seen_5m': 36.0, 'pct_mined_30m': 0.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 27.0, 'hashpower_accepting2': 11.5268860353, 'pct_remaining5m': 77.0, 'sum': 6.8307, 'tx_atabove': 4057.0, 'hashpower_accepting': 16.6666666667, 'hpa_coef2': -0.067, 'total_seen_30m': 127.0, 'int2': 6.9238, 'pct_remaining30m': 48.0, 'gasprice': 3.0, 'pct_mined_5m': 0.0, 'total_seen_5m': 322.0, 'pct_mined_30m': 39.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 67.0, 'hashpower_accepting2': 11.5268860353, 'pct_remaining5m': 100.0, 'sum': 6.5697, 'tx_atabove': 3622.0, 'hashpower_accepting': 16.6666666667, 'hpa_coef2': -0.067, 'total_seen_30m': 85.0, 'int2': 6.9238, 'pct_remaining30m': 98.0, 'gasprice': 3.1, 'pct_mined_5m': 0.0, 'total_seen_5m': 79.0, 'pct_mined_30m': 0.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 71.0, 'hashpower_accepting2': 11.5268860353, 'pct_remaining5m': 100.0, 'sum': 6.4311, 'tx_atabove': 3391.0, 'hashpower_accepting': 16.6666666667, 'hpa_coef2': -0.067, 'total_seen_30m': 7.0, 'int2': 6.9238, 'pct_remaining30m': 100.0, 'gasprice': 3.2, 'pct_mined_5m': 0.0, 'total_seen_5m': 4.0, 'pct_mined_30m': 0.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 62.0, 'hashpower_accepting2': 11.5268860353, 'pct_remaining5m': 100.0, 'sum': 6.4209, 'tx_atabove': 3374.0, 'hashpower_accepting': 16.6666666667, 'hpa_coef2': -0.067, 'total_seen_30m': 14.0, 'int2': 6.9238, 'pct_remaining30m': 92.0, 'gasprice': 3.3, 'pct_mined_5m': 0.0, 'total_seen_5m': 7.0, 'pct_mined_30m': 0.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1472.0, 'hashpower_accepting2': 11.5569823435, 'pct_remaining5m': 100.0, 'sum': 6.3951, 'tx_atabove': 3331.0, 'hashpower_accepting': 16.6666666667, 'hpa_coef2': -0.067, 'total_seen_30m': 29.0, 'int2': 6.9238, 'pct_remaining30m': 100.0, 'gasprice': 3.4, 'pct_mined_5m': 0.0, 'total_seen_5m': 27.0, 'pct_mined_30m': 0.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 307.0, 'hashpower_accepting2': 11.5670144462, 'pct_remaining5m': 100.0, 'sum': 6.1521, 'tx_atabove': 2926.0, 'hashpower_accepting': 16.6666666667, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 3.7, 'pct_mined_5m': 0.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1399.0, 'hashpower_accepting2': 11.577046549, 'pct_remaining5m': 100.0, 'sum': 6.1395, 'tx_atabove': 2905.0, 'hashpower_accepting': 16.6666666667, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 3.9, 'pct_mined_5m': 0.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1005.0, 'hashpower_accepting2': 11.5971107544, 'pct_remaining5m': 88.0, 'sum': 6.1035, 'tx_atabove': 2845.0, 'hashpower_accepting': 16.6666666667, 'hpa_coef2': -0.067, 'total_seen_30m': 9.0, 'int2': 6.9238, 'pct_remaining30m': 88.0, 'gasprice': 4.0, 'pct_mined_5m': 0.0, 'total_seen_5m': 9.0, 'pct_mined_30m': 0.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1546.0, 'hashpower_accepting2': 11.6171749599, 'pct_remaining5m': null, 'sum': 5.6151, 'tx_atabove': 2031.0, 'hashpower_accepting': 16.6666666667, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 100.0, 'gasprice': 4.1, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 0.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1065.0, 'hashpower_accepting2': 11.6171749599, 'pct_remaining5m': 100.0, 'sum': 5.5509, 'tx_atabove': 1924.0, 'hashpower_accepting': 16.6666666667, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 4.3, 'pct_mined_5m': 0.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 459.0, 'hashpower_accepting2': 11.6171749599, 'pct_remaining5m': 50.0, 'sum': 5.5137, 'tx_atabove': 1862.0, 'hashpower_accepting': 16.6666666667, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 4.4, 'pct_mined_5m': 0.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 298.0, 'hashpower_accepting2': 11.6171749599, 'pct_remaining5m': null, 'sum': 5.4903, 'tx_atabove': 1823.0, 'hashpower_accepting': 16.6666666667, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 100.0, 'gasprice': 4.7, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 0.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 812.0, 'hashpower_accepting2': 11.6472712681, 'pct_remaining5m': 0.0, 'sum': 5.4831, 'tx_atabove': 1811.0, 'hashpower_accepting': 16.6666666667, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 100.0, 'gasprice': 4.8, 'pct_mined_5m': 0.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 0.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 541.0, 'hashpower_accepting2': 11.6472712681, 'pct_remaining5m': 100.0, 'sum': 5.4375, 'tx_atabove': 1735.0, 'hashpower_accepting': 16.6666666667, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 4.9, 'pct_mined_5m': 0.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1134.0, 'hashpower_accepting2': 11.7375601926, 'pct_remaining5m': 100.0, 'sum': 5.41824375, 'tx_atabove': 1724.0, 'hashpower_accepting': 17.1875, 'hpa_coef2': -0.067, 'total_seen_30m': 6.0, 'int2': 6.9238, 'pct_remaining30m': 100.0, 'gasprice': 5.0, 'pct_mined_5m': 0.0, 'total_seen_5m': 5.0, 'pct_mined_30m': 0.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1958.0, 'hashpower_accepting2': 11.7676565008, 'pct_remaining5m': null, 'sum': 4.9567875, 'tx_atabove': 976.0, 'hashpower_accepting': 17.7083333333, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 100.0, 'gasprice': 5.2, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 0.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1203.5, 'hashpower_accepting2': 11.8077849117, 'pct_remaining5m': null, 'sum': 4.9507875, 'tx_atabove': 966.0, 'hashpower_accepting': 17.7083333333, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 100.0, 'gasprice': 5.3, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 0.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 677.5, 'hashpower_accepting2': 11.8378812199, 'pct_remaining5m': null, 'sum': 4.9141875, 'tx_atabove': 905.0, 'hashpower_accepting': 17.7083333333, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 100.0, 'gasprice': 5.5, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 0.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 250.99, 'avgdiff': 0, 'expectedWait': 1000.0, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 3.0, 'hashpower_accepting2': 13.3928571429, 'pct_remaining5m': 0.0, 'sum': 3.16120625, 'tx_atabove': 832.0, 'hashpower_accepting': 20.3125, 'hpa_coef2': -0.067, 'total_seen_30m': 9.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 6.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 12.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 5.92, 'avgdiff': 1, 'expectedWait': 23.5990451154, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 14.0248796148, 'pct_remaining5m': 0.0, 'sum': 3.10120625, 'tx_atabove': 732.0, 'hashpower_accepting': 20.3125, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 6.1, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 5.58, 'avgdiff': 1, 'expectedWait': 22.2247437161, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 14.1753611557, 'pct_remaining5m': 0.0, 'sum': 3.09640625, 'tx_atabove': 724.0, 'hashpower_accepting': 20.3125, 'hpa_coef2': -0.067, 'total_seen_30m': 3.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 6.2, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 5.55, 'avgdiff': 1, 'expectedWait': 22.1183205662, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 14.3459069021, 'pct_remaining5m': 0.0, 'sum': 3.09580625, 'tx_atabove': 723.0, 'hashpower_accepting': 20.3125, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 6.3, 'pct_mined_5m': 100.0, 'total_seen_5m': 4.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 5.55, 'avgdiff': 1, 'expectedWait': 22.1050535543, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 14.3960674157, 'pct_remaining5m': 0.0, 'sum': 3.09460625, 'tx_atabove': 721.0, 'hashpower_accepting': 20.3125, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 6.4, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 5.54, 'avgdiff': 1, 'expectedWait': 22.0785433993, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 14.5465489567, 'pct_remaining5m': 0.0, 'sum': 3.09460625, 'tx_atabove': 721.0, 'hashpower_accepting': 20.3125, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 6.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 5.54, 'avgdiff': 1, 'expectedWait': 22.0785433993, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 14.5666131621, 'pct_remaining5m': null, 'sum': 3.09460625, 'tx_atabove': 721.0, 'hashpower_accepting': 20.3125, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 6.6, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 5.54, 'avgdiff': 1, 'expectedWait': 22.0785433993, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 2.0, 'hashpower_accepting2': 14.6769662921, 'pct_remaining5m': null, 'sum': 3.09460625, 'tx_atabove': 721.0, 'hashpower_accepting': 20.3125, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 6.7, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 5.54, 'avgdiff': 1, 'expectedWait': 22.0785433993, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 14.7070626003, 'pct_remaining5m': null, 'sum': 3.09400625, 'tx_atabove': 720.0, 'hashpower_accepting': 20.3125, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 6.8, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 5.54, 'avgdiff': 1, 'expectedWait': 22.0653002466, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 14.7271268058, 'pct_remaining5m': 0.0, 'sum': 3.09400625, 'tx_atabove': 720.0, 'hashpower_accepting': 20.3125, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 6.9, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 5.54, 'avgdiff': 1, 'expectedWait': 22.0653002466, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 3.0, 'hashpower_accepting2': 15.4795345104, 'pct_remaining5m': 0.0, 'sum': 3.06749375, 'tx_atabove': 718.0, 'hashpower_accepting': 21.3541666667, 'hpa_coef2': -0.067, 'total_seen_30m': 11.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 7.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 6.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 5.39, 'avgdiff': 1, 'expectedWait': 21.4879808804, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 15.5898876404, 'pct_remaining5m': 0.0, 'sum': 3.06089375, 'tx_atabove': 707.0, 'hashpower_accepting': 21.3541666667, 'hpa_coef2': -0.067, 'total_seen_30m': 4.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 7.1, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 5.36, 'avgdiff': 1, 'expectedWait': 21.3466271869, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 15.5999197432, 'pct_remaining5m': null, 'sum': 3.06029375, 'tx_atabove': 706.0, 'hashpower_accepting': 21.3541666667, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 7.2, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 5.35, 'avgdiff': 1, 'expectedWait': 21.3338230522, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 15.8507223114, 'pct_remaining5m': 0.0, 'sum': 3.05969375, 'tx_atabove': 705.0, 'hashpower_accepting': 21.3541666667, 'hpa_coef2': -0.067, 'total_seen_30m': 5.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 7.6, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 5.35, 'avgdiff': 1, 'expectedWait': 21.3210265977, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 15.8607544141, 'pct_remaining5m': null, 'sum': 3.05909375, 'tx_atabove': 704.0, 'hashpower_accepting': 21.3541666667, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 7.7, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 0.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 5.35, 'avgdiff': 1, 'expectedWait': 21.3082378187, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 18.86035313, 'pct_remaining5m': 0.0, 'sum': 2.8933625, 'tx_atabove': 702.0, 'hashpower_accepting': 28.125, 'hpa_coef2': -0.067, 'total_seen_30m': 30.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 8.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 37.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 4.53, 'avgdiff': 1, 'expectedWait': 18.053913939, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1.0, 'hashpower_accepting2': 19.1011235955, 'pct_remaining5m': 0.0, 'sum': 2.85250625, 'tx_atabove': 655.0, 'hashpower_accepting': 28.6458333333, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 8.1, 'pct_mined_5m': 100.0, 'total_seen_5m': 5.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 4.35, 'avgdiff': 1, 'expectedWait': 17.331163684, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 19.1613162119, 'pct_remaining5m': 0.0, 'sum': 2.84890625, 'tx_atabove': 649.0, 'hashpower_accepting': 28.6458333333, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 8.2, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 4.33, 'avgdiff': 1, 'expectedWait': 17.268883666, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 19.231540931, 'pct_remaining5m': 0.0, 'sum': 2.8097375, 'tx_atabove': 647.0, 'hashpower_accepting': 30.2083333333, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 8.4, 'pct_mined_5m': 100.0, 'total_seen_5m': 6.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 4.17, 'avgdiff': 1, 'expectedWait': 16.6055586875, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1.0, 'hashpower_accepting2': 19.5224719101, 'pct_remaining5m': 0.0, 'sum': 2.777225, 'tx_atabove': 635.0, 'hashpower_accepting': 31.25, 'hpa_coef2': -0.067, 'total_seen_30m': 7.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 8.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 12.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 4.03, 'avgdiff': 1, 'expectedWait': 16.0743526708, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 19.7331460674, 'pct_remaining5m': 0.0, 'sum': 2.774225, 'tx_atabove': 630.0, 'hashpower_accepting': 31.25, 'hpa_coef2': -0.067, 'total_seen_30m': 5.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 8.6, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 4.02, 'avgdiff': 1, 'expectedWait': 16.0262018751, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 19.8033707865, 'pct_remaining5m': 0.0, 'sum': 2.72905625, 'tx_atabove': 618.0, 'hashpower_accepting': 32.8125, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 8.8, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 3.84, 'avgdiff': 1, 'expectedWait': 15.3184234339, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 19.9638844302, 'pct_remaining5m': 0.0, 'sum': 2.6954, 'tx_atabove': 583.0, 'hashpower_accepting': 33.3333333333, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 8.9, 'pct_mined_5m': 100.0, 'total_seen_5m': 6.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 3.72, 'avgdiff': 1, 'expectedWait': 14.8114421454, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 23.6155698234, 'pct_remaining5m': 0.0, 'sum': 2.3937875, 'tx_atabove': 460.0, 'hashpower_accepting': 42.7083333333, 'hpa_coef2': -0.067, 'total_seen_30m': 43.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 9.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 120.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 2.75, 'avgdiff': 1, 'expectedWait': 10.9549071782, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 24.0268860353, 'pct_remaining5m': 0.0, 'sum': 2.30313125, 'tx_atabove': 330.0, 'hashpower_accepting': 43.2291666667, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 9.1, 'pct_mined_5m': 100.0, 'total_seen_5m': 23.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 2.51, 'avgdiff': 1, 'expectedWait': 10.0054630618, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 24.1472712681, 'pct_remaining5m': 0.0, 'sum': 2.287475, 'tx_atabove': 325.0, 'hashpower_accepting': 43.75, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 9.2, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 2.47, 'avgdiff': 1, 'expectedWait': 9.8500349165, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 24.2174959872, 'pct_remaining5m': 0.0, 'sum': 2.2609625, 'tx_atabove': 323.0, 'hashpower_accepting': 44.7916666667, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 9.3, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 2.41, 'avgdiff': 1, 'expectedWait': 9.5923173304, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 24.3880417335, 'pct_remaining5m': 0.0, 'sum': 2.22239375, 'tx_atabove': 322.0, 'hashpower_accepting': 46.3541666667, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 9.4, 'pct_mined_5m': 100.0, 'total_seen_5m': 7.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 2.32, 'avgdiff': 1, 'expectedWait': 9.2293973144, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1.0, 'hashpower_accepting2': 24.5284911717, 'pct_remaining5m': 0.0, 'sum': 2.2091375, 'tx_atabove': 321.0, 'hashpower_accepting': 46.875, 'hpa_coef2': -0.067, 'total_seen_30m': 5.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 9.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 2.29, 'avgdiff': 1, 'expectedWait': 9.1078574773, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 24.7391653291, 'pct_remaining5m': 0.0, 'sum': 2.2073375, 'tx_atabove': 318.0, 'hashpower_accepting': 46.875, 'hpa_coef2': -0.067, 'total_seen_30m': 9.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 9.6, 'pct_mined_5m': 100.0, 'total_seen_5m': 8.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 2.28, 'avgdiff': 1, 'expectedWait': 9.0914780797, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 24.9699036918, 'pct_remaining5m': 0.0, 'sum': 2.182025, 'tx_atabove': 318.0, 'hashpower_accepting': 47.9166666667, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 9.7, 'pct_mined_5m': 88.0, 'total_seen_5m': 9.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 2.22, 'avgdiff': 1, 'expectedWait': 8.8642381788, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 2.0, 'hashpower_accepting2': 25.1203852327, 'pct_remaining5m': 0.0, 'sum': 2.16936875, 'tx_atabove': 318.0, 'hashpower_accepting': 48.4375, 'hpa_coef2': -0.067, 'total_seen_30m': 6.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 9.8, 'pct_mined_5m': 75.0, 'total_seen_5m': 4.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 2.2, 'avgdiff': 1, 'expectedWait': 8.7527571186, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 25.1705457464, 'pct_remaining5m': 0.0, 'sum': 2.1561125, 'tx_atabove': 317.0, 'hashpower_accepting': 48.9583333333, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 9.9, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 2.17, 'avgdiff': 1, 'expectedWait': 8.637494048, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 36.3864365971, 'pct_remaining5m': 0.0, 'sum': 1.769825, 'tx_atabove': 306.0, 'hashpower_accepting': 64.5833333333, 'hpa_coef2': -0.067, 'total_seen_30m': 353.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 10.0, 'pct_mined_5m': 99.0, 'total_seen_5m': 245.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 1.47, 'avgdiff': 1, 'expectedWait': 5.8698260519, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 36.536918138, 'pct_remaining5m': 0.0, 'sum': 1.733225, 'tx_atabove': 245.0, 'hashpower_accepting': 64.5833333333, 'hpa_coef2': -0.067, 'total_seen_30m': 7.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 10.1, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 1.42, 'avgdiff': 1, 'expectedWait': 5.658874382, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 36.7576243981, 'pct_remaining5m': 0.0, 'sum': 1.733225, 'tx_atabove': 245.0, 'hashpower_accepting': 64.5833333333, 'hpa_coef2': -0.067, 'total_seen_30m': 6.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 10.2, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 1.42, 'avgdiff': 1, 'expectedWait': 5.658874382, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 36.8378812199, 'pct_remaining5m': 0.0, 'sum': 1.732625, 'tx_atabove': 244.0, 'hashpower_accepting': 64.5833333333, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 10.3, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 1.42, 'avgdiff': 1, 'expectedWait': 5.6554800758, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 36.8679775281, 'pct_remaining5m': 0.0, 'sum': 1.732025, 'tx_atabove': 243.0, 'hashpower_accepting': 64.5833333333, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 10.4, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 1.42, 'avgdiff': 1, 'expectedWait': 5.6520878055, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1.0, 'hashpower_accepting2': 37.8109951846, 'pct_remaining5m': 0.0, 'sum': 1.69405625, 'tx_atabove': 243.0, 'hashpower_accepting': 66.1458333333, 'hpa_coef2': -0.067, 'total_seen_30m': 12.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 10.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 53.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 1.37, 'avgdiff': 1, 'expectedWait': 5.4415081179, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 37.871187801, 'pct_remaining5m': 0.0, 'sum': 1.69285625, 'tx_atabove': 241.0, 'hashpower_accepting': 66.1458333333, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 10.7, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 1.36, 'avgdiff': 1, 'expectedWait': 5.4349822245, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 38.1019261637, 'pct_remaining5m': 0.0, 'sum': 1.69285625, 'tx_atabove': 241.0, 'hashpower_accepting': 66.1458333333, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 10.8, 'pct_mined_5m': 100.0, 'total_seen_5m': 6.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 1.36, 'avgdiff': 1, 'expectedWait': 5.4349822245, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 38.1821829856, 'pct_remaining5m': 0.0, 'sum': 1.68565625, 'tx_atabove': 229.0, 'hashpower_accepting': 66.1458333333, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 10.9, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 1.35, 'avgdiff': 1, 'expectedWait': 5.3959908897, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 40.7002407705, 'pct_remaining5m': 0.0, 'sum': 1.520525, 'tx_atabove': 228.0, 'hashpower_accepting': 72.9166666667, 'hpa_coef2': -0.067, 'total_seen_30m': 84.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 11.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 84.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 1.15, 'avgdiff': 1, 'expectedWait': 4.5746262436, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 40.8206260032, 'pct_remaining5m': 0.0, 'sum': 1.507325, 'tx_atabove': 206.0, 'hashpower_accepting': 72.9166666667, 'hpa_coef2': -0.067, 'total_seen_30m': 5.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 11.1, 'pct_mined_5m': 100.0, 'total_seen_5m': 4.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 1.13, 'avgdiff': 1, 'expectedWait': 4.5146379708, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 40.8908507223, 'pct_remaining5m': 0.0, 'sum': 1.507325, 'tx_atabove': 206.0, 'hashpower_accepting': 72.9166666667, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 11.2, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 1.13, 'avgdiff': 1, 'expectedWait': 4.5146379708, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 41.4024879615, 'pct_remaining5m': 0.0, 'sum': 1.49466875, 'tx_atabove': 206.0, 'hashpower_accepting': 73.4375, 'hpa_coef2': -0.067, 'total_seen_30m': 15.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 11.4, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 1.12, 'avgdiff': 1, 'expectedWait': 4.4578596422, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 41.4827447833, 'pct_remaining5m': 0.0, 'sum': 1.49466875, 'tx_atabove': 206.0, 'hashpower_accepting': 73.4375, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 11.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 1.12, 'avgdiff': 1, 'expectedWait': 4.4578596422, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 41.6131621188, 'pct_remaining5m': 0.0, 'sum': 1.49406875, 'tx_atabove': 205.0, 'hashpower_accepting': 73.4375, 'hpa_coef2': -0.067, 'total_seen_30m': 8.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 11.6, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 1.12, 'avgdiff': 1, 'expectedWait': 4.4551857287, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 41.6332263242, 'pct_remaining5m': 0.0, 'sum': 1.49406875, 'tx_atabove': 205.0, 'hashpower_accepting': 73.4375, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 11.7, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 1.12, 'avgdiff': 1, 'expectedWait': 4.4551857287, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 41.753611557, 'pct_remaining5m': 0.0, 'sum': 1.49406875, 'tx_atabove': 205.0, 'hashpower_accepting': 73.4375, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 11.8, 'pct_mined_5m': 100.0, 'total_seen_5m': 6.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 1.12, 'avgdiff': 1, 'expectedWait': 4.4551857287, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 41.7736757624, 'pct_remaining5m': null, 'sum': 1.49406875, 'tx_atabove': 205.0, 'hashpower_accepting': 73.4375, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 11.9, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 1.12, 'avgdiff': 1, 'expectedWait': 4.4551857287, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1.0, 'hashpower_accepting2': 44.7030497592, 'pct_remaining5m': 0.0, 'sum': 1.41813125, 'tx_atabove': 205.0, 'hashpower_accepting': 76.5625, 'hpa_coef2': -0.067, 'total_seen_30m': 96.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 12.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 39.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 1.04, 'avgdiff': 1, 'expectedWait': 4.1293964158, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 44.9036918138, 'pct_remaining5m': 0.0, 'sum': 1.399475, 'tx_atabove': 195.0, 'hashpower_accepting': 77.0833333333, 'hpa_coef2': -0.067, 'total_seen_30m': 11.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 12.1, 'pct_mined_5m': 100.0, 'total_seen_5m': 6.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 1.02, 'avgdiff': 1, 'expectedWait': 4.0530715456, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 45.0341091493, 'pct_remaining5m': null, 'sum': 1.38681875, 'tx_atabove': 195.0, 'hashpower_accepting': 77.6041666667, 'hpa_coef2': -0.067, 'total_seen_30m': 3.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 12.2, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 1.0, 'avgdiff': 1, 'expectedWait': 4.0020981056, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 45.1845906902, 'pct_remaining5m': 0.0, 'sum': 1.3735625, 'tx_atabove': 194.0, 'hashpower_accepting': 78.125, 'hpa_coef2': -0.067, 'total_seen_30m': 9.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 12.3, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.99, 'avgdiff': 1, 'expectedWait': 3.9493953846, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 45.1946227929, 'pct_remaining5m': null, 'sum': 1.3735625, 'tx_atabove': 194.0, 'hashpower_accepting': 78.125, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 12.4, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.99, 'avgdiff': 1, 'expectedWait': 3.9493953846, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 45.3752006421, 'pct_remaining5m': 0.0, 'sum': 1.36090625, 'tx_atabove': 194.0, 'hashpower_accepting': 78.6458333333, 'hpa_coef2': -0.067, 'total_seen_30m': 10.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 12.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.98, 'avgdiff': 1, 'expectedWait': 3.8997258274, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 45.4955858748, 'pct_remaining5m': 0.0, 'sum': 1.36090625, 'tx_atabove': 194.0, 'hashpower_accepting': 78.6458333333, 'hpa_coef2': -0.067, 'total_seen_30m': 4.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 12.6, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.98, 'avgdiff': 1, 'expectedWait': 3.8997258274, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 45.525682183, 'pct_remaining5m': null, 'sum': 1.36090625, 'tx_atabove': 194.0, 'hashpower_accepting': 78.6458333333, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 12.7, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.98, 'avgdiff': 1, 'expectedWait': 3.8997258274, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 45.5858747994, 'pct_remaining5m': 0.0, 'sum': 1.36090625, 'tx_atabove': 194.0, 'hashpower_accepting': 78.6458333333, 'hpa_coef2': -0.067, 'total_seen_30m': 4.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 12.8, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.98, 'avgdiff': 1, 'expectedWait': 3.8997258274, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 45.636035313, 'pct_remaining5m': 0.0, 'sum': 1.36090625, 'tx_atabove': 194.0, 'hashpower_accepting': 78.6458333333, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 12.9, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.98, 'avgdiff': 1, 'expectedWait': 3.8997258274, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1.0, 'hashpower_accepting2': 46.9903691814, 'pct_remaining5m': 0.0, 'sum': 1.31028125, 'tx_atabove': 194.0, 'hashpower_accepting': 80.7291666667, 'hpa_coef2': -0.067, 'total_seen_30m': 47.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 13.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 34.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.93, 'avgdiff': 1, 'expectedWait': 3.7072162202, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 47.5321027287, 'pct_remaining5m': 0.0, 'sum': 1.292825, 'tx_atabove': 186.0, 'hashpower_accepting': 81.25, 'hpa_coef2': -0.067, 'total_seen_30m': 9.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 13.2, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.91, 'avgdiff': 1, 'expectedWait': 3.6430636874, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 47.5621990369, 'pct_remaining5m': 0.0, 'sum': 1.292825, 'tx_atabove': 186.0, 'hashpower_accepting': 81.25, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 13.3, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.91, 'avgdiff': 1, 'expectedWait': 3.6430636874, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 47.632423756, 'pct_remaining5m': null, 'sum': 1.292825, 'tx_atabove': 186.0, 'hashpower_accepting': 81.25, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 13.4, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.91, 'avgdiff': 1, 'expectedWait': 3.6430636874, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.5, 'hashpower_accepting2': 48.1440609952, 'pct_remaining5m': 0.0, 'sum': 1.28016875, 'tx_atabove': 186.0, 'hashpower_accepting': 81.7708333333, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 13.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 21.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.9, 'avgdiff': 1, 'expectedWait': 3.5972467097, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 48.4550561798, 'pct_remaining5m': 0.0, 'sum': 1.2651125, 'tx_atabove': 182.0, 'hashpower_accepting': 82.2916666667, 'hpa_coef2': -0.067, 'total_seen_30m': 10.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 13.6, 'pct_mined_5m': 100.0, 'total_seen_5m': 10.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.89, 'avgdiff': 1, 'expectedWait': 3.5434913565, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1.0, 'hashpower_accepting2': 55.9590690209, 'pct_remaining5m': 0.0, 'sum': 1.2398, 'tx_atabove': 182.0, 'hashpower_accepting': 83.3333333333, 'hpa_coef2': -0.067, 'total_seen_30m': 253.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 13.7, 'pct_mined_5m': 100.0, 'total_seen_5m': 212.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.87, 'avgdiff': 1, 'expectedWait': 3.4549224112, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 56.0593900482, 'pct_remaining5m': 0.0, 'sum': 1.226, 'tx_atabove': 159.0, 'hashpower_accepting': 83.3333333333, 'hpa_coef2': -0.067, 'total_seen_30m': 6.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 13.8, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.86, 'avgdiff': 1, 'expectedWait': 3.4075719515, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 56.1095505618, 'pct_remaining5m': 0.0, 'sum': 1.226, 'tx_atabove': 159.0, 'hashpower_accepting': 83.3333333333, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 13.9, 'pct_mined_5m': 100.0, 'total_seen_5m': 4.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.86, 'avgdiff': 1, 'expectedWait': 3.4075719515, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.5, 'hashpower_accepting2': 59.6408507223, 'pct_remaining5m': 0.0, 'sum': 1.13740625, 'tx_atabove': 159.0, 'hashpower_accepting': 86.9791666667, 'hpa_coef2': -0.067, 'total_seen_30m': 119.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 14.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 115.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.78, 'avgdiff': 1, 'expectedWait': 3.1186688184, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 59.7311396469, 'pct_remaining5m': 0.0, 'sum': 1.13440625, 'tx_atabove': 154.0, 'hashpower_accepting': 86.9791666667, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 14.1, 'pct_mined_5m': 100.0, 'total_seen_5m': 5.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.78, 'avgdiff': 1, 'expectedWait': 3.1093268319, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 59.8214285714, 'pct_remaining5m': 0.0, 'sum': 1.13440625, 'tx_atabove': 154.0, 'hashpower_accepting': 86.9791666667, 'hpa_coef2': -0.067, 'total_seen_30m': 4.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 14.2, 'pct_mined_5m': 100.0, 'total_seen_5m': 4.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.78, 'avgdiff': 1, 'expectedWait': 3.1093268319, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1.0, 'hashpower_accepting2': 60.1524879615, 'pct_remaining5m': 0.0, 'sum': 1.13380625, 'tx_atabove': 153.0, 'hashpower_accepting': 86.9791666667, 'hpa_coef2': -0.067, 'total_seen_30m': 5.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 14.4, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.78, 'avgdiff': 1, 'expectedWait': 3.1074617954, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 60.1725521669, 'pct_remaining5m': 0.0, 'sum': 1.13320625, 'tx_atabove': 152.0, 'hashpower_accepting': 86.9791666667, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 14.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.78, 'avgdiff': 1, 'expectedWait': 3.1055978775, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 60.2528089888, 'pct_remaining5m': 0.0, 'sum': 1.13320625, 'tx_atabove': 152.0, 'hashpower_accepting': 86.9791666667, 'hpa_coef2': -0.067, 'total_seen_30m': 3.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 14.6, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.78, 'avgdiff': 1, 'expectedWait': 3.1055978775, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 60.6440609952, 'pct_remaining5m': 0.0, 'sum': 1.13320625, 'tx_atabove': 152.0, 'hashpower_accepting': 86.9791666667, 'hpa_coef2': -0.067, 'total_seen_30m': 10.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 14.7, 'pct_mined_5m': 100.0, 'total_seen_5m': 10.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.78, 'avgdiff': 1, 'expectedWait': 3.1055978775, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 60.6641252006, 'pct_remaining5m': 0.0, 'sum': 1.13320625, 'tx_atabove': 152.0, 'hashpower_accepting': 86.9791666667, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 14.8, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.78, 'avgdiff': 1, 'expectedWait': 3.1055978775, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 60.6942215088, 'pct_remaining5m': null, 'sum': 1.13320625, 'tx_atabove': 152.0, 'hashpower_accepting': 86.9791666667, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 14.9, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.78, 'avgdiff': 1, 'expectedWait': 3.1055978775, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 62.9113162119, 'pct_remaining5m': 0.0, 'sum': 1.0952375, 'tx_atabove': 152.0, 'hashpower_accepting': 88.5416666667, 'hpa_coef2': -0.067, 'total_seen_30m': 65.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 15.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 48.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.75, 'avgdiff': 1, 'expectedWait': 2.9898926986, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 63.4129213483, 'pct_remaining5m': 0.0, 'sum': 1.0910375, 'tx_atabove': 145.0, 'hashpower_accepting': 88.5416666667, 'hpa_coef2': -0.067, 'total_seen_30m': 11.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 15.1, 'pct_mined_5m': 100.0, 'total_seen_5m': 8.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.75, 'avgdiff': 1, 'expectedWait': 2.9773614832, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1.0, 'hashpower_accepting2': 64.4161316212, 'pct_remaining5m': 0.0, 'sum': 1.0886375, 'tx_atabove': 141.0, 'hashpower_accepting': 88.5416666667, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 15.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 4.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.75, 'avgdiff': 1, 'expectedWait': 2.9702243836, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 64.4863563403, 'pct_remaining5m': 0.0, 'sum': 1.0820375, 'tx_atabove': 130.0, 'hashpower_accepting': 88.5416666667, 'hpa_coef2': -0.067, 'total_seen_30m': 5.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 15.6, 'pct_mined_5m': 50.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.74, 'avgdiff': 1, 'expectedWait': 2.9506854521, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1.0, 'hashpower_accepting2': 66.1817817014, 'pct_remaining5m': 0.0, 'sum': 1.0820375, 'tx_atabove': 130.0, 'hashpower_accepting': 88.5416666667, 'hpa_coef2': -0.067, 'total_seen_30m': 24.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 15.7, 'pct_mined_5m': 100.0, 'total_seen_5m': 17.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.74, 'avgdiff': 1, 'expectedWait': 2.9506854521, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 66.2620385233, 'pct_remaining5m': 0.0, 'sum': 1.0766375, 'tx_atabove': 121.0, 'hashpower_accepting': 88.5416666667, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 15.8, 'pct_mined_5m': 83.0, 'total_seen_5m': 6.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.74, 'avgdiff': 1, 'expectedWait': 2.9347946943, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 67.2853130016, 'pct_remaining5m': 0.0, 'sum': 1.0766375, 'tx_atabove': 121.0, 'hashpower_accepting': 88.5416666667, 'hpa_coef2': -0.067, 'total_seen_30m': 15.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 16.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 11.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.74, 'avgdiff': 1, 'expectedWait': 2.9347946943, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 67.2953451043, 'pct_remaining5m': null, 'sum': 1.0748375, 'tx_atabove': 118.0, 'hashpower_accepting': 88.5416666667, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 16.1, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.74, 'avgdiff': 1, 'expectedWait': 2.9295168154, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 67.4458266453, 'pct_remaining5m': 0.0, 'sum': 1.0748375, 'tx_atabove': 118.0, 'hashpower_accepting': 88.5416666667, 'hpa_coef2': -0.067, 'total_seen_30m': 3.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 16.2, 'pct_mined_5m': 100.0, 'total_seen_5m': 7.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.74, 'avgdiff': 1, 'expectedWait': 2.9295168154, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 67.455858748, 'pct_remaining5m': 0.0, 'sum': 1.0748375, 'tx_atabove': 118.0, 'hashpower_accepting': 88.5416666667, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 16.3, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.74, 'avgdiff': 1, 'expectedWait': 2.9295168154, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 67.6565008026, 'pct_remaining5m': 0.0, 'sum': 1.0748375, 'tx_atabove': 118.0, 'hashpower_accepting': 88.5416666667, 'hpa_coef2': -0.067, 'total_seen_30m': 5.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 16.4, 'pct_mined_5m': 100.0, 'total_seen_5m': 7.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.74, 'avgdiff': 1, 'expectedWait': 2.9295168154, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 67.7267255217, 'pct_remaining5m': 0.0, 'sum': 1.0742375, 'tx_atabove': 117.0, 'hashpower_accepting': 88.5416666667, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 16.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.73, 'avgdiff': 1, 'expectedWait': 2.9277596325, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1.0, 'hashpower_accepting2': 68.6697431782, 'pct_remaining5m': 0.0, 'sum': 1.0742375, 'tx_atabove': 117.0, 'hashpower_accepting': 88.5416666667, 'hpa_coef2': -0.067, 'total_seen_30m': 42.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 16.7, 'pct_mined_5m': 100.0, 'total_seen_5m': 27.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.73, 'avgdiff': 1, 'expectedWait': 2.9277596325, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 68.8904494382, 'pct_remaining5m': 0.0, 'sum': 1.0718375, 'tx_atabove': 113.0, 'hashpower_accepting': 88.5416666667, 'hpa_coef2': -0.067, 'total_seen_30m': 11.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 17.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.73, 'avgdiff': 1, 'expectedWait': 2.9207414346, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 69.0308988764, 'pct_remaining5m': 0.0, 'sum': 1.0712375, 'tx_atabove': 112.0, 'hashpower_accepting': 88.5416666667, 'hpa_coef2': -0.067, 'total_seen_30m': 8.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 17.1, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.73, 'avgdiff': 1, 'expectedWait': 2.9189895153, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 69.0409309791, 'pct_remaining5m': null, 'sum': 1.0706375, 'tx_atabove': 111.0, 'hashpower_accepting': 88.5416666667, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 17.3, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.73, 'avgdiff': 1, 'expectedWait': 2.9172386469, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 69.0710272873, 'pct_remaining5m': 0.0, 'sum': 1.0706375, 'tx_atabove': 111.0, 'hashpower_accepting': 88.5416666667, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 17.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.73, 'avgdiff': 1, 'expectedWait': 2.9172386469, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 69.08105939, 'pct_remaining5m': 0.0, 'sum': 1.0706375, 'tx_atabove': 111.0, 'hashpower_accepting': 88.5416666667, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 17.6, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.73, 'avgdiff': 1, 'expectedWait': 2.9172386469, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 69.1011235955, 'pct_remaining5m': null, 'sum': 1.0706375, 'tx_atabove': 111.0, 'hashpower_accepting': 88.5416666667, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 17.8, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.73, 'avgdiff': 1, 'expectedWait': 2.9172386469, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 69.1111556982, 'pct_remaining5m': 0.0, 'sum': 1.0706375, 'tx_atabove': 111.0, 'hashpower_accepting': 88.5416666667, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 17.9, 'pct_mined_5m': 0.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.73, 'avgdiff': 1, 'expectedWait': 2.9172386469, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 69.7632423756, 'pct_remaining5m': 0.0, 'sum': 1.05798125, 'tx_atabove': 111.0, 'hashpower_accepting': 89.0625, 'hpa_coef2': -0.067, 'total_seen_30m': 16.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 18.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 16.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.72, 'avgdiff': 1, 'expectedWait': 2.8805500054, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 69.7732744783, 'pct_remaining5m': 0.0, 'sum': 1.05618125, 'tx_atabove': 108.0, 'hashpower_accepting': 89.0625, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 18.1, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.72, 'avgdiff': 1, 'expectedWait': 2.875369679, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 69.8134028892, 'pct_remaining5m': 0.0, 'sum': 1.05618125, 'tx_atabove': 108.0, 'hashpower_accepting': 89.0625, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 18.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.72, 'avgdiff': 1, 'expectedWait': 2.875369679, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 69.823434992, 'pct_remaining5m': 0.0, 'sum': 1.05618125, 'tx_atabove': 108.0, 'hashpower_accepting': 89.0625, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 18.7, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.72, 'avgdiff': 1, 'expectedWait': 2.875369679, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 69.8535313002, 'pct_remaining5m': null, 'sum': 1.05618125, 'tx_atabove': 108.0, 'hashpower_accepting': 89.0625, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 18.8, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.72, 'avgdiff': 1, 'expectedWait': 2.875369679, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 69.8735955056, 'pct_remaining5m': 0.0, 'sum': 1.05618125, 'tx_atabove': 108.0, 'hashpower_accepting': 89.0625, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 18.9, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.72, 'avgdiff': 1, 'expectedWait': 2.875369679, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 70.3150080257, 'pct_remaining5m': 0.0, 'sum': 1.043525, 'tx_atabove': 108.0, 'hashpower_accepting': 89.5833333333, 'hpa_coef2': -0.067, 'total_seen_30m': 13.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 19.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 11.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.71, 'avgdiff': 1, 'expectedWait': 2.8392076024, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 70.3350722311, 'pct_remaining5m': 0.0, 'sum': 1.042325, 'tx_atabove': 106.0, 'hashpower_accepting': 89.5833333333, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 19.3, 'pct_mined_5m': 66.0, 'total_seen_5m': 3.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.71, 'avgdiff': 1, 'expectedWait': 2.8358025967, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 70.3752006421, 'pct_remaining5m': 0.0, 'sum': 1.042325, 'tx_atabove': 106.0, 'hashpower_accepting': 89.5833333333, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 19.4, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.71, 'avgdiff': 1, 'expectedWait': 2.8358025967, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 70.3852327448, 'pct_remaining5m': null, 'sum': 1.042325, 'tx_atabove': 106.0, 'hashpower_accepting': 89.5833333333, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 19.5, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.71, 'avgdiff': 1, 'expectedWait': 2.8358025967, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 70.4052969502, 'pct_remaining5m': null, 'sum': 1.042325, 'tx_atabove': 106.0, 'hashpower_accepting': 89.5833333333, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 19.8, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.71, 'avgdiff': 1, 'expectedWait': 2.8358025967, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 70.8266452648, 'pct_remaining5m': 0.0, 'sum': 1.042325, 'tx_atabove': 106.0, 'hashpower_accepting': 89.5833333333, 'hpa_coef2': -0.067, 'total_seen_30m': 18.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 19.9, 'pct_mined_5m': 100.0, 'total_seen_5m': 10.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.71, 'avgdiff': 1, 'expectedWait': 2.8358025967, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 75.2708667737, 'pct_remaining5m': 0.0, 'sum': 0.90310625, 'tx_atabove': 106.0, 'hashpower_accepting': 95.3125, 'hpa_coef2': -0.067, 'total_seen_30m': 144.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 20.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 185.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.62, 'avgdiff': 1, 'expectedWait': 2.4672551317, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 75.3009630819, 'pct_remaining5m': null, 'sum': 0.89650625, 'tx_atabove': 95.0, 'hashpower_accepting': 95.3125, 'hpa_coef2': -0.067, 'total_seen_30m': 3.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 20.2, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.62, 'avgdiff': 1, 'expectedWait': 2.4510248666, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 75.3210272873, 'pct_remaining5m': 0.0, 'sum': 0.89650625, 'tx_atabove': 95.0, 'hashpower_accepting': 95.3125, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 20.3, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.62, 'avgdiff': 1, 'expectedWait': 2.4510248666, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 77.7387640449, 'pct_remaining5m': 0.0, 'sum': 0.88385, 'tx_atabove': 95.0, 'hashpower_accepting': 95.8333333333, 'hpa_coef2': -0.067, 'total_seen_30m': 24.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 20.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 9.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.61, 'avgdiff': 1, 'expectedWait': 2.420199561, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 77.7688603531, 'pct_remaining5m': 0.0, 'sum': 0.88325, 'tx_atabove': 94.0, 'hashpower_accepting': 95.8333333333, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 20.7, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.61, 'avgdiff': 1, 'expectedWait': 2.4187478768, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 77.9093097913, 'pct_remaining5m': null, 'sum': 0.87059375, 'tx_atabove': 94.0, 'hashpower_accepting': 96.3541666667, 'hpa_coef2': -0.067, 'total_seen_30m': 7.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 20.9, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.6, 'avgdiff': 1, 'expectedWait': 2.3883285027, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 79.7752808989, 'pct_remaining5m': 0.0, 'sum': 0.87059375, 'tx_atabove': 94.0, 'hashpower_accepting': 96.3541666667, 'hpa_coef2': -0.067, 'total_seen_30m': 39.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 21.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 36.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.6, 'avgdiff': 1, 'expectedWait': 2.3883285027, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 79.7953451043, 'pct_remaining5m': 0.0, 'sum': 0.86819375, 'tx_atabove': 90.0, 'hashpower_accepting': 96.3541666667, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 21.1, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.6, 'avgdiff': 1, 'expectedWait': 2.3826033871, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 79.8154093098, 'pct_remaining5m': null, 'sum': 0.86819375, 'tx_atabove': 90.0, 'hashpower_accepting': 96.3541666667, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 21.4, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.6, 'avgdiff': 1, 'expectedWait': 2.3826033871, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 79.845505618, 'pct_remaining5m': 0.0, 'sum': 0.86819375, 'tx_atabove': 90.0, 'hashpower_accepting': 96.3541666667, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 21.7, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.6, 'avgdiff': 1, 'expectedWait': 2.3826033871, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 80.3069823435, 'pct_remaining5m': 0.0, 'sum': 0.86819375, 'tx_atabove': 90.0, 'hashpower_accepting': 96.3541666667, 'hpa_coef2': -0.067, 'total_seen_30m': 9.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 21.9, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.6, 'avgdiff': 1, 'expectedWait': 2.3826033871, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 80.8888443018, 'pct_remaining5m': 0.0, 'sum': 0.8555375, 'tx_atabove': 90.0, 'hashpower_accepting': 96.875, 'hpa_coef2': -0.067, 'total_seen_30m': 13.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 22.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 13.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.352638584, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 80.9089085072, 'pct_remaining5m': null, 'sum': 0.8555375, 'tx_atabove': 90.0, 'hashpower_accepting': 96.875, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 22.1, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.352638584, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 80.91894061, 'pct_remaining5m': 0.0, 'sum': 0.8555375, 'tx_atabove': 90.0, 'hashpower_accepting': 96.875, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 22.2, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.352638584, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 80.9289727127, 'pct_remaining5m': null, 'sum': 0.8555375, 'tx_atabove': 90.0, 'hashpower_accepting': 96.875, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 22.3, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.352638584, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 80.9490369181, 'pct_remaining5m': 0.0, 'sum': 0.8555375, 'tx_atabove': 90.0, 'hashpower_accepting': 96.875, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 22.5, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.352638584, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 80.9791332263, 'pct_remaining5m': 0.0, 'sum': 0.8555375, 'tx_atabove': 90.0, 'hashpower_accepting': 96.875, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 22.8, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.352638584, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 80.9891653291, 'pct_remaining5m': null, 'sum': 0.8555375, 'tx_atabove': 90.0, 'hashpower_accepting': 96.875, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 22.9, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.352638584, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 81.47070626, 'pct_remaining5m': 0.0, 'sum': 0.8555375, 'tx_atabove': 90.0, 'hashpower_accepting': 96.875, 'hpa_coef2': -0.067, 'total_seen_30m': 15.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 23.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 19.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.352638584, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 81.4907704655, 'pct_remaining5m': 0.0, 'sum': 0.8531375, 'tx_atabove': 86.0, 'hashpower_accepting': 96.875, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 23.1, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.3469990216, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 81.5108346709, 'pct_remaining5m': 0.0, 'sum': 0.8525375, 'tx_atabove': 85.0, 'hashpower_accepting': 96.875, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 23.3, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.3455912446, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 81.6011235955, 'pct_remaining5m': 0.0, 'sum': 0.8525375, 'tx_atabove': 85.0, 'hashpower_accepting': 96.875, 'hpa_coef2': -0.067, 'total_seen_30m': 3.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 23.7, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.3455912446, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 81.621187801, 'pct_remaining5m': 0.0, 'sum': 0.8525375, 'tx_atabove': 85.0, 'hashpower_accepting': 96.875, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 23.9, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.3455912446, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 81.8719903692, 'pct_remaining5m': 0.0, 'sum': 0.8525375, 'tx_atabove': 85.0, 'hashpower_accepting': 96.875, 'hpa_coef2': -0.067, 'total_seen_30m': 7.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 24.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 9.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.3455912446, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 81.8820224719, 'pct_remaining5m': 0.0, 'sum': 0.8501375, 'tx_atabove': 81.0, 'hashpower_accepting': 96.875, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 24.3, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.3399685755, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 81.9121187801, 'pct_remaining5m': 0.0, 'sum': 0.8501375, 'tx_atabove': 81.0, 'hashpower_accepting': 96.875, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 24.6, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.3399685755, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 81.9321829856, 'pct_remaining5m': 0.0, 'sum': 0.8501375, 'tx_atabove': 81.0, 'hashpower_accepting': 96.875, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 24.7, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.59, 'avgdiff': 1, 'expectedWait': 2.3399685755, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 83.3868378812, 'pct_remaining5m': 0.0, 'sum': 0.83688125, 'tx_atabove': 80.0, 'hashpower_accepting': 97.3958333333, 'hpa_coef2': -0.067, 'total_seen_30m': 24.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 25.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 32.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.58, 'avgdiff': 1, 'expectedWait': 2.3091540608, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 83.6276083467, 'pct_remaining5m': 0.0, 'sum': 0.82128125, 'tx_atabove': 54.0, 'hashpower_accepting': 97.3958333333, 'hpa_coef2': -0.067, 'total_seen_30m': 10.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 26.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 7.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.57, 'avgdiff': 1, 'expectedWait': 2.2734107799, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 83.7379614767, 'pct_remaining5m': 0.0, 'sum': 0.82008125, 'tx_atabove': 52.0, 'hashpower_accepting': 97.3958333333, 'hpa_coef2': -0.067, 'total_seen_30m': 5.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 27.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.57, 'avgdiff': 1, 'expectedWait': 2.2706843231, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 83.9887640449, 'pct_remaining5m': 0.0, 'sum': 0.81948125, 'tx_atabove': 51.0, 'hashpower_accepting': 97.3958333333, 'hpa_coef2': -0.067, 'total_seen_30m': 13.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 28.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 7.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.57, 'avgdiff': 1, 'expectedWait': 2.2693223212, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 84.0690208668, 'pct_remaining5m': 0.0, 'sum': 0.806825, 'tx_atabove': 51.0, 'hashpower_accepting': 97.9166666667, 'hpa_coef2': -0.067, 'total_seen_30m': 4.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 29.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.56, 'avgdiff': 1, 'expectedWait': 2.240782197, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 85.8447030498, 'pct_remaining5m': 0.0, 'sum': 0.7809125, 'tx_atabove': 50.0, 'hashpower_accepting': 98.9583333333, 'hpa_coef2': -0.067, 'total_seen_30m': 55.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 30.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 49.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.55, 'avgdiff': 1, 'expectedWait': 2.1834637674, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 85.9751203852, 'pct_remaining5m': 0.0, 'sum': 0.7743125, 'tx_atabove': 39.0, 'hashpower_accepting': 98.9583333333, 'hpa_coef2': -0.067, 'total_seen_30m': 6.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 31.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 5.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.54, 'avgdiff': 1, 'expectedWait': 2.169100358, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 86.1356340289, 'pct_remaining5m': 0.0, 'sum': 0.7743125, 'tx_atabove': 39.0, 'hashpower_accepting': 98.9583333333, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 32.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 4.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.54, 'avgdiff': 1, 'expectedWait': 2.169100358, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 86.2760834671, 'pct_remaining5m': 0.0, 'sum': 0.7743125, 'tx_atabove': 39.0, 'hashpower_accepting': 98.9583333333, 'hpa_coef2': -0.067, 'total_seen_30m': 3.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 33.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 6.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.54, 'avgdiff': 1, 'expectedWait': 2.169100358, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 86.4165329053, 'pct_remaining5m': 0.0, 'sum': 0.7737125, 'tx_atabove': 38.0, 'hashpower_accepting': 98.9583333333, 'hpa_coef2': -0.067, 'total_seen_30m': 6.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 34.0, 'pct_mined_5m': 60.0, 'total_seen_5m': 5.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.54, 'avgdiff': 1, 'expectedWait': 2.1677992881, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.5, 'hashpower_accepting2': 86.7475922953, 'pct_remaining5m': 0.0, 'sum': 0.7737125, 'tx_atabove': 38.0, 'hashpower_accepting': 98.9583333333, 'hpa_coef2': -0.067, 'total_seen_30m': 10.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 35.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 17.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.54, 'avgdiff': 1, 'expectedWait': 2.1677992881, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 86.7877207063, 'pct_remaining5m': 0.0, 'sum': 0.7725125, 'tx_atabove': 36.0, 'hashpower_accepting': 98.9583333333, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 36.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.54, 'avgdiff': 1, 'expectedWait': 2.1651994891, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 86.8579454254, 'pct_remaining5m': 0.0, 'sum': 0.7725125, 'tx_atabove': 36.0, 'hashpower_accepting': 98.9583333333, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 37.0, 'pct_mined_5m': 66.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.54, 'avgdiff': 1, 'expectedWait': 2.1651994891, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 86.908105939, 'pct_remaining5m': 0.0, 'sum': 0.7725125, 'tx_atabove': 36.0, 'hashpower_accepting': 98.9583333333, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 38.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.54, 'avgdiff': 1, 'expectedWait': 2.1651994891, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 86.9783306581, 'pct_remaining5m': 0.0, 'sum': 0.7725125, 'tx_atabove': 36.0, 'hashpower_accepting': 98.9583333333, 'hpa_coef2': -0.067, 'total_seen_30m': 3.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 39.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.54, 'avgdiff': 1, 'expectedWait': 2.1651994891, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1.0, 'hashpower_accepting2': 87.4498394864, 'pct_remaining5m': 0.0, 'sum': 0.75985625, 'tx_atabove': 36.0, 'hashpower_accepting': 99.4791666667, 'hpa_coef2': -0.067, 'total_seen_30m': 16.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 40.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 14.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.54, 'avgdiff': 1, 'expectedWait': 2.1379688654, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1.0, 'hashpower_accepting2': 89.6167736758, 'pct_remaining5m': 0.0, 'sum': 0.75805625, 'tx_atabove': 33.0, 'hashpower_accepting': 99.4791666667, 'hpa_coef2': -0.067, 'total_seen_30m': 112.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 41.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 57.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.54, 'avgdiff': 1, 'expectedWait': 2.1341239829, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 89.6869983949, 'pct_remaining5m': 0.0, 'sum': 0.75445625, 'tx_atabove': 27.0, 'hashpower_accepting': 99.4791666667, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 42.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.1264549491, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 89.7070626003, 'pct_remaining5m': null, 'sum': 0.75385625, 'tx_atabove': 26.0, 'hashpower_accepting': 99.4791666667, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 43.0, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.1251794588, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1.0, 'hashpower_accepting2': 89.9478330658, 'pct_remaining5m': 0.0, 'sum': 0.75385625, 'tx_atabove': 26.0, 'hashpower_accepting': 99.4791666667, 'hpa_coef2': -0.067, 'total_seen_30m': 9.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 44.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 9.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.1251794588, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 90.088282504, 'pct_remaining5m': 0.0, 'sum': 0.7394, 'tx_atabove': 23.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 8.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 45.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 5.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0946783304, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1.0, 'hashpower_accepting2': 90.4995987159, 'pct_remaining5m': 0.0, 'sum': 0.7394, 'tx_atabove': 23.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 17.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 46.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 19.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0946783304, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 90.5999197432, 'pct_remaining5m': 0.0, 'sum': 0.7382, 'tx_atabove': 21.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 4.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 47.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0921662239, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 90.6199839486, 'pct_remaining5m': null, 'sum': 0.7382, 'tx_atabove': 21.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 48.0, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0921662239, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 90.6500802568, 'pct_remaining5m': null, 'sum': 0.7382, 'tx_atabove': 21.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 49.0, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0921662239, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1.0, 'hashpower_accepting2': 94.1412520064, 'pct_remaining5m': 0.0, 'sum': 0.7382, 'tx_atabove': 21.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 62.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 50.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 71.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.53, 'avgdiff': 1, 'expectedWait': 2.0921662239, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 94.2114767255, 'pct_remaining5m': 0.0, 'sum': 0.7358, 'tx_atabove': 17.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 51.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0871510456, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 94.4422150883, 'pct_remaining5m': 0.0, 'sum': 0.7358, 'tx_atabove': 17.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 5.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 52.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0871510456, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 94.4723113965, 'pct_remaining5m': null, 'sum': 0.7358, 'tx_atabove': 17.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 54.0, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0871510456, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 94.4823434992, 'pct_remaining5m': null, 'sum': 0.7346, 'tx_atabove': 15.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 56.0, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0846479665, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 95.0140449438, 'pct_remaining5m': 0.0, 'sum': 0.7346, 'tx_atabove': 15.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 27.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 60.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 17.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0846479665, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 95.6059390048, 'pct_remaining5m': 0.0, 'sum': 0.7334, 'tx_atabove': 13.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 28.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 61.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 14.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0821478893, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 96.8699839486, 'pct_remaining5m': 0.0, 'sum': 0.7322, 'tx_atabove': 11.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 21.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 63.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 25.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0796508104, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 1.0, 'hashpower_accepting2': 98.3948635634, 'pct_remaining5m': 0.0, 'sum': 0.7298, 'tx_atabove': 7.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 83.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 64.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 38.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0746656331, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 98.4149277689, 'pct_remaining5m': 0.0, 'sum': 0.728, 'tx_atabove': 4.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 65.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0709345939, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 98.4951845907, 'pct_remaining5m': 0.0, 'sum': 0.7274, 'tx_atabove': 3.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 3.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 66.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0696924058, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 98.5052166934, 'pct_remaining5m': null, 'sum': 0.7274, 'tx_atabove': 3.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 69.0, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0696924058, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 98.5152487961, 'pct_remaining5m': null, 'sum': 0.7274, 'tx_atabove': 3.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 70.0, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0696924058, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 98.5553772071, 'pct_remaining5m': 0.0, 'sum': 0.7274, 'tx_atabove': 3.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 72.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0696924058, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 98.5754414125, 'pct_remaining5m': 0.0, 'sum': 0.7274, 'tx_atabove': 3.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 73.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0696924058, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 98.5854735152, 'pct_remaining5m': 0.0, 'sum': 0.7274, 'tx_atabove': 3.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 77.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0696924058, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 98.6055377207, 'pct_remaining5m': null, 'sum': 0.7274, 'tx_atabove': 3.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 79.0, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0696924058, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 98.8663723917, 'pct_remaining5m': 0.0, 'sum': 0.7274, 'tx_atabove': 3.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 14.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 80.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 6.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0696924058, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 98.8864365971, 'pct_remaining5m': 0.0, 'sum': 0.7268, 'tx_atabove': 2.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 84.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0684509628, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 98.9466292135, 'pct_remaining5m': 0.0, 'sum': 0.7268, 'tx_atabove': 2.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 88.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0684509628, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 98.9566613162, 'pct_remaining5m': null, 'sum': 0.7268, 'tx_atabove': 2.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 90.0, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0684509628, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 99.0469502408, 'pct_remaining5m': 0.0, 'sum': 0.7268, 'tx_atabove': 2.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 4.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 91.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 3.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0684509628, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 99.1272070626, 'pct_remaining5m': 0.0, 'sum': 0.7268, 'tx_atabove': 2.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 3.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 96.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0684509628, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 99.1372391653, 'pct_remaining5m': 0.0, 'sum': 0.7268, 'tx_atabove': 2.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 97.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0684509628, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 99.1472712681, 'pct_remaining5m': 0.0, 'sum': 0.7268, 'tx_atabove': 2.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 99.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0684509628, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 99.7090690209, 'pct_remaining5m': 0.0, 'sum': 0.7268, 'tx_atabove': 2.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 23.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 100.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 22.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0684509628, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 99.8394863563, 'pct_remaining5m': 0.0, 'sum': 0.7268, 'tx_atabove': 2.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 7.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 101.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0684509628, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 99.9097110754, 'pct_remaining5m': 0.0, 'sum': 0.7268, 'tx_atabove': 2.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 2.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 120.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0684509628, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 99.9297752809, 'pct_remaining5m': 0.0, 'sum': 0.7268, 'tx_atabove': 2.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': null, 'int2': 6.9238, 'pct_remaining30m': null, 'gasprice': 134.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 2.0, 'pct_mined_30m': null, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0684509628, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': 0.0, 'hashpower_accepting2': 99.9498394864, 'pct_remaining5m': 0.0, 'sum': 0.7268, 'tx_atabove': 2.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 137.0, 'pct_mined_5m': 100.0, 'total_seen_5m': 1.0, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0684509628, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}, {'intercept': 4.8015, 'age': null, 'hashpower_accepting2': 99.9699036918, 'pct_remaining5m': null, 'sum': 0.7256, 'tx_atabove': 0.0, 'hashpower_accepting': 100.0, 'hpa_coef2': -0.067, 'total_seen_30m': 1.0, 'int2': 6.9238, 'pct_remaining30m': 0.0, 'gasprice': 180.0, 'pct_mined_5m': null, 'total_seen_5m': null, 'pct_mined_30m': 100.0, 'tx_atabove_coef': 0.0006, 'average': 600, 'safelow': 600, 'nomine': 550, 'expectedTime': 0.52, 'avgdiff': 1, 'expectedWait': 2.0659703104, 'avgdiff_coef': -1.6459, 'hpa_coef': -0.0243}]), - gasExpress: JSON.stringify({'safeLow': 2.0, 'standard': 3.0, 'fast': 10.0, 'fastest': 52.0, 'block_time': 15, 'blockNum': 6693030}), - metametrics: JSON.stringify({ 'mockMetaMetricsResponse': true }), -} diff --git a/test/e2e/beta/from-import-beta-ui.spec.js b/test/e2e/beta/from-import-beta-ui.spec.js deleted file mode 100644 index 625330dbbedb..000000000000 --- a/test/e2e/beta/from-import-beta-ui.spec.js +++ /dev/null @@ -1,398 +0,0 @@ -const path = require('path') -const assert = require('assert') -const webdriver = require('selenium-webdriver') -const { By, Key, until } = webdriver -const { - delay, - buildChromeWebDriver, - buildFirefoxWebdriver, - installWebExt, - getExtensionIdChrome, - getExtensionIdFirefox, -} = require('../func') -const { - checkBrowserForConsoleErrors, - closeAllWindowHandlesExcept, - verboseReportOnFailure, - findElement, - findElements, -} = require('./helpers') -const fetchMockResponses = require('./fetch-mocks.js') - - -describe('Using MetaMask with an existing account', function () { - let extensionId - let driver - - const testSeedPhrase = 'forum vessel pink push lonely enact gentle tail admit parrot grunt dress' - const testAddress = '0x0Cc5261AB8cE458dc977078A3623E2BaDD27afD3' - const testPrivateKey2 = '14abe6f4aab7f9f626fe981c864d0adeb5685f289ac9270c27b8fd790b4235d6' - const testPrivateKey3 = 'F4EC2590A0C10DE95FBF4547845178910E40F5035320C516A18C117DE02B5669' - const tinyDelayMs = 200 - const regularDelayMs = 1000 - const largeDelayMs = regularDelayMs * 2 - - this.timeout(0) - this.bail(true) - - before(async function () { - let extensionUrl - switch (process.env.SELENIUM_BROWSER) { - case 'chrome': { - const extensionPath = path.resolve('dist/chrome') - driver = buildChromeWebDriver(extensionPath) - extensionId = await getExtensionIdChrome(driver) - await delay(regularDelayMs) - extensionUrl = `chrome-extension://${extensionId}/home.html` - break - } - case 'firefox': { - const extensionPath = path.resolve('dist/firefox') - driver = buildFirefoxWebdriver() - await installWebExt(driver, extensionPath) - await delay(regularDelayMs) - extensionId = await getExtensionIdFirefox(driver) - extensionUrl = `moz-extension://${extensionId}/home.html` - break - } - } - // Depending on the state of the application built into the above directory (extPath) and the value of - // METAMASK_DEBUG we will see different post-install behaviour and possibly some extra windows. Here we - // are closing any extraneous windows to reset us to a single window before continuing. - const [tab1] = await driver.getAllWindowHandles() - await closeAllWindowHandlesExcept(driver, [tab1]) - await driver.switchTo().window(tab1) - await driver.get(extensionUrl) - }) - - beforeEach(async function () { - await driver.executeScript( - 'window.origFetch = window.fetch.bind(window);' + - 'window.fetch = ' + - '(...args) => { ' + - 'if (args[0] === "https://ethgasstation.info/json/ethgasAPI.json") { return ' + - 'Promise.resolve({ json: () => Promise.resolve(JSON.parse(\'' + fetchMockResponses.ethGasBasic + '\')) }); } else if ' + - '(args[0] === "https://ethgasstation.info/json/predictTable.json") { return ' + - 'Promise.resolve({ json: () => Promise.resolve(JSON.parse(\'' + fetchMockResponses.ethGasPredictTable + '\')) }); } else if ' + - '(args[0].match(/chromeextensionmm/)) { return ' + - 'Promise.resolve({ json: () => Promise.resolve(JSON.parse(\'' + fetchMockResponses.metametrics + '\')) }); } else if ' + - '(args[0] === "https://dev.blockscale.net/api/gasexpress.json") { return ' + - 'Promise.resolve({ json: () => Promise.resolve(JSON.parse(\'' + fetchMockResponses.gasExpress + '\')) }); } ' + - 'return window.origFetch(...args); };' + - 'function cancelInfuraRequest(requestDetails) {' + - 'console.log("Canceling: " + requestDetails.url);' + - 'return {' + - 'cancel: true' + - '};' + - ' }' + - 'window.chrome && window.chrome.webRequest && window.chrome.webRequest.onBeforeRequest.addListener(' + - 'cancelInfuraRequest,' + - '{urls: ["https://*.infura.io/*"]},' + - '["blocking"]' + - ');' - ) - }) - - afterEach(async function () { - if (process.env.SELENIUM_BROWSER === 'chrome') { - const errors = await checkBrowserForConsoleErrors(driver) - if (errors.length) { - const errorReports = errors.map(err => err.message) - const errorMessage = `Errors found in browser console:\n${errorReports.join('\n')}` - console.error(new Error(errorMessage)) - } - } - if (this.currentTest.state === 'failed') { - await verboseReportOnFailure(driver, this.currentTest) - } - }) - - after(async function () { - await driver.quit() - }) - - describe('First time flow starting from an existing seed phrase', () => { - it('clicks the continue button on the welcome screen', async () => { - await findElement(driver, By.css('.welcome-page__header')) - const welcomeScreenBtn = await findElement(driver, By.css('.first-time-flow__button')) - welcomeScreenBtn.click() - await delay(largeDelayMs) - }) - - it('clicks the "Import Wallet" option', async () => { - const customRpcButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Import Wallet')]`)) - customRpcButton.click() - await delay(largeDelayMs) - }) - - it('clicks the "No thanks" option on the metametrics opt-in screen', async () => { - const optOutButton = await findElement(driver, By.css('.btn-default')) - optOutButton.click() - await delay(largeDelayMs) - }) - - it('imports a seed phrase', async () => { - const [seedTextArea] = await findElements(driver, By.css('textarea.first-time-flow__textarea')) - await seedTextArea.sendKeys(testSeedPhrase) - await delay(regularDelayMs) - - const [password] = await findElements(driver, By.id('password')) - await password.sendKeys('correct horse battery staple') - const [confirmPassword] = await findElements(driver, By.id('confirm-password')) - confirmPassword.sendKeys('correct horse battery staple') - - const tosCheckBox = await findElement(driver, By.css('.first-time-flow__checkbox')) - await tosCheckBox.click() - - const [importButton] = await findElements(driver, By.xpath(`//button[contains(text(), 'Import')]`)) - await importButton.click() - await delay(regularDelayMs) - }) - - it('clicks through the success screen', async () => { - await findElement(driver, By.xpath(`//div[contains(text(), 'Congratulations')]`)) - const doneButton = await findElement(driver, By.css('button.first-time-flow__button')) - await doneButton.click() - await delay(regularDelayMs) - }) - }) - - describe('Show account information', () => { - it('shows the correct account address', async () => { - await driver.findElement(By.css('.wallet-view__details-button')).click() - await driver.findElement(By.css('.qr-wrapper')).isDisplayed() - await delay(regularDelayMs) - - const [address] = await findElements(driver, By.css('input.qr-ellip-address')) - assert.equal(await address.getAttribute('value'), testAddress) - - await driver.executeScript("document.querySelector('.account-modal-close').click()") - await delay(largeDelayMs) - }) - - it('shows a QR code for the account', async () => { - await driver.findElement(By.css('.wallet-view__details-button')).click() - await driver.findElement(By.css('.qr-wrapper')).isDisplayed() - const detailModal = await driver.findElement(By.css('span .modal')) - await delay(regularDelayMs) - - await driver.executeScript("document.querySelector('.account-modal-close').click()") - await driver.wait(until.stalenessOf(detailModal)) - await delay(regularDelayMs) - }) - }) - - describe('Log out and log back in', () => { - it('logs out of the account', async () => { - const accountIdenticon = driver.findElement(By.css('.account-menu__icon .identicon')) - accountIdenticon.click() - await delay(regularDelayMs) - - const [logoutButton] = await findElements(driver, By.css('.account-menu__logout-button')) - assert.equal(await logoutButton.getText(), 'Log out') - await logoutButton.click() - await delay(regularDelayMs) - }) - - it('accepts the account password after lock', async () => { - await driver.findElement(By.id('password')).sendKeys('correct horse battery staple') - await driver.findElement(By.id('password')).sendKeys(Key.ENTER) - await delay(largeDelayMs) - }) - }) - - describe('Add an account', () => { - it('switches to localhost', async () => { - const networkDropdown = await findElement(driver, By.css('.network-name')) - await networkDropdown.click() - await delay(regularDelayMs) - - const [localhost] = await findElements(driver, By.xpath(`//span[contains(text(), 'Localhost')]`)) - await localhost.click() - await delay(largeDelayMs) - }) - - it('choose Create Account from the account menu', async () => { - await driver.findElement(By.css('.account-menu__icon')).click() - await delay(regularDelayMs) - - const [createAccount] = await findElements(driver, By.xpath(`//div[contains(text(), 'Create Account')]`)) - await createAccount.click() - await delay(regularDelayMs) - }) - - it('set account name', async () => { - const [accountName] = await findElements(driver, By.css('.new-account-create-form input')) - await accountName.sendKeys('2nd account') - await delay(regularDelayMs) - - const [createButton] = await findElements(driver, By.xpath(`//button[contains(text(), 'Create')]`)) - await createButton.click() - await delay(regularDelayMs) - }) - - it('should show the correct account name', async () => { - const [accountName] = await findElements(driver, By.css('.account-name')) - assert.equal(await accountName.getText(), '2nd account') - await delay(regularDelayMs) - }) - }) - - describe('Switch back to original account', () => { - it('chooses the original account from the account menu', async () => { - await driver.findElement(By.css('.account-menu__icon')).click() - await delay(regularDelayMs) - - const [originalAccountMenuItem] = await findElements(driver, By.css('.account-menu__name')) - await originalAccountMenuItem.click() - await delay(regularDelayMs) - }) - }) - - describe('Send ETH from inside MetaMask', () => { - it('starts a send transaction', async function () { - const sendButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Send')]`)) - await sendButton.click() - await delay(regularDelayMs) - - const inputAddress = await findElement(driver, By.css('input[placeholder="Recipient Address"]')) - const inputAmount = await findElement(driver, By.css('.unit-input__input')) - await inputAddress.sendKeys('0x2f318C334780961FB129D2a6c30D0763d9a5C970') - await inputAmount.sendKeys('1') - - // Set the gas limit - const configureGas = await findElement(driver, By.css('.advanced-gas-options-btn')) - await configureGas.click() - await delay(regularDelayMs) - - const gasModal = await driver.findElement(By.css('span .modal')) - const save = await findElement(driver, By.xpath(`//button[contains(text(), 'Save')]`)) - await save.click() - await driver.wait(until.stalenessOf(gasModal)) - await delay(regularDelayMs) - - // Continue to next screen - const nextScreen = await findElement(driver, By.xpath(`//button[contains(text(), 'Next')]`)) - await nextScreen.click() - await delay(regularDelayMs) - }) - - it('confirms the transaction', async function () { - const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`)) - await confirmButton.click() - await delay(regularDelayMs) - }) - - it('finds the transaction in the transactions list', async function () { - const transactions = await findElements(driver, By.css('.transaction-list-item')) - assert.equal(transactions.length, 1) - - const txValues = await findElements(driver, By.css('.transaction-list-item__amount--primary')) - assert.equal(txValues.length, 1) - assert.ok(/-1\s*ETH/.test(await txValues[0].getText())) - }) - }) - - describe('Imports an account with private key', () => { - it('choose Create Account from the account menu', async () => { - await driver.findElement(By.css('.account-menu__icon')).click() - await delay(regularDelayMs) - - const [importAccount] = await findElements(driver, By.xpath(`//div[contains(text(), 'Import Account')]`)) - await importAccount.click() - await delay(regularDelayMs) - }) - - it('enter private key', async () => { - const privateKeyInput = await findElement(driver, By.css('#private-key-box')) - await privateKeyInput.sendKeys(testPrivateKey2) - await delay(regularDelayMs) - const importButtons = await findElements(driver, By.xpath(`//button[contains(text(), 'Import')]`)) - await importButtons[0].click() - await delay(regularDelayMs) - }) - - it('should show the correct account name', async () => { - const [accountName] = await findElements(driver, By.css('.account-name')) - assert.equal(await accountName.getText(), 'Account 4') - await delay(regularDelayMs) - }) - - it('should show the imported label', async () => { - const [importedLabel] = await findElements(driver, By.css('.wallet-view__keyring-label')) - assert.equal(await importedLabel.getText(), 'IMPORTED') - await delay(regularDelayMs) - }) - }) - - describe('Imports and removes an account', () => { - it('choose Create Account from the account menu', async () => { - await driver.findElement(By.css('.account-menu__icon')).click() - await delay(regularDelayMs) - - const [importAccount] = await findElements(driver, By.xpath(`//div[contains(text(), 'Import Account')]`)) - await importAccount.click() - await delay(regularDelayMs) - }) - - it('enter private key', async () => { - const privateKeyInput = await findElement(driver, By.css('#private-key-box')) - await privateKeyInput.sendKeys(testPrivateKey3) - await delay(regularDelayMs) - const importButtons = await findElements(driver, By.xpath(`//button[contains(text(), 'Import')]`)) - await importButtons[0].click() - await delay(regularDelayMs) - }) - - it('should open the remove account modal', async () => { - const [accountName] = await findElements(driver, By.css('.account-name')) - assert.equal(await accountName.getText(), 'Account 5') - await delay(regularDelayMs) - - await driver.findElement(By.css('.account-menu__icon')).click() - await delay(regularDelayMs) - - const accountListItems = await findElements(driver, By.css('.account-menu__account')) - assert.equal(accountListItems.length, 5) - - const removeAccountIcons = await findElements(driver, By.css('.remove-account-icon')) - await removeAccountIcons[1].click() - await delay(tinyDelayMs) - - await findElement(driver, By.css('.confirm-remove-account__account')) - }) - - it('should remove the account', async () => { - const removeButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Remove')]`)) - await removeButton.click() - - await delay(regularDelayMs) - - const [accountName] = await findElements(driver, By.css('.account-name')) - assert.equal(await accountName.getText(), 'Account 1') - await delay(regularDelayMs) - - const accountListItems = await findElements(driver, By.css('.account-menu__account')) - assert.equal(accountListItems.length, 4) - }) - }) - - describe('Connects to a Hardware wallet', () => { - it('choose Connect Hardware Wallet from the account menu', async () => { - const [connectAccount] = await findElements(driver, By.xpath(`//div[contains(text(), 'Connect Hardware Wallet')]`)) - await connectAccount.click() - await delay(regularDelayMs) - }) - - it('should open the TREZOR Connect popup', async () => { - const trezorButton = await findElements(driver, By.css('.hw-connect__btn')) - await trezorButton[1].click() - await delay(regularDelayMs) - const connectButtons = await findElements(driver, By.xpath(`//button[contains(text(), 'Connect')]`)) - await connectButtons[0].click() - await delay(regularDelayMs) - const allWindows = await driver.getAllWindowHandles() - assert.equal(allWindows.length, 2) - }) - }) -}) diff --git a/test/e2e/beta/helpers.js b/test/e2e/beta/helpers.js deleted file mode 100644 index b6fc35e08572..000000000000 --- a/test/e2e/beta/helpers.js +++ /dev/null @@ -1,167 +0,0 @@ -const fs = require('fs') -const mkdirp = require('mkdirp') -const pify = require('pify') -const assert = require('assert') -const { delay } = require('../func') -const { until } = require('selenium-webdriver') - -module.exports = { - assertElementNotPresent, - checkBrowserForConsoleErrors, - closeAllWindowHandlesExcept, - findElement, - findElements, - loadExtension, - openNewPage, - switchToWindowWithTitle, - switchToWindowWithUrlThatMatches, - verboseReportOnFailure, - waitUntilXWindowHandles, -} - -async function loadExtension (driver, extensionId) { - switch (process.env.SELENIUM_BROWSER) { - case 'chrome': { - await driver.get(`chrome-extension://${extensionId}/home.html`) - break - } - case 'firefox': { - await driver.get(`moz-extension://${extensionId}/home.html`) - break - } - } -} - -async function checkBrowserForConsoleErrors (driver) { - const ignoredLogTypes = ['WARNING'] - const ignoredErrorMessages = [ - // React throws error warnings on "dataset", but still sets the data-* properties correctly - 'Warning: Unknown prop `dataset` on ', - // Third-party Favicon 404s show up as errors - 'favicon.ico - Failed to load resource: the server responded with a status of 404 (Not Found)', - // React Development build - known issue blocked by test build sys - 'Warning: It looks like you\'re using a minified copy of the development build of React.', - // Redux Development build - known issue blocked by test build sys - 'This means that you are running a slower development build of Redux.', - ] - const browserLogs = await driver.manage().logs().get('browser') - const errorEntries = browserLogs.filter(entry => !ignoredLogTypes.includes(entry.level.toString())) - const errorObjects = errorEntries.map(entry => entry.toJSON()) - return errorObjects.filter(entry => !ignoredErrorMessages.some(message => entry.message.includes(message))) -} - -async function verboseReportOnFailure (driver, test) { - let artifactDir - if (process.env.SELENIUM_BROWSER === 'chrome') { - artifactDir = `./test-artifacts/chrome/${test.title}` - } else if (process.env.SELENIUM_BROWSER === 'firefox') { - artifactDir = `./test-artifacts/firefox/${test.title}` - } - const filepathBase = `${artifactDir}/test-failure` - await pify(mkdirp)(artifactDir) - const screenshot = await driver.takeScreenshot() - await pify(fs.writeFile)(`${filepathBase}-screenshot.png`, screenshot, { encoding: 'base64' }) - const htmlSource = await driver.getPageSource() - await pify(fs.writeFile)(`${filepathBase}-dom.html`, htmlSource) -} - -async function findElement (driver, by, timeout = 10000) { - return driver.wait(until.elementLocated(by), timeout) -} - -async function findElements (driver, by, timeout = 10000) { - return driver.wait(until.elementsLocated(by), timeout) -} - -async function openNewPage (driver, url) { - await driver.executeScript('window.open()') - await delay(1000) - - const handles = await driver.getAllWindowHandles() - const lastHandle = handles[handles.length - 1] - await driver.switchTo().window(lastHandle) - - await driver.get(url) - await delay(1000) -} - -async function waitUntilXWindowHandles (driver, x, delayStep = 1000, timeout = 5000) { - let timeElapsed = 0 - async function _pollWindowHandles () { - const windowHandles = await driver.getAllWindowHandles() - if (windowHandles.length === x) { - return - } - await delay(delayStep) - timeElapsed += delayStep - if (timeElapsed > timeout) { - throw new Error('waitUntilXWindowHandles timed out polling window handles') - } else { - await _pollWindowHandles() - } - } - return await _pollWindowHandles() -} - -async function switchToWindowWithTitle (driver, title, windowHandles) { - if (!windowHandles) { - windowHandles = await driver.getAllWindowHandles() - } else if (windowHandles.length === 0) { - throw new Error('No window with title: ' + title) - } - const firstHandle = windowHandles[0] - await driver.switchTo().window(firstHandle) - const handleTitle = await driver.getTitle() - - if (handleTitle === title) { - return firstHandle - } else { - return await switchToWindowWithTitle(driver, title, windowHandles.slice(1)) - } -} - -/** - * Closes all windows except those in the given list of exceptions - * @param {object} driver the WebDriver instance - * @param {string|Array} exceptions the list of window handle exceptions - * @param {Array?} windowHandles the full list of window handles - * @returns {Promise} - */ -async function closeAllWindowHandlesExcept (driver, exceptions, windowHandles) { - exceptions = typeof exceptions === 'string' ? [ exceptions ] : exceptions - windowHandles = windowHandles || await driver.getAllWindowHandles() - const lastWindowHandle = windowHandles.pop() - if (!exceptions.includes(lastWindowHandle)) { - await driver.switchTo().window(lastWindowHandle) - await delay(1000) - await driver.close() - await delay(1000) - } - return windowHandles.length && await closeAllWindowHandlesExcept(driver, exceptions, windowHandles) -} - -async function assertElementNotPresent (webdriver, driver, by) { - let dataTab - try { - dataTab = await findElement(driver, by, 4000) - } catch (err) { - assert(err instanceof webdriver.error.NoSuchElementError || err instanceof webdriver.error.TimeoutError) - } - assert.ok(!dataTab, 'Found element that should not be present') -} - -async function switchToWindowWithUrlThatMatches (driver, regexp, windowHandles) { - if (!windowHandles) { - windowHandles = await driver.getAllWindowHandles() - } else if (windowHandles.length === 0) { - throw new Error('No window that matches: ' + regexp) - } - const firstHandle = windowHandles[0] - await driver.switchTo().window(firstHandle) - const windowUrl = await driver.getCurrentUrl() - if (windowUrl.match(regexp)) { - return firstHandle - } else { - return await switchToWindowWithUrlThatMatches(driver, regexp, windowHandles.slice(1)) - } -} diff --git a/test/e2e/beta/metamask-beta-responsive-ui.spec.js b/test/e2e/beta/metamask-beta-responsive-ui.spec.js deleted file mode 100644 index 9ef5605569c5..000000000000 --- a/test/e2e/beta/metamask-beta-responsive-ui.spec.js +++ /dev/null @@ -1,326 +0,0 @@ -const path = require('path') -const assert = require('assert') -const webdriver = require('selenium-webdriver') -const { By, until } = webdriver -const { - delay, - buildChromeWebDriver, - buildFirefoxWebdriver, - installWebExt, - getExtensionIdChrome, - getExtensionIdFirefox, -} = require('../func') -const { - checkBrowserForConsoleErrors, - closeAllWindowHandlesExcept, - findElement, - findElements, - loadExtension, - verboseReportOnFailure, -} = require('./helpers') -const fetchMockResponses = require('./fetch-mocks.js') - -describe('MetaMask', function () { - let extensionId - let driver - - const testSeedPhrase = 'phrase upgrade clock rough situate wedding elder clever doctor stamp excess tent' - const tinyDelayMs = 200 - const regularDelayMs = tinyDelayMs * 2 - const largeDelayMs = regularDelayMs * 2 - - this.timeout(0) - this.bail(true) - - before(async function () { - let extensionUrl - switch (process.env.SELENIUM_BROWSER) { - case 'chrome': { - const extPath = path.resolve('dist/chrome') - driver = buildChromeWebDriver(extPath, { responsive: true }) - extensionId = await getExtensionIdChrome(driver) - await delay(largeDelayMs) - extensionUrl = `chrome-extension://${extensionId}/home.html` - break - } - case 'firefox': { - const extPath = path.resolve('dist/firefox') - driver = buildFirefoxWebdriver({ responsive: true }) - await installWebExt(driver, extPath) - await delay(largeDelayMs) - extensionId = await getExtensionIdFirefox(driver) - extensionUrl = `moz-extension://${extensionId}/home.html` - break - } - } - // Depending on the state of the application built into the above directory (extPath) and the value of - // METAMASK_DEBUG we will see different post-install behaviour and possibly some extra windows. Here we - // are closing any extraneous windows to reset us to a single window before continuing. - const [tab1] = await driver.getAllWindowHandles() - await closeAllWindowHandlesExcept(driver, [tab1]) - await driver.switchTo().window(tab1) - await driver.get(extensionUrl) - }) - - beforeEach(async function () { - await driver.executeScript( - 'window.origFetch = window.fetch.bind(window);' + - 'window.fetch = ' + - '(...args) => { ' + - 'if (args[0] === "https://ethgasstation.info/json/ethgasAPI.json") { return ' + - 'Promise.resolve({ json: () => Promise.resolve(JSON.parse(\'' + fetchMockResponses.ethGasBasic + '\')) }); } else if ' + - '(args[0] === "https://ethgasstation.info/json/predictTable.json") { return ' + - 'Promise.resolve({ json: () => Promise.resolve(JSON.parse(\'' + fetchMockResponses.ethGasPredictTable + '\')) }); } else if ' + - '(args[0].match(/chromeextensionmm/)) { return ' + - 'Promise.resolve({ json: () => Promise.resolve(JSON.parse(\'' + fetchMockResponses.metametrics + '\')) }); } else if ' + - '(args[0] === "https://dev.blockscale.net/api/gasexpress.json") { return ' + - 'Promise.resolve({ json: () => Promise.resolve(JSON.parse(\'' + fetchMockResponses.gasExpress + '\')) }); } ' + - 'return window.origFetch(...args); };' + - 'function cancelInfuraRequest(requestDetails) {' + - 'console.log("Canceling: " + requestDetails.url);' + - 'return {' + - 'cancel: true' + - '};' + - ' }' + - 'window.chrome && window.chrome.webRequest && window.chrome.webRequest.onBeforeRequest.addListener(' + - 'cancelInfuraRequest,' + - '{urls: ["https://*.infura.io/*"]},' + - '["blocking"]' + - ');' - ) - }) - - afterEach(async function () { - if (process.env.SELENIUM_BROWSER === 'chrome') { - const errors = await checkBrowserForConsoleErrors(driver) - if (errors.length) { - const errorReports = errors.map(err => err.message) - const errorMessage = `Errors found in browser console:\n${errorReports.join('\n')}` - console.error(new Error(errorMessage)) - } - } - if (this.currentTest.state === 'failed') { - await verboseReportOnFailure(driver, this.currentTest) - } - }) - - after(async function () { - await driver.quit() - }) - - describe('Going through the first time flow', () => { - it('clicks the continue button on the welcome screen', async () => { - await findElement(driver, By.css('.welcome-page__header')) - const welcomeScreenBtn = await findElement(driver, By.css('.first-time-flow__button')) - welcomeScreenBtn.click() - await delay(largeDelayMs) - }) - - it('clicks the "Create New Wallet" option', async () => { - const customRpcButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Create a Wallet')]`)) - customRpcButton.click() - await delay(largeDelayMs) - }) - - it('clicks the "I agree" option on the metametrics opt-in screen', async () => { - const optOutButton = await findElement(driver, By.css('.btn-primary')) - optOutButton.click() - await delay(largeDelayMs) - }) - - it('accepts a secure password', async () => { - const passwordBox = await findElement(driver, By.css('.first-time-flow__form #create-password')) - const passwordBoxConfirm = await findElement(driver, By.css('.first-time-flow__form #confirm-password')) - const button = await findElement(driver, By.css('.first-time-flow__form button')) - - await passwordBox.sendKeys('correct horse battery staple') - await passwordBoxConfirm.sendKeys('correct horse battery staple') - - const tosCheckBox = await findElement(driver, By.css('.first-time-flow__checkbox')) - await tosCheckBox.click() - - await button.click() - await delay(regularDelayMs) - }) - - let seedPhrase - - it('reveals the seed phrase', async () => { - const byRevealButton = By.css('.reveal-seed-phrase__secret-blocker .reveal-seed-phrase__reveal-button') - await driver.wait(until.elementLocated(byRevealButton, 10000)) - const revealSeedPhraseButton = await findElement(driver, byRevealButton, 10000) - await revealSeedPhraseButton.click() - await delay(regularDelayMs) - - seedPhrase = await driver.findElement(By.css('.reveal-seed-phrase__secret-words')).getText() - assert.equal(seedPhrase.split(' ').length, 12) - await delay(regularDelayMs) - - const nextScreen = await findElement(driver, By.css('button.first-time-flow__button')) - await nextScreen.click() - await delay(regularDelayMs) - }) - - async function clickWordAndWait (word) { - const xpath = `//div[contains(@class, 'confirm-seed-phrase__seed-word--shuffled') and not(contains(@class, 'confirm-seed-phrase__seed-word--selected')) and contains(text(), '${word}')]` - const word0 = await findElement(driver, By.xpath(xpath), 10000) - - await word0.click() - await delay(tinyDelayMs) - } - - async function retypeSeedPhrase (words, wasReloaded, count = 0) { - try { - if (wasReloaded) { - const byRevealButton = By.css('.reveal-seed-phrase__secret-blocker .reveal-seed-phrase__reveal-button') - await driver.wait(until.elementLocated(byRevealButton, 10000)) - const revealSeedPhraseButton = await findElement(driver, byRevealButton, 10000) - await revealSeedPhraseButton.click() - await delay(regularDelayMs) - - const nextScreen = await findElement(driver, By.css('button.first-time-flow__button')) - await nextScreen.click() - await delay(regularDelayMs) - } - - for (let i = 0; i < 12; i++) { - await clickWordAndWait(words[i]) - } - } catch (e) { - if (count > 2) { - throw e - } else { - await loadExtension(driver, extensionId) - await retypeSeedPhrase(words, true, count + 1) - } - } - } - - it('can retype the seed phrase', async () => { - const words = seedPhrase.split(' ') - - await retypeSeedPhrase(words) - - const confirm = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`)) - await confirm.click() - await delay(regularDelayMs) - }) - - it('clicks through the success screen', async () => { - await findElement(driver, By.xpath(`//div[contains(text(), 'Congratulations')]`)) - const doneButton = await findElement(driver, By.css('button.first-time-flow__button')) - await doneButton.click() - await delay(regularDelayMs) - }) - }) - - describe('Show account information', () => { - it('show account details dropdown menu', async () => { - await driver.findElement(By.css('div.menu-bar__open-in-browser')).click() - const options = await driver.findElements(By.css('div.menu.account-details-dropdown div.menu__item')) - assert.equal(options.length, 3) // HD Wallet type does not have to show the Remove Account option - await delay(regularDelayMs) - }) - }) - - describe('Import seed phrase', () => { - it('logs out of the vault', async () => { - await driver.findElement(By.css('.account-menu__icon')).click() - await delay(regularDelayMs) - - const logoutButton = await findElement(driver, By.css('.account-menu__logout-button')) - assert.equal(await logoutButton.getText(), 'Log out') - await logoutButton.click() - await delay(regularDelayMs) - }) - - it('imports seed phrase', async () => { - const restoreSeedLink = await findElement(driver, By.css('.unlock-page__link--import')) - assert.equal(await restoreSeedLink.getText(), 'Import using account seed phrase') - await restoreSeedLink.click() - await delay(regularDelayMs) - - const seedTextArea = await findElement(driver, By.css('textarea')) - await seedTextArea.sendKeys(testSeedPhrase) - await delay(regularDelayMs) - - const passwordInputs = await driver.findElements(By.css('input')) - await delay(regularDelayMs) - - await passwordInputs[0].sendKeys('correct horse battery staple') - await passwordInputs[1].sendKeys('correct horse battery staple') - await driver.findElement(By.css('.first-time-flow__button')).click() - await delay(regularDelayMs) - }) - - it('switches to localhost', async () => { - const networkDropdown = await findElement(driver, By.css('.network-name')) - await networkDropdown.click() - await delay(regularDelayMs) - - const [localhost] = await findElements(driver, By.xpath(`//span[contains(text(), 'Localhost')]`)) - await localhost.click() - await delay(largeDelayMs * 2) - }) - - it('balance renders', async () => { - const balance = await findElement(driver, By.css('.transaction-view-balance__primary-balance')) - await driver.wait(until.elementTextMatches(balance, /100\s*ETH/)) - await delay(regularDelayMs) - }) - }) - - describe('Send ETH from inside MetaMask', () => { - it('starts to send a transaction', async function () { - const sendButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Send')]`)) - await sendButton.click() - await delay(regularDelayMs) - - const inputAddress = await findElement(driver, By.css('input[placeholder="Recipient Address"]')) - const inputAmount = await findElement(driver, By.css('.unit-input__input')) - await inputAddress.sendKeys('0x2f318C334780961FB129D2a6c30D0763d9a5C970') - await inputAmount.sendKeys('1') - - const inputValue = await inputAmount.getAttribute('value') - assert.equal(inputValue, '1') - await delay(regularDelayMs) - }) - - it('opens and closes the gas modal', async function () { - // Set the gas limit - const configureGas = await findElement(driver, By.css('.advanced-gas-options-btn')) - await configureGas.click() - await delay(regularDelayMs) - - const gasModal = await driver.findElement(By.css('span .modal')) - - const save = await findElement(driver, By.css('.page-container__header-close-text')) - await save.click() - await driver.wait(until.stalenessOf(gasModal), 10000) - await delay(regularDelayMs) - }) - - it('clicks through to the confirm screen', async function () { - // Continue to next screen - const nextScreen = await findElement(driver, By.xpath(`//button[contains(text(), 'Next')]`)) - await nextScreen.click() - await delay(regularDelayMs) - }) - - it('confirms the transaction', async function () { - const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`)) - await confirmButton.click() - await delay(largeDelayMs) - }) - - it('finds the transaction in the transactions list', async function () { - const transactions = await findElements(driver, By.css('.transaction-list-item')) - assert.equal(transactions.length, 1) - - if (process.env.SELENIUM_BROWSER !== 'firefox') { - const txValues = await findElement(driver, By.css('.transaction-list-item__amount--primary')) - await driver.wait(until.elementTextMatches(txValues, /-1\s*ETH/), 10000) - } - }) - }) -}) diff --git a/test/e2e/beta/metamask-beta-ui.spec.js b/test/e2e/beta/metamask-beta-ui.spec.js deleted file mode 100644 index b0ec25cd906a..000000000000 --- a/test/e2e/beta/metamask-beta-ui.spec.js +++ /dev/null @@ -1,1542 +0,0 @@ -const path = require('path') -const assert = require('assert') -const webdriver = require('selenium-webdriver') -const { By, Key, until } = webdriver -const { - delay, - buildChromeWebDriver, - buildFirefoxWebdriver, - installWebExt, - getExtensionIdChrome, - getExtensionIdFirefox, -} = require('../func') -const { - assertElementNotPresent, - checkBrowserForConsoleErrors, - closeAllWindowHandlesExcept, - findElement, - findElements, - loadExtension, - openNewPage, - switchToWindowWithTitle, - verboseReportOnFailure, - waitUntilXWindowHandles, -} = require('./helpers') -const fetchMockResponses = require('./fetch-mocks.js') - -describe('MetaMask', function () { - let extensionId - let driver - let tokenAddress - - const testSeedPhrase = 'phrase upgrade clock rough situate wedding elder clever doctor stamp excess tent' - const tinyDelayMs = 200 - const regularDelayMs = tinyDelayMs * 2 - const largeDelayMs = regularDelayMs * 2 - - this.timeout(0) - this.bail(true) - - before(async function () { - let extensionUrl - switch (process.env.SELENIUM_BROWSER) { - case 'chrome': { - const extPath = path.resolve('dist/chrome') - driver = buildChromeWebDriver(extPath) - extensionId = await getExtensionIdChrome(driver) - await delay(largeDelayMs) - extensionUrl = `chrome-extension://${extensionId}/home.html` - break - } - case 'firefox': { - const extPath = path.resolve('dist/firefox') - driver = buildFirefoxWebdriver() - await installWebExt(driver, extPath) - await delay(largeDelayMs) - extensionId = await getExtensionIdFirefox(driver) - extensionUrl = `moz-extension://${extensionId}/home.html` - break - } - } - // Depending on the state of the application built into the above directory (extPath) and the value of - // METAMASK_DEBUG we will see different post-install behaviour and possibly some extra windows. Here we - // are closing any extraneous windows to reset us to a single window before continuing. - const [tab1] = await driver.getAllWindowHandles() - await closeAllWindowHandlesExcept(driver, [tab1]) - await driver.switchTo().window(tab1) - await driver.get(extensionUrl) - }) - - beforeEach(async function () { - await driver.executeScript( - 'window.origFetch = window.fetch.bind(window);' + - 'window.fetch = ' + - '(...args) => { ' + - 'if (args[0] === "https://ethgasstation.info/json/ethgasAPI.json") { return ' + - 'Promise.resolve({ json: () => Promise.resolve(JSON.parse(\'' + fetchMockResponses.ethGasBasic + '\')) }); } else if ' + - '(args[0] === "https://ethgasstation.info/json/predictTable.json") { return ' + - 'Promise.resolve({ json: () => Promise.resolve(JSON.parse(\'' + fetchMockResponses.ethGasPredictTable + '\')) }); } else if ' + - '(args[0].match(/chromeextensionmm/)) { return ' + - 'Promise.resolve({ json: () => Promise.resolve(JSON.parse(\'' + fetchMockResponses.metametrics + '\')) }); } else if ' + - '(args[0] === "https://dev.blockscale.net/api/gasexpress.json") { return ' + - 'Promise.resolve({ json: () => Promise.resolve(JSON.parse(\'' + fetchMockResponses.gasExpress + '\')) }); } ' + - 'return window.origFetch(...args); };' + - 'function cancelInfuraRequest(requestDetails) {' + - 'console.log("Canceling: " + requestDetails.url);' + - 'return {' + - 'cancel: true' + - '};' + - ' }' + - 'window.chrome && window.chrome.webRequest && window.chrome.webRequest.onBeforeRequest.addListener(' + - 'cancelInfuraRequest,' + - '{urls: ["https://*.infura.io/*"]},' + - '["blocking"]' + - ');' - ) - }) - - afterEach(async function () { - if (process.env.SELENIUM_BROWSER === 'chrome') { - const errors = await checkBrowserForConsoleErrors(driver) - if (errors.length) { - const errorReports = errors.map(err => err.message) - const errorMessage = `Errors found in browser console:\n${errorReports.join('\n')}` - console.error(new Error(errorMessage)) - } - } - if (this.currentTest.state === 'failed') { - await verboseReportOnFailure(driver, this.currentTest) - } - }) - - after(async function () { - await driver.quit() - }) - - describe('Going through the first time flow', () => { - it('clicks the continue button on the welcome screen', async () => { - await findElement(driver, By.css('.welcome-page__header')) - const welcomeScreenBtn = await findElement(driver, By.css('.first-time-flow__button')) - welcomeScreenBtn.click() - await delay(largeDelayMs) - }) - - it('clicks the "Create New Wallet" option', async () => { - const customRpcButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Create a Wallet')]`)) - customRpcButton.click() - await delay(largeDelayMs) - }) - - it('clicks the "No thanks" option on the metametrics opt-in screen', async () => { - const optOutButton = await findElement(driver, By.css('.btn-default')) - optOutButton.click() - await delay(largeDelayMs) - }) - - it('accepts a secure password', async () => { - const passwordBox = await findElement(driver, By.css('.first-time-flow__form #create-password')) - const passwordBoxConfirm = await findElement(driver, By.css('.first-time-flow__form #confirm-password')) - const button = await findElement(driver, By.css('.first-time-flow__form button')) - - await passwordBox.sendKeys('correct horse battery staple') - await passwordBoxConfirm.sendKeys('correct horse battery staple') - - const tosCheckBox = await findElement(driver, By.css('.first-time-flow__checkbox')) - await tosCheckBox.click() - - await button.click() - await delay(regularDelayMs) - }) - - let seedPhrase - - it('reveals the seed phrase', async () => { - const byRevealButton = By.css('.reveal-seed-phrase__secret-blocker .reveal-seed-phrase__reveal-button') - await driver.wait(until.elementLocated(byRevealButton, 10000)) - const revealSeedPhraseButton = await findElement(driver, byRevealButton, 10000) - await revealSeedPhraseButton.click() - await delay(regularDelayMs) - - seedPhrase = await driver.findElement(By.css('.reveal-seed-phrase__secret-words')).getText() - assert.equal(seedPhrase.split(' ').length, 12) - await delay(regularDelayMs) - - const nextScreen = await findElement(driver, By.css('button.first-time-flow__button')) - await nextScreen.click() - await delay(regularDelayMs) - }) - - async function clickWordAndWait (word) { - const xpath = `//div[contains(@class, 'confirm-seed-phrase__seed-word--shuffled') and not(contains(@class, 'confirm-seed-phrase__seed-word--selected')) and contains(text(), '${word}')]` - const word0 = await findElement(driver, By.xpath(xpath), 10000) - - await word0.click() - await delay(tinyDelayMs) - } - - async function retypeSeedPhrase (words, wasReloaded, count = 0) { - try { - if (wasReloaded) { - const byRevealButton = By.css('.reveal-seed-phrase__secret-blocker .reveal-seed-phrase__reveal-button') - await driver.wait(until.elementLocated(byRevealButton, 10000)) - const revealSeedPhraseButton = await findElement(driver, byRevealButton, 10000) - await revealSeedPhraseButton.click() - await delay(regularDelayMs) - - const nextScreen = await findElement(driver, By.css('button.first-time-flow__button')) - await nextScreen.click() - await delay(regularDelayMs) - } - - for (let i = 0; i < 12; i++) { - await clickWordAndWait(words[i]) - } - } catch (e) { - if (count > 2) { - throw e - } else { - await loadExtension(driver, extensionId) - await retypeSeedPhrase(words, true, count + 1) - } - } - } - - it('can retype the seed phrase', async () => { - const words = seedPhrase.split(' ') - - await retypeSeedPhrase(words) - - const confirm = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`)) - await confirm.click() - await delay(regularDelayMs) - }) - - it('clicks through the success screen', async () => { - await findElement(driver, By.xpath(`//div[contains(text(), 'Congratulations')]`)) - const doneButton = await findElement(driver, By.css('button.first-time-flow__button')) - await doneButton.click() - await delay(regularDelayMs) - }) - }) - - describe('Show account information', () => { - it('shows the QR code for the account', async () => { - await driver.findElement(By.css('.wallet-view__details-button')).click() - await driver.findElement(By.css('.qr-wrapper')).isDisplayed() - await delay(regularDelayMs) - - const accountModal = await driver.findElement(By.css('span .modal')) - - await driver.executeScript("document.querySelector('.account-modal-close').click()") - - await driver.wait(until.stalenessOf(accountModal)) - await delay(regularDelayMs) - }) - }) - - describe('Log out an log back in', () => { - it('logs out of the account', async () => { - await driver.findElement(By.css('.account-menu__icon')).click() - await delay(regularDelayMs) - - const logoutButton = await findElement(driver, By.css('.account-menu__logout-button')) - assert.equal(await logoutButton.getText(), 'Log out') - await logoutButton.click() - await delay(regularDelayMs) - }) - - it('accepts the account password after lock', async () => { - await driver.findElement(By.id('password')).sendKeys('correct horse battery staple') - await driver.findElement(By.id('password')).sendKeys(Key.ENTER) - await delay(largeDelayMs * 4) - }) - }) - - describe('Add account', () => { - it('choose Create Account from the account menu', async () => { - await driver.findElement(By.css('.account-menu__icon')).click() - await delay(regularDelayMs) - - const createAccount = await findElement(driver, By.xpath(`//div[contains(text(), 'Create Account')]`)) - await createAccount.click() - await delay(regularDelayMs) - }) - - it('set account name', async () => { - const accountName = await findElement(driver, By.css('.new-account-create-form input')) - await accountName.sendKeys('2nd account') - await delay(regularDelayMs) - - const create = await findElement(driver, By.xpath(`//button[contains(text(), 'Create')]`)) - await create.click() - await delay(largeDelayMs) - }) - - it('should display correct account name', async () => { - const accountName = await findElement(driver, By.css('.account-name')) - assert.equal(await accountName.getText(), '2nd account') - await delay(regularDelayMs) - }) - }) - - describe('Import seed phrase', () => { - it('logs out of the vault', async () => { - await driver.findElement(By.css('.account-menu__icon')).click() - await delay(regularDelayMs) - - const logoutButton = await findElement(driver, By.css('.account-menu__logout-button')) - assert.equal(await logoutButton.getText(), 'Log out') - await logoutButton.click() - await delay(regularDelayMs) - }) - - it('imports seed phrase', async () => { - const restoreSeedLink = await findElement(driver, By.css('.unlock-page__link--import')) - assert.equal(await restoreSeedLink.getText(), 'Import using account seed phrase') - await restoreSeedLink.click() - await delay(regularDelayMs) - - const seedTextArea = await findElement(driver, By.css('textarea')) - await seedTextArea.sendKeys(testSeedPhrase) - await delay(regularDelayMs) - - const passwordInputs = await driver.findElements(By.css('input')) - await delay(regularDelayMs) - - await passwordInputs[0].sendKeys('correct horse battery staple') - await passwordInputs[1].sendKeys('correct horse battery staple') - await driver.findElement(By.css('.first-time-flow__button')).click() - await delay(regularDelayMs) - }) - - it('balance renders', async () => { - const balance = await findElement(driver, By.css('.balance-display .token-amount')) - await driver.wait(until.elementTextMatches(balance, /100\s*ETH/)) - await delay(regularDelayMs) - }) - }) - - describe('Send ETH from inside MetaMask using default gas', () => { - it('starts a send transaction', async function () { - const sendButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Send')]`)) - await sendButton.click() - await delay(regularDelayMs) - - const inputAddress = await findElement(driver, By.css('input[placeholder="Recipient Address"]')) - const inputAmount = await findElement(driver, By.css('.unit-input__input')) - await inputAddress.sendKeys('0x2f318C334780961FB129D2a6c30D0763d9a5C970') - await inputAmount.sendKeys('1') - - const inputValue = await inputAmount.getAttribute('value') - assert.equal(inputValue, '1') - await delay(regularDelayMs) - - // Continue to next screen - const nextScreen = await findElement(driver, By.xpath(`//button[contains(text(), 'Next')]`)) - await nextScreen.click() - await delay(regularDelayMs) - }) - - it('confirms the transaction', async function () { - const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`)) - await confirmButton.click() - await delay(largeDelayMs * 2) - }) - - it('finds the transaction in the transactions list', async function () { - const transactions = await findElements(driver, By.css('.transaction-list-item')) - assert.equal(transactions.length, 1) - - if (process.env.SELENIUM_BROWSER !== 'firefox') { - const txValues = await findElement(driver, By.css('.transaction-list-item__amount--primary')) - await driver.wait(until.elementTextMatches(txValues, /-1\s*ETH/), 10000) - } - }) - }) - - describe('Send ETH from inside MetaMask using fast gas option', () => { - it('starts a send transaction', async function () { - const sendButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Send')]`)) - await sendButton.click() - await delay(regularDelayMs) - - const inputAddress = await findElement(driver, By.css('input[placeholder="Recipient Address"]')) - const inputAmount = await findElement(driver, By.css('.unit-input__input')) - await inputAddress.sendKeys('0x2f318C334780961FB129D2a6c30D0763d9a5C970') - await inputAmount.sendKeys('1') - - const inputValue = await inputAmount.getAttribute('value') - assert.equal(inputValue, '1') - - // Set the gas price - const fastGas = await findElement(driver, By.xpath(`//button/div/div[contains(text(), "Fast")]`)) - await fastGas.click() - await delay(regularDelayMs) - - // Continue to next screen - const nextScreen = await findElement(driver, By.xpath(`//button[contains(text(), 'Next')]`)) - await nextScreen.click() - await delay(regularDelayMs) - }) - - it('confirms the transaction', async function () { - const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`)) - await confirmButton.click() - await delay(largeDelayMs) - }) - - it('finds the transaction in the transactions list', async function () { - const transactions = await findElements(driver, By.css('.transaction-list-item')) - assert.equal(transactions.length, 2) - - if (process.env.SELENIUM_BROWSER !== 'firefox') { - const txValues = await findElement(driver, By.css('.transaction-list-item__amount--primary')) - await driver.wait(until.elementTextMatches(txValues, /-1\s*ETH/), 10000) - } - }) - }) - - describe('Send ETH from inside MetaMask using advanced gas modal', () => { - it('starts a send transaction', async function () { - const sendButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Send')]`)) - await sendButton.click() - await delay(regularDelayMs) - - const inputAddress = await findElement(driver, By.css('input[placeholder="Recipient Address"]')) - const inputAmount = await findElement(driver, By.css('.unit-input__input')) - await inputAddress.sendKeys('0x2f318C334780961FB129D2a6c30D0763d9a5C970') - await inputAmount.sendKeys('1') - - const inputValue = await inputAmount.getAttribute('value') - assert.equal(inputValue, '1') - - // Set the gas limit - const configureGas = await findElement(driver, By.css('.advanced-gas-options-btn')) - await configureGas.click() - await delay(regularDelayMs) - - const gasModal = await driver.findElement(By.css('span .modal')) - const save = await findElement(driver, By.xpath(`//button[contains(text(), 'Save')]`)) - await save.click() - await driver.wait(until.stalenessOf(gasModal)) - await delay(regularDelayMs) - - // Continue to next screen - const nextScreen = await findElement(driver, By.xpath(`//button[contains(text(), 'Next')]`)) - await nextScreen.click() - await delay(regularDelayMs) - }) - - it('confirms the transaction', async function () { - const transactionAmounts = await findElements(driver, By.css('.currency-display-component__text')) - const transactionAmount = transactionAmounts[0] - assert.equal(await transactionAmount.getText(), '1') - - const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`)) - await confirmButton.click() - await delay(largeDelayMs) - }) - - it('finds the transaction in the transactions list', async function () { - const transactions = await findElements(driver, By.css('.transaction-list-item')) - assert.equal(transactions.length, 3) - - if (process.env.SELENIUM_BROWSER !== 'firefox') { - const txValues = await findElement(driver, By.css('.transaction-list-item__amount--primary')) - await driver.wait(until.elementTextMatches(txValues, /-1\s*ETH/), 10000) - } - }) - }) - - describe('Send ETH from dapp using advanced gas controls', () => { - let windowHandles - let extension - let popup - let dapp - - it('goes to the settings screen', async () => { - await driver.findElement(By.css('.account-menu__icon')).click() - await delay(regularDelayMs) - - const settingsButton = await findElement(driver, By.xpath(`//div[contains(text(), 'Settings')]`)) - settingsButton.click() - - // await findElement(driver, By.css('.tab-bar')) - - const advancedTab = await findElement(driver, By.xpath(`//div[contains(text(), 'Advanced')]`)) - await advancedTab.click() - await delay(regularDelayMs) - - const showConversionToggle = await findElement(driver, By.css('.settings-page__content-row:nth-of-type(7) .settings-page__content-item-col > div')) - await showConversionToggle.click() - - const advancedGasTitle = await findElement(driver, By.xpath(`//span[contains(text(), 'Advanced gas controls')]`)) - await driver.executeScript('arguments[0].scrollIntoView(true)', advancedGasTitle) - - const advancedGasToggle = await findElement(driver, By.css('.settings-page__content-row:nth-of-type(5) .settings-page__content-item-col > div')) - await advancedGasToggle.click() - windowHandles = await driver.getAllWindowHandles() - extension = windowHandles[0] - await closeAllWindowHandlesExcept(driver, [extension]) - - const metamaskHomeButton = await findElement(driver, By.css('.app-header__logo-container')) - await metamaskHomeButton.click() - - await delay(largeDelayMs) - }) - - it('starts a send transaction inside the dapp', async () => { - await openNewPage(driver, 'http://127.0.0.1:8080/') - await delay(regularDelayMs) - - await waitUntilXWindowHandles(driver, 3) - windowHandles = await driver.getAllWindowHandles() - - extension = windowHandles[0] - popup = await switchToWindowWithTitle(driver, 'MetaMask Notification', windowHandles) - dapp = windowHandles.find(handle => handle !== extension && handle !== popup) - - await delay(regularDelayMs) - const approveButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Connect')]`)) - await approveButton.click() - - await driver.switchTo().window(dapp) - await delay(regularDelayMs) - }) - - it('initiates a send from the dapp', async () => { - const send3eth = await findElement(driver, By.xpath(`//button[contains(text(), 'Send')]`), 10000) - await send3eth.click() - await delay(5000) - - windowHandles = await driver.getAllWindowHandles() - await switchToWindowWithTitle(driver, 'MetaMask Notification', windowHandles) - await delay(regularDelayMs) - - await assertElementNotPresent(webdriver, driver, By.xpath(`//li[contains(text(), 'Data')]`)) - - const [gasPriceInput, gasLimitInput] = await findElements(driver, By.css('.advanced-gas-inputs__gas-edit-row__input')) - await gasPriceInput.sendKeys(Key.chord(Key.CONTROL, 'a')) - await delay(50) - - - await gasPriceInput.sendKeys(Key.BACK_SPACE) - await delay(50) - await gasPriceInput.sendKeys(Key.BACK_SPACE) - await delay(50) - await gasPriceInput.sendKeys('10') - await delay(50) - await delay(tinyDelayMs) - await delay(50) - await gasLimitInput.sendKeys(Key.chord(Key.CONTROL, 'a')) - await delay(50) - - await gasLimitInput.sendKeys('25000') - await delay(largeDelayMs * 2) - - const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`), 10000) - await confirmButton.click() - await delay(regularDelayMs) - - await waitUntilXWindowHandles(driver, 2) - await driver.switchTo().window(extension) - await delay(regularDelayMs) - }) - - let txValues - - it('finds the transaction in the transactions list', async function () { - await driver.wait(async () => { - const confirmedTxes = await findElements(driver, By.css('.transaction-list__completed-transactions .transaction-list-item')) - return confirmedTxes.length === 4 - }, 10000) - - txValues = await findElements(driver, By.css('.transaction-list-item__amount--primary')) - await driver.wait(until.elementTextMatches(txValues[0], /-3\s*ETH/), 10000) - }) - - it('the transaction has the expected gas price', async function () { - await delay(largeDelayMs) - let txGasPriceLabels - let txGasPrices - try { - await txValues[0].click() - txGasPrices = await findElements(driver, By.css('.transaction-breakdown__value')) - txGasPriceLabels = await findElements(driver, By.css('.transaction-breakdown-row__title')) - txGasPrices = await findElements(driver, By.css('.transaction-breakdown__value')) - await driver.wait(until.elementTextMatches(txGasPrices[3], /^10$/), 10000) - } catch (e) { - console.log(e.message) - txValues = await findElements(driver, By.css('.transaction-list-item__amount--primary')) - await txValues[0].click() - txGasPriceLabels = await findElements(driver, By.css('.transaction-breakdown-row__title')) - txGasPrices = await findElements(driver, By.css('.transaction-breakdown__value')) - await driver.wait(until.elementTextMatches(txGasPrices[3], /^10$/), 10000) - } - assert(txGasPriceLabels[2]) - - await txValues[0].click() - }) - }) - - describe('Navigate transactions', () => { - it('adds multiple transactions', async () => { - await delay(regularDelayMs) - - await waitUntilXWindowHandles(driver, 2) - const windowHandles = await driver.getAllWindowHandles() - const extension = windowHandles[0] - const dapp = windowHandles[1] - - await driver.switchTo().window(dapp) - await delay(regularDelayMs) - - const send3eth = await findElement(driver, By.xpath(`//button[contains(text(), 'Send')]`), 10000) - await send3eth.click() - await delay(regularDelayMs) - - const contractDeployment = await findElement(driver, By.xpath(`//button[contains(text(), 'Deploy Contract')]`), 10000) - await contractDeployment.click() - await delay(regularDelayMs) - - await send3eth.click() - await contractDeployment.click() - await delay(regularDelayMs) - - await driver.switchTo().window(extension) - await delay(regularDelayMs) - - let transactions = await findElements(driver, By.css('.transaction-list-item')) - await transactions[3].click() - await delay(regularDelayMs) - try { - transactions = await findElements(driver, By.css('.transaction-list-item'), 1000) - await transactions[3].click() - } catch (e) { - console.log(e) - } - await delay(regularDelayMs) - }) - - it('navigates the transactions', async () => { - let navigateTxButtons = await findElements(driver, By.css('.confirm-page-container-navigation__arrow'), 20000) - assert.equal(navigateTxButtons.length, 4, 'navigation button present') - - await navigateTxButtons[2].click() - let navigationElement = await findElement(driver, By.css('.confirm-page-container-navigation')) - let navigationText = await navigationElement.getText() - assert.equal(navigationText.includes('2'), true, 'changed transaction right') - - navigateTxButtons = await findElements(driver, By.css('.confirm-page-container-navigation__arrow')) - await navigateTxButtons[2].click() - navigationElement = await findElement(driver, By.css('.confirm-page-container-navigation')) - navigationText = await navigationElement.getText() - assert.equal(navigationText.includes('3'), true, 'changed transaction right') - - navigateTxButtons = await findElements(driver, By.css('.confirm-page-container-navigation__arrow')) - await navigateTxButtons[2].click() - navigationElement = await findElement(driver, By.css('.confirm-page-container-navigation')) - navigationText = await navigationElement.getText() - assert.equal(navigationText.includes('4'), true, 'changed transaction right') - - navigateTxButtons = await findElements(driver, By.css('.confirm-page-container-navigation__arrow')) - await navigateTxButtons[0].click() - navigationElement = await findElement(driver, By.css('.confirm-page-container-navigation')) - navigationText = await navigationElement.getText() - assert.equal(navigationText.includes('1'), true, 'navigate to first transaction') - - navigateTxButtons = await findElements(driver, By.css('.confirm-page-container-navigation__arrow')) - await navigateTxButtons[3].click() - navigationElement = await findElement(driver, By.css('.confirm-page-container-navigation')) - navigationText = await navigationElement.getText() - assert.equal(navigationText.split('4').length, 3, 'navigate to last transaction') - - navigateTxButtons = await findElements(driver, By.css('.confirm-page-container-navigation__arrow')) - await navigateTxButtons[1].click() - navigationElement = await findElement(driver, By.css('.confirm-page-container-navigation')) - navigationText = await navigationElement.getText() - assert.equal(navigationText.includes('3'), true, 'changed transaction left') - - navigateTxButtons = await findElements(driver, By.css('.confirm-page-container-navigation__arrow')) - await navigateTxButtons[1].click() - navigationElement = await findElement(driver, By.css('.confirm-page-container-navigation')) - navigationText = await navigationElement.getText() - assert.equal(navigationText.includes('2'), true, 'changed transaction left') - }) - - it('adds a transaction while confirm screen is in focus', async () => { - let navigationElement = await findElement(driver, By.css('.confirm-page-container-navigation')) - let navigationText = await navigationElement.getText() - assert.equal(navigationText.includes('2'), true, 'second transaction in focus') - - const windowHandles = await driver.getAllWindowHandles() - const extension = windowHandles[0] - const dapp = windowHandles[1] - - await driver.switchTo().window(dapp) - await delay(regularDelayMs) - - const send3eth = await findElement(driver, By.xpath(`//button[contains(text(), 'Send')]`), 10000) - await send3eth.click() - await delay(regularDelayMs) - - await driver.switchTo().window(extension) - await delay(regularDelayMs) - - navigationElement = await findElement(driver, By.css('.confirm-page-container-navigation')) - navigationText = await navigationElement.getText() - assert.equal(navigationText.includes('3'), true, 'correct transaction in focus') - }) - - it('confirms a transaction', async () => { - await delay(tinyDelayMs) - const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`), 10000) - await confirmButton.click() - await delay(largeDelayMs * 2) - - const navigationElement = await findElement(driver, By.css('.confirm-page-container-navigation')) - await delay(tinyDelayMs) - const navigationText = await navigationElement.getText() - assert.equal(navigationText.includes('4'), true, 'transaction confirmed') - }) - - it('rejects a transaction', async () => { - await delay(tinyDelayMs / 2) - const rejectButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Reject')]`), 10000) - await delay(tinyDelayMs / 2) - await rejectButton.click() - await delay(regularDelayMs) - - const navigationElement = await findElement(driver, By.css('.confirm-page-container-navigation')) - await delay(tinyDelayMs / 2) - const navigationText = await navigationElement.getText() - await delay(tinyDelayMs / 2) - assert.equal(navigationText.includes('3'), true, 'transaction rejected') - }) - - it('rejects the rest of the transactions', async () => { - const rejectAllButton = await findElement(driver, By.xpath(`//a[contains(text(), 'Reject 3')]`), 10000) - await rejectAllButton.click() - await delay(regularDelayMs) - - const rejectButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Reject All')]`), 10000) - await rejectButton.click() - await delay(largeDelayMs * 2) - - const confirmedTxes = await findElements(driver, By.css('.transaction-list__completed-transactions .transaction-list-item')) - assert.equal(confirmedTxes.length, 5, '5 transactions present') - }) - }) - - describe('Deploy contract and call contract methods', () => { - let extension - let dapp - it('creates a deploy contract transaction', async () => { - const windowHandles = await driver.getAllWindowHandles() - extension = windowHandles[0] - dapp = windowHandles[1] - await delay(tinyDelayMs) - - await driver.switchTo().window(dapp) - await delay(regularDelayMs) - - const deployContractButton = await findElement(driver, By.css('#deployButton')) - await deployContractButton.click() - await delay(regularDelayMs) - - await driver.switchTo().window(extension) - await delay(regularDelayMs) - - const txListItem = await findElement(driver, By.xpath(`//div[contains(text(), 'Contract Deployment')]`)) - await txListItem.click() - await delay(largeDelayMs) - }) - - it('displays the contract creation data', async () => { - const dataTab = await findElement(driver, By.xpath(`//li[contains(text(), 'Data')]`)) - await dataTab.click() - await delay(regularDelayMs) - - await findElement(driver, By.xpath(`//div[contains(text(), '127.0.0.1')]`)) - - const confirmDataDiv = await findElement(driver, By.css('.confirm-page-container-content__data-box')) - const confirmDataText = await confirmDataDiv.getText() - assert.equal(confirmDataText.match(/0x608060405234801561001057600080fd5b5033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff/)) - - const detailsTab = await findElement(driver, By.xpath(`//li[contains(text(), 'Details')]`)) - await detailsTab.click() - await delay(regularDelayMs) - }) - - it('confirms a deploy contract transaction', async () => { - const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`)) - await confirmButton.click() - await delay(largeDelayMs) - - await driver.wait(async () => { - const confirmedTxes = await findElements(driver, By.css('.transaction-list__completed-transactions .transaction-list-item')) - return confirmedTxes.length === 6 - }, 10000) - - const txAction = await findElements(driver, By.css('.transaction-list-item__action')) - await driver.wait(until.elementTextMatches(txAction[0], /Contract\sDeployment/), 10000) - await delay(regularDelayMs) - }) - - it('calls and confirms a contract method where ETH is sent', async () => { - await driver.switchTo().window(dapp) - await delay(regularDelayMs) - - let contractStatus = await findElement(driver, By.css('#contractStatus')) - await driver.wait(until.elementTextMatches(contractStatus, /Deployed/), 15000) - - const depositButton = await findElement(driver, By.css('#depositButton')) - await depositButton.click() - await delay(largeDelayMs) - - contractStatus = await findElement(driver, By.css('#contractStatus')) - await driver.wait(until.elementTextMatches(contractStatus, /Deposit\sinitiated/), 10000) - - await driver.switchTo().window(extension) - await delay(largeDelayMs * 2) - - await findElements(driver, By.css('.transaction-list-item')) - const [txListValue] = await findElements(driver, By.css('.transaction-list-item__amount--primary')) - await driver.wait(until.elementTextMatches(txListValue, /-4\s*ETH/), 10000) - await txListValue.click() - await delay(regularDelayMs) - - // Set the gas limit - const configureGas = await findElement(driver, By.css('.confirm-detail-row__header-text--edit')) - await configureGas.click() - await delay(regularDelayMs) - - const gasModal = await findElement(driver, By.css('span .modal')) - await delay(regularDelayMs) - const modalTabs = await findElements(driver, By.css('.page-container__tab')) - await modalTabs[1].click() - await delay(regularDelayMs) - - const [gasPriceInput, gasLimitInput] = await findElements(driver, By.css('.advanced-tab__gas-edit-row__input')) - const gasLimitValue = await gasLimitInput.getAttribute('value') - assert(Number(gasLimitValue) < 100000, 'Gas Limit too high') - await gasPriceInput.sendKeys(Key.chord(Key.CONTROL, 'a')) - await delay(50) - - await gasPriceInput.sendKeys(Key.BACK_SPACE) - await delay(50) - await gasPriceInput.sendKeys(Key.BACK_SPACE) - await delay(50) - await gasPriceInput.sendKeys('10') - await delay(50) - await gasLimitInput.sendKeys(Key.chord(Key.CONTROL, 'a')) - await delay(50) - await gasLimitInput.sendKeys(Key.BACK_SPACE) - await delay(50) - await gasLimitInput.sendKeys(Key.BACK_SPACE) - await delay(50) - await gasLimitInput.sendKeys(Key.BACK_SPACE) - await delay(50) - await gasLimitInput.sendKeys(Key.BACK_SPACE) - await delay(50) - await gasLimitInput.sendKeys(Key.BACK_SPACE) - await delay(50) - await gasLimitInput.sendKeys('60001') - await delay(50) - await gasLimitInput.sendKeys(Key.chord(Key.CONTROL, 'e')) - await delay(50) - - const save = await findElement(driver, By.xpath(`//button[contains(text(), 'Save')]`)) - await save.click() - await delay(regularDelayMs) - - await driver.wait(until.stalenessOf(gasModal)) - - const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`)) - await confirmButton.click() - await delay(regularDelayMs) - - await driver.wait(async () => { - const confirmedTxes = await findElements(driver, By.css('.transaction-list__completed-transactions .transaction-list-item')) - return confirmedTxes.length === 7 - }, 10000) - - const txValues = await findElements(driver, By.css('.transaction-list-item__amount--primary')) - await driver.wait(until.elementTextMatches(txValues[0], /-4\s*ETH/), 10000) - - // const txAccounts = await findElements(driver, By.css('.tx-list-account')) - // const firstTxAddress = await txAccounts[0].getText() - // assert(firstTxAddress.match(/^0x\w{8}\.{3}\w{4}$/)) - }) - - it('calls and confirms a contract method where ETH is received', async () => { - await driver.switchTo().window(dapp) - await delay(regularDelayMs) - - const withdrawButton = await findElement(driver, By.css('#withdrawButton')) - await withdrawButton.click() - await delay(regularDelayMs) - - await driver.switchTo().window(extension) - await delay(largeDelayMs * 2) - - const txListItem = await findElement(driver, By.css('.transaction-list-item')) - await txListItem.click() - await delay(regularDelayMs) - - const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`)) - await confirmButton.click() - await delay(regularDelayMs) - - await driver.wait(async () => { - const confirmedTxes = await findElements(driver, By.css('.transaction-list__completed-transactions .transaction-list-item')) - return confirmedTxes.length === 8 - }, 10000) - - const txValues = await findElement(driver, By.css('.transaction-list-item__amount--primary')) - await driver.wait(until.elementTextMatches(txValues, /-0\s*ETH/), 10000) - - await closeAllWindowHandlesExcept(driver, [extension, dapp]) - await driver.switchTo().window(extension) - }) - - it('renders the correct ETH balance', async () => { - const balance = await findElement(driver, By.css('.transaction-view-balance__primary-balance')) - await delay(regularDelayMs) - if (process.env.SELENIUM_BROWSER !== 'firefox') { - await driver.wait(until.elementTextMatches(balance, /^87.*\s*ETH.*$/), 10000) - const tokenAmount = await balance.getText() - assert.ok(/^87.*\s*ETH.*$/.test(tokenAmount)) - await delay(regularDelayMs) - } - }) - }) - - describe('Add a custom token from a dapp', () => { - it('creates a new token', async () => { - let windowHandles = await driver.getAllWindowHandles() - const extension = windowHandles[0] - const dapp = windowHandles[1] - await delay(regularDelayMs * 2) - - await driver.switchTo().window(dapp) - await delay(regularDelayMs * 2) - - const createToken = await findElement(driver, By.xpath(`//button[contains(text(), 'Create Token')]`)) - await createToken.click() - await delay(largeDelayMs) - - windowHandles = await driver.getAllWindowHandles() - const popup = windowHandles[2] - await driver.switchTo().window(popup) - await delay(regularDelayMs) - - const configureGas = await driver.wait(until.elementLocated(By.css('.confirm-detail-row__header-text--edit')), 10000) - await configureGas.click() - await delay(regularDelayMs) - - const advancedTabButton = await driver.wait(until.elementLocated(By.xpath(`//li[contains(text(), 'Advanced')]`)), 10000) - await advancedTabButton.click() - await delay(tinyDelayMs) - - const [gasPriceInput, gasLimitInput] = await findElements(driver, By.css('.advanced-tab__gas-edit-row__input')) - assert(gasPriceInput.getAttribute('value'), 20) - assert(gasLimitInput.getAttribute('value'), 4700000) - - const saveButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Save')]`)) - await saveButton.click() - await delay(regularDelayMs) - - const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`)) - await confirmButton.click() - await delay(regularDelayMs) - - await driver.switchTo().window(dapp) - await delay(tinyDelayMs) - - const tokenContractAddress = await driver.findElement(By.css('#tokenAddress')) - await driver.wait(until.elementTextMatches(tokenContractAddress, /0x/)) - tokenAddress = await tokenContractAddress.getText() - - await delay(regularDelayMs) - await closeAllWindowHandlesExcept(driver, [extension, dapp]) - await delay(regularDelayMs) - await driver.switchTo().window(extension) - await delay(largeDelayMs) - }) - - it('clicks on the Add Token button', async () => { - const addToken = await driver.findElement(By.xpath(`//div[contains(text(), 'Add Token')]`)) - await addToken.click() - await delay(regularDelayMs) - }) - - it('picks the newly created Test token', async () => { - const addCustomToken = await findElement(driver, By.xpath("//li[contains(text(), 'Custom Token')]")) - await addCustomToken.click() - await delay(regularDelayMs) - - const newTokenAddress = await findElement(driver, By.css('#custom-address')) - await newTokenAddress.sendKeys(tokenAddress) - await delay(regularDelayMs) - - const nextScreen = await findElement(driver, By.xpath(`//button[contains(text(), 'Next')]`)) - await nextScreen.click() - await delay(regularDelayMs) - - const addTokens = await findElement(driver, By.xpath(`//button[contains(text(), 'Add Tokens')]`)) - await addTokens.click() - await delay(regularDelayMs) - }) - - it('renders the balance for the new token', async () => { - const balance = await findElement(driver, By.css('.transaction-view-balance .transaction-view-balance__primary-balance')) - await driver.wait(until.elementTextMatches(balance, /^10.000\s*TST\s*$/)) - const tokenAmount = await balance.getText() - assert.ok(/^10.000\s*TST\s*$/.test(tokenAmount)) - await delay(regularDelayMs) - }) - }) - - describe('Send token from inside MetaMask', () => { - let gasModal - it('starts to send a transaction', async function () { - const sendButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Send')]`)) - await sendButton.click() - await delay(regularDelayMs) - - const inputAddress = await findElement(driver, By.css('input[placeholder="Recipient Address"]')) - const inputAmount = await findElement(driver, By.css('.unit-input__input')) - await inputAddress.sendKeys('0x2f318C334780961FB129D2a6c30D0763d9a5C970') - await inputAmount.sendKeys('1') - - // Set the gas limit - const configureGas = await findElement(driver, By.css('.advanced-gas-options-btn')) - await configureGas.click() - await delay(regularDelayMs) - - gasModal = await driver.findElement(By.css('span .modal')) - await delay(regularDelayMs) - }) - - it('opens customize gas modal', async () => { - await driver.wait(until.elementLocated(By.css('.page-container__title'))) - const save = await findElement(driver, By.xpath(`//button[contains(text(), 'Save')]`)) - await save.click() - await delay(regularDelayMs) - }) - - it('transitions to the confirm screen', async () => { - await driver.wait(until.stalenessOf(gasModal)) - - // Continue to next screen - const nextScreen = await findElement(driver, By.xpath(`//button[contains(text(), 'Next')]`)) - await nextScreen.click() - await delay(regularDelayMs) - }) - - it('displays the token transfer data', async () => { - const dataTab = await findElement(driver, By.xpath(`//li[contains(text(), 'Data')]`)) - dataTab.click() - await delay(regularDelayMs) - - const functionType = await findElement(driver, By.css('.confirm-page-container-content__function-type')) - const functionTypeText = await functionType.getText() - assert.equal(functionTypeText, 'Transfer') - - const tokenAmount = await findElement(driver, By.css('.confirm-page-container-summary__title-text')) - const tokenAmountText = await tokenAmount.getText() - assert.equal(tokenAmountText, '1 TST') - - const confirmDataDiv = await findElement(driver, By.css('.confirm-page-container-content__data-box')) - const confirmDataText = await confirmDataDiv.getText() - - await delay(regularDelayMs) - assert(confirmDataText.match(/0xa9059cbb0000000000000000000000002f318c334780961fb129d2a6c30d0763d9a5c97/)) - - const detailsTab = await findElement(driver, By.xpath(`//li[contains(text(), 'Details')]`)) - detailsTab.click() - await delay(regularDelayMs) - }) - - it('submits the transaction', async function () { - const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`)) - await confirmButton.click() - await delay(regularDelayMs) - }) - - it('finds the transaction in the transactions list', async function () { - const transactions = await findElements(driver, By.css('.transaction-list-item')) - assert.equal(transactions.length, 1) - - const txValues = await findElements(driver, By.css('.transaction-list-item__amount--primary')) - assert.equal(txValues.length, 1) - - // test cancelled on firefox until https://github.com/mozilla/geckodriver/issues/906 is resolved, - // or possibly until we use latest version of firefox in the tests - if (process.env.SELENIUM_BROWSER !== 'firefox') { - await driver.wait(until.elementTextMatches(txValues[0], /-1\s*TST/), 10000) - } - - await driver.wait(async () => { - const confirmedTxes = await findElements(driver, By.css('.transaction-list__completed-transactions .transaction-list-item')) - return confirmedTxes.length === 1 - }, 10000) - const txStatuses = await findElements(driver, By.css('.transaction-list-item__action')) - await driver.wait(until.elementTextMatches(txStatuses[0], /Sent\sToken/i), 10000) - }) - }) - - describe('Send a custom token from dapp', () => { - let gasModal - it('sends an already created token', async () => { - const windowHandles = await driver.getAllWindowHandles() - const extension = windowHandles[0] - const dapp = await switchToWindowWithTitle(driver, 'E2E Test Dapp', windowHandles) - await delay(regularDelayMs) - - await driver.switchTo().window(dapp) - await delay(tinyDelayMs) - - const transferTokens = await findElement(driver, By.xpath(`//button[contains(text(), 'Transfer Tokens')]`)) - await transferTokens.click() - - await driver.switchTo().window(extension) - await delay(largeDelayMs) - - await findElements(driver, By.css('.transaction-list__pending-transactions')) - const [txListValue] = await findElements(driver, By.css('.transaction-list-item__amount--primary')) - await driver.wait(until.elementTextMatches(txListValue, /-1.5\s*TST/), 10000) - await txListValue.click() - await delay(regularDelayMs) - - const transactionAmounts = await findElements(driver, By.css('.currency-display-component__text')) - const transactionAmount = transactionAmounts[0] - assert(await transactionAmount.getText(), '1.5 TST') - - // Set the gas limit - const configureGas = await driver.wait(until.elementLocated(By.css('.confirm-detail-row__header-text--edit')), 10000) - await configureGas.click() - await delay(regularDelayMs) - - gasModal = await driver.findElement(By.css('span .modal')) - }) - - it('customizes gas', async () => { - const modalTabs = await findElements(driver, By.css('.page-container__tab')) - await modalTabs[1].click() - await delay(regularDelayMs) - - const [gasPriceInput, gasLimitInput] = await findElements(driver, By.css('.advanced-tab__gas-edit-row__input')) - await gasPriceInput.sendKeys(Key.chord(Key.CONTROL, 'a')) - await delay(50) - - await gasPriceInput.sendKeys(Key.BACK_SPACE) - await delay(50) - await gasPriceInput.sendKeys(Key.BACK_SPACE) - await delay(50) - await gasPriceInput.sendKeys('10') - await delay(50) - await gasLimitInput.sendKeys(Key.chord(Key.CONTROL, 'a')) - await delay(50) - await gasLimitInput.sendKeys(Key.BACK_SPACE) - await delay(50) - await gasLimitInput.sendKeys(Key.BACK_SPACE) - await delay(50) - await gasLimitInput.sendKeys(Key.BACK_SPACE) - await delay(50) - await gasLimitInput.sendKeys(Key.BACK_SPACE) - await delay(50) - await gasLimitInput.sendKeys(Key.BACK_SPACE) - await delay(50) - await gasLimitInput.sendKeys('60000') - await delay(50) - await gasLimitInput.sendKeys(Key.chord(Key.CONTROL, 'e')) - await delay(50) - - const save = await findElement(driver, By.css('.page-container__footer-button')) - await save.click() - await driver.wait(until.stalenessOf(gasModal)) - - const gasFeeInputs = await findElements(driver, By.css('.confirm-detail-row__primary')) - const renderedGasFee = await gasFeeInputs[0].getText() - assert.equal(renderedGasFee, '0.0006') - }) - - it('submits the transaction', async function () { - const tokenAmount = await findElement(driver, By.css('.confirm-page-container-summary__title-text')) - const tokenAmountText = await tokenAmount.getText() - assert.equal(tokenAmountText, '1.5 TST') - - const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`)) - await confirmButton.click() - await delay(regularDelayMs) - }) - - it('finds the transaction in the transactions list', async function () { - await driver.wait(async () => { - const confirmedTxes = await findElements(driver, By.css('.transaction-list__completed-transactions .transaction-list-item')) - return confirmedTxes.length === 2 - }, 10000) - - await delay(regularDelayMs) - const txValues = await findElements(driver, By.css('.transaction-list-item__amount--primary')) - await driver.wait(until.elementTextMatches(txValues[0], /-1.5\s*TST/)) - const txStatuses = await findElements(driver, By.css('.transaction-list-item__action')) - await driver.wait(until.elementTextMatches(txStatuses[0], /Sent\sToken/), 10000) - - const walletBalance = await findElement(driver, By.css('.wallet-balance')) - await walletBalance.click() - - const tokenListItems = await findElements(driver, By.css('.token-list-item')) - await tokenListItems[0].click() - await delay(regularDelayMs) - - // test cancelled on firefox until https://github.com/mozilla/geckodriver/issues/906 is resolved, - // or possibly until we use latest version of firefox in the tests - if (process.env.SELENIUM_BROWSER !== 'firefox') { - const tokenBalanceAmount = await findElements(driver, By.css('.transaction-view-balance__primary-balance')) - await driver.wait(until.elementTextMatches(tokenBalanceAmount[0], /7.500\s*TST/), 10000) - } - }) - }) - - describe('Approves a custom token from dapp', () => { - let gasModal - it('approves an already created token', async () => { - const windowHandles = await driver.getAllWindowHandles() - const extension = windowHandles[0] - const dapp = await switchToWindowWithTitle(driver, 'E2E Test Dapp', windowHandles) - await closeAllWindowHandlesExcept(driver, [extension, dapp]) - await delay(regularDelayMs) - - await driver.switchTo().window(dapp) - await delay(tinyDelayMs) - - const transferTokens = await findElement(driver, By.xpath(`//button[contains(text(), 'Approve Tokens')]`)) - await transferTokens.click() - - await closeAllWindowHandlesExcept(driver, [extension, dapp]) - await driver.switchTo().window(extension) - await delay(regularDelayMs) - - await driver.wait(async () => { - const pendingTxes = await findElements(driver, By.css('.transaction-list__pending-transactions .transaction-list-item')) - return pendingTxes.length === 1 - }, 10000) - - const [txListItem] = await findElements(driver, By.css('.transaction-list-item')) - const [txListValue] = await findElements(driver, By.css('.transaction-list-item__amount--primary')) - await driver.wait(until.elementTextMatches(txListValue, /-7\s*TST/)) - await txListItem.click() - await delay(regularDelayMs) - }) - - it('displays the token approval data', async () => { - const dataTab = await findElement(driver, By.xpath(`//li[contains(text(), 'Data')]`)) - dataTab.click() - await delay(regularDelayMs) - - const functionType = await findElement(driver, By.css('.confirm-page-container-content__function-type')) - const functionTypeText = await functionType.getText() - assert.equal(functionTypeText, 'Approve') - - const confirmDataDiv = await findElement(driver, By.css('.confirm-page-container-content__data-box')) - const confirmDataText = await confirmDataDiv.getText() - assert(confirmDataText.match(/0x095ea7b30000000000000000000000002f318c334780961fb129d2a6c30d0763d9a5c97/)) - - const detailsTab = await findElement(driver, By.xpath(`//li[contains(text(), 'Details')]`)) - detailsTab.click() - await delay(regularDelayMs) - - const approvalWarning = await findElement(driver, By.css('.confirm-page-container-warning__warning')) - const approvalWarningText = await approvalWarning.getText() - assert(approvalWarningText.match(/By approving this/)) - await delay(regularDelayMs) - }) - - it('opens the gas edit modal', async () => { - const configureGas = await driver.wait(until.elementLocated(By.css('.confirm-detail-row__header-text--edit'))) - await configureGas.click() - await delay(regularDelayMs) - - gasModal = await driver.findElement(By.css('span .modal')) - }) - - it('customizes gas', async () => { - const modalTabs = await findElements(driver, By.css('.page-container__tab')) - await modalTabs[1].click() - await delay(regularDelayMs) - - const [gasPriceInput, gasLimitInput] = await findElements(driver, By.css('.advanced-tab__gas-edit-row__input')) - await gasPriceInput.sendKeys(Key.chord(Key.CONTROL, 'a')) - await delay(50) - - await gasPriceInput.sendKeys(Key.BACK_SPACE) - await delay(50) - await gasPriceInput.sendKeys(Key.BACK_SPACE) - await delay(50) - await gasPriceInput.sendKeys('10') - await delay(50) - await gasLimitInput.sendKeys(Key.chord(Key.CONTROL, 'a')) - await delay(50) - await gasLimitInput.sendKeys(Key.BACK_SPACE) - await delay(50) - await gasLimitInput.sendKeys(Key.BACK_SPACE) - await delay(50) - await gasLimitInput.sendKeys(Key.BACK_SPACE) - await delay(50) - await gasLimitInput.sendKeys(Key.BACK_SPACE) - await delay(50) - await gasLimitInput.sendKeys(Key.BACK_SPACE) - await delay(50) - await gasLimitInput.sendKeys('60001') - await delay(50) - await gasLimitInput.sendKeys(Key.chord(Key.CONTROL, 'e')) - await delay(50) - - const save = await findElement(driver, By.css('.page-container__footer-button')) - await save.click() - await driver.wait(until.stalenessOf(gasModal)) - - const gasFeeInputs = await findElements(driver, By.css('.confirm-detail-row__primary')) - assert.equal(await gasFeeInputs[0].getText(), '0.0006') - }) - - it('submits the transaction', async function () { - const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`)) - await confirmButton.click() - await delay(regularDelayMs) - }) - - it('finds the transaction in the transactions list', async function () { - await driver.wait(async () => { - const confirmedTxes = await findElements(driver, By.css('.transaction-list__completed-transactions .transaction-list-item')) - return confirmedTxes.length === 3 - }, 10000) - - const txValues = await findElements(driver, By.css('.transaction-list-item__amount--primary')) - await driver.wait(until.elementTextMatches(txValues[0], /-7\s*TST/)) - const txStatuses = await findElements(driver, By.css('.transaction-list-item__action')) - await driver.wait(until.elementTextMatches(txStatuses[0], /Approve/)) - }) - }) - - describe('Tranfers a custom token from dapp when no gas value is specified', () => { - it('transfers an already created token, without specifying gas', async () => { - const windowHandles = await driver.getAllWindowHandles() - const extension = windowHandles[0] - const dapp = await switchToWindowWithTitle(driver, 'E2E Test Dapp', windowHandles) - await closeAllWindowHandlesExcept(driver, [extension, dapp]) - await delay(regularDelayMs) - - await driver.switchTo().window(dapp) - - const transferTokens = await findElement(driver, By.xpath(`//button[contains(text(), 'Transfer Tokens Without Gas')]`)) - await transferTokens.click() - - await closeAllWindowHandlesExcept(driver, [extension, dapp]) - await driver.switchTo().window(extension) - await delay(regularDelayMs) - - await driver.wait(async () => { - const pendingTxes = await findElements(driver, By.css('.transaction-list__pending-transactions .transaction-list-item')) - return pendingTxes.length === 1 - }, 10000) - - const [txListItem] = await findElements(driver, By.css('.transaction-list-item')) - const [txListValue] = await findElements(driver, By.css('.transaction-list-item__amount--primary')) - await driver.wait(until.elementTextMatches(txListValue, /-1.5\s*TST/)) - await txListItem.click() - await delay(regularDelayMs) - }) - - it('submits the transaction', async function () { - await delay(largeDelayMs * 2) - const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`)) - await confirmButton.click() - await delay(largeDelayMs * 2) - }) - - it('finds the transaction in the transactions list', async function () { - await driver.wait(async () => { - const confirmedTxes = await findElements(driver, By.css('.transaction-list__completed-transactions .transaction-list-item')) - return confirmedTxes.length === 4 - }, 10000) - - const txValues = await findElements(driver, By.css('.transaction-list-item__amount--primary')) - await driver.wait(until.elementTextMatches(txValues[0], /-1.5\s*TST/)) - const txStatuses = await findElements(driver, By.css('.transaction-list-item__action')) - await driver.wait(until.elementTextMatches(txStatuses[0], /Sent Tokens/)) - }) - }) - - describe('Approves a custom token from dapp when no gas value is specified', () => { - it('approves an already created token', async () => { - const windowHandles = await driver.getAllWindowHandles() - const extension = windowHandles[0] - const dapp = await switchToWindowWithTitle(driver, 'E2E Test Dapp', windowHandles) - await closeAllWindowHandlesExcept(driver, [extension, dapp]) - await delay(regularDelayMs) - - await driver.switchTo().window(dapp) - await delay(tinyDelayMs) - - const transferTokens = await findElement(driver, By.xpath(`//button[contains(text(), 'Approve Tokens Without Gas')]`)) - await transferTokens.click() - - await closeAllWindowHandlesExcept(driver, extension) - await driver.switchTo().window(extension) - await delay(regularDelayMs) - - await driver.wait(async () => { - const pendingTxes = await findElements(driver, By.css('.transaction-list__pending-transactions .transaction-list-item')) - return pendingTxes.length === 1 - }, 10000) - - const [txListItem] = await findElements(driver, By.css('.transaction-list-item')) - const [txListValue] = await findElements(driver, By.css('.transaction-list-item__amount--primary')) - await driver.wait(until.elementTextMatches(txListValue, /-7\s*TST/)) - await txListItem.click() - await delay(regularDelayMs) - }) - - it('submits the transaction', async function () { - await delay(regularDelayMs) - const confirmButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Confirm')]`)) - await confirmButton.click() - await delay(regularDelayMs) - }) - - it('finds the transaction in the transactions list', async function () { - await driver.wait(async () => { - const confirmedTxes = await findElements(driver, By.css('.transaction-list__completed-transactions .transaction-list-item')) - return confirmedTxes.length === 5 - }, 10000) - - const txValues = await findElements(driver, By.css('.transaction-list-item__amount--primary')) - await driver.wait(until.elementTextMatches(txValues[0], /-7\s*TST/)) - const txStatuses = await findElements(driver, By.css('.transaction-list-item__action')) - await driver.wait(until.elementTextMatches(txStatuses[0], /Approve/)) - }) - }) - - describe('Hide token', () => { - it('hides the token when clicked', async () => { - const [hideTokenEllipsis] = await findElements(driver, By.css('.token-list-item__ellipsis')) - await hideTokenEllipsis.click() - - const byTokenMenuDropdownOption = By.css('.menu__item--clickable') - const tokenMenuDropdownOption = await driver.wait(until.elementLocated(byTokenMenuDropdownOption)) - - await tokenMenuDropdownOption.click() - - const confirmHideModal = await findElement(driver, By.css('span .modal')) - - const byHideTokenConfirmationButton = By.css('.hide-token-confirmation__button') - const hideTokenConfirmationButton = await driver.wait(until.elementLocated(byHideTokenConfirmationButton)) - await hideTokenConfirmationButton.click() - - await driver.wait(until.stalenessOf(confirmHideModal)) - }) - }) - - describe('Add existing token using search', () => { - it('clicks on the Add Token button', async () => { - const addToken = await findElement(driver, By.xpath(`//div[contains(text(), 'Add Token')]`)) - await addToken.click() - await delay(regularDelayMs) - }) - - it('can pick a token from the existing options', async () => { - const tokenSearch = await findElement(driver, By.css('#search-tokens')) - await tokenSearch.sendKeys('BAT') - await delay(regularDelayMs) - - const token = await findElement(driver, By.xpath("//span[contains(text(), 'BAT')]")) - await token.click() - await delay(regularDelayMs) - - const nextScreen = await findElement(driver, By.xpath(`//button[contains(text(), 'Next')]`)) - await nextScreen.click() - await delay(regularDelayMs) - - const addTokens = await findElement(driver, By.xpath(`//button[contains(text(), 'Add Tokens')]`)) - await addTokens.click() - await delay(largeDelayMs) - }) - - it('renders the balance for the chosen token', async () => { - const balance = await findElement(driver, By.css('.transaction-view-balance__primary-balance')) - await driver.wait(until.elementTextMatches(balance, /0\s*BAT/)) - await delay(regularDelayMs) - }) - }) - - describe('Stores custom RPC history', () => { - const customRpcUrls = [ - 'http://127.0.0.1:8545/1', - 'http://127.0.0.1:8545/2', - 'http://127.0.0.1:8545/3', - 'http://127.0.0.1:8545/4', - ] - - customRpcUrls.forEach(customRpcUrl => { - it(`creates custom RPC: ${customRpcUrl}`, async () => { - const networkDropdown = await findElement(driver, By.css('.network-name')) - await networkDropdown.click() - await delay(regularDelayMs) - - const customRpcButton = await findElement(driver, By.xpath(`//span[contains(text(), 'Custom RPC')]`)) - await customRpcButton.click() - await delay(regularDelayMs) - - await findElement(driver, By.css('.settings-page__sub-header-text')) - - const customRpcInputs = await findElements(driver, By.css('input[type="text"]')) - const customRpcInput = customRpcInputs[1] - await customRpcInput.clear() - await customRpcInput.sendKeys(customRpcUrl) - - const customRpcSave = await findElement(driver, By.css('.network-form__footer .btn-secondary')) - await customRpcSave.click() - await delay(largeDelayMs * 2) - }) - }) - - it('selects another provider', async () => { - const networkDropdown = await findElement(driver, By.css('.network-name')) - await networkDropdown.click() - await delay(regularDelayMs) - - const customRpcButton = await findElement(driver, By.xpath(`//span[contains(text(), 'Main Ethereum Network')]`)) - await customRpcButton.click() - await delay(largeDelayMs * 2) - }) - - it('finds all recent RPCs in history', async () => { - const networkDropdown = await findElement(driver, By.css('.network-name')) - await networkDropdown.click() - await delay(regularDelayMs) - - // only recent 3 are found and in correct order (most recent at the top) - const customRpcs = await findElements(driver, By.xpath(`//span[contains(text(), 'http://127.0.0.1:8545/')]`)) - - assert.equal(customRpcs.length, customRpcUrls.length) - }) - - it('deletes a custom RPC', async () => { - const networkListItems = await findElements(driver, By.css('.networks-tab__networks-list-name')) - const lastNetworkListItem = networkListItems[networkListItems.length - 1] - await lastNetworkListItem.click() - await delay(100) - - const deleteButton = await findElement(driver, By.css('.btn-danger')) - await deleteButton.click() - await delay(regularDelayMs) - const newNetworkListItems = await findElements(driver, By.css('.networks-tab__networks-list-name')) - - assert.equal(networkListItems.length - 1, newNetworkListItems.length) - }) - }) -}) diff --git a/test/e2e/beta/run-all.sh b/test/e2e/beta/run-all.sh deleted file mode 100755 index 685feab0051b..000000000000 --- a/test/e2e/beta/run-all.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -u -set -o pipefail - -export PATH="$PATH:./node_modules/.bin" - -shell-parallel -s 'npm run ganache:start -- -b 2' -x 'sleep 5 && static-server test/e2e/beta/contract-test --port 8080' -x 'sleep 5 && mocha test/e2e/beta/metamask-beta-ui.spec' -shell-parallel -s 'npm run ganache:start -- -b 2' -x 'sleep 5 && static-server test/e2e/beta/contract-test --port 8080' -x 'sleep 5 && mocha test/e2e/beta/metamask-beta-responsive-ui.spec' -shell-parallel -s 'npm run ganache:start -- -d -b 2 --account=0x53CB0AB5226EEBF4D872113D98332C1555DC304443BEE1CF759D15798D3C55A9,25000000000000000000' \ - -x 'sleep 5 && mocha test/e2e/beta/from-import-beta-ui.spec' diff --git a/test/e2e/beta/run-drizzle.sh b/test/e2e/beta/run-drizzle.sh deleted file mode 100755 index 0799b5a65540..000000000000 --- a/test/e2e/beta/run-drizzle.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -u -set -o pipefail - -npm run ganache:start -- -b 2 >> /dev/null 2>&1 & -npm_run_ganache_start_pid=$! -sleep 5 - -pushd "$(mktemp -d)" -npm install --no-package-lock truffle -truffle="$(npm bin)/truffle" -$truffle unbox drizzle -echo "Deploying contracts for Drizzle test..." -$truffle compile -$truffle migrate - -BROWSER=none npm start >> /dev/null 2>&1 & -npm_start_pid=$! - -popd -if ! mocha test/e2e/beta/drizzle.spec -then - test_status=1 -fi - -! kill -15 $npm_run_ganache_start_pid -! kill -15 $npm_start_pid -! wait $npm_run_ganache_start_pid $npm_start_pid -exit ${test_status:-} diff --git a/test/e2e/beta/run-web3.sh b/test/e2e/beta/run-web3.sh deleted file mode 100755 index 9f77060de82a..000000000000 --- a/test/e2e/beta/run-web3.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -u -set -o pipefail - -export PATH="$PATH:./node_modules/.bin" - -shell-parallel -s 'static-server test/web3 --port 8080' -x 'sleep 5 && mocha test/e2e/beta/web3.spec' \ No newline at end of file diff --git a/test/e2e/beta/web3.spec.js b/test/e2e/beta/web3.spec.js deleted file mode 100644 index b3962c8217e6..000000000000 --- a/test/e2e/beta/web3.spec.js +++ /dev/null @@ -1,365 +0,0 @@ -const path = require('path') -const assert = require('assert') -const webdriver = require('selenium-webdriver') -const { By } = webdriver -const { - delay, - buildChromeWebDriver, - buildFirefoxWebdriver, - installWebExt, - getExtensionIdChrome, - getExtensionIdFirefox, -} = require('../func') -const { - checkBrowserForConsoleErrors, - closeAllWindowHandlesExcept, - findElement, - findElements, - openNewPage, - switchToWindowWithTitle, - verboseReportOnFailure, - waitUntilXWindowHandles, -} = require('./helpers') -const fetchMockResponses = require('./fetch-mocks.js') - - -describe('Using MetaMask with an existing account', function () { - let extensionId - let driver - - const testSeedPhrase = 'forum vessel pink push lonely enact gentle tail admit parrot grunt dress' - const regularDelayMs = 1000 - const largeDelayMs = regularDelayMs * 2 - - const button = async (x) => { - const buttoncheck = x - await buttoncheck.click() - await delay(largeDelayMs) - const [results] = await findElements(driver, By.css('#results')) - const resulttext = await results.getText() - var parsedData = JSON.parse(resulttext) - - return (parsedData) - - } - - this.timeout(0) - this.bail(true) - - before(async function () { - let extensionUrl - switch (process.env.SELENIUM_BROWSER) { - case 'chrome': { - const extensionPath = path.resolve('dist/chrome') - driver = buildChromeWebDriver(extensionPath) - extensionId = await getExtensionIdChrome(driver) - await delay(regularDelayMs) - extensionUrl = `chrome-extension://${extensionId}/home.html` - break - } - case 'firefox': { - const extensionPath = path.resolve('dist/firefox') - driver = buildFirefoxWebdriver() - await installWebExt(driver, extensionPath) - await delay(regularDelayMs) - extensionId = await getExtensionIdFirefox(driver) - extensionUrl = `moz-extension://${extensionId}/home.html` - break - } - } - // Depending on the state of the application built into the above directory (extPath) and the value of - // METAMASK_DEBUG we will see different post-install behaviour and possibly some extra windows. Here we - // are closing any extraneous windows to reset us to a single window before continuing. - const [tab1] = await driver.getAllWindowHandles() - await closeAllWindowHandlesExcept(driver, [tab1]) - await driver.switchTo().window(tab1) - await driver.get(extensionUrl) - }) - - beforeEach(async function () { - await driver.executeScript( - 'window.origFetch = window.fetch.bind(window);' + - 'window.fetch = ' + - '(...args) => { ' + - 'if (args[0] === "https://ethgasstation.info/json/ethgasAPI.json") { return ' + - 'Promise.resolve({ json: () => Promise.resolve(JSON.parse(\'' + fetchMockResponses.ethGasBasic + '\')) }); } else if ' + - '(args[0] === "https://ethgasstation.info/json/predictTable.json") { return ' + - 'Promise.resolve({ json: () => Promise.resolve(JSON.parse(\'' + fetchMockResponses.ethGasPredictTable + '\')) }); } else if ' + - '(args[0].match(/chromeextensionmm/)) { return ' + - 'Promise.resolve({ json: () => Promise.resolve(JSON.parse(\'' + fetchMockResponses.metametrics + '\')) }); } else if ' + - '(args[0] === "https://dev.blockscale.net/api/gasexpress.json") { return ' + - 'Promise.resolve({ json: () => Promise.resolve(JSON.parse(\'' + fetchMockResponses.gasExpress + '\')) }); } ' + - 'return window.origFetch(...args); };' + - 'function cancelInfuraRequest(requestDetails) {' + - 'console.log("Canceling: " + requestDetails.url);' + - 'return {' + - 'cancel: true' + - '};' + - ' }' + - 'window.chrome && window.chrome.webRequest && window.chrome.webRequest.onBeforeRequest.addListener(' + - 'cancelInfuraRequest,' + - '{urls: ["https://*.infura.io/*"]},' + - '["blocking"]' + - ');' - ) - }) - - afterEach(async function () { - if (process.env.SELENIUM_BROWSER === 'chrome') { - const errors = await checkBrowserForConsoleErrors(driver) - if (errors.length) { - const errorReports = errors.map(err => err.message) - const errorMessage = `Errors found in browser console:\n${errorReports.join('\n')}` - console.error(new Error(errorMessage)) - } - } - if (this.currentTest.state === 'failed') { - await verboseReportOnFailure(driver, this.currentTest) - } - }) - - after(async function () { - await driver.quit() - }) - - describe('First time flow starting from an existing seed phrase', () => { - it('clicks the continue button on the welcome screen', async () => { - await findElement(driver, By.css('.welcome-page__header')) - const welcomeScreenBtn = await findElement(driver, By.css('.first-time-flow__button')) - welcomeScreenBtn.click() - await delay(largeDelayMs) - }) - - it('clicks the "Import Wallet" option', async () => { - const customRpcButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Import Wallet')]`)) - customRpcButton.click() - await delay(largeDelayMs) - }) - - it('clicks the "No thanks" option on the metametrics opt-in screen', async () => { - const optOutButton = await findElement(driver, By.css('.btn-default')) - optOutButton.click() - await delay(largeDelayMs) - }) - - it('imports a seed phrase', async () => { - const [seedTextArea] = await findElements(driver, By.css('textarea.first-time-flow__textarea')) - await seedTextArea.sendKeys(testSeedPhrase) - await delay(regularDelayMs) - - const [password] = await findElements(driver, By.id('password')) - await password.sendKeys('correct horse battery staple') - const [confirmPassword] = await findElements(driver, By.id('confirm-password')) - confirmPassword.sendKeys('correct horse battery staple') - - const tosCheckBox = await findElement(driver, By.css('.first-time-flow__checkbox')) - await tosCheckBox.click() - - const [importButton] = await findElements(driver, By.xpath(`//button[contains(text(), 'Import')]`)) - await importButton.click() - await delay(regularDelayMs) - }) - - it('clicks through the success screen', async () => { - await findElement(driver, By.xpath(`//div[contains(text(), 'Congratulations')]`)) - const doneButton = await findElement(driver, By.css('button.first-time-flow__button')) - await doneButton.click() - await delay(regularDelayMs) - }) - }) - - - describe('opens dapp', () => { - - it('switches to mainnet', async () => { - const networkDropdown = await findElement(driver, By.css('.network-name')) - await networkDropdown.click() - await delay(regularDelayMs) - - const [mainnet] = await findElements(driver, By.xpath(`//span[contains(text(), 'Main Ethereum Network')]`)) - await mainnet.click() - await delay(largeDelayMs * 2) - }) - - it('', async () => { - await openNewPage(driver, 'http://127.0.0.1:8080/') - await delay(regularDelayMs) - - await waitUntilXWindowHandles(driver, 3) - const windowHandles = await driver.getAllWindowHandles() - - const extension = windowHandles[0] - const popup = await switchToWindowWithTitle(driver, 'MetaMask Notification', windowHandles) - const dapp = windowHandles.find(handle => handle !== extension && handle !== popup) - - await delay(regularDelayMs) - const approveButton = await findElement(driver, By.xpath(`//button[contains(text(), 'Connect')]`)) - await approveButton.click() - - await driver.switchTo().window(dapp) - await delay(regularDelayMs) - - - }) - }) - - describe('testing web3 methods', async () => { - - - it('testing hexa methods', async () => { - - - var List = await driver.findElements(By.className('hexaNumberMethods')) - - for (let i = 0; i < List.length; i++) { - try { - - var parsedData = await button(List[i]) - console.log(parsedData) - var result = parseInt(parsedData.result, 16) - - assert.equal((typeof result === 'number'), true) - await delay(regularDelayMs) - } catch (err) { - console.log(err) - assert(false) - - } - } - }) - - it('testing booleanMethods', async () => { - - var List = await driver.findElements(By.className('booleanMethods')) - - for (let i = 0; i < List.length; i++) { - try { - - var parsedData = await button(List[i]) - console.log(parsedData) - var result = parsedData.result - - assert.equal(result, false) - await delay(regularDelayMs) - } catch (err) { - console.log(err) - assert(false) - - - } - } - - }) - - it('testing transactionMethods', async () => { - - var List = await driver.findElements(By.className('transactionMethods')) - - for (let i = 0; i < List.length; i++) { - try { - - var parsedData = await button(List[i]) - - console.log(parsedData.result.blockHash) - - var result = [] - result.push(parseInt(parsedData.result.blockHash, 16)) - result.push(parseInt(parsedData.result.blockNumber, 16)) - result.push(parseInt(parsedData.result.gas, 16)) - result.push(parseInt(parsedData.result.gasPrice, 16)) - result.push(parseInt(parsedData.result.hash, 16)) - result.push(parseInt(parsedData.result.input, 16)) - result.push(parseInt(parsedData.result.nonce, 16)) - result.push(parseInt(parsedData.result.r, 16)) - result.push(parseInt(parsedData.result.s, 16)) - result.push(parseInt(parsedData.result.v, 16)) - result.push(parseInt(parsedData.result.to, 16)) - result.push(parseInt(parsedData.result.value, 16)) - - - result.forEach((value) => { - assert.equal((typeof value === 'number'), true) - }) - - - } catch (err) { - - console.log(err) - assert(false) - - - } - } - - }) - - it('testing blockMethods', async () => { - - var List = await driver.findElements(By.className('blockMethods')) - - for (let i = 0; i < List.length; i++) { - try { - - var parsedData = await button(List[i]) - console.log(JSON.stringify(parsedData) + i) - - console.log(parsedData.result.parentHash) - - var result = parseInt(parsedData.result.parentHash, 16) - - assert.equal((typeof result === 'number'), true) - await delay(regularDelayMs) - } catch (err) { - - console.log(err) - assert(false) - - - } - } - }) - - it('testing methods', async () => { - - var List = await driver.findElements(By.className('methods')) - var parsedData - var result - - for (let i = 0; i < List.length; i++) { - try { - - if (i === 2) { - - parsedData = await button(List[i]) - console.log(parsedData.result.blockHash) - - result = parseInt(parsedData.result.blockHash, 16) - - assert.equal((typeof result === 'number' || (result === 0)), true) - await delay(regularDelayMs) - } else { - parsedData = await button(List[i]) - console.log(parsedData.result) - - result = parseInt(parsedData.result, 16) - - assert.equal((typeof result === 'number' || (result === 0)), true) - await delay(regularDelayMs) - } - - - } catch (err) { - - console.log(err) - assert(false) - - - } - } - }) - - - }) - - - }) diff --git a/test/e2e/ethereum-on.spec.js b/test/e2e/ethereum-on.spec.js new file mode 100644 index 000000000000..5dd15d5fdd87 --- /dev/null +++ b/test/e2e/ethereum-on.spec.js @@ -0,0 +1,170 @@ +const assert = require('assert') +const webdriver = require('selenium-webdriver') + +const { By, until } = webdriver +const enLocaleMessages = require('../../app/_locales/en/messages.json') +const { + regularDelayMs, + largeDelayMs, +} = require('./helpers') +const { buildWebDriver } = require('./webdriver') +const Ganache = require('./ganache') + +const ganacheServer = new Ganache() + +describe('MetaMask', function () { + let driver + let publicAddress + + this.timeout(0) + this.bail(true) + + before(async function () { + await ganacheServer.start({ + accounts: [ + { + secretKey: '0x53CB0AB5226EEBF4D872113D98332C1555DC304443BEE1CF759D15798D3C55A9', + balance: 25000000000000000000, + }, + ], + }) + const result = await buildWebDriver() + driver = result.driver + }) + + afterEach(async function () { + if (process.env.SELENIUM_BROWSER === 'chrome') { + const errors = await driver.checkBrowserForConsoleErrors(driver) + if (errors.length) { + const errorReports = errors.map((err) => err.message) + const errorMessage = `Errors found in browser console:\n${errorReports.join('\n')}` + console.error(new Error(errorMessage)) + } + } + if (this.currentTest.state === 'failed') { + await driver.verboseReportOnFailure(this.currentTest.title) + } + }) + + after(async function () { + await ganacheServer.quit() + await driver.quit() + }) + + describe('Going through the first time flow, but skipping the seed phrase challenge', function () { + it('clicks the continue button on the welcome screen', async function () { + await driver.findElement(By.css('.welcome-page__header')) + await driver.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.getStarted.message}')]`)) + await driver.delay(largeDelayMs) + }) + + it('clicks the "Create New Wallet" option', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Create a Wallet')]`)) + await driver.delay(largeDelayMs) + }) + + it('clicks the "No thanks" option on the metametrics opt-in screen', async function () { + await driver.clickElement(By.css('.btn-default')) + await driver.delay(largeDelayMs) + }) + + it('accepts a secure password', async function () { + const passwordBox = await driver.findElement(By.css('.first-time-flow__form #create-password')) + const passwordBoxConfirm = await driver.findElement(By.css('.first-time-flow__form #confirm-password')) + + await passwordBox.sendKeys('correct horse battery staple') + await passwordBoxConfirm.sendKeys('correct horse battery staple') + + await driver.clickElement(By.css('.first-time-flow__checkbox')) + await driver.clickElement(By.css('.first-time-flow__form button')) + await driver.delay(largeDelayMs) + }) + + it('skips the seed phrase challenge', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.remindMeLater.message}')]`)) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.css('[data-testid="account-options-menu-button"]')) + await driver.clickElement(By.css('[data-testid="account-options-menu__account-details"]')) + }) + + it('gets the current accounts address', async function () { + const addressInput = await driver.findElement(By.css('.readonly-input__input')) + publicAddress = await addressInput.getAttribute('value') + const accountModal = await driver.findElement(By.css('span .modal')) + + await driver.clickElement(By.css('.account-modal__close')) + + await driver.wait(until.stalenessOf(accountModal)) + await driver.delay(regularDelayMs) + }) + + }) + + describe('provider listening for events', function () { + let extension + let popup + let dapp + + it('connects to the dapp', async function () { + await driver.openNewPage('http://127.0.0.1:8080/') + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Connect')]`)) + + await driver.delay(regularDelayMs) + + await driver.waitUntilXWindowHandles(3) + const windowHandles = await driver.getAllWindowHandles() + + extension = windowHandles[0] + dapp = await driver.switchToWindowWithTitle('E2E Test Dapp', windowHandles) + popup = windowHandles.find((handle) => handle !== extension && handle !== dapp) + + await driver.switchToWindow(popup) + + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Next')]`)) + await driver.clickElement(By.xpath(`//button[contains(text(), 'Connect')]`)) + + await driver.waitUntilXWindowHandles(2) + await driver.switchToWindow(dapp) + await driver.delay(regularDelayMs) + }) + + it('has the ganache network id within the dapp', async function () { + const networkDiv = await driver.findElement(By.css('#network')) + await driver.delay(regularDelayMs) + assert.equal(await networkDiv.getText(), '5777') + }) + + it('changes the network', async function () { + await driver.switchToWindow(extension) + + await driver.clickElement(By.css('.network-name')) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//span[contains(text(), 'Ropsten')]`)) + await driver.delay(largeDelayMs) + }) + + it('sets the network div within the dapp', async function () { + await driver.switchToWindow(dapp) + const networkDiv = await driver.findElement(By.css('#network')) + assert.equal(await networkDiv.getText(), '3') + }) + + it('sets the chainId div within the dapp', async function () { + await driver.switchToWindow(dapp) + const chainIdDiv = await driver.findElement(By.css('#chainId')) + assert.equal(await chainIdDiv.getText(), '0x3') + }) + + it('sets the account div within the dapp', async function () { + await driver.switchToWindow(dapp) + const accountsDiv = await driver.findElement(By.css('#accounts')) + assert.equal(await accountsDiv.getText(), publicAddress.toLowerCase()) + }) + }) +}) diff --git a/test/e2e/fixture-server.js b/test/e2e/fixture-server.js new file mode 100644 index 000000000000..b96ba8e9a147 --- /dev/null +++ b/test/e2e/fixture-server.js @@ -0,0 +1,74 @@ +const { promises: fs } = require('fs') +const path = require('path') +const Koa = require('koa') + +const CURRENT_STATE_KEY = '__CURRENT__' +const DEFAULT_STATE_KEY = '__DEFAULT__' + +const FIXTURE_SERVER_HOST = 'localhost' +const FIXTURE_SERVER_PORT = 12345 + +class FixtureServer { + constructor () { + this._app = new Koa() + this._stateMap = new Map([ + [DEFAULT_STATE_KEY, Object.create(null)], + ]) + this._initialStateCache = new Map() + + this._app.use(async (ctx) => { + // Firefox is _super_ strict about needing CORS headers + ctx.set('Access-Control-Allow-Origin', '*') + if (this._isStateRequest(ctx)) { + ctx.body = this._stateMap.get(CURRENT_STATE_KEY) + } + }) + } + + async start () { + const options = { + host: FIXTURE_SERVER_HOST, + port: FIXTURE_SERVER_PORT, + exclusive: true, + } + + return new Promise((resolve, reject) => { + this._server = this._app.listen(options) + this._server.once('error', reject) + this._server.once('listening', resolve) + }) + } + + async stop () { + if (!this._server) { + return + } + + await new Promise((resolve, reject) => { + this._server.close() + this._server.once('error', reject) + this._server.once('close', resolve) + }) + } + + async loadState (directory) { + const statePath = path.resolve(__dirname, directory, 'state.json') + + let state + if (this._initialStateCache.has(statePath)) { + state = this._initialStateCache.get(statePath) + } else { + const data = await fs.readFile(statePath) + state = JSON.parse(data.toString('utf-8')) + this._initialStateCache.set(statePath, state) + } + + this._stateMap.set(CURRENT_STATE_KEY, state) + } + + _isStateRequest (ctx) { + return ctx.method === 'GET' && ctx.path === '/state.json' + } +} + +module.exports = FixtureServer diff --git a/test/e2e/fixtures/README.md b/test/e2e/fixtures/README.md new file mode 100644 index 000000000000..e8bbe39ac3e2 --- /dev/null +++ b/test/e2e/fixtures/README.md @@ -0,0 +1,23 @@ +# End-to-end tests + +This directory contains the fixture data used to bootstrap the individual e2e tests. Each sub-directory contains +one thing: + +1. A `state.json` file that represents a the saved state for the extension (see _Generating fixture data_ below) + +## Generating fixture data + +Fixture data can be generated by following these steps: + +1. Load the unpacked extension in development or test mode +2. Inspecting the background context of the extension +3. Call `metamaskGetState`, then call [`copy`][1] on the results + +You can then paste the contents directly in your fixture file. + +```js +copy(await metamaskGetState()) +``` + + + [1]:https://developers.google.com/web/tools/chrome-devtools/console/utilities diff --git a/test/e2e/fixtures/imported-account/state.json b/test/e2e/fixtures/imported-account/state.json new file mode 100644 index 000000000000..3eb3b00705b7 --- /dev/null +++ b/test/e2e/fixtures/imported-account/state.json @@ -0,0 +1,124 @@ +{ + "data": { + "AppStateController": { + "mkrMigrationReminderTimestamp": null + }, + "CachedBalancesController": { + "cachedBalances": { + "4": {} + } + }, + "CurrencyController": { + "conversionDate": 1575697244.188, + "conversionRate": 149.61, + "currentCurrency": "usd", + "nativeCurrency": "ETH" + }, + "IncomingTransactionsController": { + "incomingTransactions": {}, + "incomingTxLastFetchedBlocksByNetwork": { + "goerli": null, + "kovan": null, + "mainnet": null, + "rinkeby": 5570536 + } + }, + "KeyringController": { + "vault": "{\"data\":\"s6TpYjlUNsn7ifhEFTkuDGBUM1GyOlPrim7JSjtfIxgTt8/6MiXgiR/CtFfR4dWW2xhq85/NGIBYEeWrZThGdKGarBzeIqBfLFhw9n509jprzJ0zc2Rf+9HVFGLw+xxC4xPxgCS0IIWeAJQ+XtGcHmn0UZXriXm8Ja4kdlow6SWinB7sr/WM3R0+frYs4WgllkwggDf2/Tv6VHygvLnhtzp6hIJFyTjh+l/KnyJTyZW1TkZhDaNDzX3SCOHT\",\"iv\":\"FbeHDAW5afeWNORfNJBR0Q==\",\"salt\":\"TxZ+WbCW6891C9LK/hbMAoUsSEW1E8pyGLVBU6x5KR8=\"}" + }, + "NetworkController": { + "network": "5777", + "provider": { + "nickname": "", + "rpcTarget": "", + "ticker": "ETH", + "type": "localhost" + }, + "settings": { + "ticker": "ETH" + } + }, + "OnboardingController": { + "onboardingTabs": {}, + "seedPhraseBackedUp": false + }, + "PermissionsMetadata": { + "domainMetadata": { + "metamask.github.io": { + "icon": null, + "name": "M E T A M A S K M E S H T E S T" + } + }, + "permissionsHistory": {}, + "permissionsLog": [ + { + "id": 746677923, + "method": "eth_accounts", + "methodType": "restricted", + "origin": "metamask.github.io", + "request": { + "id": 746677923, + "jsonrpc": "2.0", + "method": "eth_accounts", + "origin": "metamask.github.io", + "params": [] + }, + "requestTime": 1575697241368, + "response": { + "id": 746677923, + "jsonrpc": "2.0", + "result": [] + }, + "responseTime": 1575697241370, + "success": true + } + ] + }, + "PreferencesController": { + "accountTokens": { + "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { + "rinkeby": [], + "ropsten": [] + } + }, + "assetImages": {}, + "completedOnboarding": true, + "currentLocale": "en", + "featureFlags": { + "showIncomingTransactions": true, + "transactionTime": false + }, + "firstTimeFlowType": "create", + "forgottenPassword": false, + "frequentRpcListDetail": [], + "identities": { + "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { + "address": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", + "name": "Account 1" + } + }, + "knownMethodData": {}, + "lostIdentities": {}, + "metaMetricsId": null, + "metaMetricsSendCount": 0, + "participateInMetaMetrics": false, + "preferences": { + "useNativeCurrencyAsPrimaryCurrency": true + }, + "selectedAddress": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", + "suggestedTokens": {}, + "tokens": [], + "useBlockie": false, + "useNonceField": false, + "usePhishDetect": true + }, + "config": {}, + "firstTimeInfo": { + "date": 1575697234195, + "version": "7.7.0" + } + }, + "meta": { + "version": 40 + } +} diff --git a/test/e2e/fixtures/localization/state.json b/test/e2e/fixtures/localization/state.json new file mode 100644 index 000000000000..74325c8c40c8 --- /dev/null +++ b/test/e2e/fixtures/localization/state.json @@ -0,0 +1,125 @@ +{ + "data": { + "AppStateController": { + "mkrMigrationReminderTimestamp": null + }, + "CachedBalancesController": { + "cachedBalances": { + "4": {} + } + }, + "CurrencyController": { + "conversionDate": 1594323667.203, + "conversionRate": 14205.88, + "currentCurrency": "php", + "nativeCurrency": "ETH" + }, + "IncomingTransactionsController": { + "incomingTransactions": {}, + "incomingTxLastFetchedBlocksByNetwork": { + "goerli": null, + "kovan": null, + "mainnet": null, + "rinkeby": 5570536 + } + }, + "KeyringController": { + "vault": "{\"data\":\"s6TpYjlUNsn7ifhEFTkuDGBUM1GyOlPrim7JSjtfIxgTt8/6MiXgiR/CtFfR4dWW2xhq85/NGIBYEeWrZThGdKGarBzeIqBfLFhw9n509jprzJ0zc2Rf+9HVFGLw+xxC4xPxgCS0IIWeAJQ+XtGcHmn0UZXriXm8Ja4kdlow6SWinB7sr/WM3R0+frYs4WgllkwggDf2/Tv6VHygvLnhtzp6hIJFyTjh+l/KnyJTyZW1TkZhDaNDzX3SCOHT\",\"iv\":\"FbeHDAW5afeWNORfNJBR0Q==\",\"salt\":\"TxZ+WbCW6891C9LK/hbMAoUsSEW1E8pyGLVBU6x5KR8=\"}" + }, + "NetworkController": { + "network": "5777", + "provider": { + "nickname": "", + "rpcTarget": "", + "ticker": "ETH", + "type": "localhost" + }, + "settings": { + "ticker": "ETH" + } + }, + "OnboardingController": { + "onboardingTabs": {}, + "seedPhraseBackedUp": false + }, + "PermissionsMetadata": { + "domainMetadata": { + "metamask.github.io": { + "icon": null, + "name": "M E T A M A S K M E S H T E S T" + } + }, + "permissionsHistory": {}, + "permissionsLog": [ + { + "id": 746677923, + "method": "eth_accounts", + "methodType": "restricted", + "origin": "metamask.github.io", + "request": { + "id": 746677923, + "jsonrpc": "2.0", + "method": "eth_accounts", + "origin": "metamask.github.io", + "params": [] + }, + "requestTime": 1575697241368, + "response": { + "id": 746677923, + "jsonrpc": "2.0", + "result": [] + }, + "responseTime": 1575697241370, + "success": true + } + ] + }, + "PreferencesController": { + "accountTokens": { + "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { + "rinkeby": [], + "ropsten": [] + } + }, + "assetImages": {}, + "completedOnboarding": true, + "currentLocale": "en", + "featureFlags": { + "showIncomingTransactions": true, + "transactionTime": false + }, + "firstTimeFlowType": "create", + "forgottenPassword": false, + "frequentRpcListDetail": [], + "identities": { + "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { + "address": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", + "name": "Account 1" + } + }, + "knownMethodData": {}, + "lostIdentities": {}, + "metaMetricsId": null, + "metaMetricsSendCount": 0, + "participateInMetaMetrics": false, + "preferences": { + "showFiatInTestnets": true, + "useNativeCurrencyAsPrimaryCurrency": true + }, + "selectedAddress": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", + "suggestedTokens": {}, + "tokens": [], + "useBlockie": false, + "useNonceField": false, + "usePhishDetect": true + }, + "config": {}, + "firstTimeInfo": { + "date": 1575697234195, + "version": "7.7.0" + } + }, + "meta": { + "version": 40 + } +} diff --git a/test/e2e/fixtures/personal-sign/state.json b/test/e2e/fixtures/personal-sign/state.json new file mode 100644 index 000000000000..b3dbe5ed6d7a --- /dev/null +++ b/test/e2e/fixtures/personal-sign/state.json @@ -0,0 +1,175 @@ +{ + "data": { + "AppStateController": { + "connectedStatusPopoverHasBeenShown": false + }, + "CachedBalancesController": { + "cachedBalances": { + "4": {}, + "5777": { + "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": "0x15af1d78b58c40000" + } + } + }, + "CurrencyController": { + "conversionDate": 1594348502.519, + "conversionRate": 240.09, + "currentCurrency": "usd", + "nativeCurrency": "ETH" + }, + "IncomingTransactionsController": { + "incomingTransactions": {}, + "incomingTxLastFetchedBlocksByNetwork": { + "goerli": null, + "kovan": null, + "mainnet": null, + "rinkeby": 5570536, + "localhost": 98 + } + }, + "KeyringController": { + "vault": "{\"data\":\"s6TpYjlUNsn7ifhEFTkuDGBUM1GyOlPrim7JSjtfIxgTt8/6MiXgiR/CtFfR4dWW2xhq85/NGIBYEeWrZThGdKGarBzeIqBfLFhw9n509jprzJ0zc2Rf+9HVFGLw+xxC4xPxgCS0IIWeAJQ+XtGcHmn0UZXriXm8Ja4kdlow6SWinB7sr/WM3R0+frYs4WgllkwggDf2/Tv6VHygvLnhtzp6hIJFyTjh+l/KnyJTyZW1TkZhDaNDzX3SCOHT\",\"iv\":\"FbeHDAW5afeWNORfNJBR0Q==\",\"salt\":\"TxZ+WbCW6891C9LK/hbMAoUsSEW1E8pyGLVBU6x5KR8=\"}" + }, + "NetworkController": { + "provider": { + "nickname": "", + "rpcTarget": "", + "ticker": "ETH", + "type": "localhost" + }, + "network": "5777", + "settings": { + "ticker": "ETH" + } + }, + "OnboardingController": { + "onboardingTabs": {}, + "seedPhraseBackedUp": false + }, + "PermissionsMetadata": { + "permissionsLog": [ + { + "id": 1764280960, + "method": "eth_requestAccounts", + "methodType": "restricted", + "origin": "http://127.0.0.1:8080", + "request": { + "method": "eth_requestAccounts", + "jsonrpc": "2.0", + "id": 1764280960, + "origin": "http://127.0.0.1:8080", + "tabId": 2 + }, + "requestTime": 1594348329232, + "response": { + "id": 1764280960, + "jsonrpc": "2.0", + "result": [ + "0x5cfe73b6021e818b776b421b1c4db2474086a7e1" + ] + }, + "responseTime": 1594348332276, + "success": true + } + ], + "permissionsHistory": { + "http://127.0.0.1:8080": { + "eth_accounts": { + "accounts": { + "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": 1594348332276 + }, + "lastApproved": 1594348332276 + } + } + }, + "domainMetadata": { + "http://127.0.0.1:8080": { + "name": "E2E Test Dapp", + "icon": "http://127.0.0.1:8080/metamask-fox.svg", + "lastUpdated": 1594348323811, + "host": "127.0.0.1:8080" + } + } + }, + "PreferencesController": { + "frequentRpcListDetail": [], + "accountTokens": { + "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { + "rinkeby": [], + "ropsten": [] + } + }, + "assetImages": {}, + "tokens": [], + "suggestedTokens": {}, + "useBlockie": false, + "useNonceField": false, + "usePhishDetect": true, + "featureFlags": { + "showIncomingTransactions": true, + "transactionTime": false + }, + "knownMethodData": {}, + "participateInMetaMetrics": false, + "firstTimeFlowType": "create", + "currentLocale": "en", + "identities": { + "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { + "address": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", + "name": "Account 1" + } + }, + "lostIdentities": {}, + "forgottenPassword": false, + "preferences": { + "useNativeCurrencyAsPrimaryCurrency": true + }, + "completedOnboarding": true, + "metaMetricsId": null, + "metaMetricsSendCount": 0, + "ipfsGateway": "dweb.link", + "selectedAddress": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1" + }, + "config": {}, + "firstTimeInfo": { + "date": 1575697234195, + "version": "7.7.0" + }, + "PermissionsController": { + "permissionsRequests": [], + "permissionsDescriptions": {}, + "domains": { + "http://127.0.0.1:8080": { + "permissions": [ + { + "@context": [ + "https://github.com/MetaMask/rpc-cap" + ], + "parentCapability": "eth_accounts", + "id": "f55a1c15-ea48-4088-968e-63be474d42fa", + "date": 1594348332268, + "invoker": "http://127.0.0.1:8080", + "caveats": [ + { + "type": "limitResponseLength", + "value": 1, + "name": "primaryAccountOnly" + }, + { + "type": "filterResponse", + "value": [ + "0x5cfe73b6021e818b776b421b1c4db2474086a7e1" + ], + "name": "exposedAccounts" + } + ] + } + ] + } + } + } + }, + "meta": { + "version": 47 + } +} diff --git a/test/e2e/from-import-ui.spec.js b/test/e2e/from-import-ui.spec.js new file mode 100644 index 000000000000..d9b93bcada60 --- /dev/null +++ b/test/e2e/from-import-ui.spec.js @@ -0,0 +1,333 @@ +const assert = require('assert') +const webdriver = require('selenium-webdriver') + +const { By, Key, until } = webdriver +const enLocaleMessages = require('../../app/_locales/en/messages.json') +const { + regularDelayMs, + largeDelayMs, +} = require('./helpers') +const { buildWebDriver } = require('./webdriver') +const Ganache = require('./ganache') + +const ganacheServer = new Ganache() + +describe('Using MetaMask with an existing account', function () { + let driver + + const testSeedPhrase = 'forum vessel pink push lonely enact gentle tail admit parrot grunt dress' + const testAddress = '0x0Cc5261AB8cE458dc977078A3623E2BaDD27afD3' + const testPrivateKey2 = '14abe6f4aab7f9f626fe981c864d0adeb5685f289ac9270c27b8fd790b4235d6' + const testPrivateKey3 = 'F4EC2590A0C10DE95FBF4547845178910E40F5035320C516A18C117DE02B5669' + + this.timeout(0) + this.bail(true) + + before(async function () { + await ganacheServer.start({ + accounts: [ + { + secretKey: '0x53CB0AB5226EEBF4D872113D98332C1555DC304443BEE1CF759D15798D3C55A9', + balance: 25000000000000000000, + }, + ], + }) + const result = await buildWebDriver() + driver = result.driver + }) + + afterEach(async function () { + if (process.env.SELENIUM_BROWSER === 'chrome') { + const errors = await driver.checkBrowserForConsoleErrors(driver) + if (errors.length) { + const errorReports = errors.map((err) => err.message) + const errorMessage = `Errors found in browser console:\n${errorReports.join('\n')}` + console.error(new Error(errorMessage)) + } + } + if (this.currentTest.state === 'failed') { + await driver.verboseReportOnFailure(this.currentTest.title) + } + }) + + after(async function () { + await ganacheServer.quit() + await driver.quit() + }) + + describe('First time flow starting from an existing seed phrase', function () { + it('clicks the continue button on the welcome screen', async function () { + await driver.findElement(By.css('.welcome-page__header')) + await driver.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.getStarted.message}')]`)) + await driver.delay(largeDelayMs) + }) + + it('clicks the "Import Wallet" option', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Import wallet')]`)) + await driver.delay(largeDelayMs) + }) + + it('clicks the "No thanks" option on the metametrics opt-in screen', async function () { + await driver.clickElement(By.css('.btn-default')) + await driver.delay(largeDelayMs) + }) + + it('imports a seed phrase', async function () { + const [seedTextArea] = await driver.findElements(By.css('input[placeholder="Paste seed phrase from clipboard"]')) + await seedTextArea.sendKeys(testSeedPhrase) + await driver.delay(regularDelayMs) + + const [password] = await driver.findElements(By.id('password')) + await password.sendKeys('correct horse battery staple') + const [confirmPassword] = await driver.findElements(By.id('confirm-password')) + confirmPassword.sendKeys('correct horse battery staple') + + await driver.clickElement(By.css('.first-time-flow__terms')) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Import')]`)) + await driver.delay(regularDelayMs) + }) + + it('clicks through the success screen', async function () { + await driver.findElement(By.xpath(`//div[contains(text(), 'Congratulations')]`)) + await driver.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.endOfFlowMessage10.message}')]`)) + await driver.delay(regularDelayMs) + }) + }) + + describe('Show account information', function () { + it('shows the correct account address', async function () { + await driver.clickElement(By.css('[data-testid="account-options-menu-button"]')) + await driver.clickElement(By.css('[data-testid="account-options-menu__account-details"]')) + await driver.findVisibleElement(By.css('.qr-code__wrapper')) + await driver.delay(regularDelayMs) + + const [address] = await driver.findElements(By.css('.readonly-input__input')) + assert.equal(await address.getAttribute('value'), testAddress) + + await driver.clickElement(By.css('.account-modal__close')) + await driver.delay(largeDelayMs) + }) + + it('shows a QR code for the account', async function () { + await driver.clickElement(By.css('[data-testid="account-options-menu-button"]')) + await driver.clickElement(By.css('[data-testid="account-options-menu__account-details"]')) + await driver.findVisibleElement(By.css('.qr-code__wrapper')) + const detailModal = await driver.findElement(By.css('span .modal')) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.css('.account-modal__close')) + await driver.wait(until.stalenessOf(detailModal)) + await driver.delay(regularDelayMs) + }) + }) + + describe('Lock and unlock', function () { + it('logs out of the account', async function () { + await driver.clickElement(By.css('.account-menu__icon .identicon')) + await driver.delay(regularDelayMs) + + const lockButton = await driver.findClickableElement(By.css('.account-menu__lock-button')) + assert.equal(await lockButton.getText(), 'Lock') + await lockButton.click() + await driver.delay(regularDelayMs) + }) + + it('accepts the account password after lock', async function () { + const passwordField = await driver.findElement(By.id('password')) + await passwordField.sendKeys('correct horse battery staple') + await passwordField.sendKeys(Key.ENTER) + await driver.delay(largeDelayMs) + }) + }) + + describe('Add an account', function () { + it('switches to localhost', async function () { + await driver.clickElement(By.css('.network-name')) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//span[contains(text(), 'Localhost')]`)) + await driver.delay(largeDelayMs) + }) + + it('choose Create Account from the account menu', async function () { + await driver.clickElement(By.css('.account-menu__icon')) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//div[contains(text(), 'Create Account')]`)) + await driver.delay(regularDelayMs) + }) + + it('set account name', async function () { + const [accountName] = await driver.findElements(By.css('.new-account-create-form input')) + await accountName.sendKeys('2nd account') + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Create')]`)) + await driver.delay(regularDelayMs) + }) + + it('should show the correct account name', async function () { + const accountName = await driver.findElement(By.css('.selected-account__name')) + assert.equal(await accountName.getText(), '2nd account') + await driver.delay(regularDelayMs) + }) + }) + + describe('Switch back to original account', function () { + it('chooses the original account from the account menu', async function () { + await driver.clickElement(By.css('.account-menu__icon')) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.css('.account-menu__name')) + await driver.delay(regularDelayMs) + }) + }) + + describe('Send ETH from inside MetaMask', function () { + it('starts a send transaction', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Send')]`)) + await driver.delay(regularDelayMs) + + const inputAddress = await driver.findElement(By.css('input[placeholder="Search, public address (0x), or ENS"]')) + await inputAddress.sendKeys('0x2f318C334780961FB129D2a6c30D0763d9a5C970') + + const inputAmount = await driver.findElement(By.css('.unit-input__input')) + await inputAmount.sendKeys('1') + + // Set the gas limit + await driver.clickElement(By.css('.advanced-gas-options-btn')) + await driver.delay(regularDelayMs) + + const gasModal = await driver.findElement(By.css('span .modal')) + await driver.clickElement(By.xpath(`//button[contains(text(), 'Save')]`)) + await driver.wait(until.stalenessOf(gasModal)) + await driver.delay(regularDelayMs) + + // Continue to next screen + await driver.clickElement(By.xpath(`//button[contains(text(), 'Next')]`)) + await driver.delay(regularDelayMs) + }) + + it('confirms the transaction', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Confirm')]`)) + await driver.delay(regularDelayMs) + }) + + it('finds the transaction in the transactions list', async function () { + await driver.clickElement(By.css('[data-testid="home__activity-tab"]')) + await driver.wait(async () => { + const confirmedTxes = await driver.findElements(By.css('.transaction-list__completed-transactions .transaction-list-item')) + return confirmedTxes.length === 1 + }, 10000) + + const txValues = await driver.findElements(By.css('.transaction-list-item__primary-currency')) + assert.equal(txValues.length, 1) + assert.ok((/-1\s*ETH/u).test(await txValues[0].getText())) + }) + }) + + describe('Imports an account with private key', function () { + it('choose Create Account from the account menu', async function () { + await driver.clickElement(By.css('.account-menu__icon')) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//div[contains(text(), 'Import Account')]`)) + await driver.delay(regularDelayMs) + }) + + it('enter private key', async function () { + const privateKeyInput = await driver.findElement(By.css('#private-key-box')) + await privateKeyInput.sendKeys(testPrivateKey2) + await driver.delay(regularDelayMs) + await driver.clickElement(By.xpath(`//button[contains(text(), 'Import')]`)) + await driver.delay(regularDelayMs) + }) + + it('should show the correct account name', async function () { + const accountName = await driver.findElement(By.css('.selected-account__name')) + assert.equal(await accountName.getText(), 'Account 4') + await driver.delay(regularDelayMs) + }) + + it('should show the imported label', async function () { + await driver.clickElement(By.css('.account-menu__icon')) + + // confirm 4th account is account 4, as expected + const accountMenuItemSelector = '.account-menu__account:nth-child(4)' + const accountName = await driver.findElement(By.css(`${accountMenuItemSelector} .account-menu__name`)) + assert.equal(await accountName.getText(), 'Account 4') + // confirm label is present on the same menu item + const importedLabel = await driver.findElement(By.css(`${accountMenuItemSelector} .keyring-label`)) + assert.equal(await importedLabel.getText(), 'IMPORTED') + }) + }) + + describe('Imports and removes an account', function () { + it('choose Create Account from the account menu', async function () { + await driver.clickElement(By.xpath(`//div[contains(text(), 'Import Account')]`)) + await driver.delay(regularDelayMs) + }) + + it('enter private key', async function () { + const privateKeyInput = await driver.findElement(By.css('#private-key-box')) + await privateKeyInput.sendKeys(testPrivateKey3) + await driver.delay(regularDelayMs) + await driver.clickElement(By.xpath(`//button[contains(text(), 'Import')]`)) + await driver.delay(regularDelayMs) + }) + + it('should see new account in account menu', async function () { + const accountName = await driver.findElement(By.css('.selected-account__name')) + assert.equal(await accountName.getText(), 'Account 5') + await driver.delay(regularDelayMs) + + await driver.clickElement(By.css('.account-menu__icon')) + await driver.delay(regularDelayMs) + + const accountListItems = await driver.findElements(By.css('.account-menu__account')) + assert.equal(accountListItems.length, 5) + + await driver.clickPoint(By.css('.account-menu__icon'), 0, 0) + }) + + it('should open the remove account modal', async function () { + await driver.clickElement(By.css('[data-testid="account-options-menu-button"]')) + + await driver.clickElement(By.css('[data-testid="account-options-menu__remove-account"]')) + + await driver.findElement(By.css('.confirm-remove-account__account')) + }) + + it('should remove the account', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Remove')]`)) + + await driver.delay(regularDelayMs) + + const accountName = await driver.findElement(By.css('.selected-account__name')) + assert.equal(await accountName.getText(), 'Account 1') + await driver.delay(regularDelayMs) + + await driver.clickElement(By.css('.account-menu__icon')) + + const accountListItems = await driver.findElements(By.css('.account-menu__account')) + assert.equal(accountListItems.length, 4) + }) + }) + + describe('Connects to a Hardware wallet', function () { + it('choose Connect Hardware Wallet from the account menu', async function () { + await driver.clickElement(By.xpath(`//div[contains(text(), 'Connect Hardware Wallet')]`)) + await driver.delay(regularDelayMs) + }) + + it('should open the TREZOR Connect popup', async function () { + await driver.clickElement(By.css('.hw-connect__btn:nth-of-type(2)')) + await driver.delay(regularDelayMs) + await driver.clickElement(By.xpath(`//button[contains(text(), 'Connect')]`)) + await driver.delay(regularDelayMs) + const allWindows = await driver.getAllWindowHandles() + assert.equal(allWindows.length, 2) + }) + }) +}) diff --git a/test/e2e/func.js b/test/e2e/func.js deleted file mode 100644 index dfad8466c0ad..000000000000 --- a/test/e2e/func.js +++ /dev/null @@ -1,117 +0,0 @@ -require('chromedriver') -require('geckodriver') -const fs = require('fs-extra') -const os = require('os') -const path = require('path') -const pify = require('pify') -const prependFile = pify(require('prepend-file')) -const webdriver = require('selenium-webdriver') -const Command = require('selenium-webdriver/lib/command').Command -const By = webdriver.By - -module.exports = { - delay, - createModifiedTestBuild, - setupBrowserAndExtension, - verboseReportOnFailure, - buildChromeWebDriver, - buildFirefoxWebdriver, - installWebExt, - getExtensionIdChrome, - getExtensionIdFirefox, -} - -function delay (time) { - return new Promise(resolve => setTimeout(resolve, time)) -} - -async function createModifiedTestBuild ({ browser, srcPath }) { - // copy build to test-builds directory - const extPath = path.resolve(`test-builds/${browser}`) - await fs.ensureDir(extPath) - await fs.copy(srcPath, extPath) - // inject METAMASK_TEST_CONFIG setting default test network - const config = { NetworkController: { provider: { type: 'localhost' } } } - await prependFile(`${extPath}/background.js`, `window.METAMASK_TEST_CONFIG=${JSON.stringify(config)};\n`) - return { extPath } -} - -async function setupBrowserAndExtension ({ browser, extPath }) { - let driver, extensionId, extensionUri - - if (browser === 'chrome') { - driver = buildChromeWebDriver(extPath) - extensionId = await getExtensionIdChrome(driver) - extensionUri = `chrome-extension://${extensionId}/home.html` - } else if (browser === 'firefox') { - driver = buildFirefoxWebdriver() - await installWebExt(driver, extPath) - await delay(700) - extensionId = await getExtensionIdFirefox(driver) - extensionUri = `moz-extension://${extensionId}/home.html` - } else { - throw new Error(`Unknown Browser "${browser}"`) - } - - return { driver, extensionId, extensionUri } -} - -function buildChromeWebDriver (extPath, opts = {}) { - const tmpProfile = fs.mkdtempSync(path.join(os.tmpdir(), 'mm-chrome-profile')) - const args = [ - `load-extension=${extPath}`, - `user-data-dir=${tmpProfile}`, - ] - if (opts.responsive) { - args.push('--auto-open-devtools-for-tabs') - } - return new webdriver.Builder() - .withCapabilities({ - chromeOptions: { - args, - binary: process.env.SELENIUM_CHROME_BINARY, - }, - }) - .build() -} - -function buildFirefoxWebdriver (opts = {}) { - const driver = new webdriver.Builder().build() - if (opts.responsive) { - driver.manage().window().setSize(320, 600) - } - return driver -} - -async function getExtensionIdChrome (driver) { - await driver.get('chrome://extensions') - const extensionId = await driver.executeScript('return document.querySelector("extensions-manager").shadowRoot.querySelector("extensions-item-list").shadowRoot.querySelector("extensions-item:nth-child(2)").getAttribute("id")') - return extensionId -} - -async function getExtensionIdFirefox (driver) { - await driver.get('about:debugging#addons') - const extensionId = await driver.findElement(By.css('dd.addon-target-info-content:nth-child(6) > span:nth-child(1)')).getText() - return extensionId -} - -async function installWebExt (driver, extension) { - const cmd = await new Command('moz-install-web-ext') - .setParameter('path', path.resolve(extension)) - .setParameter('temporary', true) - - await driver.getExecutor() - .defineCommand(cmd.getName(), 'POST', '/session/:sessionId/moz/addon/install') - - return await driver.schedule(cmd, 'installWebExt(' + extension + ')') -} - -async function verboseReportOnFailure ({ browser, driver, title }) { - const artifactDir = `./test-artifacts/${browser}/${title}` - const filepathBase = `${artifactDir}/test-failure` - await fs.ensureDir(artifactDir) - const screenshot = await driver.takeScreenshot() - await fs.writeFile(`${filepathBase}-screenshot.png`, screenshot, { encoding: 'base64' }) - const htmlSource = await driver.getPageSource() - await fs.writeFile(`${filepathBase}-dom.html`, htmlSource) -} diff --git a/test/e2e/ganache.js b/test/e2e/ganache.js new file mode 100644 index 000000000000..edce5b15e4d2 --- /dev/null +++ b/test/e2e/ganache.js @@ -0,0 +1,36 @@ +const { promisify } = require('util') +const ganache = require('ganache-core') + +const defaultOptions = { + blockTime: 2, + network_id: 5777, + mnemonic: 'phrase upgrade clock rough situate wedding elder clever doctor stamp excess tent', + port: 8545, + vmErrorsOnRPCResponse: false, +} + +class Ganache { + async start (opts) { + const options = { ...defaultOptions, ...opts } + const { port } = options + this._server = ganache.server(options) + + const listen = promisify(this._server.listen).bind(this._server) + const blockchain = await listen(port) + + return { + ...blockchain, + port, + } + } + + async quit () { + if (!this._server) { + throw new Error('Server not running yet') + } + const close = promisify(this._server.close).bind(this._server) + await close() + } +} + +module.exports = Ganache diff --git a/test/e2e/helpers.js b/test/e2e/helpers.js new file mode 100644 index 000000000000..b06efb3ec973 --- /dev/null +++ b/test/e2e/helpers.js @@ -0,0 +1,78 @@ +const path = require('path') +const createStaticServer = require('../../development/create-static-server') +const Ganache = require('./ganache') +const FixtureServer = require('./fixture-server') +const { buildWebDriver } = require('./webdriver') + +const tinyDelayMs = 200 +const regularDelayMs = tinyDelayMs * 2 +const largeDelayMs = regularDelayMs * 2 + +const dappPort = 8080 + +async function withFixtures (options, callback) { + const { dapp, fixtures, ganacheOptions, driverOptions, title } = options + const fixtureServer = new FixtureServer() + const ganacheServer = new Ganache() + let dappServer + + let webDriver + try { + await ganacheServer.start(ganacheOptions) + await fixtureServer.start() + await fixtureServer.loadState(path.join(__dirname, 'fixtures', fixtures)) + if (dapp) { + const dappDirectory = path.resolve(__dirname, '..', '..', 'node_modules', '@metamask', 'test-dapp', 'dist') + dappServer = createStaticServer(dappDirectory) + dappServer.listen(dappPort) + await new Promise((resolve, reject) => { + dappServer.on('listening', resolve) + dappServer.on('error', reject) + }) + } + const { driver } = await buildWebDriver(driverOptions) + webDriver = driver + + // eslint-disable-next-line callback-return + await callback({ + driver, + }) + + if (process.env.SELENIUM_BROWSER === 'chrome') { + const errors = await driver.checkBrowserForConsoleErrors(driver) + if (errors.length) { + const errorReports = errors.map((err) => err.message) + const errorMessage = `Errors found in browser console:\n${errorReports.join('\n')}` + throw new Error(errorMessage) + } + } + } catch (error) { + if (webDriver) { + await webDriver.verboseReportOnFailure(title) + } + throw error + } finally { + await fixtureServer.stop() + await ganacheServer.quit() + if (webDriver) { + await webDriver.quit() + } + if (dappServer) { + await new Promise((resolve, reject) => { + dappServer.close((error) => { + if (error) { + return reject(error) + } + return resolve() + }) + }) + } + } +} + +module.exports = { + tinyDelayMs, + regularDelayMs, + largeDelayMs, + withFixtures, +} diff --git a/test/e2e/incremental-security.spec.js b/test/e2e/incremental-security.spec.js new file mode 100644 index 000000000000..6b76bae129b7 --- /dev/null +++ b/test/e2e/incremental-security.spec.js @@ -0,0 +1,206 @@ +const assert = require('assert') +const webdriver = require('selenium-webdriver') + +const { By, until } = webdriver +const enLocaleMessages = require('../../app/_locales/en/messages.json') +const { + tinyDelayMs, + regularDelayMs, + largeDelayMs, +} = require('./helpers') +const { buildWebDriver } = require('./webdriver') +const Ganache = require('./ganache') + +const ganacheServer = new Ganache() + +describe('MetaMask', function () { + let driver + let publicAddress + + this.timeout(0) + this.bail(true) + + before(async function () { + await ganacheServer.start({ + accounts: [ + { + secretKey: '0x250F458997A364988956409A164BA4E16F0F99F916ACDD73ADCD3A1DE30CF8D1', + balance: 0, + }, + { + secretKey: '0x53CB0AB5226EEBF4D872113D98332C1555DC304443BEE1CF759D15798D3C55A9', + balance: 25000000000000000000, + }, + ], + }) + const result = await buildWebDriver() + driver = result.driver + }) + + afterEach(async function () { + if (process.env.SELENIUM_BROWSER === 'chrome') { + const errors = await driver.checkBrowserForConsoleErrors(driver) + if (errors.length) { + const errorReports = errors.map((err) => err.message) + const errorMessage = `Errors found in browser console:\n${errorReports.join('\n')}` + console.error(new Error(errorMessage)) + } + } + if (this.currentTest.state === 'failed') { + await driver.verboseReportOnFailure(this.currentTest.title) + } + }) + + after(async function () { + await ganacheServer.quit() + await driver.quit() + }) + + describe('Going through the first time flow, but skipping the seed phrase challenge', function () { + it('clicks the continue button on the welcome screen', async function () { + await driver.findElement(By.css('.welcome-page__header')) + await driver.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.getStarted.message}')]`)) + await driver.delay(largeDelayMs) + }) + + it('clicks the "Create New Wallet" option', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Create a Wallet')]`)) + await driver.delay(largeDelayMs) + }) + + it('clicks the "No thanks" option on the metametrics opt-in screen', async function () { + await driver.clickElement(By.css('.btn-default')) + await driver.delay(largeDelayMs) + }) + + it('accepts a secure password', async function () { + const passwordBox = await driver.findElement(By.css('.first-time-flow__form #create-password')) + const passwordBoxConfirm = await driver.findElement(By.css('.first-time-flow__form #confirm-password')) + + await passwordBox.sendKeys('correct horse battery staple') + await passwordBoxConfirm.sendKeys('correct horse battery staple') + + await driver.clickElement(By.css('.first-time-flow__checkbox')) + + await driver.clickElement(By.css('.first-time-flow__form button')) + await driver.delay(regularDelayMs) + }) + + it('skips the seed phrase challenge', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.remindMeLater.message}')]`)) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.css('[data-testid="account-options-menu-button"]')) + await driver.clickElement(By.css('[data-testid="account-options-menu__account-details"]')) + }) + + it('gets the current accounts address', async function () { + const addressInput = await driver.findElement(By.css('.readonly-input__input')) + publicAddress = await addressInput.getAttribute('value') + + const accountModal = await driver.findElement(By.css('span .modal')) + + await driver.clickElement(By.css('.account-modal__close')) + + await driver.wait(until.stalenessOf(accountModal)) + await driver.delay(regularDelayMs) + }) + + }) + + describe('send to current account from dapp with different provider', function () { + let extension + + it('switches to dapp screen', async function () { + const windowHandles = await driver.getAllWindowHandles() + extension = windowHandles[0] + + await driver.openNewPage('http://127.0.0.1:8080/') + await driver.delay(regularDelayMs) + }) + + it('sends eth to the current account', async function () { + const addressInput = await driver.findElement(By.css('#address')) + await addressInput.sendKeys(publicAddress) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.css('#send')) + + const txStatus = await driver.findElement(By.css('#success')) + await driver.wait(until.elementTextMatches(txStatus, /Success/u), 15000) + }) + + it('switches back to MetaMask', async function () { + await driver.switchToWindow(extension) + }) + + it('should have the correct amount of eth', async function () { + const balances = await driver.findElements(By.css('.currency-display-component__text')) + await driver.wait(until.elementTextMatches(balances[0], /1/u), 15000) + const balance = await balances[0].getText() + + assert.equal(balance, '1') + }) + }) + + describe('backs up the seed phrase', function () { + it('should show a backup reminder', async function () { + const backupReminder = await driver.findElements(By.xpath("//div[contains(@class, 'home-notification__text') and contains(text(), 'Backup your Secret Recovery code to keep your wallet and funds secure')]")) + assert.equal(backupReminder.length, 1) + }) + + it('should take the user to the seedphrase backup screen', async function () { + await driver.clickElement(By.css('.home-notification__accept-button')) + await driver.delay(regularDelayMs) + }) + + let seedPhrase + + it('reveals the seed phrase', async function () { + const byRevealButton = By.css('.reveal-seed-phrase__secret-blocker .reveal-seed-phrase__reveal-button') + await driver.clickElement(byRevealButton) + await driver.delay(regularDelayMs) + + const revealedSeedPhrase = await driver.findElement(By.css('.reveal-seed-phrase__secret-words')) + seedPhrase = await revealedSeedPhrase.getText() + assert.equal(seedPhrase.split(' ').length, 12) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.next.message}')]`)) + await driver.delay(regularDelayMs) + }) + + async function clickWordAndWait (word) { + await driver.clickElement(By.css(`[data-testid="seed-phrase-sorted"] [data-testid="draggable-seed-${word}"]`)) + await driver.delay(tinyDelayMs) + } + + it('can retype the seed phrase', async function () { + const words = seedPhrase.split(' ') + + for (const word of words) { + await clickWordAndWait(word) + } + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Confirm')]`)) + await driver.delay(regularDelayMs) + }) + + it('can click through the success screen', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'All Done')]`)) + await driver.delay(regularDelayMs) + }) + + it('should have the correct amount of eth', async function () { + const balances = await driver.findElements(By.css('.currency-display-component__text')) + await driver.wait(until.elementTextMatches(balances[0], /1/u), 15000) + const balance = await balances[0].getText() + + assert.equal(balance, '1') + }) + + it('should not show a backup reminder', async function () { + await driver.assertElementNotPresent(By.css('.backup-notification')) + }) + }) +}) diff --git a/test/e2e/metamask-responsive-ui.spec.js b/test/e2e/metamask-responsive-ui.spec.js new file mode 100644 index 000000000000..b776299d49e8 --- /dev/null +++ b/test/e2e/metamask-responsive-ui.spec.js @@ -0,0 +1,224 @@ +const assert = require('assert') +const webdriver = require('selenium-webdriver') + +const { By, until } = webdriver +const enLocaleMessages = require('../../app/_locales/en/messages.json') +const { + tinyDelayMs, + regularDelayMs, + largeDelayMs, +} = require('./helpers') +const { buildWebDriver } = require('./webdriver') +const Ganache = require('./ganache') + +const ganacheServer = new Ganache() + +describe('MetaMask', function () { + let driver + + const testSeedPhrase = 'phrase upgrade clock rough situate wedding elder clever doctor stamp excess tent' + + this.timeout(0) + this.bail(true) + + before(async function () { + await ganacheServer.start() + const result = await buildWebDriver({ responsive: true }) + driver = result.driver + }) + + afterEach(async function () { + if (process.env.SELENIUM_BROWSER === 'chrome') { + const errors = await driver.checkBrowserForConsoleErrors(driver) + if (errors.length) { + const errorReports = errors.map((err) => err.message) + const errorMessage = `Errors found in browser console:\n${errorReports.join('\n')}` + console.error(new Error(errorMessage)) + } + } + if (this.currentTest.state === 'failed') { + await driver.verboseReportOnFailure(this.currentTest.title) + } + }) + + after(async function () { + await ganacheServer.quit() + await driver.quit() + }) + + describe('Going through the first time flow', function () { + it('clicks the continue button on the welcome screen', async function () { + await driver.findElement(By.css('.welcome-page__header')) + await driver.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.getStarted.message}')]`)) + await driver.delay(largeDelayMs) + }) + + it('clicks the "Create New Wallet" option', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Create a Wallet')]`)) + await driver.delay(largeDelayMs) + }) + + it('clicks the "I agree" option on the metametrics opt-in screen', async function () { + await driver.clickElement(By.css('.btn-primary')) + await driver.delay(largeDelayMs) + }) + + it('accepts a secure password', async function () { + const passwordBox = await driver.findElement(By.css('.first-time-flow__form #create-password')) + const passwordBoxConfirm = await driver.findElement(By.css('.first-time-flow__form #confirm-password')) + + await passwordBox.sendKeys('correct horse battery staple') + await passwordBoxConfirm.sendKeys('correct horse battery staple') + + await driver.clickElement(By.css('.first-time-flow__checkbox')) + + await driver.clickElement(By.css('.first-time-flow__form button')) + await driver.delay(regularDelayMs) + }) + + let seedPhrase + + it('reveals the seed phrase', async function () { + const byRevealButton = By.css('.reveal-seed-phrase__secret-blocker .reveal-seed-phrase__reveal-button') + await driver.clickElement(byRevealButton) + await driver.delay(regularDelayMs) + + const revealedSeedPhrase = await driver.findElement(By.css('.reveal-seed-phrase__secret-words')) + seedPhrase = await revealedSeedPhrase.getText() + assert.equal(seedPhrase.split(' ').length, 12) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.next.message}')]`)) + await driver.delay(regularDelayMs) + }) + + async function clickWordAndWait (word) { + await driver.clickElement(By.css(`[data-testid="seed-phrase-sorted"] [data-testid="draggable-seed-${word}"]`)) + await driver.delay(tinyDelayMs) + } + + it('can retype the seed phrase', async function () { + const words = seedPhrase.split(' ') + + for (const word of words) { + await clickWordAndWait(word) + } + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Confirm')]`)) + await driver.delay(regularDelayMs) + }) + + it('clicks through the success screen', async function () { + await driver.findElement(By.xpath(`//div[contains(text(), 'Congratulations')]`)) + await driver.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.endOfFlowMessage10.message}')]`)) + await driver.delay(regularDelayMs) + }) + }) + + describe('Show account information', function () { + it('show account details dropdown menu', async function () { + await driver.clickElement(By.css('[data-testid="account-options-menu-button"]')) + const options = await driver.findElements(By.css('.account-options-menu .menu-item')) + assert.equal(options.length, 3) // HD Wallet type does not have to show the Remove Account option + // click outside of menu to dismiss + // account menu button chosen because the menu never covers it. + await driver.clickPoint(By.css('.account-menu__icon'), 0, 0) + await driver.delay(regularDelayMs) + }) + }) + + describe('Import seed phrase', function () { + it('logs out of the vault', async function () { + await driver.clickElement(By.css('.account-menu__icon')) + await driver.delay(regularDelayMs) + + const lockButton = await driver.findClickableElement(By.css('.account-menu__lock-button')) + assert.equal(await lockButton.getText(), 'Lock') + await lockButton.click() + await driver.delay(regularDelayMs) + }) + + it('imports seed phrase', async function () { + const restoreSeedLink = await driver.findClickableElement(By.css('.unlock-page__link--import')) + assert.equal(await restoreSeedLink.getText(), 'Import using account seed phrase') + await restoreSeedLink.click() + await driver.delay(regularDelayMs) + + const seedTextArea = await driver.findElement(By.css('textarea')) + await seedTextArea.sendKeys(testSeedPhrase) + await driver.delay(regularDelayMs) + + const passwordInputs = await driver.findElements(By.css('input')) + await driver.delay(regularDelayMs) + + await passwordInputs[0].sendKeys('correct horse battery staple') + await passwordInputs[1].sendKeys('correct horse battery staple') + await driver.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.restore.message}')]`)) + await driver.delay(regularDelayMs) + }) + + it('switches to localhost', async function () { + await driver.clickElement(By.css('.network-name')) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//span[contains(text(), 'Localhost')]`)) + await driver.delay(largeDelayMs * 2) + }) + + it('balance renders', async function () { + const balance = await driver.findElement(By.css('[data-testid="eth-overview__primary-currency"]')) + await driver.wait(until.elementTextMatches(balance, /100\s*ETH/u)) + await driver.delay(regularDelayMs) + }) + }) + + describe('Send ETH from inside MetaMask', function () { + it('starts to send a transaction', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Send')]`)) + await driver.delay(regularDelayMs) + + const inputAddress = await driver.findElement(By.css('input[placeholder="Search, public address (0x), or ENS"]')) + await inputAddress.sendKeys('0x2f318C334780961FB129D2a6c30D0763d9a5C970') + + const inputAmount = await driver.findElement(By.css('.unit-input__input')) + await inputAmount.sendKeys('1') + + const inputValue = await inputAmount.getAttribute('value') + assert.equal(inputValue, '1') + await driver.delay(regularDelayMs) + }) + + it('opens and closes the gas modal', async function () { + // Set the gas limit + await driver.clickElement(By.css('.advanced-gas-options-btn')) + await driver.delay(regularDelayMs) + + const gasModal = await driver.findElement(By.css('span .modal')) + + await driver.clickElement(By.css('.page-container__header-close-text')) + await driver.wait(until.stalenessOf(gasModal), 10000) + await driver.delay(regularDelayMs) + }) + + it('clicks through to the confirm screen', async function () { + // Continue to next screen + await driver.clickElement(By.xpath(`//button[contains(text(), 'Next')]`)) + await driver.delay(regularDelayMs) + }) + + it('confirms the transaction', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Confirm')]`)) + }) + + it('finds the transaction in the transactions list', async function () { + await driver.clickElement(By.css('[data-testid="home__activity-tab"]')) + await driver.wait(async () => { + const confirmedTxes = await driver.findElements(By.css('.transaction-list__completed-transactions .transaction-list-item')) + return confirmedTxes.length === 1 + }, 10000) + + const txValues = await driver.findElement(By.css('.transaction-list-item__primary-currency')) + await driver.wait(until.elementTextMatches(txValues, /-1\s*ETH/u), 10000) + }) + }) +}) diff --git a/test/e2e/metamask-ui.spec.js b/test/e2e/metamask-ui.spec.js new file mode 100644 index 000000000000..f8c21d1314e7 --- /dev/null +++ b/test/e2e/metamask-ui.spec.js @@ -0,0 +1,1319 @@ +const assert = require('assert') +const webdriver = require('selenium-webdriver') + +const { By, Key, until } = webdriver +const enLocaleMessages = require('../../app/_locales/en/messages.json') +const { + tinyDelayMs, + regularDelayMs, + largeDelayMs, +} = require('./helpers') +const { buildWebDriver } = require('./webdriver') +const Ganache = require('./ganache') + +const ganacheServer = new Ganache() + +describe('MetaMask', function () { + let driver + let tokenAddress + + const testSeedPhrase = 'phrase upgrade clock rough situate wedding elder clever doctor stamp excess tent' + + this.timeout(0) + this.bail(true) + + before(async function () { + await ganacheServer.start() + const result = await buildWebDriver() + driver = result.driver + }) + + afterEach(async function () { + if (process.env.SELENIUM_BROWSER === 'chrome') { + const errors = await driver.checkBrowserForConsoleErrors(driver) + if (errors.length) { + const errorReports = errors.map((err) => err.message) + const errorMessage = `Errors found in browser console:\n${errorReports.join('\n')}` + console.error(new Error(errorMessage)) + } + } + if (this.currentTest.state === 'failed') { + await driver.verboseReportOnFailure(this.currentTest.title) + } + }) + + after(async function () { + await ganacheServer.quit() + await driver.quit() + }) + + describe('Going through the first time flow', function () { + it('clicks the continue button on the welcome screen', async function () { + await driver.findElement(By.css('.welcome-page__header')) + await driver.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.getStarted.message}')]`)) + await driver.delay(largeDelayMs) + }) + + it('clicks the "Create New Wallet" option', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Create a Wallet')]`)) + await driver.delay(largeDelayMs) + }) + + it('clicks the "No thanks" option on the metametrics opt-in screen', async function () { + await driver.clickElement(By.css('.btn-default')) + await driver.delay(largeDelayMs) + }) + + it('accepts a secure password', async function () { + const passwordBox = await driver.findElement(By.css('.first-time-flow__form #create-password')) + const passwordBoxConfirm = await driver.findElement(By.css('.first-time-flow__form #confirm-password')) + + await passwordBox.sendKeys('correct horse battery staple') + await passwordBoxConfirm.sendKeys('correct horse battery staple') + + await driver.clickElement(By.css('.first-time-flow__checkbox')) + + await driver.clickElement(By.css('.first-time-flow__form button')) + await driver.delay(regularDelayMs) + }) + + let seedPhrase + + it('reveals the seed phrase', async function () { + const byRevealButton = By.css('.reveal-seed-phrase__secret-blocker .reveal-seed-phrase__reveal-button') + await driver.findElement(byRevealButton) + await driver.clickElement(byRevealButton) + await driver.delay(regularDelayMs) + + const revealedSeedPhrase = await driver.findElement(By.css('.reveal-seed-phrase__secret-words')) + seedPhrase = await revealedSeedPhrase.getText() + assert.equal(seedPhrase.split(' ').length, 12) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.next.message}')]`)) + await driver.delay(regularDelayMs) + }) + + async function clickWordAndWait (word) { + await driver.clickElement(By.css(`[data-testid="seed-phrase-sorted"] [data-testid="draggable-seed-${word}"]`)) + await driver.delay(tinyDelayMs) + } + + it('can retype the seed phrase', async function () { + const words = seedPhrase.split(' ') + + for (const word of words) { + await clickWordAndWait(word) + } + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Confirm')]`)) + await driver.delay(regularDelayMs) + }) + + it('clicks through the success screen', async function () { + await driver.findElement(By.xpath(`//div[contains(text(), 'Congratulations')]`)) + await driver.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.endOfFlowMessage10.message}')]`)) + await driver.delay(regularDelayMs) + }) + }) + + describe('Show account information', function () { + it('shows the QR code for the account', async function () { + await driver.clickElement(By.css('[data-testid="account-options-menu-button"]')) + await driver.clickElement(By.css('[data-testid="account-options-menu__account-details"]')) + await driver.findVisibleElement(By.css('.qr-code__wrapper')) + await driver.delay(regularDelayMs) + + const accountModal = await driver.findElement(By.css('span .modal')) + await driver.clickElement(By.css('.account-modal__close')) + + await driver.wait(until.stalenessOf(accountModal)) + await driver.delay(regularDelayMs) + }) + }) + + describe('Lock an unlock', function () { + it('logs out of the account', async function () { + await driver.clickElement(By.css('.account-menu__icon')) + await driver.delay(regularDelayMs) + + const lockButton = await driver.findClickableElement(By.css('.account-menu__lock-button')) + assert.equal(await lockButton.getText(), 'Lock') + await lockButton.click() + await driver.delay(regularDelayMs) + }) + + it('accepts the account password after lock', async function () { + const passwordField = await driver.findElement(By.id('password')) + await passwordField.sendKeys('correct horse battery staple') + await passwordField.sendKeys(Key.ENTER) + await driver.delay(largeDelayMs * 4) + }) + }) + + describe('Add account', function () { + it('choose Create Account from the account menu', async function () { + await driver.clickElement(By.css('.account-menu__icon')) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//div[contains(text(), 'Create Account')]`)) + await driver.delay(regularDelayMs) + }) + + it('set account name', async function () { + const accountName = await driver.findElement(By.css('.new-account-create-form input')) + await accountName.sendKeys('2nd account') + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Create')]`)) + await driver.delay(largeDelayMs) + }) + + it('should display correct account name', async function () { + const accountName = await driver.findElement(By.css('.selected-account__name')) + assert.equal(await accountName.getText(), '2nd account') + await driver.delay(regularDelayMs) + }) + }) + + describe('Import seed phrase', function () { + it('logs out of the vault', async function () { + await driver.clickElement(By.css('.account-menu__icon')) + await driver.delay(regularDelayMs) + + const lockButton = await driver.findClickableElement(By.css('.account-menu__lock-button')) + assert.equal(await lockButton.getText(), 'Lock') + await lockButton.click() + await driver.delay(regularDelayMs) + }) + + it('imports seed phrase', async function () { + const restoreSeedLink = await driver.findClickableElement(By.css('.unlock-page__link--import')) + assert.equal(await restoreSeedLink.getText(), 'Import using account seed phrase') + await restoreSeedLink.click() + await driver.delay(regularDelayMs) + + const seedTextArea = await driver.findElement(By.css('textarea')) + await seedTextArea.sendKeys(testSeedPhrase) + await driver.delay(regularDelayMs) + + const passwordInputs = await driver.findElements(By.css('input')) + await driver.delay(regularDelayMs) + + await passwordInputs[0].sendKeys('correct horse battery staple') + await passwordInputs[1].sendKeys('correct horse battery staple') + await driver.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.restore.message}')]`)) + await driver.delay(regularDelayMs) + }) + + it('balance renders', async function () { + const balance = await driver.findElement(By.css('[data-testid="wallet-balance"] .list-item__heading')) + await driver.wait(until.elementTextMatches(balance, /100\s*ETH/u)) + await driver.delay(regularDelayMs) + }) + }) + + describe('Send ETH from inside MetaMask using default gas', function () { + it('starts a send transaction', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Send')]`)) + await driver.delay(regularDelayMs) + + const inputAddress = await driver.findElement(By.css('input[placeholder="Search, public address (0x), or ENS"]')) + await inputAddress.sendKeys('0x2f318C334780961FB129D2a6c30D0763d9a5C970') + + const inputAmount = await driver.findElement(By.css('.unit-input__input')) + await inputAmount.sendKeys('1000') + + const errorAmount = await driver.findElement(By.css('.send-v2__error-amount')) + assert.equal(await errorAmount.getText(), 'Insufficient funds.', 'send screen should render an insufficient fund error message') + + await inputAmount.sendKeys(Key.BACK_SPACE) + await driver.delay(50) + await inputAmount.sendKeys(Key.BACK_SPACE) + await driver.delay(50) + await inputAmount.sendKeys(Key.BACK_SPACE) + await driver.delay(tinyDelayMs) + + await driver.assertElementNotPresent(By.css('.send-v2__error-amount')) + + const amountMax = await driver.findClickableElement(By.css('.send-v2__amount-max')) + await amountMax.click() + + assert.equal(await inputAmount.isEnabled(), false) + + let inputValue = await inputAmount.getAttribute('value') + + assert(Number(inputValue) > 99) + + await amountMax.click() + + assert.equal(await inputAmount.isEnabled(), true) + + await inputAmount.sendKeys('1') + + inputValue = await inputAmount.getAttribute('value') + assert.equal(inputValue, '1') + await driver.delay(regularDelayMs) + + // Continue to next screen + await driver.clickElement(By.xpath(`//button[contains(text(), 'Next')]`)) + await driver.delay(regularDelayMs) + }) + + it('confirms the transaction', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Confirm')]`)) + await driver.delay(largeDelayMs * 2) + }) + + it('finds the transaction in the transactions list', async function () { + await driver.clickElement(By.css('[data-testid="home__activity-tab"]')) + await driver.wait(async () => { + const confirmedTxes = await driver.findElements(By.css('.transaction-list__completed-transactions .transaction-list-item')) + return confirmedTxes.length === 1 + }, 10000) + + const txValues = await driver.findElement(By.css('.transaction-list-item__primary-currency')) + await driver.wait(until.elementTextMatches(txValues, /-1\s*ETH/u), 10000) + }) + }) + + describe('Send ETH from inside MetaMask using fast gas option', function () { + it('starts a send transaction', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Send')]`)) + await driver.delay(regularDelayMs) + + const inputAddress = await driver.findElement(By.css('input[placeholder="Search, public address (0x), or ENS"]')) + await inputAddress.sendKeys('0x2f318C334780961FB129D2a6c30D0763d9a5C970') + + const inputAmount = await driver.findElement(By.css('.unit-input__input')) + await inputAmount.sendKeys('1') + + const inputValue = await inputAmount.getAttribute('value') + assert.equal(inputValue, '1') + + // Set the gas price + await driver.clickElement(By.xpath(`//button/div/div[contains(text(), "Fast")]`)) + await driver.delay(regularDelayMs) + + // Continue to next screen + await driver.clickElement(By.xpath(`//button[contains(text(), 'Next')]`)) + await driver.delay(regularDelayMs) + }) + + it('confirms the transaction', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Confirm')]`)) + await driver.delay(largeDelayMs) + }) + + it('finds the transaction in the transactions list', async function () { + await driver.wait(async () => { + const confirmedTxes = await driver.findElements(By.css('.transaction-list__completed-transactions .transaction-list-item')) + return confirmedTxes.length === 2 + }, 10000) + + const txValues = await driver.findElement(By.css('.transaction-list-item__primary-currency')) + await driver.wait(until.elementTextMatches(txValues, /-1\s*ETH/u), 10000) + }) + }) + + describe('Send ETH from inside MetaMask using advanced gas modal', function () { + it('starts a send transaction', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Send')]`)) + await driver.delay(regularDelayMs) + + const inputAddress = await driver.findElement(By.css('input[placeholder="Search, public address (0x), or ENS"]')) + await inputAddress.sendKeys('0x2f318C334780961FB129D2a6c30D0763d9a5C970') + + const inputAmount = await driver.findElement(By.css('.unit-input__input')) + await inputAmount.sendKeys('1') + + const inputValue = await inputAmount.getAttribute('value') + assert.equal(inputValue, '1') + + // Set the gas limit + await driver.clickElement(By.css('.advanced-gas-options-btn')) + await driver.delay(regularDelayMs) + + const gasModal = await driver.findElement(By.css('span .modal')) + await driver.clickElement(By.xpath(`//button[contains(text(), 'Save')]`)) + await driver.wait(until.stalenessOf(gasModal)) + await driver.delay(regularDelayMs) + + // Continue to next screen + await driver.clickElement(By.xpath(`//button[contains(text(), 'Next')]`)) + await driver.delay(regularDelayMs) + }) + + it('confirms the transaction', async function () { + const transactionAmounts = await driver.findElements(By.css('.currency-display-component__text')) + const transactionAmount = transactionAmounts[0] + assert.equal(await transactionAmount.getText(), '1') + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Confirm')]`)) + await driver.delay(largeDelayMs) + }) + + it('finds the transaction in the transactions list', async function () { + await driver.wait(async () => { + const confirmedTxes = await driver.findElements(By.css('.transaction-list__completed-transactions .transaction-list-item')) + return confirmedTxes.length === 3 + }, 10000) + + const txValues = await driver.findElement(By.css('.transaction-list-item__primary-currency')) + await driver.wait(until.elementTextMatches(txValues, /-1\s*ETH/u), 10000) + }) + }) + + describe('Send ETH from dapp using advanced gas controls', function () { + let windowHandles + let extension + let popup + let dapp + + it('goes to the settings screen', async function () { + await driver.clickElement(By.css('.account-menu__icon')) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//div[contains(text(), 'Settings')]`)) + + // await driver.findElement(By.css('.tab-bar')) + + await driver.clickElement(By.xpath(`//div[contains(text(), 'Advanced')]`)) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.css('[data-testid="advanced-setting-show-testnet-conversion"] .settings-page__content-item-col > div > div')) + + const advancedGasTitle = await driver.findElement(By.xpath(`//span[contains(text(), 'Advanced gas controls')]`)) + await driver.scrollToElement(advancedGasTitle) + + await driver.clickElement(By.css('[data-testid="advanced-setting-advanced-gas-inline"] .settings-page__content-item-col > div > div')) + windowHandles = await driver.getAllWindowHandles() + extension = windowHandles[0] + await driver.closeAllWindowHandlesExcept([extension]) + + await driver.clickElement(By.css('.app-header__logo-container')) + + await driver.delay(largeDelayMs) + }) + + it('connects the dapp', async function () { + await driver.openNewPage('http://127.0.0.1:8080/') + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Connect')]`)) + + await driver.delay(regularDelayMs) + + await driver.waitUntilXWindowHandles(3) + windowHandles = await driver.getAllWindowHandles() + + extension = windowHandles[0] + dapp = await driver.switchToWindowWithTitle('E2E Test Dapp', windowHandles) + popup = windowHandles.find((handle) => handle !== extension && handle !== dapp) + + await driver.switchToWindow(popup) + + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Next')]`)) + await driver.clickElement(By.xpath(`//button[contains(text(), 'Connect')]`)) + + await driver.waitUntilXWindowHandles(2) + await driver.switchToWindow(dapp) + await driver.delay(regularDelayMs) + }) + + it('initiates a send from the dapp', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Send')]`), 10000) + await driver.delay(2000) + + windowHandles = await driver.getAllWindowHandles() + await driver.switchToWindowWithTitle('MetaMask Notification', windowHandles) + await driver.delay(regularDelayMs) + + await driver.assertElementNotPresent(By.xpath(`//li[contains(text(), 'Data')]`)) + + const [gasPriceInput, gasLimitInput] = await driver.findElements(By.css('.advanced-gas-inputs__gas-edit-row__input')) + + await gasPriceInput.clear() + await driver.delay(50) + await gasPriceInput.sendKeys('10') + await driver.delay(50) + await driver.delay(tinyDelayMs) + await driver.delay(50) + + await gasLimitInput.clear() + await driver.delay(50) + await gasLimitInput.sendKeys('25000') + + await driver.delay(1000) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Confirm')]`), 10000) + await driver.delay(regularDelayMs) + + await driver.waitUntilXWindowHandles(2) + await driver.switchToWindow(extension) + await driver.delay(regularDelayMs) + }) + + it('finds the transaction in the transactions list', async function () { + await driver.wait(async () => { + const confirmedTxes = await driver.findElements(By.css('.transaction-list__completed-transactions .transaction-list-item')) + return confirmedTxes.length === 4 + }, 10000) + + const txValue = await driver.findClickableElement(By.css('.transaction-list-item__primary-currency')) + await driver.wait(until.elementTextMatches(txValue, /-3\s*ETH/u), 10000) + }) + + it('the transaction has the expected gas price', async function () { + const txValue = await driver.findClickableElement(By.css('.transaction-list-item__primary-currency')) + await txValue.click() + const popoverCloseButton = await driver.findClickableElement(By.css('.popover-header__button')) + const txGasPrice = await driver.findElement(By.css('[data-testid="transaction-breakdown__gas-price"]')) + await driver.wait(until.elementTextMatches(txGasPrice, /^10$/u), 10000) + await popoverCloseButton.click() + }) + }) + + describe('Navigate transactions', function () { + it('adds multiple transactions', async function () { + await driver.delay(regularDelayMs) + + await driver.waitUntilXWindowHandles(2) + const windowHandles = await driver.getAllWindowHandles() + const extension = windowHandles[0] + const dapp = windowHandles[1] + + await driver.switchToWindow(dapp) + await driver.delay(largeDelayMs) + + const send3eth = await driver.findClickableElement(By.xpath(`//button[contains(text(), 'Send')]`)) + await send3eth.click() + await driver.delay(largeDelayMs) + + const contractDeployment = await driver.findClickableElement(By.xpath(`//button[contains(text(), 'Deploy Contract')]`)) + await contractDeployment.click() + await driver.delay(largeDelayMs) + + await send3eth.click() + await driver.delay(largeDelayMs) + await contractDeployment.click() + await driver.delay(largeDelayMs) + + await driver.switchToWindow(extension) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.css('.transaction-list-item')) + await driver.delay(largeDelayMs) + }) + + it('navigates the transactions', async function () { + await driver.clickElement(By.css('[data-testid="next-page"]')) + let navigationElement = await driver.findElement(By.css('.confirm-page-container-navigation')) + let navigationText = await navigationElement.getText() + assert.equal(navigationText.includes('2'), true, 'changed transaction right') + + await driver.clickElement(By.css('[data-testid="next-page"]')) + navigationElement = await driver.findElement(By.css('.confirm-page-container-navigation')) + navigationText = await navigationElement.getText() + assert.equal(navigationText.includes('3'), true, 'changed transaction right') + + await driver.clickElement(By.css('[data-testid="next-page"]')) + navigationElement = await driver.findElement(By.css('.confirm-page-container-navigation')) + navigationText = await navigationElement.getText() + assert.equal(navigationText.includes('4'), true, 'changed transaction right') + + await driver.clickElement(By.css('[data-testid="first-page"]')) + navigationElement = await driver.findElement(By.css('.confirm-page-container-navigation')) + navigationText = await navigationElement.getText() + assert.equal(navigationText.includes('1'), true, 'navigate to first transaction') + + await driver.clickElement(By.css('[data-testid="last-page"]')) + navigationElement = await driver.findElement(By.css('.confirm-page-container-navigation')) + navigationText = await navigationElement.getText() + assert.equal(navigationText.split('4').length, 3, 'navigate to last transaction') + + await driver.clickElement(By.css('[data-testid="previous-page"]')) + navigationElement = await driver.findElement(By.css('.confirm-page-container-navigation')) + navigationText = await navigationElement.getText() + assert.equal(navigationText.includes('3'), true, 'changed transaction left') + + await driver.clickElement(By.css('[data-testid="previous-page"]')) + navigationElement = await driver.findElement(By.css('.confirm-page-container-navigation')) + navigationText = await navigationElement.getText() + assert.equal(navigationText.includes('2'), true, 'changed transaction left') + }) + + it('adds a transaction while confirm screen is in focus', async function () { + let navigationElement = await driver.findElement(By.css('.confirm-page-container-navigation')) + let navigationText = await navigationElement.getText() + assert.equal(navigationText.includes('2'), true, 'second transaction in focus') + + const windowHandles = await driver.getAllWindowHandles() + const extension = windowHandles[0] + const dapp = windowHandles[1] + + await driver.switchToWindow(dapp) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Send')]`)) + await driver.delay(regularDelayMs) + + await driver.switchToWindow(extension) + await driver.delay(regularDelayMs) + + navigationElement = await driver.findElement(By.css('.confirm-page-container-navigation')) + navigationText = await navigationElement.getText() + assert.equal(navigationText.includes('2'), true, 'correct (same) transaction in focus') + }) + + it('rejects a transaction', async function () { + await driver.delay(tinyDelayMs) + await driver.clickElement(By.xpath(`//button[contains(text(), 'Reject')]`)) + await driver.delay(largeDelayMs * 2) + + const navigationElement = await driver.findElement(By.css('.confirm-page-container-navigation')) + await driver.delay(tinyDelayMs) + const navigationText = await navigationElement.getText() + assert.equal(navigationText.includes('4'), true, 'transaction rejected') + }) + + it('confirms a transaction', async function () { + await driver.delay(tinyDelayMs / 2) + await driver.clickElement(By.xpath(`//button[contains(text(), 'Confirm')]`)) + await driver.delay(regularDelayMs) + + const navigationElement = await driver.findElement(By.css('.confirm-page-container-navigation')) + await driver.delay(tinyDelayMs / 2) + const navigationText = await navigationElement.getText() + await driver.delay(tinyDelayMs / 2) + assert.equal(navigationText.includes('3'), true, 'transaction confirmed') + }) + + it('rejects the rest of the transactions', async function () { + await driver.clickElement(By.xpath(`//a[contains(text(), 'Reject 3')]`)) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Reject All')]`)) + await driver.delay(largeDelayMs * 2) + + await driver.wait(async () => { + const confirmedTxes = await driver.findElements(By.css('.transaction-list__completed-transactions .transaction-list-item')) + return confirmedTxes.length === 5 + }, 10000) + }) + }) + + describe('Deploy contract and call contract methods', function () { + let extension + let dapp + it('creates a deploy contract transaction', async function () { + const windowHandles = await driver.getAllWindowHandles() + extension = windowHandles[0] + dapp = windowHandles[1] + await driver.delay(tinyDelayMs) + + await driver.switchToWindow(dapp) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.css('#deployButton')) + await driver.delay(regularDelayMs) + + await driver.switchToWindow(extension) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//h2[contains(text(), 'Contract Deployment')]`)) + await driver.delay(largeDelayMs) + }) + + it('displays the contract creation data', async function () { + await driver.clickElement(By.xpath(`//li[contains(text(), 'Data')]`)) + await driver.delay(regularDelayMs) + + await driver.findElement(By.xpath(`//div[contains(text(), '127.0.0.1')]`)) + + const confirmDataDiv = await driver.findElement(By.css('.confirm-page-container-content__data-box')) + const confirmDataText = await confirmDataDiv.getText() + assert.ok(confirmDataText.includes('Origin:')) + assert.ok(confirmDataText.includes('127.0.0.1')) + assert.ok(confirmDataText.includes('Bytes:')) + assert.ok(confirmDataText.includes('675')) + + await driver.clickElement(By.xpath(`//li[contains(text(), 'Details')]`)) + await driver.delay(regularDelayMs) + }) + + it('confirms a deploy contract transaction', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Confirm')]`)) + await driver.delay(largeDelayMs) + + await driver.wait(async () => { + const confirmedTxes = await driver.findElements(By.css('.transaction-list__completed-transactions .transaction-list-item')) + return confirmedTxes.length === 6 + }, 10000) + + const txAction = await driver.findElements(By.css('.list-item__heading')) + await driver.wait(until.elementTextMatches(txAction[0], /Contract\sDeployment/u), 10000) + await driver.delay(regularDelayMs) + }) + + it('calls and confirms a contract method where ETH is sent', async function () { + await driver.switchToWindow(dapp) + await driver.delay(regularDelayMs) + + let contractStatus = await driver.findElement(By.css('#contractStatus')) + await driver.wait(until.elementTextMatches(contractStatus, /Deployed/u), 15000) + + await driver.clickElement(By.css('#depositButton')) + await driver.delay(largeDelayMs) + + contractStatus = await driver.findElement(By.css('#contractStatus')) + await driver.wait(until.elementTextMatches(contractStatus, /Deposit\sinitiated/u), 10000) + + await driver.switchToWindow(extension) + await driver.delay(largeDelayMs * 2) + + await driver.findElements(By.css('.transaction-list-item')) + const txListValue = await driver.findClickableElement(By.css('.transaction-list-item__primary-currency')) + await driver.wait(until.elementTextMatches(txListValue, /-4\s*ETH/u), 10000) + await txListValue.click() + await driver.delay(regularDelayMs) + + // Set the gas limit + await driver.clickElement(By.css('.confirm-detail-row__header-text--edit')) + await driver.delay(regularDelayMs) + + const gasModal = await driver.findElement(By.css('span .modal')) + await driver.delay(regularDelayMs) + await driver.clickElement(By.css('.page-container__tab:nth-of-type(2)')) + await driver.delay(regularDelayMs) + + const [gasPriceInput, gasLimitInput] = await driver.findElements(By.css('.advanced-gas-inputs__gas-edit-row__input')) + const gasLimitValue = await gasLimitInput.getAttribute('value') + assert(Number(gasLimitValue) < 100000, 'Gas Limit too high') + + await gasPriceInput.clear() + await driver.delay(50) + await gasPriceInput.sendKeys('10') + await driver.delay(50) + + await gasLimitInput.clear() + await driver.delay(50) + await gasLimitInput.sendKeys('60001') + + await driver.delay(1000) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Save')]`)) + await driver.delay(regularDelayMs) + + await driver.wait(until.stalenessOf(gasModal)) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Confirm')]`)) + await driver.delay(regularDelayMs) + + await driver.wait(async () => { + const confirmedTxes = await driver.findElements(By.css('.transaction-list__completed-transactions .transaction-list-item')) + return confirmedTxes.length === 7 + }, 10000) + + const txValues = await driver.findElements(By.css('.transaction-list-item__primary-currency')) + await driver.wait(until.elementTextMatches(txValues[0], /-4\s*ETH/u), 10000) + }) + + it('calls and confirms a contract method where ETH is received', async function () { + await driver.switchToWindow(dapp) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.css('#withdrawButton')) + await driver.delay(regularDelayMs) + + await driver.switchToWindow(extension) + await driver.delay(largeDelayMs * 2) + + await driver.clickElement(By.css('.transaction-list__pending-transactions .transaction-list-item')) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Confirm')]`)) + await driver.delay(regularDelayMs) + + await driver.wait(async () => { + const confirmedTxes = await driver.findElements(By.css('.transaction-list__completed-transactions .transaction-list-item')) + return confirmedTxes.length === 8 + }, 10000) + + const txValues = await driver.findElement(By.css('.transaction-list-item__primary-currency')) + await driver.wait(until.elementTextMatches(txValues, /-0\s*ETH/u), 10000) + + await driver.closeAllWindowHandlesExcept([extension, dapp]) + await driver.switchToWindow(extension) + }) + + it('renders the correct ETH balance', async function () { + const balance = await driver.findElement(By.css('[data-testid="eth-overview__primary-currency"]')) + await driver.delay(regularDelayMs) + await driver.wait(until.elementTextMatches(balance, /^87.*\s*ETH.*$/u), 10000) + const tokenAmount = await balance.getText() + assert.ok((/^87.*\s*ETH.*$/u).test(tokenAmount)) + await driver.delay(regularDelayMs) + }) + }) + + describe('Add a custom token from a dapp', function () { + it('creates a new token', async function () { + let windowHandles = await driver.getAllWindowHandles() + const extension = windowHandles[0] + const dapp = windowHandles[1] + await driver.delay(regularDelayMs * 2) + + await driver.switchToWindow(dapp) + await driver.delay(regularDelayMs * 2) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Create Token')]`)) + await driver.delay(largeDelayMs) + + windowHandles = await driver.getAllWindowHandles() + const popup = windowHandles[2] + await driver.switchToWindow(popup) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.css('.confirm-detail-row__header-text--edit')) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//li[contains(text(), 'Advanced')]`)) + await driver.delay(tinyDelayMs) + + const [gasPriceInput, gasLimitInput] = await driver.findElements(By.css('.advanced-gas-inputs__gas-edit-row__input')) + assert(gasPriceInput.getAttribute('value'), 20) + assert(gasLimitInput.getAttribute('value'), 4700000) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Save')]`)) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Confirm')]`)) + await driver.delay(regularDelayMs) + + await driver.switchToWindow(dapp) + await driver.delay(tinyDelayMs) + + const tokenContractAddress = await driver.findElement(By.css('#tokenAddress')) + await driver.wait(until.elementTextMatches(tokenContractAddress, /0x/u)) + tokenAddress = await tokenContractAddress.getText() + + await driver.delay(regularDelayMs) + await driver.closeAllWindowHandlesExcept([extension, dapp]) + await driver.delay(regularDelayMs) + await driver.switchToWindow(extension) + await driver.delay(largeDelayMs) + }) + + it('clicks on the Add Token button', async function () { + await driver.clickElement(By.css(`[data-testid="home__asset-tab"]`)) + await driver.clickElement(By.xpath(`//button[contains(text(), 'Add Token')]`)) + await driver.delay(regularDelayMs) + }) + + it('picks the newly created Test token', async function () { + await driver.clickElement(By.xpath("//li[contains(text(), 'Custom Token')]")) + await driver.delay(regularDelayMs) + + const newTokenAddress = await driver.findElement(By.css('#custom-address')) + await newTokenAddress.sendKeys(tokenAddress) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Next')]`)) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Add Tokens')]`)) + await driver.delay(regularDelayMs) + }) + + it('renders the balance for the new token', async function () { + const balance = await driver.findElement(By.css('.wallet-overview .token-overview__primary-balance')) + await driver.wait(until.elementTextMatches(balance, /^10\s*TST\s*$/u)) + const tokenAmount = await balance.getText() + assert.ok((/^10\s*TST\s*$/u).test(tokenAmount)) + await driver.delay(regularDelayMs) + }) + }) + + describe('Send token from inside MetaMask', function () { + let gasModal + it('starts to send a transaction', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Send')]`)) + await driver.delay(regularDelayMs) + + const inputAddress = await driver.findElement(By.css('input[placeholder="Search, public address (0x), or ENS"]')) + await inputAddress.sendKeys('0x2f318C334780961FB129D2a6c30D0763d9a5C970') + + const inputAmount = await driver.findElement(By.css('.unit-input__input')) + await inputAmount.sendKeys('1') + + // Set the gas limit + await driver.clickElement(By.css('.advanced-gas-options-btn')) + await driver.delay(regularDelayMs) + + gasModal = await driver.findElement(By.css('span .modal')) + await driver.delay(regularDelayMs) + }) + + it('opens customize gas modal', async function () { + await driver.findElement(By.css('.page-container__title')) + await driver.clickElement(By.xpath(`//button[contains(text(), 'Save')]`)) + await driver.delay(regularDelayMs) + }) + + it('transitions to the confirm screen', async function () { + await driver.wait(until.stalenessOf(gasModal)) + + // Continue to next screen + await driver.clickElement(By.xpath(`//button[contains(text(), 'Next')]`)) + await driver.delay(regularDelayMs) + }) + + it('displays the token transfer data', async function () { + await driver.clickElement(By.xpath(`//li[contains(text(), 'Data')]`)) + await driver.delay(regularDelayMs) + + const functionType = await driver.findElement(By.css('.confirm-page-container-content__function-type')) + const functionTypeText = await functionType.getText() + assert.equal(functionTypeText, 'Transfer') + + const tokenAmount = await driver.findElement(By.css('.confirm-page-container-summary__title-text')) + const tokenAmountText = await tokenAmount.getText() + assert.equal(tokenAmountText, '1 TST') + + const confirmDataDiv = await driver.findElement(By.css('.confirm-page-container-content__data-box')) + const confirmDataText = await confirmDataDiv.getText() + + await driver.delay(regularDelayMs) + assert(confirmDataText.match(/0xa9059cbb0000000000000000000000002f318c334780961fb129d2a6c30d0763d9a5c97/u)) + + await driver.clickElement(By.xpath(`//li[contains(text(), 'Details')]`)) + await driver.delay(regularDelayMs) + }) + + it('submits the transaction', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Confirm')]`)) + await driver.delay(regularDelayMs) + }) + + it('finds the transaction in the transactions list', async function () { + await driver.wait(async () => { + const confirmedTxes = await driver.findElements(By.css('.transaction-list__completed-transactions .transaction-list-item')) + return confirmedTxes.length === 1 + }, 10000) + + const txValues = await driver.findElements(By.css('.transaction-list-item__primary-currency')) + assert.equal(txValues.length, 1) + await driver.wait(until.elementTextMatches(txValues[0], /-1\s*TST/u), 10000) + + const txStatuses = await driver.findElements(By.css('.list-item__heading')) + await driver.wait(until.elementTextMatches(txStatuses[0], /Send\sTST/u), 10000) + }) + }) + + describe('Send a custom token from dapp', function () { + let gasModal + it('sends an already created token', async function () { + const windowHandles = await driver.getAllWindowHandles() + const extension = windowHandles[0] + const dapp = await driver.switchToWindowWithTitle('E2E Test Dapp', windowHandles) + await driver.delay(regularDelayMs) + + await driver.switchToWindow(dapp) + await driver.delay(tinyDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Transfer Tokens')]`)) + + await driver.switchToWindow(extension) + await driver.delay(largeDelayMs) + + await driver.findElements(By.css('.transaction-list__pending-transactions')) + const txListValue = await driver.findClickableElement(By.css('.transaction-list-item__primary-currency')) + await driver.wait(until.elementTextMatches(txListValue, /-1.5\s*TST/u), 10000) + await txListValue.click() + await driver.delay(regularDelayMs) + + const transactionAmounts = await driver.findElements(By.css('.currency-display-component__text')) + const transactionAmount = transactionAmounts[0] + assert(await transactionAmount.getText(), '1.5 TST') + + // Set the gas limit + await driver.clickElement(By.css('.confirm-detail-row__header-text--edit')) + await driver.delay(regularDelayMs) + + gasModal = await driver.findElement(By.css('span .modal')) + }) + + it('customizes gas', async function () { + await driver.clickElement(By.css('.page-container__tab:nth-of-type(2)')) + await driver.delay(regularDelayMs) + + const [gasPriceInput, gasLimitInput] = await driver.findElements(By.css('.advanced-gas-inputs__gas-edit-row__input')) + + await gasPriceInput.clear() + await driver.delay(50) + await gasPriceInput.sendKeys('10') + await driver.delay(50) + + await gasLimitInput.clear() + await driver.delay(50) + await gasLimitInput.sendKeys('60000') + + await driver.delay(1000) + + await driver.clickElement(By.css('.page-container__footer-button')) + await driver.wait(until.stalenessOf(gasModal)) + + const gasFeeInputs = await driver.findElements(By.css('.confirm-detail-row__primary')) + const renderedGasFee = await gasFeeInputs[0].getText() + assert.equal(renderedGasFee, '0.0006') + }) + + it('submits the transaction', async function () { + const tokenAmount = await driver.findElement(By.css('.confirm-page-container-summary__title-text')) + const tokenAmountText = await tokenAmount.getText() + assert.equal(tokenAmountText, '1.5 TST') + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Confirm')]`)) + await driver.delay(regularDelayMs) + }) + + it('finds the transaction in the transactions list', async function () { + await driver.wait(async () => { + const confirmedTxes = await driver.findElements(By.css('.transaction-list__completed-transactions .transaction-list-item')) + return confirmedTxes.length === 2 + }, 10000) + + const txValues = await driver.findElements(By.css('.transaction-list-item__primary-currency')) + await driver.wait(until.elementTextMatches(txValues[0], /-1.5\s*TST/u)) + const txStatuses = await driver.findElements(By.css('.list-item__heading')) + await driver.wait(until.elementTextMatches(txStatuses[0], /Send\sTST/u), 10000) + + const tokenBalanceAmount = await driver.findElements(By.css('.token-overview__primary-balance')) + await driver.wait(until.elementTextMatches(tokenBalanceAmount[0], /7.5\s*TST/u), 10000) + }) + }) + + describe('Approves a custom token from dapp', function () { + let gasModal + it('approves an already created token', async function () { + const windowHandles = await driver.getAllWindowHandles() + const extension = windowHandles[0] + const dapp = await driver.switchToWindowWithTitle('E2E Test Dapp', windowHandles) + await driver.closeAllWindowHandlesExcept([extension, dapp]) + await driver.delay(regularDelayMs) + + await driver.switchToWindow(dapp) + await driver.delay(tinyDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Approve Tokens')]`)) + + await driver.switchToWindow(extension) + await driver.delay(regularDelayMs) + + await driver.wait(async () => { + const pendingTxes = await driver.findElements(By.css('.transaction-list__pending-transactions .transaction-list-item')) + return pendingTxes.length === 1 + }, 10000) + + const [txtListHeading] = await driver.findElements(By.css('.transaction-list-item .list-item__heading')) + await driver.wait(until.elementTextMatches(txtListHeading, /Approve TST spend limit/u)) + await driver.clickElement(By.css('.transaction-list-item')) + await driver.delay(regularDelayMs) + }) + + it('displays the token approval data', async function () { + await driver.clickElement(By.css('.confirm-approve-content__view-full-tx-button')) + await driver.delay(regularDelayMs) + + const functionType = await driver.findElement(By.css('.confirm-approve-content__data .confirm-approve-content__small-text')) + const functionTypeText = await functionType.getText() + assert.equal(functionTypeText, 'Function: Approve') + + const confirmDataDiv = await driver.findElement(By.css('.confirm-approve-content__data__data-block')) + const confirmDataText = await confirmDataDiv.getText() + assert(confirmDataText.match(/0x095ea7b30000000000000000000000009bc5baf874d2da8d216ae9f137804184ee5afef4/u)) + }) + + it('opens the gas edit modal', async function () { + await driver.clickElement(By.css('.confirm-approve-content__small-blue-text.cursor-pointer')) + await driver.delay(regularDelayMs) + + gasModal = await driver.findElement(By.css('span .modal')) + }) + + it('customizes gas', async function () { + await driver.clickElement(By.css('.page-container__tab:nth-of-type(2)')) + await driver.delay(regularDelayMs) + + const [gasPriceInput, gasLimitInput] = await driver.findElements(By.css('.advanced-gas-inputs__gas-edit-row__input')) + + await gasPriceInput.clear() + await driver.delay(50) + await gasPriceInput.sendKeys('10') + await driver.delay(50) + + await gasLimitInput.clear() + await driver.delay(50) + await gasLimitInput.sendKeys('60001') + + await driver.delay(1000) + + await driver.clickElement(By.css('.page-container__footer-button')) + await driver.wait(until.stalenessOf(gasModal)) + + const gasFeeInEth = await driver.findElement(By.css('.confirm-approve-content__transaction-details-content__secondary-fee')) + assert.equal(await gasFeeInEth.getText(), '0.0006 ETH') + }) + + it('edits the permission', async function () { + const editButtons = await driver.findClickableElements(By.css('.confirm-approve-content__small-blue-text.cursor-pointer')) + await editButtons[1].click() + await driver.delay(regularDelayMs) + + const permissionModal = await driver.findElement(By.css('span .modal')) + + const radioButtons = await driver.findClickableElements(By.css('.edit-approval-permission__edit-section__radio-button')) + await radioButtons[1].click() + + const customInput = await driver.findElement(By.css('input')) + await driver.delay(50) + await customInput.sendKeys('5') + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Save')]`)) + await driver.delay(regularDelayMs) + + await driver.wait(until.stalenessOf(permissionModal)) + + const permissionInfo = await driver.findElements(By.css('.confirm-approve-content__medium-text')) + const amountDiv = permissionInfo[0] + assert.equal(await amountDiv.getText(), '5 TST') + }) + + it('submits the transaction', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Confirm')]`)) + await driver.delay(regularDelayMs) + }) + + it('finds the transaction in the transactions list', async function () { + await driver.wait(async () => { + const confirmedTxes = await driver.findElements(By.css('.transaction-list__completed-transactions .transaction-list-item')) + return confirmedTxes.length === 3 + }, 10000) + + const txStatuses = await driver.findElements(By.css('.list-item__heading')) + await driver.wait(until.elementTextMatches(txStatuses[0], /Approve TST spend limit/u)) + }) + }) + + describe('Transfers a custom token from dapp when no gas value is specified', function () { + it('transfers an already created token, without specifying gas', async function () { + const windowHandles = await driver.getAllWindowHandles() + const extension = windowHandles[0] + const dapp = await driver.switchToWindowWithTitle('E2E Test Dapp', windowHandles) + await driver.closeAllWindowHandlesExcept([extension, dapp]) + await driver.delay(regularDelayMs) + + await driver.switchToWindow(dapp) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Transfer Tokens Without Gas')]`)) + + await driver.switchToWindow(extension) + await driver.delay(regularDelayMs) + + await driver.wait(async () => { + const pendingTxes = await driver.findElements(By.css('.transaction-list__pending-transactions .transaction-list-item')) + return pendingTxes.length === 1 + }, 10000) + + const [txListValue] = await driver.findElements(By.css('.transaction-list-item__primary-currency')) + await driver.wait(until.elementTextMatches(txListValue, /-1.5\s*TST/u)) + await driver.clickElement(By.css('.transaction-list-item')) + await driver.delay(regularDelayMs) + }) + + it('submits the transaction', async function () { + await driver.delay(largeDelayMs * 2) + await driver.clickElement(By.xpath(`//button[contains(text(), 'Confirm')]`)) + await driver.delay(largeDelayMs * 2) + }) + + it('finds the transaction in the transactions list', async function () { + await driver.wait(async () => { + const confirmedTxes = await driver.findElements(By.css('.transaction-list__completed-transactions .transaction-list-item')) + return confirmedTxes.length === 4 + }, 10000) + + const txValues = await driver.findElements(By.css('.transaction-list-item__primary-currency')) + await driver.wait(until.elementTextMatches(txValues[0], /-1.5\s*TST/u)) + const txStatuses = await driver.findElements(By.css('.list-item__heading')) + await driver.wait(until.elementTextMatches(txStatuses[0], /Send TST/u)) + }) + }) + + describe('Approves a custom token from dapp when no gas value is specified', function () { + it('approves an already created token', async function () { + const windowHandles = await driver.getAllWindowHandles() + const extension = windowHandles[0] + const dapp = await driver.switchToWindowWithTitle('E2E Test Dapp', windowHandles) + await driver.closeAllWindowHandlesExcept([extension, dapp]) + await driver.delay(regularDelayMs) + + await driver.switchToWindow(dapp) + await driver.delay(tinyDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Approve Tokens Without Gas')]`)) + + await driver.switchToWindow(extension) + await driver.delay(regularDelayMs) + + await driver.wait(async () => { + const pendingTxes = await driver.findElements(By.css('.transaction-list__pending-transactions .transaction-list-item')) + return pendingTxes.length === 1 + }, 10000) + + const [txtListHeading] = await driver.findElements(By.css('.transaction-list-item .list-item__heading')) + await driver.wait(until.elementTextMatches(txtListHeading, /Approve TST spend limit/u)) + await driver.clickElement(By.css('.transaction-list-item')) + await driver.delay(regularDelayMs) + }) + + it('shows the correct recipient', async function () { + await driver.clickElement(By.css('.confirm-approve-content__view-full-tx-button')) + await driver.delay(regularDelayMs) + + const permissionInfo = await driver.findElements(By.css('.confirm-approve-content__medium-text')) + const recipientDiv = permissionInfo[1] + assert.equal(await recipientDiv.getText(), '0x2f318C33...C970') + }) + + it('submits the transaction', async function () { + await driver.delay(1000) + await driver.clickElement(By.xpath(`//button[contains(text(), 'Confirm')]`)) + await driver.delay(regularDelayMs) + }) + + it('finds the transaction in the transactions list', async function () { + await driver.wait(async () => { + const confirmedTxes = await driver.findElements(By.css('.transaction-list__completed-transactions .transaction-list-item')) + return confirmedTxes.length === 5 + }, 10000) + + const txStatuses = await driver.findElements(By.css('.list-item__heading')) + await driver.wait(until.elementTextMatches(txStatuses[0], /Approve TST spend limit/u)) + }) + }) + + describe('Hide token', function () { + it('hides the token when clicked', async function () { + await driver.clickElement(By.css('[data-testid="token-options__button"]')) + + await driver.clickElement(By.css('[data-testid="token-options__hide"]')) + + const confirmHideModal = await driver.findElement(By.css('span .modal')) + + await driver.clickElement(By.css('[data-testid="hide-token-confirmation__hide"]')) + + await driver.wait(until.stalenessOf(confirmHideModal)) + }) + }) + + describe('Add existing token using search', function () { + it('clicks on the Add Token button', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Add Token')]`)) + await driver.delay(regularDelayMs) + }) + + it('can pick a token from the existing options', async function () { + const tokenSearch = await driver.findElement(By.css('#search-tokens')) + await tokenSearch.sendKeys('BAT') + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath("//span[contains(text(), 'BAT')]")) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Next')]`)) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Add Tokens')]`)) + await driver.delay(largeDelayMs) + }) + + it('renders the balance for the chosen token', async function () { + const balance = await driver.findElement(By.css('.token-overview__primary-balance')) + await driver.wait(until.elementTextMatches(balance, /0\s*BAT/u)) + await driver.delay(regularDelayMs) + }) + }) + + describe('Stores custom RPC history', function () { + const customRpcUrls = [ + 'http://127.0.0.1:8545/1', + 'http://127.0.0.1:8545/2', + 'http://127.0.0.1:8545/3', + 'http://127.0.0.1:8545/4', + ] + + customRpcUrls.forEach((customRpcUrl) => { + it(`creates custom RPC: ${customRpcUrl}`, async function () { + await driver.clickElement(By.css('.network-name')) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//span[contains(text(), 'Custom RPC')]`)) + await driver.delay(regularDelayMs) + + await driver.findElement(By.css('.settings-page__sub-header-text')) + + const customRpcInputs = await driver.findElements(By.css('input[type="text"]')) + const customRpcInput = customRpcInputs[1] + await customRpcInput.clear() + await customRpcInput.sendKeys(customRpcUrl) + + await driver.clickElement(By.css('.network-form__footer .btn-secondary')) + await driver.delay(largeDelayMs * 2) + }) + }) + + it('selects another provider', async function () { + await driver.clickElement(By.css('.network-name')) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//span[contains(text(), 'Main Ethereum Network')]`)) + await driver.delay(largeDelayMs * 2) + }) + + it('finds all recent RPCs in history', async function () { + await driver.clickElement(By.css('.network-name')) + await driver.delay(regularDelayMs) + + // only recent 3 are found and in correct order (most recent at the top) + const customRpcs = await driver.findElements(By.xpath(`//span[contains(text(), 'http://127.0.0.1:8545/')]`)) + + assert.equal(customRpcs.length, customRpcUrls.length) + }) + + it('deletes a custom RPC', async function () { + const networkListItems = await driver.findClickableElements(By.css('.networks-tab__networks-list-name')) + const lastNetworkListItem = networkListItems[networkListItems.length - 1] + await lastNetworkListItem.click() + await driver.delay(100) + + await driver.clickElement(By.css('.btn-danger')) + await driver.delay(regularDelayMs) + + const confirmDeleteNetworkModal = await driver.findElement(By.css('span .modal')) + + const byConfirmDeleteNetworkButton = By.css('.button.btn-danger.modal-container__footer-button') + await driver.clickElement(byConfirmDeleteNetworkButton) + + await driver.wait(until.stalenessOf(confirmDeleteNetworkModal)) + + const newNetworkListItems = await driver.findElements(By.css('.networks-tab__networks-list-name')) + + assert.equal(networkListItems.length - 1, newNetworkListItems.length) + }) + }) +}) diff --git a/test/e2e/metamask.spec.js b/test/e2e/metamask.spec.js deleted file mode 100644 index 13af6cb2247d..000000000000 --- a/test/e2e/metamask.spec.js +++ /dev/null @@ -1,352 +0,0 @@ -const path = require('path') -const assert = require('assert') -const { By, Key, until } = require('selenium-webdriver') -const { delay, createModifiedTestBuild, setupBrowserAndExtension, verboseReportOnFailure } = require('./func') - -describe('Metamask popup page', function () { - const browser = process.env.SELENIUM_BROWSER - let driver, accountAddress, tokenAddress, extensionUri - - this.timeout(0) - - before(async function () { - const srcPath = path.resolve(`dist/${browser}`) - const { extPath } = await createModifiedTestBuild({ browser, srcPath }) - const installResult = await setupBrowserAndExtension({ browser, extPath }) - driver = installResult.driver - extensionUri = installResult.extensionUri - - await driver.get(extensionUri) - await delay(300) - }) - - afterEach(async function () { - // logs command not supported in firefox - // https://github.com/SeleniumHQ/selenium/issues/2910 - if (browser === 'chrome') { - // check for console errors - const errors = await checkBrowserForConsoleErrors() - if (errors.length) { - const errorReports = errors.map(err => err.message) - const errorMessage = `Errors found in browser console:\n${errorReports.join('\n')}` - console.error(new Error(errorMessage)) - - } - } - // gather extra data if test failed - if (this.currentTest.state === 'failed') { - await verboseReportOnFailure({ browser, driver, title: this.currentTest.title }) - } - }) - - after(async function () { - await driver.quit() - }) - - describe('Setup', function () { - - it('switches to Chrome extensions list', async function () { - const windowHandles = await driver.getAllWindowHandles() - await driver.switchTo().window(windowHandles[0]) - }) - - it('does not select the new UI option', async () => { - await delay(300) - const button = await driver.findElement(By.xpath("//button[contains(text(), 'No thanks, maybe later')]")) - await button.click() - await delay(1000) - }) - - it('sets provider type to localhost', async function () { - await delay(300) - await setProviderType('localhost') - }) - - }) - - describe('Account Creation', () => { - - it('matches MetaMask title', async () => { - const title = await driver.getTitle() - assert.equal(title, 'MetaMask', 'title matches MetaMask') - await delay(300) - }) - - it('show terms of use', async () => { - const terms = await driver.findElement(By.css('.terms-header')).getText() - assert.equal(terms, 'TERMS OF USE', 'shows terms of use') - delay(300) - }) - - it('checks if the TOU button is disabled', async () => { - const button = await driver.findElement(By.css('button')).isEnabled() - assert.equal(button, false, 'disabled continue button') - const element = await driver.findElement(By.linkText('Attributions')) - await driver.executeScript('arguments[0].scrollIntoView(true)', element) - await delay(700) - }) - - it('allows the button to be clicked when scrolled to the bottom of TOU', async () => { - const button = await driver.findElement(By.css('#app-content > div > div.app-primary.from-right > div > div.flex-column.flex-center.flex-grow > button')) - await button.click() - await delay(300) - }) - - it('shows privacy notice', async () => { - const privacy = await driver.findElement(By.css('.terms-header')).getText() - assert.equal(privacy, 'PRIVACY NOTICE', 'shows privacy notice') - await driver.findElement(By.css('button')).click() - await delay(300) - }) - - it('shows phishing notice', async () => { - const noticeHeader = await driver.findElement(By.css('.terms-header')).getText() - assert.equal(noticeHeader, 'PHISHING WARNING', 'shows phishing warning') - const element = await driver.findElement(By.css('.markdown')) - await driver.executeScript('arguments[0].scrollTop = arguments[0].scrollHeight', element) - await delay(300) - await driver.findElement(By.css('button')).click() - await delay(300) - }) - - it('accepts password with length of eight', async () => { - const passwordBox = await driver.findElement(By.id('password-box')) - const passwordBoxConfirm = await driver.findElement(By.id('password-box-confirm')) - const button = await driver.findElements(By.css('button')) - - await passwordBox.sendKeys('123456789') - await passwordBoxConfirm.sendKeys('123456789') - await button[0].click() - await delay(500) - }) - - it('shows value was created and seed phrase', async () => { - await delay(300) - const seedPhrase = await driver.findElement(By.css('.twelve-word-phrase')).getText() - assert.equal(seedPhrase.split(' ').length, 12) - const continueAfterSeedPhrase = await driver.findElement(By.css('#app-content > div > div.app-primary.from-right > div > button:nth-child(4)')) - assert.equal(await continueAfterSeedPhrase.getText(), `I'VE COPIED IT SOMEWHERE SAFE`) - await continueAfterSeedPhrase.click() - await delay(300) - }) - - it('adds a second account', async function () { - await driver.findElement(By.css('div.full-width > div > div:nth-child(2) > span > div')).click() - await delay(300) - await driver.findElement(By.css('div.full-width > div > div:nth-child(2) > span > div > div > span > div > li:nth-child(3) > span')).click() - }) - - it('shows account address', async function () { - await delay(300) - accountAddress = await driver.findElement(By.css('#app-content > div > div.app-primary.from-left > div > div > div:nth-child(1) > flex-column > div.flex-row > div')).getText() - }) - - it('logs out of the vault', async () => { - await driver.findElement(By.css('.sandwich-expando')).click() - await delay(500) - const logoutButton = await driver.findElement(By.css('.menu-droppo > li:nth-child(3)')) - assert.equal(await logoutButton.getText(), 'Log Out') - await logoutButton.click() - }) - - it('accepts account password after lock', async () => { - await delay(500) - await driver.findElement(By.id('password-box')).sendKeys('123456789') - await driver.findElement(By.id('password-box')).sendKeys(Key.ENTER) - await delay(500) - }) - - it('shows QR code option', async () => { - await delay(300) - await driver.findElement(By.css('.fa-ellipsis-h')).click() - await driver.findElement(By.css('#app-content > div > div.app-primary.from-right > div > div > div:nth-child(1) > flex-column > div.name-label > div > span > i > div > div > li:nth-child(3)')).click() - await delay(300) - }) - - it('checks QR code address is the same as account details address', async () => { - const QRaccountAddress = await driver.findElement(By.css('.ellip-address')).getText() - assert.equal(accountAddress.toLowerCase(), QRaccountAddress) - await driver.findElement(By.css('.fa-arrow-left')).click() - await delay(500) - }) - }) - - describe('Import Ganache seed phrase', function () { - - it('logs out', async function () { - await driver.findElement(By.css('.sandwich-expando')).click() - await delay(200) - const logOut = await driver.findElement(By.css('.menu-droppo > li:nth-child(3)')) - assert.equal(await logOut.getText(), 'Log Out') - await logOut.click() - await delay(300) - }) - - it('restores from seed phrase', async function () { - const restoreSeedLink = await driver.findElement(By.css('#app-content > div > div.app-primary.from-left > div > div.flex-row.flex-center.flex-grow > p')) - assert.equal(await restoreSeedLink.getText(), 'Restore from seed phrase') - await restoreSeedLink.click() - await delay(100) - }) - - it('adds seed phrase', async function () { - const testSeedPhrase = 'phrase upgrade clock rough situate wedding elder clever doctor stamp excess tent' - const seedTextArea = await driver.findElement(By.css('#app-content > div > div.app-primary.from-left > div > textarea')) - await seedTextArea.sendKeys(testSeedPhrase) - - await driver.findElement(By.id('password-box')).sendKeys('123456789') - await driver.findElement(By.id('password-box-confirm')).sendKeys('123456789') - await driver.findElement(By.css('#app-content > div > div.app-primary.from-left > div > div > button:nth-child(2)')).click() - await delay(500) - }) - - it('balance renders', async function () { - await delay(500) - const balance = await driver.findElement(By.css('#app-content > div > div.app-primary.from-right > div > div > div.flex-row > div.ether-balance.ether-balance-amount > div > div > div:nth-child(1) > div:nth-child(1)')) - assert.equal(await balance.getText(), '100.000') - await delay(200) - }) - - it('sends transaction', async function () { - const sendButton = await driver.findElement(By.css('#app-content > div > div.app-primary.from-right > div > div > div.flex-row > button:nth-child(4)')) - assert.equal(await sendButton.getText(), 'SEND') - await sendButton.click() - await delay(200) - }) - - it('adds recipient address and amount', async function () { - const sendTranscationScreen = await driver.findElement(By.css('#app-content > div > div.app-primary.from-right > div > h3:nth-child(2)')).getText() - assert.equal(sendTranscationScreen, 'SEND TRANSACTION') - const inputAddress = await driver.findElement(By.css('#app-content > div > div.app-primary.from-right > div > section:nth-child(3) > div > input')) - const inputAmmount = await driver.findElement(By.css('#app-content > div > div.app-primary.from-right > div > section:nth-child(4) > input')) - await inputAddress.sendKeys('0x2f318C334780961FB129D2a6c30D0763d9a5C970') - await inputAmmount.sendKeys('10') - await driver.findElement(By.css('#app-content > div > div.app-primary.from-right > div > section:nth-child(4) > button')).click() - await delay(300) - }) - - it('confirms transaction', async function () { - await delay(300) - const bySubmitButton = By.css('#pending-tx-form > div.flex-row.flex-space-around.conf-buttons > input') - const submitButton = await driver.wait(until.elementLocated(bySubmitButton)) - - submitButton.click() - - await delay(1500) - }) - - it('finds the transaction in the transactions list', async function () { - const tranasactionAmount = await driver.findElement(By.css('#app-content > div > div.app-primary.from-left > div > section > section > div > div > div > div.ether-balance.ether-balance-amount > div > div > div > div:nth-child(1)')) - assert.equal(await tranasactionAmount.getText(), '10.0') - }) - }) - - describe('Token Factory', function () { - - it('navigates to token factory', async function () { - await driver.get('http://tokenfactory.surge.sh/') - }) - - it('navigates to create token contract link', async function () { - const createToken = await driver.findElement(By.css('#bs-example-navbar-collapse-1 > ul > li:nth-child(3) > a')) - await createToken.click() - }) - - it('adds input for token', async function () { - const totalSupply = await driver.findElement(By.css('#main > div > div > div > div:nth-child(2) > div > div:nth-child(5) > input')) - const tokenName = await driver.findElement(By.css('#main > div > div > div > div:nth-child(2) > div > div:nth-child(6) > input')) - const tokenDecimal = await driver.findElement(By.css('#main > div > div > div > div:nth-child(2) > div > div:nth-child(7) > input')) - const tokenSymbol = await driver.findElement(By.css('#main > div > div > div > div:nth-child(2) > div > div:nth-child(8) > input')) - const createToken = await driver.findElement(By.css('#main > div > div > div > div:nth-child(2) > div > button')) - - await totalSupply.sendKeys('100') - await tokenName.sendKeys('Test') - await tokenDecimal.sendKeys('0') - await tokenSymbol.sendKeys('TST') - await createToken.click() - await delay(1000) - }) - - // There is an issue with blank confirmation window in Firefox, but the button is still there and the driver is able to clicked (?.?) - it('confirms transaction in MetaMask popup', async function () { - const windowHandles = await driver.getAllWindowHandles() - await driver.switchTo().window(windowHandles[windowHandles.length - 1]) - const byMetamaskSubmit = By.css('#pending-tx-form > div.flex-row.flex-space-around.conf-buttons > input') - const metamaskSubmit = await driver.wait(until.elementLocated(byMetamaskSubmit)) - await metamaskSubmit.click() - await delay(1000) - }) - - it('switches back to Token Factory to grab the token contract address', async function () { - const windowHandles = await driver.getAllWindowHandles() - await driver.switchTo().window(windowHandles[0]) - const tokenContactAddress = await driver.findElement(By.css('#main > div > div > div > div:nth-child(2) > span:nth-child(3)')) - tokenAddress = await tokenContactAddress.getText() - await delay(500) - }) - - it('navigates back to MetaMask popup in the tab', async function () { - await driver.get(extensionUri) - await delay(700) - }) - }) - - describe('Add Token', function () { - - it('switches to the add token screen', async function () { - const tokensTab = await driver.findElement(By.css('#app-content > div > div.app-primary.from-right > div > section > div > div.inactiveForm.pointer')) - assert.equal(await tokensTab.getText(), 'TOKENS') - await tokensTab.click() - await delay(300) - }) - - it('navigates to the add token screen', async function () { - const addTokenButton = await driver.findElement(By.css('#app-content > div > div.app-primary.from-right > div > section > div.full-flex-height > div > button')) - assert.equal(await addTokenButton.getText(), 'ADD TOKEN') - await addTokenButton.click() - }) - - it('checks add token screen rendered', async function () { - const addTokenScreen = await driver.findElement(By.css('#app-content > div > div.app-primary.from-right > div > div.section-title.flex-row.flex-center > h2')) - assert.equal(await addTokenScreen.getText(), 'ADD TOKEN') - }) - - it('adds token parameters', async function () { - const tokenContractAddress = await driver.findElement(By.css('#token-address')) - await tokenContractAddress.sendKeys(tokenAddress) - await delay(300) - await driver.findElement(By.css('#app-content > div > div.app-primary.from-right > div > div.flex-column.flex-justify-center.flex-grow.select-none > div > button')).click() - await delay(200) - }) - - it('checks the token balance', async function () { - const tokenBalance = await driver.findElement(By.css('#app-content > div > div.app-primary.from-left > div > section > div.full-flex-height > ol > li:nth-child(2) > h3')) - assert.equal(await tokenBalance.getText(), '100 TST') - }) - }) - - async function setProviderType (type) { - await driver.executeScript('window.metamask.setProviderType(arguments[0])', type) - } - - async function checkBrowserForConsoleErrors () { - const ignoredLogTypes = ['WARNING'] - const ignoredErrorMessages = [ - // React throws error warnings on "dataset", but still sets the data-* properties correctly - 'Warning: Unknown prop `dataset` on ', - // Third-party Favicon 404s show up as errors - 'favicon.ico - Failed to load resource: the server responded with a status of 404 (Not Found)', - // React Development build - known issue blocked by test build sys - 'Warning: It looks like you\'re using a minified copy of the development build of React.', - // Redux Development build - known issue blocked by test build sys - 'This means that you are running a slower development build of Redux.', - ] - const browserLogs = await driver.manage().logs().get('browser') - const errorEntries = browserLogs.filter(entry => !ignoredLogTypes.includes(entry.level.toString())) - const errorObjects = errorEntries.map(entry => entry.toJSON()) - // ignore all errors that contain a message in `ignoredErrorMessages` - const matchedErrorObjects = errorObjects.filter(entry => !ignoredErrorMessages.some(message => entry.message.includes(message))) - return matchedErrorObjects - } - -}) diff --git a/test/e2e/mock-3box/server.js b/test/e2e/mock-3box/server.js new file mode 100644 index 000000000000..1ac8a758c075 --- /dev/null +++ b/test/e2e/mock-3box/server.js @@ -0,0 +1,38 @@ +const http = require('http') +const url = require('url') + +const port = 8889 + +const database = {} + +const requestHandler = (request, response) => { + response.setHeader('Content-Type', 'application/json') + if (request.method === 'POST') { + let body = '' + request.on('data', (chunk) => { + body += chunk.toString() // convert Buffer to string + }) + request.on('end', () => { + const { key, data } = JSON.parse(body) + + database[key] = data + response.setHeader('Access-Control-Allow-Headers', '*') + response.end('ok') + }) + } else if (request.method === 'GET') { + const { key } = url.parse(request.url, true).query + response.setHeader('Access-Control-Allow-Headers', '*') + response.end(JSON.stringify(database[key] || '')) + } else { + response.end('unknown request') + } +} + +const server = http.createServer(requestHandler) + +server.listen(port, (err) => { + if (err) { + console.log('mock 3box server error: ', err) + + } +}) diff --git a/test/e2e/permissions.spec.js b/test/e2e/permissions.spec.js new file mode 100644 index 000000000000..87c439c0c186 --- /dev/null +++ b/test/e2e/permissions.spec.js @@ -0,0 +1,154 @@ +const assert = require('assert') +const webdriver = require('selenium-webdriver') + +const { By, until } = webdriver +const enLocaleMessages = require('../../app/_locales/en/messages.json') +const { + regularDelayMs, + largeDelayMs, +} = require('./helpers') +const { buildWebDriver } = require('./webdriver') +const Ganache = require('./ganache') + +const ganacheServer = new Ganache() + +describe('MetaMask', function () { + let driver + let publicAddress + + this.timeout(0) + this.bail(true) + + before(async function () { + await ganacheServer.start({ + accounts: [ + { + secretKey: '0x53CB0AB5226EEBF4D872113D98332C1555DC304443BEE1CF759D15798D3C55A9', + balance: 25000000000000000000, + }, + ], + }) + const result = await buildWebDriver() + driver = result.driver + }) + + afterEach(async function () { + if (process.env.SELENIUM_BROWSER === 'chrome') { + const errors = await driver.checkBrowserForConsoleErrors(driver) + if (errors.length) { + const errorReports = errors.map((err) => err.message) + const errorMessage = `Errors found in browser console:\n${errorReports.join('\n')}` + console.error(new Error(errorMessage)) + } + } + if (this.currentTest.state === 'failed') { + await driver.verboseReportOnFailure(this.currentTest.title) + } + }) + + after(async function () { + await ganacheServer.quit() + await driver.quit() + }) + + describe('Going through the first time flow, but skipping the seed phrase challenge', function () { + it('clicks the continue button on the welcome screen', async function () { + await driver.findElement(By.css('.welcome-page__header')) + await driver.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.getStarted.message}')]`)) + await driver.delay(largeDelayMs) + }) + + it('clicks the "Create New Wallet" option', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Create a Wallet')]`)) + await driver.delay(largeDelayMs) + }) + + it('clicks the "No thanks" option on the metametrics opt-in screen', async function () { + await driver.clickElement(By.css('.btn-default')) + await driver.delay(largeDelayMs) + }) + + it('accepts a secure password', async function () { + const passwordBox = await driver.findElement(By.css('.first-time-flow__form #create-password')) + const passwordBoxConfirm = await driver.findElement(By.css('.first-time-flow__form #confirm-password')) + + await passwordBox.sendKeys('correct horse battery staple') + await passwordBoxConfirm.sendKeys('correct horse battery staple') + + await driver.clickElement(By.css('.first-time-flow__checkbox')) + + await driver.clickElement(By.css('.first-time-flow__form button')) + await driver.delay(largeDelayMs) + }) + + it('skips the seed phrase challenge', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.remindMeLater.message}')]`)) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.css('[data-testid="account-options-menu-button"]')) + await driver.clickElement(By.css('[data-testid="account-options-menu__account-details"]')) + }) + + it('gets the current accounts address', async function () { + const addressInput = await driver.findElement(By.css('.readonly-input__input')) + publicAddress = await addressInput.getAttribute('value') + const accountModal = await driver.findElement(By.css('span .modal')) + + await driver.clickElement(By.css('.account-modal__close')) + + await driver.wait(until.stalenessOf(accountModal)) + await driver.delay(regularDelayMs) + }) + }) + + describe('sets permissions', function () { + let extension + let popup + let dapp + + it('connects to the dapp', async function () { + await driver.openNewPage('http://127.0.0.1:8080/') + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Connect')]`)) + + await driver.waitUntilXWindowHandles(3) + const windowHandles = await driver.getAllWindowHandles() + + extension = windowHandles[0] + dapp = await driver.switchToWindowWithTitle('E2E Test Dapp', windowHandles) + popup = windowHandles.find((handle) => handle !== extension && handle !== dapp) + + await driver.switchToWindow(popup) + + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Next')]`)) + await driver.clickElement(By.xpath(`//button[contains(text(), 'Connect')]`)) + + await driver.waitUntilXWindowHandles(2) + await driver.switchToWindow(extension) + await driver.delay(regularDelayMs) + }) + + it('shows connected sites', async function () { + await driver.clickElement(By.css('[data-testid="account-options-menu-button"]')) + await driver.clickElement(By.css('[data-testid="account-options-menu__connected-sites"]')) + + await driver.findElement(By.xpath(`//h2[contains(text(), 'Connected sites')]`)) + + const domains = await driver.findClickableElements(By.css('.connected-sites-list__domain-name')) + assert.equal(domains.length, 1) + }) + + it('can get accounts within the dapp', async function () { + await driver.switchToWindow(dapp) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'eth_accounts')]`)) + + const getAccountsResult = await driver.findElement(By.css('#getAccountsResult')) + assert.equal((await getAccountsResult.getText()).toLowerCase(), publicAddress.toLowerCase()) + }) + }) +}) diff --git a/test/e2e/run-all.sh b/test/e2e/run-all.sh new file mode 100755 index 000000000000..0e604a6bb988 --- /dev/null +++ b/test/e2e/run-all.sh @@ -0,0 +1,98 @@ +#!/usr/bin/env bash + +set -x +set -e +set -u +set -o pipefail + +retry () { + retry=0 + limit="${METAMASK_E2E_RETRY_LIMIT:-3}" + while [[ $retry -lt $limit ]] + do + "$@" && break + retry=$(( retry + 1 )) + sleep 1 + done + + if [[ $retry == "$limit" ]] + then + exit 1 + fi +} + +export PATH="$PATH:./node_modules/.bin" + +for spec in test/e2e/tests/*.spec.js +do + retry mocha --no-timeouts "${spec}" +done + +retry concurrently --kill-others \ + --names 'dapp,e2e' \ + --prefix '[{time}][{name}]' \ + --success first \ + 'yarn dapp' \ + 'mocha test/e2e/metamask-ui.spec' + +retry concurrently --kill-others \ + --names 'dapp,e2e' \ + --prefix '[{time}][{name}]' \ + --success first \ + 'yarn dapp' \ + 'mocha test/e2e/metamask-responsive-ui.spec' + +retry concurrently --kill-others \ + --names 'dapp,e2e' \ + --prefix '[{time}][{name}]' \ + --success first \ + 'yarn dapp' \ + 'mocha test/e2e/signature-request.spec' + +retry concurrently --kill-others \ + --names 'e2e' \ + --prefix '[{time}][{name}]' \ + --success first \ + 'mocha test/e2e/from-import-ui.spec' + +retry concurrently --kill-others \ + --names 'e2e' \ + --prefix '[{time}][{name}]' \ + --success first \ + 'mocha test/e2e/send-edit.spec' + +retry concurrently --kill-others \ + --names 'dapp,e2e' \ + --prefix '[{time}][{name}]' \ + --success first \ + 'yarn dapp' \ + 'mocha test/e2e/ethereum-on.spec' + +retry concurrently --kill-others \ + --names 'dapp,e2e' \ + --prefix '[{time}][{name}]' \ + --success first \ + 'yarn dapp' \ + 'mocha test/e2e/permissions.spec' + +retry concurrently --kill-others \ + --names 'sendwithprivatedapp,e2e' \ + --prefix '[{time}][{name}]' \ + --success first \ + 'yarn sendwithprivatedapp' \ + 'mocha test/e2e/incremental-security.spec' + +retry concurrently --kill-others \ + --names 'dapp,e2e' \ + --prefix '[{time}][{name}]' \ + --success first \ + 'yarn dapp' \ + 'mocha test/e2e/address-book.spec' + +retry concurrently --kill-others \ + --names '3box,dapp,e2e' \ + --prefix '[{time}][{name}]' \ + --success first \ + 'node test/e2e/mock-3box/server.js' \ + 'yarn dapp' \ + 'mocha test/e2e/threebox.spec' diff --git a/test/e2e/send-edit.spec.js b/test/e2e/send-edit.spec.js new file mode 100644 index 000000000000..aa0fc6645455 --- /dev/null +++ b/test/e2e/send-edit.spec.js @@ -0,0 +1,211 @@ +const assert = require('assert') +const webdriver = require('selenium-webdriver') + +const { By, until } = webdriver +const enLocaleMessages = require('../../app/_locales/en/messages.json') +const { + tinyDelayMs, + regularDelayMs, + largeDelayMs, +} = require('./helpers') +const { buildWebDriver } = require('./webdriver') +const Ganache = require('./ganache') + +const ganacheServer = new Ganache() + +describe('Using MetaMask with an existing account', function () { + let driver + + const testSeedPhrase = 'forum vessel pink push lonely enact gentle tail admit parrot grunt dress' + + this.timeout(0) + this.bail(true) + + before(async function () { + await ganacheServer.start({ + accounts: [ + { + secretKey: '0x53CB0AB5226EEBF4D872113D98332C1555DC304443BEE1CF759D15798D3C55A9', + balance: 25000000000000000000, + }, + ], + }) + const result = await buildWebDriver() + driver = result.driver + }) + + afterEach(async function () { + if (process.env.SELENIUM_BROWSER === 'chrome') { + const errors = await driver.checkBrowserForConsoleErrors(driver) + if (errors.length) { + const errorReports = errors.map((err) => err.message) + const errorMessage = `Errors found in browser console:\n${errorReports.join('\n')}` + console.error(new Error(errorMessage)) + } + } + if (this.currentTest.state === 'failed') { + await driver.verboseReportOnFailure(this.currentTest.title) + } + }) + + after(async function () { + await ganacheServer.quit() + await driver.quit() + }) + + describe('First time flow starting from an existing seed phrase', function () { + it('clicks the continue button on the welcome screen', async function () { + await driver.findElement(By.css('.welcome-page__header')) + await driver.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.getStarted.message}')]`)) + await driver.delay(largeDelayMs) + }) + + it('clicks the "Import Wallet" option', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Import wallet')]`)) + await driver.delay(largeDelayMs) + }) + + it('clicks the "No thanks" option on the metametrics opt-in screen', async function () { + await driver.clickElement(By.css('.btn-default')) + await driver.delay(largeDelayMs) + }) + + it('imports a seed phrase', async function () { + const [seedTextArea] = await driver.findElements(By.css('input[placeholder="Paste seed phrase from clipboard"]')) + await seedTextArea.sendKeys(testSeedPhrase) + await driver.delay(regularDelayMs) + + const [password] = await driver.findElements(By.id('password')) + await password.sendKeys('correct horse battery staple') + const [confirmPassword] = await driver.findElements(By.id('confirm-password')) + confirmPassword.sendKeys('correct horse battery staple') + + await driver.clickElement(By.css('.first-time-flow__terms')) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Import')]`)) + await driver.delay(regularDelayMs) + }) + + it('clicks through the success screen', async function () { + await driver.findElement(By.xpath(`//div[contains(text(), 'Congratulations')]`)) + await driver.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.endOfFlowMessage10.message}')]`)) + await driver.delay(regularDelayMs) + }) + }) + + describe('Send ETH from inside MetaMask', function () { + it('starts a send transaction', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Send')]`)) + await driver.delay(regularDelayMs) + + const inputAddress = await driver.findElement(By.css('input[placeholder="Search, public address (0x), or ENS"]')) + await inputAddress.sendKeys('0x2f318C334780961FB129D2a6c30D0763d9a5C970') + + const inputAmount = await driver.findElement(By.css('.unit-input__input')) + await inputAmount.sendKeys('1') + + // Set the gas limit + await driver.clickElement(By.css('.advanced-gas-options-btn')) + await driver.delay(regularDelayMs) + + const gasModal = await driver.findElement(By.css('span .modal')) + + const [gasPriceInput, gasLimitInput] = await driver.findElements(By.css('.advanced-gas-inputs__gas-edit-row__input')) + + await gasPriceInput.clear() + await driver.delay(50) + await gasPriceInput.sendKeys('10') + await driver.delay(50) + await driver.delay(tinyDelayMs) + await driver.delay(50) + + await gasLimitInput.clear() + await driver.delay(50) + await gasLimitInput.sendKeys('25000') + + await driver.delay(1000) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Save')]`)) + await driver.wait(until.stalenessOf(gasModal)) + await driver.delay(regularDelayMs) + + // Continue to next screen + await driver.clickElement(By.xpath(`//button[contains(text(), 'Next')]`)) + await driver.delay(regularDelayMs) + }) + + it('has correct value and fee on the confirm screen the transaction', async function () { + const transactionAmounts = await driver.findElements(By.css('.currency-display-component__text')) + const transactionAmount = transactionAmounts[0] + assert.equal(await transactionAmount.getText(), '1') + + const transactionFee = transactionAmounts[1] + assert.equal(await transactionFee.getText(), '0.00025') + }) + + it('edits the transaction', async function () { + await driver.clickElement(By.css('.confirm-page-container-header__back-button')) + + await driver.delay(regularDelayMs) + + const inputAmount = await driver.findElement(By.css('.unit-input__input')) + + await inputAmount.clear() + await driver.delay(50) + await inputAmount.sendKeys('2.2') + + await driver.clickElement(By.css('.advanced-gas-options-btn')) + await driver.delay(regularDelayMs) + + const gasModal = await driver.findElement(By.css('span .modal')) + + const [gasPriceInput, gasLimitInput] = await driver.findElements(By.css('.advanced-gas-inputs__gas-edit-row__input')) + + await gasPriceInput.clear() + await driver.delay(50) + await gasPriceInput.sendKeys('8') + await driver.delay(50) + await driver.delay(tinyDelayMs) + await driver.delay(50) + + await gasLimitInput.clear() + await driver.delay(50) + await gasLimitInput.sendKeys('100000') + + await driver.delay(1000) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Save')]`)) + await driver.wait(until.stalenessOf(gasModal)) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Next')]`)) + await driver.delay(regularDelayMs) + }) + + it('has correct updated value on the confirm screen the transaction', async function () { + const transactionAmounts = await driver.findElements(By.css('.currency-display-component__text')) + const transactionAmount = transactionAmounts[0] + assert.equal(await transactionAmount.getText(), '2.2') + + const transactionFee = transactionAmounts[1] + assert.equal(await transactionFee.getText(), '0.0008') + }) + + it('confirms the transaction', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Confirm')]`)) + await driver.delay(regularDelayMs) + }) + + it('finds the transaction in the transactions list', async function () { + await driver.clickElement(By.css('[data-testid="home__activity-tab"]')) + await driver.wait(async () => { + const confirmedTxes = await driver.findElements(By.css('.transaction-list__completed-transactions .transaction-list-item')) + return confirmedTxes.length === 1 + }, 10000) + + const txValues = await driver.findElements(By.css('.transaction-list-item__primary-currency')) + assert.equal(txValues.length, 1) + assert.ok((/-2.2\s*ETH/u).test(await txValues[0].getText())) + }) + }) +}) diff --git a/test/e2e/send-eth-with-private-key-test/ethereumjs-tx.js b/test/e2e/send-eth-with-private-key-test/ethereumjs-tx.js new file mode 100644 index 000000000000..7afccb796d27 --- /dev/null +++ b/test/e2e/send-eth-with-private-key-test/ethereumjs-tx.js @@ -0,0 +1,711 @@ +/* eslint-disable */ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.ethereumjs = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o=0;o--)if(u[o]!==f[o])return!1;for(o=u.length-1;o>=0;o--)if(s=u[o],!_deepEqual(e[s],t[s],r,n))return!1;return!0}function notDeepStrictEqual(e,t,r){_deepEqual(e,t,!0)&&fail(e,t,r,"notDeepStrictEqual",notDeepStrictEqual)}function expectedException(e,t){if(!e||!t)return!1;if("[object RegExp]"==Object.prototype.toString.call(t))return t.test(e);try{if(e instanceof t)return!0}catch(e){}return!Error.isPrototypeOf(t)&&!0===t.call({},e)}function _tryBlock(e){var t;try{e()}catch(e){t=e}return t}function _throws(e,t,r,n){var i;if("function"!=typeof t)throw new TypeError('"block" argument must be a function');"string"==typeof r&&(n=r,r=null),i=_tryBlock(t),n=(r&&r.name?" ("+r.name+").":".")+(n?" "+n:"."),e&&!i&&fail(i,r,"Missing expected exception"+n);var a="string"==typeof n,s=!e&&util.isError(i),o=!e&&i&&!r;if((s&&a&&expectedException(i,r)||o)&&fail(i,r,"Got unwanted exception"+n),e&&i&&r&&!expectedException(i,r)||!e&&i)throw i}var util=require("util/"),hasOwn=Object.prototype.hasOwnProperty,pSlice=Array.prototype.slice,functionsHaveNames="foo"===function(){}.name,assert=module.exports=ok,regex=/\s*function\s+([^\(\s]*)\s*/;assert.AssertionError=function(e){this.name="AssertionError",this.actual=e.actual,this.expected=e.expected,this.operator=e.operator,e.message?(this.message=e.message,this.generatedMessage=!1):(this.message=getMessage(this),this.generatedMessage=!0);var t=e.stackStartFunction||fail;if(Error.captureStackTrace)Error.captureStackTrace(this,t);else{var r=new Error;if(r.stack){var n=r.stack,i=getName(t),a=n.indexOf("\n"+i);if(a>=0){var s=n.indexOf("\n",a+1);n=n.substring(s+1)}this.stack=n}}},util.inherits(assert.AssertionError,Error),assert.fail=fail,assert.ok=ok,assert.equal=function(e,t,r){e!=t&&fail(e,t,r,"==",assert.equal)},assert.notEqual=function(e,t,r){e==t&&fail(e,t,r,"!=",assert.notEqual)},assert.deepEqual=function(e,t,r){_deepEqual(e,t,!1)||fail(e,t,r,"deepEqual",assert.deepEqual)},assert.deepStrictEqual=function(e,t,r){_deepEqual(e,t,!0)||fail(e,t,r,"deepStrictEqual",assert.deepStrictEqual)},assert.notDeepEqual=function(e,t,r){_deepEqual(e,t,!1)&&fail(e,t,r,"notDeepEqual",assert.notDeepEqual)},assert.notDeepStrictEqual=notDeepStrictEqual,assert.strictEqual=function(e,t,r){e!==t&&fail(e,t,r,"===",assert.strictEqual)},assert.notStrictEqual=function(e,t,r){e===t&&fail(e,t,r,"!==",assert.notStrictEqual)},assert.throws=function(e,t,r){_throws(!0,e,t,r)},assert.doesNotThrow=function(e,t,r){_throws(!1,e,t,r)},assert.ifError=function(e){if(e)throw e};var objectKeys=Object.keys||function(e){var t=[];for(var r in e)hasOwn.call(e,r)&&t.push(r);return t}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"util/":103}],2:[function(require,module,exports){ +"use strict";function placeHoldersCount(o){var r=o.length;if(r%4>0)throw new Error("Invalid string. Length must be a multiple of 4");return"="===o[r-2]?2:"="===o[r-1]?1:0}function byteLength(o){return 3*o.length/4-placeHoldersCount(o)}function toByteArray(o){var r,e,t,u,n,p=o.length;u=placeHoldersCount(o),n=new Arr(3*p/4-u),e=u>0?p-4:p;var a=0;for(r=0;r>16&255,n[a++]=t>>8&255,n[a++]=255&t;return 2===u?(t=revLookup[o.charCodeAt(r)]<<2|revLookup[o.charCodeAt(r+1)]>>4,n[a++]=255&t):1===u&&(t=revLookup[o.charCodeAt(r)]<<10|revLookup[o.charCodeAt(r+1)]<<4|revLookup[o.charCodeAt(r+2)]>>2,n[a++]=t>>8&255,n[a++]=255&t),n}function tripletToBase64(o){return lookup[o>>18&63]+lookup[o>>12&63]+lookup[o>>6&63]+lookup[63&o]}function encodeChunk(o,r,e){for(var t,u=[],n=r;na?a:p+16383));return 1===t?(r=o[e-1],u+=lookup[r>>2],u+=lookup[r<<4&63],u+="=="):2===t&&(r=(o[e-2]<<8)+o[e-1],u+=lookup[r>>10],u+=lookup[r>>4&63],u+=lookup[r<<2&63],u+="="),n.push(u),n.join("")}exports.byteLength=byteLength,exports.toByteArray=toByteArray,exports.fromByteArray=fromByteArray;for(var lookup=[],revLookup=[],Arr="undefined"!=typeof Uint8Array?Uint8Array:Array,code="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",i=0,len=code.length;i72)return!1;if(48!==e[0])return!1;if(e[1]!==e.length-2)return!1;if(2!==e[2])return!1;var r=e[3];if(0===r)return!1;if(5+r>=e.length)return!1;if(2!==e[4+r])return!1;var n=e[5+r];return 0!==n&&(6+r+n===e.length&&(!(128&e[4])&&(!(r>1&&0===e[4]&&!(128&e[5]))&&(!(128&e[r+6])&&!(n>1&&0===e[r+6]&&!(128&e[r+7]))))))}function decode(e){if(e.length<8)throw new Error("DER sequence length is too short");if(e.length>72)throw new Error("DER sequence length is too long");if(48!==e[0])throw new Error("Expected DER sequence");if(e[1]!==e.length-2)throw new Error("DER sequence length is invalid");if(2!==e[2])throw new Error("Expected DER integer");var r=e[3];if(0===r)throw new Error("R length is zero");if(5+r>=e.length)throw new Error("R length is too long");if(2!==e[4+r])throw new Error("Expected DER integer (2)");var n=e[5+r];if(0===n)throw new Error("S length is zero");if(6+r+n!==e.length)throw new Error("S length is invalid");if(128&e[4])throw new Error("R value is negative");if(r>1&&0===e[4]&&!(128&e[5]))throw new Error("R value excessively padded");if(128&e[r+6])throw new Error("S value is negative");if(n>1&&0===e[r+6]&&!(128&e[r+7]))throw new Error("S value excessively padded");return{r:e.slice(4,4+r),s:e.slice(6+r)}}function encode(e,r){var n=e.length,t=r.length;if(0===n)throw new Error("R length is zero");if(0===t)throw new Error("S length is zero");if(n>33)throw new Error("R length is too long");if(t>33)throw new Error("S length is too long");if(128&e[0])throw new Error("R value is negative");if(128&r[0])throw new Error("S value is negative");if(n>1&&0===e[0]&&!(128&e[1]))throw new Error("R value excessively padded");if(t>1&&0===r[0]&&!(128&r[1]))throw new Error("S value excessively padded");var o=Buffer.allocUnsafe(6+n+t);return o[0]=48,o[1]=o.length-2,o[2]=2,o[3]=e.length,e.copy(o,4),o[4+n]=2,o[5+n]=r.length,r.copy(o,6+n),o}var Buffer=require("safe-buffer").Buffer;module.exports={check:check,decode:decode,encode:encode}; + +},{"safe-buffer":82}],4:[function(require,module,exports){ +!function(t,i){"use strict";function r(t,i){if(!t)throw new Error(i||"Assertion failed")}function h(t,i){t.super_=i;var r=function(){};r.prototype=i.prototype,t.prototype=new r,t.prototype.constructor=t}function n(t,i,r){if(n.isBN(t))return t;this.negative=0,this.words=null,this.length=0,this.red=null,null!==t&&("le"!==i&&"be"!==i||(r=i,i=10),this._init(t||0,i||10,r||"be"))}function e(t,i,r){for(var h=0,n=Math.min(t.length,r),e=i;e=49&&o<=54?o-49+10:o>=17&&o<=22?o-17+10:15&o}return h}function o(t,i,r,h){for(var n=0,e=Math.min(t.length,r),o=i;o=49?s-49+10:s>=17?s-17+10:s}return n}function s(t){for(var i=new Array(t.bitLength()),r=0;r>>n}return i}function u(t,i,r){r.negative=i.negative^t.negative;var h=t.length+i.length|0;r.length=h,h=h-1|0;var n=0|t.words[0],e=0|i.words[0],o=n*e,s=67108863&o,u=o/67108864|0;r.words[0]=s;for(var a=1;a>>26,m=67108863&u,f=Math.min(a,i.length-1),d=Math.max(0,a-t.length+1);d<=f;d++){var p=a-d|0;l+=(o=(n=0|t.words[p])*(e=0|i.words[d])+m)/67108864|0,m=67108863&o}r.words[a]=0|m,u=0|l}return 0!==u?r.words[a]=0|u:r.length--,r.strip()}function a(t,i,r){r.negative=i.negative^t.negative,r.length=t.length+i.length;for(var h=0,n=0,e=0;e>>26)|0)>>>26,o&=67108863}r.words[e]=s,h=o,o=n}return 0!==h?r.words[e]=h:r.length--,r.strip()}function l(t,i,r){return(new m).mulp(t,i,r)}function m(t,i){this.x=t,this.y=i}function f(t,i){this.name=t,this.p=new n(i,16),this.n=this.p.bitLength(),this.k=new n(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function d(){f.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function p(){f.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function M(){f.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function v(){f.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function g(t){if("string"==typeof t){var i=n._prime(t);this.m=i.p,this.prime=i}else r(t.gtn(1),"modulus must be greater than 1"),this.m=t,this.prime=null}function c(t){g.call(this,t),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new n(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}"object"==typeof t?t.exports=n:i.BN=n,n.BN=n,n.wordSize=26;var w;try{w=require("buffer").Buffer}catch(t){}n.isBN=function(t){return t instanceof n||null!==t&&"object"==typeof t&&t.constructor.wordSize===n.wordSize&&Array.isArray(t.words)},n.max=function(t,i){return t.cmp(i)>0?t:i},n.min=function(t,i){return t.cmp(i)<0?t:i},n.prototype._init=function(t,i,h){if("number"==typeof t)return this._initNumber(t,i,h);if("object"==typeof t)return this._initArray(t,i,h);"hex"===i&&(i=16),r(i===(0|i)&&i>=2&&i<=36);var n=0;"-"===(t=t.toString().replace(/\s+/g,""))[0]&&n++,16===i?this._parseHex(t,n):this._parseBase(t,i,n),"-"===t[0]&&(this.negative=1),this.strip(),"le"===h&&this._initArray(this.toArray(),i,h)},n.prototype._initNumber=function(t,i,h){t<0&&(this.negative=1,t=-t),t<67108864?(this.words=[67108863&t],this.length=1):t<4503599627370496?(this.words=[67108863&t,t/67108864&67108863],this.length=2):(r(t<9007199254740992),this.words=[67108863&t,t/67108864&67108863,1],this.length=3),"le"===h&&this._initArray(this.toArray(),i,h)},n.prototype._initArray=function(t,i,h){if(r("number"==typeof t.length),t.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(t.length/3),this.words=new Array(this.length);for(var n=0;n=0;n-=3)o=t[n]|t[n-1]<<8|t[n-2]<<16,this.words[e]|=o<>>26-s&67108863,(s+=24)>=26&&(s-=26,e++);else if("le"===h)for(n=0,e=0;n>>26-s&67108863,(s+=24)>=26&&(s-=26,e++);return this.strip()},n.prototype._parseHex=function(t,i){this.length=Math.ceil((t.length-i)/6),this.words=new Array(this.length);for(var r=0;r=i;r-=6)n=e(t,r,r+6),this.words[h]|=n<>>26-o&4194303,(o+=24)>=26&&(o-=26,h++);r+6!==i&&(n=e(t,i,r+6),this.words[h]|=n<>>26-o&4194303),this.strip()},n.prototype._parseBase=function(t,i,r){this.words=[0],this.length=1;for(var h=0,n=1;n<=67108863;n*=i)h++;h--,n=n/i|0;for(var e=t.length-r,s=e%h,u=Math.min(e,e-s)+r,a=0,l=r;l1&&0===this.words[this.length-1];)this.length--;return this._normSign()},n.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},n.prototype.inspect=function(){return(this.red?""};var y=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],b=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],_=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];n.prototype.toString=function(t,i){t=t||10,i=0|i||1;var h;if(16===t||"hex"===t){h="";for(var n=0,e=0,o=0;o>>24-n&16777215)||o!==this.length-1?y[6-u.length]+u+h:u+h,(n+=2)>=26&&(n-=26,o--)}for(0!==e&&(h=e.toString(16)+h);h.length%i!=0;)h="0"+h;return 0!==this.negative&&(h="-"+h),h}if(t===(0|t)&&t>=2&&t<=36){var a=b[t],l=_[t];h="";var m=this.clone();for(m.negative=0;!m.isZero();){var f=m.modn(l).toString(t);h=(m=m.idivn(l)).isZero()?f+h:y[a-f.length]+f+h}for(this.isZero()&&(h="0"+h);h.length%i!=0;)h="0"+h;return 0!==this.negative&&(h="-"+h),h}r(!1,"Base should be between 2 and 36")},n.prototype.toNumber=function(){var t=this.words[0];return 2===this.length?t+=67108864*this.words[1]:3===this.length&&1===this.words[2]?t+=4503599627370496+67108864*this.words[1]:this.length>2&&r(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-t:t},n.prototype.toJSON=function(){return this.toString(16)},n.prototype.toBuffer=function(t,i){return r(void 0!==w),this.toArrayLike(w,t,i)},n.prototype.toArray=function(t,i){return this.toArrayLike(Array,t,i)},n.prototype.toArrayLike=function(t,i,h){var n=this.byteLength(),e=h||Math.max(1,n);r(n<=e,"byte array longer than desired length"),r(e>0,"Requested array length <= 0"),this.strip();var o,s,u="le"===i,a=new t(e),l=this.clone();if(u){for(s=0;!l.isZero();s++)o=l.andln(255),l.iushrn(8),a[s]=o;for(;s=4096&&(r+=13,i>>>=13),i>=64&&(r+=7,i>>>=7),i>=8&&(r+=4,i>>>=4),i>=2&&(r+=2,i>>>=2),r+i},n.prototype._zeroBits=function(t){if(0===t)return 26;var i=t,r=0;return 0==(8191&i)&&(r+=13,i>>>=13),0==(127&i)&&(r+=7,i>>>=7),0==(15&i)&&(r+=4,i>>>=4),0==(3&i)&&(r+=2,i>>>=2),0==(1&i)&&r++,r},n.prototype.bitLength=function(){var t=this.words[this.length-1],i=this._countBits(t);return 26*(this.length-1)+i},n.prototype.zeroBits=function(){if(this.isZero())return 0;for(var t=0,i=0;it.length?this.clone().ior(t):t.clone().ior(this)},n.prototype.uor=function(t){return this.length>t.length?this.clone().iuor(t):t.clone().iuor(this)},n.prototype.iuand=function(t){var i;i=this.length>t.length?t:this;for(var r=0;rt.length?this.clone().iand(t):t.clone().iand(this)},n.prototype.uand=function(t){return this.length>t.length?this.clone().iuand(t):t.clone().iuand(this)},n.prototype.iuxor=function(t){var i,r;this.length>t.length?(i=this,r=t):(i=t,r=this);for(var h=0;ht.length?this.clone().ixor(t):t.clone().ixor(this)},n.prototype.uxor=function(t){return this.length>t.length?this.clone().iuxor(t):t.clone().iuxor(this)},n.prototype.inotn=function(t){r("number"==typeof t&&t>=0);var i=0|Math.ceil(t/26),h=t%26;this._expand(i),h>0&&i--;for(var n=0;n0&&(this.words[n]=~this.words[n]&67108863>>26-h),this.strip()},n.prototype.notn=function(t){return this.clone().inotn(t)},n.prototype.setn=function(t,i){r("number"==typeof t&&t>=0);var h=t/26|0,n=t%26;return this._expand(h+1),this.words[h]=i?this.words[h]|1<t.length?(r=this,h=t):(r=t,h=this);for(var n=0,e=0;e>>26;for(;0!==n&&e>>26;if(this.length=r.length,0!==n)this.words[this.length]=n,this.length++;else if(r!==this)for(;et.length?this.clone().iadd(t):t.clone().iadd(this)},n.prototype.isub=function(t){if(0!==t.negative){t.negative=0;var i=this.iadd(t);return t.negative=1,i._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(t),this.negative=1,this._normSign();var r=this.cmp(t);if(0===r)return this.negative=0,this.length=1,this.words[0]=0,this;var h,n;r>0?(h=this,n=t):(h=t,n=this);for(var e=0,o=0;o>26,this.words[o]=67108863&i;for(;0!==e&&o>26,this.words[o]=67108863&i;if(0===e&&o>>13,d=0|o[1],p=8191&d,M=d>>>13,v=0|o[2],g=8191&v,c=v>>>13,w=0|o[3],y=8191&w,b=w>>>13,_=0|o[4],k=8191&_,A=_>>>13,x=0|o[5],S=8191&x,Z=x>>>13,q=0|o[6],R=8191&q,B=q>>>13,N=0|o[7],L=8191&N,I=N>>>13,z=0|o[8],T=8191&z,E=z>>>13,O=0|o[9],j=8191&O,K=O>>>13,P=0|s[0],F=8191&P,C=P>>>13,D=0|s[1],H=8191&D,J=D>>>13,U=0|s[2],G=8191&U,Q=U>>>13,V=0|s[3],W=8191&V,X=V>>>13,Y=0|s[4],$=8191&Y,tt=Y>>>13,it=0|s[5],rt=8191&it,ht=it>>>13,nt=0|s[6],et=8191&nt,ot=nt>>>13,st=0|s[7],ut=8191&st,at=st>>>13,lt=0|s[8],mt=8191<,ft=lt>>>13,dt=0|s[9],pt=8191&dt,Mt=dt>>>13;r.negative=t.negative^i.negative,r.length=19;var vt=(a+(h=Math.imul(m,F))|0)+((8191&(n=(n=Math.imul(m,C))+Math.imul(f,F)|0))<<13)|0;a=((e=Math.imul(f,C))+(n>>>13)|0)+(vt>>>26)|0,vt&=67108863,h=Math.imul(p,F),n=(n=Math.imul(p,C))+Math.imul(M,F)|0,e=Math.imul(M,C);var gt=(a+(h=h+Math.imul(m,H)|0)|0)+((8191&(n=(n=n+Math.imul(m,J)|0)+Math.imul(f,H)|0))<<13)|0;a=((e=e+Math.imul(f,J)|0)+(n>>>13)|0)+(gt>>>26)|0,gt&=67108863,h=Math.imul(g,F),n=(n=Math.imul(g,C))+Math.imul(c,F)|0,e=Math.imul(c,C),h=h+Math.imul(p,H)|0,n=(n=n+Math.imul(p,J)|0)+Math.imul(M,H)|0,e=e+Math.imul(M,J)|0;var ct=(a+(h=h+Math.imul(m,G)|0)|0)+((8191&(n=(n=n+Math.imul(m,Q)|0)+Math.imul(f,G)|0))<<13)|0;a=((e=e+Math.imul(f,Q)|0)+(n>>>13)|0)+(ct>>>26)|0,ct&=67108863,h=Math.imul(y,F),n=(n=Math.imul(y,C))+Math.imul(b,F)|0,e=Math.imul(b,C),h=h+Math.imul(g,H)|0,n=(n=n+Math.imul(g,J)|0)+Math.imul(c,H)|0,e=e+Math.imul(c,J)|0,h=h+Math.imul(p,G)|0,n=(n=n+Math.imul(p,Q)|0)+Math.imul(M,G)|0,e=e+Math.imul(M,Q)|0;var wt=(a+(h=h+Math.imul(m,W)|0)|0)+((8191&(n=(n=n+Math.imul(m,X)|0)+Math.imul(f,W)|0))<<13)|0;a=((e=e+Math.imul(f,X)|0)+(n>>>13)|0)+(wt>>>26)|0,wt&=67108863,h=Math.imul(k,F),n=(n=Math.imul(k,C))+Math.imul(A,F)|0,e=Math.imul(A,C),h=h+Math.imul(y,H)|0,n=(n=n+Math.imul(y,J)|0)+Math.imul(b,H)|0,e=e+Math.imul(b,J)|0,h=h+Math.imul(g,G)|0,n=(n=n+Math.imul(g,Q)|0)+Math.imul(c,G)|0,e=e+Math.imul(c,Q)|0,h=h+Math.imul(p,W)|0,n=(n=n+Math.imul(p,X)|0)+Math.imul(M,W)|0,e=e+Math.imul(M,X)|0;var yt=(a+(h=h+Math.imul(m,$)|0)|0)+((8191&(n=(n=n+Math.imul(m,tt)|0)+Math.imul(f,$)|0))<<13)|0;a=((e=e+Math.imul(f,tt)|0)+(n>>>13)|0)+(yt>>>26)|0,yt&=67108863,h=Math.imul(S,F),n=(n=Math.imul(S,C))+Math.imul(Z,F)|0,e=Math.imul(Z,C),h=h+Math.imul(k,H)|0,n=(n=n+Math.imul(k,J)|0)+Math.imul(A,H)|0,e=e+Math.imul(A,J)|0,h=h+Math.imul(y,G)|0,n=(n=n+Math.imul(y,Q)|0)+Math.imul(b,G)|0,e=e+Math.imul(b,Q)|0,h=h+Math.imul(g,W)|0,n=(n=n+Math.imul(g,X)|0)+Math.imul(c,W)|0,e=e+Math.imul(c,X)|0,h=h+Math.imul(p,$)|0,n=(n=n+Math.imul(p,tt)|0)+Math.imul(M,$)|0,e=e+Math.imul(M,tt)|0;var bt=(a+(h=h+Math.imul(m,rt)|0)|0)+((8191&(n=(n=n+Math.imul(m,ht)|0)+Math.imul(f,rt)|0))<<13)|0;a=((e=e+Math.imul(f,ht)|0)+(n>>>13)|0)+(bt>>>26)|0,bt&=67108863,h=Math.imul(R,F),n=(n=Math.imul(R,C))+Math.imul(B,F)|0,e=Math.imul(B,C),h=h+Math.imul(S,H)|0,n=(n=n+Math.imul(S,J)|0)+Math.imul(Z,H)|0,e=e+Math.imul(Z,J)|0,h=h+Math.imul(k,G)|0,n=(n=n+Math.imul(k,Q)|0)+Math.imul(A,G)|0,e=e+Math.imul(A,Q)|0,h=h+Math.imul(y,W)|0,n=(n=n+Math.imul(y,X)|0)+Math.imul(b,W)|0,e=e+Math.imul(b,X)|0,h=h+Math.imul(g,$)|0,n=(n=n+Math.imul(g,tt)|0)+Math.imul(c,$)|0,e=e+Math.imul(c,tt)|0,h=h+Math.imul(p,rt)|0,n=(n=n+Math.imul(p,ht)|0)+Math.imul(M,rt)|0,e=e+Math.imul(M,ht)|0;var _t=(a+(h=h+Math.imul(m,et)|0)|0)+((8191&(n=(n=n+Math.imul(m,ot)|0)+Math.imul(f,et)|0))<<13)|0;a=((e=e+Math.imul(f,ot)|0)+(n>>>13)|0)+(_t>>>26)|0,_t&=67108863,h=Math.imul(L,F),n=(n=Math.imul(L,C))+Math.imul(I,F)|0,e=Math.imul(I,C),h=h+Math.imul(R,H)|0,n=(n=n+Math.imul(R,J)|0)+Math.imul(B,H)|0,e=e+Math.imul(B,J)|0,h=h+Math.imul(S,G)|0,n=(n=n+Math.imul(S,Q)|0)+Math.imul(Z,G)|0,e=e+Math.imul(Z,Q)|0,h=h+Math.imul(k,W)|0,n=(n=n+Math.imul(k,X)|0)+Math.imul(A,W)|0,e=e+Math.imul(A,X)|0,h=h+Math.imul(y,$)|0,n=(n=n+Math.imul(y,tt)|0)+Math.imul(b,$)|0,e=e+Math.imul(b,tt)|0,h=h+Math.imul(g,rt)|0,n=(n=n+Math.imul(g,ht)|0)+Math.imul(c,rt)|0,e=e+Math.imul(c,ht)|0,h=h+Math.imul(p,et)|0,n=(n=n+Math.imul(p,ot)|0)+Math.imul(M,et)|0,e=e+Math.imul(M,ot)|0;var kt=(a+(h=h+Math.imul(m,ut)|0)|0)+((8191&(n=(n=n+Math.imul(m,at)|0)+Math.imul(f,ut)|0))<<13)|0;a=((e=e+Math.imul(f,at)|0)+(n>>>13)|0)+(kt>>>26)|0,kt&=67108863,h=Math.imul(T,F),n=(n=Math.imul(T,C))+Math.imul(E,F)|0,e=Math.imul(E,C),h=h+Math.imul(L,H)|0,n=(n=n+Math.imul(L,J)|0)+Math.imul(I,H)|0,e=e+Math.imul(I,J)|0,h=h+Math.imul(R,G)|0,n=(n=n+Math.imul(R,Q)|0)+Math.imul(B,G)|0,e=e+Math.imul(B,Q)|0,h=h+Math.imul(S,W)|0,n=(n=n+Math.imul(S,X)|0)+Math.imul(Z,W)|0,e=e+Math.imul(Z,X)|0,h=h+Math.imul(k,$)|0,n=(n=n+Math.imul(k,tt)|0)+Math.imul(A,$)|0,e=e+Math.imul(A,tt)|0,h=h+Math.imul(y,rt)|0,n=(n=n+Math.imul(y,ht)|0)+Math.imul(b,rt)|0,e=e+Math.imul(b,ht)|0,h=h+Math.imul(g,et)|0,n=(n=n+Math.imul(g,ot)|0)+Math.imul(c,et)|0,e=e+Math.imul(c,ot)|0,h=h+Math.imul(p,ut)|0,n=(n=n+Math.imul(p,at)|0)+Math.imul(M,ut)|0,e=e+Math.imul(M,at)|0;var At=(a+(h=h+Math.imul(m,mt)|0)|0)+((8191&(n=(n=n+Math.imul(m,ft)|0)+Math.imul(f,mt)|0))<<13)|0;a=((e=e+Math.imul(f,ft)|0)+(n>>>13)|0)+(At>>>26)|0,At&=67108863,h=Math.imul(j,F),n=(n=Math.imul(j,C))+Math.imul(K,F)|0,e=Math.imul(K,C),h=h+Math.imul(T,H)|0,n=(n=n+Math.imul(T,J)|0)+Math.imul(E,H)|0,e=e+Math.imul(E,J)|0,h=h+Math.imul(L,G)|0,n=(n=n+Math.imul(L,Q)|0)+Math.imul(I,G)|0,e=e+Math.imul(I,Q)|0,h=h+Math.imul(R,W)|0,n=(n=n+Math.imul(R,X)|0)+Math.imul(B,W)|0,e=e+Math.imul(B,X)|0,h=h+Math.imul(S,$)|0,n=(n=n+Math.imul(S,tt)|0)+Math.imul(Z,$)|0,e=e+Math.imul(Z,tt)|0,h=h+Math.imul(k,rt)|0,n=(n=n+Math.imul(k,ht)|0)+Math.imul(A,rt)|0,e=e+Math.imul(A,ht)|0,h=h+Math.imul(y,et)|0,n=(n=n+Math.imul(y,ot)|0)+Math.imul(b,et)|0,e=e+Math.imul(b,ot)|0,h=h+Math.imul(g,ut)|0,n=(n=n+Math.imul(g,at)|0)+Math.imul(c,ut)|0,e=e+Math.imul(c,at)|0,h=h+Math.imul(p,mt)|0,n=(n=n+Math.imul(p,ft)|0)+Math.imul(M,mt)|0,e=e+Math.imul(M,ft)|0;var xt=(a+(h=h+Math.imul(m,pt)|0)|0)+((8191&(n=(n=n+Math.imul(m,Mt)|0)+Math.imul(f,pt)|0))<<13)|0;a=((e=e+Math.imul(f,Mt)|0)+(n>>>13)|0)+(xt>>>26)|0,xt&=67108863,h=Math.imul(j,H),n=(n=Math.imul(j,J))+Math.imul(K,H)|0,e=Math.imul(K,J),h=h+Math.imul(T,G)|0,n=(n=n+Math.imul(T,Q)|0)+Math.imul(E,G)|0,e=e+Math.imul(E,Q)|0,h=h+Math.imul(L,W)|0,n=(n=n+Math.imul(L,X)|0)+Math.imul(I,W)|0,e=e+Math.imul(I,X)|0,h=h+Math.imul(R,$)|0,n=(n=n+Math.imul(R,tt)|0)+Math.imul(B,$)|0,e=e+Math.imul(B,tt)|0,h=h+Math.imul(S,rt)|0,n=(n=n+Math.imul(S,ht)|0)+Math.imul(Z,rt)|0,e=e+Math.imul(Z,ht)|0,h=h+Math.imul(k,et)|0,n=(n=n+Math.imul(k,ot)|0)+Math.imul(A,et)|0,e=e+Math.imul(A,ot)|0,h=h+Math.imul(y,ut)|0,n=(n=n+Math.imul(y,at)|0)+Math.imul(b,ut)|0,e=e+Math.imul(b,at)|0,h=h+Math.imul(g,mt)|0,n=(n=n+Math.imul(g,ft)|0)+Math.imul(c,mt)|0,e=e+Math.imul(c,ft)|0;var St=(a+(h=h+Math.imul(p,pt)|0)|0)+((8191&(n=(n=n+Math.imul(p,Mt)|0)+Math.imul(M,pt)|0))<<13)|0;a=((e=e+Math.imul(M,Mt)|0)+(n>>>13)|0)+(St>>>26)|0,St&=67108863,h=Math.imul(j,G),n=(n=Math.imul(j,Q))+Math.imul(K,G)|0,e=Math.imul(K,Q),h=h+Math.imul(T,W)|0,n=(n=n+Math.imul(T,X)|0)+Math.imul(E,W)|0,e=e+Math.imul(E,X)|0,h=h+Math.imul(L,$)|0,n=(n=n+Math.imul(L,tt)|0)+Math.imul(I,$)|0,e=e+Math.imul(I,tt)|0,h=h+Math.imul(R,rt)|0,n=(n=n+Math.imul(R,ht)|0)+Math.imul(B,rt)|0,e=e+Math.imul(B,ht)|0,h=h+Math.imul(S,et)|0,n=(n=n+Math.imul(S,ot)|0)+Math.imul(Z,et)|0,e=e+Math.imul(Z,ot)|0,h=h+Math.imul(k,ut)|0,n=(n=n+Math.imul(k,at)|0)+Math.imul(A,ut)|0,e=e+Math.imul(A,at)|0,h=h+Math.imul(y,mt)|0,n=(n=n+Math.imul(y,ft)|0)+Math.imul(b,mt)|0,e=e+Math.imul(b,ft)|0;var Zt=(a+(h=h+Math.imul(g,pt)|0)|0)+((8191&(n=(n=n+Math.imul(g,Mt)|0)+Math.imul(c,pt)|0))<<13)|0;a=((e=e+Math.imul(c,Mt)|0)+(n>>>13)|0)+(Zt>>>26)|0,Zt&=67108863,h=Math.imul(j,W),n=(n=Math.imul(j,X))+Math.imul(K,W)|0,e=Math.imul(K,X),h=h+Math.imul(T,$)|0,n=(n=n+Math.imul(T,tt)|0)+Math.imul(E,$)|0,e=e+Math.imul(E,tt)|0,h=h+Math.imul(L,rt)|0,n=(n=n+Math.imul(L,ht)|0)+Math.imul(I,rt)|0,e=e+Math.imul(I,ht)|0,h=h+Math.imul(R,et)|0,n=(n=n+Math.imul(R,ot)|0)+Math.imul(B,et)|0,e=e+Math.imul(B,ot)|0,h=h+Math.imul(S,ut)|0,n=(n=n+Math.imul(S,at)|0)+Math.imul(Z,ut)|0,e=e+Math.imul(Z,at)|0,h=h+Math.imul(k,mt)|0,n=(n=n+Math.imul(k,ft)|0)+Math.imul(A,mt)|0,e=e+Math.imul(A,ft)|0;var qt=(a+(h=h+Math.imul(y,pt)|0)|0)+((8191&(n=(n=n+Math.imul(y,Mt)|0)+Math.imul(b,pt)|0))<<13)|0;a=((e=e+Math.imul(b,Mt)|0)+(n>>>13)|0)+(qt>>>26)|0,qt&=67108863,h=Math.imul(j,$),n=(n=Math.imul(j,tt))+Math.imul(K,$)|0,e=Math.imul(K,tt),h=h+Math.imul(T,rt)|0,n=(n=n+Math.imul(T,ht)|0)+Math.imul(E,rt)|0,e=e+Math.imul(E,ht)|0,h=h+Math.imul(L,et)|0,n=(n=n+Math.imul(L,ot)|0)+Math.imul(I,et)|0,e=e+Math.imul(I,ot)|0,h=h+Math.imul(R,ut)|0,n=(n=n+Math.imul(R,at)|0)+Math.imul(B,ut)|0,e=e+Math.imul(B,at)|0,h=h+Math.imul(S,mt)|0,n=(n=n+Math.imul(S,ft)|0)+Math.imul(Z,mt)|0,e=e+Math.imul(Z,ft)|0;var Rt=(a+(h=h+Math.imul(k,pt)|0)|0)+((8191&(n=(n=n+Math.imul(k,Mt)|0)+Math.imul(A,pt)|0))<<13)|0;a=((e=e+Math.imul(A,Mt)|0)+(n>>>13)|0)+(Rt>>>26)|0,Rt&=67108863,h=Math.imul(j,rt),n=(n=Math.imul(j,ht))+Math.imul(K,rt)|0,e=Math.imul(K,ht),h=h+Math.imul(T,et)|0,n=(n=n+Math.imul(T,ot)|0)+Math.imul(E,et)|0,e=e+Math.imul(E,ot)|0,h=h+Math.imul(L,ut)|0,n=(n=n+Math.imul(L,at)|0)+Math.imul(I,ut)|0,e=e+Math.imul(I,at)|0,h=h+Math.imul(R,mt)|0,n=(n=n+Math.imul(R,ft)|0)+Math.imul(B,mt)|0,e=e+Math.imul(B,ft)|0;var Bt=(a+(h=h+Math.imul(S,pt)|0)|0)+((8191&(n=(n=n+Math.imul(S,Mt)|0)+Math.imul(Z,pt)|0))<<13)|0;a=((e=e+Math.imul(Z,Mt)|0)+(n>>>13)|0)+(Bt>>>26)|0,Bt&=67108863,h=Math.imul(j,et),n=(n=Math.imul(j,ot))+Math.imul(K,et)|0,e=Math.imul(K,ot),h=h+Math.imul(T,ut)|0,n=(n=n+Math.imul(T,at)|0)+Math.imul(E,ut)|0,e=e+Math.imul(E,at)|0,h=h+Math.imul(L,mt)|0,n=(n=n+Math.imul(L,ft)|0)+Math.imul(I,mt)|0,e=e+Math.imul(I,ft)|0;var Nt=(a+(h=h+Math.imul(R,pt)|0)|0)+((8191&(n=(n=n+Math.imul(R,Mt)|0)+Math.imul(B,pt)|0))<<13)|0;a=((e=e+Math.imul(B,Mt)|0)+(n>>>13)|0)+(Nt>>>26)|0,Nt&=67108863,h=Math.imul(j,ut),n=(n=Math.imul(j,at))+Math.imul(K,ut)|0,e=Math.imul(K,at),h=h+Math.imul(T,mt)|0,n=(n=n+Math.imul(T,ft)|0)+Math.imul(E,mt)|0,e=e+Math.imul(E,ft)|0;var Lt=(a+(h=h+Math.imul(L,pt)|0)|0)+((8191&(n=(n=n+Math.imul(L,Mt)|0)+Math.imul(I,pt)|0))<<13)|0;a=((e=e+Math.imul(I,Mt)|0)+(n>>>13)|0)+(Lt>>>26)|0,Lt&=67108863,h=Math.imul(j,mt),n=(n=Math.imul(j,ft))+Math.imul(K,mt)|0,e=Math.imul(K,ft);var It=(a+(h=h+Math.imul(T,pt)|0)|0)+((8191&(n=(n=n+Math.imul(T,Mt)|0)+Math.imul(E,pt)|0))<<13)|0;a=((e=e+Math.imul(E,Mt)|0)+(n>>>13)|0)+(It>>>26)|0,It&=67108863;var zt=(a+(h=Math.imul(j,pt))|0)+((8191&(n=(n=Math.imul(j,Mt))+Math.imul(K,pt)|0))<<13)|0;return a=((e=Math.imul(K,Mt))+(n>>>13)|0)+(zt>>>26)|0,zt&=67108863,u[0]=vt,u[1]=gt,u[2]=ct,u[3]=wt,u[4]=yt,u[5]=bt,u[6]=_t,u[7]=kt,u[8]=At,u[9]=xt,u[10]=St,u[11]=Zt,u[12]=qt,u[13]=Rt,u[14]=Bt,u[15]=Nt,u[16]=Lt,u[17]=It,u[18]=zt,0!==a&&(u[19]=a,r.length++),r};Math.imul||(k=u),n.prototype.mulTo=function(t,i){var r=this.length+t.length;return 10===this.length&&10===t.length?k(this,t,i):r<63?u(this,t,i):r<1024?a(this,t,i):l(this,t,i)},m.prototype.makeRBT=function(t){for(var i=new Array(t),r=n.prototype._countBits(t)-1,h=0;h>=1;return h},m.prototype.permute=function(t,i,r,h,n,e){for(var o=0;o>>=1)n++;return 1<>>=13,h[2*o+1]=8191&e,e>>>=13;for(o=2*i;o>=26,i+=n/67108864|0,i+=e>>>26,this.words[h]=67108863&e}return 0!==i&&(this.words[h]=i,this.length++),this},n.prototype.muln=function(t){return this.clone().imuln(t)},n.prototype.sqr=function(){return this.mul(this)},n.prototype.isqr=function(){return this.imul(this.clone())},n.prototype.pow=function(t){var i=s(t);if(0===i.length)return new n(1);for(var r=this,h=0;h=0);var i,h=t%26,n=(t-h)/26,e=67108863>>>26-h<<26-h;if(0!==h){var o=0;for(i=0;i>>26-h}o&&(this.words[i]=o,this.length++)}if(0!==n){for(i=this.length-1;i>=0;i--)this.words[i+n]=this.words[i];for(i=0;i=0);var n;n=i?(i-i%26)/26:0;var e=t%26,o=Math.min((t-e)/26,this.length),s=67108863^67108863>>>e<o)for(this.length-=o,a=0;a=0&&(0!==l||a>=n);a--){var m=0|this.words[a];this.words[a]=l<<26-e|m>>>e,l=m&s}return u&&0!==l&&(u.words[u.length++]=l),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},n.prototype.ishrn=function(t,i,h){return r(0===this.negative),this.iushrn(t,i,h)},n.prototype.shln=function(t){return this.clone().ishln(t)},n.prototype.ushln=function(t){return this.clone().iushln(t)},n.prototype.shrn=function(t){return this.clone().ishrn(t)},n.prototype.ushrn=function(t){return this.clone().iushrn(t)},n.prototype.testn=function(t){r("number"==typeof t&&t>=0);var i=t%26,h=(t-i)/26,n=1<=0);var i=t%26,h=(t-i)/26;if(r(0===this.negative,"imaskn works only with positive numbers"),this.length<=h)return this;if(0!==i&&h++,this.length=Math.min(h,this.length),0!==i){var n=67108863^67108863>>>i<=67108864;i++)this.words[i]-=67108864,i===this.length-1?this.words[i+1]=1:this.words[i+1]++;return this.length=Math.max(this.length,i+1),this},n.prototype.isubn=function(t){if(r("number"==typeof t),r(t<67108864),t<0)return this.iaddn(-t);if(0!==this.negative)return this.negative=0,this.iaddn(t),this.negative=1,this;if(this.words[0]-=t,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var i=0;i>26)-(u/67108864|0),this.words[n+h]=67108863&o}for(;n>26,this.words[n+h]=67108863&o;if(0===s)return this.strip();for(r(-1===s),s=0,n=0;n>26,this.words[n]=67108863&o;return this.negative=1,this.strip()},n.prototype._wordDiv=function(t,i){var r=this.length-t.length,h=this.clone(),e=t,o=0|e.words[e.length-1];0!==(r=26-this._countBits(o))&&(e=e.ushln(r),h.iushln(r),o=0|e.words[e.length-1]);var s,u=h.length-e.length;if("mod"!==i){(s=new n(null)).length=u+1,s.words=new Array(s.length);for(var a=0;a=0;m--){var f=67108864*(0|h.words[e.length+m])+(0|h.words[e.length+m-1]);for(f=Math.min(f/o|0,67108863),h._ishlnsubmul(e,f,m);0!==h.negative;)f--,h.negative=0,h._ishlnsubmul(e,1,m),h.isZero()||(h.negative^=1);s&&(s.words[m]=f)}return s&&s.strip(),h.strip(),"div"!==i&&0!==r&&h.iushrn(r),{div:s||null,mod:h}},n.prototype.divmod=function(t,i,h){if(r(!t.isZero()),this.isZero())return{div:new n(0),mod:new n(0)};var e,o,s;return 0!==this.negative&&0===t.negative?(s=this.neg().divmod(t,i),"mod"!==i&&(e=s.div.neg()),"div"!==i&&(o=s.mod.neg(),h&&0!==o.negative&&o.iadd(t)),{div:e,mod:o}):0===this.negative&&0!==t.negative?(s=this.divmod(t.neg(),i),"mod"!==i&&(e=s.div.neg()),{div:e,mod:s.mod}):0!=(this.negative&t.negative)?(s=this.neg().divmod(t.neg(),i),"div"!==i&&(o=s.mod.neg(),h&&0!==o.negative&&o.isub(t)),{div:s.div,mod:o}):t.length>this.length||this.cmp(t)<0?{div:new n(0),mod:this}:1===t.length?"div"===i?{div:this.divn(t.words[0]),mod:null}:"mod"===i?{div:null,mod:new n(this.modn(t.words[0]))}:{div:this.divn(t.words[0]),mod:new n(this.modn(t.words[0]))}:this._wordDiv(t,i)},n.prototype.div=function(t){return this.divmod(t,"div",!1).div},n.prototype.mod=function(t){return this.divmod(t,"mod",!1).mod},n.prototype.umod=function(t){return this.divmod(t,"mod",!0).mod},n.prototype.divRound=function(t){var i=this.divmod(t);if(i.mod.isZero())return i.div;var r=0!==i.div.negative?i.mod.isub(t):i.mod,h=t.ushrn(1),n=t.andln(1),e=r.cmp(h);return e<0||1===n&&0===e?i.div:0!==i.div.negative?i.div.isubn(1):i.div.iaddn(1)},n.prototype.modn=function(t){r(t<=67108863);for(var i=(1<<26)%t,h=0,n=this.length-1;n>=0;n--)h=(i*h+(0|this.words[n]))%t;return h},n.prototype.idivn=function(t){r(t<=67108863);for(var i=0,h=this.length-1;h>=0;h--){var n=(0|this.words[h])+67108864*i;this.words[h]=n/t|0,i=n%t}return this.strip()},n.prototype.divn=function(t){return this.clone().idivn(t)},n.prototype.egcd=function(t){r(0===t.negative),r(!t.isZero());var i=this,h=t.clone();i=0!==i.negative?i.umod(t):i.clone();for(var e=new n(1),o=new n(0),s=new n(0),u=new n(1),a=0;i.isEven()&&h.isEven();)i.iushrn(1),h.iushrn(1),++a;for(var l=h.clone(),m=i.clone();!i.isZero();){for(var f=0,d=1;0==(i.words[0]&d)&&f<26;++f,d<<=1);if(f>0)for(i.iushrn(f);f-- >0;)(e.isOdd()||o.isOdd())&&(e.iadd(l),o.isub(m)),e.iushrn(1),o.iushrn(1);for(var p=0,M=1;0==(h.words[0]&M)&&p<26;++p,M<<=1);if(p>0)for(h.iushrn(p);p-- >0;)(s.isOdd()||u.isOdd())&&(s.iadd(l),u.isub(m)),s.iushrn(1),u.iushrn(1);i.cmp(h)>=0?(i.isub(h),e.isub(s),o.isub(u)):(h.isub(i),s.isub(e),u.isub(o))}return{a:s,b:u,gcd:h.iushln(a)}},n.prototype._invmp=function(t){r(0===t.negative),r(!t.isZero());var i=this,h=t.clone();i=0!==i.negative?i.umod(t):i.clone();for(var e=new n(1),o=new n(0),s=h.clone();i.cmpn(1)>0&&h.cmpn(1)>0;){for(var u=0,a=1;0==(i.words[0]&a)&&u<26;++u,a<<=1);if(u>0)for(i.iushrn(u);u-- >0;)e.isOdd()&&e.iadd(s),e.iushrn(1);for(var l=0,m=1;0==(h.words[0]&m)&&l<26;++l,m<<=1);if(l>0)for(h.iushrn(l);l-- >0;)o.isOdd()&&o.iadd(s),o.iushrn(1);i.cmp(h)>=0?(i.isub(h),e.isub(o)):(h.isub(i),o.isub(e))}var f;return(f=0===i.cmpn(1)?e:o).cmpn(0)<0&&f.iadd(t),f},n.prototype.gcd=function(t){if(this.isZero())return t.abs();if(t.isZero())return this.abs();var i=this.clone(),r=t.clone();i.negative=0,r.negative=0;for(var h=0;i.isEven()&&r.isEven();h++)i.iushrn(1),r.iushrn(1);for(;;){for(;i.isEven();)i.iushrn(1);for(;r.isEven();)r.iushrn(1);var n=i.cmp(r);if(n<0){var e=i;i=r,r=e}else if(0===n||0===r.cmpn(1))break;i.isub(r)}return r.iushln(h)},n.prototype.invm=function(t){return this.egcd(t).a.umod(t)},n.prototype.isEven=function(){return 0==(1&this.words[0])},n.prototype.isOdd=function(){return 1==(1&this.words[0])},n.prototype.andln=function(t){return this.words[0]&t},n.prototype.bincn=function(t){r("number"==typeof t);var i=t%26,h=(t-i)/26,n=1<>>26,s&=67108863,this.words[o]=s}return 0!==e&&(this.words[o]=e,this.length++),this},n.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},n.prototype.cmpn=function(t){var i=t<0;if(0!==this.negative&&!i)return-1;if(0===this.negative&&i)return 1;this.strip();var h;if(this.length>1)h=1;else{i&&(t=-t),r(t<=67108863,"Number is too big");var n=0|this.words[0];h=n===t?0:nt.length)return 1;if(this.length=0;r--){var h=0|this.words[r],n=0|t.words[r];if(h!==n){hn&&(i=1);break}}return i},n.prototype.gtn=function(t){return 1===this.cmpn(t)},n.prototype.gt=function(t){return 1===this.cmp(t)},n.prototype.gten=function(t){return this.cmpn(t)>=0},n.prototype.gte=function(t){return this.cmp(t)>=0},n.prototype.ltn=function(t){return-1===this.cmpn(t)},n.prototype.lt=function(t){return-1===this.cmp(t)},n.prototype.lten=function(t){return this.cmpn(t)<=0},n.prototype.lte=function(t){return this.cmp(t)<=0},n.prototype.eqn=function(t){return 0===this.cmpn(t)},n.prototype.eq=function(t){return 0===this.cmp(t)},n.red=function(t){return new g(t)},n.prototype.toRed=function(t){return r(!this.red,"Already a number in reduction context"),r(0===this.negative,"red works only with positives"),t.convertTo(this)._forceRed(t)},n.prototype.fromRed=function(){return r(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},n.prototype._forceRed=function(t){return this.red=t,this},n.prototype.forceRed=function(t){return r(!this.red,"Already a number in reduction context"),this._forceRed(t)},n.prototype.redAdd=function(t){return r(this.red,"redAdd works only with red numbers"),this.red.add(this,t)},n.prototype.redIAdd=function(t){return r(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,t)},n.prototype.redSub=function(t){return r(this.red,"redSub works only with red numbers"),this.red.sub(this,t)},n.prototype.redISub=function(t){return r(this.red,"redISub works only with red numbers"),this.red.isub(this,t)},n.prototype.redShl=function(t){return r(this.red,"redShl works only with red numbers"),this.red.shl(this,t)},n.prototype.redMul=function(t){return r(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.mul(this,t)},n.prototype.redIMul=function(t){return r(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.imul(this,t)},n.prototype.redSqr=function(){return r(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},n.prototype.redISqr=function(){return r(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},n.prototype.redSqrt=function(){return r(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},n.prototype.redInvm=function(){return r(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},n.prototype.redNeg=function(){return r(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},n.prototype.redPow=function(t){return r(this.red&&!t.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,t)};var A={k256:null,p224:null,p192:null,p25519:null};f.prototype._tmp=function(){var t=new n(null);return t.words=new Array(Math.ceil(this.n/13)),t},f.prototype.ireduce=function(t){var i,r=t;do{this.split(r,this.tmp),i=(r=(r=this.imulK(r)).iadd(this.tmp)).bitLength()}while(i>this.n);var h=i0?r.isub(this.p):r.strip(),r},f.prototype.split=function(t,i){t.iushrn(this.n,0,i)},f.prototype.imulK=function(t){return t.imul(this.k)},h(d,f),d.prototype.split=function(t,i){for(var r=Math.min(t.length,9),h=0;h>>22,n=e}n>>>=22,t.words[h-10]=n,0===n&&t.length>10?t.length-=10:t.length-=9},d.prototype.imulK=function(t){t.words[t.length]=0,t.words[t.length+1]=0,t.length+=2;for(var i=0,r=0;r>>=26,t.words[r]=n,i=h}return 0!==i&&(t.words[t.length++]=i),t},n._prime=function(t){if(A[t])return A[t];var i;if("k256"===t)i=new d;else if("p224"===t)i=new p;else if("p192"===t)i=new M;else{if("p25519"!==t)throw new Error("Unknown prime "+t);i=new v}return A[t]=i,i},g.prototype._verify1=function(t){r(0===t.negative,"red works only with positives"),r(t.red,"red works only with red numbers")},g.prototype._verify2=function(t,i){r(0==(t.negative|i.negative),"red works only with positives"),r(t.red&&t.red===i.red,"red works only with red numbers")},g.prototype.imod=function(t){return this.prime?this.prime.ireduce(t)._forceRed(this):t.umod(this.m)._forceRed(this)},g.prototype.neg=function(t){return t.isZero()?t.clone():this.m.sub(t)._forceRed(this)},g.prototype.add=function(t,i){this._verify2(t,i);var r=t.add(i);return r.cmp(this.m)>=0&&r.isub(this.m),r._forceRed(this)},g.prototype.iadd=function(t,i){this._verify2(t,i);var r=t.iadd(i);return r.cmp(this.m)>=0&&r.isub(this.m),r},g.prototype.sub=function(t,i){this._verify2(t,i);var r=t.sub(i);return r.cmpn(0)<0&&r.iadd(this.m),r._forceRed(this)},g.prototype.isub=function(t,i){this._verify2(t,i);var r=t.isub(i);return r.cmpn(0)<0&&r.iadd(this.m),r},g.prototype.shl=function(t,i){return this._verify1(t),this.imod(t.ushln(i))},g.prototype.imul=function(t,i){return this._verify2(t,i),this.imod(t.imul(i))},g.prototype.mul=function(t,i){return this._verify2(t,i),this.imod(t.mul(i))},g.prototype.isqr=function(t){return this.imul(t,t.clone())},g.prototype.sqr=function(t){return this.mul(t,t)},g.prototype.sqrt=function(t){if(t.isZero())return t.clone();var i=this.m.andln(3);if(r(i%2==1),3===i){var h=this.m.add(new n(1)).iushrn(2);return this.pow(t,h)}for(var e=this.m.subn(1),o=0;!e.isZero()&&0===e.andln(1);)o++,e.iushrn(1);r(!e.isZero());var s=new n(1).toRed(this),u=s.redNeg(),a=this.m.subn(1).iushrn(1),l=this.m.bitLength();for(l=new n(2*l*l).toRed(this);0!==this.pow(l,a).cmp(u);)l.redIAdd(u);for(var m=this.pow(l,e),f=this.pow(t,e.addn(1).iushrn(1)),d=this.pow(t,e),p=o;0!==d.cmp(s);){for(var M=d,v=0;0!==M.cmp(s);v++)M=M.redSqr();r(v=0;h--){for(var a=i.words[h],l=u-1;l>=0;l--){var m=a>>l&1;e!==r[0]&&(e=this.sqr(e)),0!==m||0!==o?(o<<=1,o|=m,(4===++s||0===h&&0===l)&&(e=this.mul(e,r[o]),s=0,o=0)):s=0}u=26}return e},g.prototype.convertTo=function(t){var i=t.umod(this.m);return i===t?i.clone():i},g.prototype.convertFrom=function(t){var i=t.clone();return i.red=null,i},n.mont=function(t){return new c(t)},h(c,g),c.prototype.convertTo=function(t){return this.imod(t.ushln(this.shift))},c.prototype.convertFrom=function(t){var i=this.imod(t.mul(this.rinv));return i.red=null,i},c.prototype.imul=function(t,i){if(t.isZero()||i.isZero())return t.words[0]=0,t.length=1,t;var r=t.imul(i),h=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),n=r.isub(h).iushrn(this.shift),e=n;return n.cmp(this.m)>=0?e=n.isub(this.m):n.cmpn(0)<0&&(e=n.iadd(this.m)),e._forceRed(this)},c.prototype.mul=function(t,i){if(t.isZero()||i.isZero())return new n(0)._forceRed(this);var r=t.mul(i),h=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),e=r.isub(h).iushrn(this.shift),o=e;return e.cmp(this.m)>=0?o=e.isub(this.m):e.cmpn(0)<0&&(o=e.iadd(this.m)),o._forceRed(this)},c.prototype.invm=function(t){return this.imod(t._invmp(this.m).mul(this.r2))._forceRed(this)}}("undefined"==typeof module||module,this); + +},{"buffer":6}],5:[function(require,module,exports){ +function Rand(t){this.rand=t}var r;if(module.exports=function(t){return r||(r=new Rand(null)),r.generate(t)},module.exports.Rand=Rand,Rand.prototype.generate=function(t){return this._rand(t)},Rand.prototype._rand=function(t){if(this.rand.getBytes)return this.rand.getBytes(t);for(var r=new Uint8Array(t),e=0;eK_MAX_LENGTH)throw new RangeError("Invalid typed array length");var t=new Uint8Array(e);return t.__proto__=Buffer.prototype,t}function Buffer(e,t,r){if("number"==typeof e){if("string"==typeof t)throw new Error("If encoding is specified then the first argument must be a string");return allocUnsafe(e)}return from(e,t,r)}function from(e,t,r){if("number"==typeof e)throw new TypeError('"value" argument must not be a number');return isArrayBuffer(e)?fromArrayBuffer(e,t,r):"string"==typeof e?fromString(e,t):fromObject(e)}function assertSize(e){if("number"!=typeof e)throw new TypeError('"size" argument must be a number');if(e<0)throw new RangeError('"size" argument must not be negative')}function alloc(e,t,r){return assertSize(e),e<=0?createBuffer(e):void 0!==t?"string"==typeof r?createBuffer(e).fill(t,r):createBuffer(e).fill(t):createBuffer(e)}function allocUnsafe(e){return assertSize(e),createBuffer(e<0?0:0|checked(e))}function fromString(e,t){if("string"==typeof t&&""!==t||(t="utf8"),!Buffer.isEncoding(t))throw new TypeError('"encoding" must be a valid string encoding');var r=0|byteLength(e,t),n=createBuffer(r),f=n.write(e,t);return f!==r&&(n=n.slice(0,f)),n}function fromArrayLike(e){for(var t=e.length<0?0:0|checked(e.length),r=createBuffer(t),n=0;n=K_MAX_LENGTH)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+K_MAX_LENGTH.toString(16)+" bytes");return 0|e}function SlowBuffer(e){return+e!=e&&(e=0),Buffer.alloc(+e)}function byteLength(e,t){if(Buffer.isBuffer(e))return e.length;if(isArrayBufferView(e)||isArrayBuffer(e))return e.byteLength;"string"!=typeof e&&(e=""+e);var r=e.length;if(0===r)return 0;for(var n=!1;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return utf8ToBytes(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return base64ToBytes(e).length;default:if(n)return utf8ToBytes(e).length;t=(""+t).toLowerCase(),n=!0}}function slowToString(e,t,r){var n=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if(r>>>=0,t>>>=0,r<=t)return"";for(e||(e="utf8");;)switch(e){case"hex":return hexSlice(this,t,r);case"utf8":case"utf-8":return utf8Slice(this,t,r);case"ascii":return asciiSlice(this,t,r);case"latin1":case"binary":return latin1Slice(this,t,r);case"base64":return base64Slice(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,t,r);default:if(n)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),n=!0}}function swap(e,t,r){var n=e[t];e[t]=e[r],e[r]=n}function bidirectionalIndexOf(e,t,r,n,f){if(0===e.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,numberIsNaN(r)&&(r=f?0:e.length-1),r<0&&(r=e.length+r),r>=e.length){if(f)return-1;r=e.length-1}else if(r<0){if(!f)return-1;r=0}if("string"==typeof t&&(t=Buffer.from(t,n)),Buffer.isBuffer(t))return 0===t.length?-1:arrayIndexOf(e,t,r,n,f);if("number"==typeof t)return t&=255,"function"==typeof Uint8Array.prototype.indexOf?f?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):arrayIndexOf(e,[t],r,n,f);throw new TypeError("val must be string, number or Buffer")}function arrayIndexOf(e,t,r,n,f){function i(e,t){return 1===o?e[t]:e.readUInt16BE(t*o)}var o=1,u=e.length,s=t.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(e.length<2||t.length<2)return-1;o=2,u/=2,s/=2,r/=2}var a;if(f){var h=-1;for(a=r;au&&(r=u-s),a=r;a>=0;a--){for(var c=!0,l=0;lf&&(n=f):n=f;var i=t.length;if(i%2!=0)throw new TypeError("Invalid hex string");n>i/2&&(n=i/2);for(var o=0;o239?4:i>223?3:i>191?2:1;if(f+u<=r){var s,a,h,c;switch(u){case 1:i<128&&(o=i);break;case 2:128==(192&(s=e[f+1]))&&(c=(31&i)<<6|63&s)>127&&(o=c);break;case 3:s=e[f+1],a=e[f+2],128==(192&s)&&128==(192&a)&&(c=(15&i)<<12|(63&s)<<6|63&a)>2047&&(c<55296||c>57343)&&(o=c);break;case 4:s=e[f+1],a=e[f+2],h=e[f+3],128==(192&s)&&128==(192&a)&&128==(192&h)&&(c=(15&i)<<18|(63&s)<<12|(63&a)<<6|63&h)>65535&&c<1114112&&(o=c)}}null===o?(o=65533,u=1):o>65535&&(o-=65536,n.push(o>>>10&1023|55296),o=56320|1023&o),n.push(o),f+=u}return decodeCodePointsArray(n)}function decodeCodePointsArray(e){var t=e.length;if(t<=MAX_ARGUMENTS_LENGTH)return String.fromCharCode.apply(String,e);for(var r="",n=0;nn)&&(r=n);for(var f="",i=t;ir)throw new RangeError("Trying to access beyond buffer length")}function checkInt(e,t,r,n,f,i){if(!Buffer.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>f||te.length)throw new RangeError("Index out of range")}function checkIEEE754(e,t,r,n,f,i){if(r+n>e.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function writeFloat(e,t,r,n,f){return t=+t,r>>>=0,f||checkIEEE754(e,t,r,4,3.4028234663852886e38,-3.4028234663852886e38),ieee754.write(e,t,r,n,23,4),r+4}function writeDouble(e,t,r,n,f){return t=+t,r>>>=0,f||checkIEEE754(e,t,r,8,1.7976931348623157e308,-1.7976931348623157e308),ieee754.write(e,t,r,n,52,8),r+8}function base64clean(e){if((e=e.trim().replace(INVALID_BASE64_RE,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}function toHex(e){return e<16?"0"+e.toString(16):e.toString(16)}function utf8ToBytes(e,t){t=t||1/0;for(var r,n=e.length,f=null,i=[],o=0;o55295&&r<57344){if(!f){if(r>56319){(t-=3)>-1&&i.push(239,191,189);continue}if(o+1===n){(t-=3)>-1&&i.push(239,191,189);continue}f=r;continue}if(r<56320){(t-=3)>-1&&i.push(239,191,189),f=r;continue}r=65536+(f-55296<<10|r-56320)}else f&&(t-=3)>-1&&i.push(239,191,189);if(f=null,r<128){if((t-=1)<0)break;i.push(r)}else if(r<2048){if((t-=2)<0)break;i.push(r>>6|192,63&r|128)}else if(r<65536){if((t-=3)<0)break;i.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;i.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return i}function asciiToBytes(e){for(var t=[],r=0;r>8,f=r%256,i.push(f),i.push(n);return i}function base64ToBytes(e){return base64.toByteArray(base64clean(e))}function blitBuffer(e,t,r,n){for(var f=0;f=t.length||f>=e.length);++f)t[f+r]=e[f];return f}function isArrayBuffer(e){return e instanceof ArrayBuffer||null!=e&&null!=e.constructor&&"ArrayBuffer"===e.constructor.name&&"number"==typeof e.byteLength}function isArrayBufferView(e){return"function"==typeof ArrayBuffer.isView&&ArrayBuffer.isView(e)}function numberIsNaN(e){return e!==e}var base64=require("base64-js"),ieee754=require("ieee754");exports.Buffer=Buffer,exports.SlowBuffer=SlowBuffer,exports.INSPECT_MAX_BYTES=50;var K_MAX_LENGTH=2147483647;exports.kMaxLength=K_MAX_LENGTH,Buffer.TYPED_ARRAY_SUPPORT=typedArraySupport(),Buffer.TYPED_ARRAY_SUPPORT||"undefined"==typeof console||"function"!=typeof console.error||console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support."),"undefined"!=typeof Symbol&&Symbol.species&&Buffer[Symbol.species]===Buffer&&Object.defineProperty(Buffer,Symbol.species,{value:null,configurable:!0,enumerable:!1,writable:!1}),Buffer.poolSize=8192,Buffer.from=function(e,t,r){return from(e,t,r)},Buffer.prototype.__proto__=Uint8Array.prototype,Buffer.__proto__=Uint8Array,Buffer.alloc=function(e,t,r){return alloc(e,t,r)},Buffer.allocUnsafe=function(e){return allocUnsafe(e)},Buffer.allocUnsafeSlow=function(e){return allocUnsafe(e)},Buffer.isBuffer=function(e){return null!=e&&!0===e._isBuffer},Buffer.compare=function(e,t){if(!Buffer.isBuffer(e)||!Buffer.isBuffer(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var r=e.length,n=t.length,f=0,i=Math.min(r,n);f0&&(e=this.toString("hex",0,t).match(/.{2}/g).join(" "),this.length>t&&(e+=" ... ")),""},Buffer.prototype.compare=function(e,t,r,n,f){if(!Buffer.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===n&&(n=0),void 0===f&&(f=this.length),t<0||r>e.length||n<0||f>this.length)throw new RangeError("out of range index");if(n>=f&&t>=r)return 0;if(n>=f)return-1;if(t>=r)return 1;if(t>>>=0,r>>>=0,n>>>=0,f>>>=0,this===e)return 0;for(var i=f-n,o=r-t,u=Math.min(i,o),s=this.slice(n,f),a=e.slice(t,r),h=0;h>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n="utf8")):(n=r,r=void 0)}var f=this.length-t;if((void 0===r||r>f)&&(r=f),e.length>0&&(r<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var i=!1;;)switch(n){case"hex":return hexWrite(this,e,t,r);case"utf8":case"utf-8":return utf8Write(this,e,t,r);case"ascii":return asciiWrite(this,e,t,r);case"latin1":case"binary":return latin1Write(this,e,t,r);case"base64":return base64Write(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ucs2Write(this,e,t,r);default:if(i)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),i=!0}},Buffer.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var MAX_ARGUMENTS_LENGTH=4096;Buffer.prototype.slice=function(e,t){var r=this.length;e=~~e,t=void 0===t?r:~~t,e<0?(e+=r)<0&&(e=0):e>r&&(e=r),t<0?(t+=r)<0&&(t=0):t>r&&(t=r),t>>=0,t>>>=0,r||checkOffset(e,t,this.length);for(var n=this[e],f=1,i=0;++i>>=0,t>>>=0,r||checkOffset(e,t,this.length);for(var n=this[e+--t],f=1;t>0&&(f*=256);)n+=this[e+--t]*f;return n},Buffer.prototype.readUInt8=function(e,t){return e>>>=0,t||checkOffset(e,1,this.length),this[e]},Buffer.prototype.readUInt16LE=function(e,t){return e>>>=0,t||checkOffset(e,2,this.length),this[e]|this[e+1]<<8},Buffer.prototype.readUInt16BE=function(e,t){return e>>>=0,t||checkOffset(e,2,this.length),this[e]<<8|this[e+1]},Buffer.prototype.readUInt32LE=function(e,t){return e>>>=0,t||checkOffset(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},Buffer.prototype.readUInt32BE=function(e,t){return e>>>=0,t||checkOffset(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},Buffer.prototype.readIntLE=function(e,t,r){e>>>=0,t>>>=0,r||checkOffset(e,t,this.length);for(var n=this[e],f=1,i=0;++i=f&&(n-=Math.pow(2,8*t)),n},Buffer.prototype.readIntBE=function(e,t,r){e>>>=0,t>>>=0,r||checkOffset(e,t,this.length);for(var n=t,f=1,i=this[e+--n];n>0&&(f*=256);)i+=this[e+--n]*f;return f*=128,i>=f&&(i-=Math.pow(2,8*t)),i},Buffer.prototype.readInt8=function(e,t){return e>>>=0,t||checkOffset(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},Buffer.prototype.readInt16LE=function(e,t){e>>>=0,t||checkOffset(e,2,this.length);var r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},Buffer.prototype.readInt16BE=function(e,t){e>>>=0,t||checkOffset(e,2,this.length);var r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},Buffer.prototype.readInt32LE=function(e,t){return e>>>=0,t||checkOffset(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},Buffer.prototype.readInt32BE=function(e,t){return e>>>=0,t||checkOffset(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},Buffer.prototype.readFloatLE=function(e,t){return e>>>=0,t||checkOffset(e,4,this.length),ieee754.read(this,e,!0,23,4)},Buffer.prototype.readFloatBE=function(e,t){return e>>>=0,t||checkOffset(e,4,this.length),ieee754.read(this,e,!1,23,4)},Buffer.prototype.readDoubleLE=function(e,t){return e>>>=0,t||checkOffset(e,8,this.length),ieee754.read(this,e,!0,52,8)},Buffer.prototype.readDoubleBE=function(e,t){return e>>>=0,t||checkOffset(e,8,this.length),ieee754.read(this,e,!1,52,8)},Buffer.prototype.writeUIntLE=function(e,t,r,n){e=+e,t>>>=0,r>>>=0,n||checkInt(this,e,t,r,Math.pow(2,8*r)-1,0);var f=1,i=0;for(this[t]=255&e;++i>>=0,r>>>=0,n||checkInt(this,e,t,r,Math.pow(2,8*r)-1,0);var f=r-1,i=1;for(this[t+f]=255&e;--f>=0&&(i*=256);)this[t+f]=e/i&255;return t+r},Buffer.prototype.writeUInt8=function(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,1,255,0),this[t]=255&e,t+1},Buffer.prototype.writeUInt16LE=function(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,2,65535,0),this[t]=255&e,this[t+1]=e>>>8,t+2},Buffer.prototype.writeUInt16BE=function(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,2,65535,0),this[t]=e>>>8,this[t+1]=255&e,t+2},Buffer.prototype.writeUInt32LE=function(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,4,4294967295,0),this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e,t+4},Buffer.prototype.writeUInt32BE=function(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,4,4294967295,0),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},Buffer.prototype.writeIntLE=function(e,t,r,n){if(e=+e,t>>>=0,!n){var f=Math.pow(2,8*r-1);checkInt(this,e,t,r,f-1,-f)}var i=0,o=1,u=0;for(this[t]=255&e;++i>0)-u&255;return t+r},Buffer.prototype.writeIntBE=function(e,t,r,n){if(e=+e,t>>>=0,!n){var f=Math.pow(2,8*r-1);checkInt(this,e,t,r,f-1,-f)}var i=r-1,o=1,u=0;for(this[t+i]=255&e;--i>=0&&(o*=256);)e<0&&0===u&&0!==this[t+i+1]&&(u=1),this[t+i]=(e/o>>0)-u&255;return t+r},Buffer.prototype.writeInt8=function(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,1,127,-128),e<0&&(e=255+e+1),this[t]=255&e,t+1},Buffer.prototype.writeInt16LE=function(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,2,32767,-32768),this[t]=255&e,this[t+1]=e>>>8,t+2},Buffer.prototype.writeInt16BE=function(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,2,32767,-32768),this[t]=e>>>8,this[t+1]=255&e,t+2},Buffer.prototype.writeInt32LE=function(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,4,2147483647,-2147483648),this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24,t+4},Buffer.prototype.writeInt32BE=function(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},Buffer.prototype.writeFloatLE=function(e,t,r){return writeFloat(this,e,t,!0,r)},Buffer.prototype.writeFloatBE=function(e,t,r){return writeFloat(this,e,t,!1,r)},Buffer.prototype.writeDoubleLE=function(e,t,r){return writeDouble(this,e,t,!0,r)},Buffer.prototype.writeDoubleBE=function(e,t,r){return writeDouble(this,e,t,!1,r)},Buffer.prototype.copy=function(e,t,r,n){if(r||(r=0),n||0===n||(n=this.length),t>=e.length&&(t=e.length),t||(t=0),n>0&&n=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),e.length-t=0;--f)e[f+t]=this[f+r];else if(i<1e3)for(f=0;f>>=0,r=void 0===r?this.length:r>>>0,e||(e=0);var i;if("number"==typeof e)for(i=t;i>>2),n=0,i=0;n>5]|=128<<_%32,d[14+(_+64>>>9<<4)]=_;for(var m=1732584193,f=-271733879,i=-1732584194,h=271733878,g=0;g>16)+(_>>16)+(m>>16)<<16|65535&m}function bit_rol(d,_){return d<<_|d>>>32-_}var makeHash=require("./make-hash");module.exports=function(d){return makeHash(d,core_md5)}; + +},{"./make-hash":12}],14:[function(require,module,exports){ +"use strict";var elliptic=exports;elliptic.version=require("../package.json").version,elliptic.utils=require("./elliptic/utils"),elliptic.rand=require("brorand"),elliptic.curve=require("./elliptic/curve"),elliptic.curves=require("./elliptic/curves"),elliptic.ec=require("./elliptic/ec"),elliptic.eddsa=require("./elliptic/eddsa"); + +},{"../package.json":29,"./elliptic/curve":17,"./elliptic/curves":20,"./elliptic/ec":21,"./elliptic/eddsa":24,"./elliptic/utils":28,"brorand":5}],15:[function(require,module,exports){ +"use strict";function BaseCurve(t,e){this.type=t,this.p=new BN(e.p,16),this.red=e.prime?BN.red(e.prime):BN.mont(this.p),this.zero=new BN(0).toRed(this.red),this.one=new BN(1).toRed(this.red),this.two=new BN(2).toRed(this.red),this.n=e.n&&new BN(e.n,16),this.g=e.g&&this.pointFromJSON(e.g,e.gRed),this._wnafT1=new Array(4),this._wnafT2=new Array(4),this._wnafT3=new Array(4),this._wnafT4=new Array(4);var n=this.n&&this.p.div(this.n);!n||n.cmpn(100)>0?this.redN=null:(this._maxwellTrick=!0,this.redN=this.n.toRed(this.red))}function BasePoint(t,e){this.curve=t,this.type=e,this.precomputed=null}var BN=require("bn.js"),elliptic=require("../../elliptic"),utils=elliptic.utils,getNAF=utils.getNAF,getJSF=utils.getJSF,assert=utils.assert;module.exports=BaseCurve,BaseCurve.prototype.point=function(){throw new Error("Not implemented")},BaseCurve.prototype.validate=function(){throw new Error("Not implemented")},BaseCurve.prototype._fixedNafMul=function(t,e){assert(t.precomputed);var n=t._getDoubles(),r=getNAF(e,1),i=(1<=s;e--)a=(a<<1)+r[e];o.push(a)}for(var p=this.jpoint(null,null,null),u=this.jpoint(null,null,null),d=i;d>0;d--){for(s=0;s=0;a--){for(var e=0;a>=0&&0===o[a];a--)e++;if(a>=0&&e++,s=s.dblp(e),a<0)break;var p=o[a];assert(0!==p),s="affine"===t.type?p>0?s.mixedAdd(i[p-1>>1]):s.mixedAdd(i[-p-1>>1].neg()):p>0?s.add(i[p-1>>1]):s.add(i[-p-1>>1].neg())}return"affine"===t.type?s.toP():s},BaseCurve.prototype._wnafMulAdd=function(t,e,n,r,i){for(var o=this._wnafT1,s=this._wnafT2,a=this._wnafT3,p=0,u=0;u=1;u-=2){var l=u-1,h=u;if(1===o[l]&&1===o[h]){var f=[e[l],null,null,e[h]];0===e[l].y.cmp(e[h].y)?(f[1]=e[l].add(e[h]),f[2]=e[l].toJ().mixedAdd(e[h].neg())):0===e[l].y.cmp(e[h].y.redNeg())?(f[1]=e[l].toJ().mixedAdd(e[h]),f[2]=e[l].add(e[h].neg())):(f[1]=e[l].toJ().mixedAdd(e[h]),f[2]=e[l].toJ().mixedAdd(e[h].neg()));var c=[-3,-1,-5,-7,0,7,5,1,3],g=getJSF(n[l],n[h]);p=Math.max(g[0].length,p),a[l]=new Array(p),a[h]=new Array(p);for(b=0;b=0;u--){for(var B=0;u>=0;){for(var A=!0,b=0;b=0&&B++,y=y.dblp(B),u<0)break;for(b=0;b0?N=s[b][_-1>>1]:_<0&&(N=s[b][-_-1>>1].neg()),y="affine"===N.type?y.mixedAdd(N):y.add(N))}}for(u=0;u=Math.ceil((t.bitLength()+1)/e.step)},BasePoint.prototype._getDoubles=function(t,e){if(this.precomputed&&this.precomputed.doubles)return this.precomputed.doubles;for(var n=[this],r=this,i=0;i":""},Point.prototype.isInfinity=function(){return 0===this.x.cmpn(0)&&0===this.y.cmp(this.z)},Point.prototype._extDbl=function(){var t=this.x.redSqr(),r=this.y.redSqr(),e=this.z.redSqr();e=e.redIAdd(e);var i=this.curve._mulA(t),d=this.x.redAdd(this.y).redSqr().redISub(t).redISub(r),s=i.redAdd(r),u=s.redSub(e),n=i.redSub(r),h=d.redMul(u),o=s.redMul(n),l=d.redMul(n),c=u.redMul(s);return this.curve.point(h,o,c,l)},Point.prototype._projDbl=function(){var t,r,e,i=this.x.redAdd(this.y).redSqr(),d=this.x.redSqr(),s=this.y.redSqr();if(this.curve.twisted){var u=(o=this.curve._mulA(d)).redAdd(s);if(this.zOne)t=i.redSub(d).redSub(s).redMul(u.redSub(this.curve.two)),r=u.redMul(o.redSub(s)),e=u.redSqr().redSub(u).redSub(u);else{var n=this.z.redSqr(),h=u.redSub(n).redISub(n);t=i.redSub(d).redISub(s).redMul(h),r=u.redMul(o.redSub(s)),e=u.redMul(h)}}else{var o=d.redAdd(s),n=this.curve._mulC(this.c.redMul(this.z)).redSqr(),h=o.redSub(n).redSub(n);t=this.curve._mulC(i.redISub(o)).redMul(h),r=this.curve._mulC(o).redMul(d.redISub(s)),e=o.redMul(h)}return this.curve.point(t,r,e)},Point.prototype.dbl=function(){return this.isInfinity()?this:this.curve.extended?this._extDbl():this._projDbl()},Point.prototype._extAdd=function(t){var r=this.y.redSub(this.x).redMul(t.y.redSub(t.x)),e=this.y.redAdd(this.x).redMul(t.y.redAdd(t.x)),i=this.t.redMul(this.curve.dd).redMul(t.t),d=this.z.redMul(t.z.redAdd(t.z)),s=e.redSub(r),u=d.redSub(i),n=d.redAdd(i),h=e.redAdd(r),o=s.redMul(u),l=n.redMul(h),c=s.redMul(h),p=u.redMul(n);return this.curve.point(o,l,p,c)},Point.prototype._projAdd=function(t){var r,e,i=this.z.redMul(t.z),d=i.redSqr(),s=this.x.redMul(t.x),u=this.y.redMul(t.y),n=this.curve.d.redMul(s).redMul(u),h=d.redSub(n),o=d.redAdd(n),l=this.x.redAdd(this.y).redMul(t.x.redAdd(t.y)).redISub(s).redISub(u),c=i.redMul(h).redMul(l);return this.curve.twisted?(r=i.redMul(o).redMul(u.redSub(this.curve._mulA(s))),e=h.redMul(o)):(r=i.redMul(o).redMul(u.redSub(s)),e=this.curve._mulC(h).redMul(o)),this.curve.point(c,r,e)},Point.prototype.add=function(t){return this.isInfinity()?t:t.isInfinity()?this:this.curve.extended?this._extAdd(t):this._projAdd(t)},Point.prototype.mul=function(t){return this._hasDoubles(t)?this.curve._fixedNafMul(this,t):this.curve._wnafMul(this,t)},Point.prototype.mulAdd=function(t,r,e){return this.curve._wnafMulAdd(1,[this,r],[t,e],2,!1)},Point.prototype.jmulAdd=function(t,r,e){return this.curve._wnafMulAdd(1,[this,r],[t,e],2,!0)},Point.prototype.normalize=function(){if(this.zOne)return this;var t=this.z.redInvm();return this.x=this.x.redMul(t),this.y=this.y.redMul(t),this.t&&(this.t=this.t.redMul(t)),this.z=this.curve.one,this.zOne=!0,this},Point.prototype.neg=function(){return this.curve.point(this.x.redNeg(),this.y,this.z,this.t&&this.t.redNeg())},Point.prototype.getX=function(){return this.normalize(),this.x.fromRed()},Point.prototype.getY=function(){return this.normalize(),this.y.fromRed()},Point.prototype.eq=function(t){return this===t||0===this.getX().cmp(t.getX())&&0===this.getY().cmp(t.getY())},Point.prototype.eqXToP=function(t){var r=t.toRed(this.curve.red).redMul(this.z);if(0===this.x.cmp(r))return!0;for(var e=t.clone(),i=this.curve.redN.redMul(this.z);;){if(e.iadd(this.curve.n),e.cmp(this.curve.p)>=0)return!1;if(r.redIAdd(i),0===this.x.cmp(r))return!0}return!1},Point.prototype.toP=Point.prototype.normalize,Point.prototype.mixedAdd=Point.prototype.add; + +},{"../../elliptic":14,"../curve":17,"bn.js":4,"inherits":51}],17:[function(require,module,exports){ +"use strict";var curve=exports;curve.base=require("./base"),curve.short=require("./short"),curve.mont=require("./mont"),curve.edwards=require("./edwards"); + +},{"./base":15,"./edwards":16,"./mont":18,"./short":19}],18:[function(require,module,exports){ +"use strict";function MontCurve(t){Base.call(this,"mont",t),this.a=new BN(t.a,16).toRed(this.red),this.b=new BN(t.b,16).toRed(this.red),this.i4=new BN(4).toRed(this.red).redInvm(),this.two=new BN(2).toRed(this.red),this.a24=this.i4.redMul(this.a.redAdd(this.two))}function Point(t,r,e){Base.BasePoint.call(this,t,"projective"),null===r&&null===e?(this.x=this.curve.one,this.z=this.curve.zero):(this.x=new BN(r,16),this.z=new BN(e,16),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)))}var curve=require("../curve"),BN=require("bn.js"),inherits=require("inherits"),Base=curve.base,elliptic=require("../../elliptic"),utils=elliptic.utils;inherits(MontCurve,Base),module.exports=MontCurve,MontCurve.prototype.validate=function(t){var r=t.normalize().x,e=r.redSqr(),i=e.redMul(r).redAdd(e.redMul(this.a)).redAdd(r);return 0===i.redSqrt().redSqr().cmp(i)},inherits(Point,Base.BasePoint),MontCurve.prototype.decodePoint=function(t,r){return this.point(utils.toArray(t,r),1)},MontCurve.prototype.point=function(t,r){return new Point(this,t,r)},MontCurve.prototype.pointFromJSON=function(t){return Point.fromJSON(this,t)},Point.prototype.precompute=function(){},Point.prototype._encode=function(){return this.getX().toArray("be",this.curve.p.byteLength())},Point.fromJSON=function(t,r){return new Point(t,r[0],r[1]||t.one)},Point.prototype.inspect=function(){return this.isInfinity()?"":""},Point.prototype.isInfinity=function(){return 0===this.z.cmpn(0)},Point.prototype.dbl=function(){var t=this.x.redAdd(this.z).redSqr(),r=this.x.redSub(this.z).redSqr(),e=t.redSub(r),i=t.redMul(r),o=e.redMul(r.redAdd(this.curve.a24.redMul(e)));return this.curve.point(i,o)},Point.prototype.add=function(){throw new Error("Not supported on Montgomery curve")},Point.prototype.diffAdd=function(t,r){var e=this.x.redAdd(this.z),i=this.x.redSub(this.z),o=t.x.redAdd(t.z),n=t.x.redSub(t.z).redMul(e),u=o.redMul(i),d=r.z.redMul(n.redAdd(u).redSqr()),s=r.x.redMul(n.redISub(u).redSqr());return this.curve.point(d,s)},Point.prototype.mul=function(t){for(var r=t.clone(),e=this,i=this.curve.point(null,null),o=this,n=[];0!==r.cmpn(0);r.iushrn(1))n.push(r.andln(1));for(var u=n.length-1;u>=0;u--)0===n[u]?(e=e.diffAdd(i,o),i=i.dbl()):(i=e.diffAdd(i,o),e=e.dbl());return i},Point.prototype.mulAdd=function(){throw new Error("Not supported on Montgomery curve")},Point.prototype.jumlAdd=function(){throw new Error("Not supported on Montgomery curve")},Point.prototype.eq=function(t){return 0===this.getX().cmp(t.getX())},Point.prototype.normalize=function(){return this.x=this.x.redMul(this.z.redInvm()),this.z=this.curve.one,this},Point.prototype.getX=function(){return this.normalize(),this.x.fromRed()}; + +},{"../../elliptic":14,"../curve":17,"bn.js":4,"inherits":51}],19:[function(require,module,exports){ +"use strict";function ShortCurve(r){Base.call(this,"short",r),this.a=new BN(r.a,16).toRed(this.red),this.b=new BN(r.b,16).toRed(this.red),this.tinv=this.two.redInvm(),this.zeroA=0===this.a.fromRed().cmpn(0),this.threeA=0===this.a.fromRed().sub(this.p).cmpn(-3),this.endo=this._getEndomorphism(r),this._endoWnafT1=new Array(4),this._endoWnafT2=new Array(4)}function Point(r,e,t,d){Base.BasePoint.call(this,r,"affine"),null===e&&null===t?(this.x=null,this.y=null,this.inf=!0):(this.x=new BN(e,16),this.y=new BN(t,16),d&&(this.x.forceRed(this.curve.red),this.y.forceRed(this.curve.red)),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.inf=!1)}function JPoint(r,e,t,d){Base.BasePoint.call(this,r,"jacobian"),null===e&&null===t&&null===d?(this.x=this.curve.one,this.y=this.curve.one,this.z=new BN(0)):(this.x=new BN(e,16),this.y=new BN(t,16),this.z=new BN(d,16)),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)),this.zOne=this.z===this.curve.one}var curve=require("../curve"),elliptic=require("../../elliptic"),BN=require("bn.js"),inherits=require("inherits"),Base=curve.base,assert=elliptic.utils.assert;inherits(ShortCurve,Base),module.exports=ShortCurve,ShortCurve.prototype._getEndomorphism=function(r){if(this.zeroA&&this.g&&this.n&&1===this.p.modn(3)){var e,t;if(r.beta)e=new BN(r.beta,16).toRed(this.red);else{var d=this._getEndoRoots(this.p);e=(e=d[0].cmp(d[1])<0?d[0]:d[1]).toRed(this.red)}if(r.lambda)t=new BN(r.lambda,16);else{var i=this._getEndoRoots(this.n);0===this.g.mul(i[0]).x.cmp(this.g.x.redMul(e))?t=i[0]:(t=i[1],assert(0===this.g.mul(t).x.cmp(this.g.x.redMul(e))))}var n;return n=r.basis?r.basis.map(function(r){return{a:new BN(r.a,16),b:new BN(r.b,16)}}):this._getEndoBasis(t),{beta:e,lambda:t,basis:n}}},ShortCurve.prototype._getEndoRoots=function(r){var e=r===this.p?this.red:BN.mont(r),t=new BN(2).toRed(e).redInvm(),d=t.redNeg(),i=new BN(3).toRed(e).redNeg().redSqrt().redMul(t);return[d.redAdd(i).fromRed(),d.redSub(i).fromRed()]},ShortCurve.prototype._getEndoBasis=function(r){for(var e,t,d,i,n,u,s,o,h,l=this.n.ushrn(Math.floor(this.n.bitLength()/2)),p=r,a=this.n.clone(),c=new BN(1),f=new BN(0),v=new BN(0),S=new BN(1),b=0;0!==p.cmpn(0);){var I=a.div(p);o=a.sub(I.mul(p)),h=v.sub(I.mul(c));var y=S.sub(I.mul(f));if(!d&&o.cmp(l)<0)e=s.neg(),t=c,d=o.neg(),i=h;else if(d&&2==++b)break;s=o,a=p,p=o,v=c,c=h,S=f,f=y}n=o.neg(),u=h;var A=d.sqr().add(i.sqr());return n.sqr().add(u.sqr()).cmp(A)>=0&&(n=e,u=t),d.negative&&(d=d.neg(),i=i.neg()),n.negative&&(n=n.neg(),u=u.neg()),[{a:d,b:i},{a:n,b:u}]},ShortCurve.prototype._endoSplit=function(r){var e=this.endo.basis,t=e[0],d=e[1],i=d.b.mul(r).divRound(this.n),n=t.b.neg().mul(r).divRound(this.n),u=i.mul(t.a),s=n.mul(d.a),o=i.mul(t.b),h=n.mul(d.b);return{k1:r.sub(u).sub(s),k2:o.add(h).neg()}},ShortCurve.prototype.pointFromX=function(r,e){(r=new BN(r,16)).red||(r=r.toRed(this.red));var t=r.redSqr().redMul(r).redIAdd(r.redMul(this.a)).redIAdd(this.b),d=t.redSqrt();if(0!==d.redSqr().redSub(t).cmp(this.zero))throw new Error("invalid point");var i=d.fromRed().isOdd();return(e&&!i||!e&&i)&&(d=d.redNeg()),this.point(r,d)},ShortCurve.prototype.validate=function(r){if(r.inf)return!0;var e=r.x,t=r.y,d=this.a.redMul(e),i=e.redSqr().redMul(e).redIAdd(d).redIAdd(this.b);return 0===t.redSqr().redISub(i).cmpn(0)},ShortCurve.prototype._endoWnafMulAdd=function(r,e,t){for(var d=this._endoWnafT1,i=this._endoWnafT2,n=0;n":""},Point.prototype.isInfinity=function(){return this.inf},Point.prototype.add=function(r){if(this.inf)return r;if(r.inf)return this;if(this.eq(r))return this.dbl();if(this.neg().eq(r))return this.curve.point(null,null);if(0===this.x.cmp(r.x))return this.curve.point(null,null);var e=this.y.redSub(r.y);0!==e.cmpn(0)&&(e=e.redMul(this.x.redSub(r.x).redInvm()));var t=e.redSqr().redISub(this.x).redISub(r.x),d=e.redMul(this.x.redSub(t)).redISub(this.y);return this.curve.point(t,d)},Point.prototype.dbl=function(){if(this.inf)return this;var r=this.y.redAdd(this.y);if(0===r.cmpn(0))return this.curve.point(null,null);var e=this.curve.a,t=this.x.redSqr(),d=r.redInvm(),i=t.redAdd(t).redIAdd(t).redIAdd(e).redMul(d),n=i.redSqr().redISub(this.x.redAdd(this.x)),u=i.redMul(this.x.redSub(n)).redISub(this.y);return this.curve.point(n,u)},Point.prototype.getX=function(){return this.x.fromRed()},Point.prototype.getY=function(){return this.y.fromRed()},Point.prototype.mul=function(r){return r=new BN(r,16),this._hasDoubles(r)?this.curve._fixedNafMul(this,r):this.curve.endo?this.curve._endoWnafMulAdd([this],[r]):this.curve._wnafMul(this,r)},Point.prototype.mulAdd=function(r,e,t){var d=[this,e],i=[r,t];return this.curve.endo?this.curve._endoWnafMulAdd(d,i):this.curve._wnafMulAdd(1,d,i,2)},Point.prototype.jmulAdd=function(r,e,t){var d=[this,e],i=[r,t];return this.curve.endo?this.curve._endoWnafMulAdd(d,i,!0):this.curve._wnafMulAdd(1,d,i,2,!0)},Point.prototype.eq=function(r){return this===r||this.inf===r.inf&&(this.inf||0===this.x.cmp(r.x)&&0===this.y.cmp(r.y))},Point.prototype.neg=function(r){if(this.inf)return this;var e=this.curve.point(this.x,this.y.redNeg());if(r&&this.precomputed){var t=this.precomputed,d=function(r){return r.neg()};e.precomputed={naf:t.naf&&{wnd:t.naf.wnd,points:t.naf.points.map(d)},doubles:t.doubles&&{step:t.doubles.step,points:t.doubles.points.map(d)}}}return e},Point.prototype.toJ=function(){return this.inf?this.curve.jpoint(null,null,null):this.curve.jpoint(this.x,this.y,this.curve.one)},inherits(JPoint,Base.BasePoint),ShortCurve.prototype.jpoint=function(r,e,t){return new JPoint(this,r,e,t)},JPoint.prototype.toP=function(){if(this.isInfinity())return this.curve.point(null,null);var r=this.z.redInvm(),e=r.redSqr(),t=this.x.redMul(e),d=this.y.redMul(e).redMul(r);return this.curve.point(t,d)},JPoint.prototype.neg=function(){return this.curve.jpoint(this.x,this.y.redNeg(),this.z)},JPoint.prototype.add=function(r){if(this.isInfinity())return r;if(r.isInfinity())return this;var e=r.z.redSqr(),t=this.z.redSqr(),d=this.x.redMul(e),i=r.x.redMul(t),n=this.y.redMul(e.redMul(r.z)),u=r.y.redMul(t.redMul(this.z)),s=d.redSub(i),o=n.redSub(u);if(0===s.cmpn(0))return 0!==o.cmpn(0)?this.curve.jpoint(null,null,null):this.dbl();var h=s.redSqr(),l=h.redMul(s),p=d.redMul(h),a=o.redSqr().redIAdd(l).redISub(p).redISub(p),c=o.redMul(p.redISub(a)).redISub(n.redMul(l)),f=this.z.redMul(r.z).redMul(s);return this.curve.jpoint(a,c,f)},JPoint.prototype.mixedAdd=function(r){if(this.isInfinity())return r.toJ();if(r.isInfinity())return this;var e=this.z.redSqr(),t=this.x,d=r.x.redMul(e),i=this.y,n=r.y.redMul(e).redMul(this.z),u=t.redSub(d),s=i.redSub(n);if(0===u.cmpn(0))return 0!==s.cmpn(0)?this.curve.jpoint(null,null,null):this.dbl();var o=u.redSqr(),h=o.redMul(u),l=t.redMul(o),p=s.redSqr().redIAdd(h).redISub(l).redISub(l),a=s.redMul(l.redISub(p)).redISub(i.redMul(h)),c=this.z.redMul(u);return this.curve.jpoint(p,a,c)},JPoint.prototype.dblp=function(r){if(0===r)return this;if(this.isInfinity())return this;if(!r)return this.dbl();if(this.curve.zeroA||this.curve.threeA){for(var e=this,t=0;t=0)return!1;if(t.redIAdd(i),0===this.x.cmp(t))return!0}return!1},JPoint.prototype.inspect=function(){return this.isInfinity()?"":""},JPoint.prototype.isInfinity=function(){return 0===this.z.cmpn(0)}; + +},{"../../elliptic":14,"../curve":17,"bn.js":4,"inherits":51}],20:[function(require,module,exports){ +"use strict";function PresetCurve(f){"short"===f.type?this.curve=new elliptic.curve.short(f):"edwards"===f.type?this.curve=new elliptic.curve.edwards(f):this.curve=new elliptic.curve.mont(f),this.g=this.curve.g,this.n=this.curve.n,this.hash=f.hash,assert(this.g.validate(),"Invalid curve"),assert(this.g.mul(this.n).isInfinity(),"Invalid curve, G*N != O")}function defineCurve(f,e){Object.defineProperty(curves,f,{configurable:!0,enumerable:!0,get:function(){var a=new PresetCurve(e);return Object.defineProperty(curves,f,{configurable:!0,enumerable:!0,value:a}),a}})}var curves=exports,hash=require("hash.js"),elliptic=require("../elliptic"),assert=elliptic.utils.assert;curves.PresetCurve=PresetCurve,defineCurve("p192",{type:"short",prime:"p192",p:"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff",a:"ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc",b:"64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1",n:"ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831",hash:hash.sha256,gRed:!1,g:["188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012","07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811"]}),defineCurve("p224",{type:"short",prime:"p224",p:"ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001",a:"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe",b:"b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4",n:"ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d",hash:hash.sha256,gRed:!1,g:["b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21","bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34"]}),defineCurve("p256",{type:"short",prime:null,p:"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff",a:"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc",b:"5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b",n:"ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551",hash:hash.sha256,gRed:!1,g:["6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296","4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5"]}),defineCurve("p384",{type:"short",prime:null,p:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 ffffffff",a:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 fffffffc",b:"b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f 5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef",n:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 f4372ddf 581a0db2 48b0a77a ecec196a ccc52973",hash:hash.sha384,gRed:!1,g:["aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 5502f25d bf55296c 3a545e38 72760ab7","3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 0a60b1ce 1d7e819d 7a431d7c 90ea0e5f"]}),defineCurve("p521",{type:"short",prime:null,p:"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff",a:"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffc",b:"00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b 99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd 3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00",n:"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409",hash:hash.sha512,gRed:!1,g:["000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66","00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 3fad0761 353c7086 a272c240 88be9476 9fd16650"]}),defineCurve("curve25519",{type:"mont",prime:"p25519",p:"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",a:"76d06",b:"1",n:"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",hash:hash.sha256,gRed:!1,g:["9"]}),defineCurve("ed25519",{type:"edwards",prime:"p25519",p:"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",a:"-1",c:"1",d:"52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3",n:"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",hash:hash.sha256,gRed:!1,g:["216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a","6666666666666666666666666666666666666666666666666666666666666658"]});var pre;try{pre=require("./precomputed/secp256k1")}catch(f){pre=void 0}defineCurve("secp256k1",{type:"short",prime:"k256",p:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f",a:"0",b:"7",n:"ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141",h:"1",hash:hash.sha256,beta:"7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee",lambda:"5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72",basis:[{a:"3086d221a7d46bcde86c90e49284eb15",b:"-e4437ed6010e88286f547fa90abfe4c3"},{a:"114ca50f7a8e2f3f657c1108d9d44cfd8",b:"3086d221a7d46bcde86c90e49284eb15"}],gRed:!1,g:["79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798","483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",pre]}); + +},{"../elliptic":14,"./precomputed/secp256k1":27,"hash.js":37}],21:[function(require,module,exports){ +"use strict";function EC(e){if(!(this instanceof EC))return new EC(e);"string"==typeof e&&(assert(elliptic.curves.hasOwnProperty(e),"Unknown curve "+e),e=elliptic.curves[e]),e instanceof elliptic.curves.PresetCurve&&(e={curve:e}),this.curve=e.curve.curve,this.n=this.curve.n,this.nh=this.n.ushrn(1),this.g=this.curve.g,this.g=e.curve.g,this.g.precompute(e.curve.n.bitLength()+1),this.hash=e.hash||e.curve.hash}var BN=require("bn.js"),HmacDRBG=require("hmac-drbg"),elliptic=require("../../elliptic"),utils=elliptic.utils,assert=utils.assert,KeyPair=require("./key"),Signature=require("./signature");module.exports=EC,EC.prototype.keyPair=function(e){return new KeyPair(this,e)},EC.prototype.keyFromPrivate=function(e,t){return KeyPair.fromPrivate(this,e,t)},EC.prototype.keyFromPublic=function(e,t){return KeyPair.fromPublic(this,e,t)},EC.prototype.genKeyPair=function(e){e||(e={});for(var t=new HmacDRBG({hash:this.hash,pers:e.pers,persEnc:e.persEnc||"utf8",entropy:e.entropy||elliptic.rand(this.hash.hmacStrength),entropyEnc:e.entropy&&e.entropyEnc||"utf8",nonce:this.n.toArray()}),r=this.n.byteLength(),n=this.n.sub(new BN(2));;){var i=new BN(t.generate(r));if(!(i.cmp(n)>0))return i.iaddn(1),this.keyFromPrivate(i)}},EC.prototype._truncateToN=function(e,t){var r=8*e.byteLength()-this.n.bitLength();return r>0&&(e=e.ushrn(r)),!t&&e.cmp(this.n)>=0?e.sub(this.n):e},EC.prototype.sign=function(e,t,r,n){"object"==typeof r&&(n=r,r=null),n||(n={}),t=this.keyFromPrivate(t,r),e=this._truncateToN(new BN(e,16));for(var i=this.n.byteLength(),s=t.getPrivate().toArray("be",i),u=e.toArray("be",i),o=new HmacDRBG({hash:this.hash,entropy:s,nonce:u,pers:n.pers,persEnc:n.persEnc||"utf8"}),c=this.n.sub(new BN(1)),h=0;!0;h++){var a=n.k?n.k(h):new BN(o.generate(this.n.byteLength()));if(!((a=this._truncateToN(a,!0)).cmpn(1)<=0||a.cmp(c)>=0)){var p=this.g.mul(a);if(!p.isInfinity()){var m=p.getX(),v=m.umod(this.n);if(0!==v.cmpn(0)){var y=a.invm(this.n).mul(v.mul(t.getPrivate()).iadd(e));if(0!==(y=y.umod(this.n)).cmpn(0)){var l=(p.getY().isOdd()?1:0)|(0!==m.cmp(v)?2:0);return n.canonical&&y.cmp(this.nh)>0&&(y=this.n.sub(y),l^=1),new Signature({r:v,s:y,recoveryParam:l})}}}}}},EC.prototype.verify=function(e,t,r,n){e=this._truncateToN(new BN(e,16)),r=this.keyFromPublic(r,n);var i=(t=new Signature(t,"hex")).r,s=t.s;if(i.cmpn(1)<0||i.cmp(this.n)>=0)return!1;if(s.cmpn(1)<0||s.cmp(this.n)>=0)return!1;var u=s.invm(this.n),o=u.mul(e).umod(this.n),c=u.mul(i).umod(this.n);if(!this.curve._maxwellTrick)return!(h=this.g.mulAdd(o,r.getPublic(),c)).isInfinity()&&0===h.getX().umod(this.n).cmp(i);var h=this.g.jmulAdd(o,r.getPublic(),c);return!h.isInfinity()&&h.eqXToP(i)},EC.prototype.recoverPubKey=function(e,t,r,n){assert((3&r)===r,"The recovery param is more than two bits"),t=new Signature(t,n);var i=this.n,s=new BN(e),u=t.r,o=t.s,c=1&r,h=r>>1;if(u.cmp(this.curve.p.umod(this.curve.n))>=0&&h)throw new Error("Unable to find sencond key candinate");u=h?this.curve.pointFromX(u.add(this.curve.n),c):this.curve.pointFromX(u,c);var a=t.r.invm(i),p=i.sub(s).mul(a).umod(i),m=o.mul(a).umod(i);return this.g.mulAdd(p,u,m)},EC.prototype.getKeyRecoveryParam=function(e,t,r,n){if(null!==(t=new Signature(t,n)).recoveryParam)return t.recoveryParam;for(var i=0;i<4;i++){var s;try{s=this.recoverPubKey(e,t,i)}catch(e){continue}if(s.eq(r))return i}throw new Error("Unable to find valid recovery factor")}; + +},{"../../elliptic":14,"./key":22,"./signature":23,"bn.js":4,"hmac-drbg":49}],22:[function(require,module,exports){ +"use strict";function KeyPair(i,t){this.ec=i,this.priv=null,this.pub=null,t.priv&&this._importPrivate(t.priv,t.privEnc),t.pub&&this._importPublic(t.pub,t.pubEnc)}var BN=require("bn.js"),elliptic=require("../../elliptic"),utils=elliptic.utils,assert=utils.assert;module.exports=KeyPair,KeyPair.fromPublic=function(i,t,e){return t instanceof KeyPair?t:new KeyPair(i,{pub:t,pubEnc:e})},KeyPair.fromPrivate=function(i,t,e){return t instanceof KeyPair?t:new KeyPair(i,{priv:t,privEnc:e})},KeyPair.prototype.validate=function(){var i=this.getPublic();return i.isInfinity()?{result:!1,reason:"Invalid public key"}:i.validate()?i.mul(this.ec.curve.n).isInfinity()?{result:!0,reason:null}:{result:!1,reason:"Public key * N != O"}:{result:!1,reason:"Public key is not a point"}},KeyPair.prototype.getPublic=function(i,t){return"string"==typeof i&&(t=i,i=null),this.pub||(this.pub=this.ec.g.mul(this.priv)),t?this.pub.encode(t,i):this.pub},KeyPair.prototype.getPrivate=function(i){return"hex"===i?this.priv.toString(16,2):this.priv},KeyPair.prototype._importPrivate=function(i,t){this.priv=new BN(i,t||16),this.priv=this.priv.umod(this.ec.curve.n)},KeyPair.prototype._importPublic=function(i,t){if(i.x||i.y)return"mont"===this.ec.curve.type?assert(i.x,"Need x coordinate"):"short"!==this.ec.curve.type&&"edwards"!==this.ec.curve.type||assert(i.x&&i.y,"Need both x and y coordinate"),void(this.pub=this.ec.curve.point(i.x,i.y));this.pub=this.ec.curve.decodePoint(i,t)},KeyPair.prototype.derive=function(i){return i.mul(this.priv).getX()},KeyPair.prototype.sign=function(i,t,e){return this.ec.sign(i,this,t,e)},KeyPair.prototype.verify=function(i,t){return this.ec.verify(i,t,this)},KeyPair.prototype.inspect=function(){return""}; + +},{"../../elliptic":14,"bn.js":4}],23:[function(require,module,exports){ +"use strict";function Signature(t,r){if(t instanceof Signature)return t;this._importDER(t,r)||(assert(t.r&&t.s,"Signature without r or s"),this.r=new BN(t.r,16),this.s=new BN(t.s,16),void 0===t.recoveryParam?this.recoveryParam=null:this.recoveryParam=t.recoveryParam)}function Position(){this.place=0}function getLength(t,r){var e=t[r.place++];if(!(128&e))return e;for(var n=15&e,i=0,a=0,c=r.place;a>>3);for(t.push(128|e);--e;)t.push(r>>>(e<<3)&255);t.push(r)}}var BN=require("bn.js"),elliptic=require("../../elliptic"),utils=elliptic.utils,assert=utils.assert;module.exports=Signature,Signature.prototype._importDER=function(t,r){t=utils.toArray(t,r);var e=new Position;if(48!==t[e.place++])return!1;if(getLength(t,e)+e.place!==t.length)return!1;if(2!==t[e.place++])return!1;var n=getLength(t,e),i=t.slice(e.place,n+e.place);if(e.place+=n,2!==t[e.place++])return!1;var a=getLength(t,e);if(t.length!==a+e.place)return!1;var c=t.slice(e.place,a+e.place);return 0===i[0]&&128&i[1]&&(i=i.slice(1)),0===c[0]&&128&c[1]&&(c=c.slice(1)),this.r=new BN(i),this.s=new BN(c),this.recoveryParam=null,!0},Signature.prototype.toDER=function(t){var r=this.r.toArray(),e=this.s.toArray();for(128&r[0]&&(r=[0].concat(r)),128&e[0]&&(e=[0].concat(e)),r=rmPadding(r),e=rmPadding(e);!(e[0]||128&e[1]);)e=e.slice(1);var n=[2];constructLength(n,r.length),(n=n.concat(r)).push(2),constructLength(n,e.length);var i=n.concat(e),a=[48];return constructLength(a,i.length),a=a.concat(i),utils.encode(a,t)}; + +},{"../../elliptic":14,"bn.js":4}],24:[function(require,module,exports){ +"use strict";function EDDSA(t){if(assert("ed25519"===t,"only tested with ed25519 so far"),!(this instanceof EDDSA))return new EDDSA(t);var t=elliptic.curves[t].curve;this.curve=t,this.g=t.g,this.g.precompute(t.n.bitLength()+1),this.pointClass=t.point().constructor,this.encodingLength=Math.ceil(t.n.bitLength()/8),this.hash=hash.sha512}var hash=require("hash.js"),elliptic=require("../../elliptic"),utils=elliptic.utils,assert=utils.assert,parseBytes=utils.parseBytes,KeyPair=require("./key"),Signature=require("./signature");module.exports=EDDSA,EDDSA.prototype.sign=function(t,e){t=parseBytes(t);var i=this.keyFromSecret(e),r=this.hashInt(i.messagePrefix(),t),n=this.g.mul(r),s=this.encodePoint(n),o=this.hashInt(s,i.pubBytes(),t).mul(i.priv()),u=r.add(o).umod(this.curve.n);return this.makeSignature({R:n,S:u,Rencoded:s})},EDDSA.prototype.verify=function(t,e,i){t=parseBytes(t),e=this.makeSignature(e);var r=this.keyFromPublic(i),n=this.hashInt(e.Rencoded(),r.pubBytes(),t),s=this.g.mul(e.S());return e.R().add(r.pub().mul(n)).eq(s)},EDDSA.prototype.hashInt=function(){for(var t=this.hash(),e=0;e=0;){var s;if(e.isOdd()){var u=e.andln(n-1);s=u>(n>>1)-1?(n>>1)-u:u,e.isubn(s)}else s=0;i.push(s);for(var l=0!==e.cmpn(0)&&0===e.andln(n-1)?r+1:1,o=1;o0||r.cmpn(-e)>0;){var s=t.andln(3)+n&3,u=r.andln(3)+e&3;3===s&&(s=-1),3===u&&(u=-1);var l;l=0==(1&s)?0:3!==(a=t.andln(7)+n&7)&&5!==a||2!==u?s:-s,i[0].push(l);var o;if(0==(1&u))o=0;else{var a=r.andln(7)+e&7;o=3!==a&&5!==a||2!==s?u:-u}i[1].push(o),2*n===l+1&&(n=1-n),2*e===o+1&&(e=1-e),t.iushrn(1),r.iushrn(1)}return i}function cachedProperty(t,r,i){var n="_"+r;t.prototype[r]=function(){return void 0!==this[n]?this[n]:this[n]=i.call(this)}}function parseBytes(t){return"string"==typeof t?utils.toArray(t,"hex"):t}function intFromLE(t){return new BN(t,"hex","le")}var utils=exports,BN=require("bn.js"),minAssert=require("minimalistic-assert"),minUtils=require("minimalistic-crypto-utils");utils.assert=minAssert,utils.toArray=minUtils.toArray,utils.zero2=minUtils.zero2,utils.toHex=minUtils.toHex,utils.encode=minUtils.encode,utils.getNAF=getNAF,utils.getJSF=getJSF,utils.cachedProperty=cachedProperty,utils.parseBytes=parseBytes,utils.intFromLE=intFromLE; + +},{"bn.js":4,"minimalistic-assert":63,"minimalistic-crypto-utils":64}],29:[function(require,module,exports){ +module.exports={ + "_args": [ + [ + "elliptic@6.4.0", + "/Users/hdrewes/Documents/DEV/EthereumJS/browser-builds" + ] + ], + "_from": "elliptic@6.4.0", + "_id": "elliptic@6.4.0", + "_inBundle": false, + "_integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "_location": "/elliptic", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "elliptic@6.4.0", + "name": "elliptic", + "escapedName": "elliptic", + "rawSpec": "6.4.0", + "saveSpec": null, + "fetchSpec": "6.4.0" + }, + "_requiredBy": [ + "/browserify-sign", + "/create-ecdh", + "/secp256k1" + ], + "_resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "_spec": "6.4.0", + "_where": "/Users/hdrewes/Documents/DEV/EthereumJS/browser-builds", + "author": { + "name": "Fedor Indutny", + "email": "fedor@indutny.com" + }, + "bugs": { + "url": "https://github.com/indutny/elliptic/issues" + }, + "dependencies": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + }, + "description": "EC cryptography", + "devDependencies": { + "brfs": "^1.4.3", + "coveralls": "^2.11.3", + "grunt": "^0.4.5", + "grunt-browserify": "^5.0.0", + "grunt-cli": "^1.2.0", + "grunt-contrib-connect": "^1.0.0", + "grunt-contrib-copy": "^1.0.0", + "grunt-contrib-uglify": "^1.0.1", + "grunt-mocha-istanbul": "^3.0.1", + "grunt-saucelabs": "^8.6.2", + "istanbul": "^0.4.2", + "jscs": "^2.9.0", + "jshint": "^2.6.0", + "mocha": "^2.1.0" + }, + "files": [ + "lib" + ], + "homepage": "https://github.com/indutny/elliptic", + "keywords": [ + "EC", + "Elliptic", + "curve", + "Cryptography" + ], + "license": "MIT", + "main": "lib/elliptic.js", + "name": "elliptic", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/indutny/elliptic.git" + }, + "scripts": { + "jscs": "jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js", + "jshint": "jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js", + "lint": "npm run jscs && npm run jshint", + "test": "npm run lint && npm run unit", + "unit": "istanbul test _mocha --reporter=spec test/index.js", + "version": "grunt dist && git add dist/" + }, + "version": "6.4.0" +} + +},{}],30:[function(require,module,exports){ +module.exports={ + "genesisGasLimit": { + "v": 5000, + "d": "Gas limit of the Genesis block." + }, + "genesisDifficulty": { + "v": 17179869184, + "d": "Difficulty of the Genesis block." + }, + "genesisNonce": { + "v": "0x0000000000000042", + "d": "the geneis nonce" + }, + "genesisExtraData": { + "v": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "d": "extra data " + }, + "genesisHash": { + "v": "0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3", + "d": "genesis hash" + }, + "genesisStateRoot": { + "v": "0xd7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544", + "d": "the genesis state root" + }, + "minGasLimit": { + "v": 5000, + "d": "Minimum the gas limit may ever be." + }, + "gasLimitBoundDivisor": { + "v": 1024, + "d": "The bound divisor of the gas limit, used in update calculations." + }, + "minimumDifficulty": { + "v": 131072, + "d": "The minimum that the difficulty may ever be." + }, + "difficultyBoundDivisor": { + "v": 2048, + "d": "The bound divisor of the difficulty, used in the update calculations." + }, + "durationLimit": { + "v": 13, + "d": "The decision boundary on the blocktime duration used to determine whether difficulty should go up or not." + }, + "maximumExtraDataSize": { + "v": 32, + "d": "Maximum size extra data may be after Genesis." + }, + "epochDuration": { + "v": 30000, + "d": "Duration between proof-of-work epochs." + }, + "stackLimit": { + "v": 1024, + "d": "Maximum size of VM stack allowed." + }, + "callCreateDepth": { + "v": 1024, + "d": "Maximum depth of call/create stack." + }, + + "tierStepGas": { + "v": [0, 2, 3, 5, 8, 10, 20], + "d": "Once per operation, for a selection of them." + }, + "expGas": { + "v": 10, + "d": "Once per EXP instuction." + }, + "expByteGas": { + "v": 10, + "d": "Times ceil(log256(exponent)) for the EXP instruction." + }, + + "sha3Gas": { + "v": 30, + "d": "Once per SHA3 operation." + }, + "sha3WordGas": { + "v": 6, + "d": "Once per word of the SHA3 operation's data." + }, + "sloadGas": { + "v": 50, + "d": "Once per SLOAD operation." + }, + "sstoreSetGas": { + "v": 20000, + "d": "Once per SSTORE operation if the zeroness changes from zero." + }, + "sstoreResetGas": { + "v": 5000, + "d": "Once per SSTORE operation if the zeroness does not change from zero." + }, + "sstoreRefundGas": { + "v": 15000, + "d": "Once per SSTORE operation if the zeroness changes to zero." + }, + "jumpdestGas": { + "v": 1, + "d": "Refunded gas, once per SSTORE operation if the zeroness changes to zero." + }, + + "logGas": { + "v": 375, + "d": "Per LOG* operation." + }, + "logDataGas": { + "v": 8, + "d": "Per byte in a LOG* operation's data." + }, + "logTopicGas": { + "v": 375, + "d": "Multiplied by the * of the LOG*, per LOG transaction. e.g. LOG0 incurs 0 * c_txLogTopicGas, LOG4 incurs 4 * c_txLogTopicGas." + }, + + "createGas": { + "v": 32000, + "d": "Once per CREATE operation & contract-creation transaction." + }, + + "callGas": { + "v": 40, + "d": "Once per CALL operation & message call transaction." + }, + "callStipend": { + "v": 2300, + "d": "Free gas given at beginning of call." + }, + "callValueTransferGas": { + "v": 9000, + "d": "Paid for CALL when the value transfor is non-zero." + }, + "callNewAccountGas": { + "v": 25000, + "d": "Paid for CALL when the destination address didn't exist prior." + }, + + "suicideRefundGas": { + "v": 24000, + "d": "Refunded following a suicide operation." + }, + + "memoryGas": { + "v": 3, + "d": "Times the address of the (highest referenced byte in memory + 1). NOTE: referencing happens on read, write and in instructions such as RETURN and CALL." + }, + "quadCoeffDiv": { + "v": 512, + "d": "Divisor for the quadratic particle of the memory cost equation." + }, + + "createDataGas": { + "v": 200, + "d": "" + }, + "txGas": { + "v": 21000, + "d": "Per transaction. NOTE: Not payable on data of calls between transactions." + }, + "txCreation": { + "v": 32000, + "d": "the cost of creating a contract via tx" + }, + "txDataZeroGas": { + "v": 4, + "d": "Per byte of data attached to a transaction that equals zero. NOTE: Not payable on data of calls between transactions." + }, + "txDataNonZeroGas": { + "v": 68, + "d": "Per byte of data attached to a transaction that is not equal to zero. NOTE: Not payable on data of calls between transactions." + }, + + "copyGas": { + "v": 3, + "d": "Multiplied by the number of 32-byte words that are copied (round up) for any *COPY operation and added." + }, + + "ecrecoverGas": { + "v": 3000, + "d": "" + }, + "sha256Gas": { + "v": 60, + "d": "" + }, + "sha256WordGas": { + "v": 12, + "d": "" + }, + "ripemd160Gas": { + "v": 600, + "d": "" + }, + "ripemd160WordGas": { + "v": 120, + "d": "" + }, + "identityGas": { + "v": 15, + "d": "" + }, + "identityWordGas": { + "v": 3, + "d": "" + }, + "minerReward": { + "v": "5000000000000000000", + "d": "the amount a miner get rewarded for mining a block" + }, + "ommerReward": { + "v": "625000000000000000", + "d": "The amount of wei a miner of an uncle block gets for being inculded in the blockchain" + }, + "niblingReward": { + "v": "156250000000000000", + "d": "the amount a miner gets for inculding a uncle" + }, + "homeSteadForkNumber": { + "v": 1150000, + "d": "the block that the Homestead fork started at" + }, + "homesteadRepriceForkNumber": { + "v": 2463000, + "d": "the block that the Homestead Reprice (EIP150) fork started at" + }, + "timebombPeriod": { + "v": 100000, + "d": "Exponential difficulty timebomb period" + }, + "freeBlockPeriod": { + "v": 2 + } +} + +},{}],31:[function(require,module,exports){ +(function (Buffer){ +"use strict";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var ethUtil=require("ethereumjs-util"),fees=require("ethereum-common/params.json"),BN=ethUtil.BN,N_DIV_2=new BN("7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0",16),Transaction=function(){function e(t){_classCallCheck(this,e),t=t||{};var i=[{name:"nonce",length:32,allowLess:!0,default:new Buffer([])},{name:"gasPrice",length:32,allowLess:!0,default:new Buffer([])},{name:"gasLimit",alias:"gas",length:32,allowLess:!0,default:new Buffer([])},{name:"to",allowZero:!0,length:20,default:new Buffer([])},{name:"value",length:32,allowLess:!0,default:new Buffer([])},{name:"data",alias:"input",allowZero:!0,default:new Buffer([])},{name:"v",allowZero:!0,default:new Buffer([28])},{name:"r",length:32,allowZero:!0,allowLess:!0,default:new Buffer([])},{name:"s",length:32,allowZero:!0,allowLess:!0,default:new Buffer([])}];ethUtil.defineProperties(this,i,t),Object.defineProperty(this,"from",{enumerable:!0,configurable:!0,get:this.getSenderAddress.bind(this)});var r=ethUtil.bufferToInt(this.v),s=Math.floor((r-35)/2);s<0&&(s=0),this._chainId=s||t.chainId||0,this._homestead=!0}return e.prototype.toCreationAddress=function(){return""===this.to.toString("hex")},e.prototype.hash=function(e){void 0===e&&(e=!0);var t=void 0;if(e)t=this.raw;else if(this._chainId>0){var i=this.raw.slice();this.v=this._chainId,this.r=0,this.s=0,t=this.raw,this.raw=i}else t=this.raw.slice(0,6);return ethUtil.rlphash(t)},e.prototype.getChainId=function(){return this._chainId},e.prototype.getSenderAddress=function(){if(this._from)return this._from;var e=this.getSenderPublicKey();return this._from=ethUtil.publicToAddress(e),this._from},e.prototype.getSenderPublicKey=function(){if(!(this._senderPubKey&&this._senderPubKey.length||this.verifySignature()))throw new Error("Invalid Signature");return this._senderPubKey},e.prototype.verifySignature=function(){var e=this.hash(!1);if(this._homestead&&1===new BN(this.s).cmp(N_DIV_2))return!1;try{var t=ethUtil.bufferToInt(this.v);this._chainId>0&&(t-=2*this._chainId+8),this._senderPubKey=ethUtil.ecrecover(e,t,this.r,this.s)}catch(e){return!1}return!!this._senderPubKey},e.prototype.sign=function(e){var t=this.hash(!1),i=ethUtil.ecsign(t,e);this._chainId>0&&(i.v+=2*this._chainId+8),Object.assign(this,i)},e.prototype.getDataFee=function(){for(var e=this.raw[5],t=new BN(0),i=0;i0&&t.push(["gas limit is too low. Need at least "+this.getBaseFee()]),void 0===e||!1===e?0===t.length:t.join(" ")},e}();module.exports=Transaction; + +}).call(this,require("buffer").Buffer) +},{"buffer":8,"ethereum-common/params.json":30,"ethereumjs-util":32}],32:[function(require,module,exports){ +(function (Buffer){ +"use strict";var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},createKeccakHash=require("keccak"),secp256k1=require("secp256k1"),assert=require("assert"),rlp=require("rlp"),BN=require("bn.js"),createHash=require("create-hash");Object.assign(exports,require("ethjs-util")),exports.MAX_INTEGER=new BN("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",16),exports.TWO_POW256=new BN("10000000000000000000000000000000000000000000000000000000000000000",16),exports.SHA3_NULL_S="c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",exports.SHA3_NULL=Buffer.from(exports.SHA3_NULL_S,"hex"),exports.SHA3_RLP_ARRAY_S="1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",exports.SHA3_RLP_ARRAY=Buffer.from(exports.SHA3_RLP_ARRAY_S,"hex"),exports.SHA3_RLP_S="56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",exports.SHA3_RLP=Buffer.from(exports.SHA3_RLP_S,"hex"),exports.BN=BN,exports.rlp=rlp,exports.secp256k1=secp256k1,exports.zeros=function(e){return Buffer.allocUnsafe(e).fill(0)},exports.setLengthLeft=exports.setLength=function(e,r,t){var f=exports.zeros(r);return e=exports.toBuffer(e),t?e.length0&&"0"===r.toString();)r=(e=e.slice(1))[0];return e},exports.toBuffer=function(e){if(!Buffer.isBuffer(e))if(Array.isArray(e))e=Buffer.from(e);else if("string"==typeof e)e=exports.isHexString(e)?Buffer.from(exports.padToEven(exports.stripHexPrefix(e)),"hex"):Buffer.from(e);else if("number"==typeof e)e=exports.intToBuffer(e);else if(null===e||void 0===e)e=Buffer.allocUnsafe(0);else{if(!e.toArray)throw new Error("invalid type");e=Buffer.from(e.toArray())}return e},exports.bufferToInt=function(e){return new BN(exports.toBuffer(e)).toNumber()},exports.bufferToHex=function(e){return"0x"+(e=exports.toBuffer(e)).toString("hex")},exports.fromSigned=function(e){return new BN(e).fromTwos(256)},exports.toUnsigned=function(e){return Buffer.from(e.toTwos(256).toArray())},exports.sha3=function(e,r){return e=exports.toBuffer(e),r||(r=256),createKeccakHash("keccak"+r).update(e).digest()},exports.sha256=function(e){return e=exports.toBuffer(e),createHash("sha256").update(e).digest()},exports.ripemd160=function(e,r){e=exports.toBuffer(e);var t=createHash("rmd160").update(e).digest();return!0===r?exports.setLength(t,32):t},exports.rlphash=function(e){return exports.sha3(rlp.encode(e))},exports.isValidPrivate=function(e){return secp256k1.privateKeyVerify(e)},exports.isValidPublic=function(e,r){return 64===e.length?secp256k1.publicKeyVerify(Buffer.concat([Buffer.from([4]),e])):!!r&&secp256k1.publicKeyVerify(e)},exports.pubToAddress=exports.publicToAddress=function(e,r){return e=exports.toBuffer(e),r&&64!==e.length&&(e=secp256k1.publicKeyConvert(e,!1).slice(1)),assert(64===e.length),exports.sha3(e).slice(-20)};var privateToPublic=exports.privateToPublic=function(e){return e=exports.toBuffer(e),secp256k1.publicKeyCreate(e,!1).slice(1)};exports.importPublic=function(e){return 64!==(e=exports.toBuffer(e)).length&&(e=secp256k1.publicKeyConvert(e,!1).slice(1)),e},exports.ecsign=function(e,r){var t=secp256k1.sign(e,r),f={};return f.r=t.signature.slice(0,32),f.s=t.signature.slice(32,64),f.v=t.recovery+27,f},exports.hashPersonalMessage=function(e){var r=exports.toBuffer("Ethereum Signed Message:\n"+e.length.toString());return exports.sha3(Buffer.concat([r,e]))},exports.ecrecover=function(e,r,t,f){var o=Buffer.concat([exports.setLength(t,32),exports.setLength(f,32)],64),s=r-27;if(0!==s&&1!==s)throw new Error("Invalid signature v value");var n=secp256k1.recover(e,o,s);return secp256k1.publicKeyConvert(n,!1).slice(1)},exports.toRpcSig=function(e,r,t){if(27!==e&&28!==e)throw new Error("Invalid recovery id");return exports.bufferToHex(Buffer.concat([exports.setLengthLeft(r,32),exports.setLengthLeft(t,32),exports.toBuffer(e-27)]))},exports.fromRpcSig=function(e){if(65!==(e=exports.toBuffer(e)).length)throw new Error("Invalid signature length");var r=e[64];return r<27&&(r+=27),{v:r,r:e.slice(0,32),s:e.slice(32,64)}},exports.privateToAddress=function(e){return exports.publicToAddress(privateToPublic(e))},exports.isValidAddress=function(e){return/^0x[0-9a-fA-F]{40}$/i.test(e)},exports.toChecksumAddress=function(e){e=exports.stripHexPrefix(e).toLowerCase();for(var r=exports.sha3(e).toString("hex"),t="0x",f=0;f=8?t+=e[f].toUpperCase():t+=e[f];return t},exports.isValidChecksumAddress=function(e){return exports.isValidAddress(e)&&exports.toChecksumAddress(e)===e},exports.generateAddress=function(e,r){return e=exports.toBuffer(e),r=new BN(r),r=r.isZero()?null:Buffer.from(r.toArray()),exports.rlphash([e,r]).slice(-20)},exports.isPrecompiled=function(e){var r=exports.unpad(e);return 1===r.length&&r[0]>0&&r[0]<5},exports.addHexPrefix=function(e){return"string"!=typeof e?e:exports.isHexPrefixed(e)?e:"0x"+e},exports.isValidSignature=function(e,r,t,f){var o=new BN("7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0",16),s=new BN("fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",16);return 32===r.length&&32===t.length&&((27===e||28===e)&&(r=new BN(r),t=new BN(t),!(r.isZero()||r.gt(s)||t.isZero()||t.gt(s))&&(!1!==f||1!==new BN(t).cmp(o))))},exports.baToJSON=function(e){if(Buffer.isBuffer(e))return"0x"+e.toString("hex");if(e instanceof Array){for(var r=[],t=0;t=f.length,"The field "+r.name+" must not have more "+r.length+" bytes")):r.allowZero&&0===f.length||!r.length||assert(r.length===f.length,"The field "+r.name+" must have byte length of "+r.length),e.raw[t]=f}e._fields.push(r.name),Object.defineProperty(e,r.name,{enumerable:!0,configurable:!0,get:f,set:o}),r.default&&(e[r.name]=r.default),r.alias&&Object.defineProperty(e,r.alias,{enumerable:!1,configurable:!0,set:o,get:f})}),t)if("string"==typeof t&&(t=Buffer.from(exports.stripHexPrefix(t),"hex")),Buffer.isBuffer(t)&&(t=rlp.decode(t)),Array.isArray(t)){if(t.length>e._fields.length)throw new Error("wrong number of fields in data");t.forEach(function(r,t){e[e._fields[t]]=exports.toBuffer(r)})}else{if("object"!==(void 0===t?"undefined":_typeof(t)))throw new Error("invalid data");var f=Object.keys(t);r.forEach(function(r){-1!==f.indexOf(r.name)&&(e[r.name]=t[r.name]),-1!==f.indexOf(r.alias)&&(e[r.alias]=t[r.alias])})}}; + +}).call(this,require("buffer").Buffer) +},{"assert":1,"bn.js":4,"buffer":8,"create-hash":11,"ethjs-util":34,"keccak":56,"rlp":81,"secp256k1":83}],33:[function(require,module,exports){ +(function (Buffer){ +const SHA3=require("keccakjs"),secp256k1=require("secp256k1"),assert=require("assert"),rlp=require("rlp"),BN=require("bn.js"),createHash=require("create-hash");exports.MAX_INTEGER=new BN("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",16),exports.TWO_POW256=new BN("10000000000000000000000000000000000000000000000000000000000000000",16),exports.SHA3_NULL_S="c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",exports.SHA3_NULL=new Buffer(exports.SHA3_NULL_S,"hex"),exports.SHA3_RLP_ARRAY_S="1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",exports.SHA3_RLP_ARRAY=new Buffer(exports.SHA3_RLP_ARRAY_S,"hex"),exports.SHA3_RLP_S="56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",exports.SHA3_RLP=new Buffer(exports.SHA3_RLP_S,"hex"),exports.BN=BN,exports.rlp=rlp,exports.secp256k1=secp256k1,exports.zeros=function(e){var r=new Buffer(e);return r.fill(0),r},exports.setLengthLeft=exports.setLength=function(e,r,t){var f=exports.zeros(r);return e=exports.toBuffer(e),t?e.length0&&"0"===r.toString();)r=(e=e.slice(1))[0];return e},exports.toBuffer=function(e){if(!Buffer.isBuffer(e))if(Array.isArray(e))e=new Buffer(e);else if("string"==typeof e)e=exports.isHexPrefixed(e)?new Buffer(exports.padToEven(exports.stripHexPrefix(e)),"hex"):new Buffer(e);else if("number"==typeof e)e=exports.intToBuffer(e);else if(null===e||void 0===e)e=new Buffer([]);else{if(!e.toArray)throw new Error("invalid type");e=new Buffer(e.toArray())}return e},exports.intToHex=function(e){assert(e%1==0,"number is not a integer"),assert(e>=0,"number must be positive");var r=e.toString(16);return r.length%2&&(r="0"+r),"0x"+r},exports.intToBuffer=function(e){var r=exports.intToHex(e);return new Buffer(r.slice(2),"hex")},exports.bufferToInt=function(e){return parseInt(exports.bufferToHex(e),16)},exports.bufferToHex=function(e){return 0===(e=exports.toBuffer(e)).length?0:"0x"+e.toString("hex")},exports.fromSigned=function(e){return new BN(e).fromTwos(256)},exports.toUnsigned=function(e){return new Buffer(e.toTwos(256).toArray())},exports.sha3=function(e,r){e=exports.toBuffer(e),r||(r=256);var t=new SHA3(r);return e&&t.update(e),new Buffer(t.digest("hex"),"hex")},exports.sha256=function(e){return e=exports.toBuffer(e),createHash("sha256").update(e).digest()},exports.ripemd160=function(e,r){e=exports.toBuffer(e);var t=createHash("rmd160").update(e).digest();return!0===r?exports.setLength(t,32):t},exports.rlphash=function(e){return exports.sha3(rlp.encode(e))},exports.isValidPrivate=function(e){return secp256k1.privateKeyVerify(e)},exports.isValidPublic=function(e,r){return 64===e.length?secp256k1.publicKeyVerify(Buffer.concat([new Buffer([4]),e])):!!r&&secp256k1.publicKeyVerify(e)},exports.pubToAddress=exports.publicToAddress=function(e,r){return e=exports.toBuffer(e),r&&64!==e.length&&(e=secp256k1.publicKeyConvert(e,!1).slice(1)),assert(64===e.length),exports.sha3(e).slice(-20)};var privateToPublic=exports.privateToPublic=function(e){return e=exports.toBuffer(e),secp256k1.publicKeyCreate(e,!1).slice(1)};exports.importPublic=function(e){return 64!==(e=exports.toBuffer(e)).length&&(e=secp256k1.publicKeyConvert(e,!1).slice(1)),e},exports.ecsign=function(e,r){var t=secp256k1.sign(e,r),f={};return f.r=t.signature.slice(0,32),f.s=t.signature.slice(32,64),f.v=t.recovery+27,f},exports.ecrecover=function(e,r,t,f){var s=Buffer.concat([exports.setLength(t,32),exports.setLength(f,32)],64),o=exports.bufferToInt(r)-27;if(0!==o&&1!==o)throw new Error("Invalid signature v value");var n=secp256k1.recover(e,s,o);return secp256k1.publicKeyConvert(n,!1).slice(1)},exports.toRpcSig=function(e,r,t){return exports.bufferToHex(Buffer.concat([r,t,exports.toBuffer(e-27)]))},exports.fromRpcSig=function(e){var r=(e=exports.toBuffer(e))[64];return r<27&&(r+=27),{v:r,r:e.slice(0,32),s:e.slice(32,64)}},exports.privateToAddress=function(e){return exports.publicToAddress(privateToPublic(e))},exports.isValidAddress=function(e){return/^0x[0-9a-fA-F]{40}$/i.test(e)},exports.toChecksumAddress=function(e){e=exports.stripHexPrefix(e).toLowerCase();for(var r=exports.sha3(e).toString("hex"),t="0x",f=0;f=8?t+=e[f].toUpperCase():t+=e[f];return t},exports.isValidChecksumAddress=function(e){return exports.isValidAddress(e)&&exports.toChecksumAddress(e)===e},exports.generateAddress=function(e,r){return e=exports.toBuffer(e),r=new BN(r),r=r.isZero()?null:new Buffer(r.toArray()),exports.rlphash([e,r]).slice(-20)},exports.isPrecompiled=function(e){var r=exports.unpad(e);return 1===r.length&&r[0]>0&&r[0]<5},exports.isHexPrefixed=function(e){return"0x"===e.slice(0,2)},exports.stripHexPrefix=function(e){return"string"!=typeof e?e:exports.isHexPrefixed(e)?e.slice(2):e},exports.addHexPrefix=function(e){return"string"!=typeof e?e:exports.isHexPrefixed(e)?e:"0x"+e},exports.padToEven=function(e){return e.length%2&&(e="0"+e),e},exports.baToJSON=function(e){if(Buffer.isBuffer(e))return"0x"+e.toString("hex");if(e instanceof Array){for(var r=[],t=0;t=f.length,"The field "+r.name+" must not have more "+r.length+" bytes")):r.allowZero&&0===f.length||!r.length||assert(r.length===f.length,"The field "+r.name+" must have byte length of "+r.length),e.raw[t]=f}e._fields.push(r.name),Object.defineProperty(e,r.name,{enumerable:!0,configurable:!0,get:f,set:s}),r.default&&(e[r.name]=r.default),r.alias&&Object.defineProperty(e,r.alias,{enumerable:!1,configurable:!0,set:s,get:f})}),t)if("string"==typeof t&&(t=new Buffer(exports.stripHexPrefix(t),"hex")),Buffer.isBuffer(t)&&(t=rlp.decode(t)),Array.isArray(t)){if(t.length>e._fields.length)throw new Error("wrong number of fields in data");t.forEach(function(r,t){e[e._fields[t]]=exports.toBuffer(r)})}else{if("object"!=typeof t)throw new Error("invalid data");for(var f in t)-1!==e._fields.indexOf(f)&&(e[f]=t[f])}}; + +}).call(this,require("buffer").Buffer) +},{"assert":1,"bn.js":4,"buffer":8,"create-hash":11,"keccakjs":62,"rlp":81,"secp256k1":83}],34:[function(require,module,exports){ +(function (Buffer){ +"use strict";function padToEven(r){var e=r;if("string"!=typeof e)throw new Error("[ethjs-util] while padding to even, value must be string, is currently "+typeof e+", while padToEven.");return e.length%2&&(e="0"+e),e}function intToHex(r){return"0x"+padToEven(r.toString(16))}function intToBuffer(r){var e=intToHex(r);return new Buffer(e.slice(2),"hex")}function getBinarySize(r){if("string"!=typeof r)throw new Error("[ethjs-util] while getting binary size, method getBinarySize requires input 'str' to be type String, got '"+typeof r+"'.");return Buffer.byteLength(r,"utf8")}function arrayContainsArray(r,e,t){if(!0!==Array.isArray(r))throw new Error("[ethjs-util] method arrayContainsArray requires input 'superset' to be an array got type '"+typeof r+"'");if(!0!==Array.isArray(e))throw new Error("[ethjs-util] method arrayContainsArray requires input 'subset' to be an array got type '"+typeof e+"'");return e[Boolean(t)&&"some"||"every"](function(e){return r.indexOf(e)>=0})}function toUtf8(r){return new Buffer(padToEven(stripHexPrefix(r).replace(/^0+|0+$/g,"")),"hex").toString("utf8")}function toAscii(r){var e="",t=0,i=r.length;for("0x"===r.substring(0,2)&&(t=2);t0&&this._events[e].length>i&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},EventEmitter.prototype.on=EventEmitter.prototype.addListener,EventEmitter.prototype.once=function(e,t){function i(){this.removeListener(e,i),n||(n=!0,t.apply(this,arguments))}if(!isFunction(t))throw TypeError("listener must be a function");var n=!1;return i.listener=t,this.on(e,i),this},EventEmitter.prototype.removeListener=function(e,t){var i,n,s,r;if(!isFunction(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(i=this._events[e],s=i.length,n=-1,i===t||isFunction(i.listener)&&i.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(isObject(i)){for(r=s;r-- >0;)if(i[r]===t||i[r].listener&&i[r].listener===t){n=r;break}if(n<0)return this;1===i.length?(i.length=0,delete this._events[e]):i.splice(n,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},EventEmitter.prototype.removeAllListeners=function(e){var t,i;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(i=this._events[e],isFunction(i))this.removeListener(e,i);else if(i)for(;i.length;)this.removeListener(e,i[i.length-1]);return delete this._events[e],this},EventEmitter.prototype.listeners=function(e){return this._events&&this._events[e]?isFunction(this._events[e])?[this._events[e]]:this._events[e].slice():[]},EventEmitter.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(isFunction(t))return 1;if(t)return t.length}return 0},EventEmitter.listenerCount=function(e,t){return e.listenerCount(t)}; + +},{}],36:[function(require,module,exports){ +(function (Buffer){ +"use strict";function HashBase(t){Transform.call(this),this._block=new Buffer(t),this._blockSize=t,this._blockOffset=0,this._length=[0,0,0,0],this._finalized=!1}var Transform=require("stream").Transform,inherits=require("inherits");inherits(HashBase,Transform),HashBase.prototype._transform=function(t,e,r){var s=null;try{"buffer"!==e&&(t=new Buffer(t,e)),this.update(t)}catch(t){s=t}r(s)},HashBase.prototype._flush=function(t){var e=null;try{this.push(this._digest())}catch(t){e=t}t(e)},HashBase.prototype.update=function(t,e){if(!Buffer.isBuffer(t)&&"string"!=typeof t)throw new TypeError("Data must be a string or a buffer");if(this._finalized)throw new Error("Digest already called");Buffer.isBuffer(t)||(t=new Buffer(t,e||"binary"));for(var r=this._block,s=0;this._blockOffset+t.length-s>=this._blockSize;){for(var i=this._blockOffset;i0;++o)this._length[o]+=a,(a=this._length[o]/4294967296|0)>0&&(this._length[o]-=4294967296*a);return this},HashBase.prototype._update=function(t){throw new Error("_update is not implemented")},HashBase.prototype.digest=function(t){if(this._finalized)throw new Error("Digest already called");this._finalized=!0;var e=this._digest();return void 0!==t&&(e=e.toString(t)),e},HashBase.prototype._digest=function(){throw new Error("_digest is not implemented")},module.exports=HashBase; + +}).call(this,require("buffer").Buffer) +},{"buffer":8,"inherits":51,"stream":97}],37:[function(require,module,exports){ +var hash=exports;hash.utils=require("./hash/utils"),hash.common=require("./hash/common"),hash.sha=require("./hash/sha"),hash.ripemd=require("./hash/ripemd"),hash.hmac=require("./hash/hmac"),hash.sha1=hash.sha.sha1,hash.sha256=hash.sha.sha256,hash.sha224=hash.sha.sha224,hash.sha384=hash.sha.sha384,hash.sha512=hash.sha.sha512,hash.ripemd160=hash.ripemd.ripemd160; + +},{"./hash/common":38,"./hash/hmac":39,"./hash/ripemd":40,"./hash/sha":41,"./hash/utils":48}],38:[function(require,module,exports){ +"use strict";function BlockHash(){this.pending=null,this.pendingTotal=0,this.blockSize=this.constructor.blockSize,this.outSize=this.constructor.outSize,this.hmacStrength=this.constructor.hmacStrength,this.padLength=this.constructor.padLength/8,this.endian="big",this._delta8=this.blockSize/8,this._delta32=this.blockSize/32}var utils=require("./utils"),assert=require("minimalistic-assert");exports.BlockHash=BlockHash,BlockHash.prototype.update=function(t,i){if(t=utils.toArray(t,i),this.pending?this.pending=this.pending.concat(t):this.pending=t,this.pendingTotal+=t.length,this.pending.length>=this._delta8){var n=(t=this.pending).length%this._delta8;this.pending=t.slice(t.length-n,t.length),0===this.pending.length&&(this.pending=null),t=utils.join32(t,0,t.length-n,this.endian);for(var s=0;s>>24&255,s[e++]=t>>>16&255,s[e++]=t>>>8&255,s[e++]=255&t}else for(s[e++]=255&t,s[e++]=t>>>8&255,s[e++]=t>>>16&255,s[e++]=t>>>24&255,s[e++]=0,s[e++]=0,s[e++]=0,s[e++]=0,h=8;hthis.blockSize&&(t=(new this.Hash).update(t).digest()),assert(t.length<=this.blockSize);for(var i=t.length;i>>3}function g1_256(r){return rotr32(r,17)^rotr32(r,19)^r>>>10}var utils=require("../utils"),rotr32=utils.rotr32;exports.ft_1=ft_1,exports.ch32=ch32,exports.maj32=maj32,exports.p32=p32,exports.s0_256=s0_256,exports.s1_256=s1_256,exports.g0_256=g0_256,exports.g1_256=g1_256; + +},{"../utils":48}],48:[function(require,module,exports){ +"use strict";function toArray(r,t){if(Array.isArray(r))return r.slice();if(!r)return[];var o=[];if("string"==typeof r)if(t){if("hex"===t)for((r=r.replace(/[^a-z0-9]+/gi,"")).length%2!=0&&(r="0"+r),n=0;n>8,u=255&e;s?o.push(s,u):o.push(u)}else for(n=0;n>>24|r>>>8&65280|r<<8&16711680|(255&r)<<24)>>>0}function toHex32(r,t){for(var o="",n=0;n>>0}return s}function split32(r,t){for(var o=new Array(4*r.length),n=0,e=0;n>>24,o[e+1]=s>>>16&255,o[e+2]=s>>>8&255,o[e+3]=255&s):(o[e+3]=s>>>24,o[e+2]=s>>>16&255,o[e+1]=s>>>8&255,o[e]=255&s)}return o}function rotr32(r,t){return r>>>t|r<<32-t}function rotl32(r,t){return r<>>32-t}function sum32(r,t){return r+t>>>0}function sum32_3(r,t,o){return r+t+o>>>0}function sum32_4(r,t,o,n){return r+t+o+n>>>0}function sum32_5(r,t,o,n,e){return r+t+o+n+e>>>0}function sum64(r,t,o,n){var e=r[t],s=n+r[t+1]>>>0,u=(s>>0,r[t+1]=s}function sum64_hi(r,t,o,n){return(t+n>>>0>>0}function sum64_lo(r,t,o,n){return t+n>>>0}function sum64_4_hi(r,t,o,n,e,s,u,i){var h=0,_=t;return h+=(_=_+n>>>0)>>0)>>0)>>0}function sum64_4_lo(r,t,o,n,e,s,u,i){return t+n+s+i>>>0}function sum64_5_hi(r,t,o,n,e,s,u,i,h,_){var l=0,f=t;return l+=(f=f+n>>>0)>>0)>>0)>>0)<_?1:0)>>>0}function sum64_5_lo(r,t,o,n,e,s,u,i,h,_){return t+n+s+i+_>>>0}function rotr64_hi(r,t,o){return(t<<32-o|r>>>o)>>>0}function rotr64_lo(r,t,o){return(r<<32-o|t>>>o)>>>0}function shr64_hi(r,t,o){return r>>>o}function shr64_lo(r,t,o){return(r<<32-o|t>>>o)>>>0}var assert=require("minimalistic-assert"),inherits=require("inherits");exports.inherits=inherits,exports.toArray=toArray,exports.toHex=toHex,exports.htonl=htonl,exports.toHex32=toHex32,exports.zero2=zero2,exports.zero8=zero8,exports.join32=join32,exports.split32=split32,exports.rotr32=rotr32,exports.rotl32=rotl32,exports.sum32=sum32,exports.sum32_3=sum32_3,exports.sum32_4=sum32_4,exports.sum32_5=sum32_5,exports.sum64=sum64,exports.sum64_hi=sum64_hi,exports.sum64_lo=sum64_lo,exports.sum64_4_hi=sum64_4_hi,exports.sum64_4_lo=sum64_4_lo,exports.sum64_5_hi=sum64_5_hi,exports.sum64_5_lo=sum64_5_lo,exports.rotr64_hi=rotr64_hi,exports.rotr64_lo=rotr64_lo,exports.shr64_hi=shr64_hi,exports.shr64_lo=shr64_lo; + +},{"inherits":51,"minimalistic-assert":63}],49:[function(require,module,exports){ +"use strict";function HmacDRBG(t){if(!(this instanceof HmacDRBG))return new HmacDRBG(t);this.hash=t.hash,this.predResist=!!t.predResist,this.outLen=this.hash.outSize,this.minEntropy=t.minEntropy||this.hash.hmacStrength,this._reseed=null,this.reseedInterval=null,this.K=null,this.V=null;var e=utils.toArray(t.entropy,t.entropyEnc||"hex"),i=utils.toArray(t.nonce,t.nonceEnc||"hex"),s=utils.toArray(t.pers,t.persEnc||"hex");assert(e.length>=this.minEntropy/8,"Not enough entropy. Minimum is: "+this.minEntropy+" bits"),this._init(e,i,s)}var hash=require("hash.js"),utils=require("minimalistic-crypto-utils"),assert=require("minimalistic-assert");module.exports=HmacDRBG,HmacDRBG.prototype._init=function(t,e,i){var s=t.concat(e).concat(i);this.K=new Array(this.outLen/8),this.V=new Array(this.outLen/8);for(var h=0;h=this.minEntropy/8,"Not enough entropy. Minimum is: "+this.minEntropy+" bits"),this._update(t.concat(i||[])),this._reseed=1},HmacDRBG.prototype.generate=function(t,e,i,s){if(this._reseed>this.reseedInterval)throw new Error("Reseed is required");"string"!=typeof e&&(s=i,i=e,e=null),i&&(i=utils.toArray(i,s||"hex"),this._update(i));for(var h=[];h.length>1,i=-7,N=t?h-1:0,n=t?-1:1,s=a[o+N];for(N+=n,M=s&(1<<-i)-1,s>>=-i,i+=w;i>0;M=256*M+a[o+N],N+=n,i-=8);for(p=M&(1<<-i)-1,M>>=-i,i+=r;i>0;p=256*p+a[o+N],N+=n,i-=8);if(0===M)M=1-e;else{if(M===f)return p?NaN:1/0*(s?-1:1);p+=Math.pow(2,r),M-=e}return(s?-1:1)*p*Math.pow(2,M-r)},exports.write=function(a,o,t,r,h,M){var p,w,f,e=8*M-h-1,i=(1<>1,n=23===h?Math.pow(2,-24)-Math.pow(2,-77):0,s=r?0:M-1,u=r?1:-1,l=o<0||0===o&&1/o<0?1:0;for(o=Math.abs(o),isNaN(o)||o===1/0?(w=isNaN(o)?1:0,p=i):(p=Math.floor(Math.log(o)/Math.LN2),o*(f=Math.pow(2,-p))<1&&(p--,f*=2),(o+=p+N>=1?n/f:n*Math.pow(2,1-N))*f>=2&&(p++,f/=2),p+N>=i?(w=0,p=i):p+N>=1?(w=(o*f-1)*Math.pow(2,h),p+=N):(w=o*Math.pow(2,N-1)*Math.pow(2,h),p=0));h>=8;a[t+s]=255&w,s+=u,w/=256,h-=8);for(p=p<0;a[t+s]=255&p,s+=u,p/=256,e-=8);a[t+s-u]|=128*l}; + +},{}],51:[function(require,module,exports){ +"function"==typeof Object.create?module.exports=function(t,e){t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:module.exports=function(t,e){t.super_=e;var o=function(){};o.prototype=e.prototype,t.prototype=new o,t.prototype.constructor=t}; + +},{}],52:[function(require,module,exports){ +function isBuffer(f){return!!f.constructor&&"function"==typeof f.constructor.isBuffer&&f.constructor.isBuffer(f)}function isSlowBuffer(f){return"function"==typeof f.readFloatLE&&"function"==typeof f.slice&&isBuffer(f.slice(0,0))}module.exports=function(f){return null!=f&&(isBuffer(f)||isSlowBuffer(f)||!!f._isBuffer)}; + +},{}],53:[function(require,module,exports){ +module.exports=function(e){if("string"!=typeof e)throw new Error("[is-hex-prefixed] value must be type 'string', is currently type "+typeof e+", while checking isHexPrefixed.");return"0x"===e.slice(0,2)}; + +},{}],54:[function(require,module,exports){ +var toString={}.toString;module.exports=Array.isArray||function(r){return"[object Array]"==toString.call(r)}; + +},{}],55:[function(require,module,exports){ +(function (global){ +!function(r,e){"use strict";var n="undefined"!=typeof module;n&&(r=global).JS_SHA3_TEST&&(r.navigator={userAgent:"Chrome"});var t=(r.JS_SHA3_TEST||!n)&&-1!=navigator.userAgent.indexOf("Chrome"),o="0123456789abcdef".split(""),a=[1,256,65536,16777216],c=[6,1536,393216,100663296],f=[0,8,16,24],u=[1,0,32898,0,32906,2147483648,2147516416,2147483648,32907,0,2147483649,0,2147516545,2147483648,32777,2147483648,138,0,136,0,2147516425,0,2147483658,0,2147516555,0,139,2147483648,32905,2147483648,32771,2147483648,32770,2147483648,128,2147483648,32778,0,2147483658,2147483648,2147516545,2147483648,32896,2147483648,2147483649,0,2147516424,2147483648],i=[],_=[],s=function(r){return v(r,224,a)},k=function(r){return v(r,256,a)},h=function(r){return v(r,384,a)},d=function(r){return v(r,224,c)},l=function(r){return v(r,256,c)},A=function(r){return v(r,384,c)},S=function(r){return v(r,512,c)},v=function(e,n,c){var s="string"!=typeof e;s&&e.constructor==r.ArrayBuffer&&(e=new Uint8Array(e)),void 0===n&&(n=512,c=a);var k,h,d,l,A,S,v,g,T,m,p,y,C,E,H,J,b,w,x,B,O,U,j,q,z,D,F,G,I,K,L,M,N,P,Q,R,V,W,X,Y,Z,$,rr,er,nr,tr,or,ar,cr,fr,ur,ir,_r,sr,kr,hr,dr,lr,Ar,Sr,vr,gr,Tr,mr,pr,yr,Cr=!1,Er=0,Hr=0,Jr=e.length,br=(1600-2*n)/32,wr=4*br;for(l=0;l<50;++l)_[l]=0;k=0;do{for(i[0]=k,l=1;l>2]|=e[Er]<>2]|=h<>2]|=(192|h>>6)<>2]|=(128|63&h)<=57344?(i[l>>2]|=(224|h>>12)<>2]|=(128|h>>6&63)<>2]|=(128|63&h)<>2]|=(240|h>>18)<>2]|=(128|h>>12&63)<>2]|=(128|h>>6&63)<>2]|=(128|63&h)<>2]|=c[3&l],++Er),k=i[br],Er>Jr&&l>>31),S=(J=_[9]^_[19]^_[29]^_[39]^_[49])^(m<<1|T>>>31),_[0]^=A,_[1]^=S,_[10]^=A,_[11]^=S,_[20]^=A,_[21]^=S,_[30]^=A,_[31]^=S,_[40]^=A,_[41]^=S,A=v^(p<<1|y>>>31),S=g^(y<<1|p>>>31),_[2]^=A,_[3]^=S,_[12]^=A,_[13]^=S,_[22]^=A,_[23]^=S,_[32]^=A,_[33]^=S,_[42]^=A,_[43]^=S,A=T^(C<<1|E>>>31),S=m^(E<<1|C>>>31),_[4]^=A,_[5]^=S,_[14]^=A,_[15]^=S,_[24]^=A,_[25]^=S,_[34]^=A,_[35]^=S,_[44]^=A,_[45]^=S,A=p^(H<<1|J>>>31),S=y^(J<<1|H>>>31),_[6]^=A,_[7]^=S,_[16]^=A,_[17]^=S,_[26]^=A,_[27]^=S,_[36]^=A,_[37]^=S,_[46]^=A,_[47]^=S,A=C^(v<<1|g>>>31),S=E^(g<<1|v>>>31),_[8]^=A,_[9]^=S,_[18]^=A,_[19]^=S,_[28]^=A,_[29]^=S,_[38]^=A,_[39]^=S,_[48]^=A,_[49]^=S,b=_[0],w=_[1],cr=_[11]<<4|_[10]>>>28,fr=_[10]<<4|_[11]>>>28,L=_[20]<<3|_[21]>>>29,M=_[21]<<3|_[20]>>>29,Tr=_[31]<<9|_[30]>>>23,mr=_[30]<<9|_[31]>>>23,nr=_[40]<<18|_[41]>>>14,tr=_[41]<<18|_[40]>>>14,V=_[2]<<1|_[3]>>>31,W=_[3]<<1|_[2]>>>31,x=_[13]<<12|_[12]>>>20,B=_[12]<<12|_[13]>>>20,ur=_[22]<<10|_[23]>>>22,ir=_[23]<<10|_[22]>>>22,N=_[33]<<13|_[32]>>>19,P=_[32]<<13|_[33]>>>19,pr=_[42]<<2|_[43]>>>30,yr=_[43]<<2|_[42]>>>30,dr=_[5]<<30|_[4]>>>2,lr=_[4]<<30|_[5]>>>2,X=_[14]<<6|_[15]>>>26,Y=_[15]<<6|_[14]>>>26,O=_[25]<<11|_[24]>>>21,U=_[24]<<11|_[25]>>>21,_r=_[34]<<15|_[35]>>>17,sr=_[35]<<15|_[34]>>>17,Q=_[45]<<29|_[44]>>>3,R=_[44]<<29|_[45]>>>3,F=_[6]<<28|_[7]>>>4,G=_[7]<<28|_[6]>>>4,Ar=_[17]<<23|_[16]>>>9,Sr=_[16]<<23|_[17]>>>9,Z=_[26]<<25|_[27]>>>7,$=_[27]<<25|_[26]>>>7,j=_[36]<<21|_[37]>>>11,q=_[37]<<21|_[36]>>>11,kr=_[47]<<24|_[46]>>>8,hr=_[46]<<24|_[47]>>>8,or=_[8]<<27|_[9]>>>5,ar=_[9]<<27|_[8]>>>5,I=_[18]<<20|_[19]>>>12,K=_[19]<<20|_[18]>>>12,vr=_[29]<<7|_[28]>>>25,gr=_[28]<<7|_[29]>>>25,rr=_[38]<<8|_[39]>>>24,er=_[39]<<8|_[38]>>>24,z=_[48]<<14|_[49]>>>18,D=_[49]<<14|_[48]>>>18,_[0]=b^~x&O,_[1]=w^~B&U,_[10]=F^~I&L,_[11]=G^~K&M,_[20]=V^~X&Z,_[21]=W^~Y&$,_[30]=or^~cr&ur,_[31]=ar^~fr&ir,_[40]=dr^~Ar&vr,_[41]=lr^~Sr&gr,_[2]=x^~O&j,_[3]=B^~U&q,_[12]=I^~L&N,_[13]=K^~M&P,_[22]=X^~Z&rr,_[23]=Y^~$&er,_[32]=cr^~ur&_r,_[33]=fr^~ir&sr,_[42]=Ar^~vr&Tr,_[43]=Sr^~gr&mr,_[4]=O^~j&z,_[5]=U^~q&D,_[14]=L^~N&Q,_[15]=M^~P&R,_[24]=Z^~rr&nr,_[25]=$^~er&tr,_[34]=ur^~_r&kr,_[35]=ir^~sr&hr,_[44]=vr^~Tr&pr,_[45]=gr^~mr&yr,_[6]=j^~z&b,_[7]=q^~D&w,_[16]=N^~Q&F,_[17]=P^~R&G,_[26]=rr^~nr&V,_[27]=er^~tr&W,_[36]=_r^~kr&or,_[37]=sr^~hr&ar,_[46]=Tr^~pr&dr,_[47]=mr^~yr&lr,_[8]=z^~b&x,_[9]=D^~w&B,_[18]=Q^~F&I,_[19]=R^~G&K,_[28]=nr^~V&X,_[29]=tr^~W&Y,_[38]=kr^~or&cr,_[39]=hr^~ar&fr,_[48]=pr^~dr&Ar,_[49]=yr^~lr&Sr,_[0]^=u[d],_[1]^=u[d+1]}while(!Cr);var xr="";if(t)b=_[0],w=_[1],x=_[2],B=_[3],O=_[4],U=_[5],j=_[6],q=_[7],z=_[8],D=_[9],F=_[10],G=_[11],I=_[12],K=_[13],L=_[14],M=_[15],xr+=o[b>>4&15]+o[15&b]+o[b>>12&15]+o[b>>8&15]+o[b>>20&15]+o[b>>16&15]+o[b>>28&15]+o[b>>24&15]+o[w>>4&15]+o[15&w]+o[w>>12&15]+o[w>>8&15]+o[w>>20&15]+o[w>>16&15]+o[w>>28&15]+o[w>>24&15]+o[x>>4&15]+o[15&x]+o[x>>12&15]+o[x>>8&15]+o[x>>20&15]+o[x>>16&15]+o[x>>28&15]+o[x>>24&15]+o[B>>4&15]+o[15&B]+o[B>>12&15]+o[B>>8&15]+o[B>>20&15]+o[B>>16&15]+o[B>>28&15]+o[B>>24&15]+o[O>>4&15]+o[15&O]+o[O>>12&15]+o[O>>8&15]+o[O>>20&15]+o[O>>16&15]+o[O>>28&15]+o[O>>24&15]+o[U>>4&15]+o[15&U]+o[U>>12&15]+o[U>>8&15]+o[U>>20&15]+o[U>>16&15]+o[U>>28&15]+o[U>>24&15]+o[j>>4&15]+o[15&j]+o[j>>12&15]+o[j>>8&15]+o[j>>20&15]+o[j>>16&15]+o[j>>28&15]+o[j>>24&15],n>=256&&(xr+=o[q>>4&15]+o[15&q]+o[q>>12&15]+o[q>>8&15]+o[q>>20&15]+o[q>>16&15]+o[q>>28&15]+o[q>>24&15]),n>=384&&(xr+=o[z>>4&15]+o[15&z]+o[z>>12&15]+o[z>>8&15]+o[z>>20&15]+o[z>>16&15]+o[z>>28&15]+o[z>>24&15]+o[D>>4&15]+o[15&D]+o[D>>12&15]+o[D>>8&15]+o[D>>20&15]+o[D>>16&15]+o[D>>28&15]+o[D>>24&15]+o[F>>4&15]+o[15&F]+o[F>>12&15]+o[F>>8&15]+o[F>>20&15]+o[F>>16&15]+o[F>>28&15]+o[F>>24&15]+o[G>>4&15]+o[15&G]+o[G>>12&15]+o[G>>8&15]+o[G>>20&15]+o[G>>16&15]+o[G>>28&15]+o[G>>24&15]),512==n&&(xr+=o[I>>4&15]+o[15&I]+o[I>>12&15]+o[I>>8&15]+o[I>>20&15]+o[I>>16&15]+o[I>>28&15]+o[I>>24&15]+o[K>>4&15]+o[15&K]+o[K>>12&15]+o[K>>8&15]+o[K>>20&15]+o[K>>16&15]+o[K>>28&15]+o[K>>24&15]+o[L>>4&15]+o[15&L]+o[L>>12&15]+o[L>>8&15]+o[L>>20&15]+o[L>>16&15]+o[L>>28&15]+o[L>>24&15]+o[M>>4&15]+o[15&M]+o[M>>12&15]+o[M>>8&15]+o[M>>20&15]+o[M>>16&15]+o[M>>28&15]+o[M>>24&15]);else for(l=0,d=n/32;l>4&15]+o[15&A]+o[A>>12&15]+o[A>>8&15]+o[A>>20&15]+o[A>>16&15]+o[A>>28&15]+o[A>>24&15];return xr};!r.JS_SHA3_TEST&&n?module.exports={sha3_512:S,sha3_384:A,sha3_256:l,sha3_224:d,keccak_512:v,keccak_384:h,keccak_256:k,keccak_224:s}:r&&(r.sha3_512=S,r.sha3_384=A,r.sha3_256=l,r.sha3_224=d,r.keccak_512=v,r.keccak_384=h,r.keccak_256=k,r.keccak_224=s)}(this); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],56:[function(require,module,exports){ +"use strict";module.exports=require("./lib/api")(require("./lib/keccak")); + +},{"./lib/api":57,"./lib/keccak":61}],57:[function(require,module,exports){ +"use strict";var createKeccak=require("./keccak"),createShake=require("./shake");module.exports=function(e){var r=createKeccak(e),a=createShake(e);return function(e,c){switch("string"==typeof e?e.toLowerCase():e){case"keccak224":return new r(1152,448,null,224,c);case"keccak256":return new r(1088,512,null,256,c);case"keccak384":return new r(832,768,null,384,c);case"keccak512":return new r(576,1024,null,512,c);case"sha3-224":return new r(1152,448,6,224,c);case"sha3-256":return new r(1088,512,6,256,c);case"sha3-384":return new r(832,768,6,384,c);case"sha3-512":return new r(576,1024,6,512,c);case"shake128":return new a(1344,256,31,c);case"shake256":return new a(1088,512,31,c);default:throw new Error("Invald algorithm: "+e)}}}; + +},{"./keccak":58,"./shake":59}],58:[function(require,module,exports){ +"use strict";var Buffer=require("safe-buffer").Buffer,Transform=require("stream").Transform,inherits=require("inherits");module.exports=function(t){function i(i,e,r,s,a){Transform.call(this,a),this._rate=i,this._capacity=e,this._delimitedSuffix=r,this._hashBitLength=s,this._options=a,this._state=new t,this._state.initialize(i,e),this._finalized=!1}return inherits(i,Transform),i.prototype._transform=function(t,i,e){var r=null;try{this.update(t,i)}catch(t){r=t}e(r)},i.prototype._flush=function(t){var i=null;try{this.push(this.digest())}catch(t){i=t}t(i)},i.prototype.update=function(t,i){if(!Buffer.isBuffer(t)&&"string"!=typeof t)throw new TypeError("Data must be a string or a buffer");if(this._finalized)throw new Error("Digest already called");return Buffer.isBuffer(t)||(t=Buffer.from(t,i)),this._state.absorb(t),this},i.prototype.digest=function(t){if(this._finalized)throw new Error("Digest already called");this._finalized=!0,this._delimitedSuffix&&this._state.absorbLastFewBits(this._delimitedSuffix);var i=this._state.squeeze(this._hashBitLength/8);return void 0!==t&&(i=i.toString(t)),this._resetState(),i},i.prototype._resetState=function(){return this._state.initialize(this._rate,this._capacity),this},i.prototype._clone=function(){var t=new i(this._rate,this._capacity,this._delimitedSuffix,this._hashBitLength,this._options);return this._state.copy(t._state),t._finalized=this._finalized,t},i}; + +},{"inherits":51,"safe-buffer":82,"stream":97}],59:[function(require,module,exports){ +"use strict";var Buffer=require("safe-buffer").Buffer,Transform=require("stream").Transform,inherits=require("inherits");module.exports=function(t){function i(i,e,r,s){Transform.call(this,s),this._rate=i,this._capacity=e,this._delimitedSuffix=r,this._options=s,this._state=new t,this._state.initialize(i,e),this._finalized=!1}return inherits(i,Transform),i.prototype._transform=function(t,i,e){var r=null;try{this.update(t,i)}catch(t){r=t}e(r)},i.prototype._flush=function(){},i.prototype._read=function(t){this.push(this.squeeze(t))},i.prototype.update=function(t,i){if(!Buffer.isBuffer(t)&&"string"!=typeof t)throw new TypeError("Data must be a string or a buffer");if(this._finalized)throw new Error("Squeeze already called");return Buffer.isBuffer(t)||(t=Buffer.from(t,i)),this._state.absorb(t),this},i.prototype.squeeze=function(t,i){this._finalized||(this._finalized=!0,this._state.absorbLastFewBits(this._delimitedSuffix));var e=this._state.squeeze(t);return void 0!==i&&(e=e.toString(i)),e},i.prototype._resetState=function(){return this._state.initialize(this._rate,this._capacity),this},i.prototype._clone=function(){var t=new i(this._rate,this._capacity,this._delimitedSuffix,this._options);return this._state.copy(t._state),t._finalized=this._finalized,t},i}; + +},{"inherits":51,"safe-buffer":82,"stream":97}],60:[function(require,module,exports){ +"use strict";var P1600_ROUND_CONSTANTS=[1,0,32898,0,32906,2147483648,2147516416,2147483648,32907,0,2147483649,0,2147516545,2147483648,32777,2147483648,138,0,136,0,2147516425,0,2147483658,0,2147516555,0,139,2147483648,32905,2147483648,32771,2147483648,32770,2147483648,128,2147483648,32778,0,2147483658,2147483648,2147516545,2147483648,32896,2147483648,2147483649,0,2147516424,2147483648];exports.p1600=function(r){for(var N=0;N<24;++N){var a=r[0]^r[10]^r[20]^r[30]^r[40],v=r[1]^r[11]^r[21]^r[31]^r[41],O=r[2]^r[12]^r[22]^r[32]^r[42],S=r[3]^r[13]^r[23]^r[33]^r[43],T=r[4]^r[14]^r[24]^r[34]^r[44],_=r[5]^r[15]^r[25]^r[35]^r[45],t=r[6]^r[16]^r[26]^r[36]^r[46],o=r[7]^r[17]^r[27]^r[37]^r[47],s=r[8]^r[18]^r[28]^r[38]^r[48],A=r[9]^r[19]^r[29]^r[39]^r[49],C=s^(O<<1|S>>>31),D=A^(S<<1|O>>>31),P=r[0]^C,R=r[1]^D,U=r[10]^C,c=r[11]^D,e=r[20]^C,f=r[21]^D,i=r[30]^C,n=r[31]^D,p=r[40]^C,u=r[41]^D;C=a^(T<<1|_>>>31),D=v^(_<<1|T>>>31);var x=r[2]^C,b=r[3]^D,d=r[12]^C,g=r[13]^D,h=r[22]^C,j=r[23]^D,k=r[32]^C,l=r[33]^D,m=r[42]^C,q=r[43]^D;C=O^(t<<1|o>>>31),D=S^(o<<1|t>>>31);var w=r[4]^C,y=r[5]^D,z=r[14]^C,B=r[15]^D,E=r[24]^C,F=r[25]^D,G=r[34]^C,H=r[35]^D,I=r[44]^C,J=r[45]^D;C=T^(s<<1|A>>>31),D=_^(A<<1|s>>>31);var K=r[6]^C,L=r[7]^D,M=r[16]^C,Q=r[17]^D,V=r[26]^C,W=r[27]^D,X=r[36]^C,Y=r[37]^D,Z=r[46]^C,$=r[47]^D;C=t^(a<<1|v>>>31),D=o^(v<<1|a>>>31);var rr=r[8]^C,Nr=r[9]^D,ar=r[18]^C,vr=r[19]^D,Or=r[28]^C,Sr=r[29]^D,Tr=r[38]^C,_r=r[39]^D,tr=r[48]^C,or=r[49]^D,sr=P,Ar=R,Cr=c<<4|U>>>28,Dr=U<<4|c>>>28,Pr=e<<3|f>>>29,Rr=f<<3|e>>>29,Ur=n<<9|i>>>23,cr=i<<9|n>>>23,er=p<<18|u>>>14,fr=u<<18|p>>>14,ir=x<<1|b>>>31,nr=b<<1|x>>>31,pr=g<<12|d>>>20,ur=d<<12|g>>>20,xr=h<<10|j>>>22,br=j<<10|h>>>22,dr=l<<13|k>>>19,gr=k<<13|l>>>19,hr=m<<2|q>>>30,jr=q<<2|m>>>30,kr=y<<30|w>>>2,lr=w<<30|y>>>2,mr=z<<6|B>>>26,qr=B<<6|z>>>26,wr=F<<11|E>>>21,yr=E<<11|F>>>21,zr=G<<15|H>>>17,Br=H<<15|G>>>17,Er=J<<29|I>>>3,Fr=I<<29|J>>>3,Gr=K<<28|L>>>4,Hr=L<<28|K>>>4,Ir=Q<<23|M>>>9,Jr=M<<23|Q>>>9,Kr=V<<25|W>>>7,Lr=W<<25|V>>>7,Mr=X<<21|Y>>>11,Qr=Y<<21|X>>>11,Vr=$<<24|Z>>>8,Wr=Z<<24|$>>>8,Xr=rr<<27|Nr>>>5,Yr=Nr<<27|rr>>>5,Zr=ar<<20|vr>>>12,$r=vr<<20|ar>>>12,rN=Sr<<7|Or>>>25,NN=Or<<7|Sr>>>25,aN=Tr<<8|_r>>>24,vN=_r<<8|Tr>>>24,ON=tr<<14|or>>>18,SN=or<<14|tr>>>18;r[0]=sr^~pr&wr,r[1]=Ar^~ur&yr,r[10]=Gr^~Zr&Pr,r[11]=Hr^~$r&Rr,r[20]=ir^~mr&Kr,r[21]=nr^~qr&Lr,r[30]=Xr^~Cr&xr,r[31]=Yr^~Dr&br,r[40]=kr^~Ir&rN,r[41]=lr^~Jr&NN,r[2]=pr^~wr&Mr,r[3]=ur^~yr&Qr,r[12]=Zr^~Pr&dr,r[13]=$r^~Rr&gr,r[22]=mr^~Kr&aN,r[23]=qr^~Lr&vN,r[32]=Cr^~xr&zr,r[33]=Dr^~br&Br,r[42]=Ir^~rN&Ur,r[43]=Jr^~NN&cr,r[4]=wr^~Mr&ON,r[5]=yr^~Qr&SN,r[14]=Pr^~dr&Er,r[15]=Rr^~gr&Fr,r[24]=Kr^~aN&er,r[25]=Lr^~vN&fr,r[34]=xr^~zr&Vr,r[35]=br^~Br&Wr,r[44]=rN^~Ur&hr,r[45]=NN^~cr&jr,r[6]=Mr^~ON&sr,r[7]=Qr^~SN&Ar,r[16]=dr^~Er&Gr,r[17]=gr^~Fr&Hr,r[26]=aN^~er&ir,r[27]=vN^~fr&nr,r[36]=zr^~Vr&Xr,r[37]=Br^~Wr&Yr,r[46]=Ur^~hr&kr,r[47]=cr^~jr&lr,r[8]=ON^~sr&pr,r[9]=SN^~Ar&ur,r[18]=Er^~Gr&Zr,r[19]=Fr^~Hr&$r,r[28]=er^~ir&mr,r[29]=fr^~nr&qr,r[38]=Vr^~Xr&Cr,r[39]=Wr^~Yr&Dr,r[48]=hr^~kr&Ir,r[49]=jr^~lr&Jr,r[0]^=P1600_ROUND_CONSTANTS[2*N],r[1]^=P1600_ROUND_CONSTANTS[2*N+1]}}; + +},{}],61:[function(require,module,exports){ +"use strict";function Keccak(){this.state=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],this.blockSize=null,this.count=0,this.squeezing=!1}var Buffer=require("safe-buffer").Buffer,keccakState=require("./keccak-state-unroll");Keccak.prototype.initialize=function(t,e){for(var s=0;s<50;++s)this.state[s]=0;this.blockSize=t/8,this.count=0,this.squeezing=!1},Keccak.prototype.absorb=function(t){for(var e=0;e>>this.count%4*8&255,this.count+=1,this.count===this.blockSize&&(keccakState.p1600(this.state),this.count=0);return e},Keccak.prototype.copy=function(t){for(var e=0;e<50;++e)t.state[e]=this.state[e];t.blockSize=this.blockSize,t.count=this.count,t.squeezing=this.squeezing},module.exports=Keccak; + +},{"./keccak-state-unroll":60,"safe-buffer":82}],62:[function(require,module,exports){ +module.exports=require("browserify-sha3").SHA3Hash; + +},{"browserify-sha3":7}],63:[function(require,module,exports){ +function assert(r,e){if(!r)throw new Error(e||"Assertion failed")}module.exports=assert,assert.equal=function(r,e,s){if(r!=e)throw new Error(s||"Assertion failed: "+r+" != "+e)}; + +},{}],64:[function(require,module,exports){ +"use strict";function toArray(r,t){if(Array.isArray(r))return r.slice();if(!r)return[];var e=[];if("string"!=typeof r){for(n=0;n>8,i=255&o;u?e.push(u,i):e.push(i)}return e}function zero2(r){return 1===r.length?"0"+r:r}function toHex(r){for(var t="",e=0;e1)for(var r=1;r0?("string"==typeof t||i.objectMode||Object.getPrototypeOf(t)===Buffer.prototype||(t=_uint8ArrayToBuffer(t)),n?i.endEmitted?e.emit("error",new Error("stream.unshift() after end event")):addChunk(e,i,t,!0):i.ended?e.emit("error",new Error("stream.push() after EOF")):(i.reading=!1,i.decoder&&!r?(t=i.decoder.write(t),i.objectMode||0!==t.length?addChunk(e,i,t,!1):maybeReadMore(e,i)):addChunk(e,i,t,!1))):n||(i.reading=!1)}return needMoreData(i)}function addChunk(e,t,r,n){t.flowing&&0===t.length&&!t.sync?(e.emit("data",r),e.read(0)):(t.length+=t.objectMode?1:r.length,n?t.buffer.unshift(r):t.buffer.push(r),t.needReadable&&emitReadable(e)),maybeReadMore(e,t)}function chunkInvalid(e,t){var r;return _isUint8Array(t)||"string"==typeof t||void 0===t||e.objectMode||(r=new TypeError("Invalid non-string/buffer chunk")),r}function needMoreData(e){return!e.ended&&(e.needReadable||e.length=MAX_HWM?e=MAX_HWM:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}function howMuchToRead(e,t){return e<=0||0===t.length&&t.ended?0:t.objectMode?1:e!==e?t.flowing&&t.length?t.buffer.head.data.length:t.length:(e>t.highWaterMark&&(t.highWaterMark=computeNewHighWaterMark(e)),e<=t.length?e:t.ended?t.length:(t.needReadable=!0,0))}function onEofChunk(e,t){if(!t.ended){if(t.decoder){var r=t.decoder.end();r&&r.length&&(t.buffer.push(r),t.length+=t.objectMode?1:r.length)}t.ended=!0,emitReadable(e)}}function emitReadable(e){var t=e._readableState;t.needReadable=!1,t.emittedReadable||(debug("emitReadable",t.flowing),t.emittedReadable=!0,t.sync?processNextTick(emitReadable_,e):emitReadable_(e))}function emitReadable_(e){debug("emit readable"),e.emit("readable"),flow(e)}function maybeReadMore(e,t){t.readingMore||(t.readingMore=!0,processNextTick(maybeReadMore_,e,t))}function maybeReadMore_(e,t){for(var r=t.length;!t.reading&&!t.flowing&&!t.ended&&t.length=t.length?(r=t.decoder?t.buffer.join(""):1===t.buffer.length?t.buffer.head.data:t.buffer.concat(t.length),t.buffer.clear()):r=fromListPartial(e,t.buffer,t.decoder),r}function fromListPartial(e,t,r){var n;return ei.length?i.length:e;if(d===i.length?a+=i:a+=i.slice(0,e),0===(e-=d)){d===i.length?(++n,r.next?t.head=r.next:t.head=t.tail=null):(t.head=r,r.data=i.slice(d));break}++n}return t.length-=n,a}function copyFromBuffer(e,t){var r=Buffer.allocUnsafe(e),n=t.head,a=1;for(n.data.copy(r),e-=n.data.length;n=n.next;){var i=n.data,d=e>i.length?i.length:e;if(i.copy(r,r.length-e,0,d),0===(e-=d)){d===i.length?(++a,n.next?t.head=n.next:t.head=t.tail=null):(t.head=n,n.data=i.slice(d));break}++a}return t.length-=a,r}function endReadable(e){var t=e._readableState;if(t.length>0)throw new Error('"endReadable()" called on non-empty stream');t.endEmitted||(t.ended=!0,processNextTick(endReadableNT,t,e))}function endReadableNT(e,t){e.endEmitted||0!==e.length||(e.endEmitted=!0,t.readable=!1,t.emit("end"))}function forEach(e,t){for(var r=0,n=e.length;r=t.highWaterMark||t.ended))return debug("read: emitReadable",t.length,t.ended),0===t.length&&t.ended?endReadable(this):emitReadable(this),null;if(0===(e=howMuchToRead(e,t))&&t.ended)return 0===t.length&&endReadable(this),null;var n=t.needReadable;debug("need readable",n),(0===t.length||t.length-e0?fromList(e,t):null)?(t.needReadable=!0,e=0):t.length-=e,0===t.length&&(t.ended||(t.needReadable=!0),r!==e&&t.ended&&endReadable(this)),null!==a&&this.emit("data",a),a},Readable.prototype._read=function(e){this.emit("error",new Error("_read() is not implemented"))},Readable.prototype.pipe=function(e,t){function r(e,t){debug("onunpipe"),e===l&&t&&!1===t.hasUnpiped&&(t.hasUnpiped=!0,a())}function n(){debug("onend"),e.end()}function a(){debug("cleanup"),e.removeListener("close",o),e.removeListener("finish",u),e.removeListener("drain",p),e.removeListener("error",d),e.removeListener("unpipe",r),l.removeListener("end",n),l.removeListener("end",s),l.removeListener("data",i),c=!0,!h.awaitDrain||e._writableState&&!e._writableState.needDrain||p()}function i(t){debug("ondata"),b=!1,!1!==e.write(t)||b||((1===h.pipesCount&&h.pipes===e||h.pipesCount>1&&-1!==indexOf(h.pipes,e))&&!c&&(debug("false write response, pause",l._readableState.awaitDrain),l._readableState.awaitDrain++,b=!0),l.pause())}function d(t){debug("onerror",t),s(),e.removeListener("error",d),0===EElistenerCount(e,"error")&&e.emit("error",t)}function o(){e.removeListener("finish",u),s()}function u(){debug("onfinish"),e.removeListener("close",o),s()}function s(){debug("unpipe"),l.unpipe(e)}var l=this,h=this._readableState;switch(h.pipesCount){case 0:h.pipes=e;break;case 1:h.pipes=[h.pipes,e];break;default:h.pipes.push(e)}h.pipesCount+=1,debug("pipe count=%d opts=%j",h.pipesCount,t);var f=(!t||!1!==t.end)&&e!==process.stdout&&e!==process.stderr?n:s;h.endEmitted?processNextTick(f):l.once("end",f),e.on("unpipe",r);var p=pipeOnDrain(l);e.on("drain",p);var c=!1,b=!1;return l.on("data",i),prependListener(e,"error",d),e.once("close",o),e.once("finish",u),e.emit("pipe",l),h.flowing||(debug("pipe resume"),l.resume()),e},Readable.prototype.unpipe=function(e){var t=this._readableState,r={hasUnpiped:!1};if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes?this:(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit("unpipe",this,r),this);if(!e){var n=t.pipes,a=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var i=0;i-1?setImmediate:processNextTick,Duplex;Writable.WritableState=WritableState;var util=require("core-util-is");util.inherits=require("inherits");var internalUtil={deprecate:require("util-deprecate")},Stream=require("./internal/streams/stream"),Buffer=require("safe-buffer").Buffer,OurUint8Array=global.Uint8Array||function(){},destroyImpl=require("./internal/streams/destroy");util.inherits(Writable,Stream),WritableState.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t},function(){try{Object.defineProperty(WritableState.prototype,"buffer",{get:internalUtil.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(e){}}();var realHasInstance;"function"==typeof Symbol&&Symbol.hasInstance&&"function"==typeof Function.prototype[Symbol.hasInstance]?(realHasInstance=Function.prototype[Symbol.hasInstance],Object.defineProperty(Writable,Symbol.hasInstance,{value:function(e){return!!realHasInstance.call(this,e)||e&&e._writableState instanceof WritableState}})):realHasInstance=function(e){return e instanceof this},Writable.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))},Writable.prototype.write=function(e,t,r){var i=this._writableState,n=!1,o=_isUint8Array(e)&&!i.objectMode;return o&&!Buffer.isBuffer(e)&&(e=_uint8ArrayToBuffer(e)),"function"==typeof t&&(r=t,t=null),o?t="buffer":t||(t=i.defaultEncoding),"function"!=typeof r&&(r=nop),i.ended?writeAfterEnd(this,r):(o||validChunk(this,i,e,r))&&(i.pendingcb++,n=writeOrBuffer(this,i,o,e,t,r)),n},Writable.prototype.cork=function(){this._writableState.corked++},Writable.prototype.uncork=function(){var e=this._writableState;e.corked&&(e.corked--,e.writing||e.corked||e.finished||e.bufferProcessing||!e.bufferedRequest||clearBuffer(this,e))},Writable.prototype.setDefaultEncoding=function(e){if("string"==typeof e&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new TypeError("Unknown encoding: "+e);return this._writableState.defaultEncoding=e,this},Writable.prototype._write=function(e,t,r){r(new Error("_write() is not implemented"))},Writable.prototype._writev=null,Writable.prototype.end=function(e,t,r){var i=this._writableState;"function"==typeof e?(r=e,e=null,t=null):"function"==typeof t&&(r=t,t=null),null!==e&&void 0!==e&&this.write(e,t),i.corked&&(i.corked=1,this.uncork()),i.ending||i.finished||endWritable(this,i,r)},Object.defineProperty(Writable.prototype,"destroyed",{get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(e){this._writableState&&(this._writableState.destroyed=e)}}),Writable.prototype.destroy=destroyImpl.destroy,Writable.prototype._undestroy=destroyImpl.undestroy,Writable.prototype._destroy=function(e,t){this.end(),t(e)}; + +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./_stream_duplex":68,"./internal/streams/destroy":74,"./internal/streams/stream":75,"_process":66,"core-util-is":10,"inherits":51,"process-nextick-args":65,"safe-buffer":82,"util-deprecate":100}],73:[function(require,module,exports){ +"use strict";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function copyBuffer(t,e,h){t.copy(e,h)}var Buffer=require("safe-buffer").Buffer;module.exports=function(){function t(){_classCallCheck(this,t),this.head=null,this.tail=null,this.length=0}return t.prototype.push=function(t){var e={data:t,next:null};this.length>0?this.tail.next=e:this.head=e,this.tail=e,++this.length},t.prototype.unshift=function(t){var e={data:t,next:this.head};0===this.length&&(this.tail=e),this.head=e,++this.length},t.prototype.shift=function(){if(0!==this.length){var t=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,t}},t.prototype.clear=function(){this.head=this.tail=null,this.length=0},t.prototype.join=function(t){if(0===this.length)return"";for(var e=this.head,h=""+e.data;e=e.next;)h+=t+e.data;return h},t.prototype.concat=function(t){if(0===this.length)return Buffer.alloc(0);if(1===this.length)return this.head.data;for(var e=Buffer.allocUnsafe(t>>>0),h=this.head,n=0;h;)copyBuffer(h.data,e,n),n+=h.data.length,h=h.next;return e},t}(); + +},{"safe-buffer":82}],74:[function(require,module,exports){ +"use strict";function destroy(t,e){var r=this,i=this._readableState&&this._readableState.destroyed,a=this._writableState&&this._writableState.destroyed;i||a?e?e(t):!t||this._writableState&&this._writableState.errorEmitted||processNextTick(emitErrorNT,this,t):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(t||null,function(t){!e&&t?(processNextTick(emitErrorNT,r,t),r._writableState&&(r._writableState.errorEmitted=!0)):e&&e(t)}))}function undestroy(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}function emitErrorNT(t,e){t.emit("error",e)}var processNextTick=require("process-nextick-args");module.exports={destroy:destroy,undestroy:undestroy}; + +},{"process-nextick-args":65}],75:[function(require,module,exports){ +module.exports=require("events").EventEmitter; + +},{"events":35}],76:[function(require,module,exports){ +module.exports=require("./readable").PassThrough; + +},{"./readable":77}],77:[function(require,module,exports){ +exports=module.exports=require("./lib/_stream_readable.js"),exports.Stream=exports,exports.Readable=exports,exports.Writable=require("./lib/_stream_writable.js"),exports.Duplex=require("./lib/_stream_duplex.js"),exports.Transform=require("./lib/_stream_transform.js"),exports.PassThrough=require("./lib/_stream_passthrough.js"); + +},{"./lib/_stream_duplex.js":68,"./lib/_stream_passthrough.js":69,"./lib/_stream_readable.js":70,"./lib/_stream_transform.js":71,"./lib/_stream_writable.js":72}],78:[function(require,module,exports){ +module.exports=require("./readable").Transform; + +},{"./readable":77}],79:[function(require,module,exports){ +module.exports=require("./lib/_stream_writable.js"); + +},{"./lib/_stream_writable.js":72}],80:[function(require,module,exports){ +(function (Buffer){ +"use strict";function RIPEMD160(){HashBase.call(this,64),this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520}function rotl(t,r){return t<>>32-r}function fn1(t,r,n,o,f,l,i,s){return rotl(t+(r^n^o)+l+i|0,s)+f|0}function fn2(t,r,n,o,f,l,i,s){return rotl(t+(r&n|~r&o)+l+i|0,s)+f|0}function fn3(t,r,n,o,f,l,i,s){return rotl(t+((r|~n)^o)+l+i|0,s)+f|0}function fn4(t,r,n,o,f,l,i,s){return rotl(t+(r&o|n&~o)+l+i|0,s)+f|0}function fn5(t,r,n,o,f,l,i,s){return rotl(t+(r^(n|~o))+l+i|0,s)+f|0}var inherits=require("inherits"),HashBase=require("hash-base");inherits(RIPEMD160,HashBase),RIPEMD160.prototype._update=function(){for(var t=new Array(16),r=0;r<16;++r)t[r]=this._block.readInt32LE(4*r);var n=this._a,o=this._b,f=this._c,l=this._d,i=this._e;i=fn1(i,n=fn1(n,o,f,l,i,t[0],0,11),o,f=rotl(f,10),l,t[1],0,14),o=fn1(o=rotl(o,10),f=fn1(f,l=fn1(l,i,n,o,f,t[2],0,15),i,n=rotl(n,10),o,t[3],0,12),l,i=rotl(i,10),n,t[4],0,5),l=fn1(l=rotl(l,10),i=fn1(i,n=fn1(n,o,f,l,i,t[5],0,8),o,f=rotl(f,10),l,t[6],0,7),n,o=rotl(o,10),f,t[7],0,9),n=fn1(n=rotl(n,10),o=fn1(o,f=fn1(f,l,i,n,o,t[8],0,11),l,i=rotl(i,10),n,t[9],0,13),f,l=rotl(l,10),i,t[10],0,14),f=fn1(f=rotl(f,10),l=fn1(l,i=fn1(i,n,o,f,l,t[11],0,15),n,o=rotl(o,10),f,t[12],0,6),i,n=rotl(n,10),o,t[13],0,7),i=fn2(i=rotl(i,10),n=fn1(n,o=fn1(o,f,l,i,n,t[14],0,9),f,l=rotl(l,10),i,t[15],0,8),o,f=rotl(f,10),l,t[7],1518500249,7),o=fn2(o=rotl(o,10),f=fn2(f,l=fn2(l,i,n,o,f,t[4],1518500249,6),i,n=rotl(n,10),o,t[13],1518500249,8),l,i=rotl(i,10),n,t[1],1518500249,13),l=fn2(l=rotl(l,10),i=fn2(i,n=fn2(n,o,f,l,i,t[10],1518500249,11),o,f=rotl(f,10),l,t[6],1518500249,9),n,o=rotl(o,10),f,t[15],1518500249,7),n=fn2(n=rotl(n,10),o=fn2(o,f=fn2(f,l,i,n,o,t[3],1518500249,15),l,i=rotl(i,10),n,t[12],1518500249,7),f,l=rotl(l,10),i,t[0],1518500249,12),f=fn2(f=rotl(f,10),l=fn2(l,i=fn2(i,n,o,f,l,t[9],1518500249,15),n,o=rotl(o,10),f,t[5],1518500249,9),i,n=rotl(n,10),o,t[2],1518500249,11),i=fn2(i=rotl(i,10),n=fn2(n,o=fn2(o,f,l,i,n,t[14],1518500249,7),f,l=rotl(l,10),i,t[11],1518500249,13),o,f=rotl(f,10),l,t[8],1518500249,12),o=fn3(o=rotl(o,10),f=fn3(f,l=fn3(l,i,n,o,f,t[3],1859775393,11),i,n=rotl(n,10),o,t[10],1859775393,13),l,i=rotl(i,10),n,t[14],1859775393,6),l=fn3(l=rotl(l,10),i=fn3(i,n=fn3(n,o,f,l,i,t[4],1859775393,7),o,f=rotl(f,10),l,t[9],1859775393,14),n,o=rotl(o,10),f,t[15],1859775393,9),n=fn3(n=rotl(n,10),o=fn3(o,f=fn3(f,l,i,n,o,t[8],1859775393,13),l,i=rotl(i,10),n,t[1],1859775393,15),f,l=rotl(l,10),i,t[2],1859775393,14),f=fn3(f=rotl(f,10),l=fn3(l,i=fn3(i,n,o,f,l,t[7],1859775393,8),n,o=rotl(o,10),f,t[0],1859775393,13),i,n=rotl(n,10),o,t[6],1859775393,6),i=fn3(i=rotl(i,10),n=fn3(n,o=fn3(o,f,l,i,n,t[13],1859775393,5),f,l=rotl(l,10),i,t[11],1859775393,12),o,f=rotl(f,10),l,t[5],1859775393,7),o=fn4(o=rotl(o,10),f=fn4(f,l=fn3(l,i,n,o,f,t[12],1859775393,5),i,n=rotl(n,10),o,t[1],2400959708,11),l,i=rotl(i,10),n,t[9],2400959708,12),l=fn4(l=rotl(l,10),i=fn4(i,n=fn4(n,o,f,l,i,t[11],2400959708,14),o,f=rotl(f,10),l,t[10],2400959708,15),n,o=rotl(o,10),f,t[0],2400959708,14),n=fn4(n=rotl(n,10),o=fn4(o,f=fn4(f,l,i,n,o,t[8],2400959708,15),l,i=rotl(i,10),n,t[12],2400959708,9),f,l=rotl(l,10),i,t[4],2400959708,8),f=fn4(f=rotl(f,10),l=fn4(l,i=fn4(i,n,o,f,l,t[13],2400959708,9),n,o=rotl(o,10),f,t[3],2400959708,14),i,n=rotl(n,10),o,t[7],2400959708,5),i=fn4(i=rotl(i,10),n=fn4(n,o=fn4(o,f,l,i,n,t[15],2400959708,6),f,l=rotl(l,10),i,t[14],2400959708,8),o,f=rotl(f,10),l,t[5],2400959708,6),o=fn5(o=rotl(o,10),f=fn4(f,l=fn4(l,i,n,o,f,t[6],2400959708,5),i,n=rotl(n,10),o,t[2],2400959708,12),l,i=rotl(i,10),n,t[4],2840853838,9),l=fn5(l=rotl(l,10),i=fn5(i,n=fn5(n,o,f,l,i,t[0],2840853838,15),o,f=rotl(f,10),l,t[5],2840853838,5),n,o=rotl(o,10),f,t[9],2840853838,11),n=fn5(n=rotl(n,10),o=fn5(o,f=fn5(f,l,i,n,o,t[7],2840853838,6),l,i=rotl(i,10),n,t[12],2840853838,8),f,l=rotl(l,10),i,t[2],2840853838,13),f=fn5(f=rotl(f,10),l=fn5(l,i=fn5(i,n,o,f,l,t[10],2840853838,12),n,o=rotl(o,10),f,t[14],2840853838,5),i,n=rotl(n,10),o,t[1],2840853838,12),i=fn5(i=rotl(i,10),n=fn5(n,o=fn5(o,f,l,i,n,t[3],2840853838,13),f,l=rotl(l,10),i,t[8],2840853838,14),o,f=rotl(f,10),l,t[11],2840853838,11),o=fn5(o=rotl(o,10),f=fn5(f,l=fn5(l,i,n,o,f,t[6],2840853838,8),i,n=rotl(n,10),o,t[15],2840853838,5),l,i=rotl(i,10),n,t[13],2840853838,6),l=rotl(l,10);var s=this._a,h=this._b,e=this._c,_=this._d,c=this._e;c=fn5(c,s=fn5(s,h,e,_,c,t[5],1352829926,8),h,e=rotl(e,10),_,t[14],1352829926,9),h=fn5(h=rotl(h,10),e=fn5(e,_=fn5(_,c,s,h,e,t[7],1352829926,9),c,s=rotl(s,10),h,t[0],1352829926,11),_,c=rotl(c,10),s,t[9],1352829926,13),_=fn5(_=rotl(_,10),c=fn5(c,s=fn5(s,h,e,_,c,t[2],1352829926,15),h,e=rotl(e,10),_,t[11],1352829926,15),s,h=rotl(h,10),e,t[4],1352829926,5),s=fn5(s=rotl(s,10),h=fn5(h,e=fn5(e,_,c,s,h,t[13],1352829926,7),_,c=rotl(c,10),s,t[6],1352829926,7),e,_=rotl(_,10),c,t[15],1352829926,8),e=fn5(e=rotl(e,10),_=fn5(_,c=fn5(c,s,h,e,_,t[8],1352829926,11),s,h=rotl(h,10),e,t[1],1352829926,14),c,s=rotl(s,10),h,t[10],1352829926,14),c=fn4(c=rotl(c,10),s=fn5(s,h=fn5(h,e,_,c,s,t[3],1352829926,12),e,_=rotl(_,10),c,t[12],1352829926,6),h,e=rotl(e,10),_,t[6],1548603684,9),h=fn4(h=rotl(h,10),e=fn4(e,_=fn4(_,c,s,h,e,t[11],1548603684,13),c,s=rotl(s,10),h,t[3],1548603684,15),_,c=rotl(c,10),s,t[7],1548603684,7),_=fn4(_=rotl(_,10),c=fn4(c,s=fn4(s,h,e,_,c,t[0],1548603684,12),h,e=rotl(e,10),_,t[13],1548603684,8),s,h=rotl(h,10),e,t[5],1548603684,9),s=fn4(s=rotl(s,10),h=fn4(h,e=fn4(e,_,c,s,h,t[10],1548603684,11),_,c=rotl(c,10),s,t[14],1548603684,7),e,_=rotl(_,10),c,t[15],1548603684,7),e=fn4(e=rotl(e,10),_=fn4(_,c=fn4(c,s,h,e,_,t[8],1548603684,12),s,h=rotl(h,10),e,t[12],1548603684,7),c,s=rotl(s,10),h,t[4],1548603684,6),c=fn4(c=rotl(c,10),s=fn4(s,h=fn4(h,e,_,c,s,t[9],1548603684,15),e,_=rotl(_,10),c,t[1],1548603684,13),h,e=rotl(e,10),_,t[2],1548603684,11),h=fn3(h=rotl(h,10),e=fn3(e,_=fn3(_,c,s,h,e,t[15],1836072691,9),c,s=rotl(s,10),h,t[5],1836072691,7),_,c=rotl(c,10),s,t[1],1836072691,15),_=fn3(_=rotl(_,10),c=fn3(c,s=fn3(s,h,e,_,c,t[3],1836072691,11),h,e=rotl(e,10),_,t[7],1836072691,8),s,h=rotl(h,10),e,t[14],1836072691,6),s=fn3(s=rotl(s,10),h=fn3(h,e=fn3(e,_,c,s,h,t[6],1836072691,6),_,c=rotl(c,10),s,t[9],1836072691,14),e,_=rotl(_,10),c,t[11],1836072691,12),e=fn3(e=rotl(e,10),_=fn3(_,c=fn3(c,s,h,e,_,t[8],1836072691,13),s,h=rotl(h,10),e,t[12],1836072691,5),c,s=rotl(s,10),h,t[2],1836072691,14),c=fn3(c=rotl(c,10),s=fn3(s,h=fn3(h,e,_,c,s,t[10],1836072691,13),e,_=rotl(_,10),c,t[0],1836072691,13),h,e=rotl(e,10),_,t[4],1836072691,7),h=fn2(h=rotl(h,10),e=fn2(e,_=fn3(_,c,s,h,e,t[13],1836072691,5),c,s=rotl(s,10),h,t[8],2053994217,15),_,c=rotl(c,10),s,t[6],2053994217,5),_=fn2(_=rotl(_,10),c=fn2(c,s=fn2(s,h,e,_,c,t[4],2053994217,8),h,e=rotl(e,10),_,t[1],2053994217,11),s,h=rotl(h,10),e,t[3],2053994217,14),s=fn2(s=rotl(s,10),h=fn2(h,e=fn2(e,_,c,s,h,t[11],2053994217,14),_,c=rotl(c,10),s,t[15],2053994217,6),e,_=rotl(_,10),c,t[0],2053994217,14),e=fn2(e=rotl(e,10),_=fn2(_,c=fn2(c,s,h,e,_,t[5],2053994217,6),s,h=rotl(h,10),e,t[12],2053994217,9),c,s=rotl(s,10),h,t[2],2053994217,12),c=fn2(c=rotl(c,10),s=fn2(s,h=fn2(h,e,_,c,s,t[13],2053994217,9),e,_=rotl(_,10),c,t[9],2053994217,12),h,e=rotl(e,10),_,t[7],2053994217,5),h=fn1(h=rotl(h,10),e=fn2(e,_=fn2(_,c,s,h,e,t[10],2053994217,15),c,s=rotl(s,10),h,t[14],2053994217,8),_,c=rotl(c,10),s,t[12],0,8),_=fn1(_=rotl(_,10),c=fn1(c,s=fn1(s,h,e,_,c,t[15],0,5),h,e=rotl(e,10),_,t[10],0,12),s,h=rotl(h,10),e,t[4],0,9),s=fn1(s=rotl(s,10),h=fn1(h,e=fn1(e,_,c,s,h,t[1],0,12),_,c=rotl(c,10),s,t[5],0,5),e,_=rotl(_,10),c,t[8],0,14),e=fn1(e=rotl(e,10),_=fn1(_,c=fn1(c,s,h,e,_,t[7],0,6),s,h=rotl(h,10),e,t[6],0,8),c,s=rotl(s,10),h,t[2],0,13),c=fn1(c=rotl(c,10),s=fn1(s,h=fn1(h,e,_,c,s,t[13],0,6),e,_=rotl(_,10),c,t[14],0,5),h,e=rotl(e,10),_,t[0],0,15),h=fn1(h=rotl(h,10),e=fn1(e,_=fn1(_,c,s,h,e,t[3],0,13),c,s=rotl(s,10),h,t[9],0,11),_,c=rotl(c,10),s,t[11],0,11),_=rotl(_,10);var a=this._b+f+_|0;this._b=this._c+l+c|0,this._c=this._d+i+s|0,this._d=this._e+n+h|0,this._e=this._a+o+e|0,this._a=a},RIPEMD160.prototype._digest=function(){this._block[this._blockOffset++]=128,this._blockOffset>56&&(this._block.fill(0,this._blockOffset,64),this._update(),this._blockOffset=0),this._block.fill(0,this._blockOffset,56),this._block.writeUInt32LE(this._length[0],56),this._block.writeUInt32LE(this._length[1],60),this._update();var t=new Buffer(20);return t.writeInt32LE(this._a,0),t.writeInt32LE(this._b,4),t.writeInt32LE(this._c,8),t.writeInt32LE(this._d,12),t.writeInt32LE(this._e,16),t},module.exports=RIPEMD160; + +}).call(this,require("buffer").Buffer) +},{"buffer":8,"hash-base":36,"inherits":51}],81:[function(require,module,exports){ +(function (Buffer){ +function safeParseInt(e,r){if("00"===e.slice(0,2))throw new Error("invalid RLP: extra zeros");return parseInt(e,r)}function encodeLength(e,r){if(e<56)return new Buffer([e+r]);var n=intToHex(e),t=intToHex(r+55+n.length/2);return new Buffer(t+n,"hex")}function _decode(e){var r,n,t,i,f,a=[],o=e[0];if(o<=127)return{data:e.slice(0,1),remainder:e.slice(1)};if(o<=183){if(r=o-127,t=128===o?new Buffer([]):e.slice(1,r),2===r&&t[0]<128)throw new Error("invalid rlp encoding: byte must be less 0x80");return{data:t,remainder:e.slice(r)}}if(o<=191){if(n=o-182,r=safeParseInt(e.slice(1,n).toString("hex"),16),(t=e.slice(n,r+n)).lengthe.length)throw new Error("invalid rlp: total length is larger than the data");if(0===(i=e.slice(n,u)).length)throw new Error("invalid rlp, List has a invalid length");for(;i.length;)f=_decode(i),a.push(f.data),i=f.remainder;return{data:a,remainder:e.slice(u)}}function isHexPrefixed(e){return"0x"===e.slice(0,2)}function stripHexPrefix(e){return"string"!=typeof e?e:isHexPrefixed(e)?e.slice(2):e}function intToHex(e){var r=e.toString(16);return r.length%2&&(r="0"+r),r}function padToEven(e){return e.length%2&&(e="0"+e),e}function intToBuffer(e){var r=intToHex(e);return new Buffer(r,"hex")}function toBuffer(e){if(!Buffer.isBuffer(e))if("string"==typeof e)e=isHexPrefixed(e)?new Buffer(padToEven(stripHexPrefix(e)),"hex"):new Buffer(e);else if("number"==typeof e)e=e?intToBuffer(e):new Buffer([]);else if(null===e||void 0===e)e=new Buffer([]);else{if(!e.toArray)throw new Error("invalid type");e=new Buffer(e.toArray())}return e}const assert=require("assert");exports.encode=function(e){if(e instanceof Array){for(var r=[],n=0;n=o)throw RangeError(e)}; + +}).call(this,{"isBuffer":require("../../is-buffer/index.js")}) +},{"../../is-buffer/index.js":52}],85:[function(require,module,exports){ +"use strict";var Buffer=require("safe-buffer").Buffer,bip66=require("bip66"),EC_PRIVKEY_EXPORT_DER_COMPRESSED=Buffer.from([48,129,211,2,1,1,4,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,129,133,48,129,130,2,1,1,48,44,6,7,42,134,72,206,61,1,1,2,33,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,255,255,252,47,48,6,4,1,0,4,1,7,4,33,2,121,190,102,126,249,220,187,172,85,160,98,149,206,135,11,7,2,155,252,219,45,206,40,217,89,242,129,91,22,248,23,152,2,33,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,186,174,220,230,175,72,160,59,191,210,94,140,208,54,65,65,2,1,1,161,36,3,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),EC_PRIVKEY_EXPORT_DER_UNCOMPRESSED=Buffer.from([48,130,1,19,2,1,1,4,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,129,165,48,129,162,2,1,1,48,44,6,7,42,134,72,206,61,1,1,2,33,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,255,255,252,47,48,6,4,1,0,4,1,7,4,65,4,121,190,102,126,249,220,187,172,85,160,98,149,206,135,11,7,2,155,252,219,45,206,40,217,89,242,129,91,22,248,23,152,72,58,218,119,38,163,196,101,93,164,251,252,14,17,8,168,253,23,180,72,166,133,84,25,156,71,208,143,251,16,212,184,2,33,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,186,174,220,230,175,72,160,59,191,210,94,140,208,54,65,65,2,1,1,161,68,3,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),ZERO_BUFFER_32=Buffer.from([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]);exports.privateKeyExport=function(r,f,e){var o=Buffer.from(e?EC_PRIVKEY_EXPORT_DER_COMPRESSED:EC_PRIVKEY_EXPORT_DER_UNCOMPRESSED);return r.copy(o,e?8:9),f.copy(o,e?181:214),o},exports.privateKeyImport=function(r){var f=r.length,e=0;if(!(f2||f1?r[e+o-2]<<8:0);if(e+=o,!(f32||f1&&0===f[o]&&!(128&f[o+1]);--e,++o);for(var t=Buffer.concat([Buffer.from([0]),r.s]),i=33,n=0;i>1&&0===t[n]&&!(128&t[n+1]);--i,++n);return bip66.encode(f.slice(o),t.slice(n))},exports.signatureImport=function(r){var f=Buffer.from(ZERO_BUFFER_32),e=Buffer.from(ZERO_BUFFER_32);try{var o=bip66.decode(r);if(33===o.r.length&&0===o.r[0]&&(o.r=o.r.slice(1)),o.r.length>32)throw new Error("R length is too long");if(33===o.s.length&&0===o.s[0]&&(o.s=o.s.slice(1)),o.s.length>32)throw new Error("S length is too long")}catch(r){return}return o.r.copy(f,32-o.r.length),o.s.copy(e,32-o.s.length),{r:f,s:e}},exports.signatureImportLax=function(r){var f=Buffer.from(ZERO_BUFFER_32),e=Buffer.from(ZERO_BUFFER_32),o=r.length,t=0;if(48===r[t++]){var i=r[t++];if(!(128&i&&(t+=i-128)>o)&&2===r[t++]){var n=r[t++];if(128&n){if(i=n-128,t+i>o)return;for(;i>0&&0===r[t];t+=1,i-=1);for(n=0;i>0;t+=1,i-=1)n=(n<<8)+r[t]}if(!(n>o-t)){var E=t;if(t+=n,2===r[t++]){var u=r[t++];if(128&u){if(i=u-128,t+i>o)return;for(;i>0&&0===r[t];t+=1,i-=1);for(u=0;i>0;t+=1,i-=1)u=(u<<8)+r[t]}if(!(u>o-t)){var s=t;for(t+=u;n>0&&0===r[E];n-=1,E+=1);if(!(n>32)){var a=r.slice(E,E+n);for(a.copy(f,32-a.length);u>0&&0===r[s];u-=1,s+=1);if(!(u>32)){var c=r.slice(s,s+u);return c.copy(e,32-c.length),{r:f,s:e}}}}}}}}}; + +},{"bip66":3,"safe-buffer":82}],86:[function(require,module,exports){ +"use strict";function loadCompressedPublicKey(e,r){var n=new BN(r);if(n.cmp(ecparams.p)>=0)return null;var s=(n=n.toRed(ecparams.red)).redSqr().redIMul(n).redIAdd(ecparams.b).redSqrt();return 3===e!==s.isOdd()&&(s=s.redNeg()),ec.keyPair({pub:{x:n,y:s}})}function loadUncompressedPublicKey(e,r,n){var s=new BN(r),a=new BN(n);if(s.cmp(ecparams.p)>=0||a.cmp(ecparams.p)>=0)return null;if(s=s.toRed(ecparams.red),a=a.toRed(ecparams.red),(6===e||7===e)&&a.isOdd()!==(7===e))return null;var c=s.redSqr().redIMul(s);return a.redSqr().redISub(c.redIAdd(ecparams.b)).isZero()?ec.keyPair({pub:{x:s,y:a}}):null}function loadPublicKey(e){var r=e[0];switch(r){case 2:case 3:return 33!==e.length?null:loadCompressedPublicKey(r,e.slice(1,33));case 4:case 6:case 7:return 65!==e.length?null:loadUncompressedPublicKey(r,e.slice(1,33),e.slice(33,65));default:return null}}var Buffer=require("safe-buffer").Buffer,createHash=require("create-hash"),BN=require("bn.js"),EC=require("elliptic").ec,messages=require("../messages.json"),ec=new EC("secp256k1"),ecparams=ec.curve;exports.privateKeyVerify=function(e){var r=new BN(e);return r.cmp(ecparams.n)<0&&!r.isZero()},exports.privateKeyExport=function(e,r){var n=new BN(e);if(n.cmp(ecparams.n)>=0||n.isZero())throw new Error(messages.EC_PRIVATE_KEY_EXPORT_DER_FAIL);return Buffer.from(ec.keyFromPrivate(e).getPublic(r,!0))},exports.privateKeyTweakAdd=function(e,r){var n=new BN(r);if(n.cmp(ecparams.n)>=0)throw new Error(messages.EC_PRIVATE_KEY_TWEAK_ADD_FAIL);if(n.iadd(new BN(e)),n.cmp(ecparams.n)>=0&&n.isub(ecparams.n),n.isZero())throw new Error(messages.EC_PRIVATE_KEY_TWEAK_ADD_FAIL);return n.toArrayLike(Buffer,"be",32)},exports.privateKeyTweakMul=function(e,r){var n=new BN(r);if(n.cmp(ecparams.n)>=0||n.isZero())throw new Error(messages.EC_PRIVATE_KEY_TWEAK_MUL_FAIL);return n.imul(new BN(e)),n.cmp(ecparams.n)&&(n=n.umod(ecparams.n)),n.toArrayLike(Buffer,"be",32)},exports.publicKeyCreate=function(e,r){var n=new BN(e);if(n.cmp(ecparams.n)>=0||n.isZero())throw new Error(messages.EC_PUBLIC_KEY_CREATE_FAIL);return Buffer.from(ec.keyFromPrivate(e).getPublic(r,!0))},exports.publicKeyConvert=function(e,r){var n=loadPublicKey(e);if(null===n)throw new Error(messages.EC_PUBLIC_KEY_PARSE_FAIL);return Buffer.from(n.getPublic(r,!0))},exports.publicKeyVerify=function(e){return null!==loadPublicKey(e)},exports.publicKeyTweakAdd=function(e,r,n){var s=loadPublicKey(e);if(null===s)throw new Error(messages.EC_PUBLIC_KEY_PARSE_FAIL);if((r=new BN(r)).cmp(ecparams.n)>=0)throw new Error(messages.EC_PUBLIC_KEY_TWEAK_ADD_FAIL);return Buffer.from(ecparams.g.mul(r).add(s.pub).encode(!0,n))},exports.publicKeyTweakMul=function(e,r,n){var s=loadPublicKey(e);if(null===s)throw new Error(messages.EC_PUBLIC_KEY_PARSE_FAIL);if((r=new BN(r)).cmp(ecparams.n)>=0||r.isZero())throw new Error(messages.EC_PUBLIC_KEY_TWEAK_MUL_FAIL);return Buffer.from(s.pub.mul(r).encode(!0,n))},exports.publicKeyCombine=function(e,r){for(var n=new Array(e.length),s=0;s=0||n.cmp(ecparams.n)>=0)throw new Error(messages.ECDSA_SIGNATURE_PARSE_FAIL);var s=Buffer.from(e);return 1===n.cmp(ec.nh)&&ecparams.n.sub(n).toArrayLike(Buffer,"be",32).copy(s,32),s},exports.signatureExport=function(e){var r=e.slice(0,32),n=e.slice(32,64);if(new BN(r).cmp(ecparams.n)>=0||new BN(n).cmp(ecparams.n)>=0)throw new Error(messages.ECDSA_SIGNATURE_PARSE_FAIL);return{r:r,s:n}},exports.signatureImport=function(e){var r=new BN(e.r);r.cmp(ecparams.n)>=0&&(r=new BN(0));var n=new BN(e.s);return n.cmp(ecparams.n)>=0&&(n=new BN(0)),Buffer.concat([r.toArrayLike(Buffer,"be",32),n.toArrayLike(Buffer,"be",32)])},exports.sign=function(e,r,n,s){if("function"==typeof n){var a=n;n=function(n){var c=a(e,r,null,s,n);if(!Buffer.isBuffer(c)||32!==c.length)throw new Error(messages.ECDSA_SIGN_FAIL);return new BN(c)}}var c=new BN(r);if(c.cmp(ecparams.n)>=0||c.isZero())throw new Error(messages.ECDSA_SIGN_FAIL);var o=ec.sign(e,r,{canonical:!0,k:n,pers:s});return{signature:Buffer.concat([o.r.toArrayLike(Buffer,"be",32),o.s.toArrayLike(Buffer,"be",32)]),recovery:o.recoveryParam}},exports.verify=function(e,r,n){var s={r:r.slice(0,32),s:r.slice(32,64)},a=new BN(s.r),c=new BN(s.s);if(a.cmp(ecparams.n)>=0||c.cmp(ecparams.n)>=0)throw new Error(messages.ECDSA_SIGNATURE_PARSE_FAIL);if(1===c.cmp(ec.nh)||a.isZero()||c.isZero())return!1;var o=loadPublicKey(n);if(null===o)throw new Error(messages.EC_PUBLIC_KEY_PARSE_FAIL);return ec.verify(e,s,{x:o.pub.x,y:o.pub.y})},exports.recover=function(e,r,n,s){var a={r:r.slice(0,32),s:r.slice(32,64)},c=new BN(a.r),o=new BN(a.s);if(c.cmp(ecparams.n)>=0||o.cmp(ecparams.n)>=0)throw new Error(messages.ECDSA_SIGNATURE_PARSE_FAIL);try{if(c.isZero()||o.isZero())throw new Error;var u=ec.recoverPubKey(e,a,n);return Buffer.from(u.encode(!0,s))}catch(e){throw new Error(messages.ECDSA_RECOVER_FAIL)}},exports.ecdh=function(e,r){var n=exports.ecdhUnsafe(e,r,!0);return createHash("sha256").update(n).digest()},exports.ecdhUnsafe=function(e,r,n){var s=loadPublicKey(e);if(null===s)throw new Error(messages.EC_PUBLIC_KEY_PARSE_FAIL);var a=new BN(r);if(a.cmp(ecparams.n)>=0||a.isZero())throw new Error(messages.ECDH_FAIL);return Buffer.from(s.pub.mul(a).encode(!0,n))}; + +},{"../messages.json":88,"bn.js":4,"create-hash":11,"elliptic":14,"safe-buffer":82}],87:[function(require,module,exports){ +"use strict";function initCompressedValue(e,s){return void 0===e?s:(assert.isBoolean(e,messages.COMPRESSED_TYPE_INVALID),e)}var assert=require("./assert"),der=require("./der"),messages=require("./messages.json");module.exports=function(e){return{privateKeyVerify:function(s){return assert.isBuffer(s,messages.EC_PRIVATE_KEY_TYPE_INVALID),32===s.length&&e.privateKeyVerify(s)},privateKeyExport:function(s,r){assert.isBuffer(s,messages.EC_PRIVATE_KEY_TYPE_INVALID),assert.isBufferLength(s,32,messages.EC_PRIVATE_KEY_LENGTH_INVALID),r=initCompressedValue(r,!0);var _=e.privateKeyExport(s,r);return der.privateKeyExport(s,_,r)},privateKeyImport:function(s){if(assert.isBuffer(s,messages.EC_PRIVATE_KEY_TYPE_INVALID),(s=der.privateKeyImport(s))&&32===s.length&&e.privateKeyVerify(s))return s;throw new Error(messages.EC_PRIVATE_KEY_IMPORT_DER_FAIL)},privateKeyTweakAdd:function(s,r){return assert.isBuffer(s,messages.EC_PRIVATE_KEY_TYPE_INVALID),assert.isBufferLength(s,32,messages.EC_PRIVATE_KEY_LENGTH_INVALID),assert.isBuffer(r,messages.TWEAK_TYPE_INVALID),assert.isBufferLength(r,32,messages.TWEAK_LENGTH_INVALID),e.privateKeyTweakAdd(s,r)},privateKeyTweakMul:function(s,r){return assert.isBuffer(s,messages.EC_PRIVATE_KEY_TYPE_INVALID),assert.isBufferLength(s,32,messages.EC_PRIVATE_KEY_LENGTH_INVALID),assert.isBuffer(r,messages.TWEAK_TYPE_INVALID),assert.isBufferLength(r,32,messages.TWEAK_LENGTH_INVALID),e.privateKeyTweakMul(s,r)},publicKeyCreate:function(s,r){return assert.isBuffer(s,messages.EC_PRIVATE_KEY_TYPE_INVALID),assert.isBufferLength(s,32,messages.EC_PRIVATE_KEY_LENGTH_INVALID),r=initCompressedValue(r,!0),e.publicKeyCreate(s,r)},publicKeyConvert:function(s,r){return assert.isBuffer(s,messages.EC_PUBLIC_KEY_TYPE_INVALID),assert.isBufferLength2(s,33,65,messages.EC_PUBLIC_KEY_LENGTH_INVALID),r=initCompressedValue(r,!0),e.publicKeyConvert(s,r)},publicKeyVerify:function(s){return assert.isBuffer(s,messages.EC_PUBLIC_KEY_TYPE_INVALID),e.publicKeyVerify(s)},publicKeyTweakAdd:function(s,r,_){return assert.isBuffer(s,messages.EC_PUBLIC_KEY_TYPE_INVALID),assert.isBufferLength2(s,33,65,messages.EC_PUBLIC_KEY_LENGTH_INVALID),assert.isBuffer(r,messages.TWEAK_TYPE_INVALID),assert.isBufferLength(r,32,messages.TWEAK_LENGTH_INVALID),_=initCompressedValue(_,!0),e.publicKeyTweakAdd(s,r,_)},publicKeyTweakMul:function(s,r,_){return assert.isBuffer(s,messages.EC_PUBLIC_KEY_TYPE_INVALID),assert.isBufferLength2(s,33,65,messages.EC_PUBLIC_KEY_LENGTH_INVALID),assert.isBuffer(r,messages.TWEAK_TYPE_INVALID),assert.isBufferLength(r,32,messages.TWEAK_LENGTH_INVALID),_=initCompressedValue(_,!0),e.publicKeyTweakMul(s,r,_)},publicKeyCombine:function(s,r){assert.isArray(s,messages.EC_PUBLIC_KEYS_TYPE_INVALID),assert.isLengthGTZero(s,messages.EC_PUBLIC_KEYS_LENGTH_INVALID);for(var _=0;_=this._finalSize&&(this._update(this._block),this._block.fill(0));var e=8*this._len;if(e<=4294967295)this._block.writeUInt32BE(e,this._blockSize-4);else{var s=4294967295&e,h=(e-s)/4294967296;this._block.writeUInt32BE(h,this._blockSize-8),this._block.writeUInt32BE(s,this._blockSize-4)}this._update(this._block);var o=this._hash();return t?o.toString(t):o},Hash.prototype._update=function(){throw new Error("_update must be implemented by subclass")},module.exports=Hash; + +},{"safe-buffer":82}],90:[function(require,module,exports){ +var exports=module.exports=function(e){e=e.toLowerCase();var r=exports[e];if(!r)throw new Error(e+" is not supported (we accept pull requests)");return new r};exports.sha=require("./sha"),exports.sha1=require("./sha1"),exports.sha224=require("./sha224"),exports.sha256=require("./sha256"),exports.sha384=require("./sha384"),exports.sha512=require("./sha512"); + +},{"./sha":91,"./sha1":92,"./sha224":93,"./sha256":94,"./sha384":95,"./sha512":96}],91:[function(require,module,exports){ +function Sha(){this.init(),this._w=W,Hash.call(this,64,56)}function rotl5(t){return t<<5|t>>>27}function rotl30(t){return t<<30|t>>>2}function ft(t,i,r,h){return 0===t?i&r|~i&h:2===t?i&r|i&h|r&h:i^r^h}var inherits=require("inherits"),Hash=require("./hash"),Buffer=require("safe-buffer").Buffer,K=[1518500249,1859775393,-1894007588,-899497514],W=new Array(80);inherits(Sha,Hash),Sha.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},Sha.prototype._update=function(t){for(var i=this._w,r=0|this._a,h=0|this._b,s=0|this._c,e=0|this._d,n=0|this._e,_=0;_<16;++_)i[_]=t.readInt32BE(4*_);for(;_<80;++_)i[_]=i[_-3]^i[_-8]^i[_-14]^i[_-16];for(var a=0;a<80;++a){var o=~~(a/20),f=rotl5(r)+ft(o,h,s,e)+n+i[a]+K[o]|0;n=e,e=s,s=rotl30(h),h=r,r=f}this._a=r+this._a|0,this._b=h+this._b|0,this._c=s+this._c|0,this._d=e+this._d|0,this._e=n+this._e|0},Sha.prototype._hash=function(){var t=Buffer.allocUnsafe(20);return t.writeInt32BE(0|this._a,0),t.writeInt32BE(0|this._b,4),t.writeInt32BE(0|this._c,8),t.writeInt32BE(0|this._d,12),t.writeInt32BE(0|this._e,16),t},module.exports=Sha; + +},{"./hash":89,"inherits":51,"safe-buffer":82}],92:[function(require,module,exports){ +function Sha1(){this.init(),this._w=W,Hash.call(this,64,56)}function rotl1(t){return t<<1|t>>>31}function rotl5(t){return t<<5|t>>>27}function rotl30(t){return t<<30|t>>>2}function ft(t,i,r,h){return 0===t?i&r|~i&h:2===t?i&r|i&h|r&h:i^r^h}var inherits=require("inherits"),Hash=require("./hash"),Buffer=require("safe-buffer").Buffer,K=[1518500249,1859775393,-1894007588,-899497514],W=new Array(80);inherits(Sha1,Hash),Sha1.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},Sha1.prototype._update=function(t){for(var i=this._w,r=0|this._a,h=0|this._b,s=0|this._c,e=0|this._d,n=0|this._e,_=0;_<16;++_)i[_]=t.readInt32BE(4*_);for(;_<80;++_)i[_]=rotl1(i[_-3]^i[_-8]^i[_-14]^i[_-16]);for(var a=0;a<80;++a){var o=~~(a/20),f=rotl5(r)+ft(o,h,s,e)+n+i[a]+K[o]|0;n=e,e=s,s=rotl30(h),h=r,r=f}this._a=r+this._a|0,this._b=h+this._b|0,this._c=s+this._c|0,this._d=e+this._d|0,this._e=n+this._e|0},Sha1.prototype._hash=function(){var t=Buffer.allocUnsafe(20);return t.writeInt32BE(0|this._a,0),t.writeInt32BE(0|this._b,4),t.writeInt32BE(0|this._c,8),t.writeInt32BE(0|this._d,12),t.writeInt32BE(0|this._e,16),t},module.exports=Sha1; + +},{"./hash":89,"inherits":51,"safe-buffer":82}],93:[function(require,module,exports){ +function Sha224(){this.init(),this._w=W,Hash.call(this,64,56)}var inherits=require("inherits"),Sha256=require("./sha256"),Hash=require("./hash"),Buffer=require("safe-buffer").Buffer,W=new Array(64);inherits(Sha224,Sha256),Sha224.prototype.init=function(){return this._a=3238371032,this._b=914150663,this._c=812702999,this._d=4144912697,this._e=4290775857,this._f=1750603025,this._g=1694076839,this._h=3204075428,this},Sha224.prototype._hash=function(){var t=Buffer.allocUnsafe(28);return t.writeInt32BE(this._a,0),t.writeInt32BE(this._b,4),t.writeInt32BE(this._c,8),t.writeInt32BE(this._d,12),t.writeInt32BE(this._e,16),t.writeInt32BE(this._f,20),t.writeInt32BE(this._g,24),t},module.exports=Sha224; + +},{"./hash":89,"./sha256":94,"inherits":51,"safe-buffer":82}],94:[function(require,module,exports){ +function Sha256(){this.init(),this._w=W,Hash.call(this,64,56)}function ch(t,i,h){return h^t&(i^h)}function maj(t,i,h){return t&i|h&(t|i)}function sigma0(t){return(t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10)}function sigma1(t){return(t>>>6|t<<26)^(t>>>11|t<<21)^(t>>>25|t<<7)}function gamma0(t){return(t>>>7|t<<25)^(t>>>18|t<<14)^t>>>3}function gamma1(t){return(t>>>17|t<<15)^(t>>>19|t<<13)^t>>>10}var inherits=require("inherits"),Hash=require("./hash"),Buffer=require("safe-buffer").Buffer,K=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],W=new Array(64);inherits(Sha256,Hash),Sha256.prototype.init=function(){return this._a=1779033703,this._b=3144134277,this._c=1013904242,this._d=2773480762,this._e=1359893119,this._f=2600822924,this._g=528734635,this._h=1541459225,this},Sha256.prototype._update=function(t){for(var i=this._w,h=0|this._a,s=0|this._b,r=0|this._c,e=0|this._d,n=0|this._e,_=0|this._f,a=0|this._g,f=0|this._h,u=0;u<16;++u)i[u]=t.readInt32BE(4*u);for(;u<64;++u)i[u]=gamma1(i[u-2])+i[u-7]+gamma0(i[u-15])+i[u-16]|0;for(var o=0;o<64;++o){var c=f+sigma1(n)+ch(n,_,a)+K[o]+i[o]|0,m=sigma0(h)+maj(h,s,r)|0;f=a,a=_,_=n,n=e+c|0,e=r,r=s,s=h,h=c+m|0}this._a=h+this._a|0,this._b=s+this._b|0,this._c=r+this._c|0,this._d=e+this._d|0,this._e=n+this._e|0,this._f=_+this._f|0,this._g=a+this._g|0,this._h=f+this._h|0},Sha256.prototype._hash=function(){var t=Buffer.allocUnsafe(32);return t.writeInt32BE(this._a,0),t.writeInt32BE(this._b,4),t.writeInt32BE(this._c,8),t.writeInt32BE(this._d,12),t.writeInt32BE(this._e,16),t.writeInt32BE(this._f,20),t.writeInt32BE(this._g,24),t.writeInt32BE(this._h,28),t},module.exports=Sha256; + +},{"./hash":89,"inherits":51,"safe-buffer":82}],95:[function(require,module,exports){ +function Sha384(){this.init(),this._w=W,Hash.call(this,128,112)}var inherits=require("inherits"),SHA512=require("./sha512"),Hash=require("./hash"),Buffer=require("safe-buffer").Buffer,W=new Array(160);inherits(Sha384,SHA512),Sha384.prototype.init=function(){return this._ah=3418070365,this._bh=1654270250,this._ch=2438529370,this._dh=355462360,this._eh=1731405415,this._fh=2394180231,this._gh=3675008525,this._hh=1203062813,this._al=3238371032,this._bl=914150663,this._cl=812702999,this._dl=4144912697,this._el=4290775857,this._fl=1750603025,this._gl=1694076839,this._hl=3204075428,this},Sha384.prototype._hash=function(){function h(h,t,s){i.writeInt32BE(h,s),i.writeInt32BE(t,s+4)}var i=Buffer.allocUnsafe(48);return h(this._ah,this._al,0),h(this._bh,this._bl,8),h(this._ch,this._cl,16),h(this._dh,this._dl,24),h(this._eh,this._el,32),h(this._fh,this._fl,40),i},module.exports=Sha384; + +},{"./hash":89,"./sha512":96,"inherits":51,"safe-buffer":82}],96:[function(require,module,exports){ +function Sha512(){this.init(),this._w=W,Hash.call(this,128,112)}function Ch(h,t,i){return i^h&(t^i)}function maj(h,t,i){return h&t|i&(h|t)}function sigma0(h,t){return(h>>>28|t<<4)^(t>>>2|h<<30)^(t>>>7|h<<25)}function sigma1(h,t){return(h>>>14|t<<18)^(h>>>18|t<<14)^(t>>>9|h<<23)}function Gamma0(h,t){return(h>>>1|t<<31)^(h>>>8|t<<24)^h>>>7}function Gamma0l(h,t){return(h>>>1|t<<31)^(h>>>8|t<<24)^(h>>>7|t<<25)}function Gamma1(h,t){return(h>>>19|t<<13)^(t>>>29|h<<3)^h>>>6}function Gamma1l(h,t){return(h>>>19|t<<13)^(t>>>29|h<<3)^(h>>>6|t<<26)}function getCarry(h,t){return h>>>0>>0?1:0}var inherits=require("inherits"),Hash=require("./hash"),Buffer=require("safe-buffer").Buffer,K=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],W=new Array(160);inherits(Sha512,Hash),Sha512.prototype.init=function(){return this._ah=1779033703,this._bh=3144134277,this._ch=1013904242,this._dh=2773480762,this._eh=1359893119,this._fh=2600822924,this._gh=528734635,this._hh=1541459225,this._al=4089235720,this._bl=2227873595,this._cl=4271175723,this._dl=1595750129,this._el=2917565137,this._fl=725511199,this._gl=4215389547,this._hl=327033209,this},Sha512.prototype._update=function(h){for(var t=this._w,i=0|this._ah,s=0|this._bh,r=0|this._ch,_=0|this._dh,a=0|this._eh,e=0|this._fh,l=0|this._gh,n=0|this._hh,f=0|this._al,g=0|this._bl,u=0|this._cl,c=0|this._dl,m=0|this._el,o=0|this._fl,y=0|this._gl,C=0|this._hl,d=0;d<32;d+=2)t[d]=h.readInt32BE(4*d),t[d+1]=h.readInt32BE(4*d+4);for(;d<160;d+=2){var b=t[d-30],p=t[d-30+1],G=Gamma0(b,p),v=Gamma0l(p,b),B=Gamma1(b=t[d-4],p=t[d-4+1]),S=Gamma1l(p,b),w=t[d-14],E=t[d-14+1],I=t[d-32],j=t[d-32+1],q=v+E|0,H=G+w+getCarry(q,v)|0;H=(H=H+B+getCarry(q=q+S|0,S)|0)+I+getCarry(q=q+j|0,j)|0,t[d]=H,t[d+1]=q}for(var W=0;W<160;W+=2){H=t[W],q=t[W+1];var x=maj(i,s,r),A=maj(f,g,u),U=sigma0(i,f),k=sigma0(f,i),z=sigma1(a,m),D=sigma1(m,a),F=K[W],J=K[W+1],L=Ch(a,e,l),M=Ch(m,o,y),N=C+D|0,O=n+z+getCarry(N,C)|0;O=(O=(O=O+L+getCarry(N=N+M|0,M)|0)+F+getCarry(N=N+J|0,J)|0)+H+getCarry(N=N+q|0,q)|0;var P=k+A|0,Q=U+x+getCarry(P,k)|0;n=l,C=y,l=e,y=o,e=a,o=m,a=_+O+getCarry(m=c+N|0,c)|0,_=r,c=u,r=s,u=g,s=i,g=f,i=O+Q+getCarry(f=N+P|0,N)|0}this._al=this._al+f|0,this._bl=this._bl+g|0,this._cl=this._cl+u|0,this._dl=this._dl+c|0,this._el=this._el+m|0,this._fl=this._fl+o|0,this._gl=this._gl+y|0,this._hl=this._hl+C|0,this._ah=this._ah+i+getCarry(this._al,f)|0,this._bh=this._bh+s+getCarry(this._bl,g)|0,this._ch=this._ch+r+getCarry(this._cl,u)|0,this._dh=this._dh+_+getCarry(this._dl,c)|0,this._eh=this._eh+a+getCarry(this._el,m)|0,this._fh=this._fh+e+getCarry(this._fl,o)|0,this._gh=this._gh+l+getCarry(this._gl,y)|0,this._hh=this._hh+n+getCarry(this._hl,C)|0},Sha512.prototype._hash=function(){function h(h,i,s){t.writeInt32BE(h,s),t.writeInt32BE(i,s+4)}var t=Buffer.allocUnsafe(64);return h(this._ah,this._al,0),h(this._bh,this._bl,8),h(this._ch,this._cl,16),h(this._dh,this._dl,24),h(this._eh,this._el,32),h(this._fh,this._fl,40),h(this._gh,this._gl,48),h(this._hh,this._hl,56),t},module.exports=Sha512; + +},{"./hash":89,"inherits":51,"safe-buffer":82}],97:[function(require,module,exports){ +function Stream(){EE.call(this)}module.exports=Stream;var EE=require("events").EventEmitter,inherits=require("inherits");inherits(Stream,EE),Stream.Readable=require("readable-stream/readable.js"),Stream.Writable=require("readable-stream/writable.js"),Stream.Duplex=require("readable-stream/duplex.js"),Stream.Transform=require("readable-stream/transform.js"),Stream.PassThrough=require("readable-stream/passthrough.js"),Stream.Stream=Stream,Stream.prototype.pipe=function(e,r){function t(r){e.writable&&!1===e.write(r)&&m.pause&&m.pause()}function n(){m.readable&&m.resume&&m.resume()}function a(){u||(u=!0,e.end())}function o(){u||(u=!0,"function"==typeof e.destroy&&e.destroy())}function i(e){if(s(),0===EE.listenerCount(this,"error"))throw e}function s(){m.removeListener("data",t),e.removeListener("drain",n),m.removeListener("end",a),m.removeListener("close",o),m.removeListener("error",i),e.removeListener("error",i),m.removeListener("end",s),m.removeListener("close",s),e.removeListener("close",s)}var m=this;m.on("data",t),e.on("drain",n),e._isStdio||r&&!1===r.end||(m.on("end",a),m.on("close",o));var u=!1;return m.on("error",i),e.on("error",i),m.on("end",s),m.on("close",s),e.on("close",s),e.emit("pipe",m),e}; + +},{"events":35,"inherits":51,"readable-stream/duplex.js":67,"readable-stream/passthrough.js":76,"readable-stream/readable.js":77,"readable-stream/transform.js":78,"readable-stream/writable.js":79}],98:[function(require,module,exports){ +"use strict";function _normalizeEncoding(t){if(!t)return"utf8";for(var e;;)switch(t){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return t;default:if(e)return;t=(""+t).toLowerCase(),e=!0}}function normalizeEncoding(t){var e=_normalizeEncoding(t);if("string"!=typeof e&&(Buffer.isEncoding===isEncoding||!isEncoding(t)))throw new Error("Unknown encoding: "+t);return e||t}function StringDecoder(t){this.encoding=normalizeEncoding(t);var e;switch(this.encoding){case"utf16le":this.text=utf16Text,this.end=utf16End,e=4;break;case"utf8":this.fillLast=utf8FillLast,e=4;break;case"base64":this.text=base64Text,this.end=base64End,e=3;break;default:return this.write=simpleWrite,void(this.end=simpleEnd)}this.lastNeed=0,this.lastTotal=0,this.lastChar=Buffer.allocUnsafe(e)}function utf8CheckByte(t){return t<=127?0:t>>5==6?2:t>>4==14?3:t>>3==30?4:-1}function utf8CheckIncomplete(t,e,s){var i=e.length-1;if(i=0?(a>0&&(t.lastNeed=a-1),a):--i=0?(a>0&&(t.lastNeed=a-2),a):--i=0?(a>0&&(2===a?a=0:t.lastNeed=a-3),a):0}function utf8CheckExtraBytes(t,e,s){if(128!=(192&e[0]))return t.lastNeed=0,"�".repeat(s);if(t.lastNeed>1&&e.length>1){if(128!=(192&e[1]))return t.lastNeed=1,"�".repeat(s+1);if(t.lastNeed>2&&e.length>2&&128!=(192&e[2]))return t.lastNeed=2,"�".repeat(s+2)}}function utf8FillLast(t){var e=this.lastTotal-this.lastNeed,s=utf8CheckExtraBytes(this,t,e);return void 0!==s?s:this.lastNeed<=t.length?(t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(t.copy(this.lastChar,e,0,t.length),void(this.lastNeed-=t.length))}function utf8Text(t,e){var s=utf8CheckIncomplete(this,t,e);if(!this.lastNeed)return t.toString("utf8",e);this.lastTotal=s;var i=t.length-(s-this.lastNeed);return t.copy(this.lastChar,0,i),t.toString("utf8",e,i)}function utf8End(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+"�".repeat(this.lastTotal-this.lastNeed):e}function utf16Text(t,e){if((t.length-e)%2==0){var s=t.toString("utf16le",e);if(s){var i=s.charCodeAt(s.length-1);if(i>=55296&&i<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],s.slice(0,-1)}return s}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString("utf16le",e,t.length-1)}function utf16End(t){var e=t&&t.length?this.write(t):"";if(this.lastNeed){var s=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,s)}return e}function base64Text(t,e){var s=(t.length-e)%3;return 0===s?t.toString("base64",e):(this.lastNeed=3-s,this.lastTotal=3,1===s?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString("base64",e,t.length-s))}function base64End(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}function simpleWrite(t){return t.toString(this.encoding)}function simpleEnd(t){return t&&t.length?this.write(t):""}var Buffer=require("safe-buffer").Buffer,isEncoding=Buffer.isEncoding||function(t){switch((t=""+t)&&t.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};exports.StringDecoder=StringDecoder,StringDecoder.prototype.write=function(t){if(0===t.length)return"";var e,s;if(this.lastNeed){if(void 0===(e=this.fillLast(t)))return"";s=this.lastNeed,this.lastNeed=0}else s=0;return s=3&&(t.depth=arguments[2]),arguments.length>=4&&(t.colors=arguments[3]),isBoolean(r)?t.showHidden=r:r&&exports._extend(t,r),isUndefined(t.showHidden)&&(t.showHidden=!1),isUndefined(t.depth)&&(t.depth=2),isUndefined(t.colors)&&(t.colors=!1),isUndefined(t.customInspect)&&(t.customInspect=!0),t.colors&&(t.stylize=stylizeWithColor),formatValue(t,e,t.depth)}function stylizeWithColor(e,r){var t=inspect.styles[r];return t?"["+inspect.colors[t][0]+"m"+e+"["+inspect.colors[t][1]+"m":e}function stylizeNoColor(e,r){return e}function arrayToHash(e){var r={};return e.forEach(function(e,t){r[e]=!0}),r}function formatValue(e,r,t){if(e.customInspect&&r&&isFunction(r.inspect)&&r.inspect!==exports.inspect&&(!r.constructor||r.constructor.prototype!==r)){var n=r.inspect(t,e);return isString(n)||(n=formatValue(e,n,t)),n}var i=formatPrimitive(e,r);if(i)return i;var o=Object.keys(r),s=arrayToHash(o);if(e.showHidden&&(o=Object.getOwnPropertyNames(r)),isError(r)&&(o.indexOf("message")>=0||o.indexOf("description")>=0))return formatError(r);if(0===o.length){if(isFunction(r)){var u=r.name?": "+r.name:"";return e.stylize("[Function"+u+"]","special")}if(isRegExp(r))return e.stylize(RegExp.prototype.toString.call(r),"regexp");if(isDate(r))return e.stylize(Date.prototype.toString.call(r),"date");if(isError(r))return formatError(r)}var c="",a=!1,l=["{","}"];if(isArray(r)&&(a=!0,l=["[","]"]),isFunction(r)&&(c=" [Function"+(r.name?": "+r.name:"")+"]"),isRegExp(r)&&(c=" "+RegExp.prototype.toString.call(r)),isDate(r)&&(c=" "+Date.prototype.toUTCString.call(r)),isError(r)&&(c=" "+formatError(r)),0===o.length&&(!a||0==r.length))return l[0]+c+l[1];if(t<0)return isRegExp(r)?e.stylize(RegExp.prototype.toString.call(r),"regexp"):e.stylize("[Object]","special");e.seen.push(r);var p;return p=a?formatArray(e,r,t,s,o):o.map(function(n){return formatProperty(e,r,t,s,n,a)}),e.seen.pop(),reduceToSingleString(p,c,l)}function formatPrimitive(e,r){if(isUndefined(r))return e.stylize("undefined","undefined");if(isString(r)){var t="'"+JSON.stringify(r).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(t,"string")}return isNumber(r)?e.stylize(""+r,"number"):isBoolean(r)?e.stylize(""+r,"boolean"):isNull(r)?e.stylize("null","null"):void 0}function formatError(e){return"["+Error.prototype.toString.call(e)+"]"}function formatArray(e,r,t,n,i){for(var o=[],s=0,u=r.length;s-1&&(u=o?u.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+u.split("\n").map(function(e){return" "+e}).join("\n")):u=e.stylize("[Circular]","special")),isUndefined(s)){if(o&&i.match(/^\d+$/))return u;(s=JSON.stringify(""+i)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(s=s.substr(1,s.length-2),s=e.stylize(s,"name")):(s=s.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),s=e.stylize(s,"string"))}return s+": "+u}function reduceToSingleString(e,r,t){var n=0;return e.reduce(function(e,r){return n++,r.indexOf("\n")>=0&&n++,e+r.replace(/\u001b\[\d\d?m/g,"").length+1},0)>60?t[0]+(""===r?"":r+"\n ")+" "+e.join(",\n ")+" "+t[1]:t[0]+r+" "+e.join(", ")+" "+t[1]}function isArray(e){return Array.isArray(e)}function isBoolean(e){return"boolean"==typeof e}function isNull(e){return null===e}function isNullOrUndefined(e){return null==e}function isNumber(e){return"number"==typeof e}function isString(e){return"string"==typeof e}function isSymbol(e){return"symbol"==typeof e}function isUndefined(e){return void 0===e}function isRegExp(e){return isObject(e)&&"[object RegExp]"===objectToString(e)}function isObject(e){return"object"==typeof e&&null!==e}function isDate(e){return isObject(e)&&"[object Date]"===objectToString(e)}function isError(e){return isObject(e)&&("[object Error]"===objectToString(e)||e instanceof Error)}function isFunction(e){return"function"==typeof e}function isPrimitive(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||void 0===e}function objectToString(e){return Object.prototype.toString.call(e)}function pad(e){return e<10?"0"+e.toString(10):e.toString(10)}function timestamp(){var e=new Date,r=[pad(e.getHours()),pad(e.getMinutes()),pad(e.getSeconds())].join(":");return[e.getDate(),months[e.getMonth()],r].join(" ")}function hasOwnProperty(e,r){return Object.prototype.hasOwnProperty.call(e,r)}var formatRegExp=/%[sdj%]/g;exports.format=function(e){if(!isString(e)){for(var r=[],t=0;t=i)return e;switch(e){case"%s":return String(n[t++]);case"%d":return Number(n[t++]);case"%j":try{return JSON.stringify(n[t++])}catch(e){return"[Circular]"}default:return e}}),s=n[t];t + + + E2E Test Dapp + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/test/e2e/send-eth-with-private-key-test/send-eth-with-private-key.js b/test/e2e/send-eth-with-private-key-test/send-eth-with-private-key.js new file mode 100644 index 000000000000..5f72919501ca --- /dev/null +++ b/test/e2e/send-eth-with-private-key-test/send-eth-with-private-key.js @@ -0,0 +1,28 @@ +/* eslint-disable */ +var Tx = ethereumjs.Tx +var privateKey = ethereumjs.Buffer.Buffer.from('53CB0AB5226EEBF4D872113D98332C1555DC304443BEE1CF759D15798D3C55A9', 'hex') + +const web3 = new Web3(new Web3.providers.HttpProvider(`http://localhost:8545`)) + +const sendButton = document.getElementById('send') + +sendButton.addEventListener('click', function () { + var rawTx = { + nonce: '0x00', + gasPrice: '0x09184e72a000', + gasLimit: '0x22710', + value: '0xde0b6b3a7640000', + r: '0x25a1bc499cd8799a2ece0fcba0df6e666e54a6e2b4e18c09838e2b621c10db71', + s: '0x6cf83e6e8f6e82a0a1d7bd10bc343fc0ae4b096c1701aa54e6389d447f98ac6f', + v: '0x2d46', + to: document.getElementById('address').value, + } + var tx = new Tx(rawTx); + tx.sign(privateKey); + + var serializedTx = tx.serialize(); + + web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex')).on('receipt', (transactionResult) => { + document.getElementById('success').innerHTML = `Successfully sent transaction: ${transactionResult.transactionHash}` + }) +}) diff --git a/test/e2e/send-eth-with-private-key-test/web3js.js b/test/e2e/send-eth-with-private-key-test/web3js.js new file mode 100644 index 000000000000..29d266567dc8 --- /dev/null +++ b/test/e2e/send-eth-with-private-key-test/web3js.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +"use strict";var _typeof2="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},_typeof="function"==typeof Symbol&&"symbol"===_typeof2(Symbol.iterator)?function(t){return void 0===t?"undefined":_typeof2(t)}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":void 0===t?"undefined":_typeof2(t)};!function(t){if("object"===("undefined"==typeof exports?"undefined":_typeof(exports))&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).Web3=t()}}(function(){var define,module,exports;return function(){return function t(e,r,n){function i(a,s){if(!r[a]){if(!e[a]){var u="function"==typeof require&&require;if(!s&&u)return u(a,!0);if(o)return o(a,!0);var f=new Error("Cannot find module '"+a+"'");throw f.code="MODULE_NOT_FOUND",f}var c=r[a]={exports:{}};e[a][0].call(c.exports,function(t){var r=e[a][1][t];return i(r||t)},c,c.exports,t,e,r,n)}return r[a].exports}for(var o="function"==typeof require&&require,a=0;a>6],i=0==(32&r);if(31==(31&r)){var o=r;for(r=0;128==(128&o);){if(o=t.readUInt8(e),t.isError(o))return o;r<<=7,r|=127&o}}else r&=31;return{cls:n,primitive:i,tag:r,tagStr:s.tag[r]}}function h(t,e,r){var n=t.readUInt8(r);if(t.isError(n))return n;if(!e&&128===n)return null;if(0==(128&n))return n;var i=127&n;if(i>4)return t.error("length octect is too long");n=0;for(var o=0;o=31)return n.error("Multi-octet tag encoding unsupported");e||(i|=32);return i|=s.tagClassByName[r||"universal"]<<6}(t,e,r,this.reporter);if(n.length<128)return(o=new i(2))[0]=a,o[1]=n.length,this._createEncoderBuffer([o,n]);for(var u=1,f=n.length;f>=256;f>>=8)u++;(o=new i(2+u))[0]=a,o[1]=128|u;f=1+u;for(var c=n.length;c>0;f--,c>>=8)o[f]=255&c;return this._createEncoderBuffer([o,n])},f.prototype._encodeStr=function(t,e){if("bitstr"===e)return this._createEncoderBuffer([0|t.unused,t.data]);if("bmpstr"===e){for(var r=new i(2*t.length),n=0;n=40)return this.reporter.error("Second objid identifier OOB");t.splice(0,2,40*t[0]+t[1])}var o=0;for(n=0;n=128;a>>=7)o++}var s=new i(o),u=s.length-1;for(n=t.length-1;n>=0;n--){a=t[n];for(s[u--]=127&a;(a>>=7)>0;)s[u--]=128|127&a}return this._createEncoderBuffer(s)},f.prototype._encodeTime=function(t,e){var r,n=new Date(t);return"gentime"===e?r=[c(n.getFullYear()),c(n.getUTCMonth()+1),c(n.getUTCDate()),c(n.getUTCHours()),c(n.getUTCMinutes()),c(n.getUTCSeconds()),"Z"].join(""):"utctime"===e?r=[c(n.getFullYear()%100),c(n.getUTCMonth()+1),c(n.getUTCDate()),c(n.getUTCHours()),c(n.getUTCMinutes()),c(n.getUTCSeconds()),"Z"].join(""):this.reporter.error("Encoding "+e+" time is not supported yet"),this._encodeStr(r,"octstr")},f.prototype._encodeNull=function(){return this._createEncoderBuffer("")},f.prototype._encodeInt=function(t,e){if("string"==typeof t){if(!e)return this.reporter.error("String int or enum given, but no values map");if(!e.hasOwnProperty(t))return this.reporter.error("Values map doesn't contain: "+JSON.stringify(t));t=e[t]}if("number"!=typeof t&&!i.isBuffer(t)){var r=t.toArray();!t.sign&&128&r[0]&&r.unshift(0),t=new i(r)}if(i.isBuffer(t)){var n=t.length;0===t.length&&n++;var o=new i(n);return t.copy(o),0===t.length&&(o[0]=0),this._createEncoderBuffer(o)}if(t<128)return this._createEncoderBuffer(t);if(t<256)return this._createEncoderBuffer([0,t]);n=1;for(var a=t;a>=256;a>>=8)n++;for(a=(o=new Array(n)).length-1;a>=0;a--)o[a]=255&t,t>>=8;return 128&o[0]&&o.unshift(0),this._createEncoderBuffer(new i(o))},f.prototype._encodeBool=function(t){return this._createEncoderBuffer(t?255:0)},f.prototype._use=function(t,e){return"function"==typeof t&&(t=t(e)),t._getEncoder("der").tree},f.prototype._skipDefault=function(t,e,r){var n,i=this._baseState;if(null===i.default)return!1;var o=t.join();if(void 0===i.defaultBuffer&&(i.defaultBuffer=this._encodeValue(i.default,e,r).join()),o.length!==i.defaultBuffer.length)return!1;for(n=0;n0?u-4:u;var c=0;for(e=0;e>16&255,s[c++]=n>>8&255,s[c++]=255&n;2===a?(n=i[t.charCodeAt(e)]<<2|i[t.charCodeAt(e+1)]>>4,s[c++]=255&n):1===a&&(n=i[t.charCodeAt(e)]<<10|i[t.charCodeAt(e+1)]<<4|i[t.charCodeAt(e+2)]>>2,s[c++]=n>>8&255,s[c++]=255&n);return s},r.fromByteArray=function(t){for(var e,r=t.length,i=r%3,o="",a=[],s=0,u=r-i;su?u:s+16383));1===i?(e=t[r-1],o+=n[e>>2],o+=n[e<<4&63],o+="=="):2===i&&(e=(t[r-2]<<8)+t[r-1],o+=n[e>>10],o+=n[e>>4&63],o+=n[e<<2&63],o+="=");return a.push(o),a.join("")};for(var n=[],i=[],o="undefined"!=typeof Uint8Array?Uint8Array:Array,a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=0,u=a.length;s0)throw new Error("Invalid string. Length must be a multiple of 4");return"="===t[e-2]?2:"="===t[e-1]?1:0}function c(t,e,r){for(var i,o,a=[],s=e;s>18&63]+n[o>>12&63]+n[o>>6&63]+n[63&o]);return a.join("")}i["-".charCodeAt(0)]=62,i["_".charCodeAt(0)]=63},{}],16:[function(t,e,r){var n;function i(t){this.rand=t}if(e.exports=function(t){return n||(n=new i(null)),n.generate(t)},e.exports.Rand=i,i.prototype.generate=function(t){return this._rand(t)},i.prototype._rand=function(t){if(this.rand.getBytes)return this.rand.getBytes(t);for(var e=new Uint8Array(t),r=0;r>>24]^c[p>>>16&255]^h[b>>>8&255]^d[255&m]^e[y++],a=f[p>>>24]^c[b>>>16&255]^h[m>>>8&255]^d[255&l]^e[y++],s=f[b>>>24]^c[m>>>16&255]^h[l>>>8&255]^d[255&p]^e[y++],u=f[m>>>24]^c[l>>>16&255]^h[p>>>8&255]^d[255&b]^e[y++],l=o,p=a,b=s,m=u;return o=(n[l>>>24]<<24|n[p>>>16&255]<<16|n[b>>>8&255]<<8|n[255&m])^e[y++],a=(n[p>>>24]<<24|n[b>>>16&255]<<16|n[m>>>8&255]<<8|n[255&l])^e[y++],s=(n[b>>>24]<<24|n[m>>>16&255]<<16|n[l>>>8&255]<<8|n[255&p])^e[y++],u=(n[m>>>24]<<24|n[l>>>16&255]<<16|n[p>>>8&255]<<8|n[255&b])^e[y++],[o>>>=0,a>>>=0,s>>>=0,u>>>=0]}var s=[0,1,2,4,8,16,32,64,128,27,54],u=function(){for(var t=new Array(256),e=0;e<256;e++)t[e]=e<128?e<<1:e<<1^283;for(var r=[],n=[],i=[[],[],[],[]],o=[[],[],[],[]],a=0,s=0,u=0;u<256;++u){var f=s^s<<1^s<<2^s<<3^s<<4;f=f>>>8^255&f^99,r[a]=f,n[f]=a;var c=t[a],h=t[c],d=t[h],l=257*t[f]^16843008*f;i[0][a]=l<<24|l>>>8,i[1][a]=l<<16|l>>>16,i[2][a]=l<<8|l>>>24,i[3][a]=l,l=16843009*d^65537*h^257*c^16843008*a,o[0][f]=l<<24|l>>>8,o[1][f]=l<<16|l>>>16,o[2][f]=l<<8|l>>>24,o[3][f]=l,0===a?a=s=1:(a=c^t[t[t[d^c]]],s^=t[t[s]])}return{SBOX:r,INV_SBOX:n,SUB_MIX:i,INV_SUB_MIX:o}}();function f(t){this._key=i(t),this._reset()}f.blockSize=16,f.keySize=32,f.prototype.blockSize=f.blockSize,f.prototype.keySize=f.keySize,f.prototype._reset=function(){for(var t=this._key,e=t.length,r=e+6,n=4*(r+1),i=[],o=0;o>>24,a=u.SBOX[a>>>24]<<24|u.SBOX[a>>>16&255]<<16|u.SBOX[a>>>8&255]<<8|u.SBOX[255&a],a^=s[o/e|0]<<24):e>6&&o%e==4&&(a=u.SBOX[a>>>24]<<24|u.SBOX[a>>>16&255]<<16|u.SBOX[a>>>8&255]<<8|u.SBOX[255&a]),i[o]=i[o-e]^a}for(var f=[],c=0;c>>24]]^u.INV_SUB_MIX[1][u.SBOX[d>>>16&255]]^u.INV_SUB_MIX[2][u.SBOX[d>>>8&255]]^u.INV_SUB_MIX[3][u.SBOX[255&d]]}this._nRounds=r,this._keySchedule=i,this._invKeySchedule=f},f.prototype.encryptBlockRaw=function(t){return a(t=i(t),this._keySchedule,u.SUB_MIX,u.SBOX,this._nRounds)},f.prototype.encryptBlock=function(t){var e=this.encryptBlockRaw(t),r=n.allocUnsafe(16);return r.writeUInt32BE(e[0],0),r.writeUInt32BE(e[1],4),r.writeUInt32BE(e[2],8),r.writeUInt32BE(e[3],12),r},f.prototype.decryptBlock=function(t){var e=(t=i(t))[1];t[1]=t[3],t[3]=e;var r=a(t,this._invKeySchedule,u.INV_SUB_MIX,u.INV_SBOX,this._nRounds),o=n.allocUnsafe(16);return o.writeUInt32BE(r[0],0),o.writeUInt32BE(r[3],4),o.writeUInt32BE(r[2],8),o.writeUInt32BE(r[1],12),o},f.prototype.scrub=function(){o(this._keySchedule),o(this._invKeySchedule),o(this._key)},e.exports.AES=f},{"safe-buffer":147}],19:[function(t,e,r){var n=t("./aes"),i=t("safe-buffer").Buffer,o=t("cipher-base"),a=t("inherits"),s=t("./ghash"),u=t("buffer-xor"),f=t("./incr32");function c(t,e,r,a){o.call(this);var u=i.alloc(4,0);this._cipher=new n.AES(e);var c=this._cipher.encryptBlock(u);this._ghash=new s(c),r=function(t,e,r){if(12===e.length)return t._finID=i.concat([e,i.from([0,0,0,1])]),i.concat([e,i.from([0,0,0,2])]);var n=new s(r),o=e.length,a=o%16;n.update(e),a&&(a=16-a,n.update(i.alloc(a,0))),n.update(i.alloc(8,0));var u=8*o,c=i.alloc(8);c.writeUIntBE(u,0,8),n.update(c),t._finID=n.state;var h=i.from(t._finID);return f(h),h}(this,r,c),this._prev=i.from(r),this._cache=i.allocUnsafe(0),this._secCache=i.allocUnsafe(0),this._decrypt=a,this._alen=0,this._len=0,this._mode=t,this._authTag=null,this._called=!1}a(c,o),c.prototype._update=function(t){if(!this._called&&this._alen){var e=16-this._alen%16;e<16&&(e=i.alloc(e,0),this._ghash.update(e))}this._called=!0;var r=this._mode.encrypt(this,t);return this._decrypt?this._ghash.update(t):this._ghash.update(r),this._len+=t.length,r},c.prototype._final=function(){if(this._decrypt&&!this._authTag)throw new Error("Unsupported state or unable to authenticate data");var t=u(this._ghash.final(8*this._alen,8*this._len),this._cipher.encryptBlock(this._finID));if(this._decrypt&&function(t,e){var r=0;t.length!==e.length&&r++;for(var n=Math.min(t.length,e.length),i=0;i16)return e=this.cache.slice(0,16),this.cache=this.cache.slice(16),e}else if(this.cache.length>=16)return e=this.cache.slice(0,16),this.cache=this.cache.slice(16),e;return null},h.prototype.flush=function(){if(this.cache.length)return this.cache},r.createDecipher=function(t,e){var r=o[t.toLowerCase()];if(!r)throw new TypeError("invalid suite type");var n=f(e,!1,r.key,r.iv);return d(t,n.key,n.iv)},r.createDecipheriv=d},{"./aes":18,"./authCipher":19,"./modes":31,"./streamCipher":34,"cipher-base":48,evp_bytestokey:84,inherits:101,"safe-buffer":147}],22:[function(t,e,r){var n=t("./modes"),i=t("./authCipher"),o=t("safe-buffer").Buffer,a=t("./streamCipher"),s=t("cipher-base"),u=t("./aes"),f=t("evp_bytestokey");function c(t,e,r){s.call(this),this._cache=new d,this._cipher=new u.AES(e),this._prev=o.from(r),this._mode=t,this._autopadding=!0}t("inherits")(c,s),c.prototype._update=function(t){var e,r;this._cache.add(t);for(var n=[];e=this._cache.get();)r=this._mode.encrypt(this,e),n.push(r);return o.concat(n)};var h=o.alloc(16,16);function d(){this.cache=o.allocUnsafe(0)}function l(t,e,r){var s=n[t.toLowerCase()];if(!s)throw new TypeError("invalid suite type");if("string"==typeof e&&(e=o.from(e)),e.length!==s.key/8)throw new TypeError("invalid key length "+e.length);if("string"==typeof r&&(r=o.from(r)),"GCM"!==s.mode&&r.length!==s.iv)throw new TypeError("invalid iv length "+r.length);return"stream"===s.type?new a(s.module,e,r):"auth"===s.type?new i(s.module,e,r):new c(s.module,e,r)}c.prototype._final=function(){var t=this._cache.flush();if(this._autopadding)return t=this._mode.encrypt(this,t),this._cipher.scrub(),t;if(!t.equals(h))throw this._cipher.scrub(),new Error("data not multiple of block length")},c.prototype.setAutoPadding=function(t){return this._autopadding=!!t,this},d.prototype.add=function(t){this.cache=o.concat([this.cache,t])},d.prototype.get=function(){if(this.cache.length>15){var t=this.cache.slice(0,16);return this.cache=this.cache.slice(16),t}return null},d.prototype.flush=function(){for(var t=16-this.cache.length,e=o.allocUnsafe(t),r=-1;++r>>0,0),e.writeUInt32BE(t[1]>>>0,4),e.writeUInt32BE(t[2]>>>0,8),e.writeUInt32BE(t[3]>>>0,12),e}function a(t){this.h=t,this.state=n.alloc(16,0),this.cache=n.allocUnsafe(0)}a.prototype.ghash=function(t){for(var e=-1;++e0;e--)n[e]=n[e]>>>1|(1&n[e-1])<<31;n[0]=n[0]>>>1,r&&(n[0]=n[0]^225<<24)}this.state=o(i)},a.prototype.update=function(t){var e;for(this.cache=n.concat([this.cache,t]);this.cache.length>=16;)e=this.cache.slice(0,16),this.cache=this.cache.slice(16),this.ghash(e)},a.prototype.final=function(t,e){return this.cache.length&&this.ghash(n.concat([this.cache,i],16)),this.ghash(o([0,t,0,e])),this.state},e.exports=a},{"safe-buffer":147}],24:[function(t,e,r){e.exports=function(t){for(var e,r=t.length;r--;){if(255!==(e=t.readUInt8(r))){e++,t.writeUInt8(e,r);break}t.writeUInt8(0,r)}}},{}],25:[function(t,e,r){var n=t("buffer-xor");r.encrypt=function(t,e){var r=n(e,t._prev);return t._prev=t._cipher.encryptBlock(r),t._prev},r.decrypt=function(t,e){var r=t._prev;t._prev=e;var i=t._cipher.decryptBlock(e);return n(i,r)}},{"buffer-xor":46}],26:[function(t,e,r){var n=t("safe-buffer").Buffer,i=t("buffer-xor");function o(t,e,r){var o=e.length,a=i(e,t._cache);return t._cache=t._cache.slice(o),t._prev=n.concat([t._prev,r?e:a]),a}r.encrypt=function(t,e,r){for(var i,a=n.allocUnsafe(0);e.length;){if(0===t._cache.length&&(t._cache=t._cipher.encryptBlock(t._prev),t._prev=n.allocUnsafe(0)),!(t._cache.length<=e.length)){a=n.concat([a,o(t,e,r)]);break}i=t._cache.length,a=n.concat([a,o(t,e.slice(0,i),r)]),e=e.slice(i)}return a}},{"buffer-xor":46,"safe-buffer":147}],27:[function(t,e,r){var n=t("safe-buffer").Buffer;function i(t,e,r){for(var n,i,a=-1,s=0;++a<8;)n=e&1<<7-a?128:0,s+=(128&(i=t._cipher.encryptBlock(t._prev)[0]^n))>>a%8,t._prev=o(t._prev,r?n:i);return s}function o(t,e){var r=t.length,i=-1,o=n.allocUnsafe(t.length);for(t=n.concat([t,n.from([e])]);++i>7;return o}r.encrypt=function(t,e,r){for(var o=e.length,a=n.allocUnsafe(o),s=-1;++s=0||!r.umod(t.prime1)||!r.umod(t.prime2);)r=new n(i(e));return r}e.exports=o,o.getr=a}).call(this,t("buffer").Buffer)},{"bn.js":"BN",buffer:47,randombytes:131}],39:[function(t,e,r){e.exports=t("./browser/algorithms.json")},{"./browser/algorithms.json":40}],40:[function(t,e,r){e.exports={sha224WithRSAEncryption:{sign:"rsa",hash:"sha224",id:"302d300d06096086480165030402040500041c"},"RSA-SHA224":{sign:"ecdsa/rsa",hash:"sha224",id:"302d300d06096086480165030402040500041c"},sha256WithRSAEncryption:{sign:"rsa",hash:"sha256",id:"3031300d060960864801650304020105000420"},"RSA-SHA256":{sign:"ecdsa/rsa",hash:"sha256",id:"3031300d060960864801650304020105000420"},sha384WithRSAEncryption:{sign:"rsa",hash:"sha384",id:"3041300d060960864801650304020205000430"},"RSA-SHA384":{sign:"ecdsa/rsa",hash:"sha384",id:"3041300d060960864801650304020205000430"},sha512WithRSAEncryption:{sign:"rsa",hash:"sha512",id:"3051300d060960864801650304020305000440"},"RSA-SHA512":{sign:"ecdsa/rsa",hash:"sha512",id:"3051300d060960864801650304020305000440"},"RSA-SHA1":{sign:"rsa",hash:"sha1",id:"3021300906052b0e03021a05000414"},"ecdsa-with-SHA1":{sign:"ecdsa",hash:"sha1",id:""},sha256:{sign:"ecdsa",hash:"sha256",id:""},sha224:{sign:"ecdsa",hash:"sha224",id:""},sha384:{sign:"ecdsa",hash:"sha384",id:""},sha512:{sign:"ecdsa",hash:"sha512",id:""},"DSA-SHA":{sign:"dsa",hash:"sha1",id:""},"DSA-SHA1":{sign:"dsa",hash:"sha1",id:""},DSA:{sign:"dsa",hash:"sha1",id:""},"DSA-WITH-SHA224":{sign:"dsa",hash:"sha224",id:""},"DSA-SHA224":{sign:"dsa",hash:"sha224",id:""},"DSA-WITH-SHA256":{sign:"dsa",hash:"sha256",id:""},"DSA-SHA256":{sign:"dsa",hash:"sha256",id:""},"DSA-WITH-SHA384":{sign:"dsa",hash:"sha384",id:""},"DSA-SHA384":{sign:"dsa",hash:"sha384",id:""},"DSA-WITH-SHA512":{sign:"dsa",hash:"sha512",id:""},"DSA-SHA512":{sign:"dsa",hash:"sha512",id:""},"DSA-RIPEMD160":{sign:"dsa",hash:"rmd160",id:""},ripemd160WithRSA:{sign:"rsa",hash:"rmd160",id:"3021300906052b2403020105000414"},"RSA-RIPEMD160":{sign:"rsa",hash:"rmd160",id:"3021300906052b2403020105000414"},md5WithRSAEncryption:{sign:"rsa",hash:"md5",id:"3020300c06082a864886f70d020505000410"},"RSA-MD5":{sign:"rsa",hash:"md5",id:"3020300c06082a864886f70d020505000410"}}},{}],41:[function(t,e,r){e.exports={"1.3.132.0.10":"secp256k1","1.3.132.0.33":"p224","1.2.840.10045.3.1.1":"p192","1.2.840.10045.3.1.7":"p256","1.3.132.0.34":"p384","1.3.132.0.35":"p521"}},{}],42:[function(t,e,r){(function(r){var n=t("create-hash"),i=t("stream"),o=t("inherits"),a=t("./sign"),s=t("./verify"),u=t("./algorithms.json");function f(t){i.Writable.call(this);var e=u[t];if(!e)throw new Error("Unknown message digest");this._hashType=e.hash,this._hash=n(e.hash),this._tag=e.id,this._signType=e.sign}function c(t){i.Writable.call(this);var e=u[t];if(!e)throw new Error("Unknown message digest");this._hash=n(e.hash),this._tag=e.id,this._signType=e.sign}function h(t){return new f(t)}function d(t){return new c(t)}Object.keys(u).forEach(function(t){u[t].id=new r(u[t].id,"hex"),u[t.toLowerCase()]=u[t]}),o(f,i.Writable),f.prototype._write=function(t,e,r){this._hash.update(t),r()},f.prototype.update=function(t,e){return"string"==typeof t&&(t=new r(t,e)),this._hash.update(t),this},f.prototype.sign=function(t,e){this.end();var r=this._hash.digest(),n=a(r,t,this._hashType,this._signType,this._tag);return e?n.toString(e):n},o(c,i.Writable),c.prototype._write=function(t,e,r){this._hash.update(t),r()},c.prototype.update=function(t,e){return"string"==typeof t&&(t=new r(t,e)),this._hash.update(t),this},c.prototype.verify=function(t,e,n){"string"==typeof e&&(e=new r(e,n)),this.end();var i=this._hash.digest();return s(e,i,t,this._signType,this._tag)},e.exports={Sign:h,Verify:d,createSign:h,createVerify:d}}).call(this,t("buffer").Buffer)},{"./algorithms.json":40,"./sign":43,"./verify":44,buffer:47,"create-hash":51,inherits:101,stream:156}],43:[function(t,e,r){(function(r){var n=t("create-hmac"),i=t("browserify-rsa"),o=t("elliptic").ec,a=t("bn.js"),s=t("parse-asn1"),u=t("./curves.json");function f(t,e,i,o){if((t=new r(t.toArray())).length0&&r.ishrn(n),r}function h(t,e,i){var o,a;do{for(o=new r(0);8*o.length=e)throw new Error("invalid sig")}e.exports=function(t,e,u,f,c){var h=o(u);if("ec"===h.type){if("ecdsa"!==f&&"ecdsa/rsa"!==f)throw new Error("wrong public key type");return function(t,e,r){var n=a[r.data.algorithm.curve.join(".")];if(!n)throw new Error("unknown curve "+r.data.algorithm.curve.join("."));var o=new i(n),s=r.data.subjectPrivateKey.data;return o.verify(e,t,s)}(t,e,h)}if("dsa"===h.type){if("dsa"!==f)throw new Error("wrong public key type");return function(t,e,r){var i=r.data.p,a=r.data.q,u=r.data.g,f=r.data.pub_key,c=o.signature.decode(t,"der"),h=c.s,d=c.r;s(h,a),s(d,a);var l=n.mont(i),p=h.invm(a);return 0===u.toRed(l).redPow(new n(e).mul(p).mod(a)).fromRed().mul(f.toRed(l).redPow(d.mul(p).mod(a)).fromRed()).mod(i).mod(a).cmp(d)}(t,e,h)}if("rsa"!==f&&"ecdsa/rsa"!==f)throw new Error("wrong public key type");e=r.concat([c,e]);for(var d=h.modulus.byteLength(),l=[1],p=0;e.length+l.length+2o)throw new RangeError("Invalid typed array length");var e=new Uint8Array(t);return e.__proto__=s.prototype,e}function s(t,e,r){if("number"==typeof t){if("string"==typeof e)throw new Error("If encoding is specified then the first argument must be a string");return c(t)}return u(t,e,r)}function u(t,e,r){if("number"==typeof t)throw new TypeError('"value" argument must not be a number');return N(t)?function(t,e,r){if(e<0||t.byteLength=o)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+o.toString(16)+" bytes");return 0|t}function l(t,e){if(s.isBuffer(t))return t.length;if(L(t)||N(t))return t.byteLength;"string"!=typeof t&&(t=""+t);var r=t.length;if(0===r)return 0;for(var n=!1;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return P(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return R(t).length;default:if(n)return P(t).length;e=(""+e).toLowerCase(),n=!0}}function p(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function b(t,e,r,n,i){if(0===t.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),F(r=+r)&&(r=i?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(i)return-1;r=t.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof e&&(e=s.from(e,n)),s.isBuffer(e))return 0===e.length?-1:m(t,e,r,n,i);if("number"==typeof e)return e&=255,"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):m(t,[e],r,n,i);throw new TypeError("val must be string, number or Buffer")}function m(t,e,r,n,i){var o,a=1,s=t.length,u=e.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;a=2,s/=2,u/=2,r/=2}function f(t,e){return 1===a?t[e]:t.readUInt16BE(e*a)}if(i){var c=-1;for(o=r;os&&(r=s-u),o=r;o>=0;o--){for(var h=!0,d=0;di&&(n=i):n=i;var o=e.length;if(o%2!=0)throw new TypeError("Invalid hex string");n>o/2&&(n=o/2);for(var a=0;a239?4:f>223?3:f>191?2:1;if(i+h<=r)switch(h){case 1:f<128&&(c=f);break;case 2:128==(192&(o=t[i+1]))&&(u=(31&f)<<6|63&o)>127&&(c=u);break;case 3:o=t[i+1],a=t[i+2],128==(192&o)&&128==(192&a)&&(u=(15&f)<<12|(63&o)<<6|63&a)>2047&&(u<55296||u>57343)&&(c=u);break;case 4:o=t[i+1],a=t[i+2],s=t[i+3],128==(192&o)&&128==(192&a)&&128==(192&s)&&(u=(15&f)<<18|(63&o)<<12|(63&a)<<6|63&s)>65535&&u<1114112&&(c=u)}null===c?(c=65533,h=1):c>65535&&(c-=65536,n.push(c>>>10&1023|55296),c=56320|1023&c),n.push(c),i+=h}return function(t){var e=t.length;if(e<=_)return String.fromCharCode.apply(String,t);var r="",n=0;for(;nthis.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return k(this,e,r);case"utf8":case"utf-8":return w(this,e,r);case"ascii":return M(this,e,r);case"latin1":case"binary":return x(this,e,r);case"base64":return g(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}.apply(this,arguments)},s.prototype.equals=function(t){if(!s.isBuffer(t))throw new TypeError("Argument must be a Buffer");return this===t||0===s.compare(this,t)},s.prototype.inspect=function(){var t="",e=r.INSPECT_MAX_BYTES;return this.length>0&&(t=this.toString("hex",0,e).match(/.{2}/g).join(" "),this.length>e&&(t+=" ... ")),""},s.prototype.compare=function(t,e,r,n,i){if(!s.isBuffer(t))throw new TypeError("Argument must be a Buffer");if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),e<0||r>t.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&e>=r)return 0;if(n>=i)return-1;if(e>=r)return 1;if(this===t)return 0;for(var o=(i>>>=0)-(n>>>=0),a=(r>>>=0)-(e>>>=0),u=Math.min(o,a),f=this.slice(n,i),c=t.slice(e,r),h=0;h>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n="utf8")):(n=r,r=void 0)}var i=this.length-e;if((void 0===r||r>i)&&(r=i),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var o,a,s,u,f,c,h,d,l,p=!1;;)switch(n){case"hex":return y(this,t,e,r);case"utf8":case"utf-8":return d=e,l=r,O(P(t,(h=this).length-d),h,d,l);case"ascii":return v(this,t,e,r);case"latin1":case"binary":return v(this,t,e,r);case"base64":return u=this,f=e,c=r,O(R(t),u,f,c);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return a=e,s=r,O(function(t,e){for(var r,n,i,o=[],a=0;a>8,i=r%256,o.push(i),o.push(n);return o}(t,(o=this).length-a),o,a,s);default:if(p)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),p=!0}},s.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var _=4096;function M(t,e,r){var n="";r=Math.min(t.length,r);for(var i=e;in)&&(r=n);for(var i="",o=e;or)throw new RangeError("Trying to access beyond buffer length")}function A(t,e,r,n,i,o){if(!s.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>i||et.length)throw new RangeError("Index out of range")}function j(t,e,r,n,i,o){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function I(t,e,r,n,o){return e=+e,r>>>=0,o||j(t,0,r,4),i.write(t,e,r,n,23,4),r+4}function B(t,e,r,n,o){return e=+e,r>>>=0,o||j(t,0,r,8),i.write(t,e,r,n,52,8),r+8}s.prototype.slice=function(t,e){var r=this.length;(t=~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),(e=void 0===e?r:~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),e>>=0,e>>>=0,r||E(t,e,this.length);for(var n=this[t],i=1,o=0;++o>>=0,e>>>=0,r||E(t,e,this.length);for(var n=this[t+--e],i=1;e>0&&(i*=256);)n+=this[t+--e]*i;return n},s.prototype.readUInt8=function(t,e){return t>>>=0,e||E(t,1,this.length),this[t]},s.prototype.readUInt16LE=function(t,e){return t>>>=0,e||E(t,2,this.length),this[t]|this[t+1]<<8},s.prototype.readUInt16BE=function(t,e){return t>>>=0,e||E(t,2,this.length),this[t]<<8|this[t+1]},s.prototype.readUInt32LE=function(t,e){return t>>>=0,e||E(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},s.prototype.readUInt32BE=function(t,e){return t>>>=0,e||E(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},s.prototype.readIntLE=function(t,e,r){t>>>=0,e>>>=0,r||E(t,e,this.length);for(var n=this[t],i=1,o=0;++o=(i*=128)&&(n-=Math.pow(2,8*e)),n},s.prototype.readIntBE=function(t,e,r){t>>>=0,e>>>=0,r||E(t,e,this.length);for(var n=e,i=1,o=this[t+--n];n>0&&(i*=256);)o+=this[t+--n]*i;return o>=(i*=128)&&(o-=Math.pow(2,8*e)),o},s.prototype.readInt8=function(t,e){return t>>>=0,e||E(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},s.prototype.readInt16LE=function(t,e){t>>>=0,e||E(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},s.prototype.readInt16BE=function(t,e){t>>>=0,e||E(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},s.prototype.readInt32LE=function(t,e){return t>>>=0,e||E(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},s.prototype.readInt32BE=function(t,e){return t>>>=0,e||E(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},s.prototype.readFloatLE=function(t,e){return t>>>=0,e||E(t,4,this.length),i.read(this,t,!0,23,4)},s.prototype.readFloatBE=function(t,e){return t>>>=0,e||E(t,4,this.length),i.read(this,t,!1,23,4)},s.prototype.readDoubleLE=function(t,e){return t>>>=0,e||E(t,8,this.length),i.read(this,t,!0,52,8)},s.prototype.readDoubleBE=function(t,e){return t>>>=0,e||E(t,8,this.length),i.read(this,t,!1,52,8)},s.prototype.writeUIntLE=function(t,e,r,n){(t=+t,e>>>=0,r>>>=0,n)||A(this,t,e,r,Math.pow(2,8*r)-1,0);var i=1,o=0;for(this[e]=255&t;++o>>=0,r>>>=0,n)||A(this,t,e,r,Math.pow(2,8*r)-1,0);var i=r-1,o=1;for(this[e+i]=255&t;--i>=0&&(o*=256);)this[e+i]=t/o&255;return e+r},s.prototype.writeUInt8=function(t,e,r){return t=+t,e>>>=0,r||A(this,t,e,1,255,0),this[e]=255&t,e+1},s.prototype.writeUInt16LE=function(t,e,r){return t=+t,e>>>=0,r||A(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},s.prototype.writeUInt16BE=function(t,e,r){return t=+t,e>>>=0,r||A(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},s.prototype.writeUInt32LE=function(t,e,r){return t=+t,e>>>=0,r||A(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},s.prototype.writeUInt32BE=function(t,e,r){return t=+t,e>>>=0,r||A(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},s.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e>>>=0,!n){var i=Math.pow(2,8*r-1);A(this,t,e,r,i-1,-i)}var o=0,a=1,s=0;for(this[e]=255&t;++o>0)-s&255;return e+r},s.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e>>>=0,!n){var i=Math.pow(2,8*r-1);A(this,t,e,r,i-1,-i)}var o=r-1,a=1,s=0;for(this[e+o]=255&t;--o>=0&&(a*=256);)t<0&&0===s&&0!==this[e+o+1]&&(s=1),this[e+o]=(t/a>>0)-s&255;return e+r},s.prototype.writeInt8=function(t,e,r){return t=+t,e>>>=0,r||A(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},s.prototype.writeInt16LE=function(t,e,r){return t=+t,e>>>=0,r||A(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},s.prototype.writeInt16BE=function(t,e,r){return t=+t,e>>>=0,r||A(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},s.prototype.writeInt32LE=function(t,e,r){return t=+t,e>>>=0,r||A(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},s.prototype.writeInt32BE=function(t,e,r){return t=+t,e>>>=0,r||A(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},s.prototype.writeFloatLE=function(t,e,r){return I(this,t,e,!0,r)},s.prototype.writeFloatBE=function(t,e,r){return I(this,t,e,!1,r)},s.prototype.writeDoubleLE=function(t,e,r){return B(this,t,e,!0,r)},s.prototype.writeDoubleBE=function(t,e,r){return B(this,t,e,!1,r)},s.prototype.copy=function(t,e,r,n){if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e=0;--i)t[i+e]=this[i+r];else if(o<1e3)for(i=0;i>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),"number"==typeof t)for(o=e;o55295&&r<57344){if(!i){if(r>56319){(e-=3)>-1&&o.push(239,191,189);continue}if(a+1===n){(e-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(r<56320){(e-=3)>-1&&o.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(e-=3)>-1&&o.push(239,191,189);if(i=null,r<128){if((e-=1)<0)break;o.push(r)}else if(r<2048){if((e-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function R(t){return n.toByteArray(function(t){if((t=t.trim().replace(T,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function O(t,e,r,n){for(var i=0;i=e.length||i>=t.length);++i)e[i+r]=t[i];return i}function N(t){return t instanceof ArrayBuffer||null!=t&&null!=t.constructor&&"ArrayBuffer"===t.constructor.name&&"number"==typeof t.byteLength}function L(t){return"function"==typeof ArrayBuffer.isView&&ArrayBuffer.isView(t)}function F(t){return t!=t}},{"base64-js":15,ieee754:99}],48:[function(t,e,r){var n=t("safe-buffer").Buffer,i=t("stream").Transform,o=t("string_decoder").StringDecoder;function a(t){i.call(this),this.hashMode="string"==typeof t,this.hashMode?this[t]=this._finalOrDigest:this.final=this._finalOrDigest,this._final&&(this.__final=this._final,this._final=null),this._decoder=null,this._encoding=null}t("inherits")(a,i),a.prototype.update=function(t,e,r){"string"==typeof t&&(t=n.from(t,e));var i=this._update(t);return this.hashMode?this:(r&&(i=this._toString(i,r)),i)},a.prototype.setAutoPadding=function(){},a.prototype.getAuthTag=function(){throw new Error("trying to get auth tag in unsupported state")},a.prototype.setAuthTag=function(){throw new Error("trying to set auth tag in unsupported state")},a.prototype.setAAD=function(){throw new Error("trying to set aad in unsupported state")},a.prototype._transform=function(t,e,r){var n;try{this.hashMode?this._update(t):this.push(this._update(t))}catch(t){n=t}finally{r(n)}},a.prototype._flush=function(t){var e;try{this.push(this.__final())}catch(t){e=t}t(e)},a.prototype._finalOrDigest=function(t){var e=this.__final()||n.alloc(0);return t&&(e=this._toString(e,t,!0)),e},a.prototype._toString=function(t,e,r){if(this._decoder||(this._decoder=new o(e),this._encoding=e),this._encoding!==e)throw new Error("can't switch encodings");var n=this._decoder.write(t);return r&&(n+=this._decoder.end()),n},e.exports=a},{inherits:101,"safe-buffer":147,stream:156,string_decoder:157}],49:[function(t,e,r){(function(t){function e(t){return Object.prototype.toString.call(t)}r.isArray=function(t){return Array.isArray?Array.isArray(t):"[object Array]"===e(t)},r.isBoolean=function(t){return"boolean"==typeof t},r.isNull=function(t){return null===t},r.isNullOrUndefined=function(t){return null==t},r.isNumber=function(t){return"number"==typeof t},r.isString=function(t){return"string"==typeof t},r.isSymbol=function(t){return"symbol"===(void 0===t?"undefined":_typeof(t))},r.isUndefined=function(t){return void 0===t},r.isRegExp=function(t){return"[object RegExp]"===e(t)},r.isObject=function(t){return"object"===(void 0===t?"undefined":_typeof(t))&&null!==t},r.isDate=function(t){return"[object Date]"===e(t)},r.isError=function(t){return"[object Error]"===e(t)||t instanceof Error},r.isFunction=function(t){return"function"==typeof t},r.isPrimitive=function(t){return null===t||"boolean"==typeof t||"number"==typeof t||"string"==typeof t||"symbol"===(void 0===t?"undefined":_typeof(t))||void 0===t},r.isBuffer=t.isBuffer}).call(this,{isBuffer:t("../../is-buffer/index.js")})},{"../../is-buffer/index.js":102}],50:[function(t,e,r){(function(r){var n=t("elliptic"),i=t("bn.js");e.exports=function(t){return new a(t)};var o={secp256k1:{name:"secp256k1",byteLength:32},secp224r1:{name:"p224",byteLength:28},prime256v1:{name:"p256",byteLength:32},prime192v1:{name:"p192",byteLength:24},ed25519:{name:"ed25519",byteLength:32},secp384r1:{name:"p384",byteLength:48},secp521r1:{name:"p521",byteLength:66}};function a(t){this.curveType=o[t],this.curveType||(this.curveType={name:t}),this.curve=new n.ec(this.curveType.name),this.keys=void 0}function s(t,e,n){Array.isArray(t)||(t=t.toArray());var i=new r(t);if(n&&i.length>>2),a=0,s=0;a>5]|=128<>>9<<4)]=e;for(var r=1732584193,n=-271733879,i=-1732584194,o=271733878,h=0;h>>32-s,r);var a,s}function a(t,e,r,n,i,a,s){return o(e&r|~e&n,t,e,i,a,s)}function s(t,e,r,n,i,a,s){return o(e&n|r&~n,t,e,i,a,s)}function u(t,e,r,n,i,a,s){return o(e^r^n,t,e,i,a,s)}function f(t,e,r,n,i,a,s){return o(r^(e|~n),t,e,i,a,s)}function c(t,e){var r=(65535&t)+(65535&e);return(t>>16)+(e>>16)+(r>>16)<<16|65535&r}e.exports=function(t){return n(t,i)}},{"./make-hash":52}],54:[function(t,e,r){var n=t("inherits"),i=t("./legacy"),o=t("cipher-base"),a=t("safe-buffer").Buffer,s=t("create-hash/md5"),u=t("ripemd160"),f=t("sha.js"),c=a.alloc(128);function h(t,e){o.call(this,"digest"),"string"==typeof e&&(e=a.from(e));var r="sha512"===t||"sha384"===t?128:64;(this._alg=t,this._key=e,e.length>r)?e=("rmd160"===t?new u:f(t)).update(e).digest():e.lengths?e=t(e):e.length0;n--)e+=this._buffer(t,e),r+=this._flushBuffer(i,r);return e+=this._buffer(t,e),i},i.prototype.final=function(t){var e,r;return t&&(e=this.update(t)),r="encrypt"===this.type?this._finalEncrypt():this._finalDecrypt(),e?e.concat(r):r},i.prototype._pad=function(t,e){if(0===e)return!1;for(;e>>1];r=a.r28shl(r,s),i=a.r28shl(i,s),a.pc2(r,i,t.keys,o)}},u.prototype._update=function(t,e,r,n){var i=this._desState,o=a.readUInt32BE(t,e),s=a.readUInt32BE(t,e+4);a.ip(o,s,i.tmp,0),o=i.tmp[0],s=i.tmp[1],"encrypt"===this.type?this._encrypt(i,o,s,i.tmp,0):this._decrypt(i,o,s,i.tmp,0),o=i.tmp[0],s=i.tmp[1],a.writeUInt32BE(r,o,n),a.writeUInt32BE(r,s,n+4)},u.prototype._pad=function(t,e){for(var r=t.length-e,n=e;n>>0,o=d}a.rip(s,o,n,i)},u.prototype._decrypt=function(t,e,r,n,i){for(var o=r,s=e,u=t.keys.length-2;u>=0;u-=2){var f=t.keys[u],c=t.keys[u+1];a.expand(o,t.tmp,0),f^=t.tmp[0],c^=t.tmp[1];var h=a.substitute(f,c),d=o;o=(s^a.permute(h))>>>0,s=d}a.rip(o,s,n,i)}},{"../des":57,inherits:101,"minimalistic-assert":107}],61:[function(t,e,r){var n=t("minimalistic-assert"),i=t("inherits"),o=t("../des"),a=o.Cipher,s=o.DES;function u(t){a.call(this,t);var e=new function(t,e){n.equal(e.length,24,"Invalid key length");var r=e.slice(0,8),i=e.slice(8,16),o=e.slice(16,24);this.ciphers="encrypt"===t?[s.create({type:"encrypt",key:r}),s.create({type:"decrypt",key:i}),s.create({type:"encrypt",key:o})]:[s.create({type:"decrypt",key:o}),s.create({type:"encrypt",key:i}),s.create({type:"decrypt",key:r})]}(this.type,this.options.key);this._edeState=e}i(u,a),e.exports=u,u.create=function(t){return new u(t)},u.prototype._update=function(t,e,r,n){var i=this._edeState;i.ciphers[0]._update(t,e,r,n),i.ciphers[1]._update(r,n,r,n),i.ciphers[2]._update(r,n,r,n)},u.prototype._pad=s.prototype._pad,u.prototype._unpad=s.prototype._unpad},{"../des":57,inherits:101,"minimalistic-assert":107}],62:[function(t,e,r){r.readUInt32BE=function(t,e){return(t[0+e]<<24|t[1+e]<<16|t[2+e]<<8|t[3+e])>>>0},r.writeUInt32BE=function(t,e,r){t[0+r]=e>>>24,t[1+r]=e>>>16&255,t[2+r]=e>>>8&255,t[3+r]=255&e},r.ip=function(t,e,r,n){for(var i=0,o=0,a=6;a>=0;a-=2){for(var s=0;s<=24;s+=8)i<<=1,i|=e>>>s+a&1;for(s=0;s<=24;s+=8)i<<=1,i|=t>>>s+a&1}for(a=6;a>=0;a-=2){for(s=1;s<=25;s+=8)o<<=1,o|=e>>>s+a&1;for(s=1;s<=25;s+=8)o<<=1,o|=t>>>s+a&1}r[n+0]=i>>>0,r[n+1]=o>>>0},r.rip=function(t,e,r,n){for(var i=0,o=0,a=0;a<4;a++)for(var s=24;s>=0;s-=8)i<<=1,i|=e>>>s+a&1,i<<=1,i|=t>>>s+a&1;for(a=4;a<8;a++)for(s=24;s>=0;s-=8)o<<=1,o|=e>>>s+a&1,o<<=1,o|=t>>>s+a&1;r[n+0]=i>>>0,r[n+1]=o>>>0},r.pc1=function(t,e,r,n){for(var i=0,o=0,a=7;a>=5;a--){for(var s=0;s<=24;s+=8)i<<=1,i|=e>>s+a&1;for(s=0;s<=24;s+=8)i<<=1,i|=t>>s+a&1}for(s=0;s<=24;s+=8)i<<=1,i|=e>>s+a&1;for(a=1;a<=3;a++){for(s=0;s<=24;s+=8)o<<=1,o|=e>>s+a&1;for(s=0;s<=24;s+=8)o<<=1,o|=t>>s+a&1}for(s=0;s<=24;s+=8)o<<=1,o|=t>>s+a&1;r[n+0]=i>>>0,r[n+1]=o>>>0},r.r28shl=function(t,e){return t<>>28-e};var n=[14,11,17,4,27,23,25,0,13,22,7,18,5,9,16,24,2,20,12,21,1,8,15,26,15,4,25,19,9,1,26,16,5,11,23,8,12,7,17,0,22,3,10,14,6,20,27,24];r.pc2=function(t,e,r,i){for(var o=0,a=0,s=n.length>>>1,u=0;u>>n[u]&1;for(u=s;u>>n[u]&1;r[i+0]=o>>>0,r[i+1]=a>>>0},r.expand=function(t,e,r){var n=0,i=0;n=(1&t)<<5|t>>>27;for(var o=23;o>=15;o-=4)n<<=6,n|=t>>>o&63;for(o=11;o>=3;o-=4)i|=t>>>o&63,i<<=6;i|=(31&t)<<1|t>>>31,e[r+0]=n>>>0,e[r+1]=i>>>0};var i=[14,0,4,15,13,7,1,4,2,14,15,2,11,13,8,1,3,10,10,6,6,12,12,11,5,9,9,5,0,3,7,8,4,15,1,12,14,8,8,2,13,4,6,9,2,1,11,7,15,5,12,11,9,3,7,14,3,10,10,0,5,6,0,13,15,3,1,13,8,4,14,7,6,15,11,2,3,8,4,14,9,12,7,0,2,1,13,10,12,6,0,9,5,11,10,5,0,13,14,8,7,10,11,1,10,3,4,15,13,4,1,2,5,11,8,6,12,7,6,12,9,0,3,5,2,14,15,9,10,13,0,7,9,0,14,9,6,3,3,4,15,6,5,10,1,2,13,8,12,5,7,14,11,12,4,11,2,15,8,1,13,1,6,10,4,13,9,0,8,6,15,9,3,8,0,7,11,4,1,15,2,14,12,3,5,11,10,5,14,2,7,12,7,13,13,8,14,11,3,5,0,6,6,15,9,0,10,3,1,4,2,7,8,2,5,12,11,1,12,10,4,14,15,9,10,3,6,15,9,0,0,6,12,10,11,1,7,13,13,8,15,9,1,4,3,5,14,11,5,12,2,7,8,2,4,14,2,14,12,11,4,2,1,12,7,4,10,7,11,13,6,1,8,5,5,0,3,15,15,10,13,3,0,9,14,8,9,6,4,11,2,8,1,12,11,7,10,1,13,14,7,2,8,13,15,6,9,15,12,0,5,9,6,10,3,4,0,5,14,3,12,10,1,15,10,4,15,2,9,7,2,12,6,9,8,5,0,6,13,1,3,13,4,14,14,0,7,11,5,3,11,8,9,4,14,3,15,2,5,12,2,9,8,5,12,15,3,10,7,11,0,14,4,1,10,7,1,6,13,0,11,8,6,13,4,13,11,0,2,11,14,7,15,4,0,9,8,1,13,10,3,14,12,3,9,5,7,12,5,2,10,15,6,8,1,6,1,6,4,11,11,13,13,8,12,1,3,4,7,10,14,7,10,9,15,5,6,0,8,15,0,14,5,2,9,3,2,12,13,1,2,15,8,13,4,8,6,10,15,3,11,7,1,4,10,12,9,5,3,6,14,11,5,0,0,14,12,9,7,2,7,2,11,1,4,14,1,7,9,4,12,10,14,8,2,13,0,15,6,12,10,9,13,0,15,3,3,5,5,6,8,11];r.substitute=function(t,e){for(var r=0,n=0;n<4;n++){r<<=4,r|=i[64*n+(t>>>18-6*n&63)]}for(n=0;n<4;n++){r<<=4,r|=i[256+64*n+(e>>>18-6*n&63)]}return r>>>0};var o=[16,25,12,11,3,20,4,15,31,17,9,6,27,14,1,22,30,24,8,18,0,5,29,23,13,19,2,26,10,21,28,7];r.permute=function(t){for(var e=0,r=0;r>>o[r]&1;return e>>>0},r.padSplit=function(t,e,r){for(var n=t.toString(2);n.lengtht;)r.ishrn(1);if(r.isEven()&&r.iadd(s),r.testn(1)||r.iadd(u),e.cmp(u)){if(!e.cmp(f))for(;r.mod(c).cmp(h);)r.iadd(l)}else for(;r.mod(o).cmp(d);)r.iadd(l);if(b(p=r.shrn(1))&&b(r)&&m(p)&&m(r)&&a.test(p)&&a.test(r))return r}}},{"bn.js":"BN","miller-rabin":106,randombytes:131}],66:[function(t,e,r){e.exports={modp1:{gen:"02",prime:"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a63a3620ffffffffffffffff"},modp2:{gen:"02",prime:"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece65381ffffffffffffffff"},modp5:{gen:"02",prime:"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff"},modp14:{gen:"02",prime:"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff"},modp15:{gen:"02",prime:"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a93ad2caffffffffffffffff"},modp16:{gen:"02",prime:"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c934063199ffffffffffffffff"},modp17:{gen:"02",prime:"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dcc4024ffffffffffffffff"},modp18:{gen:"02",prime:"ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dbe115974a3926f12fee5e438777cb6a932df8cd8bec4d073b931ba3bc832b68d9dd300741fa7bf8afc47ed2576f6936ba424663aab639c5ae4f5683423b4742bf1c978238f16cbe39d652de3fdb8befc848ad922222e04a4037c0713eb57a81a23f0c73473fc646cea306b4bcbc8862f8385ddfa9d4b7fa2c087e879683303ed5bdd3a062b3cf5b3a278a66d2a13f83f44f82ddf310ee074ab6a364597e899a0255dc164f31cc50846851df9ab48195ded7ea1b1d510bd7ee74d73faf36bc31ecfa268359046f4eb879f924009438b481c6cd7889a002ed5ee382bc9190da6fc026e479558e4475677e9aa9e3050e2765694dfc81f56e880b96e7160c980dd98edd3dfffffffffffffffff"}}},{}],67:[function(t,e,r){var n=r;n.version=t("../package.json").version,n.utils=t("./elliptic/utils"),n.rand=t("brorand"),n.curve=t("./elliptic/curve"),n.curves=t("./elliptic/curves"),n.ec=t("./elliptic/ec"),n.eddsa=t("./elliptic/eddsa")},{"../package.json":82,"./elliptic/curve":70,"./elliptic/curves":73,"./elliptic/ec":74,"./elliptic/eddsa":77,"./elliptic/utils":81,brorand:16}],68:[function(t,e,r){var n=t("bn.js"),i=t("../../elliptic").utils,o=i.getNAF,a=i.getJSF,s=i.assert;function u(t,e){this.type=t,this.p=new n(e.p,16),this.red=e.prime?n.red(e.prime):n.mont(this.p),this.zero=new n(0).toRed(this.red),this.one=new n(1).toRed(this.red),this.two=new n(2).toRed(this.red),this.n=e.n&&new n(e.n,16),this.g=e.g&&this.pointFromJSON(e.g,e.gRed),this._wnafT1=new Array(4),this._wnafT2=new Array(4),this._wnafT3=new Array(4),this._wnafT4=new Array(4);var r=this.n&&this.p.div(this.n);!r||r.cmpn(100)>0?this.redN=null:(this._maxwellTrick=!0,this.redN=this.n.toRed(this.red))}function f(t,e){this.curve=t,this.type=e,this.precomputed=null}e.exports=u,u.prototype.point=function(){throw new Error("Not implemented")},u.prototype.validate=function(){throw new Error("Not implemented")},u.prototype._fixedNafMul=function(t,e){s(t.precomputed);var r=t._getDoubles(),n=o(e,1),i=(1<=u;e--)f=(f<<1)+n[e];a.push(f)}for(var c=this.jpoint(null,null,null),h=this.jpoint(null,null,null),d=i;d>0;d--){for(u=0;u=0;f--){for(e=0;f>=0&&0===a[f];f--)e++;if(f>=0&&e++,u=u.dblp(e),f<0)break;var c=a[f];s(0!==c),u="affine"===t.type?c>0?u.mixedAdd(i[c-1>>1]):u.mixedAdd(i[-c-1>>1].neg()):c>0?u.add(i[c-1>>1]):u.add(i[-c-1>>1].neg())}return"affine"===t.type?u.toP():u},u.prototype._wnafMulAdd=function(t,e,r,n,i){for(var s=this._wnafT1,u=this._wnafT2,f=this._wnafT3,c=0,h=0;h=1;h-=2){var l=h-1,p=h;if(1===s[l]&&1===s[p]){var b=[e[l],null,null,e[p]];0===e[l].y.cmp(e[p].y)?(b[1]=e[l].add(e[p]),b[2]=e[l].toJ().mixedAdd(e[p].neg())):0===e[l].y.cmp(e[p].y.redNeg())?(b[1]=e[l].toJ().mixedAdd(e[p]),b[2]=e[l].add(e[p].neg())):(b[1]=e[l].toJ().mixedAdd(e[p]),b[2]=e[l].toJ().mixedAdd(e[p].neg()));var m=[-3,-1,-5,-7,0,7,5,1,3],y=a(r[l],r[p]);c=Math.max(y[0].length,c),f[l]=new Array(c),f[p]=new Array(c);for(var v=0;v=0;h--){for(var x=0;h>=0;){var k=!0;for(v=0;v=0&&x++,_=_.dblp(x),h<0)break;for(v=0;v0?S=u[v][E-1>>1]:E<0&&(S=u[v][-E-1>>1].neg()),_="affine"===S.type?_.mixedAdd(S):_.add(S))}}for(h=0;h=Math.ceil((t.bitLength()+1)/e.step)},f.prototype._getDoubles=function(t,e){if(this.precomputed&&this.precomputed.doubles)return this.precomputed.doubles;for(var r=[this],n=this,i=0;i":""},c.prototype.isInfinity=function(){return 0===this.x.cmpn(0)&&0===this.y.cmp(this.z)},c.prototype._extDbl=function(){var t=this.x.redSqr(),e=this.y.redSqr(),r=this.z.redSqr();r=r.redIAdd(r);var n=this.curve._mulA(t),i=this.x.redAdd(this.y).redSqr().redISub(t).redISub(e),o=n.redAdd(e),a=o.redSub(r),s=n.redSub(e),u=i.redMul(a),f=o.redMul(s),c=i.redMul(s),h=a.redMul(o);return this.curve.point(u,f,h,c)},c.prototype._projDbl=function(){var t,e,r,n=this.x.redAdd(this.y).redSqr(),i=this.x.redSqr(),o=this.y.redSqr();if(this.curve.twisted){var a=(f=this.curve._mulA(i)).redAdd(o);if(this.zOne)t=n.redSub(i).redSub(o).redMul(a.redSub(this.curve.two)),e=a.redMul(f.redSub(o)),r=a.redSqr().redSub(a).redSub(a);else{var s=this.z.redSqr(),u=a.redSub(s).redISub(s);t=n.redSub(i).redISub(o).redMul(u),e=a.redMul(f.redSub(o)),r=a.redMul(u)}}else{var f=i.redAdd(o);s=this.curve._mulC(this.c.redMul(this.z)).redSqr(),u=f.redSub(s).redSub(s);t=this.curve._mulC(n.redISub(f)).redMul(u),e=this.curve._mulC(f).redMul(i.redISub(o)),r=f.redMul(u)}return this.curve.point(t,e,r)},c.prototype.dbl=function(){return this.isInfinity()?this:this.curve.extended?this._extDbl():this._projDbl()},c.prototype._extAdd=function(t){var e=this.y.redSub(this.x).redMul(t.y.redSub(t.x)),r=this.y.redAdd(this.x).redMul(t.y.redAdd(t.x)),n=this.t.redMul(this.curve.dd).redMul(t.t),i=this.z.redMul(t.z.redAdd(t.z)),o=r.redSub(e),a=i.redSub(n),s=i.redAdd(n),u=r.redAdd(e),f=o.redMul(a),c=s.redMul(u),h=o.redMul(u),d=a.redMul(s);return this.curve.point(f,c,d,h)},c.prototype._projAdd=function(t){var e,r,n=this.z.redMul(t.z),i=n.redSqr(),o=this.x.redMul(t.x),a=this.y.redMul(t.y),s=this.curve.d.redMul(o).redMul(a),u=i.redSub(s),f=i.redAdd(s),c=this.x.redAdd(this.y).redMul(t.x.redAdd(t.y)).redISub(o).redISub(a),h=n.redMul(u).redMul(c);return this.curve.twisted?(e=n.redMul(f).redMul(a.redSub(this.curve._mulA(o))),r=u.redMul(f)):(e=n.redMul(f).redMul(a.redSub(o)),r=this.curve._mulC(u).redMul(f)),this.curve.point(h,e,r)},c.prototype.add=function(t){return this.isInfinity()?t:t.isInfinity()?this:this.curve.extended?this._extAdd(t):this._projAdd(t)},c.prototype.mul=function(t){return this._hasDoubles(t)?this.curve._fixedNafMul(this,t):this.curve._wnafMul(this,t)},c.prototype.mulAdd=function(t,e,r){return this.curve._wnafMulAdd(1,[this,e],[t,r],2,!1)},c.prototype.jmulAdd=function(t,e,r){return this.curve._wnafMulAdd(1,[this,e],[t,r],2,!0)},c.prototype.normalize=function(){if(this.zOne)return this;var t=this.z.redInvm();return this.x=this.x.redMul(t),this.y=this.y.redMul(t),this.t&&(this.t=this.t.redMul(t)),this.z=this.curve.one,this.zOne=!0,this},c.prototype.neg=function(){return this.curve.point(this.x.redNeg(),this.y,this.z,this.t&&this.t.redNeg())},c.prototype.getX=function(){return this.normalize(),this.x.fromRed()},c.prototype.getY=function(){return this.normalize(),this.y.fromRed()},c.prototype.eq=function(t){return this===t||0===this.getX().cmp(t.getX())&&0===this.getY().cmp(t.getY())},c.prototype.eqXToP=function(t){var e=t.toRed(this.curve.red).redMul(this.z);if(0===this.x.cmp(e))return!0;for(var r=t.clone(),n=this.curve.redN.redMul(this.z);;){if(r.iadd(this.curve.n),r.cmp(this.curve.p)>=0)return!1;if(e.redIAdd(n),0===this.x.cmp(e))return!0}return!1},c.prototype.toP=c.prototype.normalize,c.prototype.mixedAdd=c.prototype.add},{"../../elliptic":67,"../curve":70,"bn.js":"BN",inherits:101}],70:[function(t,e,r){var n=r;n.base=t("./base"),n.short=t("./short"),n.mont=t("./mont"),n.edwards=t("./edwards")},{"./base":68,"./edwards":69,"./mont":71,"./short":72}],71:[function(t,e,r){var n=t("../curve"),i=t("bn.js"),o=t("inherits"),a=n.base,s=t("../../elliptic").utils;function u(t){a.call(this,"mont",t),this.a=new i(t.a,16).toRed(this.red),this.b=new i(t.b,16).toRed(this.red),this.i4=new i(4).toRed(this.red).redInvm(),this.two=new i(2).toRed(this.red),this.a24=this.i4.redMul(this.a.redAdd(this.two))}function f(t,e,r){a.BasePoint.call(this,t,"projective"),null===e&&null===r?(this.x=this.curve.one,this.z=this.curve.zero):(this.x=new i(e,16),this.z=new i(r,16),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)))}o(u,a),e.exports=u,u.prototype.validate=function(t){var e=t.normalize().x,r=e.redSqr(),n=r.redMul(e).redAdd(r.redMul(this.a)).redAdd(e);return 0===n.redSqrt().redSqr().cmp(n)},o(f,a.BasePoint),u.prototype.decodePoint=function(t,e){return this.point(s.toArray(t,e),1)},u.prototype.point=function(t,e){return new f(this,t,e)},u.prototype.pointFromJSON=function(t){return f.fromJSON(this,t)},f.prototype.precompute=function(){},f.prototype._encode=function(){return this.getX().toArray("be",this.curve.p.byteLength())},f.fromJSON=function(t,e){return new f(t,e[0],e[1]||t.one)},f.prototype.inspect=function(){return this.isInfinity()?"":""},f.prototype.isInfinity=function(){return 0===this.z.cmpn(0)},f.prototype.dbl=function(){var t=this.x.redAdd(this.z).redSqr(),e=this.x.redSub(this.z).redSqr(),r=t.redSub(e),n=t.redMul(e),i=r.redMul(e.redAdd(this.curve.a24.redMul(r)));return this.curve.point(n,i)},f.prototype.add=function(){throw new Error("Not supported on Montgomery curve")},f.prototype.diffAdd=function(t,e){var r=this.x.redAdd(this.z),n=this.x.redSub(this.z),i=t.x.redAdd(t.z),o=t.x.redSub(t.z).redMul(r),a=i.redMul(n),s=e.z.redMul(o.redAdd(a).redSqr()),u=e.x.redMul(o.redISub(a).redSqr());return this.curve.point(s,u)},f.prototype.mul=function(t){for(var e=t.clone(),r=this,n=this.curve.point(null,null),i=[];0!==e.cmpn(0);e.iushrn(1))i.push(e.andln(1));for(var o=i.length-1;o>=0;o--)0===i[o]?(r=r.diffAdd(n,this),n=n.dbl()):(n=r.diffAdd(n,this),r=r.dbl());return n},f.prototype.mulAdd=function(){throw new Error("Not supported on Montgomery curve")},f.prototype.jumlAdd=function(){throw new Error("Not supported on Montgomery curve")},f.prototype.eq=function(t){return 0===this.getX().cmp(t.getX())},f.prototype.normalize=function(){return this.x=this.x.redMul(this.z.redInvm()),this.z=this.curve.one,this},f.prototype.getX=function(){return this.normalize(),this.x.fromRed()}},{"../../elliptic":67,"../curve":70,"bn.js":"BN",inherits:101}],72:[function(t,e,r){var n=t("../curve"),i=t("../../elliptic"),o=t("bn.js"),a=t("inherits"),s=n.base,u=i.utils.assert;function f(t){s.call(this,"short",t),this.a=new o(t.a,16).toRed(this.red),this.b=new o(t.b,16).toRed(this.red),this.tinv=this.two.redInvm(),this.zeroA=0===this.a.fromRed().cmpn(0),this.threeA=0===this.a.fromRed().sub(this.p).cmpn(-3),this.endo=this._getEndomorphism(t),this._endoWnafT1=new Array(4),this._endoWnafT2=new Array(4)}function c(t,e,r,n){s.BasePoint.call(this,t,"affine"),null===e&&null===r?(this.x=null,this.y=null,this.inf=!0):(this.x=new o(e,16),this.y=new o(r,16),n&&(this.x.forceRed(this.curve.red),this.y.forceRed(this.curve.red)),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.inf=!1)}function h(t,e,r,n){s.BasePoint.call(this,t,"jacobian"),null===e&&null===r&&null===n?(this.x=this.curve.one,this.y=this.curve.one,this.z=new o(0)):(this.x=new o(e,16),this.y=new o(r,16),this.z=new o(n,16)),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)),this.zOne=this.z===this.curve.one}a(f,s),e.exports=f,f.prototype._getEndomorphism=function(t){if(this.zeroA&&this.g&&this.n&&1===this.p.modn(3)){var e,r;if(t.beta)e=new o(t.beta,16).toRed(this.red);else{var n=this._getEndoRoots(this.p);e=(e=n[0].cmp(n[1])<0?n[0]:n[1]).toRed(this.red)}if(t.lambda)r=new o(t.lambda,16);else{var i=this._getEndoRoots(this.n);0===this.g.mul(i[0]).x.cmp(this.g.x.redMul(e))?r=i[0]:(r=i[1],u(0===this.g.mul(r).x.cmp(this.g.x.redMul(e))))}return{beta:e,lambda:r,basis:t.basis?t.basis.map(function(t){return{a:new o(t.a,16),b:new o(t.b,16)}}):this._getEndoBasis(r)}}},f.prototype._getEndoRoots=function(t){var e=t===this.p?this.red:o.mont(t),r=new o(2).toRed(e).redInvm(),n=r.redNeg(),i=new o(3).toRed(e).redNeg().redSqrt().redMul(r);return[n.redAdd(i).fromRed(),n.redSub(i).fromRed()]},f.prototype._getEndoBasis=function(t){for(var e,r,n,i,a,s,u,f,c,h=this.n.ushrn(Math.floor(this.n.bitLength()/2)),d=t,l=this.n.clone(),p=new o(1),b=new o(0),m=new o(0),y=new o(1),v=0;0!==d.cmpn(0);){var g=l.div(d);f=l.sub(g.mul(d)),c=m.sub(g.mul(p));var w=y.sub(g.mul(b));if(!n&&f.cmp(h)<0)e=u.neg(),r=p,n=f.neg(),i=c;else if(n&&2==++v)break;u=f,l=d,d=f,m=p,p=c,y=b,b=w}a=f.neg(),s=c;var _=n.sqr().add(i.sqr());return a.sqr().add(s.sqr()).cmp(_)>=0&&(a=e,s=r),n.negative&&(n=n.neg(),i=i.neg()),a.negative&&(a=a.neg(),s=s.neg()),[{a:n,b:i},{a:a,b:s}]},f.prototype._endoSplit=function(t){var e=this.endo.basis,r=e[0],n=e[1],i=n.b.mul(t).divRound(this.n),o=r.b.neg().mul(t).divRound(this.n),a=i.mul(r.a),s=o.mul(n.a),u=i.mul(r.b),f=o.mul(n.b);return{k1:t.sub(a).sub(s),k2:u.add(f).neg()}},f.prototype.pointFromX=function(t,e){(t=new o(t,16)).red||(t=t.toRed(this.red));var r=t.redSqr().redMul(t).redIAdd(t.redMul(this.a)).redIAdd(this.b),n=r.redSqrt();if(0!==n.redSqr().redSub(r).cmp(this.zero))throw new Error("invalid point");var i=n.fromRed().isOdd();return(e&&!i||!e&&i)&&(n=n.redNeg()),this.point(t,n)},f.prototype.validate=function(t){if(t.inf)return!0;var e=t.x,r=t.y,n=this.a.redMul(e),i=e.redSqr().redMul(e).redIAdd(n).redIAdd(this.b);return 0===r.redSqr().redISub(i).cmpn(0)},f.prototype._endoWnafMulAdd=function(t,e,r){for(var n=this._endoWnafT1,i=this._endoWnafT2,o=0;o":""},c.prototype.isInfinity=function(){return this.inf},c.prototype.add=function(t){if(this.inf)return t;if(t.inf)return this;if(this.eq(t))return this.dbl();if(this.neg().eq(t))return this.curve.point(null,null);if(0===this.x.cmp(t.x))return this.curve.point(null,null);var e=this.y.redSub(t.y);0!==e.cmpn(0)&&(e=e.redMul(this.x.redSub(t.x).redInvm()));var r=e.redSqr().redISub(this.x).redISub(t.x),n=e.redMul(this.x.redSub(r)).redISub(this.y);return this.curve.point(r,n)},c.prototype.dbl=function(){if(this.inf)return this;var t=this.y.redAdd(this.y);if(0===t.cmpn(0))return this.curve.point(null,null);var e=this.curve.a,r=this.x.redSqr(),n=t.redInvm(),i=r.redAdd(r).redIAdd(r).redIAdd(e).redMul(n),o=i.redSqr().redISub(this.x.redAdd(this.x)),a=i.redMul(this.x.redSub(o)).redISub(this.y);return this.curve.point(o,a)},c.prototype.getX=function(){return this.x.fromRed()},c.prototype.getY=function(){return this.y.fromRed()},c.prototype.mul=function(t){return t=new o(t,16),this._hasDoubles(t)?this.curve._fixedNafMul(this,t):this.curve.endo?this.curve._endoWnafMulAdd([this],[t]):this.curve._wnafMul(this,t)},c.prototype.mulAdd=function(t,e,r){var n=[this,e],i=[t,r];return this.curve.endo?this.curve._endoWnafMulAdd(n,i):this.curve._wnafMulAdd(1,n,i,2)},c.prototype.jmulAdd=function(t,e,r){var n=[this,e],i=[t,r];return this.curve.endo?this.curve._endoWnafMulAdd(n,i,!0):this.curve._wnafMulAdd(1,n,i,2,!0)},c.prototype.eq=function(t){return this===t||this.inf===t.inf&&(this.inf||0===this.x.cmp(t.x)&&0===this.y.cmp(t.y))},c.prototype.neg=function(t){if(this.inf)return this;var e=this.curve.point(this.x,this.y.redNeg());if(t&&this.precomputed){var r=this.precomputed,n=function(t){return t.neg()};e.precomputed={naf:r.naf&&{wnd:r.naf.wnd,points:r.naf.points.map(n)},doubles:r.doubles&&{step:r.doubles.step,points:r.doubles.points.map(n)}}}return e},c.prototype.toJ=function(){return this.inf?this.curve.jpoint(null,null,null):this.curve.jpoint(this.x,this.y,this.curve.one)},a(h,s.BasePoint),f.prototype.jpoint=function(t,e,r){return new h(this,t,e,r)},h.prototype.toP=function(){if(this.isInfinity())return this.curve.point(null,null);var t=this.z.redInvm(),e=t.redSqr(),r=this.x.redMul(e),n=this.y.redMul(e).redMul(t);return this.curve.point(r,n)},h.prototype.neg=function(){return this.curve.jpoint(this.x,this.y.redNeg(),this.z)},h.prototype.add=function(t){if(this.isInfinity())return t;if(t.isInfinity())return this;var e=t.z.redSqr(),r=this.z.redSqr(),n=this.x.redMul(e),i=t.x.redMul(r),o=this.y.redMul(e.redMul(t.z)),a=t.y.redMul(r.redMul(this.z)),s=n.redSub(i),u=o.redSub(a);if(0===s.cmpn(0))return 0!==u.cmpn(0)?this.curve.jpoint(null,null,null):this.dbl();var f=s.redSqr(),c=f.redMul(s),h=n.redMul(f),d=u.redSqr().redIAdd(c).redISub(h).redISub(h),l=u.redMul(h.redISub(d)).redISub(o.redMul(c)),p=this.z.redMul(t.z).redMul(s);return this.curve.jpoint(d,l,p)},h.prototype.mixedAdd=function(t){if(this.isInfinity())return t.toJ();if(t.isInfinity())return this;var e=this.z.redSqr(),r=this.x,n=t.x.redMul(e),i=this.y,o=t.y.redMul(e).redMul(this.z),a=r.redSub(n),s=i.redSub(o);if(0===a.cmpn(0))return 0!==s.cmpn(0)?this.curve.jpoint(null,null,null):this.dbl();var u=a.redSqr(),f=u.redMul(a),c=r.redMul(u),h=s.redSqr().redIAdd(f).redISub(c).redISub(c),d=s.redMul(c.redISub(h)).redISub(i.redMul(f)),l=this.z.redMul(a);return this.curve.jpoint(h,d,l)},h.prototype.dblp=function(t){if(0===t)return this;if(this.isInfinity())return this;if(!t)return this.dbl();if(this.curve.zeroA||this.curve.threeA){for(var e=this,r=0;r=0)return!1;if(r.redIAdd(i),0===this.x.cmp(r))return!0}return!1},h.prototype.inspect=function(){return this.isInfinity()?"":""},h.prototype.isInfinity=function(){return 0===this.z.cmpn(0)}},{"../../elliptic":67,"../curve":70,"bn.js":"BN",inherits:101}],73:[function(t,e,r){var n,i=r,o=t("hash.js"),a=t("../elliptic"),s=a.utils.assert;function u(t){"short"===t.type?this.curve=new a.curve.short(t):"edwards"===t.type?this.curve=new a.curve.edwards(t):this.curve=new a.curve.mont(t),this.g=this.curve.g,this.n=this.curve.n,this.hash=t.hash,s(this.g.validate(),"Invalid curve"),s(this.g.mul(this.n).isInfinity(),"Invalid curve, G*N != O")}function f(t,e){Object.defineProperty(i,t,{configurable:!0,enumerable:!0,get:function(){var r=new u(e);return Object.defineProperty(i,t,{configurable:!0,enumerable:!0,value:r}),r}})}i.PresetCurve=u,f("p192",{type:"short",prime:"p192",p:"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff",a:"ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc",b:"64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1",n:"ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831",hash:o.sha256,gRed:!1,g:["188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012","07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811"]}),f("p224",{type:"short",prime:"p224",p:"ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001",a:"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe",b:"b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4",n:"ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d",hash:o.sha256,gRed:!1,g:["b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21","bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34"]}),f("p256",{type:"short",prime:null,p:"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff",a:"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc",b:"5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b",n:"ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551",hash:o.sha256,gRed:!1,g:["6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296","4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5"]}),f("p384",{type:"short",prime:null,p:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 ffffffff",a:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 fffffffc",b:"b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f 5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef",n:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 f4372ddf 581a0db2 48b0a77a ecec196a ccc52973",hash:o.sha384,gRed:!1,g:["aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 5502f25d bf55296c 3a545e38 72760ab7","3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 0a60b1ce 1d7e819d 7a431d7c 90ea0e5f"]}),f("p521",{type:"short",prime:null,p:"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff",a:"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffc",b:"00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b 99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd 3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00",n:"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409",hash:o.sha512,gRed:!1,g:["000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66","00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 3fad0761 353c7086 a272c240 88be9476 9fd16650"]}),f("curve25519",{type:"mont",prime:"p25519",p:"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",a:"76d06",b:"1",n:"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",hash:o.sha256,gRed:!1,g:["9"]}),f("ed25519",{type:"edwards",prime:"p25519",p:"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",a:"-1",c:"1",d:"52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3",n:"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",hash:o.sha256,gRed:!1,g:["216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a","6666666666666666666666666666666666666666666666666666666666666658"]});try{n=t("./precomputed/secp256k1")}catch(t){n=void 0}f("secp256k1",{type:"short",prime:"k256",p:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f",a:"0",b:"7",n:"ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141",h:"1",hash:o.sha256,beta:"7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee",lambda:"5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72",basis:[{a:"3086d221a7d46bcde86c90e49284eb15",b:"-e4437ed6010e88286f547fa90abfe4c3"},{a:"114ca50f7a8e2f3f657c1108d9d44cfd8",b:"3086d221a7d46bcde86c90e49284eb15"}],gRed:!1,g:["79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798","483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",n]})},{"../elliptic":67,"./precomputed/secp256k1":80,"hash.js":86}],74:[function(t,e,r){var n=t("bn.js"),i=t("hmac-drbg"),o=t("../../elliptic"),a=o.utils.assert,s=t("./key"),u=t("./signature");function f(t){if(!(this instanceof f))return new f(t);"string"==typeof t&&(a(o.curves.hasOwnProperty(t),"Unknown curve "+t),t=o.curves[t]),t instanceof o.curves.PresetCurve&&(t={curve:t}),this.curve=t.curve.curve,this.n=this.curve.n,this.nh=this.n.ushrn(1),this.g=this.curve.g,this.g=t.curve.g,this.g.precompute(t.curve.n.bitLength()+1),this.hash=t.hash||t.curve.hash}e.exports=f,f.prototype.keyPair=function(t){return new s(this,t)},f.prototype.keyFromPrivate=function(t,e){return s.fromPrivate(this,t,e)},f.prototype.keyFromPublic=function(t,e){return s.fromPublic(this,t,e)},f.prototype.genKeyPair=function(t){t||(t={});for(var e=new i({hash:this.hash,pers:t.pers,persEnc:t.persEnc||"utf8",entropy:t.entropy||o.rand(this.hash.hmacStrength),entropyEnc:t.entropy&&t.entropyEnc||"utf8",nonce:this.n.toArray()}),r=this.n.byteLength(),a=this.n.sub(new n(2));;){var s=new n(e.generate(r));if(!(s.cmp(a)>0))return s.iaddn(1),this.keyFromPrivate(s)}},f.prototype._truncateToN=function(t,e){var r=8*t.byteLength()-this.n.bitLength();return r>0&&(t=t.ushrn(r)),!e&&t.cmp(this.n)>=0?t.sub(this.n):t},f.prototype.sign=function(t,e,r,o){"object"===(void 0===r?"undefined":_typeof(r))&&(o=r,r=null),o||(o={}),e=this.keyFromPrivate(e,r),t=this._truncateToN(new n(t,16));for(var a=this.n.byteLength(),s=e.getPrivate().toArray("be",a),f=t.toArray("be",a),c=new i({hash:this.hash,entropy:s,nonce:f,pers:o.pers,persEnc:o.persEnc||"utf8"}),h=this.n.sub(new n(1)),d=0;;d++){var l=o.k?o.k(d):new n(c.generate(this.n.byteLength()));if(!((l=this._truncateToN(l,!0)).cmpn(1)<=0||l.cmp(h)>=0)){var p=this.g.mul(l);if(!p.isInfinity()){var b=p.getX(),m=b.umod(this.n);if(0!==m.cmpn(0)){var y=l.invm(this.n).mul(m.mul(e.getPrivate()).iadd(t));if(0!==(y=y.umod(this.n)).cmpn(0)){var v=(p.getY().isOdd()?1:0)|(0!==b.cmp(m)?2:0);return o.canonical&&y.cmp(this.nh)>0&&(y=this.n.sub(y),v^=1),new u({r:m,s:y,recoveryParam:v})}}}}}},f.prototype.verify=function(t,e,r,i){t=this._truncateToN(new n(t,16)),r=this.keyFromPublic(r,i);var o=(e=new u(e,"hex")).r,a=e.s;if(o.cmpn(1)<0||o.cmp(this.n)>=0)return!1;if(a.cmpn(1)<0||a.cmp(this.n)>=0)return!1;var s,f=a.invm(this.n),c=f.mul(t).umod(this.n),h=f.mul(o).umod(this.n);return this.curve._maxwellTrick?!(s=this.g.jmulAdd(c,r.getPublic(),h)).isInfinity()&&s.eqXToP(o):!(s=this.g.mulAdd(c,r.getPublic(),h)).isInfinity()&&0===s.getX().umod(this.n).cmp(o)},f.prototype.recoverPubKey=function(t,e,r,i){a((3&r)===r,"The recovery param is more than two bits"),e=new u(e,i);var o=this.n,s=new n(t),f=e.r,c=e.s,h=1&r,d=r>>1;if(f.cmp(this.curve.p.umod(this.curve.n))>=0&&d)throw new Error("Unable to find sencond key candinate");f=d?this.curve.pointFromX(f.add(this.curve.n),h):this.curve.pointFromX(f,h);var l=e.r.invm(o),p=o.sub(s).mul(l).umod(o),b=c.mul(l).umod(o);return this.g.mulAdd(p,f,b)},f.prototype.getKeyRecoveryParam=function(t,e,r,n){if(null!==(e=new u(e,n)).recoveryParam)return e.recoveryParam;for(var i=0;i<4;i++){var o;try{o=this.recoverPubKey(t,e,i)}catch(t){continue}if(o.eq(r))return i}throw new Error("Unable to find valid recovery factor")}},{"../../elliptic":67,"./key":75,"./signature":76,"bn.js":"BN","hmac-drbg":98}],75:[function(t,e,r){var n=t("bn.js"),i=t("../../elliptic").utils.assert;function o(t,e){this.ec=t,this.priv=null,this.pub=null,e.priv&&this._importPrivate(e.priv,e.privEnc),e.pub&&this._importPublic(e.pub,e.pubEnc)}e.exports=o,o.fromPublic=function(t,e,r){return e instanceof o?e:new o(t,{pub:e,pubEnc:r})},o.fromPrivate=function(t,e,r){return e instanceof o?e:new o(t,{priv:e,privEnc:r})},o.prototype.validate=function(){var t=this.getPublic();return t.isInfinity()?{result:!1,reason:"Invalid public key"}:t.validate()?t.mul(this.ec.curve.n).isInfinity()?{result:!0,reason:null}:{result:!1,reason:"Public key * N != O"}:{result:!1,reason:"Public key is not a point"}},o.prototype.getPublic=function(t,e){return"string"==typeof t&&(e=t,t=null),this.pub||(this.pub=this.ec.g.mul(this.priv)),e?this.pub.encode(e,t):this.pub},o.prototype.getPrivate=function(t){return"hex"===t?this.priv.toString(16,2):this.priv},o.prototype._importPrivate=function(t,e){this.priv=new n(t,e||16),this.priv=this.priv.umod(this.ec.curve.n)},o.prototype._importPublic=function(t,e){if(t.x||t.y)return"mont"===this.ec.curve.type?i(t.x,"Need x coordinate"):"short"!==this.ec.curve.type&&"edwards"!==this.ec.curve.type||i(t.x&&t.y,"Need both x and y coordinate"),void(this.pub=this.ec.curve.point(t.x,t.y));this.pub=this.ec.curve.decodePoint(t,e)},o.prototype.derive=function(t){return t.mul(this.priv).getX()},o.prototype.sign=function(t,e,r){return this.ec.sign(t,this,e,r)},o.prototype.verify=function(t,e){return this.ec.verify(t,e,this)},o.prototype.inspect=function(){return""}},{"../../elliptic":67,"bn.js":"BN"}],76:[function(t,e,r){var n=t("bn.js"),i=t("../../elliptic").utils,o=i.assert;function a(t,e){if(t instanceof a)return t;this._importDER(t,e)||(o(t.r&&t.s,"Signature without r or s"),this.r=new n(t.r,16),this.s=new n(t.s,16),void 0===t.recoveryParam?this.recoveryParam=null:this.recoveryParam=t.recoveryParam)}function s(t,e){var r=t[e.place++];if(!(128&r))return r;for(var n=15&r,i=0,o=0,a=e.place;o>>3);for(t.push(128|r);--r;)t.push(e>>>(r<<3)&255);t.push(e)}}e.exports=a,a.prototype._importDER=function(t,e){t=i.toArray(t,e);var r=new function(){this.place=0};if(48!==t[r.place++])return!1;if(s(t,r)+r.place!==t.length)return!1;if(2!==t[r.place++])return!1;var o=s(t,r),a=t.slice(r.place,o+r.place);if(r.place+=o,2!==t[r.place++])return!1;var u=s(t,r);if(t.length!==u+r.place)return!1;var f=t.slice(r.place,u+r.place);return 0===a[0]&&128&a[1]&&(a=a.slice(1)),0===f[0]&&128&f[1]&&(f=f.slice(1)),this.r=new n(a),this.s=new n(f),this.recoveryParam=null,!0},a.prototype.toDER=function(t){var e=this.r.toArray(),r=this.s.toArray();for(128&e[0]&&(e=[0].concat(e)),128&r[0]&&(r=[0].concat(r)),e=u(e),r=u(r);!(r[0]||128&r[1]);)r=r.slice(1);var n=[2];f(n,e.length),(n=n.concat(e)).push(2),f(n,r.length);var o=n.concat(r),a=[48];return f(a,o.length),a=a.concat(o),i.encode(a,t)}},{"../../elliptic":67,"bn.js":"BN"}],77:[function(t,e,r){var n=t("hash.js"),i=t("../../elliptic"),o=i.utils,a=o.assert,s=o.parseBytes,u=t("./key"),f=t("./signature");function c(t){if(a("ed25519"===t,"only tested with ed25519 so far"),!(this instanceof c))return new c(t);t=i.curves[t].curve;this.curve=t,this.g=t.g,this.g.precompute(t.n.bitLength()+1),this.pointClass=t.point().constructor,this.encodingLength=Math.ceil(t.n.bitLength()/8),this.hash=n.sha512}e.exports=c,c.prototype.sign=function(t,e){t=s(t);var r=this.keyFromSecret(e),n=this.hashInt(r.messagePrefix(),t),i=this.g.mul(n),o=this.encodePoint(i),a=this.hashInt(o,r.pubBytes(),t).mul(r.priv()),u=n.add(a).umod(this.curve.n);return this.makeSignature({R:i,S:u,Rencoded:o})},c.prototype.verify=function(t,e,r){t=s(t),e=this.makeSignature(e);var n=this.keyFromPublic(r),i=this.hashInt(e.Rencoded(),n.pubBytes(),t),o=this.g.mul(e.S());return e.R().add(n.pub().mul(i)).eq(o)},c.prototype.hashInt=function(){for(var t=this.hash(),e=0;e=0;){var o;if(i.isOdd()){var a=i.andln(n-1);o=a>(n>>1)-1?(n>>1)-a:a,i.isubn(o)}else o=0;r.push(o);for(var s=0!==i.cmpn(0)&&0===i.andln(n-1)?e+1:1,u=1;u0||e.cmpn(-i)>0;){var o,a,s,u=t.andln(3)+n&3,f=e.andln(3)+i&3;3===u&&(u=-1),3===f&&(f=-1),o=0==(1&u)?0:3!=(s=t.andln(7)+n&7)&&5!==s||2!==f?u:-u,r[0].push(o),a=0==(1&f)?0:3!=(s=e.andln(7)+i&7)&&5!==s||2!==u?f:-f,r[1].push(a),2*n===o+1&&(n=1-n),2*i===a+1&&(i=1-i),t.iushrn(1),e.iushrn(1)}return r},n.cachedProperty=function(t,e,r){var n="_"+e;t.prototype[e]=function(){return void 0!==this[n]?this[n]:this[n]=r.call(this)}},n.parseBytes=function(t){return"string"==typeof t?n.toArray(t,"hex"):t},n.intFromLE=function(t){return new i(t,"hex","le")}},{"bn.js":"BN","minimalistic-assert":107,"minimalistic-crypto-utils":108}],82:[function(t,e,r){e.exports={_args:[[{raw:"elliptic@^6.0.0",scope:null,escapedName:"elliptic",name:"elliptic",rawSpec:"^6.0.0",spec:">=6.0.0 <7.0.0",type:"range"},"/Users/frozeman/Sites/_ethereum/web3/node_modules/browserify-sign"]],_from:"elliptic@>=6.0.0 <7.0.0",_id:"elliptic@6.4.0",_inCache:!0,_location:"/elliptic",_nodeVersion:"7.0.0",_npmOperationalInternal:{host:"packages-18-east.internal.npmjs.com",tmp:"tmp/elliptic-6.4.0.tgz_1487798866428_0.30510620190761983"},_npmUser:{name:"indutny",email:"fedor@indutny.com"},_npmVersion:"3.10.8",_phantomChildren:{},_requested:{raw:"elliptic@^6.0.0",scope:null,escapedName:"elliptic",name:"elliptic",rawSpec:"^6.0.0",spec:">=6.0.0 <7.0.0",type:"range"},_requiredBy:["/browserify-sign","/create-ecdh","/secp256k1"],_resolved:"https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz",_shasum:"cac9af8762c85836187003c8dfe193e5e2eae5df",_shrinkwrap:null,_spec:"elliptic@^6.0.0",_where:"/Users/frozeman/Sites/_ethereum/web3/node_modules/browserify-sign",author:{name:"Fedor Indutny",email:"fedor@indutny.com"},bugs:{url:"https://github.com/indutny/elliptic/issues"},dependencies:{"bn.js":"^4.4.0",brorand:"^1.0.1","hash.js":"^1.0.0","hmac-drbg":"^1.0.0",inherits:"^2.0.1","minimalistic-assert":"^1.0.0","minimalistic-crypto-utils":"^1.0.0"},description:"EC cryptography",devDependencies:{brfs:"^1.4.3",coveralls:"^2.11.3",grunt:"^0.4.5","grunt-browserify":"^5.0.0","grunt-cli":"^1.2.0","grunt-contrib-connect":"^1.0.0","grunt-contrib-copy":"^1.0.0","grunt-contrib-uglify":"^1.0.1","grunt-mocha-istanbul":"^3.0.1","grunt-saucelabs":"^8.6.2",istanbul:"^0.4.2",jscs:"^2.9.0",jshint:"^2.6.0",mocha:"^2.1.0"},directories:{},dist:{shasum:"cac9af8762c85836187003c8dfe193e5e2eae5df",tarball:"https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz"},files:["lib"],gitHead:"6b0d2b76caae91471649c8e21f0b1d3ba0f96090",homepage:"https://github.com/indutny/elliptic",keywords:["EC","Elliptic","curve","Cryptography"],license:"MIT",main:"lib/elliptic.js",maintainers:[{name:"indutny",email:"fedor@indutny.com"}],name:"elliptic",optionalDependencies:{},readme:"ERROR: No README data found!",repository:{type:"git",url:"git+ssh://git@github.com/indutny/elliptic.git"},scripts:{jscs:"jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js",jshint:"jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js",lint:"npm run jscs && npm run jshint",test:"npm run lint && npm run unit",unit:"istanbul test _mocha --reporter=spec test/index.js",version:"grunt dist && git add dist/"},version:"6.4.0"}},{}],83:[function(t,e,r){function n(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function i(t){return"function"==typeof t}function o(t){return"object"===(void 0===t?"undefined":_typeof(t))&&null!==t}function a(t){return void 0===t}e.exports=n,n.EventEmitter=n,n.prototype._events=void 0,n.prototype._maxListeners=void 0,n.defaultMaxListeners=10,n.prototype.setMaxListeners=function(t){if("number"!=typeof t||t<0||isNaN(t))throw TypeError("n must be a positive number");return this._maxListeners=t,this},n.prototype.emit=function(t){var e,r,n,s,u,f;if(this._events||(this._events={}),"error"===t&&(!this._events.error||o(this._events.error)&&!this._events.error.length)){if((e=arguments[1])instanceof Error)throw e;var c=new Error('Uncaught, unspecified "error" event. ('+e+")");throw c.context=e,c}if(a(r=this._events[t]))return!1;if(i(r))switch(arguments.length){case 1:r.call(this);break;case 2:r.call(this,arguments[1]);break;case 3:r.call(this,arguments[1],arguments[2]);break;default:s=Array.prototype.slice.call(arguments,1),r.apply(this,s)}else if(o(r))for(s=Array.prototype.slice.call(arguments,1),n=(f=r.slice()).length,u=0;u0&&this._events[t].length>r&&(this._events[t].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[t].length),"function"==typeof console.trace&&console.trace()),this},n.prototype.on=n.prototype.addListener,n.prototype.once=function(t,e){if(!i(e))throw TypeError("listener must be a function");var r=!1;function n(){this.removeListener(t,n),r||(r=!0,e.apply(this,arguments))}return n.listener=e,this.on(t,n),this},n.prototype.removeListener=function(t,e){var r,n,a,s;if(!i(e))throw TypeError("listener must be a function");if(!this._events||!this._events[t])return this;if(a=(r=this._events[t]).length,n=-1,r===e||i(r.listener)&&r.listener===e)delete this._events[t],this._events.removeListener&&this.emit("removeListener",t,e);else if(o(r)){for(s=a;s-- >0;)if(r[s]===e||r[s].listener&&r[s].listener===e){n=s;break}if(n<0)return this;1===r.length?(r.length=0,delete this._events[t]):r.splice(n,1),this._events.removeListener&&this.emit("removeListener",t,e)}return this},n.prototype.removeAllListeners=function(t){var e,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[t]&&delete this._events[t],this;if(0===arguments.length){for(e in this._events)"removeListener"!==e&&this.removeAllListeners(e);return this.removeAllListeners("removeListener"),this._events={},this}if(i(r=this._events[t]))this.removeListener(t,r);else if(r)for(;r.length;)this.removeListener(t,r[r.length-1]);return delete this._events[t],this},n.prototype.listeners=function(t){return this._events&&this._events[t]?i(this._events[t])?[this._events[t]]:this._events[t].slice():[]},n.prototype.listenerCount=function(t){if(this._events){var e=this._events[t];if(i(e))return 1;if(e)return e.length}return 0},n.listenerCount=function(t,e){return t.listenerCount(e)}},{}],84:[function(t,e,r){var n=t("safe-buffer").Buffer,i=t("md5.js");e.exports=function(t,e,r,o){if(n.isBuffer(t)||(t=n.from(t,"binary")),e&&(n.isBuffer(e)||(e=n.from(e,"binary")),8!==e.length))throw new RangeError("salt should be Buffer with 8 byte length");for(var a=r/8,s=n.alloc(a),u=n.alloc(o||0),f=n.alloc(0);a>0||o>0;){var c=new i;c.update(f),c.update(t),e&&c.update(e),f=c.digest();var h=0;if(a>0){var d=s.length-a;h=Math.min(a,f.length),f.copy(s,d,0,h),a-=h}if(h0){var l=u.length-o,p=Math.min(o,f.length-h);f.copy(u,l,h,h+p),o-=p}}return f.fill(0),{key:s,iv:u}}},{"md5.js":104,"safe-buffer":147}],85:[function(t,e,r){(function(r){var n=t("stream").Transform;function i(t){n.call(this),this._block=new r(t),this._blockSize=t,this._blockOffset=0,this._length=[0,0,0,0],this._finalized=!1}t("inherits")(i,n),i.prototype._transform=function(t,e,n){var i=null;try{"buffer"!==e&&(t=new r(t,e)),this.update(t)}catch(t){i=t}n(i)},i.prototype._flush=function(t){var e=null;try{this.push(this._digest())}catch(t){e=t}t(e)},i.prototype.update=function(t,e){if(!r.isBuffer(t)&&"string"!=typeof t)throw new TypeError("Data must be a string or a buffer");if(this._finalized)throw new Error("Digest already called");r.isBuffer(t)||(t=new r(t,e||"binary"));for(var n=this._block,i=0;this._blockOffset+t.length-i>=this._blockSize;){for(var o=this._blockOffset;o0;++a)this._length[a]+=s,(s=this._length[a]/4294967296|0)>0&&(this._length[a]-=4294967296*s);return this},i.prototype._update=function(t){throw new Error("_update is not implemented")},i.prototype.digest=function(t){if(this._finalized)throw new Error("Digest already called");this._finalized=!0;var e=this._digest();return void 0!==t&&(e=e.toString(t)),e},i.prototype._digest=function(){throw new Error("_digest is not implemented")},e.exports=i}).call(this,t("buffer").Buffer)},{buffer:47,inherits:101,stream:156}],86:[function(t,e,r){var n=r;n.utils=t("./hash/utils"),n.common=t("./hash/common"),n.sha=t("./hash/sha"),n.ripemd=t("./hash/ripemd"),n.hmac=t("./hash/hmac"),n.sha1=n.sha.sha1,n.sha256=n.sha.sha256,n.sha224=n.sha.sha224,n.sha384=n.sha.sha384,n.sha512=n.sha.sha512,n.ripemd160=n.ripemd.ripemd160},{"./hash/common":87,"./hash/hmac":88,"./hash/ripemd":89,"./hash/sha":90,"./hash/utils":97}],87:[function(t,e,r){var n=t("./utils"),i=t("minimalistic-assert");function o(){this.pending=null,this.pendingTotal=0,this.blockSize=this.constructor.blockSize,this.outSize=this.constructor.outSize,this.hmacStrength=this.constructor.hmacStrength,this.padLength=this.constructor.padLength/8,this.endian="big",this._delta8=this.blockSize/8,this._delta32=this.blockSize/32}r.BlockHash=o,o.prototype.update=function(t,e){if(t=n.toArray(t,e),this.pending?this.pending=this.pending.concat(t):this.pending=t,this.pendingTotal+=t.length,this.pending.length>=this._delta8){var r=(t=this.pending).length%this._delta8;this.pending=t.slice(t.length-r,t.length),0===this.pending.length&&(this.pending=null),t=n.join32(t,0,t.length-r,this.endian);for(var i=0;i>>24&255,n[i++]=t>>>16&255,n[i++]=t>>>8&255,n[i++]=255&t}else for(n[i++]=255&t,n[i++]=t>>>8&255,n[i++]=t>>>16&255,n[i++]=t>>>24&255,n[i++]=0,n[i++]=0,n[i++]=0,n[i++]=0,o=8;othis.blockSize&&(t=(new this.Hash).update(t).digest()),i(t.length<=this.blockSize);for(var e=t.length;e>>3},r.g1_256=function(t){return n(t,17)^n(t,19)^t>>>10}},{"../utils":97}],97:[function(t,e,r){var n=t("minimalistic-assert"),i=t("inherits");function o(t){return(t>>>24|t>>>8&65280|t<<8&16711680|(255&t)<<24)>>>0}function a(t){return 1===t.length?"0"+t:t}function s(t){return 7===t.length?"0"+t:6===t.length?"00"+t:5===t.length?"000"+t:4===t.length?"0000"+t:3===t.length?"00000"+t:2===t.length?"000000"+t:1===t.length?"0000000"+t:t}r.inherits=i,r.toArray=function(t,e){if(Array.isArray(t))return t.slice();if(!t)return[];var r=[];if("string"==typeof t)if(e){if("hex"===e)for((t=t.replace(/[^a-z0-9]+/gi,"")).length%2!=0&&(t="0"+t),n=0;n>8,a=255&i;o?r.push(o,a):r.push(a)}else for(n=0;n>>0}return a},r.split32=function(t,e){for(var r=new Array(4*t.length),n=0,i=0;n>>24,r[i+1]=o>>>16&255,r[i+2]=o>>>8&255,r[i+3]=255&o):(r[i+3]=o>>>24,r[i+2]=o>>>16&255,r[i+1]=o>>>8&255,r[i]=255&o)}return r},r.rotr32=function(t,e){return t>>>e|t<<32-e},r.rotl32=function(t,e){return t<>>32-e},r.sum32=function(t,e){return t+e>>>0},r.sum32_3=function(t,e,r){return t+e+r>>>0},r.sum32_4=function(t,e,r,n){return t+e+r+n>>>0},r.sum32_5=function(t,e,r,n,i){return t+e+r+n+i>>>0},r.sum64=function(t,e,r,n){var i=t[e],o=n+t[e+1]>>>0,a=(o>>0,t[e+1]=o},r.sum64_hi=function(t,e,r,n){return(e+n>>>0>>0},r.sum64_lo=function(t,e,r,n){return e+n>>>0},r.sum64_4_hi=function(t,e,r,n,i,o,a,s){var u=0,f=e;return u+=(f=f+n>>>0)>>0)>>0)>>0},r.sum64_4_lo=function(t,e,r,n,i,o,a,s){return e+n+o+s>>>0},r.sum64_5_hi=function(t,e,r,n,i,o,a,s,u,f){var c=0,h=e;return c+=(h=h+n>>>0)>>0)>>0)>>0)>>0},r.sum64_5_lo=function(t,e,r,n,i,o,a,s,u,f){return e+n+o+s+f>>>0},r.rotr64_hi=function(t,e,r){return(e<<32-r|t>>>r)>>>0},r.rotr64_lo=function(t,e,r){return(t<<32-r|e>>>r)>>>0},r.shr64_hi=function(t,e,r){return t>>>r},r.shr64_lo=function(t,e,r){return(t<<32-r|e>>>r)>>>0}},{inherits:101,"minimalistic-assert":107}],98:[function(t,e,r){var n=t("hash.js"),i=t("minimalistic-crypto-utils"),o=t("minimalistic-assert");function a(t){if(!(this instanceof a))return new a(t);this.hash=t.hash,this.predResist=!!t.predResist,this.outLen=this.hash.outSize,this.minEntropy=t.minEntropy||this.hash.hmacStrength,this._reseed=null,this.reseedInterval=null,this.K=null,this.V=null;var e=i.toArray(t.entropy,t.entropyEnc||"hex"),r=i.toArray(t.nonce,t.nonceEnc||"hex"),n=i.toArray(t.pers,t.persEnc||"hex");o(e.length>=this.minEntropy/8,"Not enough entropy. Minimum is: "+this.minEntropy+" bits"),this._init(e,r,n)}e.exports=a,a.prototype._init=function(t,e,r){var n=t.concat(e).concat(r);this.K=new Array(this.outLen/8),this.V=new Array(this.outLen/8);for(var i=0;i=this.minEntropy/8,"Not enough entropy. Minimum is: "+this.minEntropy+" bits"),this._update(t.concat(r||[])),this._reseed=1},a.prototype.generate=function(t,e,r,n){if(this._reseed>this.reseedInterval)throw new Error("Reseed is required");"string"!=typeof e&&(n=r,r=e,e=null),r&&(r=i.toArray(r,n||"hex"),this._update(r));for(var o=[];o.length>1,c=-7,h=r?i-1:0,d=r?-1:1,l=t[e+h];for(h+=d,o=l&(1<<-c)-1,l>>=-c,c+=s;c>0;o=256*o+t[e+h],h+=d,c-=8);for(a=o&(1<<-c)-1,o>>=-c,c+=n;c>0;a=256*a+t[e+h],h+=d,c-=8);if(0===o)o=1-f;else{if(o===u)return a?NaN:1/0*(l?-1:1);a+=Math.pow(2,n),o-=f}return(l?-1:1)*a*Math.pow(2,o-n)},r.write=function(t,e,r,n,i,o){var a,s,u,f=8*o-i-1,c=(1<>1,d=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,l=n?0:o-1,p=n?1:-1,b=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,a=c):(a=Math.floor(Math.log(e)/Math.LN2),e*(u=Math.pow(2,-a))<1&&(a--,u*=2),(e+=a+h>=1?d/u:d*Math.pow(2,1-h))*u>=2&&(a++,u/=2),a+h>=c?(s=0,a=c):a+h>=1?(s=(e*u-1)*Math.pow(2,i),a+=h):(s=e*Math.pow(2,h-1)*Math.pow(2,i),a=0));i>=8;t[r+l]=255&s,l+=p,s/=256,i-=8);for(a=a<0;t[r+l]=255&a,l+=p,a/=256,f-=8);t[r+l-p]|=128*b}},{}],100:[function(t,e,r){var n=[].indexOf;e.exports=function(t,e){if(n)return t.indexOf(e);for(var r=0;r>>32-e}function u(t,e,r,n,i,o,a){return s(t+(e&r|~e&n)+i+o|0,a)+e|0}function f(t,e,r,n,i,o,a){return s(t+(e&n|r&~n)+i+o|0,a)+e|0}function c(t,e,r,n,i,o,a){return s(t+(e^r^n)+i+o|0,a)+e|0}function h(t,e,r,n,i,o,a){return s(t+(r^(e|~n))+i+o|0,a)+e|0}n(a,i),a.prototype._update=function(){for(var t=o,e=0;e<16;++e)t[e]=this._block.readInt32LE(4*e);var r=this._a,n=this._b,i=this._c,a=this._d;n=h(n=h(n=h(n=h(n=c(n=c(n=c(n=c(n=f(n=f(n=f(n=f(n=u(n=u(n=u(n=u(n,i=u(i,a=u(a,r=u(r,n,i,a,t[0],3614090360,7),n,i,t[1],3905402710,12),r,n,t[2],606105819,17),a,r,t[3],3250441966,22),i=u(i,a=u(a,r=u(r,n,i,a,t[4],4118548399,7),n,i,t[5],1200080426,12),r,n,t[6],2821735955,17),a,r,t[7],4249261313,22),i=u(i,a=u(a,r=u(r,n,i,a,t[8],1770035416,7),n,i,t[9],2336552879,12),r,n,t[10],4294925233,17),a,r,t[11],2304563134,22),i=u(i,a=u(a,r=u(r,n,i,a,t[12],1804603682,7),n,i,t[13],4254626195,12),r,n,t[14],2792965006,17),a,r,t[15],1236535329,22),i=f(i,a=f(a,r=f(r,n,i,a,t[1],4129170786,5),n,i,t[6],3225465664,9),r,n,t[11],643717713,14),a,r,t[0],3921069994,20),i=f(i,a=f(a,r=f(r,n,i,a,t[5],3593408605,5),n,i,t[10],38016083,9),r,n,t[15],3634488961,14),a,r,t[4],3889429448,20),i=f(i,a=f(a,r=f(r,n,i,a,t[9],568446438,5),n,i,t[14],3275163606,9),r,n,t[3],4107603335,14),a,r,t[8],1163531501,20),i=f(i,a=f(a,r=f(r,n,i,a,t[13],2850285829,5),n,i,t[2],4243563512,9),r,n,t[7],1735328473,14),a,r,t[12],2368359562,20),i=c(i,a=c(a,r=c(r,n,i,a,t[5],4294588738,4),n,i,t[8],2272392833,11),r,n,t[11],1839030562,16),a,r,t[14],4259657740,23),i=c(i,a=c(a,r=c(r,n,i,a,t[1],2763975236,4),n,i,t[4],1272893353,11),r,n,t[7],4139469664,16),a,r,t[10],3200236656,23),i=c(i,a=c(a,r=c(r,n,i,a,t[13],681279174,4),n,i,t[0],3936430074,11),r,n,t[3],3572445317,16),a,r,t[6],76029189,23),i=c(i,a=c(a,r=c(r,n,i,a,t[9],3654602809,4),n,i,t[12],3873151461,11),r,n,t[15],530742520,16),a,r,t[2],3299628645,23),i=h(i,a=h(a,r=h(r,n,i,a,t[0],4096336452,6),n,i,t[7],1126891415,10),r,n,t[14],2878612391,15),a,r,t[5],4237533241,21),i=h(i,a=h(a,r=h(r,n,i,a,t[12],1700485571,6),n,i,t[3],2399980690,10),r,n,t[10],4293915773,15),a,r,t[1],2240044497,21),i=h(i,a=h(a,r=h(r,n,i,a,t[8],1873313359,6),n,i,t[15],4264355552,10),r,n,t[6],2734768916,15),a,r,t[13],1309151649,21),i=h(i,a=h(a,r=h(r,n,i,a,t[4],4149444226,6),n,i,t[11],3174756917,10),r,n,t[2],718787259,15),a,r,t[9],3951481745,21),this._a=this._a+r|0,this._b=this._b+n|0,this._c=this._c+i|0,this._d=this._d+a|0},a.prototype._digest=function(){this._block[this._blockOffset++]=128,this._blockOffset>56&&(this._block.fill(0,this._blockOffset,64),this._update(),this._blockOffset=0),this._block.fill(0,this._blockOffset,56),this._block.writeUInt32LE(this._length[0],56),this._block.writeUInt32LE(this._length[1],60),this._update();var t=new r(16);return t.writeInt32LE(this._a,0),t.writeInt32LE(this._b,4),t.writeInt32LE(this._c,8),t.writeInt32LE(this._d,12),t},e.exports=a}).call(this,t("buffer").Buffer)},{buffer:47,"hash-base":105,inherits:101}],105:[function(t,e,r){var n=t("safe-buffer").Buffer,i=t("stream").Transform;function o(t){i.call(this),this._block=n.allocUnsafe(t),this._blockSize=t,this._blockOffset=0,this._length=[0,0,0,0],this._finalized=!1}t("inherits")(o,i),o.prototype._transform=function(t,e,r){var n=null;try{this.update(t,e)}catch(t){n=t}r(n)},o.prototype._flush=function(t){var e=null;try{this.push(this.digest())}catch(t){e=t}t(e)},o.prototype.update=function(t,e){if(function(t,e){if(!n.isBuffer(t)&&"string"!=typeof t)throw new TypeError(e+" must be a string or a buffer")}(t,"Data"),this._finalized)throw new Error("Digest already called");n.isBuffer(t)||(t=n.from(t,e));for(var r=this._block,i=0;this._blockOffset+t.length-i>=this._blockSize;){for(var o=this._blockOffset;o0;++a)this._length[a]+=s,(s=this._length[a]/4294967296|0)>0&&(this._length[a]-=4294967296*s);return this},o.prototype._update=function(){throw new Error("_update is not implemented")},o.prototype.digest=function(t){if(this._finalized)throw new Error("Digest already called");this._finalized=!0;var e=this._digest();void 0!==t&&(e=e.toString(t)),this._block.fill(0),this._blockOffset=0;for(var r=0;r<4;++r)this._length[r]=0;return e},o.prototype._digest=function(){throw new Error("_digest is not implemented")},e.exports=o},{inherits:101,"safe-buffer":147,stream:156}],106:[function(t,e,r){var n=t("bn.js"),i=t("brorand");function o(t){this.rand=t||new i.Rand}e.exports=o,o.create=function(t){return new o(t)},o.prototype._randbelow=function(t){var e=t.bitLength(),r=Math.ceil(e/8);do{var i=new n(this.rand.generate(r))}while(i.cmp(t)>=0);return i},o.prototype._randrange=function(t,e){var r=e.sub(t);return t.add(this._randbelow(r))},o.prototype.test=function(t,e,r){var i=t.bitLength(),o=n.mont(t),a=new n(1).toRed(o);e||(e=Math.max(1,i/48|0));for(var s=t.subn(1),u=0;!s.testn(u);u++);for(var f=t.shrn(u),c=s.toRed(o);e>0;e--){var h=this._randrange(new n(2),s);r&&r(h);var d=h.toRed(o).redPow(f);if(0!==d.cmp(a)&&0!==d.cmp(c)){for(var l=1;l0;e--){var c=this._randrange(new n(2),a),h=t.gcd(c);if(0!==h.cmpn(1))return h;var d=c.toRed(i).redPow(u);if(0!==d.cmp(o)&&0!==d.cmp(f)){for(var l=1;l>8,a=255&i;o?r.push(o,a):r.push(a)}return r},n.zero2=i,n.toHex=o,n.encode=function(t,e){return"hex"===e?o(t):t}},{}],109:[function(t,e,r){e.exports={"2.16.840.1.101.3.4.1.1":"aes-128-ecb","2.16.840.1.101.3.4.1.2":"aes-128-cbc","2.16.840.1.101.3.4.1.3":"aes-128-ofb","2.16.840.1.101.3.4.1.4":"aes-128-cfb","2.16.840.1.101.3.4.1.21":"aes-192-ecb","2.16.840.1.101.3.4.1.22":"aes-192-cbc","2.16.840.1.101.3.4.1.23":"aes-192-ofb","2.16.840.1.101.3.4.1.24":"aes-192-cfb","2.16.840.1.101.3.4.1.41":"aes-256-ecb","2.16.840.1.101.3.4.1.42":"aes-256-cbc","2.16.840.1.101.3.4.1.43":"aes-256-ofb","2.16.840.1.101.3.4.1.44":"aes-256-cfb"}},{}],110:[function(t,e,r){var n=t("asn1.js");r.certificate=t("./certificate");var i=n.define("RSAPrivateKey",function(){this.seq().obj(this.key("version").int(),this.key("modulus").int(),this.key("publicExponent").int(),this.key("privateExponent").int(),this.key("prime1").int(),this.key("prime2").int(),this.key("exponent1").int(),this.key("exponent2").int(),this.key("coefficient").int())});r.RSAPrivateKey=i;var o=n.define("RSAPublicKey",function(){this.seq().obj(this.key("modulus").int(),this.key("publicExponent").int())});r.RSAPublicKey=o;var a=n.define("SubjectPublicKeyInfo",function(){this.seq().obj(this.key("algorithm").use(s),this.key("subjectPublicKey").bitstr())});r.PublicKey=a;var s=n.define("AlgorithmIdentifier",function(){this.seq().obj(this.key("algorithm").objid(),this.key("none").null_().optional(),this.key("curve").objid().optional(),this.key("params").seq().obj(this.key("p").int(),this.key("q").int(),this.key("g").int()).optional())}),u=n.define("PrivateKeyInfo",function(){this.seq().obj(this.key("version").int(),this.key("algorithm").use(s),this.key("subjectPrivateKey").octstr())});r.PrivateKey=u;var f=n.define("EncryptedPrivateKeyInfo",function(){this.seq().obj(this.key("algorithm").seq().obj(this.key("id").objid(),this.key("decrypt").seq().obj(this.key("kde").seq().obj(this.key("id").objid(),this.key("kdeparams").seq().obj(this.key("salt").octstr(),this.key("iters").int())),this.key("cipher").seq().obj(this.key("algo").objid(),this.key("iv").octstr()))),this.key("subjectPrivateKey").octstr())});r.EncryptedPrivateKey=f;var c=n.define("DSAPrivateKey",function(){this.seq().obj(this.key("version").int(),this.key("p").int(),this.key("q").int(),this.key("g").int(),this.key("pub_key").int(),this.key("priv_key").int())});r.DSAPrivateKey=c,r.DSAparam=n.define("DSAparam",function(){this.int()});var h=n.define("ECPrivateKey",function(){this.seq().obj(this.key("version").int(),this.key("privateKey").octstr(),this.key("parameters").optional().explicit(0).use(d),this.key("publicKey").optional().explicit(1).bitstr())});r.ECPrivateKey=h;var d=n.define("ECParameters",function(){this.choice({namedCurve:this.objid()})});r.signature=n.define("signature",function(){this.seq().obj(this.key("r").int(),this.key("s").int())})},{"./certificate":111,"asn1.js":1}],111:[function(t,e,r){var n=t("asn1.js"),i=n.define("Time",function(){this.choice({utcTime:this.utctime(),generalTime:this.gentime()})}),o=n.define("AttributeTypeValue",function(){this.seq().obj(this.key("type").objid(),this.key("value").any())}),a=n.define("AlgorithmIdentifier",function(){this.seq().obj(this.key("algorithm").objid(),this.key("parameters").optional())}),s=n.define("SubjectPublicKeyInfo",function(){this.seq().obj(this.key("algorithm").use(a),this.key("subjectPublicKey").bitstr())}),u=n.define("RelativeDistinguishedName",function(){this.setof(o)}),f=n.define("RDNSequence",function(){this.seqof(u)}),c=n.define("Name",function(){this.choice({rdnSequence:this.use(f)})}),h=n.define("Validity",function(){this.seq().obj(this.key("notBefore").use(i),this.key("notAfter").use(i))}),d=n.define("Extension",function(){this.seq().obj(this.key("extnID").objid(),this.key("critical").bool().def(!1),this.key("extnValue").octstr())}),l=n.define("TBSCertificate",function(){this.seq().obj(this.key("version").explicit(0).int(),this.key("serialNumber").int(),this.key("signature").use(a),this.key("issuer").use(c),this.key("validity").use(h),this.key("subject").use(c),this.key("subjectPublicKeyInfo").use(s),this.key("issuerUniqueID").implicit(1).bitstr().optional(),this.key("subjectUniqueID").implicit(2).bitstr().optional(),this.key("extensions").explicit(3).seqof(d).optional())}),p=n.define("X509Certificate",function(){this.seq().obj(this.key("tbsCertificate").use(l),this.key("signatureAlgorithm").use(a),this.key("signatureValue").bitstr())});e.exports=p},{"asn1.js":1}],112:[function(t,e,r){(function(r){var n=/Proc-Type: 4,ENCRYPTED\n\r?DEK-Info: AES-((?:128)|(?:192)|(?:256))-CBC,([0-9A-H]+)\n\r?\n\r?([0-9A-z\n\r\+\/\=]+)\n\r?/m,i=/^-----BEGIN ((?:.* KEY)|CERTIFICATE)-----\n/m,o=/^-----BEGIN ((?:.* KEY)|CERTIFICATE)-----\n\r?([0-9A-z\n\r\+\/\=]+)\n\r?-----END \1-----$/m,a=t("evp_bytestokey"),s=t("browserify-aes");e.exports=function(t,e){var u,f=t.toString(),c=f.match(n);if(c){var h="aes"+c[1],d=new r(c[2],"hex"),l=new r(c[3].replace(/\r?\n/g,""),"base64"),p=a(e,d.slice(0,8),parseInt(c[1],10)).key,b=[],m=s.createDecipheriv(h,p,d);b.push(m.update(l)),b.push(m.final()),u=r.concat(b)}else{var y=f.match(o);u=new r(y[2].replace(/\r?\n/g,""),"base64")}return{tag:f.match(i)[1],data:u}}}).call(this,t("buffer").Buffer)},{"browserify-aes":20,buffer:47,evp_bytestokey:84}],113:[function(t,e,r){(function(r){var n=t("./asn1"),i=t("./aesid.json"),o=t("./fixProc"),a=t("browserify-aes"),s=t("pbkdf2");function u(t){var e;"object"!==(void 0===t?"undefined":_typeof(t))||r.isBuffer(t)||(e=t.passphrase,t=t.key),"string"==typeof t&&(t=new r(t));var u,f,c,h,d,l,p,b,m,y,v,g,w,_=o(t,e),M=_.tag,x=_.data;switch(M){case"CERTIFICATE":f=n.certificate.decode(x,"der").tbsCertificate.subjectPublicKeyInfo;case"PUBLIC KEY":switch(f||(f=n.PublicKey.decode(x,"der")),u=f.algorithm.algorithm.join(".")){case"1.2.840.113549.1.1.1":return n.RSAPublicKey.decode(f.subjectPublicKey.data,"der");case"1.2.840.10045.2.1":return f.subjectPrivateKey=f.subjectPublicKey,{type:"ec",data:f};case"1.2.840.10040.4.1":return f.algorithm.params.pub_key=n.DSAparam.decode(f.subjectPublicKey.data,"der"),{type:"dsa",data:f.algorithm.params};default:throw new Error("unknown key id "+u)}throw new Error("unknown key type "+M);case"ENCRYPTED PRIVATE KEY":x=n.EncryptedPrivateKey.decode(x,"der"),h=e,d=(c=x).algorithm.decrypt.kde.kdeparams.salt,l=parseInt(c.algorithm.decrypt.kde.kdeparams.iters.toString(),10),p=i[c.algorithm.decrypt.cipher.algo.join(".")],b=c.algorithm.decrypt.cipher.iv,m=c.subjectPrivateKey,y=parseInt(p.split("-")[1],10)/8,v=s.pbkdf2Sync(h,d,l,y),g=a.createDecipheriv(p,v,b),(w=[]).push(g.update(m)),w.push(g.final()),x=r.concat(w);case"PRIVATE KEY":switch(u=(f=n.PrivateKey.decode(x,"der")).algorithm.algorithm.join(".")){case"1.2.840.113549.1.1.1":return n.RSAPrivateKey.decode(f.subjectPrivateKey,"der");case"1.2.840.10045.2.1":return{curve:f.algorithm.curve,privateKey:n.ECPrivateKey.decode(f.subjectPrivateKey,"der").privateKey};case"1.2.840.10040.4.1":return f.algorithm.params.priv_key=n.DSAparam.decode(f.subjectPrivateKey,"der"),{type:"dsa",params:f.algorithm.params};default:throw new Error("unknown key id "+u)}throw new Error("unknown key type "+M);case"RSA PUBLIC KEY":return n.RSAPublicKey.decode(x,"der");case"RSA PRIVATE KEY":return n.RSAPrivateKey.decode(x,"der");case"DSA PRIVATE KEY":return{type:"dsa",params:n.DSAPrivateKey.decode(x,"der")};case"EC PRIVATE KEY":return{curve:(x=n.ECPrivateKey.decode(x,"der")).parameters.value,privateKey:x.privateKey};default:throw new Error("unknown key type "+M)}}e.exports=u,u.signature=n.signature}).call(this,t("buffer").Buffer)},{"./aesid.json":109,"./asn1":110,"./fixProc":112,"browserify-aes":20,buffer:47,pbkdf2:114}],114:[function(t,e,r){r.pbkdf2=t("./lib/async"),r.pbkdf2Sync=t("./lib/sync")},{"./lib/async":115,"./lib/sync":118}],115:[function(t,e,r){(function(r,n){var i,o=t("./precondition"),a=t("./default-encoding"),s=t("./sync"),u=t("safe-buffer").Buffer,f=n.crypto&&n.crypto.subtle,c={sha:"SHA-1","sha-1":"SHA-1",sha1:"SHA-1",sha256:"SHA-256","sha-256":"SHA-256",sha384:"SHA-384","sha-384":"SHA-384","sha-512":"SHA-512",sha512:"SHA-512"},h=[];function d(t,e,r,n,i){return f.importKey("raw",t,{name:"PBKDF2"},!1,["deriveBits"]).then(function(t){return f.deriveBits({name:"PBKDF2",salt:e,iterations:r,hash:{name:i}},t,n<<3)}).then(function(t){return u.from(t)})}e.exports=function(t,e,l,p,b,m){if(u.isBuffer(t)||(t=u.from(t,a)),u.isBuffer(e)||(e=u.from(e,a)),o(l,p),"function"==typeof b&&(m=b,b=void 0),"function"!=typeof m)throw new Error("No callback provided to pbkdf2");var y,v,g=c[(b=b||"sha1").toLowerCase()];if(!g||"function"!=typeof n.Promise)return r.nextTick(function(){var r;try{r=s(t,e,l,p,b)}catch(t){return m(t)}m(null,r)});y=function(t){if(n.process&&!n.process.browser)return Promise.resolve(!1);if(!f||!f.importKey||!f.deriveBits)return Promise.resolve(!1);if(void 0!==h[t])return h[t];var e=d(i=i||u.alloc(8),i,10,128,t).then(function(){return!0}).catch(function(){return!1});return h[t]=e,e}(g).then(function(r){return r?d(t,e,l,p,g):s(t,e,l,p,b)}),v=m,y.then(function(t){r.nextTick(function(){v(null,t)})},function(t){r.nextTick(function(){v(t)})})}}).call(this,t("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./default-encoding":116,"./precondition":117,"./sync":118,_process:120,"safe-buffer":147}],116:[function(t,e,r){(function(t){var r;t.browser?r="utf-8":r=parseInt(t.version.split(".")[0].slice(1),10)>=6?"utf-8":"binary";e.exports=r}).call(this,t("_process"))},{_process:120}],117:[function(t,e,r){var n=Math.pow(2,30)-1;e.exports=function(t,e){if("number"!=typeof t)throw new TypeError("Iterations not a number");if(t<0)throw new TypeError("Bad iterations");if("number"!=typeof e)throw new TypeError("Key length not a number");if(e<0||e>n||e!=e)throw new TypeError("Bad key length")}},{}],118:[function(t,e,r){var n=t("create-hash/md5"),i=t("ripemd160"),o=t("sha.js"),a=t("./precondition"),s=t("./default-encoding"),u=t("safe-buffer").Buffer,f=u.alloc(128),c={md5:16,sha1:20,sha224:28,sha256:32,sha384:48,sha512:64,rmd160:20,ripemd160:20};function h(t,e,r){var a=function(t){return"rmd160"===t||"ripemd160"===t?i:"md5"===t?n:function(e){return o(t).update(e).digest()}}(t),s="sha512"===t||"sha384"===t?128:64;e.length>s?e=a(e):e.length1)for(var r=1;rp||new a(e).cmp(l.modulus)>=0)throw new Error("decryption error");d=c?f(new a(e),l):s(e,l);var b=new r(p-d.length);if(b.fill(0),d=r.concat([b,d],p),4===h)return function(t,e){t.modulus;var n=t.modulus.byteLength(),a=(e.length,u("sha1").update(new r("")).digest()),s=a.length;if(0!==e[0])throw new Error("decryption error");var f=e.slice(1,s+1),c=e.slice(s+1),h=o(f,i(c,s)),d=o(c,i(h,n-s-1));if(function(t,e){t=new r(t),e=new r(e);var n=0,i=t.length;t.length!==e.length&&(n++,i=Math.min(t.length,e.length));var o=-1;for(;++o=e.length){o++;break}var a=e.slice(2,i-1);e.slice(i-1,i);("0002"!==n.toString("hex")&&!r||"0001"!==n.toString("hex")&&r)&&o++;a.length<8&&o++;if(o)throw new Error("decryption error");return e.slice(i)}(0,d,c);if(3===h)return d;throw new Error("unknown padding")}}).call(this,t("buffer").Buffer)},{"./mgf":122,"./withPublic":125,"./xor":126,"bn.js":"BN","browserify-rsa":38,buffer:47,"create-hash":51,"parse-asn1":113}],124:[function(t,e,r){(function(r){var n=t("parse-asn1"),i=t("randombytes"),o=t("create-hash"),a=t("./mgf"),s=t("./xor"),u=t("bn.js"),f=t("./withPublic"),c=t("browserify-rsa");e.exports=function(t,e,h){var d;d=t.padding?t.padding:h?1:4;var l,p=n(t);if(4===d)l=function(t,e){var n=t.modulus.byteLength(),f=e.length,c=o("sha1").update(new r("")).digest(),h=c.length,d=2*h;if(f>n-d-2)throw new Error("message too long");var l=new r(n-f-d-2);l.fill(0);var p=n-h-1,b=i(h),m=s(r.concat([c,l,new r([1]),e],p),a(b,p)),y=s(b,a(m,h));return new u(r.concat([new r([0]),y,m],n))}(p,e);else if(1===d)l=function(t,e,n){var o,a=e.length,s=t.modulus.byteLength();if(a>s-11)throw new Error("message too long");n?(o=new r(s-a-3)).fill(255):o=function(t,e){var n,o=new r(t),a=0,s=i(2*t),u=0;for(;a=0)throw new Error("data too long for modulus")}return h?c(l,p):f(l,p)}}).call(this,t("buffer").Buffer)},{"./mgf":122,"./withPublic":125,"./xor":126,"bn.js":"BN","browserify-rsa":38,buffer:47,"create-hash":51,"parse-asn1":113,randombytes:131}],125:[function(t,e,r){(function(r){var n=t("bn.js");e.exports=function(t,e){return new r(t.toRed(n.mont(e.modulus)).redPow(new n(e.publicExponent)).fromRed().toArray())}}).call(this,t("buffer").Buffer)},{"bn.js":"BN",buffer:47}],126:[function(t,e,r){e.exports=function(t,e){for(var r=t.length,n=-1;++n= 0x80 (not a basic code point)","invalid-input":"Invalid input"},M=c-h,x=Math.floor,k=String.fromCharCode;function S(t){throw new RangeError(_[t])}function E(t,e){for(var r=t.length,n=[];r--;)n[r]=e(t[r]);return n}function A(t,e){var r=t.split("@"),n="";return r.length>1&&(n=r[0]+"@",t=r[1]),n+E((t=t.replace(w,".")).split("."),e).join(".")}function j(t){for(var e,r,n=[],i=0,o=t.length;i=55296&&e<=56319&&i65535&&(e+=k((t-=65536)>>>10&1023|55296),t=56320|1023&t),e+=k(t)}).join("")}function B(t,e){return t+22+75*(t<26)-((0!=e)<<5)}function T(t,e,r){var n=0;for(t=r?x(t/p):t>>1,t+=x(t/e);t>M*d>>1;n+=c)t=x(t/M);return x(n+(M+1)*t/(t+l))}function C(t){var e,r,n,i,o,a,s,u,l,p,v,g=[],w=t.length,_=0,M=m,k=b;for((r=t.lastIndexOf(y))<0&&(r=0),n=0;n=128&&S("not-basic"),g.push(t.charCodeAt(n));for(i=r>0?r+1:0;i=w&&S("invalid-input"),((u=(v=t.charCodeAt(i++))-48<10?v-22:v-65<26?v-65:v-97<26?v-97:c)>=c||u>x((f-_)/a))&&S("overflow"),_+=u*a,!(u<(l=s<=k?h:s>=k+d?d:s-k));s+=c)a>x(f/(p=c-l))&&S("overflow"),a*=p;k=T(_-o,e=g.length+1,0==o),x(_/e)>f-M&&S("overflow"),M+=x(_/e),_%=e,g.splice(_++,0,M)}return I(g)}function P(t){var e,r,n,i,o,a,s,u,l,p,v,g,w,_,M,E=[];for(g=(t=j(t)).length,e=m,r=0,o=b,a=0;a=e&&vx((f-r)/(w=n+1))&&S("overflow"),r+=(s-e)*w,e=s,a=0;af&&S("overflow"),v==e){for(u=r,l=c;!(u<(p=l<=o?h:l>=o+d?d:l-o));l+=c)M=u-p,_=c-p,E.push(k(B(p+M%_,0))),u=x(M/_);E.push(k(B(u,0))),o=T(r,w,n==i),r=0,++n}++r,++e}return E.join("")}if(s={version:"1.4.1",ucs2:{decode:j,encode:I},decode:C,encode:P,toASCII:function(t){return A(t,function(t){return g.test(t)?"xn--"+P(t):t})},toUnicode:function(t){return A(t,function(t){return v.test(t)?C(t.slice(4).toLowerCase()):t})}},"function"==typeof define&&"object"==_typeof(define.amd)&&define.amd)define("punycode",function(){return s});else if(i&&o)if(e.exports==i)o.exports=s;else for(u in s)s.hasOwnProperty(u)&&(i[u]=s[u]);else n.punycode=s}(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],128:[function(t,e,r){e.exports=function(t,e,r,i){e=e||"&",r=r||"=";var o={};if("string"!=typeof t||0===t.length)return o;var a=/\+/g;t=t.split(e);var s=1e3;i&&"number"==typeof i.maxKeys&&(s=i.maxKeys);var u,f,c=t.length;s>0&&c>s&&(c=s);for(var h=0;h=0?(d=m.substr(0,y),l=m.substr(y+1)):(d=m,l=""),p=decodeURIComponent(d),b=decodeURIComponent(l),u=o,f=p,Object.prototype.hasOwnProperty.call(u,f)?n(o[p])?o[p].push(b):o[p]=[o[p],b]:o[p]=b}return o};var n=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)}},{}],129:[function(t,e,r){var n=function(t){switch(void 0===t?"undefined":_typeof(t)){case"string":return t;case"boolean":return t?"true":"false";case"number":return isFinite(t)?t:"";default:return""}};e.exports=function(t,e,r,s){return e=e||"&",r=r||"=",null===t&&(t=void 0),"object"===(void 0===t?"undefined":_typeof(t))?o(a(t),function(a){var s=encodeURIComponent(n(a))+r;return i(t[a])?o(t[a],function(t){return s+encodeURIComponent(n(t))}).join(e):s+encodeURIComponent(n(t[a]))}).join(e):s?encodeURIComponent(n(s))+r+encodeURIComponent(n(t)):""};var i=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)};function o(t,e){if(t.map)return t.map(e);for(var r=[],n=0;n65536)throw new Error("requested too many random bytes");var a=new n.Uint8Array(t);t>0&&o.getRandomValues(a);var s=i.from(a.buffer);if("function"==typeof e)return r.nextTick(function(){e(null,s)});return s}:e.exports=function(){throw new Error("Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11")}}).call(this,t("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{_process:120,"safe-buffer":147}],132:[function(t,e,r){(function(e,n){function i(){throw new Error("secure random number generation not supported by this browser\nuse chrome, FireFox or Internet Explorer 11")}var o=t("safe-buffer"),a=t("randombytes"),s=o.Buffer,u=o.kMaxLength,f=n.crypto||n.msCrypto,c=Math.pow(2,32)-1;function h(t,e){if("number"!=typeof t||t!=t)throw new TypeError("offset must be a number");if(t>c||t<0)throw new TypeError("offset must be a uint32");if(t>u||t>e)throw new RangeError("offset out of range")}function d(t,e,r){if("number"!=typeof t||t!=t)throw new TypeError("size must be a number");if(t>c||t<0)throw new TypeError("size must be a uint32");if(t+e>r||t>u)throw new RangeError("buffer too small")}function l(t,r,n,i){if(e.browser){var o=t.buffer,s=new Uint8Array(o,r,n);return f.getRandomValues(s),i?void e.nextTick(function(){i(null,t)}):t}if(!i)return a(n).copy(t,r),t;a(n,function(e,n){if(e)return i(e);n.copy(t,r),i(null,t)})}f&&f.getRandomValues||!e.browser?(r.randomFill=function(t,e,r,i){if(!(s.isBuffer(t)||t instanceof n.Uint8Array))throw new TypeError('"buf" argument must be a Buffer or Uint8Array');if("function"==typeof e)i=e,e=0,r=t.length;else if("function"==typeof r)i=r,r=t.length-e;else if("function"!=typeof i)throw new TypeError('"cb" argument must be a function');return h(e,t.length),d(r,e,t.length),l(t,e,r,i)},r.randomFillSync=function(t,e,r){void 0===e&&(e=0);if(!(s.isBuffer(t)||t instanceof n.Uint8Array))throw new TypeError('"buf" argument must be a Buffer or Uint8Array');h(e,t.length),void 0===r&&(r=t.length-e);return d(r,e,t.length),l(t,e,r)}):(r.randomFill=i,r.randomFillSync=i)}).call(this,t("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{_process:120,randombytes:131,"safe-buffer":147}],133:[function(t,e,r){e.exports=t("./lib/_stream_duplex.js")},{"./lib/_stream_duplex.js":134}],134:[function(t,e,r){var n=t("process-nextick-args").nextTick,i=Object.keys||function(t){var e=[];for(var r in t)e.push(r);return e};e.exports=h;var o=t("core-util-is");o.inherits=t("inherits");var a=t("./_stream_readable"),s=t("./_stream_writable");o.inherits(h,a);for(var u=i(s.prototype),f=0;f0?("string"==typeof e||u.objectMode||Object.getPrototypeOf(e)===f.prototype||(a=e,e=f.from(a)),n?u.endEmitted?t.emit("error",new Error("stream.unshift() after end event")):_(t,u,e,!0):u.ended?t.emit("error",new Error("stream.push() after EOF")):(u.reading=!1,u.decoder&&!r?(e=u.decoder.write(e),u.objectMode||0!==e.length?_(t,u,e,!1):E(t,u)):_(t,u,e,!1))):n||(u.reading=!1));return!(s=u).ended&&(s.needReadable||s.lengthe.highWaterMark&&(e.highWaterMark=((r=t)>=M?r=M:(r--,r|=r>>>1,r|=r>>>2,r|=r>>>4,r|=r>>>8,r|=r>>>16,r++),r)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0));var r}function k(t){var e=t._readableState;e.needReadable=!1,e.emittedReadable||(l("emitReadable",e.flowing),e.emittedReadable=!0,e.sync?i(S,t):S(t))}function S(t){l("emit readable"),t.emit("readable"),B(t)}function E(t,e){e.readingMore||(e.readingMore=!0,i(A,t,e))}function A(t,e){for(var r=e.length;!e.reading&&!e.flowing&&!e.ended&&e.length=e.length?(r=e.decoder?e.buffer.join(""):1===e.buffer.length?e.buffer.head.data:e.buffer.concat(e.length),e.buffer.clear()):r=function(t,e,r){var n;to.length?o.length:t;if(a===o.length?i+=o:i+=o.slice(0,t),0===(t-=a)){a===o.length?(++n,r.next?e.head=r.next:e.head=e.tail=null):(e.head=r,r.data=o.slice(a));break}++n}return e.length-=n,i}(t,e):function(t,e){var r=f.allocUnsafe(t),n=e.head,i=1;n.data.copy(r),t-=n.data.length;for(;n=n.next;){var o=n.data,a=t>o.length?o.length:t;if(o.copy(r,r.length-t,0,a),0===(t-=a)){a===o.length?(++i,n.next?e.head=n.next:e.head=e.tail=null):(e.head=n,n.data=o.slice(a));break}++i}return e.length-=i,r}(t,e);return n}(t,e.buffer,e.decoder),r);var r}function C(t){var e=t._readableState;if(e.length>0)throw new Error('"endReadable()" called on non-empty stream');e.endEmitted||(e.ended=!0,i(P,e,t))}function P(t,e){t.endEmitted||0!==t.length||(t.endEmitted=!0,e.readable=!1,e.emit("end"))}function R(t,e){for(var r=0,n=t.length;r=e.highWaterMark||e.ended))return l("read: emitReadable",e.length,e.ended),0===e.length&&e.ended?C(this):k(this),null;if(0===(t=x(t,e))&&e.ended)return 0===e.length&&C(this),null;var n,i=e.needReadable;return l("need readable",i),(0===e.length||e.length-t0?T(t,e):null)?(e.needReadable=!0,t=0):e.length-=t,0===e.length&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&C(this)),null!==n&&this.emit("data",n),n},g.prototype._read=function(t){this.emit("error",new Error("_read() is not implemented"))},g.prototype.pipe=function(t,e){var n=this,o=this._readableState;switch(o.pipesCount){case 0:o.pipes=t;break;case 1:o.pipes=[o.pipes,t];break;default:o.pipes.push(t)}o.pipesCount+=1,l("pipe count=%d opts=%j",o.pipesCount,e);var u=(!e||!1!==e.end)&&t!==r.stdout&&t!==r.stderr?c:w;function f(e,r){l("onunpipe"),e===n&&r&&!1===r.hasUnpiped&&(r.hasUnpiped=!0,l("cleanup"),t.removeListener("close",v),t.removeListener("finish",g),t.removeListener("drain",d),t.removeListener("error",y),t.removeListener("unpipe",f),n.removeListener("end",c),n.removeListener("end",w),n.removeListener("data",m),p=!0,!o.awaitDrain||t._writableState&&!t._writableState.needDrain||d())}function c(){l("onend"),t.end()}o.endEmitted?i(u):n.once("end",u),t.on("unpipe",f);var h,d=(h=n,function(){var t=h._readableState;l("pipeOnDrain",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,0===t.awaitDrain&&s(h,"data")&&(t.flowing=!0,B(h))});t.on("drain",d);var p=!1;var b=!1;function m(e){l("ondata"),b=!1,!1!==t.write(e)||b||((1===o.pipesCount&&o.pipes===t||o.pipesCount>1&&-1!==R(o.pipes,t))&&!p&&(l("false write response, pause",n._readableState.awaitDrain),n._readableState.awaitDrain++,b=!0),n.pause())}function y(e){l("onerror",e),w(),t.removeListener("error",y),0===s(t,"error")&&t.emit("error",e)}function v(){t.removeListener("finish",g),w()}function g(){l("onfinish"),t.removeListener("close",v),w()}function w(){l("unpipe"),n.unpipe(t)}return n.on("data",m),function(t,e,r){if("function"==typeof t.prependListener)return t.prependListener(e,r);t._events&&t._events[e]?a(t._events[e])?t._events[e].unshift(r):t._events[e]=[r,t._events[e]]:t.on(e,r)}(t,"error",y),t.once("close",v),t.once("finish",g),t.emit("pipe",n),o.flowing||(l("pipe resume"),n.resume()),t},g.prototype.unpipe=function(t){var e=this._readableState,r={hasUnpiped:!1};if(0===e.pipesCount)return this;if(1===e.pipesCount)return t&&t!==e.pipes?this:(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit("unpipe",this,r),this);if(!t){var n=e.pipes,i=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var o=0;o-1?setImmediate:i;y.WritableState=m;var u=t("core-util-is");u.inherits=t("inherits");var f={deprecate:t("util-deprecate")},c=t("./internal/streams/stream"),h=t("safe-buffer").Buffer,d=n.Uint8Array||function(){};var l,p=t("./internal/streams/destroy");function b(){}function m(e,r){a=a||t("./_stream_duplex"),e=e||{};var n=r instanceof a;this.objectMode=!!e.objectMode,n&&(this.objectMode=this.objectMode||!!e.writableObjectMode);var u=e.highWaterMark,f=e.writableHighWaterMark,c=this.objectMode?16:16384;this.highWaterMark=u||0===u?u:n&&(f||0===f)?f:c,this.highWaterMark=Math.floor(this.highWaterMark),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var h=!1===e.decodeStrings;this.decodeStrings=!h,this.defaultEncoding=e.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(t){!function(t,e){var r=t._writableState,n=r.sync,o=r.writecb;if(l=r,l.writing=!1,l.writecb=null,l.length-=l.writelen,l.writelen=0,e)u=t,f=r,c=n,h=e,d=o,--f.pendingcb,c?(i(d,h),i(x,u,f),u._writableState.errorEmitted=!0,u.emit("error",h)):(d(h),u._writableState.errorEmitted=!0,u.emit("error",h),x(u,f));else{var a=_(r);a||r.corked||r.bufferProcessing||!r.bufferedRequest||w(t,r),n?s(g,t,r,a,o):g(t,r,a,o)}var u,f,c,h,d;var l}(r,t)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new o(this)}function y(e){if(a=a||t("./_stream_duplex"),!(l.call(y,this)||this instanceof a))return new y(e);this._writableState=new m(e,this),this.writable=!0,e&&("function"==typeof e.write&&(this._write=e.write),"function"==typeof e.writev&&(this._writev=e.writev),"function"==typeof e.destroy&&(this._destroy=e.destroy),"function"==typeof e.final&&(this._final=e.final)),c.call(this)}function v(t,e,r,n,i,o,a){e.writelen=n,e.writecb=a,e.writing=!0,e.sync=!0,r?t._writev(i,e.onwrite):t._write(i,o,e.onwrite),e.sync=!1}function g(t,e,r,n){var i,o;r||(i=t,0===(o=e).length&&o.needDrain&&(o.needDrain=!1,i.emit("drain"))),e.pendingcb--,n(),x(t,e)}function w(t,e){e.bufferProcessing=!0;var r=e.bufferedRequest;if(t._writev&&r&&r.next){var n=e.bufferedRequestCount,i=new Array(n),a=e.corkedRequestsFree;a.entry=r;for(var s=0,u=!0;r;)i[s]=r,r.isBuf||(u=!1),r=r.next,s+=1;i.allBuffers=u,v(t,e,!0,e.length,i,"",a.finish),e.pendingcb++,e.lastBufferedRequest=null,a.next?(e.corkedRequestsFree=a.next,a.next=null):e.corkedRequestsFree=new o(e),e.bufferedRequestCount=0}else{for(;r;){var f=r.chunk,c=r.encoding,h=r.callback;if(v(t,e,!1,e.objectMode?1:f.length,f,c,h),r=r.next,e.bufferedRequestCount--,e.writing)break}null===r&&(e.lastBufferedRequest=null)}e.bufferedRequest=r,e.bufferProcessing=!1}function _(t){return t.ending&&0===t.length&&null===t.bufferedRequest&&!t.finished&&!t.writing}function M(t,e){t._final(function(r){e.pendingcb--,r&&t.emit("error",r),e.prefinished=!0,t.emit("prefinish"),x(t,e)})}function x(t,e){var r,n,o=_(e);return o&&(r=t,(n=e).prefinished||n.finalCalled||("function"==typeof r._final?(n.pendingcb++,n.finalCalled=!0,i(M,r,n)):(n.prefinished=!0,r.emit("prefinish"))),0===e.pendingcb&&(e.finished=!0,t.emit("finish"))),o}u.inherits(y,c),m.prototype.getBuffer=function(){for(var t=this.bufferedRequest,e=[];t;)e.push(t),t=t.next;return e},function(){try{Object.defineProperty(m.prototype,"buffer",{get:f.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(t){}}(),"function"==typeof Symbol&&Symbol.hasInstance&&"function"==typeof Function.prototype[Symbol.hasInstance]?(l=Function.prototype[Symbol.hasInstance],Object.defineProperty(y,Symbol.hasInstance,{value:function(t){return!!l.call(this,t)||this===y&&(t&&t._writableState instanceof m)}})):l=function(t){return t instanceof this},y.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))},y.prototype.write=function(t,e,r){var n,o,a,s,u,f,c,l,p,m,y,g=this._writableState,w=!1,_=!g.objectMode&&(n=t,h.isBuffer(n)||n instanceof d);return _&&!h.isBuffer(t)&&(o=t,t=h.from(o)),"function"==typeof e&&(r=e,e=null),_?e="buffer":e||(e=g.defaultEncoding),"function"!=typeof r&&(r=b),g.ended?(p=this,m=r,y=new Error("write after end"),p.emit("error",y),i(m,y)):(_||(a=this,s=g,f=r,c=!0,l=!1,null===(u=t)?l=new TypeError("May not write null values to stream"):"string"==typeof u||void 0===u||s.objectMode||(l=new TypeError("Invalid non-string/buffer chunk")),l&&(a.emit("error",l),i(f,l),c=!1),c))&&(g.pendingcb++,w=function(t,e,r,n,i,o){if(!r){var a=function(t,e,r){t.objectMode||!1===t.decodeStrings||"string"!=typeof e||(e=h.from(e,r));return e}(e,n,i);n!==a&&(r=!0,i="buffer",n=a)}var s=e.objectMode?1:n.length;e.length+=s;var u=e.length-1))throw new TypeError("Unknown encoding: "+t);return this._writableState.defaultEncoding=t,this},y.prototype._write=function(t,e,r){r(new Error("_write() is not implemented"))},y.prototype._writev=null,y.prototype.end=function(t,e,r){var n=this._writableState;"function"==typeof t?(r=t,t=null,e=null):"function"==typeof e&&(r=e,e=null),null!=t&&this.write(t,e),n.corked&&(n.corked=1,this.uncork()),n.ending||n.finished||function(t,e,r){e.ending=!0,x(t,e),r&&(e.finished?i(r):t.once("finish",r));e.ended=!0,t.writable=!1}(this,n,r)},Object.defineProperty(y.prototype,"destroyed",{get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(t){this._writableState&&(this._writableState.destroyed=t)}}),y.prototype.destroy=p.destroy,y.prototype._undestroy=p.undestroy,y.prototype._destroy=function(t,e){this.end(),e(t)}}).call(this,t("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./_stream_duplex":134,"./internal/streams/destroy":140,"./internal/streams/stream":141,_process:120,"core-util-is":49,inherits:101,"process-nextick-args":119,"safe-buffer":147,"util-deprecate":160}],139:[function(t,e,r){var n=t("safe-buffer").Buffer,i=t("util");e.exports=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.head=null,this.tail=null,this.length=0}return t.prototype.push=function(t){var e={data:t,next:null};this.length>0?this.tail.next=e:this.head=e,this.tail=e,++this.length},t.prototype.unshift=function(t){var e={data:t,next:this.head};0===this.length&&(this.tail=e),this.head=e,++this.length},t.prototype.shift=function(){if(0!==this.length){var t=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,t}},t.prototype.clear=function(){this.head=this.tail=null,this.length=0},t.prototype.join=function(t){if(0===this.length)return"";for(var e=this.head,r=""+e.data;e=e.next;)r+=t+e.data;return r},t.prototype.concat=function(t){if(0===this.length)return n.alloc(0);if(1===this.length)return this.head.data;for(var e,r,i,o=n.allocUnsafe(t>>>0),a=this.head,s=0;a;)e=a.data,r=o,i=s,e.copy(r,i),s+=a.data.length,a=a.next;return o},t}(),i&&i.inspect&&i.inspect.custom&&(e.exports.prototype[i.inspect.custom]=function(){var t=i.inspect({length:this.length});return this.constructor.name+" "+t})},{"safe-buffer":147,util:17}],140:[function(t,e,r){var n=t("process-nextick-args").nextTick;function i(t,e){t.emit("error",e)}e.exports={destroy:function(t,e){var r=this,o=this._readableState&&this._readableState.destroyed,a=this._writableState&&this._writableState.destroyed;return o||a?(e?e(t):!t||this._writableState&&this._writableState.errorEmitted||n(i,this,t),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(t||null,function(t){!e&&t?(n(i,r,t),r._writableState&&(r._writableState.errorEmitted=!0)):e&&e(t)}),this)},undestroy:function(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}}},{"process-nextick-args":119}],141:[function(t,e,r){e.exports=t("events").EventEmitter},{events:83}],142:[function(t,e,r){e.exports=t("./readable").PassThrough},{"./readable":143}],143:[function(t,e,r){(r=e.exports=t("./lib/_stream_readable.js")).Stream=r,r.Readable=r,r.Writable=t("./lib/_stream_writable.js"),r.Duplex=t("./lib/_stream_duplex.js"),r.Transform=t("./lib/_stream_transform.js"),r.PassThrough=t("./lib/_stream_passthrough.js")},{"./lib/_stream_duplex.js":134,"./lib/_stream_passthrough.js":135,"./lib/_stream_readable.js":136,"./lib/_stream_transform.js":137,"./lib/_stream_writable.js":138}],144:[function(t,e,r){e.exports=t("./readable").Transform},{"./readable":143}],145:[function(t,e,r){e.exports=t("./lib/_stream_writable.js")},{"./lib/_stream_writable.js":138}],146:[function(t,e,r){(function(r){var n=t("inherits"),i=t("hash-base");function o(){i.call(this,64),this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520}function a(t,e){return t<>>32-e}function s(t,e,r,n,i,o,s,u){return a(t+(e^r^n)+o+s|0,u)+i|0}function u(t,e,r,n,i,o,s,u){return a(t+(e&r|~e&n)+o+s|0,u)+i|0}function f(t,e,r,n,i,o,s,u){return a(t+((e|~r)^n)+o+s|0,u)+i|0}function c(t,e,r,n,i,o,s,u){return a(t+(e&n|r&~n)+o+s|0,u)+i|0}function h(t,e,r,n,i,o,s,u){return a(t+(e^(r|~n))+o+s|0,u)+i|0}n(o,i),o.prototype._update=function(){for(var t=new Array(16),e=0;e<16;++e)t[e]=this._block.readInt32LE(4*e);var r=this._a,n=this._b,i=this._c,o=this._d,d=this._e;d=s(d,r=s(r,n,i,o,d,t[0],0,11),n,i=a(i,10),o,t[1],0,14),n=s(n=a(n,10),i=s(i,o=s(o,d,r,n,i,t[2],0,15),d,r=a(r,10),n,t[3],0,12),o,d=a(d,10),r,t[4],0,5),o=s(o=a(o,10),d=s(d,r=s(r,n,i,o,d,t[5],0,8),n,i=a(i,10),o,t[6],0,7),r,n=a(n,10),i,t[7],0,9),r=s(r=a(r,10),n=s(n,i=s(i,o,d,r,n,t[8],0,11),o,d=a(d,10),r,t[9],0,13),i,o=a(o,10),d,t[10],0,14),i=s(i=a(i,10),o=s(o,d=s(d,r,n,i,o,t[11],0,15),r,n=a(n,10),i,t[12],0,6),d,r=a(r,10),n,t[13],0,7),d=u(d=a(d,10),r=s(r,n=s(n,i,o,d,r,t[14],0,9),i,o=a(o,10),d,t[15],0,8),n,i=a(i,10),o,t[7],1518500249,7),n=u(n=a(n,10),i=u(i,o=u(o,d,r,n,i,t[4],1518500249,6),d,r=a(r,10),n,t[13],1518500249,8),o,d=a(d,10),r,t[1],1518500249,13),o=u(o=a(o,10),d=u(d,r=u(r,n,i,o,d,t[10],1518500249,11),n,i=a(i,10),o,t[6],1518500249,9),r,n=a(n,10),i,t[15],1518500249,7),r=u(r=a(r,10),n=u(n,i=u(i,o,d,r,n,t[3],1518500249,15),o,d=a(d,10),r,t[12],1518500249,7),i,o=a(o,10),d,t[0],1518500249,12),i=u(i=a(i,10),o=u(o,d=u(d,r,n,i,o,t[9],1518500249,15),r,n=a(n,10),i,t[5],1518500249,9),d,r=a(r,10),n,t[2],1518500249,11),d=u(d=a(d,10),r=u(r,n=u(n,i,o,d,r,t[14],1518500249,7),i,o=a(o,10),d,t[11],1518500249,13),n,i=a(i,10),o,t[8],1518500249,12),n=f(n=a(n,10),i=f(i,o=f(o,d,r,n,i,t[3],1859775393,11),d,r=a(r,10),n,t[10],1859775393,13),o,d=a(d,10),r,t[14],1859775393,6),o=f(o=a(o,10),d=f(d,r=f(r,n,i,o,d,t[4],1859775393,7),n,i=a(i,10),o,t[9],1859775393,14),r,n=a(n,10),i,t[15],1859775393,9),r=f(r=a(r,10),n=f(n,i=f(i,o,d,r,n,t[8],1859775393,13),o,d=a(d,10),r,t[1],1859775393,15),i,o=a(o,10),d,t[2],1859775393,14),i=f(i=a(i,10),o=f(o,d=f(d,r,n,i,o,t[7],1859775393,8),r,n=a(n,10),i,t[0],1859775393,13),d,r=a(r,10),n,t[6],1859775393,6),d=f(d=a(d,10),r=f(r,n=f(n,i,o,d,r,t[13],1859775393,5),i,o=a(o,10),d,t[11],1859775393,12),n,i=a(i,10),o,t[5],1859775393,7),n=c(n=a(n,10),i=c(i,o=f(o,d,r,n,i,t[12],1859775393,5),d,r=a(r,10),n,t[1],2400959708,11),o,d=a(d,10),r,t[9],2400959708,12),o=c(o=a(o,10),d=c(d,r=c(r,n,i,o,d,t[11],2400959708,14),n,i=a(i,10),o,t[10],2400959708,15),r,n=a(n,10),i,t[0],2400959708,14),r=c(r=a(r,10),n=c(n,i=c(i,o,d,r,n,t[8],2400959708,15),o,d=a(d,10),r,t[12],2400959708,9),i,o=a(o,10),d,t[4],2400959708,8),i=c(i=a(i,10),o=c(o,d=c(d,r,n,i,o,t[13],2400959708,9),r,n=a(n,10),i,t[3],2400959708,14),d,r=a(r,10),n,t[7],2400959708,5),d=c(d=a(d,10),r=c(r,n=c(n,i,o,d,r,t[15],2400959708,6),i,o=a(o,10),d,t[14],2400959708,8),n,i=a(i,10),o,t[5],2400959708,6),n=h(n=a(n,10),i=c(i,o=c(o,d,r,n,i,t[6],2400959708,5),d,r=a(r,10),n,t[2],2400959708,12),o,d=a(d,10),r,t[4],2840853838,9),o=h(o=a(o,10),d=h(d,r=h(r,n,i,o,d,t[0],2840853838,15),n,i=a(i,10),o,t[5],2840853838,5),r,n=a(n,10),i,t[9],2840853838,11),r=h(r=a(r,10),n=h(n,i=h(i,o,d,r,n,t[7],2840853838,6),o,d=a(d,10),r,t[12],2840853838,8),i,o=a(o,10),d,t[2],2840853838,13),i=h(i=a(i,10),o=h(o,d=h(d,r,n,i,o,t[10],2840853838,12),r,n=a(n,10),i,t[14],2840853838,5),d,r=a(r,10),n,t[1],2840853838,12),d=h(d=a(d,10),r=h(r,n=h(n,i,o,d,r,t[3],2840853838,13),i,o=a(o,10),d,t[8],2840853838,14),n,i=a(i,10),o,t[11],2840853838,11),n=h(n=a(n,10),i=h(i,o=h(o,d,r,n,i,t[6],2840853838,8),d,r=a(r,10),n,t[15],2840853838,5),o,d=a(d,10),r,t[13],2840853838,6),o=a(o,10);var l=this._a,p=this._b,b=this._c,m=this._d,y=this._e;y=h(y,l=h(l,p,b,m,y,t[5],1352829926,8),p,b=a(b,10),m,t[14],1352829926,9),p=h(p=a(p,10),b=h(b,m=h(m,y,l,p,b,t[7],1352829926,9),y,l=a(l,10),p,t[0],1352829926,11),m,y=a(y,10),l,t[9],1352829926,13),m=h(m=a(m,10),y=h(y,l=h(l,p,b,m,y,t[2],1352829926,15),p,b=a(b,10),m,t[11],1352829926,15),l,p=a(p,10),b,t[4],1352829926,5),l=h(l=a(l,10),p=h(p,b=h(b,m,y,l,p,t[13],1352829926,7),m,y=a(y,10),l,t[6],1352829926,7),b,m=a(m,10),y,t[15],1352829926,8),b=h(b=a(b,10),m=h(m,y=h(y,l,p,b,m,t[8],1352829926,11),l,p=a(p,10),b,t[1],1352829926,14),y,l=a(l,10),p,t[10],1352829926,14),y=c(y=a(y,10),l=h(l,p=h(p,b,m,y,l,t[3],1352829926,12),b,m=a(m,10),y,t[12],1352829926,6),p,b=a(b,10),m,t[6],1548603684,9),p=c(p=a(p,10),b=c(b,m=c(m,y,l,p,b,t[11],1548603684,13),y,l=a(l,10),p,t[3],1548603684,15),m,y=a(y,10),l,t[7],1548603684,7),m=c(m=a(m,10),y=c(y,l=c(l,p,b,m,y,t[0],1548603684,12),p,b=a(b,10),m,t[13],1548603684,8),l,p=a(p,10),b,t[5],1548603684,9),l=c(l=a(l,10),p=c(p,b=c(b,m,y,l,p,t[10],1548603684,11),m,y=a(y,10),l,t[14],1548603684,7),b,m=a(m,10),y,t[15],1548603684,7),b=c(b=a(b,10),m=c(m,y=c(y,l,p,b,m,t[8],1548603684,12),l,p=a(p,10),b,t[12],1548603684,7),y,l=a(l,10),p,t[4],1548603684,6),y=c(y=a(y,10),l=c(l,p=c(p,b,m,y,l,t[9],1548603684,15),b,m=a(m,10),y,t[1],1548603684,13),p,b=a(b,10),m,t[2],1548603684,11),p=f(p=a(p,10),b=f(b,m=f(m,y,l,p,b,t[15],1836072691,9),y,l=a(l,10),p,t[5],1836072691,7),m,y=a(y,10),l,t[1],1836072691,15),m=f(m=a(m,10),y=f(y,l=f(l,p,b,m,y,t[3],1836072691,11),p,b=a(b,10),m,t[7],1836072691,8),l,p=a(p,10),b,t[14],1836072691,6),l=f(l=a(l,10),p=f(p,b=f(b,m,y,l,p,t[6],1836072691,6),m,y=a(y,10),l,t[9],1836072691,14),b,m=a(m,10),y,t[11],1836072691,12),b=f(b=a(b,10),m=f(m,y=f(y,l,p,b,m,t[8],1836072691,13),l,p=a(p,10),b,t[12],1836072691,5),y,l=a(l,10),p,t[2],1836072691,14),y=f(y=a(y,10),l=f(l,p=f(p,b,m,y,l,t[10],1836072691,13),b,m=a(m,10),y,t[0],1836072691,13),p,b=a(b,10),m,t[4],1836072691,7),p=u(p=a(p,10),b=u(b,m=f(m,y,l,p,b,t[13],1836072691,5),y,l=a(l,10),p,t[8],2053994217,15),m,y=a(y,10),l,t[6],2053994217,5),m=u(m=a(m,10),y=u(y,l=u(l,p,b,m,y,t[4],2053994217,8),p,b=a(b,10),m,t[1],2053994217,11),l,p=a(p,10),b,t[3],2053994217,14),l=u(l=a(l,10),p=u(p,b=u(b,m,y,l,p,t[11],2053994217,14),m,y=a(y,10),l,t[15],2053994217,6),b,m=a(m,10),y,t[0],2053994217,14),b=u(b=a(b,10),m=u(m,y=u(y,l,p,b,m,t[5],2053994217,6),l,p=a(p,10),b,t[12],2053994217,9),y,l=a(l,10),p,t[2],2053994217,12),y=u(y=a(y,10),l=u(l,p=u(p,b,m,y,l,t[13],2053994217,9),b,m=a(m,10),y,t[9],2053994217,12),p,b=a(b,10),m,t[7],2053994217,5),p=s(p=a(p,10),b=u(b,m=u(m,y,l,p,b,t[10],2053994217,15),y,l=a(l,10),p,t[14],2053994217,8),m,y=a(y,10),l,t[12],0,8),m=s(m=a(m,10),y=s(y,l=s(l,p,b,m,y,t[15],0,5),p,b=a(b,10),m,t[10],0,12),l,p=a(p,10),b,t[4],0,9),l=s(l=a(l,10),p=s(p,b=s(b,m,y,l,p,t[1],0,12),m,y=a(y,10),l,t[5],0,5),b,m=a(m,10),y,t[8],0,14),b=s(b=a(b,10),m=s(m,y=s(y,l,p,b,m,t[7],0,6),l,p=a(p,10),b,t[6],0,8),y,l=a(l,10),p,t[2],0,13),y=s(y=a(y,10),l=s(l,p=s(p,b,m,y,l,t[13],0,6),b,m=a(m,10),y,t[14],0,5),p,b=a(b,10),m,t[0],0,15),p=s(p=a(p,10),b=s(b,m=s(m,y,l,p,b,t[3],0,13),y,l=a(l,10),p,t[9],0,11),m,y=a(y,10),l,t[11],0,11),m=a(m,10);var v=this._b+i+m|0;this._b=this._c+o+y|0,this._c=this._d+d+l|0,this._d=this._e+r+p|0,this._e=this._a+n+b|0,this._a=v},o.prototype._digest=function(){this._block[this._blockOffset++]=128,this._blockOffset>56&&(this._block.fill(0,this._blockOffset,64),this._update(),this._blockOffset=0),this._block.fill(0,this._blockOffset,56),this._block.writeUInt32LE(this._length[0],56),this._block.writeUInt32LE(this._length[1],60),this._update();var t=new r(20);return t.writeInt32LE(this._a,0),t.writeInt32LE(this._b,4),t.writeInt32LE(this._c,8),t.writeInt32LE(this._d,12),t.writeInt32LE(this._e,16),t},e.exports=o}).call(this,t("buffer").Buffer)},{buffer:47,"hash-base":85,inherits:101}],147:[function(t,e,r){var n=t("buffer"),i=n.Buffer;function o(t,e){for(var r in t)e[r]=t[r]}function a(t,e,r){return i(t,e,r)}i.from&&i.alloc&&i.allocUnsafe&&i.allocUnsafeSlow?e.exports=n:(o(n,r),r.Buffer=a),o(i,a),a.from=function(t,e,r){if("number"==typeof t)throw new TypeError("Argument must not be a number");return i(t,e,r)},a.alloc=function(t,e,r){if("number"!=typeof t)throw new TypeError("Argument must be a number");var n=i(t);return void 0!==e?"string"==typeof r?n.fill(e,r):n.fill(e):n.fill(0),n},a.allocUnsafe=function(t){if("number"!=typeof t)throw new TypeError("Argument must be a number");return i(t)},a.allocUnsafeSlow=function(t){if("number"!=typeof t)throw new TypeError("Argument must be a number");return n.SlowBuffer(t)}},{buffer:47}],148:[function(t,e,r){var n=t("safe-buffer").Buffer;function i(t,e){this._block=n.alloc(t),this._finalSize=e,this._blockSize=t,this._len=0}i.prototype.update=function(t,e){"string"==typeof t&&(e=e||"utf8",t=n.from(t,e));for(var r=this._block,i=this._blockSize,o=t.length,a=this._len,s=0;s=this._finalSize&&(this._update(this._block),this._block.fill(0));var r=8*this._len;if(r<=4294967295)this._block.writeUInt32BE(r,this._blockSize-4);else{var n=(4294967295&r)>>>0,i=(r-n)/4294967296;this._block.writeUInt32BE(i,this._blockSize-8),this._block.writeUInt32BE(n,this._blockSize-4)}this._update(this._block);var o=this._hash();return t?o.toString(t):o},i.prototype._update=function(){throw new Error("_update must be implemented by subclass")},e.exports=i},{"safe-buffer":147}],149:[function(t,e,r){(r=e.exports=function(t){t=t.toLowerCase();var e=r[t];if(!e)throw new Error(t+" is not supported (we accept pull requests)");return new e}).sha=t("./sha"),r.sha1=t("./sha1"),r.sha224=t("./sha224"),r.sha256=t("./sha256"),r.sha384=t("./sha384"),r.sha512=t("./sha512")},{"./sha":150,"./sha1":151,"./sha224":152,"./sha256":153,"./sha384":154,"./sha512":155}],150:[function(t,e,r){var n=t("inherits"),i=t("./hash"),o=t("safe-buffer").Buffer,a=[1518500249,1859775393,-1894007588,-899497514],s=new Array(80);function u(){this.init(),this._w=s,i.call(this,64,56)}n(u,i),u.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},u.prototype._update=function(t){for(var e,r,n,i,o,s,u=this._w,f=0|this._a,c=0|this._b,h=0|this._c,d=0|this._d,l=0|this._e,p=0;p<16;++p)u[p]=t.readInt32BE(4*p);for(;p<80;++p)u[p]=u[p-3]^u[p-8]^u[p-14]^u[p-16];for(var b=0;b<80;++b){var m=~~(b/20),y=0|((s=f)<<5|s>>>27)+(n=c,i=h,o=d,0===(r=m)?n&i|~n&o:2===r?n&i|n&o|i&o:n^i^o)+l+u[b]+a[m];l=d,d=h,h=(e=c)<<30|e>>>2,c=f,f=y}this._a=f+this._a|0,this._b=c+this._b|0,this._c=h+this._c|0,this._d=d+this._d|0,this._e=l+this._e|0},u.prototype._hash=function(){var t=o.allocUnsafe(20);return t.writeInt32BE(0|this._a,0),t.writeInt32BE(0|this._b,4),t.writeInt32BE(0|this._c,8),t.writeInt32BE(0|this._d,12),t.writeInt32BE(0|this._e,16),t},e.exports=u},{"./hash":148,inherits:101,"safe-buffer":147}],151:[function(t,e,r){var n=t("inherits"),i=t("./hash"),o=t("safe-buffer").Buffer,a=[1518500249,1859775393,-1894007588,-899497514],s=new Array(80);function u(){this.init(),this._w=s,i.call(this,64,56)}n(u,i),u.prototype.init=function(){return this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520,this},u.prototype._update=function(t){for(var e,r,n,i,o,s,u,f=this._w,c=0|this._a,h=0|this._b,d=0|this._c,l=0|this._d,p=0|this._e,b=0;b<16;++b)f[b]=t.readInt32BE(4*b);for(;b<80;++b)f[b]=(e=f[b-3]^f[b-8]^f[b-14]^f[b-16])<<1|e>>>31;for(var m=0;m<80;++m){var y=~~(m/20),v=0|((u=c)<<5|u>>>27)+(i=h,o=d,s=l,0===(n=y)?i&o|~i&s:2===n?i&o|i&s|o&s:i^o^s)+p+f[m]+a[y];p=l,l=d,d=(r=h)<<30|r>>>2,h=c,c=v}this._a=c+this._a|0,this._b=h+this._b|0,this._c=d+this._c|0,this._d=l+this._d|0,this._e=p+this._e|0},u.prototype._hash=function(){var t=o.allocUnsafe(20);return t.writeInt32BE(0|this._a,0),t.writeInt32BE(0|this._b,4),t.writeInt32BE(0|this._c,8),t.writeInt32BE(0|this._d,12),t.writeInt32BE(0|this._e,16),t},e.exports=u},{"./hash":148,inherits:101,"safe-buffer":147}],152:[function(t,e,r){var n=t("inherits"),i=t("./sha256"),o=t("./hash"),a=t("safe-buffer").Buffer,s=new Array(64);function u(){this.init(),this._w=s,o.call(this,64,56)}n(u,i),u.prototype.init=function(){return this._a=3238371032,this._b=914150663,this._c=812702999,this._d=4144912697,this._e=4290775857,this._f=1750603025,this._g=1694076839,this._h=3204075428,this},u.prototype._hash=function(){var t=a.allocUnsafe(28);return t.writeInt32BE(this._a,0),t.writeInt32BE(this._b,4),t.writeInt32BE(this._c,8),t.writeInt32BE(this._d,12),t.writeInt32BE(this._e,16),t.writeInt32BE(this._f,20),t.writeInt32BE(this._g,24),t},e.exports=u},{"./hash":148,"./sha256":153,inherits:101,"safe-buffer":147}],153:[function(t,e,r){var n=t("inherits"),i=t("./hash"),o=t("safe-buffer").Buffer,a=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],s=new Array(64);function u(){this.init(),this._w=s,i.call(this,64,56)}n(u,i),u.prototype.init=function(){return this._a=1779033703,this._b=3144134277,this._c=1013904242,this._d=2773480762,this._e=1359893119,this._f=2600822924,this._g=528734635,this._h=1541459225,this},u.prototype._update=function(t){for(var e,r,n,i,o,s,u,f=this._w,c=0|this._a,h=0|this._b,d=0|this._c,l=0|this._d,p=0|this._e,b=0|this._f,m=0|this._g,y=0|this._h,v=0;v<16;++v)f[v]=t.readInt32BE(4*v);for(;v<64;++v)f[v]=0|(((r=f[v-2])>>>17|r<<15)^(r>>>19|r<<13)^r>>>10)+f[v-7]+(((e=f[v-15])>>>7|e<<25)^(e>>>18|e<<14)^e>>>3)+f[v-16];for(var g=0;g<64;++g){var w=y+(((u=p)>>>6|u<<26)^(u>>>11|u<<21)^(u>>>25|u<<7))+((s=m)^p&(b^s))+a[g]+f[g]|0,_=0|(((o=c)>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+((n=c)&(i=h)|d&(n|i));y=m,m=b,b=p,p=l+w|0,l=d,d=h,h=c,c=w+_|0}this._a=c+this._a|0,this._b=h+this._b|0,this._c=d+this._c|0,this._d=l+this._d|0,this._e=p+this._e|0,this._f=b+this._f|0,this._g=m+this._g|0,this._h=y+this._h|0},u.prototype._hash=function(){var t=o.allocUnsafe(32);return t.writeInt32BE(this._a,0),t.writeInt32BE(this._b,4),t.writeInt32BE(this._c,8),t.writeInt32BE(this._d,12),t.writeInt32BE(this._e,16),t.writeInt32BE(this._f,20),t.writeInt32BE(this._g,24),t.writeInt32BE(this._h,28),t},e.exports=u},{"./hash":148,inherits:101,"safe-buffer":147}],154:[function(t,e,r){var n=t("inherits"),i=t("./sha512"),o=t("./hash"),a=t("safe-buffer").Buffer,s=new Array(160);function u(){this.init(),this._w=s,o.call(this,128,112)}n(u,i),u.prototype.init=function(){return this._ah=3418070365,this._bh=1654270250,this._ch=2438529370,this._dh=355462360,this._eh=1731405415,this._fh=2394180231,this._gh=3675008525,this._hh=1203062813,this._al=3238371032,this._bl=914150663,this._cl=812702999,this._dl=4144912697,this._el=4290775857,this._fl=1750603025,this._gl=1694076839,this._hl=3204075428,this},u.prototype._hash=function(){var t=a.allocUnsafe(48);function e(e,r,n){t.writeInt32BE(e,n),t.writeInt32BE(r,n+4)}return e(this._ah,this._al,0),e(this._bh,this._bl,8),e(this._ch,this._cl,16),e(this._dh,this._dl,24),e(this._eh,this._el,32),e(this._fh,this._fl,40),t},e.exports=u},{"./hash":148,"./sha512":155,inherits:101,"safe-buffer":147}],155:[function(t,e,r){var n=t("inherits"),i=t("./hash"),o=t("safe-buffer").Buffer,a=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],s=new Array(160);function u(){this.init(),this._w=s,i.call(this,128,112)}function f(t,e,r){return r^t&(e^r)}function c(t,e,r){return t&e|r&(t|e)}function h(t,e){return(t>>>28|e<<4)^(e>>>2|t<<30)^(e>>>7|t<<25)}function d(t,e){return(t>>>14|e<<18)^(t>>>18|e<<14)^(e>>>9|t<<23)}function l(t,e){return t>>>0>>0?1:0}n(u,i),u.prototype.init=function(){return this._ah=1779033703,this._bh=3144134277,this._ch=1013904242,this._dh=2773480762,this._eh=1359893119,this._fh=2600822924,this._gh=528734635,this._hh=1541459225,this._al=4089235720,this._bl=2227873595,this._cl=4271175723,this._dl=1595750129,this._el=2917565137,this._fl=725511199,this._gl=4215389547,this._hl=327033209,this},u.prototype._update=function(t){for(var e,r,n,i,o,s,u,p,b=this._w,m=0|this._ah,y=0|this._bh,v=0|this._ch,g=0|this._dh,w=0|this._eh,_=0|this._fh,M=0|this._gh,x=0|this._hh,k=0|this._al,S=0|this._bl,E=0|this._cl,A=0|this._dl,j=0|this._el,I=0|this._fl,B=0|this._gl,T=0|this._hl,C=0;C<32;C+=2)b[C]=t.readInt32BE(4*C),b[C+1]=t.readInt32BE(4*C+4);for(;C<160;C+=2){var P=b[C-30],R=b[C-30+1],O=((u=P)>>>1|(p=R)<<31)^(u>>>8|p<<24)^u>>>7,N=((o=R)>>>1|(s=P)<<31)^(o>>>8|s<<24)^(o>>>7|s<<25);P=b[C-4],R=b[C-4+1];var L=((n=P)>>>19|(i=R)<<13)^(i>>>29|n<<3)^n>>>6,F=((e=R)>>>19|(r=P)<<13)^(r>>>29|e<<3)^(e>>>6|r<<26),q=b[C-14],D=b[C-14+1],U=b[C-32],z=b[C-32+1],K=N+D|0,H=O+q+l(K,N)|0;H=(H=H+L+l(K=K+F|0,F)|0)+U+l(K=K+z|0,z)|0,b[C]=H,b[C+1]=K}for(var V=0;V<160;V+=2){H=b[V],K=b[V+1];var W=c(m,y,v),X=c(k,S,E),G=h(m,k),J=h(k,m),Z=d(w,j),$=d(j,w),Y=a[V],Q=a[V+1],tt=f(w,_,M),et=f(j,I,B),rt=T+$|0,nt=x+Z+l(rt,T)|0;nt=(nt=(nt=nt+tt+l(rt=rt+et|0,et)|0)+Y+l(rt=rt+Q|0,Q)|0)+H+l(rt=rt+K|0,K)|0;var it=J+X|0,ot=G+W+l(it,J)|0;x=M,T=B,M=_,B=I,_=w,I=j,w=g+nt+l(j=A+rt|0,A)|0,g=v,A=E,v=y,E=S,y=m,S=k,m=nt+ot+l(k=rt+it|0,rt)|0}this._al=this._al+k|0,this._bl=this._bl+S|0,this._cl=this._cl+E|0,this._dl=this._dl+A|0,this._el=this._el+j|0,this._fl=this._fl+I|0,this._gl=this._gl+B|0,this._hl=this._hl+T|0,this._ah=this._ah+m+l(this._al,k)|0,this._bh=this._bh+y+l(this._bl,S)|0,this._ch=this._ch+v+l(this._cl,E)|0,this._dh=this._dh+g+l(this._dl,A)|0,this._eh=this._eh+w+l(this._el,j)|0,this._fh=this._fh+_+l(this._fl,I)|0,this._gh=this._gh+M+l(this._gl,B)|0,this._hh=this._hh+x+l(this._hl,T)|0},u.prototype._hash=function(){var t=o.allocUnsafe(64);function e(e,r,n){t.writeInt32BE(e,n),t.writeInt32BE(r,n+4)}return e(this._ah,this._al,0),e(this._bh,this._bl,8),e(this._ch,this._cl,16),e(this._dh,this._dl,24),e(this._eh,this._el,32),e(this._fh,this._fl,40),e(this._gh,this._gl,48),e(this._hh,this._hl,56),t},e.exports=u},{"./hash":148,inherits:101,"safe-buffer":147}],156:[function(t,e,r){e.exports=i;var n=t("events").EventEmitter;function i(){n.call(this)}t("inherits")(i,n),i.Readable=t("readable-stream/readable.js"),i.Writable=t("readable-stream/writable.js"),i.Duplex=t("readable-stream/duplex.js"),i.Transform=t("readable-stream/transform.js"),i.PassThrough=t("readable-stream/passthrough.js"),i.Stream=i,i.prototype.pipe=function(t,e){var r=this;function i(e){t.writable&&!1===t.write(e)&&r.pause&&r.pause()}function o(){r.readable&&r.resume&&r.resume()}r.on("data",i),t.on("drain",o),t._isStdio||e&&!1===e.end||(r.on("end",s),r.on("close",u));var a=!1;function s(){a||(a=!0,t.end())}function u(){a||(a=!0,"function"==typeof t.destroy&&t.destroy())}function f(t){if(c(),0===n.listenerCount(this,"error"))throw t}function c(){r.removeListener("data",i),t.removeListener("drain",o),r.removeListener("end",s),r.removeListener("close",u),r.removeListener("error",f),t.removeListener("error",f),r.removeListener("end",c),r.removeListener("close",c),t.removeListener("close",c)}return r.on("error",f),t.on("error",f),r.on("end",c),r.on("close",c),t.on("close",c),t.emit("pipe",r),t}},{events:83,inherits:101,"readable-stream/duplex.js":133,"readable-stream/passthrough.js":142,"readable-stream/readable.js":143,"readable-stream/transform.js":144,"readable-stream/writable.js":145}],157:[function(t,e,r){var n=t("safe-buffer").Buffer,i=n.isEncoding||function(t){switch((t=""+t)&&t.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function o(t){var e;switch(this.encoding=function(t){var e=function(t){if(!t)return"utf8";for(var e;;)switch(t){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return t;default:if(e)return;t=(""+t).toLowerCase(),e=!0}}(t);if("string"!=typeof e&&(n.isEncoding===i||!i(t)))throw new Error("Unknown encoding: "+t);return e||t}(t),this.encoding){case"utf16le":this.text=u,this.end=f,e=4;break;case"utf8":this.fillLast=s,e=4;break;case"base64":this.text=c,this.end=h,e=3;break;default:return this.write=d,void(this.end=l)}this.lastNeed=0,this.lastTotal=0,this.lastChar=n.allocUnsafe(e)}function a(t){return t<=127?0:t>>5==6?2:t>>4==14?3:t>>3==30?4:-1}function s(t){var e=this.lastTotal-this.lastNeed,r=function(t,e,r){if(128!=(192&e[0]))return t.lastNeed=0,"�".repeat(r);if(t.lastNeed>1&&e.length>1){if(128!=(192&e[1]))return t.lastNeed=1,"�".repeat(r+1);if(t.lastNeed>2&&e.length>2&&128!=(192&e[2]))return t.lastNeed=2,"�".repeat(r+2)}}(this,t,e);return void 0!==r?r:this.lastNeed<=t.length?(t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(t.copy(this.lastChar,e,0,t.length),void(this.lastNeed-=t.length))}function u(t,e){if((t.length-e)%2==0){var r=t.toString("utf16le",e);if(r){var n=r.charCodeAt(r.length-1);if(n>=55296&&n<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString("utf16le",e,t.length-1)}function f(t){var e=t&&t.length?this.write(t):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,r)}return e}function c(t,e){var r=(t.length-e)%3;return 0===r?t.toString("base64",e):(this.lastNeed=3-r,this.lastTotal=3,1===r?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString("base64",e,t.length-r))}function h(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}function d(t){return t.toString(this.encoding)}function l(t){return t&&t.length?this.write(t):""}r.StringDecoder=o,o.prototype.write=function(t){if(0===t.length)return"";var e,r;if(this.lastNeed){if(void 0===(e=this.fillLast(t)))return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r=0)return i>0&&(t.lastNeed=i-1),i;if(--n=0)return i>0&&(t.lastNeed=i-2),i;if(--n=0)return i>0&&(2===i?i=0:t.lastNeed=i-3),i;return 0}(this,t,e);if(!this.lastNeed)return t.toString("utf8",e);this.lastTotal=r;var n=t.length-(r-this.lastNeed);return t.copy(this.lastChar,0,n),t.toString("utf8",e,n)},o.prototype.fillLast=function(t){if(this.lastNeed<=t.length)return t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,t.length),this.lastNeed-=t.length}},{"safe-buffer":147}],158:[function(t,e,r){var n=t("punycode"),i=t("./util");function o(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}r.parse=g,r.resolve=function(t,e){return g(t,!1,!0).resolve(e)},r.resolveObject=function(t,e){return t?g(t,!1,!0).resolveObject(e):e},r.format=function(t){i.isString(t)&&(t=g(t));return t instanceof o?t.format():o.prototype.format.call(t)},r.Url=o;var a=/^([a-z0-9.+-]+:)/i,s=/:[0-9]*$/,u=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,f=["{","}","|","\\","^","`"].concat(["<",">",'"',"`"," ","\r","\n","\t"]),c=["'"].concat(f),h=["%","/","?",";","#"].concat(c),d=["/","?","#"],l=/^[+a-z0-9A-Z_-]{0,63}$/,p=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,b={javascript:!0,"javascript:":!0},m={javascript:!0,"javascript:":!0},y={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},v=t("querystring");function g(t,e,r){if(t&&i.isObject(t)&&t instanceof o)return t;var n=new o;return n.parse(t,e,r),n}o.prototype.parse=function(t,e,r){if(!i.isString(t))throw new TypeError("Parameter 'url' must be a string, not "+(void 0===t?"undefined":_typeof(t)));var o=t.indexOf("?"),s=-1!==o&&o127?P+="x":P+=C[R];if(!P.match(l)){var N=B.slice(0,A),L=B.slice(A+1),F=C.match(p);F&&(N.push(F[1]),L.unshift(F[2])),L.length&&(g="/"+L.join(".")+g),this.hostname=N.join(".");break}}}this.hostname.length>255?this.hostname="":this.hostname=this.hostname.toLowerCase(),I||(this.hostname=n.toASCII(this.hostname));var q=this.port?":"+this.port:"",D=this.hostname||"";this.host=D+q,this.href+=this.host,I&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==g[0]&&(g="/"+g))}if(!b[M])for(A=0,T=c.length;A0)&&r.host.split("@"))&&(r.auth=I.shift(),r.host=r.hostname=I.shift());return r.search=t.search,r.query=t.query,i.isNull(r.pathname)&&i.isNull(r.search)||(r.path=(r.pathname?r.pathname:"")+(r.search?r.search:"")),r.href=r.format(),r}if(!x.length)return r.pathname=null,r.search?r.path="/"+r.search:r.path=null,r.href=r.format(),r;for(var S=x.slice(-1)[0],E=(r.host||t.host||x.length>1)&&("."===S||".."===S)||""===S,A=0,j=x.length;j>=0;j--)"."===(S=x[j])?x.splice(j,1):".."===S?(x.splice(j,1),A++):A&&(x.splice(j,1),A--);if(!_&&!M)for(;A--;A)x.unshift("..");!_||""===x[0]||x[0]&&"/"===x[0].charAt(0)||x.unshift(""),E&&"/"!==x.join("/").substr(-1)&&x.push("");var I,B=""===x[0]||x[0]&&"/"===x[0].charAt(0);k&&(r.hostname=r.host=B?"":x.length?x.shift():"",(I=!!(r.host&&r.host.indexOf("@")>0)&&r.host.split("@"))&&(r.auth=I.shift(),r.host=r.hostname=I.shift()));return(_=_||r.host&&x.length)&&!B&&x.unshift(""),x.length?r.pathname=x.join("/"):(r.pathname=null,r.path=null),i.isNull(r.pathname)&&i.isNull(r.search)||(r.path=(r.pathname?r.pathname:"")+(r.search?r.search:"")),r.auth=t.auth||r.auth,r.slashes=r.slashes||t.slashes,r.href=r.format(),r},o.prototype.parseHost=function(){var t=this.host,e=s.exec(t);e&&(":"!==(e=e[0])&&(this.port=e.substr(1)),t=t.substr(0,t.length-e.length)),t&&(this.hostname=t)}},{"./util":159,punycode:127,querystring:130}],159:[function(t,e,r){e.exports={isString:function(t){return"string"==typeof t},isObject:function(t){return"object"===(void 0===t?"undefined":_typeof(t))&&null!==t},isNull:function(t){return null===t},isNullOrUndefined:function(t){return null==t}}},{}],160:[function(t,e,r){(function(t){function r(e){try{if(!t.localStorage)return!1}catch(t){return!1}var r=t.localStorage[e];return null!=r&&"true"===String(r).toLowerCase()}e.exports=function(t,e){if(r("noDeprecation"))return t;var n=!1;return function(){if(!n){if(r("throwDeprecation"))throw new Error(e);r("traceDeprecation")?console.trace(e):console.warn(e),n=!0}return t.apply(this,arguments)}}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],161:[function(require,module,exports){var indexOf=require("indexof"),Object_keys=function(t){if(Object.keys)return Object.keys(t);var e=[];for(var r in t)e.push(r);return e},forEach=function(t,e){if(t.forEach)return t.forEach(e);for(var r=0;r>6|192);else{if(i>55295&&i<56320){if(++n==t.length)return null;var o=t.charCodeAt(n);if(o<56320||o>57343)return null;r+=e((i=65536+((1023&i)<<10)+(1023&o))>>18|240),r+=e(i>>12&63|128)}else r+=e(i>>12|224);r+=e(i>>6&63|128)}r+=e(63&i|128)}}return r},toString:function(t){for(var e="",r=0,o=i(t);r127){if(a>191&&a<224){if(r>=o)return null;a=(31&a)<<6|63&n(t,r)}else if(a>223&&a<240){if(r+1>=o)return null;a=(15&a)<<12|(63&n(t,r))<<6|63&n(t,++r)}else{if(!(a>239&&a<248))return null;if(r+2>=o)return null;a=(7&a)<<18|(63&n(t,r))<<12|(63&n(t,++r))<<6|63&n(t,++r)}++r}if(a<=65535)e+=String.fromCharCode(a);else{if(!(a<=1114111))return null;a-=65536,e+=String.fromCharCode(a>>10|55296),e+=String.fromCharCode(1023&a|56320)}}return e},fromNumber:function(t){var e=t.toString(16);return e.length%2==0?"0x"+e:"0x0"+e},toNumber:function(t){return parseInt(t.slice(2),16)},fromNat:function(t){return"0x0"===t?"0x":t.length%2==0?t:"0x0"+t.slice(2)},toNat:function(t){return"0"===t[2]?"0x"+t.slice(3):t},fromArray:a,toArray:o,fromUint8Array:function(t){return a([].slice.call(t,0))},toUint8Array:function(t){return new Uint8Array(o(t))}}},{"./array.js":163}],165:[function(t,e,r){var n="0123456789abcdef".split(""),i=[1,256,65536,16777216],o=[0,8,16,24],a=[1,0,32898,0,32906,2147483648,2147516416,2147483648,32907,0,2147483649,0,2147516545,2147483648,32777,2147483648,138,0,136,0,2147516425,0,2147483658,0,2147516555,0,139,2147483648,32905,2147483648,32771,2147483648,32770,2147483648,128,2147483648,32778,0,2147483658,2147483648,2147516545,2147483648,32896,2147483648,2147483649,0,2147516424,2147483648],s=function(t){var e,r,n,i,o,s,u,f,c,h,d,l,p,b,m,y,v,g,w,_,M,x,k,S,E,A,j,I,B,T,C,P,R,O,N,L,F,q,D,U,z,K,H,V,W,X,G,J,Z,$,Y,Q,tt,et,rt,nt,it,ot,at,st,ut,ft,ct;for(n=0;n<48;n+=2)i=t[0]^t[10]^t[20]^t[30]^t[40],o=t[1]^t[11]^t[21]^t[31]^t[41],s=t[2]^t[12]^t[22]^t[32]^t[42],u=t[3]^t[13]^t[23]^t[33]^t[43],f=t[4]^t[14]^t[24]^t[34]^t[44],c=t[5]^t[15]^t[25]^t[35]^t[45],h=t[6]^t[16]^t[26]^t[36]^t[46],d=t[7]^t[17]^t[27]^t[37]^t[47],e=(l=t[8]^t[18]^t[28]^t[38]^t[48])^(s<<1|u>>>31),r=(p=t[9]^t[19]^t[29]^t[39]^t[49])^(u<<1|s>>>31),t[0]^=e,t[1]^=r,t[10]^=e,t[11]^=r,t[20]^=e,t[21]^=r,t[30]^=e,t[31]^=r,t[40]^=e,t[41]^=r,e=i^(f<<1|c>>>31),r=o^(c<<1|f>>>31),t[2]^=e,t[3]^=r,t[12]^=e,t[13]^=r,t[22]^=e,t[23]^=r,t[32]^=e,t[33]^=r,t[42]^=e,t[43]^=r,e=s^(h<<1|d>>>31),r=u^(d<<1|h>>>31),t[4]^=e,t[5]^=r,t[14]^=e,t[15]^=r,t[24]^=e,t[25]^=r,t[34]^=e,t[35]^=r,t[44]^=e,t[45]^=r,e=f^(l<<1|p>>>31),r=c^(p<<1|l>>>31),t[6]^=e,t[7]^=r,t[16]^=e,t[17]^=r,t[26]^=e,t[27]^=r,t[36]^=e,t[37]^=r,t[46]^=e,t[47]^=r,e=h^(i<<1|o>>>31),r=d^(o<<1|i>>>31),t[8]^=e,t[9]^=r,t[18]^=e,t[19]^=r,t[28]^=e,t[29]^=r,t[38]^=e,t[39]^=r,t[48]^=e,t[49]^=r,b=t[0],m=t[1],X=t[11]<<4|t[10]>>>28,G=t[10]<<4|t[11]>>>28,I=t[20]<<3|t[21]>>>29,B=t[21]<<3|t[20]>>>29,st=t[31]<<9|t[30]>>>23,ut=t[30]<<9|t[31]>>>23,K=t[40]<<18|t[41]>>>14,H=t[41]<<18|t[40]>>>14,O=t[2]<<1|t[3]>>>31,N=t[3]<<1|t[2]>>>31,y=t[13]<<12|t[12]>>>20,v=t[12]<<12|t[13]>>>20,J=t[22]<<10|t[23]>>>22,Z=t[23]<<10|t[22]>>>22,T=t[33]<<13|t[32]>>>19,C=t[32]<<13|t[33]>>>19,ft=t[42]<<2|t[43]>>>30,ct=t[43]<<2|t[42]>>>30,et=t[5]<<30|t[4]>>>2,rt=t[4]<<30|t[5]>>>2,L=t[14]<<6|t[15]>>>26,F=t[15]<<6|t[14]>>>26,g=t[25]<<11|t[24]>>>21,w=t[24]<<11|t[25]>>>21,$=t[34]<<15|t[35]>>>17,Y=t[35]<<15|t[34]>>>17,P=t[45]<<29|t[44]>>>3,R=t[44]<<29|t[45]>>>3,S=t[6]<<28|t[7]>>>4,E=t[7]<<28|t[6]>>>4,nt=t[17]<<23|t[16]>>>9,it=t[16]<<23|t[17]>>>9,q=t[26]<<25|t[27]>>>7,D=t[27]<<25|t[26]>>>7,_=t[36]<<21|t[37]>>>11,M=t[37]<<21|t[36]>>>11,Q=t[47]<<24|t[46]>>>8,tt=t[46]<<24|t[47]>>>8,V=t[8]<<27|t[9]>>>5,W=t[9]<<27|t[8]>>>5,A=t[18]<<20|t[19]>>>12,j=t[19]<<20|t[18]>>>12,ot=t[29]<<7|t[28]>>>25,at=t[28]<<7|t[29]>>>25,U=t[38]<<8|t[39]>>>24,z=t[39]<<8|t[38]>>>24,x=t[48]<<14|t[49]>>>18,k=t[49]<<14|t[48]>>>18,t[0]=b^~y&g,t[1]=m^~v&w,t[10]=S^~A&I,t[11]=E^~j&B,t[20]=O^~L&q,t[21]=N^~F&D,t[30]=V^~X&J,t[31]=W^~G&Z,t[40]=et^~nt&ot,t[41]=rt^~it&at,t[2]=y^~g&_,t[3]=v^~w&M,t[12]=A^~I&T,t[13]=j^~B&C,t[22]=L^~q&U,t[23]=F^~D&z,t[32]=X^~J&$,t[33]=G^~Z&Y,t[42]=nt^~ot&st,t[43]=it^~at&ut,t[4]=g^~_&x,t[5]=w^~M&k,t[14]=I^~T&P,t[15]=B^~C&R,t[24]=q^~U&K,t[25]=D^~z&H,t[34]=J^~$&Q,t[35]=Z^~Y&tt,t[44]=ot^~st&ft,t[45]=at^~ut&ct,t[6]=_^~x&b,t[7]=M^~k&m,t[16]=T^~P&S,t[17]=C^~R&E,t[26]=U^~K&O,t[27]=z^~H&N,t[36]=$^~Q&V,t[37]=Y^~tt&W,t[46]=st^~ft&et,t[47]=ut^~ct&rt,t[8]=x^~b&y,t[9]=k^~m&v,t[18]=P^~S&A,t[19]=R^~E&j,t[28]=K^~O&L,t[29]=H^~N&F,t[38]=Q^~V&X,t[39]=tt^~W&G,t[48]=ft^~et&nt,t[49]=ct^~rt&it,t[0]^=a[n],t[1]^=a[n+1]},u=function(t){return function(e){var r,a,u;if("0x"===e.slice(0,2)){r=[];for(var f=2,c=e.length;f>2]|=e[l]<>2]|=r<>2]|=(192|r>>6)<>2]|=(128|63&r)<=57344?(u[m>>2]|=(224|r>>12)<>2]|=(128|r>>6&63)<>2]|=(128|63&r)<>2]|=(240|r>>18)<>2]|=(128|r>>12&63)<>2]|=(128|r>>6&63)<>2]|=(128|63&r)<=f){for(t.start=m-f,t.block=u[c],m=0;m>2]|=i[3&m],t.lastByteIndex===f)for(u[0]=u[c],m=1;m>4&15]+n[15&p]+n[p>>12&15]+n[p>>8&15]+n[p>>20&15]+n[p>>16&15]+n[p>>28&15]+n[p>>24&15];y%c==0&&(s(d),m=0)}return"0x"+b}({blocks:[],reset:!0,block:0,start:0,blockCount:1600-((a=t)<<1)>>5,outputBlocks:a>>5,s:(u=[0,0,0,0,0,0,0,0,0,0],[].concat(u,u,u,u,u))},r)}};e.exports={keccak256:u(256),keccak512:u(512),keccak256s:u(256),keccak512s:u(512)}},{}],166:[function(t,e,r){var n=t("is-function");e.exports=function(t,e,r){if(!n(e))throw new TypeError("iterator must be a function");arguments.length<3&&(r=this);"[object Array]"===i.call(t)?function(t,e,r){for(var n=0,i=t.length;n0){var a=i.join(r,o);n.push(g(t)(e[o])(a))}return Promise.all(n).then(function(){return r})})}}},_=function(t){return function(e){return u(t+"/bzzr:/",{body:"string"==typeof e?L(e):e,method:"POST"})}},M=function(t){return function(e){return function(r){return function(n){return function i(o){var a="/"===r[0]?r:"/"+r,s=t+"/bzz:/"+e+a,f={method:"PUT",headers:{"Content-Type":n.type},body:n.data};return u(s,f).then(function(t){if(-1!==t.indexOf("error"))throw t;return t}).catch(function(t){return o>0&&i(o-1)})}(3)}}}},x=function(t){return function(e){return S(t)({"":e})}},k=function(t){return function(r){return e.readFile(r).then(function(e){return x(t)({type:a.lookup(r),data:e})})}},S=function(t){return function(e){return _(t)("{}").then(function(r){return Object.keys(e).reduce(function(r,n){return r.then((i=n,function(r){return M(t)(r)(i)(e[i])}));var i},Promise.resolve(r))})}},E=function(t){return function(r){return e.readFile(r).then(_(t))}},A=function(t){return function(n){return function(i){return r.directoryTree(i).then(function(t){return Promise.all(t.map(function(t){return e.readFile(t)})).then(function(e){var r=t.map(function(t){return t.slice(i.length)}),n=t.map(function(t){return a.lookup(t)||"text/plain"});return l(r)(e.map(function(t,e){return{type:n[e],data:t}}))})}).then(function(t){return(e=n?{"":t[n]}:{},function(t){var r={};for(var n in e)r[n]=e[n];for(var i in t)r[i]=t[i];return r})(t);var e}).then(S(t))}}},j=function(t){return function(e){if("data"===e.pick)return d.data().then(_(t));if("file"===e.pick)return d.file().then(x(t));if("directory"===e.pick)return d.directory().then(S(t));if(e.path)switch(e.kind){case"data":return E(t)(e.path);case"file":return k(t)(e.path);case"directory":return A(t)(e.defaultFile)(e.path)}else{if(e.length||"string"==typeof e)return _(t)(e);if(e instanceof Object)return S(t)(e)}return Promise.reject(new Error("Bad arguments"))}},I=function(t){return function(e){return function(r){return R(t)(e).then(function(n){return n?r?w(t)(e)(r):v(t)(e):r?g(t)(e)(r):b(t)(e)})}}},B=function(t,e){var i=n.platform().replace("win32","windows")+"-"+("x64"===n.arch()?"amd64":"386"),o=(e||s)[i],a=f+o.archive+".tar.gz",u=o.archiveMD5,c=o.binaryMD5;return r.safeDownloadArchived(a)(u)(c)(t)},T=function(t){return new Promise(function(e,r){var n=o.spawn,i=function(t){return function(e){return-1!==(""+e).indexOf(t)}},a=t.account,s=t.password,u=t.dataDir,f=t.ensApi,c=t.privateKey,h=0,d=n(t.binPath,["--bzzaccount",a||c,"--datadir",u,"--ens-api",f]),l=function(t){0===h&&i("Passphrase")(t)?setTimeout(function(){h=1,d.stdin.write(s+"\n")},500):i("Swarm http proxy started")(t)&&(h=2,clearTimeout(p),e(d))};d.stdout.on("data",l),d.stderr.on("data",l);var p=setTimeout(function(){return r(new Error("Couldn't start swarm process."))},2e4)})},C=function(t){return new Promise(function(e,r){t.stderr.removeAllListeners("data"),t.stdout.removeAllListeners("data"),t.stdin.removeAllListeners("error"),t.removeAllListeners("error"),t.removeAllListeners("exit"),t.kill("SIGINT");var n=setTimeout(function(){return t.kill("SIGKILL")},8e3);t.once("close",function(){clearTimeout(n),e()})})},P=function(t){return _(t)("test").then(function(t){return"c9a99c7d326dcc6316f32fe2625b311f6dc49a175e6877681ded93137d3569e7"===t}).catch(function(){return!1})},R=function(t){return function(e){return b(t)(e).then(function(t){try{return!!JSON.parse(N(t)).entries}catch(t){return!1}})}},O=function(t){return function(e,r,n,i,o){var a;return void 0!==e&&(a=t(e)),void 0!==r&&(a=t(r)),void 0!==n&&(a=t(n)),void 0!==i&&(a=t(i)),void 0!==o&&(a=t(o)),a}},N=function(t){return c.toString(c.fromUint8Array(t))},L=function(t){return c.toUint8Array(c.fromString(t))},F=function(t){return{download:function(e,r){return I(t)(e)(r)},downloadData:O(b(t)),downloadDataToDisk:O(g(t)),downloadDirectory:O(v(t)),downloadDirectoryToDisk:O(w(t)),downloadEntries:O(m(t)),downloadRoutes:O(y(t)),isAvailable:function(){return P(t)},upload:function(e){return j(t)(e)},uploadData:O(_(t)),uploadFile:O(x(t)),uploadFileFromDisk:O(x(t)),uploadDataFromDisk:O(E(t)),uploadDirectory:O(S(t)),uploadDirectoryFromDisk:O(A(t)),uploadToManifest:O(M(t)),pick:d,hash:h,fromString:L,toString:N}};return{at:F,local:function(t){return function(e){return P("http://localhost:8500").then(function(r){return r?e(F("http://localhost:8500")).then(function(){}):B(t.binPath,t.archives).onData(function(e){return(t.onProgress||function(){})(e.length)}).then(function(){return T(t)}).then(function(t){return e(F("http://localhost:8500")).then(function(){return t})}).then(C)})}},download:I,downloadBinary:B,downloadData:b,downloadDataToDisk:g,downloadDirectory:v,downloadDirectoryToDisk:w,downloadEntries:m,downloadRoutes:y,isAvailable:P,startProcess:T,stopProcess:C,upload:j,uploadData:_,uploadDataFromDisk:E,uploadFile:x,uploadFileFromDisk:k,uploadDirectory:S,uploadDirectoryFromDisk:A,uploadToManifest:M,pick:d,hash:h,fromString:L,toString:N}}},{}],177:[function(t,e,r){(r=e.exports=function(t){return t.replace(/^\s*|\s*$/g,"")}).left=function(t){return t.replace(/^\s*/,"")},r.right=function(t){return t.replace(/\s*$/,"")}},{}],178:[function(t,e,r){(function(){var t=this,n=t._,i=Array.prototype,o=Object.prototype,a=Function.prototype,s=i.push,u=i.slice,f=o.toString,c=o.hasOwnProperty,h=Array.isArray,d=Object.keys,l=a.bind,p=Object.create,b=function(){},m=function t(e){return e instanceof t?e:this instanceof t?void(this._wrapped=e):new t(e)};void 0!==r?(void 0!==e&&e.exports&&(r=e.exports=m),r._=m):t._=m,m.VERSION="1.8.3";var y=function(t,e,r){if(void 0===e)return t;switch(null==r?3:r){case 1:return function(r){return t.call(e,r)};case 2:return function(r,n){return t.call(e,r,n)};case 3:return function(r,n,i){return t.call(e,r,n,i)};case 4:return function(r,n,i,o){return t.call(e,r,n,i,o)}}return function(){return t.apply(e,arguments)}},v=function(t,e,r){return null==t?m.identity:m.isFunction(t)?y(t,e,r):m.isObject(t)?m.matcher(t):m.property(t)};m.iteratee=function(t,e){return v(t,e,1/0)};var g=function(t,e){return function(r){var n=arguments.length;if(n<2||null==r)return r;for(var i=1;i=0&&e<=M};function S(t){return function(e,r,n,i){r=y(r,i,4);var o=!k(e)&&m.keys(e),a=(o||e).length,s=t>0?0:a-1;return arguments.length<3&&(n=e[o?o[s]:s],s+=t),function(e,r,n,i,o,a){for(;o>=0&&o=0},m.invoke=function(t,e){var r=u.call(arguments,2),n=m.isFunction(e);return m.map(t,function(t){var i=n?e:t[e];return null==i?i:i.apply(t,r)})},m.pluck=function(t,e){return m.map(t,m.property(e))},m.where=function(t,e){return m.filter(t,m.matcher(e))},m.findWhere=function(t,e){return m.find(t,m.matcher(e))},m.max=function(t,e,r){var n,i,o=-1/0,a=-1/0;if(null==e&&null!=t)for(var s=0,u=(t=k(t)?t:m.values(t)).length;so&&(o=n);else e=v(e,r),m.each(t,function(t,r,n){((i=e(t,r,n))>a||i===-1/0&&o===-1/0)&&(o=t,a=i)});return o},m.min=function(t,e,r){var n,i,o=1/0,a=1/0;if(null==e&&null!=t)for(var s=0,u=(t=k(t)?t:m.values(t)).length;sn||void 0===r)return 1;if(r0?0:i-1;o>=0&&o0?a=o>=0?o:Math.max(o+s,a):s=o>=0?Math.min(o+1,s):o+s+1;else if(r&&o&&s)return n[o=r(n,i)]===i?o:-1;if(i!=i)return(o=e(u.call(n,a,s),m.isNaN))>=0?o+a:-1;for(o=t>0?a:s-1;o>=0&&oe?(a&&(clearTimeout(a),a=null),s=f,o=t.apply(n,i),a||(n=i=null)):a||!1===r.trailing||(a=setTimeout(u,c)),o}},m.debounce=function(t,e,r){var n,i,o,a,s,u=function u(){var f=m.now()-a;f=0?n=setTimeout(u,e-f):(n=null,r||(s=t.apply(o,i),n||(o=i=null)))};return function(){o=this,i=arguments,a=m.now();var f=r&&!n;return n||(n=setTimeout(u,e)),f&&(s=t.apply(o,i),o=i=null),s}},m.wrap=function(t,e){return m.partial(e,t)},m.negate=function(t){return function(){return!t.apply(this,arguments)}},m.compose=function(){var t=arguments,e=t.length-1;return function(){for(var r=e,n=t[e].apply(this,arguments);r--;)n=t[r].call(this,n);return n}},m.after=function(t,e){return function(){if(--t<1)return e.apply(this,arguments)}},m.before=function(t,e){var r;return function(){return--t>0&&(r=e.apply(this,arguments)),t<=1&&(e=null),r}},m.once=m.partial(m.before,2);var T=!{toString:null}.propertyIsEnumerable("toString"),C=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"];function P(t,e){var r=C.length,n=t.constructor,i=m.isFunction(n)&&n.prototype||o,a="constructor";for(m.has(t,a)&&!m.contains(e,a)&&e.push(a);r--;)(a=C[r])in t&&t[a]!==i[a]&&!m.contains(e,a)&&e.push(a)}m.keys=function(t){if(!m.isObject(t))return[];if(d)return d(t);var e=[];for(var r in t)m.has(t,r)&&e.push(r);return T&&P(t,e),e},m.allKeys=function(t){if(!m.isObject(t))return[];var e=[];for(var r in t)e.push(r);return T&&P(t,e),e},m.values=function(t){for(var e=m.keys(t),r=e.length,n=Array(r),i=0;i":">",'"':""","'":"'","`":"`"},O=m.invert(R),N=function(t){var e=function(e){return t[e]},r="(?:"+m.keys(t).join("|")+")",n=RegExp(r),i=RegExp(r,"g");return function(t){return t=null==t?"":""+t,n.test(t)?t.replace(i,e):t}};m.escape=N(R),m.unescape=N(O),m.result=function(t,e,r){var n=null==t?void 0:t[e];return void 0===n&&(n=r),m.isFunction(n)?n.call(t):n};var L=0;m.uniqueId=function(t){var e=++L+"";return t?t+e:e},m.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var F=/(.)^/,q={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\u2028|\u2029/g,U=function(t){return"\\"+q[t]};m.template=function(t,e,r){!e&&r&&(e=r),e=m.defaults({},e,m.templateSettings);var n=RegExp([(e.escape||F).source,(e.interpolate||F).source,(e.evaluate||F).source].join("|")+"|$","g"),i=0,o="__p+='";t.replace(n,function(e,r,n,a,s){return o+=t.slice(i,s).replace(D,U),i=s+e.length,r?o+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":n?o+="'+\n((__t=("+n+"))==null?'':__t)+\n'":a&&(o+="';\n"+a+"\n__p+='"),e}),o+="';\n",e.variable||(o="with(obj||{}){\n"+o+"}\n"),o="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+o+"return __p;\n";try{var a=new Function(e.variable||"obj","_",o)}catch(t){throw t.source=o,t}var s=function(t){return a.call(this,t,m)},u=e.variable||"obj";return s.source="function("+u+"){\n"+o+"}",s},m.chain=function(t){var e=m(t);return e._chain=!0,e};var z=function(t,e){return t._chain?m(e).chain():e};m.mixin=function(t){m.each(m.functions(t),function(e){var r=m[e]=t[e];m.prototype[e]=function(){var t=[this._wrapped];return s.apply(t,arguments),z(this,r.apply(m,t))}})},m.mixin(m),m.each(["pop","push","reverse","shift","sort","splice","unshift"],function(t){var e=i[t];m.prototype[t]=function(){var r=this._wrapped;return e.apply(r,arguments),"shift"!==t&&"splice"!==t||0!==r.length||delete r[0],z(this,r)}}),m.each(["concat","join","slice"],function(t){var e=i[t];m.prototype[t]=function(){return z(this,e.apply(this._wrapped,arguments))}}),m.prototype.value=function(){return this._wrapped},m.prototype.valueOf=m.prototype.toJSON=m.prototype.value,m.prototype.toString=function(){return""+this._wrapped},"function"==typeof define&&define.amd&&define("underscore",[],function(){return m})}).call(this)},{}],179:[function(t,e,r){e.exports=function(t,e){if(e){e=(e=e.trim().replace(/^(\?|#|&)/,""))?"?"+e:e;var r=t.split(/[\?\#]/),n=r[0];e&&/\:\/\/[^\/]*$/.test(n)&&(n+="/");var i=t.match(/(\#.*)$/);t=n+e,i&&(t+=i[0])}return t}},{}],180:[function(t,e,r){var n=t("xhr-request");e.exports=function(t,e){return new Promise(function(r,i){n(t,e,function(t,e){t?i(t):r(e)})})}},{"xhr-request":181}],181:[function(t,e,r){var n=t("query-string"),i=t("url-set-query"),o=t("object-assign"),a=t("./lib/ensure-header.js"),s=t("./lib/request.js"),u="application/json",f=function(){};e.exports=function(t,e,r){if(!t||"string"!=typeof t)throw new TypeError("must specify a URL");"function"==typeof e&&(r=e,e={});if(r&&"function"!=typeof r)throw new TypeError("expected cb to be undefined or a function");r=r||f;var c=(e=e||{}).json?"json":"text",h=(e=o({responseType:c},e)).headers||{},d=(e.method||"GET").toUpperCase(),l=e.query;l&&("string"!=typeof l&&(l=n.stringify(l)),t=i(t,l));"json"===e.responseType&&a(h,"Accept",u);e.json&&"GET"!==d&&"HEAD"!==d&&(a(h,"Content-Type",u),e.body=JSON.stringify(e.body));return e.method=d,e.url=t,e.headers=h,delete e.query,delete e.json,s(e,r)}},{"./lib/ensure-header.js":182,"./lib/request.js":184,"object-assign":169,"query-string":171,"url-set-query":179}],182:[function(t,e,r){e.exports=function(t,e,r){var n=e.toLowerCase();t[e]||t[n]||(t[e]=r)}},{}],183:[function(t,e,r){e.exports=function(t,e){return e?{statusCode:e.statusCode,headers:e.headers,method:t.method,url:t.url,rawRequest:e.rawRequest?e.rawRequest:e}:null}},{}],184:[function(t,e,r){var n=t("xhr"),i=t("./normalize-response"),o=function(){};e.exports=function(t,e){delete t.uri;var r=!1;"json"===t.responseType&&(t.responseType="text",r=!0);var a=n(t,function(n,a,s){if(r&&!n)try{var u=a.rawRequest.responseText;s=JSON.parse(u)}catch(t){n=t}a=i(t,a),e(n,n?null:s,a),e=o}),s=a.onabort;return a.onabort=function(){var t=s.apply(a,Array.prototype.slice.call(arguments));return e(new Error("XHR Aborted")),e=o,t},a}},{"./normalize-response":183,xhr:185}],185:[function(t,e,r){var n=t("global/window"),i=t("is-function"),o=t("parse-headers"),a=t("xtend");function s(t,e,r){var n=t;return i(e)?(r=e,"string"==typeof t&&(n={uri:t})):n=a(e,{uri:t}),n.callback=r,n}function u(t,e,r){return f(e=s(t,e,r))}function f(t){if(void 0===t.callback)throw new Error("callback argument missing");var e=!1,r=function(r,n,i){e||(e=!0,t.callback(r,n,i))};function n(t){return clearTimeout(c),t instanceof Error||(t=new Error(""+(t||"Unknown XMLHttpRequest Error"))),t.statusCode=0,r(t,y)}function i(){if(!s){var e;clearTimeout(c),e=t.useXDR&&void 0===f.status?200:1223===f.status?204:f.status;var n=y,i=null;return 0!==e?(n={body:function(){var t=void 0;if(t=f.response?f.response:f.responseText||function(t){try{if("document"===t.responseType)return t.responseXML;var e=t.responseXML&&"parsererror"===t.responseXML.documentElement.nodeName;if(""===t.responseType&&!e)return t.responseXML}catch(t){}return null}(f),m)try{t=JSON.parse(t)}catch(t){}return t}(),statusCode:e,method:d,headers:{},url:h,rawRequest:f},f.getAllResponseHeaders&&(n.headers=o(f.getAllResponseHeaders()))):i=new Error("Internal XMLHttpRequest Error"),r(i,n,n.body)}}var a,s,f=t.xhr||null;f||(f=t.cors||t.useXDR?new u.XDomainRequest:new u.XMLHttpRequest);var c,h=f.url=t.uri||t.url,d=f.method=t.method||"GET",l=t.body||t.data,p=f.headers=t.headers||{},b=!!t.sync,m=!1,y={body:void 0,headers:{},statusCode:0,method:d,url:h,rawRequest:f};if("json"in t&&!1!==t.json&&(m=!0,p.accept||p.Accept||(p.Accept="application/json"),"GET"!==d&&"HEAD"!==d&&(p["content-type"]||p["Content-Type"]||(p["Content-Type"]="application/json"),l=JSON.stringify(!0===t.json?l:t.json))),f.onreadystatechange=function(){4===f.readyState&&setTimeout(i,0)},f.onload=i,f.onerror=n,f.onprogress=function(){},f.onabort=function(){s=!0},f.ontimeout=n,f.open(d,h,!b,t.username,t.password),b||(f.withCredentials=!!t.withCredentials),!b&&t.timeout>0&&(c=setTimeout(function(){if(!s){s=!0,f.abort("timeout");var t=new Error("XMLHttpRequest timeout");t.code="ETIMEDOUT",n(t)}},t.timeout)),f.setRequestHeader)for(a in p)p.hasOwnProperty(a)&&f.setRequestHeader(a,p[a]);else if(t.headers&&!function(t){for(var e in t)if(t.hasOwnProperty(e))return!1;return!0}(t.headers))throw new Error("Headers cannot be set on an XDomainRequest object");return"responseType"in t&&(f.responseType=t.responseType),"beforeSend"in t&&"function"==typeof t.beforeSend&&t.beforeSend(f),f.send(l||null),f}e.exports=u,u.XMLHttpRequest=n.XMLHttpRequest||function(){},u.XDomainRequest="withCredentials"in new u.XMLHttpRequest?u.XMLHttpRequest:n.XDomainRequest,function(t,e){for(var r=0;r1?(t[r[0]]=t[r[0]]||{},t[r[0]][r[1]]=e):t[r[0]]=e},f.prototype.getCall=function(t){return n.isFunction(this.call)?this.call(t):this.call},f.prototype.extractCallback=function(t){if(n.isFunction(t[t.length-1]))return t.pop()},f.prototype.validateArgs=function(t){if(t.length!==this.params)throw i.InvalidNumberOfParams(t.length,this.params,this.name)},f.prototype.formatInput=function(t){var e=this;return this.inputFormatter?this.inputFormatter.map(function(r,n){return r?r.call(e,t[n]):t[n]}):t},f.prototype.formatOutput=function(t){var e=this;return n.isArray(t)?t.map(function(t){return e.outputFormatter&&t?e.outputFormatter(t):t}):this.outputFormatter&&t?this.outputFormatter(t):t},f.prototype.toPayload=function(t){var e=this.getCall(t),r=this.extractCallback(t),n=this.formatInput(t);this.validateArgs(n);var i={method:e,params:n,callback:r};return this.transformPayload&&(i=this.transformPayload(i)),i},f.prototype._confirmTransaction=function(t,e,r){var i=this,c=!1,h=!0,d=0,l=0,p=null,b=n.isObject(r.params[0])&&r.params[0].gas?r.params[0].gas:null,m=n.isObject(r.params[0])&&r.params[0].data&&r.params[0].from&&!r.params[0].to,y=[new f({name:"getTransactionReceipt",call:"eth_getTransactionReceipt",params:1,inputFormatter:[null],outputFormatter:o.outputTransactionReceiptFormatter}),new f({name:"getCode",call:"eth_getCode",params:2,inputFormatter:[o.inputAddressFormatter,o.inputDefaultBlockNumberFormatter]}),new u({name:"subscribe",type:"eth",subscriptions:{newBlockHeaders:{subscriptionName:"newHeads",params:0,outputFormatter:o.outputBlockFormatter}}})],v={};n.each(y,function(t){t.attachToObject(v),t.requestManager=i.requestManager});var g=function(r,n,o,u,f){if(!o)return f||(f={unsubscribe:function(){clearInterval(p)}}),(r?s.resolve(r):v.getTransactionReceipt(e)).catch(function(e){f.unsubscribe(),c=!0,a._fireError({message:"Failed to check for transaction receipt:",data:e},t.eventEmitter,t.reject)}).then(function(e){if(!e||!e.blockHash)throw new Error("Receipt missing or blockHash null");return i.extraFormatters&&i.extraFormatters.receiptFormatter&&(e=i.extraFormatters.receiptFormatter(e)),t.eventEmitter.listeners("confirmation").length>0&&(void 0!==r&&0===l||t.eventEmitter.emit("confirmation",l,e),h=!1,25===++l&&(f.unsubscribe(),t.eventEmitter.removeAllListeners())),e}).then(function(e){if(m&&!c){if(!e.contractAddress)return h&&(f.unsubscribe(),c=!0),void a._fireError(new Error("The transaction receipt didn't contain a contract address."),t.eventEmitter,t.reject);v.getCode(e.contractAddress,function(r,n){n&&(n.length>2?(t.eventEmitter.emit("receipt",e),i.extraFormatters&&i.extraFormatters.contractDeployFormatter?t.resolve(i.extraFormatters.contractDeployFormatter(e)):t.resolve(e),h&&t.eventEmitter.removeAllListeners()):a._fireError(new Error("The contract code couldn't be stored, please check your gas limit."),t.eventEmitter,t.reject),h&&f.unsubscribe(),c=!0)})}return e}).then(function(e){m||c||(e.outOfGas||b&&b===e.gasUsed||!0!==e.status&&"0x1"!==e.status&&void 0!==e.status?(e&&(e=JSON.stringify(e,null,2)),!1===e.status||"0x0"===e.status?a._fireError(new Error("Transaction has been reverted by the EVM:\n"+e),t.eventEmitter,t.reject):a._fireError(new Error("Transaction ran out of gas. Please provide more gas:\n"+e),t.eventEmitter,t.reject)):(t.eventEmitter.emit("receipt",e),t.resolve(e),h&&t.eventEmitter.removeAllListeners()),h&&f.unsubscribe(),c=!0)}).catch(function(){d++,n?d-1>=750&&(f.unsubscribe(),c=!0,a._fireError(new Error("Transaction was not mined within750 seconds, please make sure your transaction was properly sent. Be aware that it might still be mined!"),t.eventEmitter,t.reject)):d-1>=50&&(f.unsubscribe(),c=!0,a._fireError(new Error("Transaction was not mined within 50 blocks, please make sure your transaction was properly sent. Be aware that it might still be mined!"),t.eventEmitter,t.reject))});f.unsubscribe(),c=!0,a._fireError({message:"Failed to subscribe to new newBlockHeaders to confirm the transaction receipts.",data:o},t.eventEmitter,t.reject)},w=function(t){n.isFunction(this.requestManager.provider.on)?v.subscribe("newBlockHeaders",g.bind(null,t,!1)):p=setInterval(g.bind(null,t,!0),1e3)}.bind(this);v.getTransactionReceipt(e).then(function(e){e&&e.blockHash?(t.eventEmitter.listeners("confirmation").length>0&&w(e),g(e,!1)):c||w()}).catch(function(){c||w()})};var c=function(t,e){return n.isNumber(t)?e.wallet[t]:n.isObject(t)&&t.address&&t.privateKey?t:e.wallet[t.toLowerCase()]};f.prototype.buildCall=function(){var t=this,e="eth_sendTransaction"===t.call||"eth_sendRawTransaction"===t.call,r=function(){var r=s(!e),i=t.toPayload(Array.prototype.slice.call(arguments)),o=function(n,o){try{o=t.formatOutput(o)}catch(t){n=t}if(o instanceof Error&&(n=o),n)return n.error&&(n=n.error),a._fireError(n,r.eventEmitter,r.reject,i.callback);i.callback&&i.callback(null,o),e?(r.eventEmitter.emit("transactionHash",o),t._confirmTransaction(r,o,i)):n||r.resolve(o)},u=function(e){var r=n.extend({},i,{method:"eth_sendRawTransaction",params:[e.rawTransaction]});t.requestManager.send(r,o)},h=function(t,e){var i;if(e&&e.accounts&&e.accounts.wallet&&e.accounts.wallet.length)if("eth_sendTransaction"===t.method){var a=t.params[0];if((i=c(n.isObject(a)?a.from:null,e.accounts))&&i.privateKey)return e.accounts.signTransaction(n.omit(a,"from"),i.privateKey).then(u)}else if("eth_sign"===t.method){var s=t.params[1];if((i=c(t.params[0],e.accounts))&&i.privateKey){var f=e.accounts.sign(s,i.privateKey);return t.callback&&t.callback(null,f.signature),void r.resolve(f.signature)}}return e.requestManager.send(t,o)};e&&n.isObject(i.params[0])&&!i.params[0].gasPrice?new f({name:"getGasPrice",call:"eth_gasPrice",params:0}).createFunction(t.requestManager)(function(e,r){r&&(i.params[0].gasPrice=r),h(i,t)}):h(i,t);return r.eventEmitter};return r.method=t,r.request=this.request.bind(this),r},f.prototype.request=function(){var t=this.toPayload(Array.prototype.slice.call(arguments));return t.format=this.formatOutput.bind(this),t},e.exports=f},{underscore:192,"web3-core-helpers":191,"web3-core-promievent":198,"web3-core-subscriptions":206,"web3-utils":393}],194:[function(t,e,r){e.exports=t("./register")().Promise},{"./register":196}],195:[function(t,e,r){var n="@@any-promise/REGISTRATION",i=null;e.exports=function(t,e){return function(r,o){r=r||null;var a=!1!==(o=o||{}).global;if(null===i&&a&&(i=t[n]||null),null!==i&&null!==r&&i.implementation!==r)throw new Error('any-promise already defined as "'+i.implementation+'". You can only register an implementation before the first call to require("any-promise") and an implementation cannot be changed');return null===i&&(i=null!==r&&void 0!==o.Promise?{Promise:o.Promise,implementation:r}:e(r),a&&(t[n]=i)),i}}},{}],196:[function(t,e,r){e.exports=t("./loader")(window,function(){if(void 0===window.Promise)throw new Error("any-promise browser requires a polyfill or explicit registration e.g: require('any-promise/register/bluebird')");return{Promise:window.Promise,implementation:"window.Promise"}})},{"./loader":195}],197:[function(t,e,r){var n="function"!=typeof Object.create&&"~";function i(t,e,r){this.fn=t,this.context=e,this.once=r||!1}function o(){}o.prototype._events=void 0,o.prototype.listeners=function(t,e){var r=n?n+t:t,i=this._events&&this._events[r];if(e)return!!i;if(!i)return[];if(i.fn)return[i.fn];for(var o=0,a=i.length,s=new Array(a);o1?(t[r[0]]=t[r[0]]||{},t[r[0]][r[1]]=e):t[r[0]]=e},i.prototype.buildCall=function(){var t=this;return function(){t.subscriptions[arguments[0]]||console.warn("Subscription "+JSON.stringify(arguments[0])+" doesn't exist. Subscribing anyway.");var e=new n({subscription:t.subscriptions[arguments[0]],requestManager:t.requestManager,type:t.type});return e.subscribe.apply(e,arguments)}},e.exports={subscriptions:i,subscription:n}},{"./subscription.js":207}],207:[function(t,e,r){var n=t("underscore"),i=t("web3-core-helpers").errors,o=t("eventemitter3");function a(t){o.call(this),this.id=null,this.callback=null,this.arguments=null,this._reconnectIntervalId=null,this.options={subscription:t.subscription,type:t.type,requestManager:t.requestManager}}a.prototype=Object.create(o.prototype),a.prototype.constructor=a,a.prototype._extractCallback=function(t){if(n.isFunction(t[t.length-1]))return t.pop()},a.prototype._validateArgs=function(t){var e=this.options.subscription;if(e||(e={}),e.params||(e.params=0),t.length!==e.params)throw i.InvalidNumberOfParams(t.length,e.params+1,t[0])},a.prototype._formatInput=function(t){var e=this.options.subscription;return e&&e.inputFormatter?e.inputFormatter.map(function(e,r){return e?e(t[r]):t[r]}):t},a.prototype._formatOutput=function(t){var e=this.options.subscription;return e&&e.outputFormatter&&t?e.outputFormatter(t):t},a.prototype._toPayload=function(t){var e=[];if(this.callback=this._extractCallback(t),this.subscriptionMethod||(this.subscriptionMethod=t.shift(),this.options.subscription.subscriptionName&&(this.subscriptionMethod=this.options.subscription.subscriptionName)),this.arguments||(this.arguments=this._formatInput(t),this._validateArgs(this.arguments),t=[]),e.push(this.subscriptionMethod),e=e.concat(this.arguments),t.length)throw new Error("Only a callback is allowed as parameter on an already instantiated subscription.");return{method:this.options.type+"_subscribe",params:e}},a.prototype.unsubscribe=function(t){this.options.requestManager.removeSubscription(this.id,t),this.id=null,this.removeAllListeners(),clearInterval(this._reconnectIntervalId)},a.prototype.subscribe=function(){var t=this,e=Array.prototype.slice.call(arguments),r=this._toPayload(e);if(!r)return this;if(!this.options.requestManager.provider){var i=new Error("No provider set.");return this.callback(i,null,this),this.emit("error",i),this}if(!this.options.requestManager.provider.on){var o=new Error("The current provider doesn't support subscriptions: "+this.options.requestManager.provider.constructor.name);return this.callback(o,null,this),this.emit("error",o),this}return this.id&&this.unsubscribe(),this.options.params=r.params[1],"logs"===r.params[0]&&n.isObject(r.params[1])&&r.params[1].hasOwnProperty("fromBlock")&&isFinite(r.params[1].fromBlock)&&this.options.requestManager.send({method:"eth_getLogs",params:[r.params[1]]},function(e,r){e?(t.callback(e,null,t),t.emit("error",e)):r.forEach(function(e){var r=t._formatOutput(e);t.callback(null,r,t),t.emit("data",r)})}),"object"===_typeof(r.params[1])&&delete r.params[1].fromBlock,this.options.requestManager.send(r,function(e,i){!e&&i?(t.id=i,t.options.requestManager.addSubscription(t.id,r.params[0],t.options.type,function(e,r){e?(t.options.requestManager.removeSubscription(t.id),t.options.requestManager.provider.once&&(t._reconnectIntervalId=setInterval(function(){t.options.requestManager.provider.reconnect&&t.options.requestManager.provider.reconnect()},500),t.options.requestManager.provider.once("connect",function(){clearInterval(t._reconnectIntervalId),t.subscribe(t.callback)})),t.emit("error",e),n.isFunction(t.callback)&&t.callback(e,null,t)):(n.isArray(r)||(r=[r]),r.forEach(function(e){var r=t._formatOutput(e);if(n.isFunction(t.options.subscription.subscriptionHandler))return t.options.subscription.subscriptionHandler.call(t,r);t.emit("data",r),n.isFunction(t.callback)&&t.callback(null,r,t)}))})):n.isFunction(t.callback)?(t.callback(e,null,t),t.emit("error",e)):t.emit("error",e)}),this},e.exports=a},{eventemitter3:204,underscore:205,"web3-core-helpers":191}],208:[function(t,e,r){var n=t("web3-core-helpers").formatters,i=t("web3-core-method"),o=t("web3-utils");e.exports=function(t){var e=function(e){var r;return e.property?(t[e.property]||(t[e.property]={}),r=t[e.property]):r=t,e.methods&&e.methods.forEach(function(e){e instanceof i||(e=new i(e)),e.attachToObject(r),e.setRequestManager(t._requestManager)}),t};return e.formatters=n,e.utils=o,e.Method=i,e}},{"web3-core-helpers":191,"web3-core-method":193,"web3-utils":393}],209:[function(t,e,r){var n=t("web3-core-requestmanager"),i=t("./extend.js");e.exports={packageInit:function(t,e){if(e=Array.prototype.slice.call(e),!t)throw new Error('You need to instantiate using the "new" keyword.');Object.defineProperty(t,"currentProvider",{get:function(){return t._provider},set:function(e){return t.setProvider(e)},enumerable:!0,configurable:!0}),e[0]&&e[0]._requestManager?t._requestManager=new n.Manager(e[0].currentProvider):(t._requestManager=new n.Manager,t._requestManager.setProvider(e[0],e[1])),t.givenProvider=n.Manager.givenProvider,t.providers=n.Manager.providers,t._provider=t._requestManager.provider,t.setProvider||(t.setProvider=function(e,r){return t._requestManager.setProvider(e,r),t._provider=t._requestManager.provider,!0}),t.BatchRequest=n.BatchManager.bind(null,t._requestManager),t.extend=i(t)},addProviders:function(t){t.givenProvider=n.Manager.givenProvider,t.providers=n.Manager.providers}}},{"./extend.js":208,"web3-core-requestmanager":202}],210:[function(t,e,r){!function(e,r){function n(t,e){if(!t)throw new Error(e||"Assertion failed")}function i(t,e){t.super_=e;var r=function(){};r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t}function o(t,e,r){if(o.isBN(t))return t;this.negative=0,this.words=null,this.length=0,this.red=null,null!==t&&("le"!==e&&"be"!==e||(r=e,e=10),this._init(t||0,e||10,r||"be"))}var a;"object"===(void 0===e?"undefined":_typeof(e))?e.exports=o:r.BN=o,o.BN=o,o.wordSize=26;try{a=t("buffer").Buffer}catch(t){}function s(t,e,r){for(var n=0,i=Math.min(t.length,r),o=e;o=49&&a<=54?a-49+10:a>=17&&a<=22?a-17+10:15&a}return n}function u(t,e,r,n){for(var i=0,o=Math.min(t.length,r),a=e;a=49?s-49+10:s>=17?s-17+10:s}return i}o.isBN=function(t){return t instanceof o||null!==t&&"object"===(void 0===t?"undefined":_typeof(t))&&t.constructor.wordSize===o.wordSize&&Array.isArray(t.words)},o.max=function(t,e){return t.cmp(e)>0?t:e},o.min=function(t,e){return t.cmp(e)<0?t:e},o.prototype._init=function(t,e,r){if("number"==typeof t)return this._initNumber(t,e,r);if("object"===(void 0===t?"undefined":_typeof(t)))return this._initArray(t,e,r);"hex"===e&&(e=16),n(e===(0|e)&&e>=2&&e<=36);var i=0;"-"===(t=t.toString().replace(/\s+/g,""))[0]&&i++,16===e?this._parseHex(t,i):this._parseBase(t,e,i),"-"===t[0]&&(this.negative=1),this.strip(),"le"===r&&this._initArray(this.toArray(),e,r)},o.prototype._initNumber=function(t,e,r){t<0&&(this.negative=1,t=-t),t<67108864?(this.words=[67108863&t],this.length=1):t<4503599627370496?(this.words=[67108863&t,t/67108864&67108863],this.length=2):(n(t<9007199254740992),this.words=[67108863&t,t/67108864&67108863,1],this.length=3),"le"===r&&this._initArray(this.toArray(),e,r)},o.prototype._initArray=function(t,e,r){if(n("number"==typeof t.length),t.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(t.length/3),this.words=new Array(this.length);for(var i=0;i=0;i-=3)a=t[i]|t[i-1]<<8|t[i-2]<<16,this.words[o]|=a<>>26-s&67108863,(s+=24)>=26&&(s-=26,o++);else if("le"===r)for(i=0,o=0;i>>26-s&67108863,(s+=24)>=26&&(s-=26,o++);return this.strip()},o.prototype._parseHex=function(t,e){this.length=Math.ceil((t.length-e)/6),this.words=new Array(this.length);for(var r=0;r=e;r-=6)i=s(t,r,r+6),this.words[n]|=i<>>26-o&4194303,(o+=24)>=26&&(o-=26,n++);r+6!==e&&(i=s(t,e,r+6),this.words[n]|=i<>>26-o&4194303),this.strip()},o.prototype._parseBase=function(t,e,r){this.words=[0],this.length=1;for(var n=0,i=1;i<=67108863;i*=e)n++;n--,i=i/e|0;for(var o=t.length-r,a=o%n,s=Math.min(o,o-a)+r,f=0,c=r;c1&&0===this.words[this.length-1];)this.length--;return this._normSign()},o.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},o.prototype.inspect=function(){return(this.red?""};var f=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],c=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],h=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];function d(t,e,r){r.negative=e.negative^t.negative;var n=t.length+e.length|0;r.length=n,n=n-1|0;var i=0|t.words[0],o=0|e.words[0],a=i*o,s=67108863&a,u=a/67108864|0;r.words[0]=s;for(var f=1;f>>26,h=67108863&u,d=Math.min(f,e.length-1),l=Math.max(0,f-t.length+1);l<=d;l++){var p=f-l|0;c+=(a=(i=0|t.words[p])*(o=0|e.words[l])+h)/67108864|0,h=67108863&a}r.words[f]=0|h,u=0|c}return 0!==u?r.words[f]=0|u:r.length--,r.strip()}o.prototype.toString=function(t,e){var r;if(e=0|e||1,16===(t=t||10)||"hex"===t){r="";for(var i=0,o=0,a=0;a>>24-i&16777215)||a!==this.length-1?f[6-u.length]+u+r:u+r,(i+=2)>=26&&(i-=26,a--)}for(0!==o&&(r=o.toString(16)+r);r.length%e!=0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}if(t===(0|t)&&t>=2&&t<=36){var d=c[t],l=h[t];r="";var p=this.clone();for(p.negative=0;!p.isZero();){var b=p.modn(l).toString(t);r=(p=p.idivn(l)).isZero()?b+r:f[d-b.length]+b+r}for(this.isZero()&&(r="0"+r);r.length%e!=0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}n(!1,"Base should be between 2 and 36")},o.prototype.toNumber=function(){var t=this.words[0];return 2===this.length?t+=67108864*this.words[1]:3===this.length&&1===this.words[2]?t+=4503599627370496+67108864*this.words[1]:this.length>2&&n(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-t:t},o.prototype.toJSON=function(){return this.toString(16)},o.prototype.toBuffer=function(t,e){return n(void 0!==a),this.toArrayLike(a,t,e)},o.prototype.toArray=function(t,e){return this.toArrayLike(Array,t,e)},o.prototype.toArrayLike=function(t,e,r){var i=this.byteLength(),o=r||Math.max(1,i);n(i<=o,"byte array longer than desired length"),n(o>0,"Requested array length <= 0"),this.strip();var a,s,u="le"===e,f=new t(o),c=this.clone();if(u){for(s=0;!c.isZero();s++)a=c.andln(255),c.iushrn(8),f[s]=a;for(;s=4096&&(r+=13,e>>>=13),e>=64&&(r+=7,e>>>=7),e>=8&&(r+=4,e>>>=4),e>=2&&(r+=2,e>>>=2),r+e},o.prototype._zeroBits=function(t){if(0===t)return 26;var e=t,r=0;return 0==(8191&e)&&(r+=13,e>>>=13),0==(127&e)&&(r+=7,e>>>=7),0==(15&e)&&(r+=4,e>>>=4),0==(3&e)&&(r+=2,e>>>=2),0==(1&e)&&r++,r},o.prototype.bitLength=function(){var t=this.words[this.length-1],e=this._countBits(t);return 26*(this.length-1)+e},o.prototype.zeroBits=function(){if(this.isZero())return 0;for(var t=0,e=0;et.length?this.clone().ior(t):t.clone().ior(this)},o.prototype.uor=function(t){return this.length>t.length?this.clone().iuor(t):t.clone().iuor(this)},o.prototype.iuand=function(t){var e;e=this.length>t.length?t:this;for(var r=0;rt.length?this.clone().iand(t):t.clone().iand(this)},o.prototype.uand=function(t){return this.length>t.length?this.clone().iuand(t):t.clone().iuand(this)},o.prototype.iuxor=function(t){var e,r;this.length>t.length?(e=this,r=t):(e=t,r=this);for(var n=0;nt.length?this.clone().ixor(t):t.clone().ixor(this)},o.prototype.uxor=function(t){return this.length>t.length?this.clone().iuxor(t):t.clone().iuxor(this)},o.prototype.inotn=function(t){n("number"==typeof t&&t>=0);var e=0|Math.ceil(t/26),r=t%26;this._expand(e),r>0&&e--;for(var i=0;i0&&(this.words[i]=~this.words[i]&67108863>>26-r),this.strip()},o.prototype.notn=function(t){return this.clone().inotn(t)},o.prototype.setn=function(t,e){n("number"==typeof t&&t>=0);var r=t/26|0,i=t%26;return this._expand(r+1),this.words[r]=e?this.words[r]|1<t.length?(r=this,n=t):(r=t,n=this);for(var i=0,o=0;o>>26;for(;0!==i&&o>>26;if(this.length=r.length,0!==i)this.words[this.length]=i,this.length++;else if(r!==this)for(;ot.length?this.clone().iadd(t):t.clone().iadd(this)},o.prototype.isub=function(t){if(0!==t.negative){t.negative=0;var e=this.iadd(t);return t.negative=1,e._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(t),this.negative=1,this._normSign();var r,n,i=this.cmp(t);if(0===i)return this.negative=0,this.length=1,this.words[0]=0,this;i>0?(r=this,n=t):(r=t,n=this);for(var o=0,a=0;a>26,this.words[a]=67108863&e;for(;0!==o&&a>26,this.words[a]=67108863&e;if(0===o&&a>>13,l=0|a[1],p=8191&l,b=l>>>13,m=0|a[2],y=8191&m,v=m>>>13,g=0|a[3],w=8191&g,_=g>>>13,M=0|a[4],x=8191&M,k=M>>>13,S=0|a[5],E=8191&S,A=S>>>13,j=0|a[6],I=8191&j,B=j>>>13,T=0|a[7],C=8191&T,P=T>>>13,R=0|a[8],O=8191&R,N=R>>>13,L=0|a[9],F=8191&L,q=L>>>13,D=0|s[0],U=8191&D,z=D>>>13,K=0|s[1],H=8191&K,V=K>>>13,W=0|s[2],X=8191&W,G=W>>>13,J=0|s[3],Z=8191&J,$=J>>>13,Y=0|s[4],Q=8191&Y,tt=Y>>>13,et=0|s[5],rt=8191&et,nt=et>>>13,it=0|s[6],ot=8191&it,at=it>>>13,st=0|s[7],ut=8191&st,ft=st>>>13,ct=0|s[8],ht=8191&ct,dt=ct>>>13,lt=0|s[9],pt=8191<,bt=lt>>>13;r.negative=t.negative^e.negative,r.length=19;var mt=(f+(n=Math.imul(h,U))|0)+((8191&(i=(i=Math.imul(h,z))+Math.imul(d,U)|0))<<13)|0;f=((o=Math.imul(d,z))+(i>>>13)|0)+(mt>>>26)|0,mt&=67108863,n=Math.imul(p,U),i=(i=Math.imul(p,z))+Math.imul(b,U)|0,o=Math.imul(b,z);var yt=(f+(n=n+Math.imul(h,H)|0)|0)+((8191&(i=(i=i+Math.imul(h,V)|0)+Math.imul(d,H)|0))<<13)|0;f=((o=o+Math.imul(d,V)|0)+(i>>>13)|0)+(yt>>>26)|0,yt&=67108863,n=Math.imul(y,U),i=(i=Math.imul(y,z))+Math.imul(v,U)|0,o=Math.imul(v,z),n=n+Math.imul(p,H)|0,i=(i=i+Math.imul(p,V)|0)+Math.imul(b,H)|0,o=o+Math.imul(b,V)|0;var vt=(f+(n=n+Math.imul(h,X)|0)|0)+((8191&(i=(i=i+Math.imul(h,G)|0)+Math.imul(d,X)|0))<<13)|0;f=((o=o+Math.imul(d,G)|0)+(i>>>13)|0)+(vt>>>26)|0,vt&=67108863,n=Math.imul(w,U),i=(i=Math.imul(w,z))+Math.imul(_,U)|0,o=Math.imul(_,z),n=n+Math.imul(y,H)|0,i=(i=i+Math.imul(y,V)|0)+Math.imul(v,H)|0,o=o+Math.imul(v,V)|0,n=n+Math.imul(p,X)|0,i=(i=i+Math.imul(p,G)|0)+Math.imul(b,X)|0,o=o+Math.imul(b,G)|0;var gt=(f+(n=n+Math.imul(h,Z)|0)|0)+((8191&(i=(i=i+Math.imul(h,$)|0)+Math.imul(d,Z)|0))<<13)|0;f=((o=o+Math.imul(d,$)|0)+(i>>>13)|0)+(gt>>>26)|0,gt&=67108863,n=Math.imul(x,U),i=(i=Math.imul(x,z))+Math.imul(k,U)|0,o=Math.imul(k,z),n=n+Math.imul(w,H)|0,i=(i=i+Math.imul(w,V)|0)+Math.imul(_,H)|0,o=o+Math.imul(_,V)|0,n=n+Math.imul(y,X)|0,i=(i=i+Math.imul(y,G)|0)+Math.imul(v,X)|0,o=o+Math.imul(v,G)|0,n=n+Math.imul(p,Z)|0,i=(i=i+Math.imul(p,$)|0)+Math.imul(b,Z)|0,o=o+Math.imul(b,$)|0;var wt=(f+(n=n+Math.imul(h,Q)|0)|0)+((8191&(i=(i=i+Math.imul(h,tt)|0)+Math.imul(d,Q)|0))<<13)|0;f=((o=o+Math.imul(d,tt)|0)+(i>>>13)|0)+(wt>>>26)|0,wt&=67108863,n=Math.imul(E,U),i=(i=Math.imul(E,z))+Math.imul(A,U)|0,o=Math.imul(A,z),n=n+Math.imul(x,H)|0,i=(i=i+Math.imul(x,V)|0)+Math.imul(k,H)|0,o=o+Math.imul(k,V)|0,n=n+Math.imul(w,X)|0,i=(i=i+Math.imul(w,G)|0)+Math.imul(_,X)|0,o=o+Math.imul(_,G)|0,n=n+Math.imul(y,Z)|0,i=(i=i+Math.imul(y,$)|0)+Math.imul(v,Z)|0,o=o+Math.imul(v,$)|0,n=n+Math.imul(p,Q)|0,i=(i=i+Math.imul(p,tt)|0)+Math.imul(b,Q)|0,o=o+Math.imul(b,tt)|0;var _t=(f+(n=n+Math.imul(h,rt)|0)|0)+((8191&(i=(i=i+Math.imul(h,nt)|0)+Math.imul(d,rt)|0))<<13)|0;f=((o=o+Math.imul(d,nt)|0)+(i>>>13)|0)+(_t>>>26)|0,_t&=67108863,n=Math.imul(I,U),i=(i=Math.imul(I,z))+Math.imul(B,U)|0,o=Math.imul(B,z),n=n+Math.imul(E,H)|0,i=(i=i+Math.imul(E,V)|0)+Math.imul(A,H)|0,o=o+Math.imul(A,V)|0,n=n+Math.imul(x,X)|0,i=(i=i+Math.imul(x,G)|0)+Math.imul(k,X)|0,o=o+Math.imul(k,G)|0,n=n+Math.imul(w,Z)|0,i=(i=i+Math.imul(w,$)|0)+Math.imul(_,Z)|0,o=o+Math.imul(_,$)|0,n=n+Math.imul(y,Q)|0,i=(i=i+Math.imul(y,tt)|0)+Math.imul(v,Q)|0,o=o+Math.imul(v,tt)|0,n=n+Math.imul(p,rt)|0,i=(i=i+Math.imul(p,nt)|0)+Math.imul(b,rt)|0,o=o+Math.imul(b,nt)|0;var Mt=(f+(n=n+Math.imul(h,ot)|0)|0)+((8191&(i=(i=i+Math.imul(h,at)|0)+Math.imul(d,ot)|0))<<13)|0;f=((o=o+Math.imul(d,at)|0)+(i>>>13)|0)+(Mt>>>26)|0,Mt&=67108863,n=Math.imul(C,U),i=(i=Math.imul(C,z))+Math.imul(P,U)|0,o=Math.imul(P,z),n=n+Math.imul(I,H)|0,i=(i=i+Math.imul(I,V)|0)+Math.imul(B,H)|0,o=o+Math.imul(B,V)|0,n=n+Math.imul(E,X)|0,i=(i=i+Math.imul(E,G)|0)+Math.imul(A,X)|0,o=o+Math.imul(A,G)|0,n=n+Math.imul(x,Z)|0,i=(i=i+Math.imul(x,$)|0)+Math.imul(k,Z)|0,o=o+Math.imul(k,$)|0,n=n+Math.imul(w,Q)|0,i=(i=i+Math.imul(w,tt)|0)+Math.imul(_,Q)|0,o=o+Math.imul(_,tt)|0,n=n+Math.imul(y,rt)|0,i=(i=i+Math.imul(y,nt)|0)+Math.imul(v,rt)|0,o=o+Math.imul(v,nt)|0,n=n+Math.imul(p,ot)|0,i=(i=i+Math.imul(p,at)|0)+Math.imul(b,ot)|0,o=o+Math.imul(b,at)|0;var xt=(f+(n=n+Math.imul(h,ut)|0)|0)+((8191&(i=(i=i+Math.imul(h,ft)|0)+Math.imul(d,ut)|0))<<13)|0;f=((o=o+Math.imul(d,ft)|0)+(i>>>13)|0)+(xt>>>26)|0,xt&=67108863,n=Math.imul(O,U),i=(i=Math.imul(O,z))+Math.imul(N,U)|0,o=Math.imul(N,z),n=n+Math.imul(C,H)|0,i=(i=i+Math.imul(C,V)|0)+Math.imul(P,H)|0,o=o+Math.imul(P,V)|0,n=n+Math.imul(I,X)|0,i=(i=i+Math.imul(I,G)|0)+Math.imul(B,X)|0,o=o+Math.imul(B,G)|0,n=n+Math.imul(E,Z)|0,i=(i=i+Math.imul(E,$)|0)+Math.imul(A,Z)|0,o=o+Math.imul(A,$)|0,n=n+Math.imul(x,Q)|0,i=(i=i+Math.imul(x,tt)|0)+Math.imul(k,Q)|0,o=o+Math.imul(k,tt)|0,n=n+Math.imul(w,rt)|0,i=(i=i+Math.imul(w,nt)|0)+Math.imul(_,rt)|0,o=o+Math.imul(_,nt)|0,n=n+Math.imul(y,ot)|0,i=(i=i+Math.imul(y,at)|0)+Math.imul(v,ot)|0,o=o+Math.imul(v,at)|0,n=n+Math.imul(p,ut)|0,i=(i=i+Math.imul(p,ft)|0)+Math.imul(b,ut)|0,o=o+Math.imul(b,ft)|0;var kt=(f+(n=n+Math.imul(h,ht)|0)|0)+((8191&(i=(i=i+Math.imul(h,dt)|0)+Math.imul(d,ht)|0))<<13)|0;f=((o=o+Math.imul(d,dt)|0)+(i>>>13)|0)+(kt>>>26)|0,kt&=67108863,n=Math.imul(F,U),i=(i=Math.imul(F,z))+Math.imul(q,U)|0,o=Math.imul(q,z),n=n+Math.imul(O,H)|0,i=(i=i+Math.imul(O,V)|0)+Math.imul(N,H)|0,o=o+Math.imul(N,V)|0,n=n+Math.imul(C,X)|0,i=(i=i+Math.imul(C,G)|0)+Math.imul(P,X)|0,o=o+Math.imul(P,G)|0,n=n+Math.imul(I,Z)|0,i=(i=i+Math.imul(I,$)|0)+Math.imul(B,Z)|0,o=o+Math.imul(B,$)|0,n=n+Math.imul(E,Q)|0,i=(i=i+Math.imul(E,tt)|0)+Math.imul(A,Q)|0,o=o+Math.imul(A,tt)|0,n=n+Math.imul(x,rt)|0,i=(i=i+Math.imul(x,nt)|0)+Math.imul(k,rt)|0,o=o+Math.imul(k,nt)|0,n=n+Math.imul(w,ot)|0,i=(i=i+Math.imul(w,at)|0)+Math.imul(_,ot)|0,o=o+Math.imul(_,at)|0,n=n+Math.imul(y,ut)|0,i=(i=i+Math.imul(y,ft)|0)+Math.imul(v,ut)|0,o=o+Math.imul(v,ft)|0,n=n+Math.imul(p,ht)|0,i=(i=i+Math.imul(p,dt)|0)+Math.imul(b,ht)|0,o=o+Math.imul(b,dt)|0;var St=(f+(n=n+Math.imul(h,pt)|0)|0)+((8191&(i=(i=i+Math.imul(h,bt)|0)+Math.imul(d,pt)|0))<<13)|0;f=((o=o+Math.imul(d,bt)|0)+(i>>>13)|0)+(St>>>26)|0,St&=67108863,n=Math.imul(F,H),i=(i=Math.imul(F,V))+Math.imul(q,H)|0,o=Math.imul(q,V),n=n+Math.imul(O,X)|0,i=(i=i+Math.imul(O,G)|0)+Math.imul(N,X)|0,o=o+Math.imul(N,G)|0,n=n+Math.imul(C,Z)|0,i=(i=i+Math.imul(C,$)|0)+Math.imul(P,Z)|0,o=o+Math.imul(P,$)|0,n=n+Math.imul(I,Q)|0,i=(i=i+Math.imul(I,tt)|0)+Math.imul(B,Q)|0,o=o+Math.imul(B,tt)|0,n=n+Math.imul(E,rt)|0,i=(i=i+Math.imul(E,nt)|0)+Math.imul(A,rt)|0,o=o+Math.imul(A,nt)|0,n=n+Math.imul(x,ot)|0,i=(i=i+Math.imul(x,at)|0)+Math.imul(k,ot)|0,o=o+Math.imul(k,at)|0,n=n+Math.imul(w,ut)|0,i=(i=i+Math.imul(w,ft)|0)+Math.imul(_,ut)|0,o=o+Math.imul(_,ft)|0,n=n+Math.imul(y,ht)|0,i=(i=i+Math.imul(y,dt)|0)+Math.imul(v,ht)|0,o=o+Math.imul(v,dt)|0;var Et=(f+(n=n+Math.imul(p,pt)|0)|0)+((8191&(i=(i=i+Math.imul(p,bt)|0)+Math.imul(b,pt)|0))<<13)|0;f=((o=o+Math.imul(b,bt)|0)+(i>>>13)|0)+(Et>>>26)|0,Et&=67108863,n=Math.imul(F,X),i=(i=Math.imul(F,G))+Math.imul(q,X)|0,o=Math.imul(q,G),n=n+Math.imul(O,Z)|0,i=(i=i+Math.imul(O,$)|0)+Math.imul(N,Z)|0,o=o+Math.imul(N,$)|0,n=n+Math.imul(C,Q)|0,i=(i=i+Math.imul(C,tt)|0)+Math.imul(P,Q)|0,o=o+Math.imul(P,tt)|0,n=n+Math.imul(I,rt)|0,i=(i=i+Math.imul(I,nt)|0)+Math.imul(B,rt)|0,o=o+Math.imul(B,nt)|0,n=n+Math.imul(E,ot)|0,i=(i=i+Math.imul(E,at)|0)+Math.imul(A,ot)|0,o=o+Math.imul(A,at)|0,n=n+Math.imul(x,ut)|0,i=(i=i+Math.imul(x,ft)|0)+Math.imul(k,ut)|0,o=o+Math.imul(k,ft)|0,n=n+Math.imul(w,ht)|0,i=(i=i+Math.imul(w,dt)|0)+Math.imul(_,ht)|0,o=o+Math.imul(_,dt)|0;var At=(f+(n=n+Math.imul(y,pt)|0)|0)+((8191&(i=(i=i+Math.imul(y,bt)|0)+Math.imul(v,pt)|0))<<13)|0;f=((o=o+Math.imul(v,bt)|0)+(i>>>13)|0)+(At>>>26)|0,At&=67108863,n=Math.imul(F,Z),i=(i=Math.imul(F,$))+Math.imul(q,Z)|0,o=Math.imul(q,$),n=n+Math.imul(O,Q)|0,i=(i=i+Math.imul(O,tt)|0)+Math.imul(N,Q)|0,o=o+Math.imul(N,tt)|0,n=n+Math.imul(C,rt)|0,i=(i=i+Math.imul(C,nt)|0)+Math.imul(P,rt)|0,o=o+Math.imul(P,nt)|0,n=n+Math.imul(I,ot)|0,i=(i=i+Math.imul(I,at)|0)+Math.imul(B,ot)|0,o=o+Math.imul(B,at)|0,n=n+Math.imul(E,ut)|0,i=(i=i+Math.imul(E,ft)|0)+Math.imul(A,ut)|0,o=o+Math.imul(A,ft)|0,n=n+Math.imul(x,ht)|0,i=(i=i+Math.imul(x,dt)|0)+Math.imul(k,ht)|0,o=o+Math.imul(k,dt)|0;var jt=(f+(n=n+Math.imul(w,pt)|0)|0)+((8191&(i=(i=i+Math.imul(w,bt)|0)+Math.imul(_,pt)|0))<<13)|0;f=((o=o+Math.imul(_,bt)|0)+(i>>>13)|0)+(jt>>>26)|0,jt&=67108863,n=Math.imul(F,Q),i=(i=Math.imul(F,tt))+Math.imul(q,Q)|0,o=Math.imul(q,tt),n=n+Math.imul(O,rt)|0,i=(i=i+Math.imul(O,nt)|0)+Math.imul(N,rt)|0,o=o+Math.imul(N,nt)|0,n=n+Math.imul(C,ot)|0,i=(i=i+Math.imul(C,at)|0)+Math.imul(P,ot)|0,o=o+Math.imul(P,at)|0,n=n+Math.imul(I,ut)|0,i=(i=i+Math.imul(I,ft)|0)+Math.imul(B,ut)|0,o=o+Math.imul(B,ft)|0,n=n+Math.imul(E,ht)|0,i=(i=i+Math.imul(E,dt)|0)+Math.imul(A,ht)|0,o=o+Math.imul(A,dt)|0;var It=(f+(n=n+Math.imul(x,pt)|0)|0)+((8191&(i=(i=i+Math.imul(x,bt)|0)+Math.imul(k,pt)|0))<<13)|0;f=((o=o+Math.imul(k,bt)|0)+(i>>>13)|0)+(It>>>26)|0,It&=67108863,n=Math.imul(F,rt),i=(i=Math.imul(F,nt))+Math.imul(q,rt)|0,o=Math.imul(q,nt),n=n+Math.imul(O,ot)|0,i=(i=i+Math.imul(O,at)|0)+Math.imul(N,ot)|0,o=o+Math.imul(N,at)|0,n=n+Math.imul(C,ut)|0,i=(i=i+Math.imul(C,ft)|0)+Math.imul(P,ut)|0,o=o+Math.imul(P,ft)|0,n=n+Math.imul(I,ht)|0,i=(i=i+Math.imul(I,dt)|0)+Math.imul(B,ht)|0,o=o+Math.imul(B,dt)|0;var Bt=(f+(n=n+Math.imul(E,pt)|0)|0)+((8191&(i=(i=i+Math.imul(E,bt)|0)+Math.imul(A,pt)|0))<<13)|0;f=((o=o+Math.imul(A,bt)|0)+(i>>>13)|0)+(Bt>>>26)|0,Bt&=67108863,n=Math.imul(F,ot),i=(i=Math.imul(F,at))+Math.imul(q,ot)|0,o=Math.imul(q,at),n=n+Math.imul(O,ut)|0,i=(i=i+Math.imul(O,ft)|0)+Math.imul(N,ut)|0,o=o+Math.imul(N,ft)|0,n=n+Math.imul(C,ht)|0,i=(i=i+Math.imul(C,dt)|0)+Math.imul(P,ht)|0,o=o+Math.imul(P,dt)|0;var Tt=(f+(n=n+Math.imul(I,pt)|0)|0)+((8191&(i=(i=i+Math.imul(I,bt)|0)+Math.imul(B,pt)|0))<<13)|0;f=((o=o+Math.imul(B,bt)|0)+(i>>>13)|0)+(Tt>>>26)|0,Tt&=67108863,n=Math.imul(F,ut),i=(i=Math.imul(F,ft))+Math.imul(q,ut)|0,o=Math.imul(q,ft),n=n+Math.imul(O,ht)|0,i=(i=i+Math.imul(O,dt)|0)+Math.imul(N,ht)|0,o=o+Math.imul(N,dt)|0;var Ct=(f+(n=n+Math.imul(C,pt)|0)|0)+((8191&(i=(i=i+Math.imul(C,bt)|0)+Math.imul(P,pt)|0))<<13)|0;f=((o=o+Math.imul(P,bt)|0)+(i>>>13)|0)+(Ct>>>26)|0,Ct&=67108863,n=Math.imul(F,ht),i=(i=Math.imul(F,dt))+Math.imul(q,ht)|0,o=Math.imul(q,dt);var Pt=(f+(n=n+Math.imul(O,pt)|0)|0)+((8191&(i=(i=i+Math.imul(O,bt)|0)+Math.imul(N,pt)|0))<<13)|0;f=((o=o+Math.imul(N,bt)|0)+(i>>>13)|0)+(Pt>>>26)|0,Pt&=67108863;var Rt=(f+(n=Math.imul(F,pt))|0)+((8191&(i=(i=Math.imul(F,bt))+Math.imul(q,pt)|0))<<13)|0;return f=((o=Math.imul(q,bt))+(i>>>13)|0)+(Rt>>>26)|0,Rt&=67108863,u[0]=mt,u[1]=yt,u[2]=vt,u[3]=gt,u[4]=wt,u[5]=_t,u[6]=Mt,u[7]=xt,u[8]=kt,u[9]=St,u[10]=Et,u[11]=At,u[12]=jt,u[13]=It,u[14]=Bt,u[15]=Tt,u[16]=Ct,u[17]=Pt,u[18]=Rt,0!==f&&(u[19]=f,r.length++),r};function p(t,e,r){return(new b).mulp(t,e,r)}function b(t,e){this.x=t,this.y=e}Math.imul||(l=d),o.prototype.mulTo=function(t,e){var r=this.length+t.length;return 10===this.length&&10===t.length?l(this,t,e):r<63?d(this,t,e):r<1024?function(t,e,r){r.negative=e.negative^t.negative,r.length=t.length+e.length;for(var n=0,i=0,o=0;o>>26)|0)>>>26,a&=67108863}r.words[o]=s,n=a,a=i}return 0!==n?r.words[o]=n:r.length--,r.strip()}(this,t,e):p(this,t,e)},b.prototype.makeRBT=function(t){for(var e=new Array(t),r=o.prototype._countBits(t)-1,n=0;n>=1;return n},b.prototype.permute=function(t,e,r,n,i,o){for(var a=0;a>>=1)i++;return 1<>>=13,r[2*a+1]=8191&o,o>>>=13;for(a=2*e;a>=26,e+=i/67108864|0,e+=o>>>26,this.words[r]=67108863&o}return 0!==e&&(this.words[r]=e,this.length++),this},o.prototype.muln=function(t){return this.clone().imuln(t)},o.prototype.sqr=function(){return this.mul(this)},o.prototype.isqr=function(){return this.imul(this.clone())},o.prototype.pow=function(t){var e=function(t){for(var e=new Array(t.bitLength()),r=0;r>>i}return e}(t);if(0===e.length)return new o(1);for(var r=this,n=0;n=0);var e,r=t%26,i=(t-r)/26,o=67108863>>>26-r<<26-r;if(0!==r){var a=0;for(e=0;e>>26-r}a&&(this.words[e]=a,this.length++)}if(0!==i){for(e=this.length-1;e>=0;e--)this.words[e+i]=this.words[e];for(e=0;e=0),i=e?(e-e%26)/26:0;var o=t%26,a=Math.min((t-o)/26,this.length),s=67108863^67108863>>>o<a)for(this.length-=a,f=0;f=0&&(0!==c||f>=i);f--){var h=0|this.words[f];this.words[f]=c<<26-o|h>>>o,c=h&s}return u&&0!==c&&(u.words[u.length++]=c),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},o.prototype.ishrn=function(t,e,r){return n(0===this.negative),this.iushrn(t,e,r)},o.prototype.shln=function(t){return this.clone().ishln(t)},o.prototype.ushln=function(t){return this.clone().iushln(t)},o.prototype.shrn=function(t){return this.clone().ishrn(t)},o.prototype.ushrn=function(t){return this.clone().iushrn(t)},o.prototype.testn=function(t){n("number"==typeof t&&t>=0);var e=t%26,r=(t-e)/26,i=1<=0);var e=t%26,r=(t-e)/26;if(n(0===this.negative,"imaskn works only with positive numbers"),this.length<=r)return this;if(0!==e&&r++,this.length=Math.min(r,this.length),0!==e){var i=67108863^67108863>>>e<=67108864;e++)this.words[e]-=67108864,e===this.length-1?this.words[e+1]=1:this.words[e+1]++;return this.length=Math.max(this.length,e+1),this},o.prototype.isubn=function(t){if(n("number"==typeof t),n(t<67108864),t<0)return this.iaddn(-t);if(0!==this.negative)return this.negative=0,this.iaddn(t),this.negative=1,this;if(this.words[0]-=t,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var e=0;e>26)-(u/67108864|0),this.words[i+r]=67108863&o}for(;i>26,this.words[i+r]=67108863&o;if(0===s)return this.strip();for(n(-1===s),s=0,i=0;i>26,this.words[i]=67108863&o;return this.negative=1,this.strip()},o.prototype._wordDiv=function(t,e){var r=(this.length,t.length),n=this.clone(),i=t,a=0|i.words[i.length-1];0!==(r=26-this._countBits(a))&&(i=i.ushln(r),n.iushln(r),a=0|i.words[i.length-1]);var s,u=n.length-i.length;if("mod"!==e){(s=new o(null)).length=u+1,s.words=new Array(s.length);for(var f=0;f=0;h--){var d=67108864*(0|n.words[i.length+h])+(0|n.words[i.length+h-1]);for(d=Math.min(d/a|0,67108863),n._ishlnsubmul(i,d,h);0!==n.negative;)d--,n.negative=0,n._ishlnsubmul(i,1,h),n.isZero()||(n.negative^=1);s&&(s.words[h]=d)}return s&&s.strip(),n.strip(),"div"!==e&&0!==r&&n.iushrn(r),{div:s||null,mod:n}},o.prototype.divmod=function(t,e,r){return n(!t.isZero()),this.isZero()?{div:new o(0),mod:new o(0)}:0!==this.negative&&0===t.negative?(s=this.neg().divmod(t,e),"mod"!==e&&(i=s.div.neg()),"div"!==e&&(a=s.mod.neg(),r&&0!==a.negative&&a.iadd(t)),{div:i,mod:a}):0===this.negative&&0!==t.negative?(s=this.divmod(t.neg(),e),"mod"!==e&&(i=s.div.neg()),{div:i,mod:s.mod}):0!=(this.negative&t.negative)?(s=this.neg().divmod(t.neg(),e),"div"!==e&&(a=s.mod.neg(),r&&0!==a.negative&&a.isub(t)),{div:s.div,mod:a}):t.length>this.length||this.cmp(t)<0?{div:new o(0),mod:this}:1===t.length?"div"===e?{div:this.divn(t.words[0]),mod:null}:"mod"===e?{div:null,mod:new o(this.modn(t.words[0]))}:{div:this.divn(t.words[0]),mod:new o(this.modn(t.words[0]))}:this._wordDiv(t,e);var i,a,s},o.prototype.div=function(t){return this.divmod(t,"div",!1).div},o.prototype.mod=function(t){return this.divmod(t,"mod",!1).mod},o.prototype.umod=function(t){return this.divmod(t,"mod",!0).mod},o.prototype.divRound=function(t){var e=this.divmod(t);if(e.mod.isZero())return e.div;var r=0!==e.div.negative?e.mod.isub(t):e.mod,n=t.ushrn(1),i=t.andln(1),o=r.cmp(n);return o<0||1===i&&0===o?e.div:0!==e.div.negative?e.div.isubn(1):e.div.iaddn(1)},o.prototype.modn=function(t){n(t<=67108863);for(var e=(1<<26)%t,r=0,i=this.length-1;i>=0;i--)r=(e*r+(0|this.words[i]))%t;return r},o.prototype.idivn=function(t){n(t<=67108863);for(var e=0,r=this.length-1;r>=0;r--){var i=(0|this.words[r])+67108864*e;this.words[r]=i/t|0,e=i%t}return this.strip()},o.prototype.divn=function(t){return this.clone().idivn(t)},o.prototype.egcd=function(t){n(0===t.negative),n(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var i=new o(1),a=new o(0),s=new o(0),u=new o(1),f=0;e.isEven()&&r.isEven();)e.iushrn(1),r.iushrn(1),++f;for(var c=r.clone(),h=e.clone();!e.isZero();){for(var d=0,l=1;0==(e.words[0]&l)&&d<26;++d,l<<=1);if(d>0)for(e.iushrn(d);d-- >0;)(i.isOdd()||a.isOdd())&&(i.iadd(c),a.isub(h)),i.iushrn(1),a.iushrn(1);for(var p=0,b=1;0==(r.words[0]&b)&&p<26;++p,b<<=1);if(p>0)for(r.iushrn(p);p-- >0;)(s.isOdd()||u.isOdd())&&(s.iadd(c),u.isub(h)),s.iushrn(1),u.iushrn(1);e.cmp(r)>=0?(e.isub(r),i.isub(s),a.isub(u)):(r.isub(e),s.isub(i),u.isub(a))}return{a:s,b:u,gcd:r.iushln(f)}},o.prototype._invmp=function(t){n(0===t.negative),n(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var i,a=new o(1),s=new o(0),u=r.clone();e.cmpn(1)>0&&r.cmpn(1)>0;){for(var f=0,c=1;0==(e.words[0]&c)&&f<26;++f,c<<=1);if(f>0)for(e.iushrn(f);f-- >0;)a.isOdd()&&a.iadd(u),a.iushrn(1);for(var h=0,d=1;0==(r.words[0]&d)&&h<26;++h,d<<=1);if(h>0)for(r.iushrn(h);h-- >0;)s.isOdd()&&s.iadd(u),s.iushrn(1);e.cmp(r)>=0?(e.isub(r),a.isub(s)):(r.isub(e),s.isub(a))}return(i=0===e.cmpn(1)?a:s).cmpn(0)<0&&i.iadd(t),i},o.prototype.gcd=function(t){if(this.isZero())return t.abs();if(t.isZero())return this.abs();var e=this.clone(),r=t.clone();e.negative=0,r.negative=0;for(var n=0;e.isEven()&&r.isEven();n++)e.iushrn(1),r.iushrn(1);for(;;){for(;e.isEven();)e.iushrn(1);for(;r.isEven();)r.iushrn(1);var i=e.cmp(r);if(i<0){var o=e;e=r,r=o}else if(0===i||0===r.cmpn(1))break;e.isub(r)}return r.iushln(n)},o.prototype.invm=function(t){return this.egcd(t).a.umod(t)},o.prototype.isEven=function(){return 0==(1&this.words[0])},o.prototype.isOdd=function(){return 1==(1&this.words[0])},o.prototype.andln=function(t){return this.words[0]&t},o.prototype.bincn=function(t){n("number"==typeof t);var e=t%26,r=(t-e)/26,i=1<>>26,s&=67108863,this.words[a]=s}return 0!==o&&(this.words[a]=o,this.length++),this},o.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},o.prototype.cmpn=function(t){var e,r=t<0;if(0!==this.negative&&!r)return-1;if(0===this.negative&&r)return 1;if(this.strip(),this.length>1)e=1;else{r&&(t=-t),n(t<=67108863,"Number is too big");var i=0|this.words[0];e=i===t?0:it.length)return 1;if(this.length=0;r--){var n=0|this.words[r],i=0|t.words[r];if(n!==i){ni&&(e=1);break}}return e},o.prototype.gtn=function(t){return 1===this.cmpn(t)},o.prototype.gt=function(t){return 1===this.cmp(t)},o.prototype.gten=function(t){return this.cmpn(t)>=0},o.prototype.gte=function(t){return this.cmp(t)>=0},o.prototype.ltn=function(t){return-1===this.cmpn(t)},o.prototype.lt=function(t){return-1===this.cmp(t)},o.prototype.lten=function(t){return this.cmpn(t)<=0},o.prototype.lte=function(t){return this.cmp(t)<=0},o.prototype.eqn=function(t){return 0===this.cmpn(t)},o.prototype.eq=function(t){return 0===this.cmp(t)},o.red=function(t){return new M(t)},o.prototype.toRed=function(t){return n(!this.red,"Already a number in reduction context"),n(0===this.negative,"red works only with positives"),t.convertTo(this)._forceRed(t)},o.prototype.fromRed=function(){return n(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},o.prototype._forceRed=function(t){return this.red=t,this},o.prototype.forceRed=function(t){return n(!this.red,"Already a number in reduction context"),this._forceRed(t)},o.prototype.redAdd=function(t){return n(this.red,"redAdd works only with red numbers"),this.red.add(this,t)},o.prototype.redIAdd=function(t){return n(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,t)},o.prototype.redSub=function(t){return n(this.red,"redSub works only with red numbers"),this.red.sub(this,t)},o.prototype.redISub=function(t){return n(this.red,"redISub works only with red numbers"),this.red.isub(this,t)},o.prototype.redShl=function(t){return n(this.red,"redShl works only with red numbers"),this.red.shl(this,t)},o.prototype.redMul=function(t){return n(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.mul(this,t)},o.prototype.redIMul=function(t){return n(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.imul(this,t)},o.prototype.redSqr=function(){return n(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},o.prototype.redISqr=function(){return n(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},o.prototype.redSqrt=function(){return n(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},o.prototype.redInvm=function(){return n(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},o.prototype.redNeg=function(){return n(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},o.prototype.redPow=function(t){return n(this.red&&!t.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,t)};var m={k256:null,p224:null,p192:null,p25519:null};function y(t,e){this.name=t,this.p=new o(e,16),this.n=this.p.bitLength(),this.k=new o(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function v(){y.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function g(){y.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function w(){y.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function _(){y.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function M(t){if("string"==typeof t){var e=o._prime(t);this.m=e.p,this.prime=e}else n(t.gtn(1),"modulus must be greater than 1"),this.m=t,this.prime=null}function x(t){M.call(this,t),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new o(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}y.prototype._tmp=function(){var t=new o(null);return t.words=new Array(Math.ceil(this.n/13)),t},y.prototype.ireduce=function(t){var e,r=t;do{this.split(r,this.tmp),e=(r=(r=this.imulK(r)).iadd(this.tmp)).bitLength()}while(e>this.n);var n=e0?r.isub(this.p):r.strip(),r},y.prototype.split=function(t,e){t.iushrn(this.n,0,e)},y.prototype.imulK=function(t){return t.imul(this.k)},i(v,y),v.prototype.split=function(t,e){for(var r=Math.min(t.length,9),n=0;n>>22,i=o}i>>>=22,t.words[n-10]=i,0===i&&t.length>10?t.length-=10:t.length-=9},v.prototype.imulK=function(t){t.words[t.length]=0,t.words[t.length+1]=0,t.length+=2;for(var e=0,r=0;r>>=26,t.words[r]=i,e=n}return 0!==e&&(t.words[t.length++]=e),t},o._prime=function(t){if(m[t])return m[t];var e;if("k256"===t)e=new v;else if("p224"===t)e=new g;else if("p192"===t)e=new w;else{if("p25519"!==t)throw new Error("Unknown prime "+t);e=new _}return m[t]=e,e},M.prototype._verify1=function(t){n(0===t.negative,"red works only with positives"),n(t.red,"red works only with red numbers")},M.prototype._verify2=function(t,e){n(0==(t.negative|e.negative),"red works only with positives"),n(t.red&&t.red===e.red,"red works only with red numbers")},M.prototype.imod=function(t){return this.prime?this.prime.ireduce(t)._forceRed(this):t.umod(this.m)._forceRed(this)},M.prototype.neg=function(t){return t.isZero()?t.clone():this.m.sub(t)._forceRed(this)},M.prototype.add=function(t,e){this._verify2(t,e);var r=t.add(e);return r.cmp(this.m)>=0&&r.isub(this.m),r._forceRed(this)},M.prototype.iadd=function(t,e){this._verify2(t,e);var r=t.iadd(e);return r.cmp(this.m)>=0&&r.isub(this.m),r},M.prototype.sub=function(t,e){this._verify2(t,e);var r=t.sub(e);return r.cmpn(0)<0&&r.iadd(this.m),r._forceRed(this)},M.prototype.isub=function(t,e){this._verify2(t,e);var r=t.isub(e);return r.cmpn(0)<0&&r.iadd(this.m),r},M.prototype.shl=function(t,e){return this._verify1(t),this.imod(t.ushln(e))},M.prototype.imul=function(t,e){return this._verify2(t,e),this.imod(t.imul(e))},M.prototype.mul=function(t,e){return this._verify2(t,e),this.imod(t.mul(e))},M.prototype.isqr=function(t){return this.imul(t,t.clone())},M.prototype.sqr=function(t){return this.mul(t,t)},M.prototype.sqrt=function(t){if(t.isZero())return t.clone();var e=this.m.andln(3);if(n(e%2==1),3===e){var r=this.m.add(new o(1)).iushrn(2);return this.pow(t,r)}for(var i=this.m.subn(1),a=0;!i.isZero()&&0===i.andln(1);)a++,i.iushrn(1);n(!i.isZero());var s=new o(1).toRed(this),u=s.redNeg(),f=this.m.subn(1).iushrn(1),c=this.m.bitLength();for(c=new o(2*c*c).toRed(this);0!==this.pow(c,f).cmp(u);)c.redIAdd(u);for(var h=this.pow(c,i),d=this.pow(t,i.addn(1).iushrn(1)),l=this.pow(t,i),p=a;0!==l.cmp(s);){for(var b=l,m=0;0!==b.cmp(s);m++)b=b.redSqr();n(m=0;n--){for(var f=e.words[n],c=u-1;c>=0;c--){var h=f>>c&1;i!==r[0]&&(i=this.sqr(i)),0!==h||0!==a?(a<<=1,a|=h,(4===++s||0===n&&0===c)&&(i=this.mul(i,r[a]),s=0,a=0)):s=0}u=26}return i},M.prototype.convertTo=function(t){var e=t.umod(this.m);return e===t?e.clone():e},M.prototype.convertFrom=function(t){var e=t.clone();return e.red=null,e},o.mont=function(t){return new x(t)},i(x,M),x.prototype.convertTo=function(t){return this.imod(t.ushln(this.shift))},x.prototype.convertFrom=function(t){var e=this.imod(t.mul(this.rinv));return e.red=null,e},x.prototype.imul=function(t,e){if(t.isZero()||e.isZero())return t.words[0]=0,t.length=1,t;var r=t.imul(e),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),o=i;return i.cmp(this.m)>=0?o=i.isub(this.m):i.cmpn(0)<0&&(o=i.iadd(this.m)),o._forceRed(this)},x.prototype.mul=function(t,e){if(t.isZero()||e.isZero())return new o(0)._forceRed(this);var r=t.mul(e),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),a=i;return i.cmp(this.m)>=0?a=i.isub(this.m):i.cmpn(0)<0&&(a=i.iadd(this.m)),a._forceRed(this)},x.prototype.invm=function(t){return this.imod(t._invmp(this.m).mul(this.r2))._forceRed(this)}}(void 0===e||e,this)},{}],211:[function(t,e,r){arguments[4][178][0].apply(r,arguments)},{dup:178}],212:[function(t,e,r){var n=t("underscore"),i=t("web3-utils"),o=t("bn.js"),a=t("./param"),s=function(t){return n.isNumber(t)&&(t=Math.trunc(t)),new a(i.toTwosComplement(t).replace("0x",""))};e.exports={formatInputInt:s,formatInputBytes:function(t){if(!i.isHexStrict(t))throw new Error('Given parameter is not bytes: "'+t+'"');var e=t.replace(/^0x/i,"");if(e.length%2!=0)throw new Error('Given parameter bytes has an invalid length: "'+t+'"');if(e.length>64)throw new Error('Given parameter bytes is too long: "'+t+'"');var r=Math.floor((e.length+63)/64);return e=i.padRight(e,64*r),new a(e)},formatInputDynamicBytes:function(t){if(!i.isHexStrict(t))throw new Error('Given parameter is not bytes: "'+t+'"');var e=t.replace(/^0x/i,"");if(e.length%2!=0)throw new Error('Given parameter bytes has an invalid length: "'+t+'"');var r=e.length/2,n=Math.floor((e.length+63)/64);return e=i.padRight(e,64*n),new a(s(r).value+e)},formatInputString:function(t){if(!n.isString(t))throw new Error("Given parameter is not a valid string: "+t);var e=i.utf8ToHex(t).replace(/^0x/i,""),r=e.length/2,o=Math.floor((e.length+63)/64);return e=i.padRight(e,64*o),new a(s(r).value+e)},formatInputBool:function(t){return new a("000000000000000000000000000000000000000000000000000000000000000"+(t?"1":"0"))},formatOutputInt:function(t){var e=t.staticPart();if(!e&&!t.rawValue)throw new Error("Couldn't decode "+name+" from ABI: 0x"+t.rawValue);return"1"===new o(e.substr(0,1),16).toString(2).substr(0,1)?new o(e,16).fromTwos(256).toString(10):new o(e,16).toString(10)},formatOutputUInt:function(t,e){var r=t.staticPart();if(!r&&!t.rawValue)throw new Error("Couldn't decode "+e+" from ABI: 0x"+t.rawValue);return new o(r,16).toString(10)},formatOutputBool:function(t,e){var r=t.staticPart();if(!r&&!t.rawValue)throw new Error("Couldn't decode "+e+" from ABI: 0x"+t.rawValue);return"0000000000000000000000000000000000000000000000000000000000000001"===r},formatOutputBytes:function(t,e){var r=e.match(/^bytes([0-9]*)/),n=parseInt(r[1]);if(t.staticPart().slice(0,2*n).length!==2*n)throw new Error("Couldn't decode "+e+" from ABI: 0x"+t.rawValue+" The size doesn't match.");return"0x"+t.staticPart().slice(0,2*n)},formatOutputDynamicBytes:function(t,e){var r=t.dynamicPart().slice(0,64);if(!r)throw new Error("Couldn't decode "+e+" from ABI: 0x"+t.rawValue);var n=2*new o(r,16).toNumber();return"0x"+t.dynamicPart().substr(64,n)},formatOutputString:function(t){var e=t.dynamicPart().slice(0,64);if(!e)throw new Error("ERROR: The returned value is not a convertible string:"+e);var r=2*new o(e,16).toNumber();return r?i.hexToUtf8("0x"+t.dynamicPart().substr(64,r).replace(/^0x/i,"")):""},formatOutputAddress:function(t,e){var r=t.staticPart();if(!r)throw new Error("Couldn't decode "+e+" from ABI: 0x"+t.rawValue);return i.toChecksumAddress("0x"+r.slice(r.length-40,r.length))},toTwosComplement:i.toTwosComplement}},{"./param":214,"bn.js":210,underscore:211,"web3-utils":393}],213:[function(t,e,r){var n=t("underscore"),i=t("web3-utils"),o=t("./formatters"),a=t("./types/address"),s=t("./types/bool"),u=t("./types/int"),f=t("./types/uint"),c=t("./types/dynamicbytes"),h=t("./types/string"),d=t("./types/bytes"),l=function(t,e){return t.isDynamicType(e)||t.isDynamicArray(e)};function p(){}var b=function(t){this._types=t};b.prototype._requireType=function(t){var e=this._types.filter(function(e){return e.isType(t)})[0];if(!e)throw Error("Invalid solidity type: "+t);return e},b.prototype._getOffsets=function(t,e){for(var r=e.map(function(e,r){return e.staticPartLength(t[r])}),n=1;n=49&&a<=54?a-49+10:a>=17&&a<=22?a-17+10:15&a}return n}function u(t,e,r,n){for(var i=0,o=Math.min(t.length,r),a=e;a=49?s-49+10:s>=17?s-17+10:s}return i}o.isBN=function(t){return t instanceof o||null!==t&&"object"===(void 0===t?"undefined":_typeof(t))&&t.constructor.wordSize===o.wordSize&&Array.isArray(t.words)},o.max=function(t,e){return t.cmp(e)>0?t:e},o.min=function(t,e){return t.cmp(e)<0?t:e},o.prototype._init=function(t,e,r){if("number"==typeof t)return this._initNumber(t,e,r);if("object"===(void 0===t?"undefined":_typeof(t)))return this._initArray(t,e,r);"hex"===e&&(e=16),n(e===(0|e)&&e>=2&&e<=36);var i=0;"-"===(t=t.toString().replace(/\s+/g,""))[0]&&i++,16===e?this._parseHex(t,i):this._parseBase(t,e,i),"-"===t[0]&&(this.negative=1),this.strip(),"le"===r&&this._initArray(this.toArray(),e,r)},o.prototype._initNumber=function(t,e,r){t<0&&(this.negative=1,t=-t),t<67108864?(this.words=[67108863&t],this.length=1):t<4503599627370496?(this.words=[67108863&t,t/67108864&67108863],this.length=2):(n(t<9007199254740992),this.words=[67108863&t,t/67108864&67108863,1],this.length=3),"le"===r&&this._initArray(this.toArray(),e,r)},o.prototype._initArray=function(t,e,r){if(n("number"==typeof t.length),t.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(t.length/3),this.words=new Array(this.length);for(var i=0;i=0;i-=3)a=t[i]|t[i-1]<<8|t[i-2]<<16,this.words[o]|=a<>>26-s&67108863,(s+=24)>=26&&(s-=26,o++);else if("le"===r)for(i=0,o=0;i>>26-s&67108863,(s+=24)>=26&&(s-=26,o++);return this.strip()},o.prototype._parseHex=function(t,e){this.length=Math.ceil((t.length-e)/6),this.words=new Array(this.length);for(var r=0;r=e;r-=6)i=s(t,r,r+6),this.words[n]|=i<>>26-o&4194303,(o+=24)>=26&&(o-=26,n++);r+6!==e&&(i=s(t,e,r+6),this.words[n]|=i<>>26-o&4194303),this.strip()},o.prototype._parseBase=function(t,e,r){this.words=[0],this.length=1;for(var n=0,i=1;i<=67108863;i*=e)n++;n--,i=i/e|0;for(var o=t.length-r,a=o%n,s=Math.min(o,o-a)+r,f=0,c=r;c1&&0===this.words[this.length-1];)this.length--;return this._normSign()},o.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},o.prototype.inspect=function(){return(this.red?""};var f=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],c=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],h=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];function d(t,e,r){r.negative=e.negative^t.negative;var n=t.length+e.length|0;r.length=n,n=n-1|0;var i=0|t.words[0],o=0|e.words[0],a=i*o,s=67108863&a,u=a/67108864|0;r.words[0]=s;for(var f=1;f>>26,h=67108863&u,d=Math.min(f,e.length-1),l=Math.max(0,f-t.length+1);l<=d;l++){var p=f-l|0;c+=(a=(i=0|t.words[p])*(o=0|e.words[l])+h)/67108864|0,h=67108863&a}r.words[f]=0|h,u=0|c}return 0!==u?r.words[f]=0|u:r.length--,r.strip()}o.prototype.toString=function(t,e){var r;if(e=0|e||1,16===(t=t||10)||"hex"===t){r="";for(var i=0,o=0,a=0;a>>24-i&16777215)||a!==this.length-1?f[6-u.length]+u+r:u+r,(i+=2)>=26&&(i-=26,a--)}for(0!==o&&(r=o.toString(16)+r);r.length%e!=0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}if(t===(0|t)&&t>=2&&t<=36){var d=c[t],l=h[t];r="";var p=this.clone();for(p.negative=0;!p.isZero();){var b=p.modn(l).toString(t);r=(p=p.idivn(l)).isZero()?b+r:f[d-b.length]+b+r}for(this.isZero()&&(r="0"+r);r.length%e!=0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}n(!1,"Base should be between 2 and 36")},o.prototype.toNumber=function(){var t=this.words[0];return 2===this.length?t+=67108864*this.words[1]:3===this.length&&1===this.words[2]?t+=4503599627370496+67108864*this.words[1]:this.length>2&&n(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-t:t},o.prototype.toJSON=function(){return this.toString(16)},o.prototype.toBuffer=function(t,e){return n(void 0!==a),this.toArrayLike(a,t,e)},o.prototype.toArray=function(t,e){return this.toArrayLike(Array,t,e)},o.prototype.toArrayLike=function(t,e,r){var i=this.byteLength(),o=r||Math.max(1,i);n(i<=o,"byte array longer than desired length"),n(o>0,"Requested array length <= 0"),this.strip();var a,s,u="le"===e,f=new t(o),c=this.clone();if(u){for(s=0;!c.isZero();s++)a=c.andln(255),c.iushrn(8),f[s]=a;for(;s=4096&&(r+=13,e>>>=13),e>=64&&(r+=7,e>>>=7),e>=8&&(r+=4,e>>>=4),e>=2&&(r+=2,e>>>=2),r+e},o.prototype._zeroBits=function(t){if(0===t)return 26;var e=t,r=0;return 0==(8191&e)&&(r+=13,e>>>=13),0==(127&e)&&(r+=7,e>>>=7),0==(15&e)&&(r+=4,e>>>=4),0==(3&e)&&(r+=2,e>>>=2),0==(1&e)&&r++,r},o.prototype.bitLength=function(){var t=this.words[this.length-1],e=this._countBits(t);return 26*(this.length-1)+e},o.prototype.zeroBits=function(){if(this.isZero())return 0;for(var t=0,e=0;et.length?this.clone().ior(t):t.clone().ior(this)},o.prototype.uor=function(t){return this.length>t.length?this.clone().iuor(t):t.clone().iuor(this)},o.prototype.iuand=function(t){var e;e=this.length>t.length?t:this;for(var r=0;rt.length?this.clone().iand(t):t.clone().iand(this)},o.prototype.uand=function(t){return this.length>t.length?this.clone().iuand(t):t.clone().iuand(this)},o.prototype.iuxor=function(t){var e,r;this.length>t.length?(e=this,r=t):(e=t,r=this);for(var n=0;nt.length?this.clone().ixor(t):t.clone().ixor(this)},o.prototype.uxor=function(t){return this.length>t.length?this.clone().iuxor(t):t.clone().iuxor(this)},o.prototype.inotn=function(t){n("number"==typeof t&&t>=0);var e=0|Math.ceil(t/26),r=t%26;this._expand(e),r>0&&e--;for(var i=0;i0&&(this.words[i]=~this.words[i]&67108863>>26-r),this.strip()},o.prototype.notn=function(t){return this.clone().inotn(t)},o.prototype.setn=function(t,e){n("number"==typeof t&&t>=0);var r=t/26|0,i=t%26;return this._expand(r+1),this.words[r]=e?this.words[r]|1<t.length?(r=this,n=t):(r=t,n=this);for(var i=0,o=0;o>>26;for(;0!==i&&o>>26;if(this.length=r.length,0!==i)this.words[this.length]=i,this.length++;else if(r!==this)for(;ot.length?this.clone().iadd(t):t.clone().iadd(this)},o.prototype.isub=function(t){if(0!==t.negative){t.negative=0;var e=this.iadd(t);return t.negative=1,e._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(t),this.negative=1,this._normSign();var r,n,i=this.cmp(t);if(0===i)return this.negative=0,this.length=1,this.words[0]=0,this;i>0?(r=this,n=t):(r=t,n=this);for(var o=0,a=0;a>26,this.words[a]=67108863&e;for(;0!==o&&a>26,this.words[a]=67108863&e;if(0===o&&a>>13,l=0|a[1],p=8191&l,b=l>>>13,m=0|a[2],y=8191&m,v=m>>>13,g=0|a[3],w=8191&g,_=g>>>13,M=0|a[4],x=8191&M,k=M>>>13,S=0|a[5],E=8191&S,A=S>>>13,j=0|a[6],I=8191&j,B=j>>>13,T=0|a[7],C=8191&T,P=T>>>13,R=0|a[8],O=8191&R,N=R>>>13,L=0|a[9],F=8191&L,q=L>>>13,D=0|s[0],U=8191&D,z=D>>>13,K=0|s[1],H=8191&K,V=K>>>13,W=0|s[2],X=8191&W,G=W>>>13,J=0|s[3],Z=8191&J,$=J>>>13,Y=0|s[4],Q=8191&Y,tt=Y>>>13,et=0|s[5],rt=8191&et,nt=et>>>13,it=0|s[6],ot=8191&it,at=it>>>13,st=0|s[7],ut=8191&st,ft=st>>>13,ct=0|s[8],ht=8191&ct,dt=ct>>>13,lt=0|s[9],pt=8191<,bt=lt>>>13;r.negative=t.negative^e.negative,r.length=19;var mt=(f+(n=Math.imul(h,U))|0)+((8191&(i=(i=Math.imul(h,z))+Math.imul(d,U)|0))<<13)|0;f=((o=Math.imul(d,z))+(i>>>13)|0)+(mt>>>26)|0,mt&=67108863,n=Math.imul(p,U),i=(i=Math.imul(p,z))+Math.imul(b,U)|0,o=Math.imul(b,z);var yt=(f+(n=n+Math.imul(h,H)|0)|0)+((8191&(i=(i=i+Math.imul(h,V)|0)+Math.imul(d,H)|0))<<13)|0;f=((o=o+Math.imul(d,V)|0)+(i>>>13)|0)+(yt>>>26)|0,yt&=67108863,n=Math.imul(y,U),i=(i=Math.imul(y,z))+Math.imul(v,U)|0,o=Math.imul(v,z),n=n+Math.imul(p,H)|0,i=(i=i+Math.imul(p,V)|0)+Math.imul(b,H)|0,o=o+Math.imul(b,V)|0;var vt=(f+(n=n+Math.imul(h,X)|0)|0)+((8191&(i=(i=i+Math.imul(h,G)|0)+Math.imul(d,X)|0))<<13)|0;f=((o=o+Math.imul(d,G)|0)+(i>>>13)|0)+(vt>>>26)|0,vt&=67108863,n=Math.imul(w,U),i=(i=Math.imul(w,z))+Math.imul(_,U)|0,o=Math.imul(_,z),n=n+Math.imul(y,H)|0,i=(i=i+Math.imul(y,V)|0)+Math.imul(v,H)|0,o=o+Math.imul(v,V)|0,n=n+Math.imul(p,X)|0,i=(i=i+Math.imul(p,G)|0)+Math.imul(b,X)|0,o=o+Math.imul(b,G)|0;var gt=(f+(n=n+Math.imul(h,Z)|0)|0)+((8191&(i=(i=i+Math.imul(h,$)|0)+Math.imul(d,Z)|0))<<13)|0;f=((o=o+Math.imul(d,$)|0)+(i>>>13)|0)+(gt>>>26)|0,gt&=67108863,n=Math.imul(x,U),i=(i=Math.imul(x,z))+Math.imul(k,U)|0,o=Math.imul(k,z),n=n+Math.imul(w,H)|0,i=(i=i+Math.imul(w,V)|0)+Math.imul(_,H)|0,o=o+Math.imul(_,V)|0,n=n+Math.imul(y,X)|0,i=(i=i+Math.imul(y,G)|0)+Math.imul(v,X)|0,o=o+Math.imul(v,G)|0,n=n+Math.imul(p,Z)|0,i=(i=i+Math.imul(p,$)|0)+Math.imul(b,Z)|0,o=o+Math.imul(b,$)|0;var wt=(f+(n=n+Math.imul(h,Q)|0)|0)+((8191&(i=(i=i+Math.imul(h,tt)|0)+Math.imul(d,Q)|0))<<13)|0;f=((o=o+Math.imul(d,tt)|0)+(i>>>13)|0)+(wt>>>26)|0,wt&=67108863,n=Math.imul(E,U),i=(i=Math.imul(E,z))+Math.imul(A,U)|0,o=Math.imul(A,z),n=n+Math.imul(x,H)|0,i=(i=i+Math.imul(x,V)|0)+Math.imul(k,H)|0,o=o+Math.imul(k,V)|0,n=n+Math.imul(w,X)|0,i=(i=i+Math.imul(w,G)|0)+Math.imul(_,X)|0,o=o+Math.imul(_,G)|0,n=n+Math.imul(y,Z)|0,i=(i=i+Math.imul(y,$)|0)+Math.imul(v,Z)|0,o=o+Math.imul(v,$)|0,n=n+Math.imul(p,Q)|0,i=(i=i+Math.imul(p,tt)|0)+Math.imul(b,Q)|0,o=o+Math.imul(b,tt)|0;var _t=(f+(n=n+Math.imul(h,rt)|0)|0)+((8191&(i=(i=i+Math.imul(h,nt)|0)+Math.imul(d,rt)|0))<<13)|0;f=((o=o+Math.imul(d,nt)|0)+(i>>>13)|0)+(_t>>>26)|0,_t&=67108863,n=Math.imul(I,U),i=(i=Math.imul(I,z))+Math.imul(B,U)|0,o=Math.imul(B,z),n=n+Math.imul(E,H)|0,i=(i=i+Math.imul(E,V)|0)+Math.imul(A,H)|0,o=o+Math.imul(A,V)|0,n=n+Math.imul(x,X)|0,i=(i=i+Math.imul(x,G)|0)+Math.imul(k,X)|0,o=o+Math.imul(k,G)|0,n=n+Math.imul(w,Z)|0,i=(i=i+Math.imul(w,$)|0)+Math.imul(_,Z)|0,o=o+Math.imul(_,$)|0,n=n+Math.imul(y,Q)|0,i=(i=i+Math.imul(y,tt)|0)+Math.imul(v,Q)|0,o=o+Math.imul(v,tt)|0,n=n+Math.imul(p,rt)|0,i=(i=i+Math.imul(p,nt)|0)+Math.imul(b,rt)|0,o=o+Math.imul(b,nt)|0;var Mt=(f+(n=n+Math.imul(h,ot)|0)|0)+((8191&(i=(i=i+Math.imul(h,at)|0)+Math.imul(d,ot)|0))<<13)|0;f=((o=o+Math.imul(d,at)|0)+(i>>>13)|0)+(Mt>>>26)|0,Mt&=67108863,n=Math.imul(C,U),i=(i=Math.imul(C,z))+Math.imul(P,U)|0,o=Math.imul(P,z),n=n+Math.imul(I,H)|0,i=(i=i+Math.imul(I,V)|0)+Math.imul(B,H)|0,o=o+Math.imul(B,V)|0,n=n+Math.imul(E,X)|0,i=(i=i+Math.imul(E,G)|0)+Math.imul(A,X)|0,o=o+Math.imul(A,G)|0,n=n+Math.imul(x,Z)|0,i=(i=i+Math.imul(x,$)|0)+Math.imul(k,Z)|0,o=o+Math.imul(k,$)|0,n=n+Math.imul(w,Q)|0,i=(i=i+Math.imul(w,tt)|0)+Math.imul(_,Q)|0,o=o+Math.imul(_,tt)|0,n=n+Math.imul(y,rt)|0,i=(i=i+Math.imul(y,nt)|0)+Math.imul(v,rt)|0,o=o+Math.imul(v,nt)|0,n=n+Math.imul(p,ot)|0,i=(i=i+Math.imul(p,at)|0)+Math.imul(b,ot)|0,o=o+Math.imul(b,at)|0;var xt=(f+(n=n+Math.imul(h,ut)|0)|0)+((8191&(i=(i=i+Math.imul(h,ft)|0)+Math.imul(d,ut)|0))<<13)|0;f=((o=o+Math.imul(d,ft)|0)+(i>>>13)|0)+(xt>>>26)|0,xt&=67108863,n=Math.imul(O,U),i=(i=Math.imul(O,z))+Math.imul(N,U)|0,o=Math.imul(N,z),n=n+Math.imul(C,H)|0,i=(i=i+Math.imul(C,V)|0)+Math.imul(P,H)|0,o=o+Math.imul(P,V)|0,n=n+Math.imul(I,X)|0,i=(i=i+Math.imul(I,G)|0)+Math.imul(B,X)|0,o=o+Math.imul(B,G)|0,n=n+Math.imul(E,Z)|0,i=(i=i+Math.imul(E,$)|0)+Math.imul(A,Z)|0,o=o+Math.imul(A,$)|0,n=n+Math.imul(x,Q)|0,i=(i=i+Math.imul(x,tt)|0)+Math.imul(k,Q)|0,o=o+Math.imul(k,tt)|0,n=n+Math.imul(w,rt)|0,i=(i=i+Math.imul(w,nt)|0)+Math.imul(_,rt)|0,o=o+Math.imul(_,nt)|0,n=n+Math.imul(y,ot)|0,i=(i=i+Math.imul(y,at)|0)+Math.imul(v,ot)|0,o=o+Math.imul(v,at)|0,n=n+Math.imul(p,ut)|0,i=(i=i+Math.imul(p,ft)|0)+Math.imul(b,ut)|0,o=o+Math.imul(b,ft)|0;var kt=(f+(n=n+Math.imul(h,ht)|0)|0)+((8191&(i=(i=i+Math.imul(h,dt)|0)+Math.imul(d,ht)|0))<<13)|0;f=((o=o+Math.imul(d,dt)|0)+(i>>>13)|0)+(kt>>>26)|0,kt&=67108863,n=Math.imul(F,U),i=(i=Math.imul(F,z))+Math.imul(q,U)|0,o=Math.imul(q,z),n=n+Math.imul(O,H)|0,i=(i=i+Math.imul(O,V)|0)+Math.imul(N,H)|0,o=o+Math.imul(N,V)|0,n=n+Math.imul(C,X)|0,i=(i=i+Math.imul(C,G)|0)+Math.imul(P,X)|0,o=o+Math.imul(P,G)|0,n=n+Math.imul(I,Z)|0,i=(i=i+Math.imul(I,$)|0)+Math.imul(B,Z)|0,o=o+Math.imul(B,$)|0,n=n+Math.imul(E,Q)|0,i=(i=i+Math.imul(E,tt)|0)+Math.imul(A,Q)|0,o=o+Math.imul(A,tt)|0,n=n+Math.imul(x,rt)|0,i=(i=i+Math.imul(x,nt)|0)+Math.imul(k,rt)|0,o=o+Math.imul(k,nt)|0,n=n+Math.imul(w,ot)|0,i=(i=i+Math.imul(w,at)|0)+Math.imul(_,ot)|0,o=o+Math.imul(_,at)|0,n=n+Math.imul(y,ut)|0,i=(i=i+Math.imul(y,ft)|0)+Math.imul(v,ut)|0,o=o+Math.imul(v,ft)|0,n=n+Math.imul(p,ht)|0,i=(i=i+Math.imul(p,dt)|0)+Math.imul(b,ht)|0,o=o+Math.imul(b,dt)|0;var St=(f+(n=n+Math.imul(h,pt)|0)|0)+((8191&(i=(i=i+Math.imul(h,bt)|0)+Math.imul(d,pt)|0))<<13)|0;f=((o=o+Math.imul(d,bt)|0)+(i>>>13)|0)+(St>>>26)|0,St&=67108863,n=Math.imul(F,H),i=(i=Math.imul(F,V))+Math.imul(q,H)|0,o=Math.imul(q,V),n=n+Math.imul(O,X)|0,i=(i=i+Math.imul(O,G)|0)+Math.imul(N,X)|0,o=o+Math.imul(N,G)|0,n=n+Math.imul(C,Z)|0,i=(i=i+Math.imul(C,$)|0)+Math.imul(P,Z)|0,o=o+Math.imul(P,$)|0,n=n+Math.imul(I,Q)|0,i=(i=i+Math.imul(I,tt)|0)+Math.imul(B,Q)|0,o=o+Math.imul(B,tt)|0,n=n+Math.imul(E,rt)|0,i=(i=i+Math.imul(E,nt)|0)+Math.imul(A,rt)|0,o=o+Math.imul(A,nt)|0,n=n+Math.imul(x,ot)|0,i=(i=i+Math.imul(x,at)|0)+Math.imul(k,ot)|0,o=o+Math.imul(k,at)|0,n=n+Math.imul(w,ut)|0,i=(i=i+Math.imul(w,ft)|0)+Math.imul(_,ut)|0,o=o+Math.imul(_,ft)|0,n=n+Math.imul(y,ht)|0,i=(i=i+Math.imul(y,dt)|0)+Math.imul(v,ht)|0,o=o+Math.imul(v,dt)|0;var Et=(f+(n=n+Math.imul(p,pt)|0)|0)+((8191&(i=(i=i+Math.imul(p,bt)|0)+Math.imul(b,pt)|0))<<13)|0;f=((o=o+Math.imul(b,bt)|0)+(i>>>13)|0)+(Et>>>26)|0,Et&=67108863,n=Math.imul(F,X),i=(i=Math.imul(F,G))+Math.imul(q,X)|0,o=Math.imul(q,G),n=n+Math.imul(O,Z)|0,i=(i=i+Math.imul(O,$)|0)+Math.imul(N,Z)|0,o=o+Math.imul(N,$)|0,n=n+Math.imul(C,Q)|0,i=(i=i+Math.imul(C,tt)|0)+Math.imul(P,Q)|0,o=o+Math.imul(P,tt)|0,n=n+Math.imul(I,rt)|0,i=(i=i+Math.imul(I,nt)|0)+Math.imul(B,rt)|0,o=o+Math.imul(B,nt)|0,n=n+Math.imul(E,ot)|0,i=(i=i+Math.imul(E,at)|0)+Math.imul(A,ot)|0,o=o+Math.imul(A,at)|0,n=n+Math.imul(x,ut)|0,i=(i=i+Math.imul(x,ft)|0)+Math.imul(k,ut)|0,o=o+Math.imul(k,ft)|0,n=n+Math.imul(w,ht)|0,i=(i=i+Math.imul(w,dt)|0)+Math.imul(_,ht)|0,o=o+Math.imul(_,dt)|0;var At=(f+(n=n+Math.imul(y,pt)|0)|0)+((8191&(i=(i=i+Math.imul(y,bt)|0)+Math.imul(v,pt)|0))<<13)|0;f=((o=o+Math.imul(v,bt)|0)+(i>>>13)|0)+(At>>>26)|0,At&=67108863,n=Math.imul(F,Z),i=(i=Math.imul(F,$))+Math.imul(q,Z)|0,o=Math.imul(q,$),n=n+Math.imul(O,Q)|0,i=(i=i+Math.imul(O,tt)|0)+Math.imul(N,Q)|0,o=o+Math.imul(N,tt)|0,n=n+Math.imul(C,rt)|0,i=(i=i+Math.imul(C,nt)|0)+Math.imul(P,rt)|0,o=o+Math.imul(P,nt)|0,n=n+Math.imul(I,ot)|0,i=(i=i+Math.imul(I,at)|0)+Math.imul(B,ot)|0,o=o+Math.imul(B,at)|0,n=n+Math.imul(E,ut)|0,i=(i=i+Math.imul(E,ft)|0)+Math.imul(A,ut)|0,o=o+Math.imul(A,ft)|0,n=n+Math.imul(x,ht)|0,i=(i=i+Math.imul(x,dt)|0)+Math.imul(k,ht)|0,o=o+Math.imul(k,dt)|0;var jt=(f+(n=n+Math.imul(w,pt)|0)|0)+((8191&(i=(i=i+Math.imul(w,bt)|0)+Math.imul(_,pt)|0))<<13)|0;f=((o=o+Math.imul(_,bt)|0)+(i>>>13)|0)+(jt>>>26)|0,jt&=67108863,n=Math.imul(F,Q),i=(i=Math.imul(F,tt))+Math.imul(q,Q)|0,o=Math.imul(q,tt),n=n+Math.imul(O,rt)|0,i=(i=i+Math.imul(O,nt)|0)+Math.imul(N,rt)|0,o=o+Math.imul(N,nt)|0,n=n+Math.imul(C,ot)|0,i=(i=i+Math.imul(C,at)|0)+Math.imul(P,ot)|0,o=o+Math.imul(P,at)|0,n=n+Math.imul(I,ut)|0,i=(i=i+Math.imul(I,ft)|0)+Math.imul(B,ut)|0,o=o+Math.imul(B,ft)|0,n=n+Math.imul(E,ht)|0,i=(i=i+Math.imul(E,dt)|0)+Math.imul(A,ht)|0,o=o+Math.imul(A,dt)|0;var It=(f+(n=n+Math.imul(x,pt)|0)|0)+((8191&(i=(i=i+Math.imul(x,bt)|0)+Math.imul(k,pt)|0))<<13)|0;f=((o=o+Math.imul(k,bt)|0)+(i>>>13)|0)+(It>>>26)|0,It&=67108863,n=Math.imul(F,rt),i=(i=Math.imul(F,nt))+Math.imul(q,rt)|0,o=Math.imul(q,nt),n=n+Math.imul(O,ot)|0,i=(i=i+Math.imul(O,at)|0)+Math.imul(N,ot)|0,o=o+Math.imul(N,at)|0,n=n+Math.imul(C,ut)|0,i=(i=i+Math.imul(C,ft)|0)+Math.imul(P,ut)|0,o=o+Math.imul(P,ft)|0,n=n+Math.imul(I,ht)|0,i=(i=i+Math.imul(I,dt)|0)+Math.imul(B,ht)|0,o=o+Math.imul(B,dt)|0;var Bt=(f+(n=n+Math.imul(E,pt)|0)|0)+((8191&(i=(i=i+Math.imul(E,bt)|0)+Math.imul(A,pt)|0))<<13)|0;f=((o=o+Math.imul(A,bt)|0)+(i>>>13)|0)+(Bt>>>26)|0,Bt&=67108863,n=Math.imul(F,ot),i=(i=Math.imul(F,at))+Math.imul(q,ot)|0,o=Math.imul(q,at),n=n+Math.imul(O,ut)|0,i=(i=i+Math.imul(O,ft)|0)+Math.imul(N,ut)|0,o=o+Math.imul(N,ft)|0,n=n+Math.imul(C,ht)|0,i=(i=i+Math.imul(C,dt)|0)+Math.imul(P,ht)|0,o=o+Math.imul(P,dt)|0;var Tt=(f+(n=n+Math.imul(I,pt)|0)|0)+((8191&(i=(i=i+Math.imul(I,bt)|0)+Math.imul(B,pt)|0))<<13)|0;f=((o=o+Math.imul(B,bt)|0)+(i>>>13)|0)+(Tt>>>26)|0,Tt&=67108863,n=Math.imul(F,ut),i=(i=Math.imul(F,ft))+Math.imul(q,ut)|0,o=Math.imul(q,ft),n=n+Math.imul(O,ht)|0,i=(i=i+Math.imul(O,dt)|0)+Math.imul(N,ht)|0,o=o+Math.imul(N,dt)|0;var Ct=(f+(n=n+Math.imul(C,pt)|0)|0)+((8191&(i=(i=i+Math.imul(C,bt)|0)+Math.imul(P,pt)|0))<<13)|0;f=((o=o+Math.imul(P,bt)|0)+(i>>>13)|0)+(Ct>>>26)|0,Ct&=67108863,n=Math.imul(F,ht),i=(i=Math.imul(F,dt))+Math.imul(q,ht)|0,o=Math.imul(q,dt);var Pt=(f+(n=n+Math.imul(O,pt)|0)|0)+((8191&(i=(i=i+Math.imul(O,bt)|0)+Math.imul(N,pt)|0))<<13)|0;f=((o=o+Math.imul(N,bt)|0)+(i>>>13)|0)+(Pt>>>26)|0,Pt&=67108863;var Rt=(f+(n=Math.imul(F,pt))|0)+((8191&(i=(i=Math.imul(F,bt))+Math.imul(q,pt)|0))<<13)|0;return f=((o=Math.imul(q,bt))+(i>>>13)|0)+(Rt>>>26)|0,Rt&=67108863,u[0]=mt,u[1]=yt,u[2]=vt,u[3]=gt,u[4]=wt,u[5]=_t,u[6]=Mt,u[7]=xt,u[8]=kt,u[9]=St,u[10]=Et,u[11]=At,u[12]=jt,u[13]=It,u[14]=Bt,u[15]=Tt,u[16]=Ct,u[17]=Pt,u[18]=Rt,0!==f&&(u[19]=f,r.length++),r};function p(t,e,r){return(new b).mulp(t,e,r)}function b(t,e){this.x=t,this.y=e}Math.imul||(l=d),o.prototype.mulTo=function(t,e){var r=this.length+t.length;return 10===this.length&&10===t.length?l(this,t,e):r<63?d(this,t,e):r<1024?function(t,e,r){r.negative=e.negative^t.negative,r.length=t.length+e.length;for(var n=0,i=0,o=0;o>>26)|0)>>>26,a&=67108863}r.words[o]=s,n=a,a=i}return 0!==n?r.words[o]=n:r.length--,r.strip()}(this,t,e):p(this,t,e)},b.prototype.makeRBT=function(t){for(var e=new Array(t),r=o.prototype._countBits(t)-1,n=0;n>=1;return n},b.prototype.permute=function(t,e,r,n,i,o){for(var a=0;a>>=1)i++;return 1<>>=13,r[2*a+1]=8191&o,o>>>=13;for(a=2*e;a>=26,e+=i/67108864|0,e+=o>>>26,this.words[r]=67108863&o}return 0!==e&&(this.words[r]=e,this.length++),this},o.prototype.muln=function(t){return this.clone().imuln(t)},o.prototype.sqr=function(){return this.mul(this)},o.prototype.isqr=function(){return this.imul(this.clone())},o.prototype.pow=function(t){var e=function(t){for(var e=new Array(t.bitLength()),r=0;r>>i}return e}(t);if(0===e.length)return new o(1);for(var r=this,n=0;n=0);var e,r=t%26,i=(t-r)/26,o=67108863>>>26-r<<26-r;if(0!==r){var a=0;for(e=0;e>>26-r}a&&(this.words[e]=a,this.length++)}if(0!==i){for(e=this.length-1;e>=0;e--)this.words[e+i]=this.words[e];for(e=0;e=0),i=e?(e-e%26)/26:0;var o=t%26,a=Math.min((t-o)/26,this.length),s=67108863^67108863>>>o<a)for(this.length-=a,f=0;f=0&&(0!==c||f>=i);f--){var h=0|this.words[f];this.words[f]=c<<26-o|h>>>o,c=h&s}return u&&0!==c&&(u.words[u.length++]=c),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},o.prototype.ishrn=function(t,e,r){return n(0===this.negative),this.iushrn(t,e,r)},o.prototype.shln=function(t){return this.clone().ishln(t)},o.prototype.ushln=function(t){return this.clone().iushln(t)},o.prototype.shrn=function(t){return this.clone().ishrn(t)},o.prototype.ushrn=function(t){return this.clone().iushrn(t)},o.prototype.testn=function(t){n("number"==typeof t&&t>=0);var e=t%26,r=(t-e)/26,i=1<=0);var e=t%26,r=(t-e)/26;if(n(0===this.negative,"imaskn works only with positive numbers"),this.length<=r)return this;if(0!==e&&r++,this.length=Math.min(r,this.length),0!==e){var i=67108863^67108863>>>e<=67108864;e++)this.words[e]-=67108864,e===this.length-1?this.words[e+1]=1:this.words[e+1]++;return this.length=Math.max(this.length,e+1),this},o.prototype.isubn=function(t){if(n("number"==typeof t),n(t<67108864),t<0)return this.iaddn(-t);if(0!==this.negative)return this.negative=0,this.iaddn(t),this.negative=1,this;if(this.words[0]-=t,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var e=0;e>26)-(u/67108864|0),this.words[i+r]=67108863&o}for(;i>26,this.words[i+r]=67108863&o;if(0===s)return this.strip();for(n(-1===s),s=0,i=0;i>26,this.words[i]=67108863&o;return this.negative=1,this.strip()},o.prototype._wordDiv=function(t,e){var r=(this.length,t.length),n=this.clone(),i=t,a=0|i.words[i.length-1];0!==(r=26-this._countBits(a))&&(i=i.ushln(r),n.iushln(r),a=0|i.words[i.length-1]);var s,u=n.length-i.length;if("mod"!==e){(s=new o(null)).length=u+1,s.words=new Array(s.length);for(var f=0;f=0;h--){var d=67108864*(0|n.words[i.length+h])+(0|n.words[i.length+h-1]);for(d=Math.min(d/a|0,67108863),n._ishlnsubmul(i,d,h);0!==n.negative;)d--,n.negative=0,n._ishlnsubmul(i,1,h),n.isZero()||(n.negative^=1);s&&(s.words[h]=d)}return s&&s.strip(),n.strip(),"div"!==e&&0!==r&&n.iushrn(r),{div:s||null,mod:n}},o.prototype.divmod=function(t,e,r){return n(!t.isZero()),this.isZero()?{div:new o(0),mod:new o(0)}:0!==this.negative&&0===t.negative?(s=this.neg().divmod(t,e),"mod"!==e&&(i=s.div.neg()),"div"!==e&&(a=s.mod.neg(),r&&0!==a.negative&&a.iadd(t)),{div:i,mod:a}):0===this.negative&&0!==t.negative?(s=this.divmod(t.neg(),e),"mod"!==e&&(i=s.div.neg()),{div:i,mod:s.mod}):0!=(this.negative&t.negative)?(s=this.neg().divmod(t.neg(),e),"div"!==e&&(a=s.mod.neg(),r&&0!==a.negative&&a.isub(t)),{div:s.div,mod:a}):t.length>this.length||this.cmp(t)<0?{div:new o(0),mod:this}:1===t.length?"div"===e?{div:this.divn(t.words[0]),mod:null}:"mod"===e?{div:null,mod:new o(this.modn(t.words[0]))}:{div:this.divn(t.words[0]),mod:new o(this.modn(t.words[0]))}:this._wordDiv(t,e);var i,a,s},o.prototype.div=function(t){return this.divmod(t,"div",!1).div},o.prototype.mod=function(t){return this.divmod(t,"mod",!1).mod},o.prototype.umod=function(t){return this.divmod(t,"mod",!0).mod},o.prototype.divRound=function(t){var e=this.divmod(t);if(e.mod.isZero())return e.div;var r=0!==e.div.negative?e.mod.isub(t):e.mod,n=t.ushrn(1),i=t.andln(1),o=r.cmp(n);return o<0||1===i&&0===o?e.div:0!==e.div.negative?e.div.isubn(1):e.div.iaddn(1)},o.prototype.modn=function(t){n(t<=67108863);for(var e=(1<<26)%t,r=0,i=this.length-1;i>=0;i--)r=(e*r+(0|this.words[i]))%t;return r},o.prototype.idivn=function(t){n(t<=67108863);for(var e=0,r=this.length-1;r>=0;r--){var i=(0|this.words[r])+67108864*e;this.words[r]=i/t|0,e=i%t}return this.strip()},o.prototype.divn=function(t){return this.clone().idivn(t)},o.prototype.egcd=function(t){n(0===t.negative),n(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var i=new o(1),a=new o(0),s=new o(0),u=new o(1),f=0;e.isEven()&&r.isEven();)e.iushrn(1),r.iushrn(1),++f;for(var c=r.clone(),h=e.clone();!e.isZero();){for(var d=0,l=1;0==(e.words[0]&l)&&d<26;++d,l<<=1);if(d>0)for(e.iushrn(d);d-- >0;)(i.isOdd()||a.isOdd())&&(i.iadd(c),a.isub(h)),i.iushrn(1),a.iushrn(1);for(var p=0,b=1;0==(r.words[0]&b)&&p<26;++p,b<<=1);if(p>0)for(r.iushrn(p);p-- >0;)(s.isOdd()||u.isOdd())&&(s.iadd(c),u.isub(h)),s.iushrn(1),u.iushrn(1);e.cmp(r)>=0?(e.isub(r),i.isub(s),a.isub(u)):(r.isub(e),s.isub(i),u.isub(a))}return{a:s,b:u,gcd:r.iushln(f)}},o.prototype._invmp=function(t){n(0===t.negative),n(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var i,a=new o(1),s=new o(0),u=r.clone();e.cmpn(1)>0&&r.cmpn(1)>0;){for(var f=0,c=1;0==(e.words[0]&c)&&f<26;++f,c<<=1);if(f>0)for(e.iushrn(f);f-- >0;)a.isOdd()&&a.iadd(u),a.iushrn(1);for(var h=0,d=1;0==(r.words[0]&d)&&h<26;++h,d<<=1);if(h>0)for(r.iushrn(h);h-- >0;)s.isOdd()&&s.iadd(u),s.iushrn(1);e.cmp(r)>=0?(e.isub(r),a.isub(s)):(r.isub(e),s.isub(a))}return(i=0===e.cmpn(1)?a:s).cmpn(0)<0&&i.iadd(t),i},o.prototype.gcd=function(t){if(this.isZero())return t.abs();if(t.isZero())return this.abs();var e=this.clone(),r=t.clone();e.negative=0,r.negative=0;for(var n=0;e.isEven()&&r.isEven();n++)e.iushrn(1),r.iushrn(1);for(;;){for(;e.isEven();)e.iushrn(1);for(;r.isEven();)r.iushrn(1);var i=e.cmp(r);if(i<0){var o=e;e=r,r=o}else if(0===i||0===r.cmpn(1))break;e.isub(r)}return r.iushln(n)},o.prototype.invm=function(t){return this.egcd(t).a.umod(t)},o.prototype.isEven=function(){return 0==(1&this.words[0])},o.prototype.isOdd=function(){return 1==(1&this.words[0])},o.prototype.andln=function(t){return this.words[0]&t},o.prototype.bincn=function(t){n("number"==typeof t);var e=t%26,r=(t-e)/26,i=1<>>26,s&=67108863,this.words[a]=s}return 0!==o&&(this.words[a]=o,this.length++),this},o.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},o.prototype.cmpn=function(t){var e,r=t<0;if(0!==this.negative&&!r)return-1;if(0===this.negative&&r)return 1;if(this.strip(),this.length>1)e=1;else{r&&(t=-t),n(t<=67108863,"Number is too big");var i=0|this.words[0];e=i===t?0:it.length)return 1;if(this.length=0;r--){var n=0|this.words[r],i=0|t.words[r];if(n!==i){ni&&(e=1);break}}return e},o.prototype.gtn=function(t){return 1===this.cmpn(t)},o.prototype.gt=function(t){return 1===this.cmp(t)},o.prototype.gten=function(t){return this.cmpn(t)>=0},o.prototype.gte=function(t){return this.cmp(t)>=0},o.prototype.ltn=function(t){return-1===this.cmpn(t)},o.prototype.lt=function(t){return-1===this.cmp(t)},o.prototype.lten=function(t){return this.cmpn(t)<=0},o.prototype.lte=function(t){return this.cmp(t)<=0},o.prototype.eqn=function(t){return 0===this.cmpn(t)},o.prototype.eq=function(t){return 0===this.cmp(t)},o.red=function(t){return new M(t)},o.prototype.toRed=function(t){return n(!this.red,"Already a number in reduction context"),n(0===this.negative,"red works only with positives"),t.convertTo(this)._forceRed(t)},o.prototype.fromRed=function(){return n(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},o.prototype._forceRed=function(t){return this.red=t,this},o.prototype.forceRed=function(t){return n(!this.red,"Already a number in reduction context"),this._forceRed(t)},o.prototype.redAdd=function(t){return n(this.red,"redAdd works only with red numbers"),this.red.add(this,t)},o.prototype.redIAdd=function(t){return n(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,t)},o.prototype.redSub=function(t){return n(this.red,"redSub works only with red numbers"),this.red.sub(this,t)},o.prototype.redISub=function(t){return n(this.red,"redISub works only with red numbers"),this.red.isub(this,t)},o.prototype.redShl=function(t){return n(this.red,"redShl works only with red numbers"),this.red.shl(this,t)},o.prototype.redMul=function(t){return n(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.mul(this,t)},o.prototype.redIMul=function(t){return n(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.imul(this,t)},o.prototype.redSqr=function(){return n(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},o.prototype.redISqr=function(){return n(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},o.prototype.redSqrt=function(){return n(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},o.prototype.redInvm=function(){return n(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},o.prototype.redNeg=function(){return n(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},o.prototype.redPow=function(t){return n(this.red&&!t.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,t)};var m={k256:null,p224:null,p192:null,p25519:null};function y(t,e){this.name=t,this.p=new o(e,16),this.n=this.p.bitLength(),this.k=new o(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function v(){y.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function g(){y.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function w(){y.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function _(){y.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function M(t){if("string"==typeof t){var e=o._prime(t);this.m=e.p,this.prime=e}else n(t.gtn(1),"modulus must be greater than 1"),this.m=t,this.prime=null}function x(t){M.call(this,t),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new o(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}y.prototype._tmp=function(){var t=new o(null);return t.words=new Array(Math.ceil(this.n/13)),t},y.prototype.ireduce=function(t){var e,r=t;do{this.split(r,this.tmp),e=(r=(r=this.imulK(r)).iadd(this.tmp)).bitLength()}while(e>this.n);var n=e0?r.isub(this.p):r.strip(),r},y.prototype.split=function(t,e){t.iushrn(this.n,0,e)},y.prototype.imulK=function(t){return t.imul(this.k)},i(v,y),v.prototype.split=function(t,e){for(var r=Math.min(t.length,9),n=0;n>>22,i=o}i>>>=22,t.words[n-10]=i,0===i&&t.length>10?t.length-=10:t.length-=9},v.prototype.imulK=function(t){t.words[t.length]=0,t.words[t.length+1]=0,t.length+=2;for(var e=0,r=0;r>>=26,t.words[r]=i,e=n}return 0!==e&&(t.words[t.length++]=e),t},o._prime=function(t){if(m[t])return m[t];var e;if("k256"===t)e=new v;else if("p224"===t)e=new g;else if("p192"===t)e=new w;else{if("p25519"!==t)throw new Error("Unknown prime "+t);e=new _}return m[t]=e,e},M.prototype._verify1=function(t){n(0===t.negative,"red works only with positives"),n(t.red,"red works only with red numbers")},M.prototype._verify2=function(t,e){n(0==(t.negative|e.negative),"red works only with positives"),n(t.red&&t.red===e.red,"red works only with red numbers")},M.prototype.imod=function(t){return this.prime?this.prime.ireduce(t)._forceRed(this):t.umod(this.m)._forceRed(this)},M.prototype.neg=function(t){return t.isZero()?t.clone():this.m.sub(t)._forceRed(this)},M.prototype.add=function(t,e){this._verify2(t,e);var r=t.add(e);return r.cmp(this.m)>=0&&r.isub(this.m),r._forceRed(this)},M.prototype.iadd=function(t,e){this._verify2(t,e);var r=t.iadd(e);return r.cmp(this.m)>=0&&r.isub(this.m),r},M.prototype.sub=function(t,e){this._verify2(t,e);var r=t.sub(e);return r.cmpn(0)<0&&r.iadd(this.m),r._forceRed(this)},M.prototype.isub=function(t,e){this._verify2(t,e);var r=t.isub(e);return r.cmpn(0)<0&&r.iadd(this.m),r},M.prototype.shl=function(t,e){return this._verify1(t),this.imod(t.ushln(e))},M.prototype.imul=function(t,e){return this._verify2(t,e),this.imod(t.imul(e))},M.prototype.mul=function(t,e){return this._verify2(t,e),this.imod(t.mul(e))},M.prototype.isqr=function(t){return this.imul(t,t.clone())},M.prototype.sqr=function(t){return this.mul(t,t)},M.prototype.sqrt=function(t){if(t.isZero())return t.clone();var e=this.m.andln(3);if(n(e%2==1),3===e){var r=this.m.add(new o(1)).iushrn(2);return this.pow(t,r)}for(var i=this.m.subn(1),a=0;!i.isZero()&&0===i.andln(1);)a++,i.iushrn(1);n(!i.isZero());var s=new o(1).toRed(this),u=s.redNeg(),f=this.m.subn(1).iushrn(1),c=this.m.bitLength();for(c=new o(2*c*c).toRed(this);0!==this.pow(c,f).cmp(u);)c.redIAdd(u);for(var h=this.pow(c,i),d=this.pow(t,i.addn(1).iushrn(1)),l=this.pow(t,i),p=a;0!==l.cmp(s);){for(var b=l,m=0;0!==b.cmp(s);m++)b=b.redSqr();n(m=0;n--){for(var f=e.words[n],c=u-1;c>=0;c--){var h=f>>c&1;i!==r[0]&&(i=this.sqr(i)),0!==h||0!==a?(a<<=1,a|=h,(4===++s||0===n&&0===c)&&(i=this.mul(i,r[a]),s=0,a=0)):s=0}u=26}return i},M.prototype.convertTo=function(t){var e=t.umod(this.m);return e===t?e.clone():e},M.prototype.convertFrom=function(t){var e=t.clone();return e.red=null,e},o.mont=function(t){return new x(t)},i(x,M),x.prototype.convertTo=function(t){return this.imod(t.ushln(this.shift))},x.prototype.convertFrom=function(t){var e=this.imod(t.mul(this.rinv));return e.red=null,e},x.prototype.imul=function(t,e){if(t.isZero()||e.isZero())return t.words[0]=0,t.length=1,t;var r=t.imul(e),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),o=i;return i.cmp(this.m)>=0?o=i.isub(this.m):i.cmpn(0)<0&&(o=i.iadd(this.m)),o._forceRed(this)},x.prototype.mul=function(t,e){if(t.isZero()||e.isZero())return new o(0)._forceRed(this);var r=t.mul(e),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),a=i;return i.cmp(this.m)>=0?a=i.isub(this.m):i.cmpn(0)<0&&(a=i.iadd(this.m)),a._forceRed(this)},x.prototype.invm=function(t){return this.imod(t._invmp(this.m).mul(this.r2))._forceRed(this)}}(void 0===e||e,this)},{buffer:17}],241:[function(t,e,r){arguments[4][16][0].apply(r,arguments)},{crypto:17,dup:16}],242:[function(t,e,r){arguments[4][18][0].apply(r,arguments)},{dup:18,"safe-buffer":350}],243:[function(t,e,r){arguments[4][19][0].apply(r,arguments)},{"./aes":242,"./ghash":247,"./incr32":248,"buffer-xor":269,"cipher-base":270,dup:19,inherits:325,"safe-buffer":350}],244:[function(t,e,r){arguments[4][20][0].apply(r,arguments)},{"./decrypter":245,"./encrypter":246,"./modes/list.json":256,dup:20}],245:[function(t,e,r){arguments[4][21][0].apply(r,arguments)},{"./aes":242,"./authCipher":243,"./modes":255,"./streamCipher":258,"cipher-base":270,dup:21,evp_bytestokey:310,inherits:325,"safe-buffer":350}],246:[function(t,e,r){arguments[4][22][0].apply(r,arguments)},{"./aes":242,"./authCipher":243,"./modes":255,"./streamCipher":258,"cipher-base":270,dup:22,evp_bytestokey:310,inherits:325,"safe-buffer":350}],247:[function(t,e,r){arguments[4][23][0].apply(r,arguments)},{dup:23,"safe-buffer":350}],248:[function(t,e,r){arguments[4][24][0].apply(r,arguments)},{dup:24}],249:[function(t,e,r){arguments[4][25][0].apply(r,arguments)},{"buffer-xor":269,dup:25}],250:[function(t,e,r){arguments[4][26][0].apply(r,arguments)},{"buffer-xor":269,dup:26,"safe-buffer":350}],251:[function(t,e,r){arguments[4][27][0].apply(r,arguments)},{dup:27,"safe-buffer":350}],252:[function(t,e,r){arguments[4][28][0].apply(r,arguments)},{dup:28,"safe-buffer":350}],253:[function(t,e,r){arguments[4][29][0].apply(r,arguments)},{"../incr32":248,"buffer-xor":269,dup:29,"safe-buffer":350}],254:[function(t,e,r){arguments[4][30][0].apply(r,arguments)},{dup:30}],255:[function(t,e,r){arguments[4][31][0].apply(r,arguments)},{"./cbc":249,"./cfb":250,"./cfb1":251,"./cfb8":252,"./ctr":253,"./ecb":254,"./list.json":256,"./ofb":257,dup:31}],256:[function(t,e,r){arguments[4][32][0].apply(r,arguments)},{dup:32}],257:[function(t,e,r){(function(e){var n=t("buffer-xor");r.encrypt=function(t,r){for(;t._cache.length=0||!r.umod(t.prime1)||!r.umod(t.prime2);)r=new n(i(e));return r}e.exports=o,o.getr=a}).call(this,t("buffer").Buffer)},{"bn.js":240,buffer:47,randombytes:347}],263:[function(t,e,r){arguments[4][39][0].apply(r,arguments)},{"./browser/algorithms.json":264,dup:39}],264:[function(t,e,r){arguments[4][40][0].apply(r,arguments)},{dup:40}],265:[function(t,e,r){arguments[4][41][0].apply(r,arguments)},{dup:41}],266:[function(t,e,r){(function(r){var n=t("create-hash"),i=t("stream"),o=t("inherits"),a=t("./sign"),s=t("./verify"),u=t("./algorithms.json");function f(t){i.Writable.call(this);var e=u[t];if(!e)throw new Error("Unknown message digest");this._hashType=e.hash,this._hash=n(e.hash),this._tag=e.id,this._signType=e.sign}function c(t){i.Writable.call(this);var e=u[t];if(!e)throw new Error("Unknown message digest");this._hash=n(e.hash),this._tag=e.id,this._signType=e.sign}function h(t){return new f(t)}function d(t){return new c(t)}Object.keys(u).forEach(function(t){u[t].id=new r(u[t].id,"hex"),u[t.toLowerCase()]=u[t]}),o(f,i.Writable),f.prototype._write=function(t,e,r){this._hash.update(t),r()},f.prototype.update=function(t,e){return"string"==typeof t&&(t=new r(t,e)),this._hash.update(t),this},f.prototype.sign=function(t,e){this.end();var r=this._hash.digest(),n=a(r,t,this._hashType,this._signType,this._tag);return e?n.toString(e):n},o(c,i.Writable),c.prototype._write=function(t,e,r){this._hash.update(t),r()},c.prototype.update=function(t,e){return"string"==typeof t&&(t=new r(t,e)),this._hash.update(t),this},c.prototype.verify=function(t,e,n){"string"==typeof e&&(e=new r(e,n)),this.end();var i=this._hash.digest();return s(e,i,t,this._signType,this._tag)},e.exports={Sign:h,Verify:d,createSign:h,createVerify:d}}).call(this,t("buffer").Buffer)},{"./algorithms.json":264,"./sign":267,"./verify":268,buffer:47,"create-hash":272,inherits:325,stream:156}],267:[function(t,e,r){(function(r){var n=t("create-hmac"),i=t("browserify-rsa"),o=t("elliptic").ec,a=t("bn.js"),s=t("parse-asn1"),u=t("./curves.json");function f(t,e,i,o){if((t=new r(t.toArray())).length0&&r.ishrn(n),r}function h(t,e,i){var o,a;do{for(o=new r(0);8*o.length=e)throw new Error("invalid sig")}e.exports=function(t,e,u,f,c){var h=o(u);if("ec"===h.type){if("ecdsa"!==f&&"ecdsa/rsa"!==f)throw new Error("wrong public key type");return function(t,e,r){var n=a[r.data.algorithm.curve.join(".")];if(!n)throw new Error("unknown curve "+r.data.algorithm.curve.join("."));var o=new i(n),s=r.data.subjectPrivateKey.data;return o.verify(e,t,s)}(t,e,h)}if("dsa"===h.type){if("dsa"!==f)throw new Error("wrong public key type");return function(t,e,r){var i=r.data.p,a=r.data.q,u=r.data.g,f=r.data.pub_key,c=o.signature.decode(t,"der"),h=c.s,d=c.r;s(h,a),s(d,a);var l=n.mont(i),p=h.invm(a);return 0===u.toRed(l).redPow(new n(e).mul(p).mod(a)).fromRed().mul(f.toRed(l).redPow(d.mul(p).mod(a)).fromRed()).mod(i).mod(a).cmp(d)}(t,e,h)}if("rsa"!==f&&"ecdsa/rsa"!==f)throw new Error("wrong public key type");e=r.concat([c,e]);for(var d=h.modulus.byteLength(),l=[1],p=0;e.length+l.length+2>>2),a=0,s=0;a=6.0.0 <7.0.0",type:"range"},"/Users/frozeman/Sites/_ethereum/web3/packages/web3-eth-accounts/node_modules/browserify-sign"]],_from:"elliptic@>=6.0.0 <7.0.0",_id:"elliptic@6.4.0",_inCache:!0,_location:"/elliptic",_nodeVersion:"7.0.0",_npmOperationalInternal:{host:"packages-18-east.internal.npmjs.com",tmp:"tmp/elliptic-6.4.0.tgz_1487798866428_0.30510620190761983"},_npmUser:{name:"indutny",email:"fedor@indutny.com"},_npmVersion:"3.10.8",_phantomChildren:{},_requested:{raw:"elliptic@^6.0.0",scope:null,escapedName:"elliptic",name:"elliptic",rawSpec:"^6.0.0",spec:">=6.0.0 <7.0.0",type:"range"},_requiredBy:["/browserify-sign","/create-ecdh","/eth-lib"],_resolved:"https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz",_shasum:"cac9af8762c85836187003c8dfe193e5e2eae5df",_shrinkwrap:null,_spec:"elliptic@^6.0.0",_where:"/Users/frozeman/Sites/_ethereum/web3/packages/web3-eth-accounts/node_modules/browserify-sign",author:{name:"Fedor Indutny",email:"fedor@indutny.com"},bugs:{url:"https://github.com/indutny/elliptic/issues"},dependencies:{"bn.js":"^4.4.0",brorand:"^1.0.1","hash.js":"^1.0.0","hmac-drbg":"^1.0.0",inherits:"^2.0.1","minimalistic-assert":"^1.0.0","minimalistic-crypto-utils":"^1.0.0"},description:"EC cryptography",devDependencies:{brfs:"^1.4.3",coveralls:"^2.11.3",grunt:"^0.4.5","grunt-browserify":"^5.0.0","grunt-cli":"^1.2.0","grunt-contrib-connect":"^1.0.0","grunt-contrib-copy":"^1.0.0","grunt-contrib-uglify":"^1.0.1","grunt-mocha-istanbul":"^3.0.1","grunt-saucelabs":"^8.6.2",istanbul:"^0.4.2",jscs:"^2.9.0",jshint:"^2.6.0",mocha:"^2.1.0"},directories:{},dist:{shasum:"cac9af8762c85836187003c8dfe193e5e2eae5df",tarball:"https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz"},files:["lib"],gitHead:"6b0d2b76caae91471649c8e21f0b1d3ba0f96090",homepage:"https://github.com/indutny/elliptic",keywords:["EC","Elliptic","curve","Cryptography"],license:"MIT",main:"lib/elliptic.js",maintainers:[{name:"indutny",email:"fedor@indutny.com"}],name:"elliptic",optionalDependencies:{},readme:"ERROR: No README data found!",repository:{type:"git",url:"git+ssh://git@github.com/indutny/elliptic.git"},scripts:{jscs:"jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js",jshint:"jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js",lint:"npm run jscs && npm run jshint",test:"npm run lint && npm run unit",unit:"istanbul test _mocha --reporter=spec test/index.js",version:"grunt dist && git add dist/"},version:"6.4.0"}},{}],304:[function(t,e,r){(function(r){var n=function(){return function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return function(t,e){var r=[],n=!0,i=!1,o=void 0;try{for(var a,s=t[Symbol.iterator]();!(n=(a=s.next()).done)&&(r.push(a.value),!e||r.length!==e);n=!0);}catch(t){i=!0,o=t}finally{try{!n&&s.return&&s.return()}finally{if(i)throw o}}return r}(t,e);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=t("./bytes"),o=t("./nat"),a=t("elliptic"),s=(t("./rlp"),new a.ec("secp256k1")),u=t("./hash"),f=u.keccak256,c=u.keccak256s,h=function(t){for(var e=c(t.slice(2)),r="0x",n=0;n<40;n++)r+=parseInt(e[n+2],16)>7?t[n+2].toUpperCase():t[n+2];return r},d=function(t){var e=new r(t.slice(2),"hex"),n="0x"+s.keyFromPrivate(e).getPublic(!1,"hex").slice(2),i=f(n);return{address:h("0x"+i.slice(-40)),privateKey:t}},l=function(t){var e=n(t,3),r=e[0],o=i.pad(32,e[1]),a=i.pad(32,e[2]);return i.flatten([o,a,r])},p=function(t){return[i.slice(64,i.length(t),t),i.slice(0,32,t),i.slice(32,64,t)]},b=function(t){return function(e,n){var a=s.keyFromPrivate(new r(n.slice(2),"hex")).sign(new r(e.slice(2),"hex"),{canonical:!0});return l([o.fromString(i.fromNumber(t+a.recoveryParam)),i.pad(32,i.fromNat("0x"+a.r.toString(16))),i.pad(32,i.fromNat("0x"+a.s.toString(16)))])}},m=b(27);e.exports={create:function(t){var e=f(i.concat(i.random(32),t||i.random(32))),r=i.concat(i.concat(i.random(32),e),i.random(32)),n=f(r);return d(n)},toChecksum:h,fromPrivate:d,sign:m,makeSigner:b,recover:function(t,e){var n=p(e),o={v:i.toNumber(n[0]),r:n[1].slice(2),s:n[2].slice(2)},a="0x"+s.recoverPubKey(new r(t.slice(2),"hex"),o,o.v<2?o.v:1-o.v%2).encode("hex",!1).slice(2),u=f(a);return h("0x"+u.slice(-40))},encodeSignature:l,decodeSignature:p}}).call(this,t("buffer").Buffer)},{"./bytes":306,"./hash":307,"./nat":308,"./rlp":309,buffer:47,elliptic:288}],305:[function(t,e,r){arguments[4][163][0].apply(r,arguments)},{dup:163}],306:[function(t,e,r){arguments[4][164][0].apply(r,arguments)},{"./array.js":305,dup:164}],307:[function(t,e,r){arguments[4][165][0].apply(r,arguments)},{dup:165}],308:[function(t,e,r){var n=t("bn.js"),i=t("./bytes"),o=function(t){return new n(t.slice(2),16)},a=function(t){var e="0x"+("0x"===t.slice(0,2)?new n(t.slice(2),16):new n(t,10)).toString("hex");return"0x0"===e?"0x":e},s=function(t){return"string"==typeof t?/^0x/.test(t)?t:"0x"+t:"0x"+new n(t).toString("hex")},u=function(t){return o(t).toNumber()},f=function(t){return function(e,r){return"0x"+o(e)[t](o(r)).toString("hex")}},c=f("add"),h=f("mul"),d=f("div"),l=f("sub");e.exports={toString:function(t){return o(t).toString(10)},fromString:a,toNumber:u,fromNumber:s,toEther:function(t){return u(d(t,a("10000000000")))/1e8},fromEther:function(t){return h(s(Math.floor(1e8*t)),a("10000000000"))},toUint256:function(t){return i.pad(32,t)},add:c,mul:h,div:d,sub:l}},{"./bytes":306,"bn.js":240}],309:[function(t,e,r){e.exports={encode:function(t){var e=function(t){return(e=t.toString(16)).length%2==0?e:"0"+e;var e},r=function(t,r){return t<56?e(r+t):e(r+e(t).length/2+55)+e(t)};return"0x"+function t(e){if("string"==typeof e){var n=e.slice(2);return(2!=n.length||n>="80"?r(n.length/2,128):"")+n}var i=e.map(t).join("");return r(i.length/2,192)+i}(t)},decode:function(t){var e=2,r=function(){if(e>=t.length)throw"";var r=t.slice(e,e+2);return r<"80"?(e+=2,"0x"+r):r<"c0"?i():o()},n=function(){var r=parseInt(t.slice(e,e+=2),16)%64;return r<56?r:parseInt(t.slice(e,e+=2*(r-55)),16)},i=function(){var r=n();return"0x"+t.slice(e,e+=2*r)},o=function(){for(var t=2*n()+e,i=[];e=this._blockSize;){for(var o=this._blockOffset;o0;++a)this._length[a]+=s,(s=this._length[a]/4294967296|0)>0&&(this._length[a]-=4294967296*s);return this},i.prototype._update=function(t){throw new Error("_update is not implemented")},i.prototype.digest=function(t){if(this._finalized)throw new Error("Digest already called");this._finalized=!0;var e=this._digest();return void 0!==t&&(e=e.toString(t)),e},i.prototype._digest=function(){throw new Error("_digest is not implemented")},e.exports=i}).call(this,t("buffer").Buffer)},{buffer:47,inherits:325,stream:156}],312:[function(t,e,r){arguments[4][86][0].apply(r,arguments)},{"./hash/common":313,"./hash/hmac":314,"./hash/ripemd":315,"./hash/sha":316,"./hash/utils":323,dup:86}],313:[function(t,e,r){arguments[4][87][0].apply(r,arguments)},{"./utils":323,dup:87,"minimalistic-assert":329}],314:[function(t,e,r){arguments[4][88][0].apply(r,arguments)},{"./utils":323,dup:88,"minimalistic-assert":329}],315:[function(t,e,r){arguments[4][89][0].apply(r,arguments)},{"./common":313,"./utils":323,dup:89}],316:[function(t,e,r){arguments[4][90][0].apply(r,arguments)},{"./sha/1":317,"./sha/224":318,"./sha/256":319,"./sha/384":320,"./sha/512":321,dup:90}],317:[function(t,e,r){arguments[4][91][0].apply(r,arguments)},{"../common":313,"../utils":323,"./common":322,dup:91}],318:[function(t,e,r){arguments[4][92][0].apply(r,arguments)},{"../utils":323,"./256":319,dup:92}],319:[function(t,e,r){arguments[4][93][0].apply(r,arguments)},{"../common":313,"../utils":323,"./common":322,dup:93,"minimalistic-assert":329}],320:[function(t,e,r){arguments[4][94][0].apply(r,arguments)},{"../utils":323,"./512":321,dup:94}],321:[function(t,e,r){arguments[4][95][0].apply(r,arguments)},{"../common":313,"../utils":323,dup:95,"minimalistic-assert":329}],322:[function(t,e,r){arguments[4][96][0].apply(r,arguments)},{"../utils":323,dup:96}],323:[function(t,e,r){arguments[4][97][0].apply(r,arguments)},{dup:97,inherits:325,"minimalistic-assert":329}],324:[function(t,e,r){arguments[4][98][0].apply(r,arguments)},{dup:98,"hash.js":312,"minimalistic-assert":329,"minimalistic-crypto-utils":330}],325:[function(t,e,r){arguments[4][101][0].apply(r,arguments)},{dup:101}],326:[function(t,e,r){(function(r){var n=t("inherits"),i=t("hash-base"),o=new Array(16);function a(){i.call(this,64),this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878}function s(t,e){return t<>>32-e}function u(t,e,r,n,i,o,a){return s(t+(e&r|~e&n)+i+o|0,a)+e|0}function f(t,e,r,n,i,o,a){return s(t+(e&n|r&~n)+i+o|0,a)+e|0}function c(t,e,r,n,i,o,a){return s(t+(e^r^n)+i+o|0,a)+e|0}function h(t,e,r,n,i,o,a){return s(t+(r^(e|~n))+i+o|0,a)+e|0}n(a,i),a.prototype._update=function(){for(var t=o,e=0;e<16;++e)t[e]=this._block.readInt32LE(4*e);var r=this._a,n=this._b,i=this._c,a=this._d;n=h(n=h(n=h(n=h(n=c(n=c(n=c(n=c(n=f(n=f(n=f(n=f(n=u(n=u(n=u(n=u(n,i=u(i,a=u(a,r=u(r,n,i,a,t[0],3614090360,7),n,i,t[1],3905402710,12),r,n,t[2],606105819,17),a,r,t[3],3250441966,22),i=u(i,a=u(a,r=u(r,n,i,a,t[4],4118548399,7),n,i,t[5],1200080426,12),r,n,t[6],2821735955,17),a,r,t[7],4249261313,22),i=u(i,a=u(a,r=u(r,n,i,a,t[8],1770035416,7),n,i,t[9],2336552879,12),r,n,t[10],4294925233,17),a,r,t[11],2304563134,22),i=u(i,a=u(a,r=u(r,n,i,a,t[12],1804603682,7),n,i,t[13],4254626195,12),r,n,t[14],2792965006,17),a,r,t[15],1236535329,22),i=f(i,a=f(a,r=f(r,n,i,a,t[1],4129170786,5),n,i,t[6],3225465664,9),r,n,t[11],643717713,14),a,r,t[0],3921069994,20),i=f(i,a=f(a,r=f(r,n,i,a,t[5],3593408605,5),n,i,t[10],38016083,9),r,n,t[15],3634488961,14),a,r,t[4],3889429448,20),i=f(i,a=f(a,r=f(r,n,i,a,t[9],568446438,5),n,i,t[14],3275163606,9),r,n,t[3],4107603335,14),a,r,t[8],1163531501,20),i=f(i,a=f(a,r=f(r,n,i,a,t[13],2850285829,5),n,i,t[2],4243563512,9),r,n,t[7],1735328473,14),a,r,t[12],2368359562,20),i=c(i,a=c(a,r=c(r,n,i,a,t[5],4294588738,4),n,i,t[8],2272392833,11),r,n,t[11],1839030562,16),a,r,t[14],4259657740,23),i=c(i,a=c(a,r=c(r,n,i,a,t[1],2763975236,4),n,i,t[4],1272893353,11),r,n,t[7],4139469664,16),a,r,t[10],3200236656,23),i=c(i,a=c(a,r=c(r,n,i,a,t[13],681279174,4),n,i,t[0],3936430074,11),r,n,t[3],3572445317,16),a,r,t[6],76029189,23),i=c(i,a=c(a,r=c(r,n,i,a,t[9],3654602809,4),n,i,t[12],3873151461,11),r,n,t[15],530742520,16),a,r,t[2],3299628645,23),i=h(i,a=h(a,r=h(r,n,i,a,t[0],4096336452,6),n,i,t[7],1126891415,10),r,n,t[14],2878612391,15),a,r,t[5],4237533241,21),i=h(i,a=h(a,r=h(r,n,i,a,t[12],1700485571,6),n,i,t[3],2399980690,10),r,n,t[10],4293915773,15),a,r,t[1],2240044497,21),i=h(i,a=h(a,r=h(r,n,i,a,t[8],1873313359,6),n,i,t[15],4264355552,10),r,n,t[6],2734768916,15),a,r,t[13],1309151649,21),i=h(i,a=h(a,r=h(r,n,i,a,t[4],4149444226,6),n,i,t[11],3174756917,10),r,n,t[2],718787259,15),a,r,t[9],3951481745,21),this._a=this._a+r|0,this._b=this._b+n|0,this._c=this._c+i|0,this._d=this._d+a|0},a.prototype._digest=function(){this._block[this._blockOffset++]=128,this._blockOffset>56&&(this._block.fill(0,this._blockOffset,64),this._update(),this._blockOffset=0),this._block.fill(0,this._blockOffset,56),this._block.writeUInt32LE(this._length[0],56),this._block.writeUInt32LE(this._length[1],60),this._update();var t=new r(16);return t.writeInt32LE(this._a,0),t.writeInt32LE(this._b,4),t.writeInt32LE(this._c,8),t.writeInt32LE(this._d,12),t},e.exports=a}).call(this,t("buffer").Buffer)},{buffer:47,"hash-base":327,inherits:325}],327:[function(t,e,r){arguments[4][105][0].apply(r,arguments)},{dup:105,inherits:325,"safe-buffer":350,stream:156}],328:[function(t,e,r){arguments[4][106][0].apply(r,arguments)},{"bn.js":240,brorand:241,dup:106}],329:[function(t,e,r){arguments[4][107][0].apply(r,arguments)},{dup:107}],330:[function(t,e,r){arguments[4][108][0].apply(r,arguments)},{dup:108}],331:[function(t,e,r){arguments[4][109][0].apply(r,arguments)},{dup:109}],332:[function(t,e,r){arguments[4][110][0].apply(r,arguments)},{"./certificate":333,"asn1.js":226,dup:110}],333:[function(t,e,r){arguments[4][111][0].apply(r,arguments)},{"asn1.js":226,dup:111}],334:[function(t,e,r){(function(r){var n=/Proc-Type: 4,ENCRYPTED\n\r?DEK-Info: AES-((?:128)|(?:192)|(?:256))-CBC,([0-9A-H]+)\n\r?\n\r?([0-9A-z\n\r\+\/\=]+)\n\r?/m,i=/^-----BEGIN ((?:.* KEY)|CERTIFICATE)-----\n/m,o=/^-----BEGIN ((?:.* KEY)|CERTIFICATE)-----\n\r?([0-9A-z\n\r\+\/\=]+)\n\r?-----END \1-----$/m,a=t("evp_bytestokey"),s=t("browserify-aes");e.exports=function(t,e){var u,f=t.toString(),c=f.match(n);if(c){var h="aes"+c[1],d=new r(c[2],"hex"),l=new r(c[3].replace(/\r?\n/g,""),"base64"),p=a(e,d.slice(0,8),parseInt(c[1],10)).key,b=[],m=s.createDecipheriv(h,p,d);b.push(m.update(l)),b.push(m.final()),u=r.concat(b)}else{var y=f.match(o);u=new r(y[2].replace(/\r?\n/g,""),"base64")}return{tag:f.match(i)[1],data:u}}}).call(this,t("buffer").Buffer)},{"browserify-aes":244,buffer:47,evp_bytestokey:310}],335:[function(t,e,r){(function(r){var n=t("./asn1"),i=t("./aesid.json"),o=t("./fixProc"),a=t("browserify-aes"),s=t("pbkdf2");function u(t){var e;"object"!==(void 0===t?"undefined":_typeof(t))||r.isBuffer(t)||(e=t.passphrase,t=t.key),"string"==typeof t&&(t=new r(t));var u,f,c,h,d,l,p,b,m,y,v,g,w,_=o(t,e),M=_.tag,x=_.data;switch(M){case"CERTIFICATE":f=n.certificate.decode(x,"der").tbsCertificate.subjectPublicKeyInfo;case"PUBLIC KEY":switch(f||(f=n.PublicKey.decode(x,"der")),u=f.algorithm.algorithm.join(".")){case"1.2.840.113549.1.1.1":return n.RSAPublicKey.decode(f.subjectPublicKey.data,"der");case"1.2.840.10045.2.1":return f.subjectPrivateKey=f.subjectPublicKey,{type:"ec",data:f};case"1.2.840.10040.4.1":return f.algorithm.params.pub_key=n.DSAparam.decode(f.subjectPublicKey.data,"der"),{type:"dsa",data:f.algorithm.params};default:throw new Error("unknown key id "+u)}throw new Error("unknown key type "+M);case"ENCRYPTED PRIVATE KEY":x=n.EncryptedPrivateKey.decode(x,"der"),h=e,d=(c=x).algorithm.decrypt.kde.kdeparams.salt,l=parseInt(c.algorithm.decrypt.kde.kdeparams.iters.toString(),10),p=i[c.algorithm.decrypt.cipher.algo.join(".")],b=c.algorithm.decrypt.cipher.iv,m=c.subjectPrivateKey,y=parseInt(p.split("-")[1],10)/8,v=s.pbkdf2Sync(h,d,l,y),g=a.createDecipheriv(p,v,b),(w=[]).push(g.update(m)),w.push(g.final()),x=r.concat(w);case"PRIVATE KEY":switch(u=(f=n.PrivateKey.decode(x,"der")).algorithm.algorithm.join(".")){case"1.2.840.113549.1.1.1":return n.RSAPrivateKey.decode(f.subjectPrivateKey,"der");case"1.2.840.10045.2.1":return{curve:f.algorithm.curve,privateKey:n.ECPrivateKey.decode(f.subjectPrivateKey,"der").privateKey};case"1.2.840.10040.4.1":return f.algorithm.params.priv_key=n.DSAparam.decode(f.subjectPrivateKey,"der"),{type:"dsa",params:f.algorithm.params};default:throw new Error("unknown key id "+u)}throw new Error("unknown key type "+M);case"RSA PUBLIC KEY":return n.RSAPublicKey.decode(x,"der");case"RSA PRIVATE KEY":return n.RSAPrivateKey.decode(x,"der");case"DSA PRIVATE KEY":return{type:"dsa",params:n.DSAPrivateKey.decode(x,"der")};case"EC PRIVATE KEY":return{curve:(x=n.ECPrivateKey.decode(x,"der")).parameters.value,privateKey:x.privateKey};default:throw new Error("unknown key type "+M)}}e.exports=u,u.signature=n.signature}).call(this,t("buffer").Buffer)},{"./aesid.json":331,"./asn1":332,"./fixProc":334,"browserify-aes":244,buffer:47,pbkdf2:336}],336:[function(t,e,r){arguments[4][114][0].apply(r,arguments)},{"./lib/async":337,"./lib/sync":340,dup:114}],337:[function(t,e,r){(function(r,n){var i,o=t("./precondition"),a=t("./default-encoding"),s=t("./sync"),u=t("safe-buffer").Buffer,f=n.crypto&&n.crypto.subtle,c={sha:"SHA-1","sha-1":"SHA-1",sha1:"SHA-1",sha256:"SHA-256","sha-256":"SHA-256",sha384:"SHA-384","sha-384":"SHA-384","sha-512":"SHA-512",sha512:"SHA-512"},h=[];function d(t,e,r,n,i){return f.importKey("raw",t,{name:"PBKDF2"},!1,["deriveBits"]).then(function(t){return f.deriveBits({name:"PBKDF2",salt:e,iterations:r,hash:{name:i}},t,n<<3)}).then(function(t){return u.from(t)})}e.exports=function(t,e,l,p,b,m){if(u.isBuffer(t)||(t=u.from(t,a)),u.isBuffer(e)||(e=u.from(e,a)),o(l,p),"function"==typeof b&&(m=b,b=void 0),"function"!=typeof m)throw new Error("No callback provided to pbkdf2");var y,v,g=c[(b=b||"sha1").toLowerCase()];if(!g||"function"!=typeof n.Promise)return r.nextTick(function(){var r;try{r=s(t,e,l,p,b)}catch(t){return m(t)}m(null,r)});y=function(t){if(n.process&&!n.process.browser)return Promise.resolve(!1);if(!f||!f.importKey||!f.deriveBits)return Promise.resolve(!1);if(void 0!==h[t])return h[t];var e=d(i=i||u.alloc(8),i,10,128,t).then(function(){return!0}).catch(function(){return!1});return h[t]=e,e}(g).then(function(r){return r?d(t,e,l,p,g):s(t,e,l,p,b)}),v=m,y.then(function(t){r.nextTick(function(){v(null,t)})},function(t){r.nextTick(function(){v(t)})})}}).call(this,t("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./default-encoding":338,"./precondition":339,"./sync":340,_process:120,"safe-buffer":350}],338:[function(t,e,r){(function(t){var r;t.browser?r="utf-8":r=parseInt(t.version.split(".")[0].slice(1),10)>=6?"utf-8":"binary";e.exports=r}).call(this,t("_process"))},{_process:120}],339:[function(t,e,r){arguments[4][117][0].apply(r,arguments)},{dup:117}],340:[function(t,e,r){arguments[4][118][0].apply(r,arguments)},{"./default-encoding":338,"./precondition":339,"create-hash/md5":274,dup:118,ripemd160:349,"safe-buffer":350,"sha.js":354}],341:[function(t,e,r){arguments[4][121][0].apply(r,arguments)},{"./privateDecrypt":343,"./publicEncrypt":344,dup:121}],342:[function(t,e,r){(function(r){var n=t("create-hash");function i(t){var e=new r(4);return e.writeUInt32BE(t,0),e}e.exports=function(t,e){for(var o,a=new r(""),s=0;a.lengthp||new a(e).cmp(l.modulus)>=0)throw new Error("decryption error");d=c?f(new a(e),l):s(e,l);var b=new r(p-d.length);if(b.fill(0),d=r.concat([b,d],p),4===h)return function(t,e){t.modulus;var n=t.modulus.byteLength(),a=(e.length,u("sha1").update(new r("")).digest()),s=a.length;if(0!==e[0])throw new Error("decryption error");var f=e.slice(1,s+1),c=e.slice(s+1),h=o(f,i(c,s)),d=o(c,i(h,n-s-1));if(function(t,e){t=new r(t),e=new r(e);var n=0,i=t.length;t.length!==e.length&&(n++,i=Math.min(t.length,e.length));var o=-1;for(;++o=e.length){o++;break}var a=e.slice(2,i-1);e.slice(i-1,i);("0002"!==n.toString("hex")&&!r||"0001"!==n.toString("hex")&&r)&&o++;a.length<8&&o++;if(o)throw new Error("decryption error");return e.slice(i)}(0,d,c);if(3===h)return d;throw new Error("unknown padding")}}).call(this,t("buffer").Buffer)},{"./mgf":342,"./withPublic":345,"./xor":346,"bn.js":240,"browserify-rsa":262,buffer:47,"create-hash":272,"parse-asn1":335}],344:[function(t,e,r){(function(r){var n=t("parse-asn1"),i=t("randombytes"),o=t("create-hash"),a=t("./mgf"),s=t("./xor"),u=t("bn.js"),f=t("./withPublic"),c=t("browserify-rsa");e.exports=function(t,e,h){var d;d=t.padding?t.padding:h?1:4;var l,p=n(t);if(4===d)l=function(t,e){var n=t.modulus.byteLength(),f=e.length,c=o("sha1").update(new r("")).digest(),h=c.length,d=2*h;if(f>n-d-2)throw new Error("message too long");var l=new r(n-f-d-2);l.fill(0);var p=n-h-1,b=i(h),m=s(r.concat([c,l,new r([1]),e],p),a(b,p)),y=s(b,a(m,h));return new u(r.concat([new r([0]),y,m],n))}(p,e);else if(1===d)l=function(t,e,n){var o,a=e.length,s=t.modulus.byteLength();if(a>s-11)throw new Error("message too long");n?(o=new r(s-a-3)).fill(255):o=function(t,e){var n,o=new r(t),a=0,s=i(2*t),u=0;for(;a=0)throw new Error("data too long for modulus")}return h?c(l,p):f(l,p)}}).call(this,t("buffer").Buffer)},{"./mgf":342,"./withPublic":345,"./xor":346,"bn.js":240,"browserify-rsa":262,buffer:47,"create-hash":272,"parse-asn1":335,randombytes:347}],345:[function(t,e,r){(function(r){var n=t("bn.js");e.exports=function(t,e){return new r(t.toRed(n.mont(e.modulus)).redPow(new n(e.publicExponent)).fromRed().toArray())}}).call(this,t("buffer").Buffer)},{"bn.js":240,buffer:47}],346:[function(t,e,r){arguments[4][126][0].apply(r,arguments)},{dup:126}],347:[function(t,e,r){(function(r,n){var i=t("safe-buffer").Buffer,o=n.crypto||n.msCrypto;o&&o.getRandomValues?e.exports=function(t,e){if(t>65536)throw new Error("requested too many random bytes");var a=new n.Uint8Array(t);t>0&&o.getRandomValues(a);var s=i.from(a.buffer);if("function"==typeof e)return r.nextTick(function(){e(null,s)});return s}:e.exports=function(){throw new Error("Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11")}}).call(this,t("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{_process:120,"safe-buffer":350}],348:[function(t,e,r){(function(e,n){function i(){throw new Error("secure random number generation not supported by this browser\nuse chrome, FireFox or Internet Explorer 11")}var o=t("safe-buffer"),a=t("randombytes"),s=o.Buffer,u=o.kMaxLength,f=n.crypto||n.msCrypto,c=Math.pow(2,32)-1;function h(t,e){if("number"!=typeof t||t!=t)throw new TypeError("offset must be a number");if(t>c||t<0)throw new TypeError("offset must be a uint32");if(t>u||t>e)throw new RangeError("offset out of range")}function d(t,e,r){if("number"!=typeof t||t!=t)throw new TypeError("size must be a number");if(t>c||t<0)throw new TypeError("size must be a uint32");if(t+e>r||t>u)throw new RangeError("buffer too small")}function l(t,r,n,i){if(e.browser){var o=t.buffer,s=new Uint8Array(o,r,n);return f.getRandomValues(s),i?void e.nextTick(function(){i(null,t)}):t}if(!i)return a(n).copy(t,r),t;a(n,function(e,n){if(e)return i(e);n.copy(t,r),i(null,t)})}f&&f.getRandomValues||!e.browser?(r.randomFill=function(t,e,r,i){if(!(s.isBuffer(t)||t instanceof n.Uint8Array))throw new TypeError('"buf" argument must be a Buffer or Uint8Array');if("function"==typeof e)i=e,e=0,r=t.length;else if("function"==typeof r)i=r,r=t.length-e;else if("function"!=typeof i)throw new TypeError('"cb" argument must be a function');return h(e,t.length),d(r,e,t.length),l(t,e,r,i)},r.randomFillSync=function(t,e,r){void 0===e&&(e=0);if(!(s.isBuffer(t)||t instanceof n.Uint8Array))throw new TypeError('"buf" argument must be a Buffer or Uint8Array');h(e,t.length),void 0===r&&(r=t.length-e);return d(r,e,t.length),l(t,e,r)}):(r.randomFill=i,r.randomFillSync=i)}).call(this,t("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{_process:120,randombytes:347,"safe-buffer":350}],349:[function(t,e,r){(function(r){var n=t("inherits"),i=t("hash-base");function o(){i.call(this,64),this._a=1732584193,this._b=4023233417,this._c=2562383102,this._d=271733878,this._e=3285377520}function a(t,e){return t<>>32-e}function s(t,e,r,n,i,o,s,u){return a(t+(e^r^n)+o+s|0,u)+i|0}function u(t,e,r,n,i,o,s,u){return a(t+(e&r|~e&n)+o+s|0,u)+i|0}function f(t,e,r,n,i,o,s,u){return a(t+((e|~r)^n)+o+s|0,u)+i|0}function c(t,e,r,n,i,o,s,u){return a(t+(e&n|r&~n)+o+s|0,u)+i|0}function h(t,e,r,n,i,o,s,u){return a(t+(e^(r|~n))+o+s|0,u)+i|0}n(o,i),o.prototype._update=function(){for(var t=new Array(16),e=0;e<16;++e)t[e]=this._block.readInt32LE(4*e);var r=this._a,n=this._b,i=this._c,o=this._d,d=this._e;d=s(d,r=s(r,n,i,o,d,t[0],0,11),n,i=a(i,10),o,t[1],0,14),n=s(n=a(n,10),i=s(i,o=s(o,d,r,n,i,t[2],0,15),d,r=a(r,10),n,t[3],0,12),o,d=a(d,10),r,t[4],0,5),o=s(o=a(o,10),d=s(d,r=s(r,n,i,o,d,t[5],0,8),n,i=a(i,10),o,t[6],0,7),r,n=a(n,10),i,t[7],0,9),r=s(r=a(r,10),n=s(n,i=s(i,o,d,r,n,t[8],0,11),o,d=a(d,10),r,t[9],0,13),i,o=a(o,10),d,t[10],0,14),i=s(i=a(i,10),o=s(o,d=s(d,r,n,i,o,t[11],0,15),r,n=a(n,10),i,t[12],0,6),d,r=a(r,10),n,t[13],0,7),d=u(d=a(d,10),r=s(r,n=s(n,i,o,d,r,t[14],0,9),i,o=a(o,10),d,t[15],0,8),n,i=a(i,10),o,t[7],1518500249,7),n=u(n=a(n,10),i=u(i,o=u(o,d,r,n,i,t[4],1518500249,6),d,r=a(r,10),n,t[13],1518500249,8),o,d=a(d,10),r,t[1],1518500249,13),o=u(o=a(o,10),d=u(d,r=u(r,n,i,o,d,t[10],1518500249,11),n,i=a(i,10),o,t[6],1518500249,9),r,n=a(n,10),i,t[15],1518500249,7),r=u(r=a(r,10),n=u(n,i=u(i,o,d,r,n,t[3],1518500249,15),o,d=a(d,10),r,t[12],1518500249,7),i,o=a(o,10),d,t[0],1518500249,12),i=u(i=a(i,10),o=u(o,d=u(d,r,n,i,o,t[9],1518500249,15),r,n=a(n,10),i,t[5],1518500249,9),d,r=a(r,10),n,t[2],1518500249,11),d=u(d=a(d,10),r=u(r,n=u(n,i,o,d,r,t[14],1518500249,7),i,o=a(o,10),d,t[11],1518500249,13),n,i=a(i,10),o,t[8],1518500249,12),n=f(n=a(n,10),i=f(i,o=f(o,d,r,n,i,t[3],1859775393,11),d,r=a(r,10),n,t[10],1859775393,13),o,d=a(d,10),r,t[14],1859775393,6),o=f(o=a(o,10),d=f(d,r=f(r,n,i,o,d,t[4],1859775393,7),n,i=a(i,10),o,t[9],1859775393,14),r,n=a(n,10),i,t[15],1859775393,9),r=f(r=a(r,10),n=f(n,i=f(i,o,d,r,n,t[8],1859775393,13),o,d=a(d,10),r,t[1],1859775393,15),i,o=a(o,10),d,t[2],1859775393,14),i=f(i=a(i,10),o=f(o,d=f(d,r,n,i,o,t[7],1859775393,8),r,n=a(n,10),i,t[0],1859775393,13),d,r=a(r,10),n,t[6],1859775393,6),d=f(d=a(d,10),r=f(r,n=f(n,i,o,d,r,t[13],1859775393,5),i,o=a(o,10),d,t[11],1859775393,12),n,i=a(i,10),o,t[5],1859775393,7),n=c(n=a(n,10),i=c(i,o=f(o,d,r,n,i,t[12],1859775393,5),d,r=a(r,10),n,t[1],2400959708,11),o,d=a(d,10),r,t[9],2400959708,12),o=c(o=a(o,10),d=c(d,r=c(r,n,i,o,d,t[11],2400959708,14),n,i=a(i,10),o,t[10],2400959708,15),r,n=a(n,10),i,t[0],2400959708,14),r=c(r=a(r,10),n=c(n,i=c(i,o,d,r,n,t[8],2400959708,15),o,d=a(d,10),r,t[12],2400959708,9),i,o=a(o,10),d,t[4],2400959708,8),i=c(i=a(i,10),o=c(o,d=c(d,r,n,i,o,t[13],2400959708,9),r,n=a(n,10),i,t[3],2400959708,14),d,r=a(r,10),n,t[7],2400959708,5),d=c(d=a(d,10),r=c(r,n=c(n,i,o,d,r,t[15],2400959708,6),i,o=a(o,10),d,t[14],2400959708,8),n,i=a(i,10),o,t[5],2400959708,6),n=h(n=a(n,10),i=c(i,o=c(o,d,r,n,i,t[6],2400959708,5),d,r=a(r,10),n,t[2],2400959708,12),o,d=a(d,10),r,t[4],2840853838,9),o=h(o=a(o,10),d=h(d,r=h(r,n,i,o,d,t[0],2840853838,15),n,i=a(i,10),o,t[5],2840853838,5),r,n=a(n,10),i,t[9],2840853838,11),r=h(r=a(r,10),n=h(n,i=h(i,o,d,r,n,t[7],2840853838,6),o,d=a(d,10),r,t[12],2840853838,8),i,o=a(o,10),d,t[2],2840853838,13),i=h(i=a(i,10),o=h(o,d=h(d,r,n,i,o,t[10],2840853838,12),r,n=a(n,10),i,t[14],2840853838,5),d,r=a(r,10),n,t[1],2840853838,12),d=h(d=a(d,10),r=h(r,n=h(n,i,o,d,r,t[3],2840853838,13),i,o=a(o,10),d,t[8],2840853838,14),n,i=a(i,10),o,t[11],2840853838,11),n=h(n=a(n,10),i=h(i,o=h(o,d,r,n,i,t[6],2840853838,8),d,r=a(r,10),n,t[15],2840853838,5),o,d=a(d,10),r,t[13],2840853838,6),o=a(o,10);var l=this._a,p=this._b,b=this._c,m=this._d,y=this._e;y=h(y,l=h(l,p,b,m,y,t[5],1352829926,8),p,b=a(b,10),m,t[14],1352829926,9),p=h(p=a(p,10),b=h(b,m=h(m,y,l,p,b,t[7],1352829926,9),y,l=a(l,10),p,t[0],1352829926,11),m,y=a(y,10),l,t[9],1352829926,13),m=h(m=a(m,10),y=h(y,l=h(l,p,b,m,y,t[2],1352829926,15),p,b=a(b,10),m,t[11],1352829926,15),l,p=a(p,10),b,t[4],1352829926,5),l=h(l=a(l,10),p=h(p,b=h(b,m,y,l,p,t[13],1352829926,7),m,y=a(y,10),l,t[6],1352829926,7),b,m=a(m,10),y,t[15],1352829926,8),b=h(b=a(b,10),m=h(m,y=h(y,l,p,b,m,t[8],1352829926,11),l,p=a(p,10),b,t[1],1352829926,14),y,l=a(l,10),p,t[10],1352829926,14),y=c(y=a(y,10),l=h(l,p=h(p,b,m,y,l,t[3],1352829926,12),b,m=a(m,10),y,t[12],1352829926,6),p,b=a(b,10),m,t[6],1548603684,9),p=c(p=a(p,10),b=c(b,m=c(m,y,l,p,b,t[11],1548603684,13),y,l=a(l,10),p,t[3],1548603684,15),m,y=a(y,10),l,t[7],1548603684,7),m=c(m=a(m,10),y=c(y,l=c(l,p,b,m,y,t[0],1548603684,12),p,b=a(b,10),m,t[13],1548603684,8),l,p=a(p,10),b,t[5],1548603684,9),l=c(l=a(l,10),p=c(p,b=c(b,m,y,l,p,t[10],1548603684,11),m,y=a(y,10),l,t[14],1548603684,7),b,m=a(m,10),y,t[15],1548603684,7),b=c(b=a(b,10),m=c(m,y=c(y,l,p,b,m,t[8],1548603684,12),l,p=a(p,10),b,t[12],1548603684,7),y,l=a(l,10),p,t[4],1548603684,6),y=c(y=a(y,10),l=c(l,p=c(p,b,m,y,l,t[9],1548603684,15),b,m=a(m,10),y,t[1],1548603684,13),p,b=a(b,10),m,t[2],1548603684,11),p=f(p=a(p,10),b=f(b,m=f(m,y,l,p,b,t[15],1836072691,9),y,l=a(l,10),p,t[5],1836072691,7),m,y=a(y,10),l,t[1],1836072691,15),m=f(m=a(m,10),y=f(y,l=f(l,p,b,m,y,t[3],1836072691,11),p,b=a(b,10),m,t[7],1836072691,8),l,p=a(p,10),b,t[14],1836072691,6),l=f(l=a(l,10),p=f(p,b=f(b,m,y,l,p,t[6],1836072691,6),m,y=a(y,10),l,t[9],1836072691,14),b,m=a(m,10),y,t[11],1836072691,12),b=f(b=a(b,10),m=f(m,y=f(y,l,p,b,m,t[8],1836072691,13),l,p=a(p,10),b,t[12],1836072691,5),y,l=a(l,10),p,t[2],1836072691,14),y=f(y=a(y,10),l=f(l,p=f(p,b,m,y,l,t[10],1836072691,13),b,m=a(m,10),y,t[0],1836072691,13),p,b=a(b,10),m,t[4],1836072691,7),p=u(p=a(p,10),b=u(b,m=f(m,y,l,p,b,t[13],1836072691,5),y,l=a(l,10),p,t[8],2053994217,15),m,y=a(y,10),l,t[6],2053994217,5),m=u(m=a(m,10),y=u(y,l=u(l,p,b,m,y,t[4],2053994217,8),p,b=a(b,10),m,t[1],2053994217,11),l,p=a(p,10),b,t[3],2053994217,14),l=u(l=a(l,10),p=u(p,b=u(b,m,y,l,p,t[11],2053994217,14),m,y=a(y,10),l,t[15],2053994217,6),b,m=a(m,10),y,t[0],2053994217,14),b=u(b=a(b,10),m=u(m,y=u(y,l,p,b,m,t[5],2053994217,6),l,p=a(p,10),b,t[12],2053994217,9),y,l=a(l,10),p,t[2],2053994217,12),y=u(y=a(y,10),l=u(l,p=u(p,b,m,y,l,t[13],2053994217,9),b,m=a(m,10),y,t[9],2053994217,12),p,b=a(b,10),m,t[7],2053994217,5),p=s(p=a(p,10),b=u(b,m=u(m,y,l,p,b,t[10],2053994217,15),y,l=a(l,10),p,t[14],2053994217,8),m,y=a(y,10),l,t[12],0,8),m=s(m=a(m,10),y=s(y,l=s(l,p,b,m,y,t[15],0,5),p,b=a(b,10),m,t[10],0,12),l,p=a(p,10),b,t[4],0,9),l=s(l=a(l,10),p=s(p,b=s(b,m,y,l,p,t[1],0,12),m,y=a(y,10),l,t[5],0,5),b,m=a(m,10),y,t[8],0,14),b=s(b=a(b,10),m=s(m,y=s(y,l,p,b,m,t[7],0,6),l,p=a(p,10),b,t[6],0,8),y,l=a(l,10),p,t[2],0,13),y=s(y=a(y,10),l=s(l,p=s(p,b,m,y,l,t[13],0,6),b,m=a(m,10),y,t[14],0,5),p,b=a(b,10),m,t[0],0,15),p=s(p=a(p,10),b=s(b,m=s(m,y,l,p,b,t[3],0,13),y,l=a(l,10),p,t[9],0,11),m,y=a(y,10),l,t[11],0,11),m=a(m,10);var v=this._b+i+m|0;this._b=this._c+o+y|0,this._c=this._d+d+l|0,this._d=this._e+r+p|0,this._e=this._a+n+b|0,this._a=v},o.prototype._digest=function(){this._block[this._blockOffset++]=128,this._blockOffset>56&&(this._block.fill(0,this._blockOffset,64),this._update(),this._blockOffset=0),this._block.fill(0,this._blockOffset,56),this._block.writeUInt32LE(this._length[0],56),this._block.writeUInt32LE(this._length[1],60),this._update();var t=new r(20);return t.writeInt32LE(this._a,0),t.writeInt32LE(this._b,4),t.writeInt32LE(this._c,8),t.writeInt32LE(this._d,12),t.writeInt32LE(this._e,16),t},e.exports=o}).call(this,t("buffer").Buffer)},{buffer:47,"hash-base":311,inherits:325}],350:[function(t,e,r){arguments[4][147][0].apply(r,arguments)},{buffer:47,dup:147}],351:[function(t,e,r){e.exports=t("scryptsy")},{scryptsy:352}],352:[function(t,e,r){(function(r){var n=t("pbkdf2").pbkdf2Sync,i=2147483647;function o(t,e,n,i,o){if(r.isBuffer(t)&&r.isBuffer(n))t.copy(n,i,e,e+o);else for(;o--;)n[i++]=t[e++]}e.exports=function(t,e,a,s,u,f,c){if(0===a||0!=(a&a-1))throw Error("N must be > 0 and a power of 2");if(a>i/128/s)throw Error("Parameter N is too large");if(s>i/128/u)throw Error("Parameter r is too large");var h,d=new r(256*s),l=new r(128*s*a),p=new Int32Array(16),b=new Int32Array(16),m=new r(64),y=n(t,e,1,128*u*s,"sha256");if(c){var v=u*a*2,g=0;h=function(){++g%1e3==0&&c({current:g,total:v,percent:g/v*100})}}for(var w=0;w>>32-e}function k(t){var e;for(e=0;e<16;e++)p[e]=(255&t[4*e+0])<<0,p[e]|=(255&t[4*e+1])<<8,p[e]|=(255&t[4*e+2])<<16,p[e]|=(255&t[4*e+3])<<24;for(o(p,0,b,0,16),e=8;e>0;e-=2)b[4]^=x(b[0]+b[12],7),b[8]^=x(b[4]+b[0],9),b[12]^=x(b[8]+b[4],13),b[0]^=x(b[12]+b[8],18),b[9]^=x(b[5]+b[1],7),b[13]^=x(b[9]+b[5],9),b[1]^=x(b[13]+b[9],13),b[5]^=x(b[1]+b[13],18),b[14]^=x(b[10]+b[6],7),b[2]^=x(b[14]+b[10],9),b[6]^=x(b[2]+b[14],13),b[10]^=x(b[6]+b[2],18),b[3]^=x(b[15]+b[11],7),b[7]^=x(b[3]+b[15],9),b[11]^=x(b[7]+b[3],13),b[15]^=x(b[11]+b[7],18),b[1]^=x(b[0]+b[3],7),b[2]^=x(b[1]+b[0],9),b[3]^=x(b[2]+b[1],13),b[0]^=x(b[3]+b[2],18),b[6]^=x(b[5]+b[4],7),b[7]^=x(b[6]+b[5],9),b[4]^=x(b[7]+b[6],13),b[5]^=x(b[4]+b[7],18),b[11]^=x(b[10]+b[9],7),b[8]^=x(b[11]+b[10],9),b[9]^=x(b[8]+b[11],13),b[10]^=x(b[9]+b[8],18),b[12]^=x(b[15]+b[14],7),b[13]^=x(b[12]+b[15],9),b[14]^=x(b[13]+b[12],13),b[15]^=x(b[14]+b[13],18);for(e=0;e<16;++e)p[e]=b[e]+p[e];for(e=0;e<16;e++){var r=4*e;t[r+0]=p[e]>>0&255,t[r+1]=p[e]>>8&255,t[r+2]=p[e]>>16&255,t[r+3]=p[e]>>24&255}}function S(t,e,r,n,i){for(var o=0;o>>((3&e)<<3)&255;return i}}e.exports=r}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],363:[function(t,e,r){for(var n=t("./rng"),i=[],o={},a=0;a<256;a++)i[a]=(a+256).toString(16).substr(1),o[i[a]]=a;function s(t,e){var r=e||0,n=i;return n[t[r++]]+n[t[r++]]+n[t[r++]]+n[t[r++]]+"-"+n[t[r++]]+n[t[r++]]+"-"+n[t[r++]]+n[t[r++]]+"-"+n[t[r++]]+n[t[r++]]+"-"+n[t[r++]]+n[t[r++]]+n[t[r++]]+n[t[r++]]+n[t[r++]]+n[t[r++]]}var u=n(),f=[1|u[0],u[1],u[2],u[3],u[4],u[5]],c=16383&(u[6]<<8|u[7]),h=0,d=0;function l(t,e,r){var i=e&&r||0;"string"==typeof t&&(e="binary"==t?new Array(16):null,t=null);var o=(t=t||{}).random||(t.rng||n)();if(o[6]=15&o[6]|64,o[8]=63&o[8]|128,e)for(var a=0;a<16;a++)e[i+a]=o[a];return e||s(o)}var p=l;p.v1=function(t,e,r){var n=e&&r||0,i=e||[],o=void 0!==(t=t||{}).clockseq?t.clockseq:c,a=void 0!==t.msecs?t.msecs:(new Date).getTime(),u=void 0!==t.nsecs?t.nsecs:d+1,l=a-h+(u-d)/1e4;if(l<0&&void 0===t.clockseq&&(o=o+1&16383),(l<0||a>h)&&void 0===t.nsecs&&(u=0),u>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");h=a,d=u,c=o;var p=(1e4*(268435455&(a+=122192928e5))+u)%4294967296;i[n++]=p>>>24&255,i[n++]=p>>>16&255,i[n++]=p>>>8&255,i[n++]=255&p;var b=a/4294967296*1e4&268435455;i[n++]=b>>>8&255,i[n++]=255&b,i[n++]=b>>>24&15|16,i[n++]=b>>>16&255,i[n++]=o>>>8|128,i[n++]=255&o;for(var m=t.node||f,y=0;y<6;y++)i[n+y]=m[y];return e||s(i)},p.v4=l,p.parse=function(t,e,r){var n=e&&r||0,i=0;for(e=e||[],t.toLowerCase().replace(/[0-9a-f]{2}/g,function(t){i<16&&(e[n+i++]=o[t])});i<16;)e[n+i++]=0;return e},p.unparse=s,e.exports=p},{"./rng":362}],364:[function(t,e,r){(function(r,n){var i=t("underscore"),o=t("web3-core"),a=t("web3-core-method"),s=t("any-promise"),u=t("eth-lib/lib/account"),f=t("eth-lib/lib/hash"),c=t("eth-lib/lib/rlp"),h=t("eth-lib/lib/nat"),d=t("eth-lib/lib/bytes"),l=t(void 0===r?"crypto-browserify":"crypto"),p=t("scrypt.js"),b=t("uuid"),m=t("web3-utils"),y=t("web3-core-helpers"),v=function(t){return i.isUndefined(t)||i.isNull(t)},g=function(t){for(;t&&t.startsWith("0x0");)t="0x"+t.slice(3);return t},w=function(t){return t.length%2==1&&(t=t.replace("0x","0x0")),t},_=function(){var t=this;o.packageInit(this,arguments),delete this.BatchRequest,delete this.extend;var e=[new a({name:"getId",call:"net_version",params:0,outputFormatter:m.hexToNumber}),new a({name:"getGasPrice",call:"eth_gasPrice",params:0}),new a({name:"getTransactionCount",call:"eth_getTransactionCount",params:2,inputFormatter:[function(t){if(m.isAddress(t))return t;throw new Error("Address "+t+' is not a valid address to get the "transactionCount".')},function(){return"latest"}]})];this._ethereumCall={},i.each(e,function(e){e.attachToObject(t._ethereumCall),e.setRequestManager(t._requestManager)}),this.wallet=new M(this)};function M(t){this._accounts=t,this.length=0,this.defaultKeyName="web3js_wallet"}_.prototype._addAccountFunctions=function(t){var e=this;return t.signTransaction=function(r,n){return e.signTransaction(r,t.privateKey,n)},t.sign=function(r){return e.sign(r,t.privateKey)},t.encrypt=function(r,n){return e.encrypt(t.privateKey,r,n)},t},_.prototype.create=function(t){return this._addAccountFunctions(u.create(t||m.randomHex(32)))},_.prototype.privateKeyToAccount=function(t){return this._addAccountFunctions(u.fromPrivate(t))},_.prototype.signTransaction=function(t,e,r){var n,o=!1;if(r=r||function(){},!t)return o=new Error("No transaction object given!"),r(o),s.reject(o);function a(t){if(t.gas||t.gasLimit||(o=new Error('"gas" is missing')),(t.nonce<0||t.gas<0||t.gasPrice<0||t.chainId<0)&&(o=new Error("Gas, gasPrice, nonce or chainId is lower than 0")),o)return r(o),s.reject(new Error('"gas" is missing'));try{var i=t=y.formatters.inputCallFormatter(t);i.to=t.to||"0x",i.data=t.data||"0x",i.value=t.value||"0x",i.chainId=m.numberToHex(t.chainId);var a=c.encode([d.fromNat(i.nonce),d.fromNat(i.gasPrice),d.fromNat(i.gas),i.to.toLowerCase(),d.fromNat(i.value),i.data,d.fromNat(i.chainId||"0x1"),"0x","0x"]),l=f.keccak256(a),p=u.makeSigner(2*h.toNumber(i.chainId||"0x1")+35)(f.keccak256(a),e),b=c.decode(a).slice(0,6).concat(u.decodeSignature(p));b[6]=w(g(b[6])),b[7]=w(g(b[7])),b[8]=w(g(b[8]));var v=c.encode(b),_=c.decode(v);n={messageHash:l,v:g(_[6]),r:g(_[7]),s:g(_[8]),rawTransaction:v}}catch(t){return r(t),s.reject(t)}return r(null,n),n}return void 0!==t.nonce&&void 0!==t.chainId&&void 0!==t.gasPrice?s.resolve(a(t)):s.all([v(t.chainId)?this._ethereumCall.getId():t.chainId,v(t.gasPrice)?this._ethereumCall.getGasPrice():t.gasPrice,v(t.nonce)?this._ethereumCall.getTransactionCount(this.privateKeyToAccount(e).address):t.nonce]).then(function(e){if(v(e[0])||v(e[1])||v(e[2]))throw new Error('One of the values "chainId", "gasPrice", or "nonce" couldn\'t be fetched: '+JSON.stringify(e));return a(i.extend(t,{chainId:e[0],gasPrice:e[1],nonce:e[2]}))})},_.prototype.recoverTransaction=function(t){var e=c.decode(t),r=u.encodeSignature(e.slice(6,9)),n=d.toNumber(e[6]),i=n<35?[]:[d.fromNumber(n-35>>1),"0x","0x"],o=e.slice(0,6).concat(i),a=c.encode(o);return u.recover(f.keccak256(a),r)},_.prototype.hashMessage=function(t){var e=m.isHexStrict(t)?m.hexToBytes(t):t,r=n.from(e),i="Ethereum Signed Message:\n"+e.length,o=n.from(i),a=n.concat([o,r]);return f.keccak256s(a)},_.prototype.sign=function(t,e){var r=this.hashMessage(t),n=u.sign(r,e),i=u.decodeSignature(n);return{message:t,messageHash:r,v:i[0],r:i[1],s:i[2],signature:n}},_.prototype.recover=function(t,e,r){var n=[].slice.apply(arguments);return i.isObject(t)?this.recover(t.messageHash,u.encodeSignature([t.v,t.r,t.s]),!0):(r||(t=this.hashMessage(t)),n.length>=4?(r=n.slice(-1)[0],r=!!i.isBoolean(r)&&!!r,this.recover(t,u.encodeSignature(n.slice(1,4)),r)):u.recover(t,e))},_.prototype.decrypt=function(t,e,r){if(!i.isString(e))throw new Error("No password given.");var o,a,s=i.isObject(t)?t:JSON.parse(r?t.toLowerCase():t);if(3!==s.version)throw new Error("Not a valid V3 wallet");if("scrypt"===s.crypto.kdf)a=s.crypto.kdfparams,o=p(new n(e),new n(a.salt,"hex"),a.n,a.r,a.p,a.dklen);else{if("pbkdf2"!==s.crypto.kdf)throw new Error("Unsupported key derivation scheme");if("hmac-sha256"!==(a=s.crypto.kdfparams).prf)throw new Error("Unsupported parameters to PBKDF2");o=l.pbkdf2Sync(new n(e),new n(a.salt,"hex"),a.c,a.dklen,"sha256")}var u=new n(s.crypto.ciphertext,"hex");if(m.sha3(n.concat([o.slice(16,32),u])).replace("0x","")!==s.crypto.mac)throw new Error("Key derivation failed - possibly wrong password");var f=l.createDecipheriv(s.crypto.cipher,o.slice(0,16),new n(s.crypto.cipherparams.iv,"hex")),c="0x"+n.concat([f.update(u),f.final()]).toString("hex");return this.privateKeyToAccount(c)},_.prototype.encrypt=function(t,e,r){var i,o=this.privateKeyToAccount(t),a=(r=r||{}).salt||l.randomBytes(32),s=r.iv||l.randomBytes(16),u=r.kdf||"scrypt",f={dklen:r.dklen||32,salt:a.toString("hex")};if("pbkdf2"===u)f.c=r.c||262144,f.prf="hmac-sha256",i=l.pbkdf2Sync(new n(e),a,f.c,f.dklen,"sha256");else{if("scrypt"!==u)throw new Error("Unsupported kdf");f.n=r.n||8192,f.r=r.r||8,f.p=r.p||1,i=p(new n(e),a,f.n,f.r,f.p,f.dklen)}var c=l.createCipheriv(r.cipher||"aes-128-ctr",i.slice(0,16),s);if(!c)throw new Error("Unsupported cipher");var h=n.concat([c.update(new n(o.privateKey.replace("0x",""),"hex")),c.final()]),d=m.sha3(n.concat([i.slice(16,32),new n(h,"hex")])).replace("0x","");return{version:3,id:b.v4({random:r.uuid||l.randomBytes(16)}),address:o.address.toLowerCase().replace("0x",""),crypto:{ciphertext:h.toString("hex"),cipherparams:{iv:s.toString("hex")},cipher:r.cipher||"aes-128-ctr",kdf:u,kdfparams:f,mac:d.toString("hex")}}},M.prototype._findSafeIndex=function(t){return t=t||0,i.has(this,t)?this._findSafeIndex(t+1):t},M.prototype._currentIndexes=function(){return Object.keys(this).map(function(t){return parseInt(t)}).filter(function(t){return t<9e20})},M.prototype.create=function(t,e){for(var r=0;r=2?e.slice(2):e;var r=h.decodeParameters(t,e);return 1===r.__length__?r[0]:(delete r.__length__,r)},d.prototype.deploy=function(t,e){if((t=t||{}).arguments=t.arguments||[],!(t=this._getOrSetDefaultOptions(t)).data)return a._fireError(new Error('No "data" specified in neither the given options, nor the default options.'),null,null,e);var r=n.find(this.options.jsonInterface,function(t){return"constructor"===t.type})||{};return r.signature="constructor",this._createTxObject.apply({method:r,parent:this,deployData:t.data,_ethAccounts:this.constructor._ethAccounts},t.arguments)},d.prototype._generateEventOptions=function(){var t=Array.prototype.slice.call(arguments),e=this._getCallback(t),r=n.isObject(t[t.length-1])?t.pop():{},i=n.isString(t[0])?t[0]:"allevents";if(!(i="allevents"===i.toLowerCase()?{name:"ALLEVENTS",jsonInterface:this.options.jsonInterface}:this.options.jsonInterface.find(function(t){return"event"===t.type&&(t.name===i||t.signature==="0x"+i.replace("0x",""))})))throw new Error('Event "'+i.name+"\" doesn't exist in this contract.");if(!a.isAddress(this.options.address))throw new Error("This contract object doesn't have address set yet, please set an address first.");return{params:this._encodeEventABI(i,r),event:i,callback:e}},d.prototype.clone=function(){return new this.constructor(this.options.jsonInterface,this.options.address,this.options)},d.prototype.once=function(t,e,r){var i=Array.prototype.slice.call(arguments);if(!(r=this._getCallback(i)))throw new Error("Once requires a callback as the second parameter.");e&&delete e.fromBlock,this._on(t,e,function(t,e,i){i.unsubscribe(),n.isFunction(r)&&r(t,e,i)})},d.prototype._on=function(){var t=this._generateEventOptions.apply(this,arguments);this._checkListener("newListener",t.event.name,t.callback),this._checkListener("removeListener",t.event.name,t.callback);var e=new s({subscription:{params:1,inputFormatter:[u.inputLogFormatter],outputFormatter:this._decodeEventABI.bind(t.event),subscriptionHandler:function(t){t.removed?this.emit("changed",t):this.emit("data",t),n.isFunction(this.callback)&&this.callback(null,t,this)}},type:"eth",requestManager:this._requestManager});return e.subscribe("logs",t.params,t.callback||function(){}),e},d.prototype.getPastEvents=function(){var t=this._generateEventOptions.apply(this,arguments),e=new o({name:"getPastLogs",call:"eth_getLogs",params:1,inputFormatter:[u.inputLogFormatter],outputFormatter:this._decodeEventABI.bind(t.event)});e.setRequestManager(this._requestManager);var r=e.buildCall();return e=null,r(t.params,t.callback)},d.prototype._createTxObject=function(){var t=Array.prototype.slice.call(arguments),e={};if("function"===this.method.type&&(e.call=this.parent._executeMethod.bind(e,"call"),e.call.request=this.parent._executeMethod.bind(e,"call",!0)),e.send=this.parent._executeMethod.bind(e,"send"),e.send.request=this.parent._executeMethod.bind(e,"send",!0),e.encodeABI=this.parent._encodeMethodABI.bind(e),e.estimateGas=this.parent._executeMethod.bind(e,"estimate"),t&&this.method.inputs&&t.length!==this.method.inputs.length){if(this.nextMethod)return this.nextMethod.apply(null,t);throw f.InvalidNumberOfParams(t.length,this.method.inputs.length,this.method.name)}return e.arguments=t||[],e._method=this.method,e._parent=this.parent,e._ethAccounts=this.parent.constructor._ethAccounts||this._ethAccounts,this.deployData&&(e._deployData=this.deployData),e},d.prototype._processExecuteArguments=function(t,e){var r={};if(r.type=t.shift(),r.callback=this._parent._getCallback(t),"call"===r.type&&!0!==t[t.length-1]&&(n.isString(t[t.length-1])||isFinite(t[t.length-1]))&&(r.defaultBlock=t.pop()),r.options=n.isObject(t[t.length-1])?t.pop():{},r.generateRequest=!0===t[t.length-1]&&t.pop(),r.options=this._parent._getOrSetDefaultOptions(r.options),r.options.data=this.encodeABI(),!this._deployData&&!a.isAddress(this._parent.options.address))throw new Error("This contract object doesn't have address set yet, please set an address first.");return this._deployData||(r.options.to=this._parent.options.address),r.options.data?r:a._fireError(new Error("Couldn't find a matching contract method, or the number of parameters is wrong."),e.eventEmitter,e.reject,r.callback)},d.prototype._executeMethod=function(){var t=this,e=this._parent._processExecuteArguments.call(this,Array.prototype.slice.call(arguments),r),r=c("send"!==e.type),i=t.constructor._ethAccounts||t._ethAccounts;if(e.generateRequest){var s={params:[u.inputCallFormatter.call(this._parent,e.options)],callback:e.callback};return"call"===e.type?(s.params.push(u.inputDefaultBlockNumberFormatter.call(this._parent,e.defaultBlock)),s.method="eth_call",s.format=this._parent._decodeMethodReturn.bind(null,this._method.outputs)):s.method="eth_sendTransaction",s}switch(e.type){case"estimate":return new o({name:"estimateGas",call:"eth_estimateGas",params:1,inputFormatter:[u.inputCallFormatter],outputFormatter:a.hexToNumber,requestManager:t._parent._requestManager,accounts:i,defaultAccount:t._parent.defaultAccount,defaultBlock:t._parent.defaultBlock}).createFunction()(e.options,e.callback);case"call":return new o({name:"call",call:"eth_call",params:2,inputFormatter:[u.inputCallFormatter,u.inputDefaultBlockNumberFormatter],outputFormatter:function(e){return t._parent._decodeMethodReturn(t._method.outputs,e)},requestManager:t._parent._requestManager,accounts:i,defaultAccount:t._parent.defaultAccount,defaultBlock:t._parent.defaultBlock}).createFunction()(e.options,e.defaultBlock,e.callback);case"send":if(!a.isAddress(e.options.from))return a._fireError(new Error('No "from" address specified in neither the given options, nor the default options.'),r.eventEmitter,r.reject,e.callback);if(n.isBoolean(this._method.payable)&&!this._method.payable&&e.options.value&&e.options.value>0)return a._fireError(new Error("Can not send value to non-payable contract method or constructor"),r.eventEmitter,r.reject,e.callback);var f={receiptFormatter:function(e){if(n.isArray(e.logs)){var r=n.map(e.logs,function(e){return t._parent._decodeEventABI.call({name:"ALLEVENTS",jsonInterface:t._parent.options.jsonInterface},e)});e.events={};var i=0;r.forEach(function(t){t.event?e.events[t.event]?Array.isArray(e.events[t.event])?e.events[t.event].push(t):e.events[t.event]=[e.events[t.event],t]:e.events[t.event]=t:(e.events[i]=t,i++)}),delete e.logs}return e},contractDeployFormatter:function(e){var r=t._parent.clone();return r.options.address=e.contractAddress,r}};return new o({name:"sendTransaction",call:"eth_sendTransaction",params:1,inputFormatter:[u.inputTransactionFormatter],requestManager:t._parent._requestManager,accounts:t.constructor._ethAccounts||t._ethAccounts,defaultAccount:t._parent.defaultAccount,defaultBlock:t._parent.defaultBlock,extraFormatters:f}).createFunction()(e.options,e.callback)}},e.exports=d},{underscore:365,"web3-core":209,"web3-core-helpers":191,"web3-core-method":193,"web3-core-promievent":198,"web3-core-subscriptions":206,"web3-eth-abi":213,"web3-utils":393}],367:[function(t,e,r){arguments[4][210][0].apply(r,arguments)},{dup:210}],368:[function(t,e,r){var n=t("web3-utils"),i=t("bn.js"),o=function(t){var e="A".charCodeAt(0),r="Z".charCodeAt(0);return(t=(t=t.toUpperCase()).substr(4)+t.substr(0,4)).split("").map(function(t){var n=t.charCodeAt(0);return n>=e&&n<=r?n-e+10:t}).join("")},a=function(t){for(var e,r=t;r.length>2;)e=r.slice(0,9),r=parseInt(e,10)%97+r.slice(e.length);return parseInt(r,10)%97},s=function(t){this._iban=t};s.toAddress=function(t){if(!(t=new s(t)).isDirect())throw new Error("IBAN is indirect and can't be converted");return t.toAddress()},s.toIban=function(t){return s.fromAddress(t).toString()},s.fromAddress=function(t){if(!n.isAddress(t))throw new Error("Provided address is not a valid address: "+t);t=t.replace("0x","").replace("0X","");var e=function(t,e){for(var r=t;r.length<2*e;)r="0"+r;return r}(new i(t,16).toString(36),15);return s.fromBban(e.toUpperCase())},s.fromBban=function(t){var e=("0"+(98-a(o("XE00"+t)))).slice(-2);return new s("XE"+e+t)},s.createIndirect=function(t){return s.fromBban("ETH"+t.institution+t.identifier)},s.isValid=function(t){return new s(t).isValid()},s.prototype.isValid=function(){return/^XE[0-9]{2}(ETH[0-9A-Z]{13}|[0-9A-Z]{30,31})$/.test(this._iban)&&1===a(o(this._iban))},s.prototype.isDirect=function(){return 34===this._iban.length||35===this._iban.length},s.prototype.isIndirect=function(){return 20===this._iban.length},s.prototype.checksum=function(){return this._iban.substr(2,2)},s.prototype.institution=function(){return this.isIndirect()?this._iban.substr(7,4):""},s.prototype.client=function(){return this.isIndirect()?this._iban.substr(11):""},s.prototype.toAddress=function(){if(this.isDirect()){var t=this._iban.substr(4),e=new i(t,36);return n.toChecksumAddress(e.toString(16,20))}return""},s.prototype.toString=function(){return this._iban},e.exports=s},{"bn.js":367,"web3-utils":393}],369:[function(t,e,r){var n=t("web3-core"),i=t("web3-core-method"),o=t("web3-utils"),a=t("web3-net"),s=t("web3-core-helpers").formatters,u=function(){var t=this;n.packageInit(this,arguments),this.net=new a(this.currentProvider);var e=null,r="latest";Object.defineProperty(this,"defaultAccount",{get:function(){return e},set:function(t){return t&&(e=o.toChecksumAddress(s.inputAddressFormatter(t))),u.forEach(function(t){t.defaultAccount=e}),t},enumerable:!0}),Object.defineProperty(this,"defaultBlock",{get:function(){return r},set:function(t){return r=t,u.forEach(function(t){t.defaultBlock=r}),t},enumerable:!0});var u=[new i({name:"getAccounts",call:"personal_listAccounts",params:0,outputFormatter:o.toChecksumAddress}),new i({name:"newAccount",call:"personal_newAccount",params:1,inputFormatter:[null],outputFormatter:o.toChecksumAddress}),new i({name:"unlockAccount",call:"personal_unlockAccount",params:3,inputFormatter:[s.inputAddressFormatter,null,null]}),new i({name:"lockAccount",call:"personal_lockAccount",params:1,inputFormatter:[s.inputAddressFormatter]}),new i({name:"importRawKey",call:"personal_importRawKey",params:2}),new i({name:"sendTransaction",call:"personal_sendTransaction",params:2,inputFormatter:[s.inputTransactionFormatter,null]}),new i({name:"signTransaction",call:"personal_signTransaction",params:2,inputFormatter:[s.inputTransactionFormatter,null]}),new i({name:"sign",call:"personal_sign",params:3,inputFormatter:[s.inputSignFormatter,s.inputAddressFormatter,null]}),new i({name:"ecRecover",call:"personal_ecRecover",params:2,inputFormatter:[s.inputSignFormatter,null]})];u.forEach(function(e){e.attachToObject(t),e.setRequestManager(t._requestManager),e.defaultBlock=t.defaultBlock,e.defaultAccount=t.defaultAccount})};n.addProviders(u),e.exports=u},{"web3-core":209,"web3-core-helpers":191,"web3-core-method":193,"web3-net":373,"web3-utils":393}],370:[function(t,e,r){arguments[4][178][0].apply(r,arguments)},{dup:178}],371:[function(t,e,r){var n=t("underscore");e.exports=function(t){var e,r=this;return this.net.getId().then(function(t){return e=t,r.getBlock(0)}).then(function(r){var i="private";return"0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3"===r.hash&&1===e&&(i="main"),"0cd786a2425d16f152c658316c423e6ce1181e15c3295826d7c9904cba9ce303"===r.hash&&2===e&&(i="morden"),"0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d"===r.hash&&3===e&&(i="ropsten"),"0x6341fd3daf94b748c72ced5a5b26028f2474f5f00d824504e4fa37a75767e177"===r.hash&&4===e&&(i="rinkeby"),"0xa3c565fc15c7478862d50ccd6561e3c06b24cc509bf388941c25ea985ce32cb9"===r.hash&&42===e&&(i="kovan"),n.isFunction(t)&&t(null,i),i}).catch(function(e){if(!n.isFunction(t))throw e;t(e)})}},{underscore:370}],372:[function(t,e,r){var n=t("underscore"),i=t("web3-core"),o=t("web3-core-helpers"),a=t("web3-core-subscriptions").subscriptions,s=t("web3-core-method"),u=t("web3-utils"),f=t("web3-net"),c=t("web3-eth-personal"),h=t("web3-eth-contract"),d=t("web3-eth-iban"),l=t("web3-eth-accounts"),p=t("web3-eth-abi"),b=t("./getNetworkType.js"),m=o.formatters,y=function(t){return n.isString(t[0])&&0===t[0].indexOf("0x")?"eth_getBlockByHash":"eth_getBlockByNumber"},v=function(t){return n.isString(t[0])&&0===t[0].indexOf("0x")?"eth_getTransactionByBlockHashAndIndex":"eth_getTransactionByBlockNumberAndIndex"},g=function(t){return n.isString(t[0])&&0===t[0].indexOf("0x")?"eth_getUncleByBlockHashAndIndex":"eth_getUncleByBlockNumberAndIndex"},w=function(t){return n.isString(t[0])&&0===t[0].indexOf("0x")?"eth_getBlockTransactionCountByHash":"eth_getBlockTransactionCountByNumber"},_=function(t){return n.isString(t[0])&&0===t[0].indexOf("0x")?"eth_getUncleCountByBlockHash":"eth_getUncleCountByBlockNumber"},M=function(){var t=this;i.packageInit(this,arguments);var e=this.setProvider;this.setProvider=function(){e.apply(t,arguments),t.net.setProvider.apply(t,arguments),t.personal.setProvider.apply(t,arguments),t.accounts.setProvider.apply(t,arguments),t.Contract.setProvider(t.currentProvider,t.accounts)};var r=null,o="latest";Object.defineProperty(this,"defaultAccount",{get:function(){return r},set:function(e){return e&&(r=u.toChecksumAddress(m.inputAddressFormatter(e))),t.Contract.defaultAccount=r,t.personal.defaultAccount=r,x.forEach(function(t){t.defaultAccount=r}),e},enumerable:!0}),Object.defineProperty(this,"defaultBlock",{get:function(){return o},set:function(e){return o=e,t.Contract.defaultBlock=o,t.personal.defaultBlock=o,x.forEach(function(t){t.defaultBlock=o}),e},enumerable:!0}),this.clearSubscriptions=t._requestManager.clearSubscriptions,this.net=new f(this.currentProvider),this.net.getNetworkType=b.bind(this),this.accounts=new l(this.currentProvider),this.personal=new c(this.currentProvider),this.personal.defaultAccount=this.defaultAccount;var M=function(){h.apply(this,arguments)};M.setProvider=function(){h.setProvider.apply(this,arguments)},(M.prototype=Object.create(h.prototype)).constructor=M,this.Contract=M,this.Contract.defaultAccount=this.defaultAccount,this.Contract.defaultBlock=this.defaultBlock,this.Contract.setProvider(this.currentProvider,this.accounts),this.Iban=d,this.abi=p;var x=[new s({name:"getNodeInfo",call:"web3_clientVersion"}),new s({name:"getProtocolVersion",call:"eth_protocolVersion",params:0}),new s({name:"getCoinbase",call:"eth_coinbase",params:0}),new s({name:"isMining",call:"eth_mining",params:0}),new s({name:"getHashrate",call:"eth_hashrate",params:0,outputFormatter:u.hexToNumber}),new s({name:"isSyncing",call:"eth_syncing",params:0,outputFormatter:m.outputSyncingFormatter}),new s({name:"getGasPrice",call:"eth_gasPrice",params:0,outputFormatter:m.outputBigNumberFormatter}),new s({name:"getAccounts",call:"eth_accounts",params:0,outputFormatter:u.toChecksumAddress}),new s({name:"getBlockNumber",call:"eth_blockNumber",params:0,outputFormatter:u.hexToNumber}),new s({name:"getBalance",call:"eth_getBalance",params:2,inputFormatter:[m.inputAddressFormatter,m.inputDefaultBlockNumberFormatter],outputFormatter:m.outputBigNumberFormatter}),new s({name:"getStorageAt",call:"eth_getStorageAt",params:3,inputFormatter:[m.inputAddressFormatter,u.numberToHex,m.inputDefaultBlockNumberFormatter]}),new s({name:"getCode",call:"eth_getCode",params:2,inputFormatter:[m.inputAddressFormatter,m.inputDefaultBlockNumberFormatter]}),new s({name:"getBlock",call:y,params:2,inputFormatter:[m.inputBlockNumberFormatter,function(t){return!!t}],outputFormatter:m.outputBlockFormatter}),new s({name:"getUncle",call:g,params:2,inputFormatter:[m.inputBlockNumberFormatter,u.numberToHex],outputFormatter:m.outputBlockFormatter}),new s({name:"getBlockTransactionCount",call:w,params:1,inputFormatter:[m.inputBlockNumberFormatter],outputFormatter:u.hexToNumber}),new s({name:"getBlockUncleCount",call:_,params:1,inputFormatter:[m.inputBlockNumberFormatter],outputFormatter:u.hexToNumber}),new s({name:"getTransaction",call:"eth_getTransactionByHash",params:1,inputFormatter:[null],outputFormatter:m.outputTransactionFormatter}),new s({name:"getTransactionFromBlock",call:v,params:2,inputFormatter:[m.inputBlockNumberFormatter,u.numberToHex],outputFormatter:m.outputTransactionFormatter}),new s({name:"getTransactionReceipt",call:"eth_getTransactionReceipt",params:1,inputFormatter:[null],outputFormatter:m.outputTransactionReceiptFormatter}),new s({name:"getTransactionCount",call:"eth_getTransactionCount",params:2,inputFormatter:[m.inputAddressFormatter,m.inputDefaultBlockNumberFormatter],outputFormatter:u.hexToNumber}),new s({name:"sendSignedTransaction",call:"eth_sendRawTransaction",params:1,inputFormatter:[null]}),new s({name:"signTransaction",call:"eth_signTransaction",params:1,inputFormatter:[m.inputTransactionFormatter]}),new s({name:"sendTransaction",call:"eth_sendTransaction",params:1,inputFormatter:[m.inputTransactionFormatter]}),new s({name:"sign",call:"eth_sign",params:2,inputFormatter:[m.inputSignFormatter,m.inputAddressFormatter],transformPayload:function(t){return t.params.reverse(),t}}),new s({name:"call",call:"eth_call",params:2,inputFormatter:[m.inputCallFormatter,m.inputDefaultBlockNumberFormatter]}),new s({name:"estimateGas",call:"eth_estimateGas",params:1,inputFormatter:[m.inputCallFormatter],outputFormatter:u.hexToNumber}),new s({name:"getCompilers",call:"eth_getCompilers",params:0}),new s({name:"compile.solidity",call:"eth_compileSolidity",params:1}),new s({name:"compile.lll",call:"eth_compileLLL",params:1}),new s({name:"compile.serpent",call:"eth_compileSerpent",params:1}),new s({name:"submitWork",call:"eth_submitWork",params:3}),new s({name:"getWork",call:"eth_getWork",params:0}),new s({name:"getPastLogs",call:"eth_getLogs",params:1,inputFormatter:[m.inputLogFormatter],outputFormatter:m.outputLogFormatter}),new a({name:"subscribe",type:"eth",subscriptions:{newBlockHeaders:{subscriptionName:"newHeads",params:0,outputFormatter:m.outputBlockFormatter},pendingTransactions:{subscriptionName:"newPendingTransactions",params:0},logs:{params:1,inputFormatter:[m.inputLogFormatter],outputFormatter:m.outputLogFormatter,subscriptionHandler:function(t){t.removed?this.emit("changed",t):this.emit("data",t),n.isFunction(this.callback)&&this.callback(null,t,this)}},syncing:{params:0,outputFormatter:m.outputSyncingFormatter,subscriptionHandler:function(t){var e=this;!0!==this._isSyncing?(this._isSyncing=!0,this.emit("changed",e._isSyncing),n.isFunction(this.callback)&&this.callback(null,e._isSyncing,this),setTimeout(function(){e.emit("data",t),n.isFunction(e.callback)&&e.callback(null,t,e)},0)):(this.emit("data",t),n.isFunction(e.callback)&&this.callback(null,t,this),clearTimeout(this._isSyncingTimeout),this._isSyncingTimeout=setTimeout(function(){t.currentBlock>t.highestBlock-200&&(e._isSyncing=!1,e.emit("changed",e._isSyncing),n.isFunction(e.callback)&&e.callback(null,e._isSyncing,e))},500))}}}})];x.forEach(function(e){e.attachToObject(t),e.setRequestManager(t._requestManager,t.accounts),e.defaultBlock=t.defaultBlock,e.defaultAccount=t.defaultAccount})};i.addProviders(M),e.exports=M},{"./getNetworkType.js":371,underscore:370,"web3-core":209,"web3-core-helpers":191,"web3-core-method":193,"web3-core-subscriptions":206,"web3-eth-abi":213,"web3-eth-accounts":364,"web3-eth-contract":366,"web3-eth-iban":368,"web3-eth-personal":369,"web3-net":373,"web3-utils":393}],373:[function(t,e,r){var n=t("web3-core"),i=t("web3-core-method"),o=t("web3-utils"),a=function(){var t=this;n.packageInit(this,arguments),[new i({name:"getId",call:"net_version",params:0,outputFormatter:o.hexToNumber}),new i({name:"isListening",call:"net_listening",params:0}),new i({name:"getPeerCount",call:"net_peerCount",params:0,outputFormatter:o.hexToNumber})].forEach(function(e){e.attachToObject(t),e.setRequestManager(t._requestManager)})};n.addProviders(a),e.exports=a},{"web3-core":209,"web3-core-method":193,"web3-utils":393}],374:[function(t,e,r){e.exports=XMLHttpRequest},{}],375:[function(t,e,r){var n=t("web3-core-helpers").errors,i=t("xhr2"),o=function(t,e,r){this.host=t||"http://localhost:8545",this.timeout=e||0,this.connected=!1,this.headers=r};o.prototype._prepareRequest=function(){var t=new i;return t.open("POST",this.host,!0),t.setRequestHeader("Content-Type","application/json"),this.headers&&this.headers.forEach(function(e){t.setRequestHeader(e.name,e.value)}),t},o.prototype.send=function(t,e){var r=this,i=this._prepareRequest();i.onreadystatechange=function(){if(4===i.readyState&&1!==i.timeout){var t=i.responseText,o=null;try{t=JSON.parse(t)}catch(t){o=n.InvalidResponse(i.responseText)}r.connected=!0,e(o,t)}},i.ontimeout=function(){r.connected=!1,e(n.ConnectionTimeout(this.timeout))};try{i.send(JSON.stringify(t))}catch(t){this.connected=!1,e(n.InvalidConnection(this.host))}},e.exports=o},{"web3-core-helpers":191,xhr2:374}],376:[function(t,e,r){!function(t,n,i,o,a,s){var u=l(function(t,e){var r=e.length;return l(function(n){for(var i=0;i0;)if(U+=r,r=t.charAt(o++),4===z?(O+=String.fromCharCode(parseInt(U,16)),z=0,f=o-1):z++,!r)break t;if('"'===r&&!L){q=D.pop()||p,O+=t.substring(f,o-1);break}if(!("\\"!==r||L||(L=!0,O+=t.substring(f,o-1),r=t.charAt(o++))))break;if(L){if(L=!1,"n"===r?O+="\n":"r"===r?O+="\r":"t"===r?O+="\t":"f"===r?O+="\f":"b"===r?O+="\b":"u"===r?(z=1,U=""):O+=r,r=t.charAt(o++),f=o-1,r)continue;break}h.lastIndex=o;var d=h.exec(t);if(!d){o=t.length+1,O+=t.substring(f,o-1);break}if(o=d.index+1,!(r=t.charAt(d.index))){O+=t.substring(f,o-1);break}}continue;case M:if(!r)continue;if("r"!==r)return X("Invalid true started with t"+r);q=x;continue;case x:if(!r)continue;if("u"!==r)return X("Invalid true started with tr"+r);q=k;continue;case k:if(!r)continue;if("e"!==r)return X("Invalid true started with tru"+r);a(!0),u(),q=D.pop()||p;continue;case S:if(!r)continue;if("a"!==r)return X("Invalid false started with f"+r);q=E;continue;case E:if(!r)continue;if("l"!==r)return X("Invalid false started with fa"+r);q=A;continue;case A:if(!r)continue;if("s"!==r)return X("Invalid false started with fal"+r);q=j;continue;case j:if(!r)continue;if("e"!==r)return X("Invalid false started with fals"+r);a(!1),u(),q=D.pop()||p;continue;case I:if(!r)continue;if("u"!==r)return X("Invalid null started with n"+r);q=B;continue;case B:if(!r)continue;if("l"!==r)return X("Invalid null started with nu"+r);q=T;continue;case T:if(!r)continue;if("l"!==r)return X("Invalid null started with nul"+r);a(null),u(),q=D.pop()||p;continue;case C:if("."!==r)return X("Leading zero not followed by .");N+=r,q=P;continue;case P:if(-1!=="0123456789".indexOf(r))N+=r;else if("."===r){if(-1!==N.indexOf("."))return X("Invalid number has two dots");N+=r}else if("e"===r||"E"===r){if(-1!==N.indexOf("e")||-1!==N.indexOf("E"))return X("Invalid number has two exponential");N+=r}else if("+"===r||"-"===r){if("e"!==n&&"E"!==n)return X("Invalid symbol in number");N+=r}else N&&(a(parseFloat(N)),u(),N=""),o--,q=D.pop()||p;continue;default:return X("Unknown state: "+q)}H>=R&&(J=0,O!==s&&O.length>c&&(X("Max buffer length exceeded: textNode"),J=Math.max(J,O.length)),N.length>c&&(X("Max buffer length exceeded: numberNode"),J=Math.max(J,N.length)),R=c-J+H);var J}),t(ft).on(function(){if(q==l)return a({}),u(),void(F=!0);q===p&&0===K||X("Unexpected end");O!==s&&(a(O),u(),O=s);F=!0})}var R,O,N,L,F,q,D,U,z,K,H,V=(R=l(function(t){return t.unshift(/^/),(e=RegExp(t.map(c("source")).join(""))).exec.bind(e);var e}),L=R(O=/(\$?)/,/([\w-_]+|\*)/,N=/(?:{([\w ]*?)})?/),F=R(O,/\["([^"]+)"\]/,N),q=R(O,/\[(\d+|\*)\]/,N),D=R(O,/()/,/{([\w ]*?)}/),U=R(/\.\./),z=R(/\./),K=R(O,/!/),H=R(/$/),function(t){return t(h(L,F,q,D),U,z,K,H)});function W(t,e){return{key:t,node:e}}var X=c("key"),G=c("node"),J={};function Z(t){var e=t(tt).emit,r=t(et).emit,n=t(at).emit,o=t(ot).emit;function a(t,e,r){G(k(t))[e]=r}function s(t,r,n){t&&a(t,r,n);var i=M(W(r,n),t);return e(i),i}var u={};return u[dt]=function(t,e){if(!t)return n(e),s(t,J,e);var r,o,u,f=(o=e,u=G(k(r=t)),y(i,u)?s(r,v(u),o):r),c=S(f),h=X(k(f));return a(c,h,e),M(W(h,e),c)},u[lt]=function(t){return r(t),S(t)||o(G(k(t)))},u[ht]=s,u}var $=V(function(t,e,r,n,i){var a=1,s=2,c=3,d=f(X,k),l=f(G,k);function b(t,e){return!!e[a]?p(t,k):t}function y(t){if(t==m)return m;return p(function(t){return d(t)!=J},f(t,S))}function g(){return function(t){return d(t)==J}}function w(t,e,r,n,i){var o,a=t(r);if(a){var s=(o=a,B(function(t,e){return e(t,o)},n,e));return i(r.substr(v(a[0])),s)}}function M(t,e){return u(w,t,e)}var x=h(M(t,A(b,function(t,e){var r=e[c];return r?p(f(u(_,E(r.split(/\W+/))),l),t):t},function(t,e){var r=e[s];return p(r&&"*"!=r?function(t){return d(t)==r}:m,t)},y)),M(e,A(function(t){if(t==m)return m;var e=g(),r=t,n=y(function(t){return i(t)}),i=h(e,r,n);return i})),M(r,A()),M(n,A(b,g)),M(i,A(function(t){return function(e){var r=t(e);return!0===r?k(e):r}})),function(t){throw o('"'+t+'" could not be tokenised')});function j(t,e){return e}function I(t,e){return x(t,e,t?I:j)}return function(t){try{return I(t,m)}catch(e){throw o('Could not compile "'+t+'" because '+e.message)}}});function Y(t,e,r){var n,i;function o(t){return function(e){return e.id==t}}return{on:function(r,o){var a={listener:r,id:o||r};return e&&e.emit(t,r,a.id),n=M(a,n),i=M(r,i),this},emit:function(){!function t(e,r){e&&(k(e).apply(null,r),t(S(e),r))}(i,arguments)},un:function(e){var a;n=T(n,o(e),function(t){a=t}),a&&(i=T(i,function(t){return t==a.listener}),r&&r.emit(t,a.listener,a.id))},listeners:function(){return i},hasListener:function(t){return w(function t(e,r){return r&&(e(k(r))?k(r):t(e,S(r)))}(t?o(t):m,n))}}}var Q=1,tt=Q++,et=Q++,rt=Q++,nt=Q++,it="fail",ot=Q++,at=Q++,st="start",ut="data",ft="end",ct=Q++,ht=Q++,dt=Q++,lt=Q++;function pt(t,e,r){try{var n=a.parse(e)}catch(t){}return{statusCode:t,body:e,jsonBody:n,thrown:r}}function bt(t,e){var r={node:t(et),path:t(tt)};function n(e,r,n){var i=t(e).emit;r.on(function(t){var e,r,o,a=n(t);!1!==a&&(e=i,r=G(a),o=C(t),e(r,j(S(I(X,o))),j(I(G,o))))},e),t("removeListener").on(function(n){n==e&&(t(n).listeners()||r.un(e))})}t("newListener").on(function(t){var i=/(node|path):(.*)/.exec(t);if(i){var o=r[i[1]];o.hasListener(t)||n(t,o,e(i[2]))}})}function mt(t,e){var r,n=/^(node|path):./,i=t(ot),o=t(nt).emit,a=t(rt).emit,s=l(function(e,i){if(r[e])d(i,r[e]);else{var o=t(e),a=i[0];n.test(e)?f(o,a):o.on(a)}return r});function f(t,e,n){n=n||e;var i=c(e);return t.on(function(){var e=!1;r.forget=function(){e=!0},d(arguments,i),delete r.forget,e&&t.un(n)},n),r}function c(t){return function(){try{return t.apply(r,arguments)}catch(t){setTimeout(function(){throw t})}}}function h(e,r,n){var i,s;"node"==e?(s=n,i=function(){var t=s.apply(this,arguments);w(t)&&(t==gt.drop?o():a(t))}):i=n,f(t(e+":"+r),i,n)}function p(t,e,n){return g(e)?h(t,e,n):function(t,e){for(var r in e)h(t,r,e[r])}(t,e),r}return t(at).on(function(t){var e;r.root=(e=t,function(){return e})}),t(st).on(function(t,e){r.header=function(t){return t?e[t]:e}}),r={on:s,addListener:s,removeListener:function(e,n,o){if("done"==e)i.un(n);else if("node"==e||"path"==e)t.un(e+":"+n,o);else{var a=n;t(e).un(a)}return r},emit:t.emit,node:u(p,"node"),path:u(p,"path"),done:u(f,i),start:u(function(e,n){return t(e).on(c(n),n),r},st),fail:t(it).on,abort:t(ct).emit,header:b,root:b,source:e}}function yt(e,r,n,i,o){var a=function(){var t={},e=n("newListener"),r=n("removeListener");function n(n){return t[n]=Y(n,e,r)}function i(e){return t[e]||n(e)}return["emit","on","un"].forEach(function(t){i[t]=l(function(e,r){d(r,i(e)[t])})}),i}();return r&&function(e,r,n,i,o,a,f){var c,h=e(ut).emit,d=e(it).emit,l=0,p=!0;function b(){var t=r.responseText,e=t.substr(l);e&&h(e),l=v(t)}e(ct).on(function(){r.onreadystatechange=null,r.abort()}),"onprogress"in r&&(r.onprogress=b),r.onreadystatechange=function(){function t(){try{p&&e(st).emit(r.status,(t=r.getAllResponseHeaders(),n={},t&&t.split("\r\n").forEach(function(t){var e=t.indexOf(": ");n[t.substring(0,e)]=t.substring(e+2)}),n)),p=!1}catch(t){}var t,n}switch(r.readyState){case 2:case 3:return t();case 4:t(),2==String(r.status)[0]?(b(),e(ft).emit()):d(pt(r.status,r.responseText))}};try{for(var m in r.open(n,i,!0),a)r.setRequestHeader(m,a[m]);(function(t,e){function r(e){return e.port||{"http:":80,"https:":443}[e.protocol||t.protocol]}return!!(e.protocol&&e.protocol!=t.protocol||e.host&&e.host!=t.host||e.host&&r(e)!=r(t))})(t.location,{protocol:(c=/(\w+:)?(?:\/\/)([\w.-]+)?(?::(\d+))?\/?/.exec(i)||[])[1]||"",host:c[2]||"",port:c[3]||""})||r.setRequestHeader("X-Requested-With","XMLHttpRequest"),r.withCredentials=f,r.send(o)}catch(e){t.setTimeout(u(d,pt(s,s,e)),0)}}(a,new XMLHttpRequest,e,r,n,i,o),P(a),function(t,e){var r,n={};function i(t){return function(e){r=t(r,e)}}for(var o in e)t(o).on(i(e[o]),n);t(rt).on(function(t){var e=k(r),n=X(e),i=S(r);i&&(G(k(i))[n]=t)}),t(nt).on(function(){var t=k(r),e=X(t),n=S(r);n&&delete G(k(n))[e]}),t(ct).on(function(){for(var r in e)t(r).un(n)})}(a,Z(a)),bt(a,$),mt(a,r)}function vt(t,e,r,n,i,o,s){return i=i?a.parse(a.stringify(i)):{},n?g(n)||(n=a.stringify(n),i["Content-Type"]=i["Content-Type"]||"application/json"):n=null,t(r||"GET",(u=e,!1===s&&(-1==u.indexOf("?")?u+="?":u+="&",u+="_="+(new Date).getTime()),u),n,i,o||!1);var u}function gt(t){var e=A("resume","pause","pipe"),r=u(_,e);return t?r(t)||g(t)?vt(yt,t):vt(yt,t.url,t.method,t.body,t.headers,t.withCredentials,t.cached):yt()}gt.drop=function(){return gt.drop},"function"==typeof define&&define.amd?define("oboe",[],function(){return gt}):"object"===(void 0===r?"undefined":_typeof(r))?e.exports=gt:t.oboe=gt}(function(){try{return window}catch(t){return self}}(),Object,Array,Error,JSON)},{}],377:[function(t,e,r){arguments[4][178][0].apply(r,arguments)},{dup:178}],378:[function(t,e,r){var n=t("underscore"),i=t("web3-core-helpers").errors,o=t("oboe"),a=function(t,e){var r=this;this.responseCallbacks={},this.notificationCallbacks=[],this.path=t,this.connection=e.connect({path:this.path}),this.addDefaultEvents();var i=function(t){var e=null;n.isArray(t)?t.forEach(function(t){r.responseCallbacks[t.id]&&(e=t.id)}):e=t.id,e||-1===t.method.indexOf("_subscription")?r.responseCallbacks[e]&&(r.responseCallbacks[e](null,t),delete r.responseCallbacks[e]):r.notificationCallbacks.forEach(function(e){n.isFunction(e)&&e(t)})};"Socket"===e.constructor.name?o(this.connection).done(i):this.connection.on("data",function(t){r._parseResponse(t.toString()).forEach(i)})};a.prototype.addDefaultEvents=function(){var t=this;this.connection.on("connect",function(){}),this.connection.on("error",function(){t._timeout()}),this.connection.on("end",function(){t._timeout()}),this.connection.on("timeout",function(){t._timeout()})},a.prototype._parseResponse=function(t){var e=this,r=[];return t.replace(/\}[\n\r]?\{/g,"}|--|{").replace(/\}\][\n\r]?\[\{/g,"}]|--|[{").replace(/\}[\n\r]?\[\{/g,"}|--|[{").replace(/\}\][\n\r]?\{/g,"}]|--|{").split("|--|").forEach(function(t){e.lastChunk&&(t=e.lastChunk+t);var n=null;try{n=JSON.parse(t)}catch(r){return e.lastChunk=t,clearTimeout(e.lastChunkTimeout),void(e.lastChunkTimeout=setTimeout(function(){throw e._timeout(),i.InvalidResponse(t)},15e3))}clearTimeout(e.lastChunkTimeout),e.lastChunk=null,n&&r.push(n)}),r},a.prototype._addResponseCallback=function(t,e){var r=t.id||t[0].id,n=t.method||t[0].method;this.responseCallbacks[r]=e,this.responseCallbacks[r].method=n},a.prototype._timeout=function(){for(var t in this.responseCallbacks)this.responseCallbacks.hasOwnProperty(t)&&(this.responseCallbacks[t](i.InvalidConnection("on IPC")),delete this.responseCallbacks[t])},a.prototype.reconnect=function(){this.connection.connect({path:this.path})},a.prototype.send=function(t,e){this.connection.writable||this.connection.connect({path:this.path}),this.connection.write(JSON.stringify(t)),this._addResponseCallback(t,e)},a.prototype.on=function(t,e){if("function"!=typeof e)throw new Error("The second parameter callback must be a function.");switch(t){case"data":this.notificationCallbacks.push(e);break;default:this.connection.on(t,e)}},a.prototype.once=function(t,e){if("function"!=typeof e)throw new Error("The second parameter callback must be a function.");this.connection.once(t,e)},a.prototype.removeListener=function(t,e){var r=this;switch(t){case"data":this.notificationCallbacks.forEach(function(t,n){t===e&&r.notificationCallbacks.splice(n,1)});break;default:this.connection.removeListener(t,e)}},a.prototype.removeAllListeners=function(t){switch(t){case"data":this.notificationCallbacks=[];break;default:this.connection.removeAllListeners(t)}},a.prototype.reset=function(){this._timeout(),this.notificationCallbacks=[],this.connection.removeAllListeners("error"),this.connection.removeAllListeners("end"),this.connection.removeAllListeners("timeout"),this.addDefaultEvents()},e.exports=a},{oboe:376,underscore:377,"web3-core-helpers":191}],379:[function(t,e,r){arguments[4][178][0].apply(r,arguments)},{dup:178}],380:[function(t,e,r){(function(r){var n=t("underscore"),i=t("web3-core-helpers").errors,o=null,a=null,s=null;"undefined"!=typeof window?(o=window.WebSocket,a=btoa,s=function(t){return new URL(t)}):(o=t("websocket").w3cwebsocket,a=function(t){return r(t).toString("base64")},s=t("url").parse);var u=function(t,e){var r=this;this.responseCallbacks={},this.notificationCallbacks=[],e=e||{},this._customTimeout=e.timeout;var i=s(t),u=e.headers||{};i.username&&i.password&&(u.authorization="Basic "+a(i.username+":"+i.password)),this.connection=new o(t,void 0,void 0,u),this.addDefaultEvents(),this.connection.onmessage=function(t){var e="string"==typeof t.data?t.data:"";r._parseResponse(e).forEach(function(t){var e=null;n.isArray(t)?t.forEach(function(t){r.responseCallbacks[t.id]&&(e=t.id)}):e=t.id,e||-1===t.method.indexOf("_subscription")?r.responseCallbacks[e]&&(r.responseCallbacks[e](null,t),delete r.responseCallbacks[e]):r.notificationCallbacks.forEach(function(e){n.isFunction(e)&&e(t)})})}};u.prototype.addDefaultEvents=function(){var t=this;this.connection.onerror=function(){t._timeout()},this.connection.onclose=function(){t._timeout(),t.reset()}},u.prototype._parseResponse=function(t){var e=this,r=[];return t.replace(/\}[\n\r]?\{/g,"}|--|{").replace(/\}\][\n\r]?\[\{/g,"}]|--|[{").replace(/\}[\n\r]?\[\{/g,"}|--|[{").replace(/\}\][\n\r]?\{/g,"}]|--|{").split("|--|").forEach(function(t){e.lastChunk&&(t=e.lastChunk+t);var n=null;try{n=JSON.parse(t)}catch(r){return e.lastChunk=t,clearTimeout(e.lastChunkTimeout),void(e.lastChunkTimeout=setTimeout(function(){throw e._timeout(),i.InvalidResponse(t)},15e3))}clearTimeout(e.lastChunkTimeout),e.lastChunk=null,n&&r.push(n)}),r},u.prototype._addResponseCallback=function(t,e){var r=t.id||t[0].id,n=t.method||t[0].method;this.responseCallbacks[r]=e,this.responseCallbacks[r].method=n;var o=this;this._customTimeout&&setTimeout(function(){o.responseCallbacks[r]&&(o.responseCallbacks[r](i.ConnectionTimeout(o._customTimeout)),delete o.responseCallbacks[r])},this._customTimeout)},u.prototype._timeout=function(){for(var t in this.responseCallbacks)this.responseCallbacks.hasOwnProperty(t)&&(this.responseCallbacks[t](i.InvalidConnection("on WS")),delete this.responseCallbacks[t])},u.prototype.send=function(t,e){var r=this;if(this.connection.readyState!==this.connection.CONNECTING){if(this.connection.readyState!==this.connection.OPEN)return console.error("connection not open on send()"),"function"==typeof this.connection.onerror?this.connection.onerror(new Error("connection not open")):console.error("no error callback"),void e(new Error("connection not open"));this.connection.send(JSON.stringify(t)),this._addResponseCallback(t,e)}else setTimeout(function(){r.send(t,e)},10)},u.prototype.on=function(t,e){if("function"!=typeof e)throw new Error("The second parameter callback must be a function.");switch(t){case"data":this.notificationCallbacks.push(e);break;case"connect":this.connection.onopen=e;break;case"end":this.connection.onclose=e;break;case"error":this.connection.onerror=e}},u.prototype.removeListener=function(t,e){var r=this;switch(t){case"data":this.notificationCallbacks.forEach(function(t,n){t===e&&r.notificationCallbacks.splice(n,1)})}},u.prototype.removeAllListeners=function(t){switch(t){case"data":this.notificationCallbacks=[];break;case"connect":this.connection.onopen=null;break;case"end":this.connection.onclose=null;break;case"error":this.connection.onerror=null}},u.prototype.reset=function(){this._timeout(),this.notificationCallbacks=[],this.addDefaultEvents()},e.exports=u}).call(this,t("buffer").Buffer)},{buffer:47,underscore:379,url:158,"web3-core-helpers":191,websocket:45}],381:[function(t,e,r){var n=t("web3-core"),i=t("web3-core-subscriptions").subscriptions,o=t("web3-core-method"),a=t("web3-net"),s=function(){var t=this;n.packageInit(this,arguments);var e=this.setProvider;this.setProvider=function(){e.apply(t,arguments),t.net.setProvider.apply(t,arguments)},this.clearSubscriptions=t._requestManager.clearSubscriptions,this.net=new a(this.currentProvider),[new i({name:"subscribe",type:"shh",subscriptions:{messages:{params:1}}}),new o({name:"getVersion",call:"shh_version",params:0}),new o({name:"getInfo",call:"shh_info",params:0}),new o({name:"setMaxMessageSize",call:"shh_setMaxMessageSize",params:1}),new o({name:"setMinPoW",call:"shh_setMinPoW",params:1}),new o({name:"markTrustedPeer",call:"shh_markTrustedPeer",params:1}),new o({name:"newKeyPair",call:"shh_newKeyPair",params:0}),new o({name:"addPrivateKey",call:"shh_addPrivateKey",params:1}),new o({name:"deleteKeyPair",call:"shh_deleteKeyPair",params:1}),new o({name:"hasKeyPair",call:"shh_hasKeyPair",params:1}),new o({name:"getPublicKey",call:"shh_getPublicKey",params:1}),new o({name:"getPrivateKey",call:"shh_getPrivateKey",params:1}),new o({name:"newSymKey",call:"shh_newSymKey",params:0}),new o({name:"addSymKey",call:"shh_addSymKey",params:1}),new o({name:"generateSymKeyFromPassword",call:"shh_generateSymKeyFromPassword",params:1}),new o({name:"hasSymKey",call:"shh_hasSymKey",params:1}),new o({name:"getSymKey",call:"shh_getSymKey",params:1}),new o({name:"deleteSymKey",call:"shh_deleteSymKey",params:1}),new o({name:"newMessageFilter",call:"shh_newMessageFilter",params:1}),new o({name:"getFilterMessages",call:"shh_getFilterMessages",params:1}),new o({name:"deleteMessageFilter",call:"shh_deleteMessageFilter",params:1}),new o({name:"post",call:"shh_post",params:1,inputFormatter:[null]})].forEach(function(e){e.attachToObject(t),e.setRequestManager(t._requestManager)})};n.addProviders(s),e.exports=s},{"web3-core":209,"web3-core-method":193,"web3-core-subscriptions":206,"web3-net":373}],382:[function(t,e,r){arguments[4][210][0].apply(r,arguments)},{dup:210}],383:[function(t,e,r){arguments[4][165][0].apply(r,arguments)},{dup:165}],384:[function(t,e,r){var n=t("bn.js"),i=t("number-to-bn"),o=new n(0),a=new n(-1),s={noether:"0",wei:"1",kwei:"1000",Kwei:"1000",babbage:"1000",femtoether:"1000",mwei:"1000000",Mwei:"1000000",lovelace:"1000000",picoether:"1000000",gwei:"1000000000",Gwei:"1000000000",shannon:"1000000000",nanoether:"1000000000",nano:"1000000000",szabo:"1000000000000",microether:"1000000000000",micro:"1000000000000",finney:"1000000000000000",milliether:"1000000000000000",milli:"1000000000000000",ether:"1000000000000000000",kether:"1000000000000000000000",grand:"1000000000000000000000",mether:"1000000000000000000000000",gether:"1000000000000000000000000000",tether:"1000000000000000000000000000000"};function u(t){var e=t?t.toLowerCase():"ether",r=s[e];if("string"!=typeof r)throw new Error("[ethjs-unit] the unit provided "+t+" doesn't exists, please use the one of the following units "+JSON.stringify(s,null,2));return new n(r,10)}function f(t){if("string"==typeof t){if(!t.match(/^-?[0-9.]+$/))throw new Error("while converting number to string, invalid number value '"+t+"', should be a number matching (^-?[0-9.]+).");return t}if("number"==typeof t)return String(t);if("object"===(void 0===t?"undefined":_typeof(t))&&t.toString&&(t.toTwos||t.dividedToIntegerBy))return t.toPrecision?String(t.toPrecision()):t.toString(10);throw new Error("while converting number to string, invalid number value '"+t+"' type "+(void 0===t?"undefined":_typeof(t))+".")}e.exports={unitMap:s,numberToString:f,getValueOfUnit:u,fromWei:function(t,e,r){var n=i(t),f=n.lt(o),c=u(e),h=s[e].length-1||1,d=r||{};f&&(n=n.mul(a));for(var l=n.mod(c).toString(10);l.length2)throw new Error("[ethjs-unit] while converting number "+t+" to wei, too many decimal points");var d=h[0],l=h[1];if(d||(d="0"),l||(l="0"),l.length>o)throw new Error("[ethjs-unit] while converting number "+t+" to wei, too many decimal places");for(;l.length65536){if(!i)throw new Error("Requested too many random bytes.");r(new Error("Requested too many random bytes."))}if(void 0!==n&&n.randomBytes){if(!i)return"0x"+n.randomBytes(e).toString("hex");n.randomBytes(e,function(t,e){t?r(u):r(null,"0x"+e.toString("hex"))})}else{var o;if(void 0!==n?o=n:"undefined"!=typeof msCrypto&&(o=msCrypto),o&&o.getRandomValues){var a=o.getRandomValues(new Uint8Array(e)),s="0x"+Array.from(a).map(function(t){return t.toString(16)}).join("");if(!i)return s;r(null,s)}else{var u=new Error('No "crypto" object available. This Browser doesn\'t support generating secure random bytes.');if(!i)throw u;r(u)}}}},{"./crypto.js":388}],390:[function(t,e,r){var n=t("is-hex-prefixed");e.exports=function(t){return"string"!=typeof t?t:n(t)?t.slice(2):t}},{"is-hex-prefixed":385}],391:[function(t,e,r){arguments[4][178][0].apply(r,arguments)},{dup:178}],392:[function(t,e,r){(function(t){!function(n){var i="object"==(void 0===r?"undefined":_typeof(r))&&r,o="object"==(void 0===e?"undefined":_typeof(e))&&e&&e.exports==i&&e,a="object"==(void 0===t?"undefined":_typeof(t))&&t;a.global!==a&&a.window!==a||(n=a);var s,u,f,c=String.fromCharCode;function h(t){for(var e,r,n=[],i=0,o=t.length;i=55296&&e<=56319&&i=55296&&t<=57343)throw Error("Lone surrogate U+"+t.toString(16).toUpperCase()+" is not a scalar value")}function l(t,e){return c(t>>e&63|128)}function p(t){if(0==(4294967168&t))return c(t);var e="";return 0==(4294965248&t)?e=c(t>>6&31|192):0==(4294901760&t)?(d(t),e=c(t>>12&15|224),e+=l(t,6)):0==(4292870144&t)&&(e=c(t>>18&7|240),e+=l(t,12),e+=l(t,6)),e+=c(63&t|128)}function b(){if(f>=u)throw Error("Invalid byte index");var t=255&s[f];if(f++,128==(192&t))return 63&t;throw Error("Invalid continuation byte")}function m(){var t,e;if(f>u)throw Error("Invalid byte index");if(f==u)return!1;if(t=255&s[f],f++,0==(128&t))return t;if(192==(224&t)){if((e=(31&t)<<6|b())>=128)return e;throw Error("Invalid continuation byte")}if(224==(240&t)){if((e=(15&t)<<12|b()<<6|b())>=2048)return d(e),e;throw Error("Invalid continuation byte")}if(240==(248&t)&&(e=(15&t)<<18|b()<<12|b()<<6|b())>=65536&&e<=1114111)return e;throw Error("Invalid UTF-8 detected")}var y={version:"2.0.0",encode:function(t){for(var e=h(t),r=e.length,n=-1,i="";++n65535&&(i+=c((e-=65536)>>>10&1023|55296),e=56320|1023&e),i+=c(e);return i}(r)}};if("function"==typeof define&&"object"==_typeof(define.amd)&&define.amd)define(function(){return y});else if(i&&!i.nodeType)if(o)o.exports=y;else{var v={}.hasOwnProperty;for(var g in y)v.call(y,g)&&(i[g]=y[g])}else n.utf8=y}(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],393:[function(t,e,r){var n=t("underscore"),i=t("ethjs-unit"),o=t("./utils.js"),a=t("./soliditySha3.js"),s=t("randomhex"),u=function(t){if(!o.isHexStrict(t))throw new Error("The parameter must be a valid HEX string.");var e="",r=0,n=t.length;for("0x"===t.substring(0,2)&&(r=2);r7?r+=t[n].toUpperCase():r+=t[n];return r},toHex:o.toHex,toBN:o.toBN,bytesToHex:o.bytesToHex,hexToBytes:o.hexToBytes,hexToNumberString:o.hexToNumberString,hexToNumber:o.hexToNumber,toDecimal:o.hexToNumber,numberToHex:o.numberToHex,fromDecimal:o.numberToHex,hexToUtf8:o.hexToUtf8,hexToString:o.hexToUtf8,toUtf8:o.hexToUtf8,utf8ToHex:o.utf8ToHex,stringToHex:o.utf8ToHex,fromUtf8:o.utf8ToHex,hexToAscii:u,toAscii:u,asciiToHex:f,fromAscii:f,unitMap:i.unitMap,toWei:function(t,e){if(e=c(e),!o.isBN(t)&&!n.isString(t))throw new Error("Please pass numbers as strings or BigNumber objects to avoid precision errors.");return o.isBN(t)?i.toWei(t,e):i.toWei(t,e).toString(10)},fromWei:function(t,e){if(e=c(e),!o.isBN(t)&&!n.isString(t))throw new Error("Please pass numbers as strings or BigNumber objects to avoid precision errors.");return o.isBN(t)?i.fromWei(t,e):i.fromWei(t,e).toString(10)},padLeft:o.leftPad,leftPad:o.leftPad,padRight:o.rightPad,rightPad:o.rightPad,toTwosComplement:o.toTwosComplement}},{"./soliditySha3.js":394,"./utils.js":395,"ethjs-unit":384,randomhex:389,underscore:391}],394:[function(t,e,r){var n=t("underscore"),i=t("bn.js"),o=t("./utils.js"),a=function(t){var e=void 0===t?"undefined":_typeof(t);if("string"===e)return o.isHexStrict(t)?new i(t.replace(/0x/i,""),16):new i(t,10);if("number"===e)return new i(t);if(o.isBigNumber(t))return new i(t.toString(10));if(o.isBN(t))return t;throw new Error(t+" is not a number")},s=function(t,e,r){var n,s,u,f;if("bytes"===(t=(u=t).startsWith("int[")?"int256"+u.slice(3):"int"===u?"int256":u.startsWith("uint[")?"uint256"+u.slice(4):"uint"===u?"uint256":u.startsWith("fixed[")?"fixed128x128"+u.slice(5):"fixed"===u?"fixed128x128":u.startsWith("ufixed[")?"ufixed128x128"+u.slice(6):"ufixed"===u?"ufixed128x128":u)){if(e.replace(/^0x/i,"").length%2!=0)throw new Error("Invalid bytes characters "+e.length);return e}if("string"===t)return o.utf8ToHex(e);if("bool"===t)return e?"01":"00";if(t.startsWith("address")){if(n=r?64:40,!o.isAddress(e))throw new Error(e+" is not a valid address, or the checksum is invalid.");return o.leftPad(e.toLowerCase(),n)}if(n=(f=/^\D+(\d+).*$/.exec(t))?parseInt(f[1],10):null,t.startsWith("bytes")){if(!n)throw new Error("bytes[] not yet supported in solidity");if(r&&(n=32),n<1||n>32||n256)throw new Error("Invalid uint"+n+" size");if((s=a(e)).bitLength()>n)throw new Error("Supplied uint exceeds width: "+n+" vs "+s.bitLength());if(s.lt(new i(0)))throw new Error("Supplied uint "+s.toString()+" is negative");return n?o.leftPad(s.toString("hex"),n/8*2):s}if(t.startsWith("int")){if(n%8||n<8||n>256)throw new Error("Invalid int"+n+" size");if((s=a(e)).bitLength()>n)throw new Error("Supplied int exceeds width: "+n+" vs "+s.bitLength());return s.lt(new i(0))?s.toTwos(n).toString("hex"):n?o.leftPad(s.toString("hex"),n/8*2):s}throw new Error("Unsupported or invalid type: "+t)},u=function(t){if(n.isArray(t))throw new Error("Autodetection of array types is not supported.");var e,r,a,u="";if(n.isObject(t)&&(t.hasOwnProperty("v")||t.hasOwnProperty("t")||t.hasOwnProperty("value")||t.hasOwnProperty("type"))?(e=t.hasOwnProperty("t")?t.t:t.type,u=t.hasOwnProperty("v")?t.v:t.value):(e=o.toHex(t,!0),u=o.toHex(t),e.startsWith("int")||e.startsWith("uint")||(e="bytes")),!e.startsWith("int")&&!e.startsWith("uint")||"string"!=typeof u||/^(-)?0x/i.test(u)||(u=new i(u)),n.isArray(u)){if(a=/^\D+\d*\[(\d+)\]$/.exec(e),(r=a?parseInt(a[1],10):null)&&u.length!==r)throw new Error(e+" is not matching the given array "+JSON.stringify(u));r=u.length}return n.isArray(u)?u.map(function(t){return s(e,t,r).toString("hex").replace("0x","")}).join(""):s(e,u,r).toString("hex").replace("0x","")};e.exports=function(){var t=Array.prototype.slice.call(arguments),e=n.map(t,u);return o.sha3("0x"+e.join(""))}},{"./utils.js":395,"bn.js":382,underscore:391}],395:[function(t,e,r){var n=t("underscore"),i=t("bn.js"),o=t("number-to-bn"),a=t("utf8"),s=t("eth-lib/lib/hash"),u=function(t){return t instanceof i||t&&t.constructor&&"BN"===t.constructor.name},f=function(t){return t&&t.constructor&&"BigNumber"===t.constructor.name},c=function(t){try{return o.apply(null,arguments)}catch(e){throw new Error(e+' Given value: "'+t+'"')}},h=function(t){return!!/^(0x)?[0-9a-f]{40}$/i.test(t)&&(!(!/^(0x|0X)?[0-9a-f]{40}$/.test(t)&&!/^(0x|0X)?[0-9A-F]{40}$/.test(t))||d(t))},d=function(t){t=t.replace(/^0x/i,"");for(var e=y(t.toLowerCase()).replace(/^0x/i,""),r=0;r<40;r++)if(parseInt(e[r],16)>7&&t[r].toUpperCase()!==t[r]||parseInt(e[r],16)<=7&&t[r].toLowerCase()!==t[r])return!1;return!0},l=function(t){var e="";t=(t=(t=(t=(t=a.encode(t)).replace(/^(?:\u0000)*/,"")).split("").reverse().join("")).replace(/^(?:\u0000)*/,"")).split("").reverse().join("");for(var r=0;r>>4).toString(16)),e.push((15&t[r]).toString(16));return"0x"+e.join("")},isHex:function(t){return(n.isString(t)||n.isNumber(t))&&/^(-0x|0x)?[0-9a-f]*$/i.test(t)},isHexStrict:m,leftPad:function(t,e,r){var n=/^0x/i.test(t)||"number"==typeof t,i=e-(t=t.toString(16).replace(/^0x/i,"")).length+1>=0?e-t.length+1:0;return(n?"0x":"")+new Array(i).join(r||"0")+t},rightPad:function(t,e,r){var n=/^0x/i.test(t)||"number"==typeof t,i=e-(t=t.toString(16).replace(/^0x/i,"")).length+1>=0?e-t.length+1:0;return(n?"0x":"")+t+new Array(i).join(r||"0")},toTwosComplement:function(t){return"0x"+c(t).toTwos(256).toString(16,64)},sha3:y}},{"bn.js":382,"eth-lib/lib/hash":383,"number-to-bn":386,underscore:391,utf8:392}],396:[function(t,e,r){e.exports={name:"web3",namespace:"ethereum",version:"1.0.0-beta.34",description:"Ethereum JavaScript API",repository:"https://github.com/ethereum/web3.js/tree/master/packages/web3",license:"LGPL-3.0",main:"src/index.js",types:"index.d.ts",bugs:{url:"https://github.com/ethereum/web3.js/issues"},keywords:["Ethereum","JavaScript","API"],author:"ethereum.org",authors:[{name:"Fabian Vogelsteller",email:"fabian@ethereum.org",homepage:"http://frozeman.de"},{name:"Marek Kotewicz",email:"marek@parity.io",url:"https://github.com/debris"},{name:"Marian Oancea",url:"https://github.com/cubedro"},{name:"Gav Wood",email:"g@parity.io",homepage:"http://gavwood.com"},{name:"Jeffery Wilcke",email:"jeffrey.wilcke@ethereum.org",url:"https://github.com/obscuren"}],dependencies:{"web3-bzz":"1.0.0-beta.34","web3-core":"1.0.0-beta.34","web3-eth":"1.0.0-beta.34","web3-eth-personal":"1.0.0-beta.34","web3-net":"1.0.0-beta.34","web3-shh":"1.0.0-beta.34","web3-utils":"1.0.0-beta.34"}}},{}],BN:[function(t,e,r){arguments[4][240][0].apply(r,arguments)},{buffer:17,dup:240}],Web3:[function(t,e,r){var n=t("../package.json").version,i=t("web3-core"),o=t("web3-eth"),a=t("web3-net"),s=t("web3-eth-personal"),u=t("web3-shh"),f=t("web3-bzz"),c=t("web3-utils"),h=function(){var t=this;i.packageInit(this,arguments),this.version=n,this.utils=c,this.eth=new o(this),this.shh=new u(this),this.bzz=new f(this);var e=this.setProvider;this.setProvider=function(r,n){return e.apply(t,arguments),this.eth.setProvider(r,n),this.shh.setProvider(r,n),this.bzz.setProvider(r),!0}};h.version=n,h.utils=c,h.modules={Eth:o,Net:a,Personal:s,Shh:u,Bzz:f},i.addProviders(h),e.exports=h},{"../package.json":396,"web3-bzz":187,"web3-core":209,"web3-eth":372,"web3-eth-personal":369,"web3-net":373,"web3-shh":381,"web3-utils":393}]},{},["Web3"])("Web3")}); \ No newline at end of file diff --git a/test/e2e/signature-request.spec.js b/test/e2e/signature-request.spec.js new file mode 100644 index 000000000000..9e83cc25ea6c --- /dev/null +++ b/test/e2e/signature-request.spec.js @@ -0,0 +1,138 @@ +const assert = require('assert') +const path = require('path') +const webdriver = require('selenium-webdriver') + +const { By, Key, until } = webdriver +const { + regularDelayMs, + largeDelayMs, +} = require('./helpers') +const { buildWebDriver } = require('./webdriver') +const Ganache = require('./ganache') +const FixtureServer = require('./fixture-server') + +const fixtureServer = new FixtureServer() + +const ganacheServer = new Ganache() + +describe('MetaMask', function () { + let driver + let publicAddress + + this.timeout(0) + this.bail(true) + + before(async function () { + await ganacheServer.start() + await fixtureServer.start() + await fixtureServer.loadState(path.join(__dirname, 'fixtures', 'imported-account')) + publicAddress = '0x5cfe73b6021e818b776b421b1c4db2474086a7e1' + const result = await buildWebDriver() + driver = result.driver + }) + + afterEach(async function () { + if (process.env.SELENIUM_BROWSER === 'chrome') { + const errors = await driver.checkBrowserForConsoleErrors(driver) + if (errors.length) { + const errorReports = errors.map((err) => err.message) + const errorMessage = `Errors found in browser console:\n${errorReports.join('\n')}` + console.error(new Error(errorMessage)) + } + } + if (this.currentTest.state === 'failed') { + await driver.verboseReportOnFailure(this.currentTest.title) + } + }) + + after(async function () { + await ganacheServer.quit() + await fixtureServer.stop() + await driver.quit() + }) + + describe('successfully signs typed data', function () { + let extension + let popup + let dapp + let windowHandles + + it('accepts the account password after lock', async function () { + await driver.delay(1000) + const passwordField = await driver.findElement(By.id('password')) + await passwordField.sendKeys('correct horse battery staple') + await passwordField.sendKeys(Key.ENTER) + await driver.delay(largeDelayMs * 4) + }) + + it('connects to the dapp', async function () { + await driver.openNewPage('http://127.0.0.1:8080/') + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Connect')]`)) + + await driver.delay(regularDelayMs) + + await driver.waitUntilXWindowHandles(3) + windowHandles = await driver.getAllWindowHandles() + + extension = windowHandles[0] + dapp = await driver.switchToWindowWithTitle('E2E Test Dapp', windowHandles) + popup = windowHandles.find((handle) => handle !== extension && handle !== dapp) + + await driver.switchToWindow(popup) + + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Next')]`)) + await driver.clickElement(By.xpath(`//button[contains(text(), 'Connect')]`)) + + await driver.waitUntilXWindowHandles(2) + await driver.switchToWindow(dapp) + }) + + it('creates a sign typed data signature request', async function () { + await driver.clickElement(By.id('signTypedData'), 10000) + await driver.delay(largeDelayMs) + + await driver.delay(regularDelayMs) + windowHandles = await driver.getAllWindowHandles() + await driver.switchToWindowWithTitle('MetaMask Notification', windowHandles) + await driver.delay(regularDelayMs) + + const title = await driver.findElement(By.css('.signature-request-content__title')) + const name = await driver.findElement(By.css('.signature-request-content__info--bolded')) + const content = await driver.findElements(By.css('.signature-request-content__info')) + const origin = content[0] + const address = content[1] + assert.equal(await title.getText(), 'Signature Request') + assert.equal(await name.getText(), 'Ether Mail') + assert.equal(await origin.getText(), 'http://127.0.0.1:8080') + assert.equal(await address.getText(), `${publicAddress.slice(0, 8)}...${publicAddress.slice(publicAddress.length - 8)}`) + }) + + it('signs the transaction', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Sign')]`), 10000) + await driver.delay(regularDelayMs) + + extension = windowHandles[0] + await driver.switchToWindow(extension) + }) + + it('gets the current accounts address', async function () { + await driver.clickElement(By.css('[data-testid="account-options-menu-button"]')) + await driver.clickElement(By.css('[data-testid="account-options-menu__account-details"]')) + await driver.delay(regularDelayMs) + + const addressInput = await driver.findElement(By.css('.readonly-input__input')) + const newPublicAddress = await addressInput.getAttribute('value') + const accountModal = await driver.findElement(By.css('span .modal')) + + await driver.clickElement(By.css('.account-modal__close')) + + await driver.wait(until.stalenessOf(accountModal)) + await driver.delay(regularDelayMs) + assert.equal(newPublicAddress.toLowerCase(), publicAddress) + }) + }) +}) diff --git a/test/e2e/tests/localization.spec.js b/test/e2e/tests/localization.spec.js new file mode 100644 index 000000000000..127d432bd2ae --- /dev/null +++ b/test/e2e/tests/localization.spec.js @@ -0,0 +1,29 @@ +const { strict: assert } = require('assert') +const { By, Key } = require('selenium-webdriver') +const { withFixtures } = require('../helpers') + +describe('Localization', function () { + it('can correctly display Philippine peso symbol and code', async function () { + const ganacheOptions = { + accounts: [ + { + secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', + balance: 25000000000000000000, + }, + ], + } + await withFixtures( + { fixtures: 'localization', ganacheOptions, title: this.test.title }, + async ({ driver }) => { + const passwordField = await driver.findElement(By.css('#password')) + await passwordField.sendKeys('correct horse battery staple') + await passwordField.sendKeys(Key.ENTER) + const secondaryBalance = await driver.findElement(By.css('[data-testid="eth-overview__secondary-currency"]')) + const secondaryBalanceText = await secondaryBalance.getText() + const [fiatAmount, fiatUnit] = secondaryBalanceText.trim().split(/\s+/u) + assert.ok(fiatAmount.startsWith('₱')) + assert.equal(fiatUnit, 'PHP') + }, + ) + }) +}) diff --git a/test/e2e/tests/personal-sign.spec.js b/test/e2e/tests/personal-sign.spec.js new file mode 100644 index 000000000000..9cc2d4fc39a7 --- /dev/null +++ b/test/e2e/tests/personal-sign.spec.js @@ -0,0 +1,40 @@ +const { strict: assert } = require('assert') +const { By, Key } = require('selenium-webdriver') +const { withFixtures } = require('../helpers') + +describe('Personal sign', function () { + it('can initiate and confirm a personal sign', async function () { + const ganacheOptions = { + accounts: [ + { + secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', + balance: 25000000000000000000, + }, + ], + } + await withFixtures( + { dapp: true, fixtures: 'personal-sign', ganacheOptions, title: this.test.title }, + async ({ driver }) => { + const passwordField = await driver.findElement(By.css('#password')) + await passwordField.sendKeys('correct horse battery staple') + await passwordField.sendKeys(Key.ENTER) + + await driver.openNewPage('http://127.0.0.1:8080/') + await driver.clickElement(By.id('personalSign')) + + await driver.waitUntilXWindowHandles(3) + + const windowHandles = await driver.getAllWindowHandles() + await driver.switchToWindowWithTitle('MetaMask Notification', windowHandles) + + const personalMessageRow = await driver.findElement(By.css('.request-signature__row-value')) + const personalMessage = await personalMessageRow.getText() + assert.equal(personalMessage, 'Example `personal_sign` message') + + await driver.clickElement(By.css('[data-testid="request-signature__sign"]')) + + await driver.waitUntilXWindowHandles(2) + }, + ) + }) +}) diff --git a/test/e2e/tests/simple-send.spec.js b/test/e2e/tests/simple-send.spec.js new file mode 100644 index 000000000000..3328b110c4ae --- /dev/null +++ b/test/e2e/tests/simple-send.spec.js @@ -0,0 +1,32 @@ +const { By, Key } = require('selenium-webdriver') +const { withFixtures } = require('../helpers') + +describe('Simple send', function () { + it('can send a simple transaction from one account to another', async function () { + const ganacheOptions = { + accounts: [ + { + secretKey: '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', + balance: 25000000000000000000, + }, + ], + } + await withFixtures( + { fixtures: 'imported-account', ganacheOptions, title: this.test.title }, + async ({ driver }) => { + const passwordField = await driver.findElement(By.css('#password')) + await passwordField.sendKeys('correct horse battery staple') + await passwordField.sendKeys(Key.ENTER) + await driver.clickElement(By.css('[data-testid="eth-overview-send"]')) + const recipientAddressField = await driver.findElement(By.css('[data-testid="ens-input"]')) + await recipientAddressField.sendKeys('0x985c30949c92df7a0bd42e0f3e3d539ece98db24') + const amountField = await driver.findElement(By.css('.unit-input__input')) + await amountField.sendKeys('1') + await driver.clickElement(By.css('[data-testid="page-container-footer-next"]')) + await driver.clickElement(By.css('[data-testid="page-container-footer-next"]')) + await driver.clickElement(By.css('[data-testid="home__activity-tab"]')) + await driver.findElement(By.css('.transaction-list-item')) + }, + ) + }) +}) diff --git a/test/e2e/threebox.spec.js b/test/e2e/threebox.spec.js new file mode 100644 index 000000000000..3ba7c060e110 --- /dev/null +++ b/test/e2e/threebox.spec.js @@ -0,0 +1,240 @@ +const assert = require('assert') +const webdriver = require('selenium-webdriver') +const getPort = require('get-port') + +const { By, until } = webdriver +const enLocaleMessages = require('../../app/_locales/en/messages.json') +const { + tinyDelayMs, + regularDelayMs, + largeDelayMs, +} = require('./helpers') +const { buildWebDriver } = require('./webdriver') +const Ganache = require('./ganache') + +const ganacheServer = new Ganache() + +describe('MetaMask', function () { + let driver + + const testSeedPhrase = 'forum vessel pink push lonely enact gentle tail admit parrot grunt dress' + + this.timeout(0) + this.bail(true) + + before(async function () { + await ganacheServer.start({ + accounts: [ + { + secretKey: '0x53CB0AB5226EEBF4D872113D98332C1555DC304443BEE1CF759D15798D3C55A9', + balance: 25000000000000000000, + }, + ], + }) + const result = await buildWebDriver({ port: await getPort() }) + driver = result.driver + }) + + afterEach(async function () { + if (process.env.SELENIUM_BROWSER === 'chrome') { + const errors = await driver.checkBrowserForConsoleErrors(driver) + if (errors.length) { + const errorReports = errors.map((err) => err.message) + const errorMessage = `Errors found in browser console:\n${errorReports.join('\n')}` + console.error(new Error(errorMessage)) + } + } + if (this.currentTest.state === 'failed') { + await driver.verboseReportOnFailure(this.currentTest.title) + } + }) + + after(async function () { + await ganacheServer.quit() + await driver.quit() + }) + + describe('set up data to be restored by 3box', function () { + + describe('First time flow starting from an existing seed phrase', function () { + it('clicks the continue button on the welcome screen', async function () { + await driver.findElement(By.css('.welcome-page__header')) + await driver.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.getStarted.message}')]`)) + await driver.delay(largeDelayMs) + }) + + it('clicks the "Import Wallet" option', async function () { + await driver.clickElement(By.xpath(`//button[contains(text(), 'Import wallet')]`)) + await driver.delay(largeDelayMs) + }) + + it('clicks the "No thanks" option on the metametrics opt-in screen', async function () { + await driver.clickElement(By.css('.btn-default')) + await driver.delay(largeDelayMs) + }) + + it('imports a seed phrase', async function () { + const [seedTextArea] = await driver.findElements(By.css('input[placeholder="Paste seed phrase from clipboard"]')) + await seedTextArea.sendKeys(testSeedPhrase) + await driver.delay(regularDelayMs) + + const [password] = await driver.findElements(By.id('password')) + await password.sendKeys('correct horse battery staple') + const [confirmPassword] = await driver.findElements(By.id('confirm-password')) + confirmPassword.sendKeys('correct horse battery staple') + + await driver.clickElement(By.css('.first-time-flow__terms')) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Import')]`)) + await driver.delay(regularDelayMs) + }) + + it('clicks through the success screen', async function () { + await driver.findElement(By.xpath(`//div[contains(text(), 'Congratulations')]`)) + await driver.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.endOfFlowMessage10.message}')]`)) + await driver.delay(regularDelayMs) + }) + + it('balance renders', async function () { + const balance = await driver.findElement(By.css('[data-testid="wallet-balance"] .list-item__heading')) + await driver.wait(until.elementTextMatches(balance, /25\s*ETH/u)) + await driver.delay(regularDelayMs) + }) + }) + + describe('turns on threebox syncing', function () { + it('goes to the settings screen', async function () { + await driver.clickElement(By.css('.account-menu__icon')) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//div[contains(text(), 'Settings')]`)) + }) + + it('turns on threebox syncing', async function () { + await driver.clickElement(By.xpath(`//div[contains(text(), 'Advanced')]`)) + await driver.clickElement(By.css('[data-testid="advanced-setting-3box"] .toggle-button div')) + }) + + }) + + describe('updates settings and address book', function () { + it('navigates to General settings', async function () { + await driver.clickElement(By.xpath(`//div[contains(text(), 'General')]`)) + }) + + it('turns on use of blockies', async function () { + await driver.clickElement(By.css('.toggle-button > div')) + }) + + it('adds an address to the contact list', async function () { + await driver.clickElement(By.xpath(`//div[contains(text(), 'Contacts')]`)) + + await driver.clickElement(By.css('.address-book-add-button__button')) + await driver.delay(tinyDelayMs) + + const addAddressInputs = await driver.findElements(By.css('input')) + await addAddressInputs[0].sendKeys('Test User Name 11') + + await driver.delay(tinyDelayMs) + + await addAddressInputs[1].sendKeys('0x2f318C334780961FB129D2a6c30D0763d9a5C970') + + await driver.delay(largeDelayMs * 2) + + await driver.clickElement(By.xpath(`//button[contains(text(), 'Save')]`)) + + await driver.findElement(By.xpath(`//div[contains(text(), 'Test User Name 11')]`)) + await driver.delay(regularDelayMs) + }) + }) + + }) + + describe('restoration from 3box', function () { + let driver2 + + before(async function () { + const result = await buildWebDriver({ port: await getPort() }) + driver2 = result.driver + }) + + after(async function () { + await driver2.quit() + }) + + describe('First time flow starting from an existing seed phrase', function () { + it('clicks the continue button on the welcome screen', async function () { + await driver2.findElement(By.css('.welcome-page__header')) + await driver2.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.getStarted.message}')]`)) + await driver2.delay(largeDelayMs) + }) + + it('clicks the "Import Wallet" option', async function () { + await driver2.clickElement(By.xpath(`//button[contains(text(), 'Import wallet')]`)) + await driver2.delay(largeDelayMs) + }) + + it('clicks the "No thanks" option on the metametrics opt-in screen', async function () { + await driver2.clickElement(By.css('.btn-default')) + await driver2.delay(largeDelayMs) + }) + + it('imports a seed phrase', async function () { + const [seedTextArea] = await driver2.findElements(By.css('input[placeholder="Paste seed phrase from clipboard"]')) + await seedTextArea.sendKeys(testSeedPhrase) + await driver2.delay(regularDelayMs) + + const [password] = await driver2.findElements(By.id('password')) + await password.sendKeys('correct horse battery staple') + const [confirmPassword] = await driver2.findElements(By.id('confirm-password')) + confirmPassword.sendKeys('correct horse battery staple') + + await driver2.clickElement(By.css('.first-time-flow__terms')) + + await driver2.clickElement(By.xpath(`//button[contains(text(), 'Import')]`)) + await driver2.delay(regularDelayMs) + }) + + it('clicks through the success screen', async function () { + await driver2.findElement(By.xpath(`//div[contains(text(), 'Congratulations')]`)) + await driver2.clickElement(By.xpath(`//button[contains(text(), '${enLocaleMessages.endOfFlowMessage10.message}')]`)) + await driver2.delay(regularDelayMs) + }) + + it('balance renders', async function () { + const balance = await driver2.findElement(By.css('[data-testid="wallet-balance"] .list-item__heading')) + await driver2.wait(until.elementTextMatches(balance, /25\s*ETH/u)) + await driver2.delay(regularDelayMs) + }) + }) + + describe('restores 3box data', function () { + it('confirms the 3box restore notification', async function () { + await driver2.clickElement(By.css('.home-notification__accept-button')) + }) + + // TODO: Fix tests from here forward; they're using the wrong driver + it('goes to the settings screen', async function () { + await driver.clickElement(By.css('.account-menu__icon')) + await driver.delay(regularDelayMs) + + await driver.clickElement(By.xpath(`//div[contains(text(), 'Settings')]`)) + }) + + it('finds the blockies toggle turned on', async function () { + await driver.delay(regularDelayMs) + const toggleLabel = await driver.findElement(By.css('.toggle-button__status')) + const toggleLabelText = await toggleLabel.getText() + assert.equal(toggleLabelText, 'ON') + }) + + it('finds the restored address in the contact list', async function () { + await driver.clickElement(By.xpath(`//div[contains(text(), 'Contacts')]`)) + await driver.delay(regularDelayMs) + + await driver.findElement(By.xpath(`//div[contains(text(), 'Test User Name 11')]`)) + await driver.delay(regularDelayMs) + }) + }) + }) +}) diff --git a/test/e2e/webdriver/chrome.js b/test/e2e/webdriver/chrome.js new file mode 100644 index 000000000000..55607305632d --- /dev/null +++ b/test/e2e/webdriver/chrome.js @@ -0,0 +1,68 @@ +const { Builder } = require('selenium-webdriver') +const chrome = require('selenium-webdriver/chrome') + +/** + * A wrapper around a {@code WebDriver} instance exposing Chrome-specific functionality + */ +class ChromeDriver { + static async build ({ extensionPath, responsive, port }) { + const args = [ + `load-extension=${extensionPath}`, + ] + if (responsive) { + args.push('--auto-open-devtools-for-tabs') + } + const options = new chrome.Options() + .addArguments(args) + const builder = new Builder() + .forBrowser('chrome') + .setChromeOptions(options) + if (port) { + const service = new chrome.ServiceBuilder() + .setPort(port) + builder.setChromeService(service) + } + const driver = builder.build() + const chromeDriver = new ChromeDriver(driver) + const extensionId = await chromeDriver.getExtensionIdByName('MetaMask') + + return { + driver, + extensionUrl: `chrome-extension://${extensionId}`, + } + } + + /** + * @constructor + * @param {!ThenableWebDriver} driver - a {@code WebDriver} instance + */ + constructor (driver) { + this._driver = driver + } + + /** + * Returns the extension ID for the given extension name + * @param {string} extensionName - the extension name + * @returns {Promise} - the extension ID + */ + async getExtensionIdByName (extensionName) { + await this._driver.get('chrome://extensions') + return await this._driver.executeScript(` + const extensions = document.querySelector("extensions-manager").shadowRoot + .querySelector("extensions-item-list").shadowRoot + .querySelectorAll("extensions-item") + + for (let i = 0; i < extensions.length; i++) { + const extension = extensions[i].shadowRoot + const name = extension.querySelector('#name').textContent + if (name === "${extensionName}") { + return extensions[i].getAttribute("id") + } + } + + return undefined + `) + } +} + +module.exports = ChromeDriver diff --git a/test/e2e/webdriver/driver.js b/test/e2e/webdriver/driver.js new file mode 100644 index 000000000000..dcd516e415b1 --- /dev/null +++ b/test/e2e/webdriver/driver.js @@ -0,0 +1,231 @@ +const { promises: fs } = require('fs') +const { strict: assert } = require('assert') +const { until, error: webdriverError } = require('selenium-webdriver') + +class Driver { + + /** + * @param {!ThenableWebDriver} driver - A {@code WebDriver} instance + * @param {string} browser - The type of browser this driver is controlling + * @param {number} timeout + */ + constructor (driver, browser, extensionUrl, timeout = 10000) { + this.driver = driver + this.browser = browser + this.extensionUrl = extensionUrl + this.timeout = timeout + } + + async delay (time) { + await new Promise((resolve) => setTimeout(resolve, time)) + } + + async wait (condition, timeout = this.timeout) { + await this.driver.wait(condition, timeout) + } + + async quit () { + await this.driver.quit() + } + + // Element interactions + + async findElement (locator) { + return await this.driver.wait(until.elementLocated(locator), this.timeout) + } + + async findVisibleElement (locator) { + const element = await this.findElement(locator) + await this.driver.wait(until.elementIsVisible(element), this.timeout) + return element + } + + async findClickableElement (locator) { + const element = await this.findElement(locator) + await Promise.all([ + this.driver.wait(until.elementIsVisible(element), this.timeout), + this.driver.wait(until.elementIsEnabled(element), this.timeout), + ]) + return element + } + + async findElements (locator) { + return await this.driver.wait(until.elementsLocated(locator), this.timeout) + } + + async findClickableElements (locator) { + const elements = await this.findElements(locator) + await Promise.all(elements + .reduce((acc, element) => { + acc.push( + this.driver.wait(until.elementIsVisible(element), this.timeout), + this.driver.wait(until.elementIsEnabled(element), this.timeout), + ) + return acc + }, [])) + return elements + } + + async clickElement (locator) { + const element = await this.findClickableElement(locator) + await element.click() + } + + async clickPoint (locator, x, y) { + const element = await this.findElement(locator) + await this.driver + .actions() + .move({ origin: element, x, y }) + .click() + .perform() + } + + async scrollToElement (element) { + await this.driver.executeScript('arguments[0].scrollIntoView(true)', element) + } + + async assertElementNotPresent (locator) { + let dataTab + try { + dataTab = await this.findElement(locator) + } catch (err) { + assert(err instanceof webdriverError.NoSuchElementError || err instanceof webdriverError.TimeoutError) + } + assert.ok(!dataTab, 'Found element that should not be present') + } + + // Navigation + + async navigate (page = Driver.PAGES.HOME) { + return await this.driver.get(`${this.extensionUrl}/${page}.html`) + } + + // Metrics + + async collectMetrics () { + return await this.driver.executeScript(collectMetrics) + } + + // Window management + + async openNewPage (url) { + const newHandle = await this.driver.switchTo().newWindow() + await this.driver.get(url) + return newHandle + } + + async switchToWindow (handle) { + await this.driver.switchTo().window(handle) + } + + async getAllWindowHandles () { + return await this.driver.getAllWindowHandles() + } + + async waitUntilXWindowHandles (x, delayStep = 1000, timeout = 5000) { + let timeElapsed = 0 + while (timeElapsed <= timeout) { + const windowHandles = await this.driver.getAllWindowHandles() + if (windowHandles.length === x) { + return + } + await this.delay(delayStep) + timeElapsed += delayStep + } + throw new Error('waitUntilXWindowHandles timed out polling window handles') + } + + async switchToWindowWithTitle (title, windowHandles) { + // eslint-disable-next-line no-param-reassign + windowHandles = windowHandles || await this.driver.getAllWindowHandles() + + for (const handle of windowHandles) { + await this.driver.switchTo().window(handle) + const handleTitle = await this.driver.getTitle() + if (handleTitle === title) { + return handle + } + } + + throw new Error(`No window with title: ${title}`) + } + + /** + * Closes all windows except those in the given list of exceptions + * @param {Array} exceptions - The list of window handle exceptions + * @param {Array} [windowHandles] - The full list of window handles + * @returns {Promise} + */ + async closeAllWindowHandlesExcept (exceptions, windowHandles) { + // eslint-disable-next-line no-param-reassign + windowHandles = windowHandles || await this.driver.getAllWindowHandles() + + for (const handle of windowHandles) { + if (!exceptions.includes(handle)) { + await this.driver.switchTo().window(handle) + await this.delay(1000) + await this.driver.close() + await this.delay(1000) + } + } + } + + // Error handling + + async verboseReportOnFailure (title) { + const artifactDir = `./test-artifacts/${this.browser}/${title}` + const filepathBase = `${artifactDir}/test-failure` + await fs.mkdir(artifactDir, { recursive: true }) + const screenshot = await this.driver.takeScreenshot() + await fs.writeFile(`${filepathBase}-screenshot.png`, screenshot, { encoding: 'base64' }) + const htmlSource = await this.driver.getPageSource() + await fs.writeFile(`${filepathBase}-dom.html`, htmlSource) + const uiState = await this.driver.executeScript( + () => window.getCleanAppState && window.getCleanAppState(), + ) + await fs.writeFile(`${filepathBase}-state.json`, JSON.stringify(uiState, null, 2)) + } + + async checkBrowserForConsoleErrors () { + const ignoredLogTypes = ['WARNING'] + const ignoredErrorMessages = [ + // Third-party Favicon 404s show up as errors + 'favicon.ico - Failed to load resource: the server responded with a status of 404 (Not Found)', + ] + const browserLogs = await this.driver.manage().logs().get('browser') + const errorEntries = browserLogs.filter((entry) => !ignoredLogTypes.includes(entry.level.toString())) + const errorObjects = errorEntries.map((entry) => entry.toJSON()) + return errorObjects.filter((entry) => !ignoredErrorMessages.some((message) => entry.message.includes(message))) + } +} + +function collectMetrics () { + const results = { + paint: {}, + navigation: [], + } + + window.performance.getEntriesByType('paint').forEach((paintEntry) => { + results.paint[paintEntry.name] = paintEntry.startTime + }) + + window.performance.getEntriesByType('navigation').forEach((navigationEntry) => { + results.navigation.push({ + domContentLoaded: navigationEntry.domContentLoadedEventEnd, + load: navigationEntry.loadEventEnd, + domInteractive: navigationEntry.domInteractive, + redirectCount: navigationEntry.redirectCount, + type: navigationEntry.type, + }) + }) + + return results +} + +Driver.PAGES = { + HOME: 'home', + NOTIFICATION: 'notification', + POPUP: 'popup', +} + +module.exports = Driver diff --git a/test/e2e/webdriver/firefox.js b/test/e2e/webdriver/firefox.js new file mode 100644 index 000000000000..f5c8426aef13 --- /dev/null +++ b/test/e2e/webdriver/firefox.js @@ -0,0 +1,104 @@ +const fs = require('fs') +const os = require('os') +const path = require('path') +const { Builder, By, until } = require('selenium-webdriver') +const firefox = require('selenium-webdriver/firefox') +const { Command } = require('selenium-webdriver/lib/command') + +/** + * The prefix for temporary Firefox profiles. All Firefox profiles used for e2e tests + * will be created as random directories inside this. + * @type {string} + */ +const TEMP_PROFILE_PATH_PREFIX = path.join(os.tmpdir(), 'MetaMask-Fx-Profile') + +const GeckoDriverCommand = { + INSTALL_ADDON: 'install addon', +} + +/** + * A wrapper around a {@code WebDriver} instance exposing Firefox-specific functionality + */ +class FirefoxDriver { + + /** + * Builds a {@link FirefoxDriver} instance + * @param {{extensionPath: string}} options - the options for the build + * @returns {Promise<{driver: !ThenableWebDriver, extensionUrl: string, extensionId: string}>} + */ + static async build ({ extensionPath, responsive, port }) { + const templateProfile = fs.mkdtempSync(TEMP_PROFILE_PATH_PREFIX) + const options = new firefox.Options() + .setProfile(templateProfile) + const builder = new Builder() + .forBrowser('firefox') + .setFirefoxOptions(options) + if (port) { + const service = new firefox.ServiceBuilder() + .setPort(port) + builder.setFirefoxService(service) + } + const driver = builder.build() + const fxDriver = new FirefoxDriver(driver) + + await fxDriver.init() + + const extensionId = await fxDriver.installExtension(extensionPath) + const internalExtensionId = await fxDriver.getInternalId() + + if (responsive) { + await driver.manage().window().setRect({ width: 320, height: 600 }) + } + + return { + driver, + extensionId, + extensionUrl: `moz-extension://${internalExtensionId}`, + } + } + + /** + * @constructor + * @param {!ThenableWebDriver} driver - a {@code WebDriver} instance + */ + constructor (driver) { + this._driver = driver + } + + /** + * Initializes the driver + * @returns {Promise} + */ + async init () { + await this._driver.getExecutor() + .defineCommand( + GeckoDriverCommand.INSTALL_ADDON, + 'POST', + '/session/:sessionId/moz/addon/install', + ) + } + + /** + * Installs the extension at the given path + * @param {string} addonPath - the path to the unpacked extension or XPI + * @returns {Promise} - the extension ID + */ + async installExtension (addonPath) { + const cmd = new Command(GeckoDriverCommand.INSTALL_ADDON) + .setParameter('path', path.resolve(addonPath)) + .setParameter('temporary', true) + + return await this._driver.execute(cmd) + } + + /** + * Returns the Internal UUID for the given extension + * @returns {Promise} - the Internal UUID for the given extension + */ + async getInternalId () { + await this._driver.get('about:debugging#addons') + return await this._driver.wait(until.elementLocated(By.xpath('//dl/div[contains(., \'Internal UUID\')]/dd')), 1000).getText() + } +} + +module.exports = FirefoxDriver diff --git a/test/e2e/webdriver/index.js b/test/e2e/webdriver/index.js new file mode 100644 index 000000000000..23e5acd5a295 --- /dev/null +++ b/test/e2e/webdriver/index.js @@ -0,0 +1,72 @@ +const { Browser } = require('selenium-webdriver') +const fetchMockResponses = require('../../data/fetch-mocks.json') +const Driver = require('./driver') +const ChromeDriver = require('./chrome') +const FirefoxDriver = require('./firefox') + +async function buildWebDriver ({ responsive, port } = {}) { + const browser = process.env.SELENIUM_BROWSER + const extensionPath = `dist/${browser}` + + const { driver: seleniumDriver, extensionId, extensionUrl } = await buildBrowserWebDriver(browser, { extensionPath, responsive, port }) + await setupFetchMocking(seleniumDriver) + const driver = new Driver(seleniumDriver, browser, extensionUrl) + await driver.navigate() + + await driver.delay(1000) + + return { + driver, + extensionId, + } +} + +async function buildBrowserWebDriver (browser, webDriverOptions) { + switch (browser) { + case Browser.CHROME: { + return await ChromeDriver.build(webDriverOptions) + } + case Browser.FIREFOX: { + return await FirefoxDriver.build(webDriverOptions) + } + default: { + throw new Error(`Unrecognized browser: ${browser}`) + } + } +} + +async function setupFetchMocking (driver) { + // define fetchMocking script, to be evaluated in the browser + function fetchMocking (mockResponses) { + window.origFetch = window.fetch.bind(window) + window.fetch = async (...args) => { + const url = args[0] + if (url.match(/^http(s)?:\/\/ethgasstation\.info\/json\/ethgasAPI.*/u)) { + return { json: async () => clone(mockResponses.ethGasBasic) } + } else if (url.match(/http(s?):\/\/ethgasstation\.info\/json\/predictTable.*/u)) { + return { json: async () => clone(mockResponses.ethGasPredictTable) } + } else if (url.match(/chromeextensionmm/u)) { + return { json: async () => clone(mockResponses.metametrics) } + } + return window.origFetch(...args) + } + if (window.chrome && window.chrome.webRequest) { + window.chrome.webRequest.onBeforeRequest.addListener(cancelInfuraRequest, { urls: ['https://*.infura.io/*'] }, ['blocking']) + } + function cancelInfuraRequest (requestDetails) { + console.log(`fetchMocking - Canceling request: "${requestDetails.url}"`) + return { cancel: true } + } + function clone (obj) { + return JSON.parse(JSON.stringify(obj)) + } + } + // fetchMockResponses are parsed last minute to ensure that objects are uniquely instantiated + const fetchMockResponsesJson = JSON.stringify(fetchMockResponses) + // eval the fetchMocking script in the browser + await driver.executeScript(`(${fetchMocking})(${fetchMockResponsesJson})`) +} + +module.exports = { + buildWebDriver, +} diff --git a/test/env.js b/test/env.js new file mode 100644 index 000000000000..1fbdad3dff08 --- /dev/null +++ b/test/env.js @@ -0,0 +1 @@ +process.env.METAMASK_ENV = 'test' diff --git a/test/flat.conf.js b/test/flat.conf.js deleted file mode 100644 index 1c9ec3dcdb29..000000000000 --- a/test/flat.conf.js +++ /dev/null @@ -1,8 +0,0 @@ -const getBaseConfig = require('./base.conf.js') - -module.exports = function (config) { - const settings = getBaseConfig(config) - settings.files.push('development/bundle.js') - settings.files.push('test/integration/bundle.js') - config.set(settings) -} diff --git a/test/helper.js b/test/helper.js index ddc2aba408ef..8e8f37b2fbf7 100644 --- a/test/helper.js +++ b/test/helper.js @@ -1,23 +1,43 @@ -const Ganache = require('ganache-core') -const nock = require('nock') +import Ganache from 'ganache-core' +import nock from 'nock' import Enzyme from 'enzyme' -import Adapter from 'enzyme-adapter-react-15' +import Adapter from 'enzyme-adapter-react-16' +import log from 'loglevel' +import { JSDOM } from 'jsdom' nock.disableNetConnect() nock.enableNetConnect('localhost') +// catch rejections that are still unhandled when tests exit +const unhandledRejections = new Map() +process.on('unhandledRejection', (reason, promise) => { + console.log('Unhandled rejection:', reason) + unhandledRejections.set(promise, reason) +}) +process.on('rejectionHandled', (promise) => { + console.log(`handled: ${unhandledRejections.get(promise)}`) + unhandledRejections.delete(promise) +}) + +process.on('exit', () => { + if (unhandledRejections.size > 0) { + console.error(`Found ${unhandledRejections.size} unhandled rejections:`) + for (const reason of unhandledRejections.values()) { + console.error('Unhandled rejection: ', reason) + } + process.exit(1) + } +}) + Enzyme.configure({ adapter: new Adapter() }) -// disallow promises from swallowing errors -enableFailureOnUnhandledPromiseRejection() // ganache server const server = Ganache.server() -server.listen(8545, () => { - console.log('Ganache Testrpc is running on "http://localhost:8545"') -}) +server.listen(8545) + +server.on('error', console.error) +server.on('clientError', console.error) -// logging util -var log = require('loglevel') log.setDefaultLevel(5) global.log = log @@ -25,47 +45,47 @@ global.log = log // polyfills // +// dom +const jsdom = new JSDOM() +global.window = jsdom.window + +// required by `trezor-connect/node_modules/whatwg-fetch` +global.self = window +// required by `dom-helpers` and various other libraries +global.document = window.document +// required by `react-tippy` +global.navigator = window.navigator +global.Element = window.Element +// required by `react-popper` +global.HTMLElement = window.HTMLElement + +// required by any components anchored on `popover-content` +const popoverContent = window.document.createElement('div') +popoverContent.setAttribute('id', 'popover-content') +window.document.body.appendChild(popoverContent) + +// delete AbortController added by jsdom so it can be polyfilled correctly below +delete window.AbortController + // fetch -global.fetch = require('isomorphic-fetch') -require('abortcontroller-polyfill/dist/polyfill-patch-fetch') +const fetch = require('node-fetch') -// dom -require('jsdom-global')() +const { Headers, Request, Response } = fetch +Object.assign(window, { fetch, Headers, Request, Response }) + +require('abortcontroller-polyfill/dist/polyfill-patch-fetch') // localStorage window.localStorage = {} +// override @metamask/logo +window.requestAnimationFrame = () => undefined + // crypto.getRandomValues -if (!window.crypto) window.crypto = {} -if (!window.crypto.getRandomValues) window.crypto.getRandomValues = require('polyfill-crypto.getrandomvalues') - -function enableFailureOnUnhandledPromiseRejection () { - // overwrite node's promise with the stricter Bluebird promise - global.Promise = require('bluebird') - - // modified from https://github.com/mochajs/mocha/issues/1926#issuecomment-180842722 - - // rethrow unhandledRejections - if (typeof process !== 'undefined') { - process.on('unhandledRejection', function (reason) { - throw reason - }) - } else if (typeof window !== 'undefined') { - // 2016-02-01: No browsers support this natively, however bluebird, when.js, - // and probably other libraries do. - if (typeof window.addEventListener === 'function') { - window.addEventListener('unhandledrejection', function (evt) { - throw evt.detail.reason - }) - } else { - var oldOHR = window.onunhandledrejection - window.onunhandledrejection = function (evt) { - if (typeof oldOHR === 'function') oldOHR.apply(this, arguments) - throw evt.detail.reason - } - } - } else if (typeof console !== 'undefined' && - typeof (console.error || console.log) === 'function') { - (console.error || console.log)('Unhandled rejections will be ignored!') - } +if (!window.crypto) { + window.crypto = {} +} +if (!window.crypto.getRandomValues) { + // eslint-disable-next-line global-require + window.crypto.getRandomValues = require('polyfill-crypto.getrandomvalues') } diff --git a/test/integration/index.html b/test/integration/index.html deleted file mode 100644 index 430814a8a4d8..000000000000 --- a/test/integration/index.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - QUnit Example - - - -
-
- - - - - - - - - diff --git a/test/integration/index.js b/test/integration/index.js deleted file mode 100644 index b266ddf37cf5..000000000000 --- a/test/integration/index.js +++ /dev/null @@ -1,26 +0,0 @@ -const fs = require('fs') -const path = require('path') -const pump = require('pump') -const browserify = require('browserify') -const tests = fs.readdirSync(path.join(__dirname, 'lib')) -const bundlePath = path.join(__dirname, 'bundle.js') - -const b = browserify() - -const writeStream = fs.createWriteStream(bundlePath) - -tests.forEach(function (fileName) { - const filePath = path.join(__dirname, 'lib', fileName) - console.log(`bundling test "${filePath}"`) - b.add(filePath) -}) - -pump( - b.bundle(), - writeStream, - (err) => { - if (err) throw err - console.log(`Integration test build completed: "${bundlePath}"`) - process.exit(0) - } -) diff --git a/test/integration/jquery-3.1.0.min.js b/test/integration/jquery-3.1.0.min.js deleted file mode 100644 index f6a6a99e60ee..000000000000 --- a/test/integration/jquery-3.1.0.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v3.1.0 | (c) jQuery Foundation | jquery.org/license */ -!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.1.0",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null!=a?a<0?this[a+this.length]:this[a]:f.call(this)},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"label"in b&&b.disabled===a||"form"in b&&b.disabled===a||"form"in b&&b.disabled===!1&&(b.isDisabled===a||b.isDisabled!==!a&&("label"in b||!ea(b))!==a)}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(_,aa),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=V.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(_,aa),$.test(j[0].type)&&qa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&sa(j),!a)return G.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||$.test(a)&&qa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){if(r.isFunction(b))return r.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return r.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(C.test(b))return r.filter(b,a,c);b=r.filter(b,a)}return r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType})}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/\S+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R),a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0, -r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,ja=/^$|\/(?:java|ecma)script/i,ka={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ka.optgroup=ka.option,ka.tbody=ka.tfoot=ka.colgroup=ka.caption=ka.thead,ka.th=ka.td;function la(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function ma(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=la(l.appendChild(f),"script"),j&&ma(g),c){k=0;while(f=g[k++])ja.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var pa=d.documentElement,qa=/^key/,ra=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,sa=/^([^.]*)(?:\.(.+)|)/;function ta(){return!0}function ua(){return!1}function va(){try{return d.activeElement}catch(a){}}function wa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)wa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ua;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(pa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c-1:r.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h\x20\t\r\n\f]*)[^>]*)\/>/gi,ya=/\s*$/g;function Ca(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Da(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ea(a){var b=Aa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&za.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(m&&(e=oa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(la(e,"script"),Da),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=la(h),f=la(a),d=0,e=f.length;d0&&ma(g,!i&&la(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(la(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!ya.test(a)&&!ka[(ia.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function Xa(a,b,c,d,e){return new Xa.prototype.init(a,b,c,d,e)}r.Tween=Xa,Xa.prototype={constructor:Xa,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Xa.propHooks[this.prop];return a&&a.get?a.get(this):Xa.propHooks._default.get(this)},run:function(a){var b,c=Xa.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Xa.propHooks._default.set(this),this}},Xa.prototype.init.prototype=Xa.prototype,Xa.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Xa.propHooks.scrollTop=Xa.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Xa.prototype.init,r.fx.step={};var Ya,Za,$a=/^(?:toggle|show|hide)$/,_a=/queueHooks$/;function ab(){Za&&(a.requestAnimationFrame(ab),r.fx.tick())}function bb(){return a.setTimeout(function(){Ya=void 0}),Ya=r.now()}function cb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=aa[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function db(a,b,c){for(var d,e=(gb.tweeners[b]||[]).concat(gb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?hb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K); -if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),hb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ib[b]||r.find.attr;ib[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=ib[g],ib[g]=e,e=null!=c(a,b,d)?g:null,ib[g]=f),e}});var jb=/^(?:input|select|textarea|button)$/i,kb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):jb.test(a.nodeName)||kb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});var lb=/[\t\r\n\f]/g;function mb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,mb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,mb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,mb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=mb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(c)+" ").replace(lb," ").indexOf(b)>-1)return!0;return!1}});var nb=/\r/g,ob=/[\x20\t\r\n\f]+/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(nb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:r.trim(r.text(a)).replace(ob," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type,g=f?null:[],h=f?e+1:d.length,i=e<0?h:f?e:0;i-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ha.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,""),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;if(o.cors||Pb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r(" - - - - diff --git a/test/web3/schema.js b/test/web3/schema.js deleted file mode 100644 index 61977f140944..000000000000 --- a/test/web3/schema.js +++ /dev/null @@ -1,209 +0,0 @@ -/* eslint no-unused-vars: 0 */ - -var params = { - // diffrent params used in the methods - param: [], - blockHashParams: '0xb3b20624f8f0f86eb50dd04688409e5cea4bd02d700bf6e79e9384d47d6a5a35', - filterParams: ['0xfe704947a3cd3ca12541458a4321c869'], - transactionHashParams: [ - '0xbb3a336e3f823ec18197f1e13ee875700f08f03e2cab75f0d0b118dabb44cba0', - ], - blockHashAndIndexParams: [ - '0xb3b20624f8f0f86eb50dd04688409e5cea4bd02d700bf6e79e9384d47d6a5a35', - '0x0', - ], - uncleByBlockNumberAndIndexParams: ['0x29c', '0x0'], - blockParameterParams: '0x5bad55', - data: '0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675', - addressParams: '0xc94770007dda54cF92009BFF0dE90c06F603a09f', - getStorageAtParams: [ - '0x295a70b2de5e3953354a6a8344e616ed314d7251', - '0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9', - '0x65a8db', - ], - getCodeParams: ['0x06012c8cf97bead5deae237070f9587f8e7a266d', '0x65a8db'], - estimateTransaction: { - from: '0xb60e8dd61c5d32be8058bb8eb970870f07233155', - to: '0xd46e8dd67c5d32be8058bb8eb970870f07244567', - gas: '0x76c0', - gasPrice: '0x9184e72a000', - value: '0x9184e72a', - data: '0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675', - }, - filterGetLogs: [{'blockHash': '0x7c5a35e9cb3e8ae0e221ab470abae9d446c3a5626ce6689fc777dcffcab52c70', 'topics': ['0x241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b80']}], - block: { - __required: [], - number: 'Q', - hash: 'D32', - parentHash: 'D32', - nonce: 'D', - sha3Uncles: 'D', - logsBloom: 'D', - transactionsRoot: 'D', - stateRoot: 'D', - receiptsRoot: 'D', - miner: 'D', - difficulty: 'Q', - totalDifficulty: 'Q', - extraData: 'D', - size: 'Q', - gasLimit: 'Q', - gasUsed: 'Q', - timestamp: 'Q', - transactions: ['DATA|Transaction'], - uncles: ['D'], - }, - transaction: { - __required: [], - hash: 'D32', - nonce: 'Q', - blockHash: 'D32', - blockNumber: 'Q', - transactionIndex: 'Q', - from: 'D20', - to: 'D20', - value: 'Q', - gasPrice: 'Q', - gas: 'Q', - input: 'D', - }, - receipt: { - __required: [], - transactionHash: 'D32', - transactionIndex: 'Q', - blockHash: 'D32', - blockNumber: 'Q', - cumulativeGasUsed: 'Q', - gasUsed: 'Q', - contractAddress: 'D20', - logs: ['FilterChange'], - }, - - filterChange: { - __required: [], - removed: 'B', - logIndex: 'Q', - transactionIndex: 'Q', - transactionHash: 'D32', - blockHash: 'D32', - blockNumber: 'Q', - address: 'D20', - data: 'Array|DATA', - topics: ['D'], - }, -} - -var methods = { - hexaNumberMethods: { - // these are the methods which have output in the form of hexa decimal numbers - eth_blockNumber: ['eth_blockNumber', params.param, 'Q'], - eth_gasPrice: ['eth_gasPrice', params.param, 'Q'], - eth_newBlockFilter: ['eth_newBlockFilter', params.param, 'Q'], - eth_newPendingTransactionFilter: [ - 'eth_newPendingTransactionFilter', - params.param, - 'Q', - ], - eth_getUncleCountByBlockHash: [ - 'eth_getUncleCountByBlockHash', - [params.blockHashParams], - 'Q', - 1, - ], - eth_getBlockTransactionCountByHash: [ - 'eth_getBlockTransactionCountByHash', - [params.blockHashParams], - 'Q', - 1, - ], - eth_getTransactionCount: [ - 'eth_getTransactionCount', - [params.addressParams, params.blockParameterParams], - 'Q', - 1, - 2, - ], - eth_getBalance: ['eth_getBalance', [params.addressParams, 'latest'], 'Q', 1, 2], - eth_estimateGas: ['eth_estimateGas', [params.estimateTransaction], 'Q', 1], - eth_getUncleCountByBlockNumber: [ - 'eth_getUncleCountByBlockNumber', - [params.blockParameterParams], - 'Q', - 1, - ], - eth_getBlockTransactionCountByNumber: [ - 'eth_getBlockTransactionCountByNumber', - ['latest'], - 'Q', - 1, - ], - eth_protocolVersion: ['eth_protocolVersion', params.param, 'S'], - eth_getCode: ['eth_getCode', params.getCodeParams, 'D', 1, 2], - }, - booleanMethods: { - // these are the methods which have output in the form of boolean - eth_uninstallFilter: ['eth_uninstallFilter', params.filterParams, 'B', 1], - eth_mining: ['eth_mining', params.param, 'B'], - eth_syncing: ['eth_syncing', params.param, 'B|EthSyncing'], - }, - transactionMethods: { - // these are the methods which have output in the form of transaction object - eth_getTransactionByHash: [ - 'eth_getTransactionByHash', - params.transactionHashParams, - params.transaction, - 1, - ], - eth_getTransactionByBlockHashAndIndex: [ - 'eth_getTransactionByBlockHashAndIndex', - params.blockHashAndIndexParams, - params.transaction, - 2, - ], - eth_getTransactionByBlockNumberAndIndex: [ - 'eth_getTransactionByBlockNumberAndIndex', - [params.blockParameterParams, '0x0'], - params.transaction, - 2, - ], - - }, - blockMethods: { - // these are the methods which have output in the form of a block - - eth_getUncleByBlockNumberAndIndex: [ - 'eth_getUncleByBlockNumberAndIndex', - params.uncleByBlockNumberAndIndexParams, - params.block, - 2, - ], - eth_getBlockByHash: [ - 'eth_getBlockByHash', - [params.params, false], - params.block, - 2, - ], - eth_getBlockByNumber: [ - 'eth_getBlockByNumber', - [params.blockParameterParams, false], - params.block, - 2, - ], - }, - - methods: { - // these are the methods which have output in the form of bytes data - - eth_call: ['eth_call', [params.estimateTransaction, 'latest'], 'D', 1, 2], - eth_getStorageAt: ['eth_getStorageAt', params.getStorageAtParams, 'D', 2, 2], - eth_getTransactionReceipt: [ - 'eth_getTransactionReceipt', - params.transactionHashParams, - params.receipt, - 1, - ], - - }, - -} - diff --git a/test/web3/web3.js b/test/web3/web3.js deleted file mode 100644 index 0f7a4c3cd1d1..000000000000 --- a/test/web3/web3.js +++ /dev/null @@ -1,34 +0,0 @@ -/* eslint no-undef: 0 */ - -var json = methods - -web3.currentProvider.enable().then(() => { - - Object.keys(json).forEach(methodGroupKey => { - - console.log(methodGroupKey) - const methodGroup = json[methodGroupKey] - console.log(methodGroup) - Object.keys(methodGroup).forEach(methodKey => { - - const methodButton = document.getElementById(methodKey) - methodButton.addEventListener('click', function () { - - window.ethereum.sendAsync({ - method: methodKey, - params: methodGroup[methodKey][1], - }, function (err, result) { - if (err) { - console.log(err) - console.log(methodKey) - } else { - document.getElementById('results').innerHTML = JSON.stringify(result) - } - }) - }) - - }) - - }) - }) - diff --git a/ui/app/components/app/account-list-item/account-list-item.js b/ui/app/components/app/account-list-item/account-list-item.js new file mode 100644 index 000000000000..7e001f7d6025 --- /dev/null +++ b/ui/app/components/app/account-list-item/account-list-item.js @@ -0,0 +1,51 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { checksumAddress } from '../../../helpers/utils/util' +import Identicon from '../../ui/identicon' +import AccountMismatchWarning from '../../ui/account-mismatch-warning/account-mismatch-warning.component' + +export default function AccountListItem ({ + account, + className, + displayAddress = false, + handleClick, + icon = null, +}) { + const { name, address, balance } = account || {} + + return ( +
handleClick && handleClick({ name, address, balance })} + > + +
+ + +
{ name || address }
+ + {icon &&
{ icon }
} + + +
+ + {displayAddress && name && ( +
+ { checksumAddress(address) } +
+ )} +
+ ) +} + +AccountListItem.propTypes = { + account: PropTypes.object, + className: PropTypes.string, + displayAddress: PropTypes.bool, + handleClick: PropTypes.func, + icon: PropTypes.node, +} diff --git a/ui/app/components/app/account-list-item/index.js b/ui/app/components/app/account-list-item/index.js new file mode 100644 index 000000000000..1759f6597e2e --- /dev/null +++ b/ui/app/components/app/account-list-item/index.js @@ -0,0 +1 @@ +export { default } from './account-list-item' diff --git a/ui/app/components/app/account-list-item/index.scss b/ui/app/components/app/account-list-item/index.scss new file mode 100644 index 000000000000..dcc08d9b5ee1 --- /dev/null +++ b/ui/app/components/app/account-list-item/index.scss @@ -0,0 +1,26 @@ +.account-list-item { + &__top-row { + display: flex; + margin-top: 10px; + margin-left: 8px; + position: relative; + } + + &__account-name { + font-size: 16px; + margin-left: 8px; + } + + &__icon { + position: absolute; + right: 12px; + top: 1px; + } + + &__account-address { + margin-left: 35px; + width: 80%; + overflow: hidden; + text-overflow: ellipsis; + } +} diff --git a/ui/app/components/app/account-list-item/tests/account-list-item-component.test.js b/ui/app/components/app/account-list-item/tests/account-list-item-component.test.js new file mode 100644 index 000000000000..d42bd7bc9ce3 --- /dev/null +++ b/ui/app/components/app/account-list-item/tests/account-list-item-component.test.js @@ -0,0 +1,112 @@ +import assert from 'assert' +import React from 'react' +import { shallow } from 'enzyme' +import sinon from 'sinon' +import * as utils from '../../../../helpers/utils/util' +import Identicon from '../../../ui/identicon' +import AccountListItem from '../account-list-item' + +describe('AccountListItem Component', function () { + let wrapper, propsMethodSpies, checksumAddressStub + + describe('render', function () { + before(function () { + checksumAddressStub = sinon.stub(utils, 'checksumAddress').returns('mockCheckSumAddress') + propsMethodSpies = { + handleClick: sinon.spy(), + } + }) + beforeEach(function () { + wrapper = shallow(( + } + /> + ), { context: { t: (str) => `${str}_t` } }) + }) + + afterEach(function () { + propsMethodSpies.handleClick.resetHistory() + checksumAddressStub.resetHistory() + }) + + after(function () { + sinon.restore() + }) + + it('should render a div with the passed className', function () { + assert.equal(wrapper.find('.mockClassName').length, 1) + assert(wrapper.find('.mockClassName').is('div')) + assert(wrapper.find('.mockClassName').hasClass('account-list-item')) + }) + + it('should call handleClick with the expected props when the root div is clicked', function () { + const { onClick } = wrapper.find('.mockClassName').props() + assert.equal(propsMethodSpies.handleClick.callCount, 0) + onClick() + assert.equal(propsMethodSpies.handleClick.callCount, 1) + assert.deepEqual( + propsMethodSpies.handleClick.getCall(0).args, + [{ address: 'mockAddress', name: 'mockName', balance: 'mockBalance' }], + ) + }) + + it('should have a top row div', function () { + assert.equal(wrapper.find('.mockClassName > .account-list-item__top-row').length, 1) + assert(wrapper.find('.mockClassName > .account-list-item__top-row').is('div')) + }) + + it('should have an identicon, name and icon in the top row', function () { + const topRow = wrapper.find('.mockClassName > .account-list-item__top-row') + assert.equal(topRow.find(Identicon).length, 1) + assert.equal(topRow.find('.account-list-item__account-name').length, 1) + assert.equal(topRow.find('.account-list-item__icon').length, 1) + }) + + it('should show the account name if it exists', function () { + const topRow = wrapper.find('.mockClassName > .account-list-item__top-row') + assert.equal(topRow.find('.account-list-item__account-name').text(), 'mockName') + }) + + it('should show the account address if there is no name', function () { + wrapper.setProps({ account: { address: 'addressButNoName' } }) + const topRow = wrapper.find('.mockClassName > .account-list-item__top-row') + assert.equal(topRow.find('.account-list-item__account-name').text(), 'addressButNoName') + }) + + it('should render the passed icon', function () { + const topRow = wrapper.find('.mockClassName > .account-list-item__top-row') + assert(topRow.find('.account-list-item__icon').childAt(0).is('i')) + assert(topRow.find('.account-list-item__icon').childAt(0).hasClass('mockIcon')) + }) + + it('should not render an icon if none is passed', function () { + wrapper.setProps({ icon: null }) + const topRow = wrapper.find('.mockClassName > .account-list-item__top-row') + assert.equal(topRow.find('.account-list-item__icon').length, 0) + }) + + it('should render the account address as a checksumAddress if displayAddress is true and name is provided', function () { + wrapper.setProps({ displayAddress: true }) + assert.equal(wrapper.find('.account-list-item__account-address').length, 1) + assert.equal(wrapper.find('.account-list-item__account-address').text(), 'mockCheckSumAddress') + assert.deepEqual( + checksumAddressStub.getCall(0).args, + ['mockAddress'], + ) + }) + + it('should not render the account address as a checksumAddress if displayAddress is false', function () { + wrapper.setProps({ displayAddress: false }) + assert.equal(wrapper.find('.account-list-item__account-address').length, 0) + }) + + it('should not render the account address as a checksumAddress if name is not provided', function () { + wrapper.setProps({ account: { address: 'someAddressButNoName' } }) + assert.equal(wrapper.find('.account-list-item__account-address').length, 0) + }) + }) +}) diff --git a/ui/app/components/app/account-menu/account-menu.component.js b/ui/app/components/app/account-menu/account-menu.component.js index 1b81e33a26b9..ec3f3f7a9a89 100644 --- a/ui/app/components/app/account-menu/account-menu.component.js +++ b/ui/app/components/app/account-menu/account-menu.component.js @@ -1,11 +1,13 @@ -import React, { PureComponent } from 'react' +import React, { Component } from 'react' import PropTypes from 'prop-types' -import debounce from 'lodash.debounce' -import { Menu, Item, Divider, CloseArea } from '../dropdowns/components/menu' +import { debounce } from 'lodash' +import Fuse from 'fuse.js' +import InputAdornment from '@material-ui/core/InputAdornment' +import classnames from 'classnames' import { ENVIRONMENT_TYPE_POPUP } from '../../../../../app/scripts/lib/enums' import { getEnvironmentType } from '../../../../../app/scripts/lib/util' -import Tooltip from '../../ui/tooltip' import Identicon from '../../ui/identicon' +import SiteIcon from '../../ui/site-icon' import UserPreferencedCurrencyDisplay from '../user-preferenced-currency-display' import { PRIMARY } from '../../../helpers/constants/common' import { @@ -16,61 +18,164 @@ import { CONNECT_HARDWARE_ROUTE, DEFAULT_ROUTE, } from '../../../helpers/constants/routes' +import TextField from '../../ui/text-field' +import SearchIcon from '../../ui/search-icon' -export default class AccountMenu extends PureComponent { +export function AccountMenuItem (props) { + const { + icon, + children, + text, + subText, + className, + onClick, + } = props + + const itemClassName = classnames('account-menu__item', className, { + 'account-menu__item--clickable': Boolean(onClick), + }) + return children + ?
{children}
+ : ( +
+ {icon ?
{icon}
: null} + {text ?
{text}
: null} + {subText ?
{subText}
: null} +
+ ) +} + +AccountMenuItem.propTypes = { + icon: PropTypes.node, + children: PropTypes.node, + text: PropTypes.node, + subText: PropTypes.node, + onClick: PropTypes.func, + className: PropTypes.string, +} + +export default class AccountMenu extends Component { static contextTypes = { t: PropTypes.func, metricsEvent: PropTypes.func, } static propTypes = { - accounts: PropTypes.object, + shouldShowAccountsSearch: PropTypes.bool, + accounts: PropTypes.array, history: PropTypes.object, - identities: PropTypes.object, isAccountMenuOpen: PropTypes.bool, - prevIsAccountMenuOpen: PropTypes.bool, keyrings: PropTypes.array, lockMetamask: PropTypes.func, selectedAddress: PropTypes.string, showAccountDetail: PropTypes.func, - showRemoveAccountConfirmationModal: PropTypes.func, toggleAccountMenu: PropTypes.func, + addressConnectedDomainMap: PropTypes.object, + originOfCurrentTab: PropTypes.string, } + accountsRef + state = { - atAccountListBottom: false, + shouldShowScrollButton: false, + searchQuery: '', } - componentDidUpdate (prevProps) { - const { prevIsAccountMenuOpen } = prevProps + addressFuse = new Fuse([], { + shouldSort: false, + threshold: 0.45, + location: 0, + distance: 100, + maxPatternLength: 32, + minMatchCharLength: 1, + keys: [ + { name: 'name', weight: 0.5 }, + { name: 'address', weight: 0.5 }, + ], + }) + + componentDidUpdate (prevProps, prevState) { + const { isAccountMenuOpen: prevIsAccountMenuOpen } = prevProps + const { searchQuery: prevSearchQuery } = prevState const { isAccountMenuOpen } = this.props + const { searchQuery } = this.state if (!prevIsAccountMenuOpen && isAccountMenuOpen) { - this.setAtAccountListBottom() + this.setShouldShowScrollButton() + this.resetSearchQuery() } + + // recalculate on each search query change + // whether we can show scroll down button + if (isAccountMenuOpen && prevSearchQuery !== searchQuery) { + this.setShouldShowScrollButton() + } + } + + renderAccountsSearch () { + const inputAdornment = ( + + + + ) + + return [ + this.setSearchQuery(e.target.value)} + startAdornment={inputAdornment} + fullWidth + theme="material-white-padded" + />, +
, + ] } renderAccounts () { const { - identities, accounts, selectedAddress, keyrings, showAccountDetail, + addressConnectedDomainMap, + originOfCurrentTab, } = this.props + const { searchQuery } = this.state + + let filteredIdentities = accounts + if (searchQuery) { + this.addressFuse.setCollection(accounts) + filteredIdentities = this.addressFuse.search(searchQuery) + } - const accountOrder = keyrings.reduce((list, keyring) => list.concat(keyring.accounts), []) + if (filteredIdentities.length === 0) { + return

{this.context.t('noAccountsFound')}

+ } - return accountOrder.filter(address => !!identities[address]).map(address => { - const identity = identities[address] + return filteredIdentities.map((identity) => { const isSelected = identity.address === selectedAddress - const balanceValue = accounts[address] ? accounts[address].balance : '' const simpleAddress = identity.address.substring(2).toLowerCase() - const keyring = keyrings.find(kr => { + const keyring = keyrings.find((kr) => { return kr.accounts.includes(simpleAddress) || kr.accounts.includes(identity.address) }) + const addressDomains = addressConnectedDomainMap[identity.address] || {} + const iconAndNameForOpenDomain = addressDomains[originOfCurrentTab] return (
{ this.renderKeyringType(keyring) } - { this.renderRemoveAccount(keyring, identity) } + { iconAndNameForOpenDomain + ? ( +
+ +
+ ) + : null + }
) }) } - renderRemoveAccount (keyring, identity) { - const { t } = this.context - // Any account that's not from the HD wallet Keyring can be removed - const { type } = keyring - const isRemovable = type !== 'HD Key Tree' - - return isRemovable && ( - - this.removeAccount(e, identity)} - /> - - ) - } - - removeAccount (e, identity) { - e.preventDefault() - e.stopPropagation() - const { showRemoveAccountConfirmationModal } = this.props - showRemoveAccountConfirmationModal(identity) - } - renderKeyringType (keyring) { const { t } = this.context @@ -156,37 +242,52 @@ export default class AccountMenu extends PureComponent { case 'Simple Key Pair': label = t('imported') break + default: + return null } - return label && ( + return (
{ label }
) } - setAtAccountListBottom = () => { - const target = document.querySelector('.account-menu__accounts') - const { scrollTop, offsetHeight, scrollHeight } = target + resetSearchQuery () { + this.setSearchQuery('') + } + + setSearchQuery (searchQuery) { + this.setState({ searchQuery }) + } + + setShouldShowScrollButton = () => { + const { scrollTop, offsetHeight, scrollHeight } = this.accountsRef + + const canScroll = scrollHeight > offsetHeight + const atAccountListBottom = scrollTop + offsetHeight >= scrollHeight - this.setState({ atAccountListBottom }) + + const shouldShowScrollButton = canScroll && !atAccountListBottom + + this.setState({ shouldShowScrollButton }) } - onScroll = debounce(this.setAtAccountListBottom, 25) + onScroll = debounce(this.setShouldShowScrollButton, 25) - handleScrollDown = e => { + handleScrollDown = (e) => { e.stopPropagation() - const target = document.querySelector('.account-menu__accounts') - const { scrollHeight } = target - target.scroll({ left: 0, top: scrollHeight, behavior: 'smooth' }) - this.setAtAccountListBottom() + + const { scrollHeight } = this.accountsRef + this.accountsRef.scroll({ left: 0, top: scrollHeight, behavior: 'smooth' }) + + this.setShouldShowScrollButton() } renderScrollButton () { - const { accounts } = this.props - const { atAccountListBottom } = this.state + const { shouldShowScrollButton } = this.state - return !atAccountListBottom && Object.keys(accounts).length > 3 && ( + return shouldShowScrollButton && (
) } render () { - const { t } = this.context + const { t, metricsEvent } = this.context const { + shouldShowAccountsSearch, isAccountMenuOpen, toggleAccountMenu, lockMetamask, history, } = this.props - const { metricsEvent } = this.context + + if (!isAccountMenuOpen) { + return null + } return ( - - - +
+ { t('myAccounts') } - - + +
+ {shouldShowAccountsSearch ? this.renderAccountsSearch() : null}
{ + this.accountsRef = ref + }} > { this.renderAccounts() }
{ this.renderScrollButton() }
- - + { toggleAccountMenu() metricsEvent({ @@ -251,15 +360,15 @@ export default class AccountMenu extends PureComponent { }) history.push(NEW_ACCOUNT_ROUTE) }} - icon={ + icon={( - } + )} text={t('createAccount')} /> - { toggleAccountMenu() metricsEvent({ @@ -271,15 +380,15 @@ export default class AccountMenu extends PureComponent { }) history.push(IMPORT_ACCOUNT_ROUTE) }} - icon={ + icon={( - } + )} text={t('importAccount')} /> - { toggleAccountMenu() metricsEvent({ @@ -289,22 +398,22 @@ export default class AccountMenu extends PureComponent { name: 'Clicked Connect Hardware', }, }) - if (getEnvironmentType(window.location.href) === ENVIRONMENT_TYPE_POPUP) { + if (getEnvironmentType() === ENVIRONMENT_TYPE_POPUP) { global.platform.openExtensionInBrowser(CONNECT_HARDWARE_ROUTE) } else { history.push(CONNECT_HARDWARE_ROUTE) } }} - icon={ + icon={( - } + )} text={t('connectHardwareWallet')} /> - - + { toggleAccountMenu() history.push(ABOUT_US_ROUTE) @@ -314,7 +423,7 @@ export default class AccountMenu extends PureComponent { } text={t('infoHelp')} /> - { toggleAccountMenu() history.push(SETTINGS_ROUTE) @@ -326,15 +435,15 @@ export default class AccountMenu extends PureComponent { }, }) }} - icon={ + icon={( - } + )} text={t('settings')} /> -
+ ) } } diff --git a/ui/app/components/app/account-menu/account-menu.container.js b/ui/app/components/app/account-menu/account-menu.container.js index ae2e28e7698e..c08537264a3e 100644 --- a/ui/app/components/app/account-menu/account-menu.container.js +++ b/ui/app/components/app/account-menu/account-menu.container.js @@ -1,5 +1,5 @@ import { connect } from 'react-redux' -import { compose } from 'recompose' +import { compose } from 'redux' import { withRouter } from 'react-router-dom' import { toggleAccountMenu, @@ -7,29 +7,42 @@ import { hideSidebar, lockMetamask, hideWarning, - showConfigPage, - showInfoPage, - showModal, } from '../../../store/actions' -import { getMetaMaskAccounts } from '../../../selectors/selectors' +import { + getAddressConnectedDomainMap, + getMetaMaskAccountsOrdered, + getMetaMaskKeyrings, + getOriginOfCurrentTab, + getSelectedAddress, +} from '../../../selectors' import AccountMenu from './account-menu.component' +/** + * The min amount of accounts to show search field + */ +const SHOW_SEARCH_ACCOUNTS_MIN_COUNT = 5 + function mapStateToProps (state) { - const { metamask: { selectedAddress, isAccountMenuOpen, keyrings, identities } } = state + const { metamask: { isAccountMenuOpen } } = state + const accounts = getMetaMaskAccountsOrdered(state) + const origin = getOriginOfCurrentTab(state) + const selectedAddress = getSelectedAddress(state) return { - selectedAddress, isAccountMenuOpen, - keyrings, - identities, - accounts: getMetaMaskAccounts(state), + addressConnectedDomainMap: getAddressConnectedDomainMap(state), + originOfCurrentTab: origin, + selectedAddress, + keyrings: getMetaMaskKeyrings(state), + accounts, + shouldShowAccountsSearch: accounts.length >= SHOW_SEARCH_ACCOUNTS_MIN_COUNT, } } function mapDispatchToProps (dispatch) { return { toggleAccountMenu: () => dispatch(toggleAccountMenu()), - showAccountDetail: address => { + showAccountDetail: (address) => { dispatch(showAccountDetail(address)) dispatch(hideSidebar()) dispatch(toggleAccountMenu()) @@ -40,23 +53,10 @@ function mapDispatchToProps (dispatch) { dispatch(hideSidebar()) dispatch(toggleAccountMenu()) }, - showConfigPage: () => { - dispatch(showConfigPage()) - dispatch(hideSidebar()) - dispatch(toggleAccountMenu()) - }, - showInfoPage: () => { - dispatch(showInfoPage()) - dispatch(hideSidebar()) - dispatch(toggleAccountMenu()) - }, - showRemoveAccountConfirmationModal: identity => { - return dispatch(showModal({ name: 'CONFIRM_REMOVE_ACCOUNT', identity })) - }, } } export default compose( withRouter, - connect(mapStateToProps, mapDispatchToProps) + connect(mapStateToProps, mapDispatchToProps), )(AccountMenu) diff --git a/ui/app/components/app/account-menu/index.scss b/ui/app/components/app/account-menu/index.scss index 435dd6b2a0e6..e7763766f711 100644 --- a/ui/app/components/app/account-menu/index.scss +++ b/ui/app/components/app/account-menu/index.scss @@ -2,7 +2,12 @@ position: fixed; z-index: 100; top: 58px; - width: 310px; + width: 320px; + border-radius: 4px; + background: rgba($black, 0.8); + box-shadow: rgba($black, 0.15) 0 2px 2px 2px; + min-width: 150px; + color: $white; @media screen and (max-width: 575px) { right: calc(((100vw - 100%) / 2) + 8px); @@ -20,6 +25,62 @@ right: calc((100vw - 65vw) / 2); } + &__item { + padding: 18px; + display: flex; + flex-flow: row wrap; + align-items: center; + position: relative; + z-index: 201; + + @media screen and (max-width: 575px) { + padding: 14px; + } + + &--clickable { + cursor: pointer; + + &:hover { + background-color: rgba($white, 0.05); + } + + &:active { + background-color: rgba($white, 0.1); + } + } + + &__icon { + height: 16px; + width: 16px; + margin-right: 14px; + } + + &__text { + font-size: 16px; + line-height: 21px; + } + + &__subtext { + font-size: 12px; + padding: 5px 0 0 30px; + } + } + + &__divider { + background-color: $scorpion; + width: 100%; + height: 1px; + } + + &__close-area { + position: fixed; + width: 100%; + height: 100%; + top: 0; + left: 0; + z-index: 100; + } + &__icon { margin-left: 1rem; cursor: pointer; @@ -36,7 +97,7 @@ align-items: center; } - &__logout-button { + &__lock-button { border: 1px solid $dusty-gray; background-color: transparent; color: $white; @@ -51,14 +112,23 @@ height: 16px; } - &__accounts { + &__accounts-container { display: flex; - flex-flow: column nowrap; - overflow-y: auto; - max-height: 256px; position: relative; + flex-direction: column; z-index: 200; + @media (max-height: 600px) { + max-height: 236px; + } + } + + &__accounts { + overflow-y: auto; + position: relative; + max-height: 256px; + scrollbar-width: none; + &::-webkit-scrollbar { display: none; } @@ -68,14 +138,27 @@ } .keyring-label { + z-index: 1; + font-size: 8px; + line-height: 8px; + border-radius: 10px; + padding: 4px; + text-align: center; + height: 15px; margin-top: 5px; + margin-right: 10px; background-color: $dusty-gray; color: $black; font-weight: normal; - letter-spacing: .5px; + letter-spacing: 0.5px; } } + &__no-accounts { + font-size: 0.8em; + padding: 16px 14px; + } + &__account { display: flex; flex-flow: row nowrap; @@ -151,10 +234,6 @@ cursor: pointer; } - &__accounts-container { - position: relative; - } - &__scroll-button { position: absolute; bottom: 12px; @@ -165,7 +244,7 @@ background: #3f3f3f; z-index: 201; cursor: pointer; - opacity: .8; + opacity: 0.8; display: flex; justify-content: center; align-items: center; @@ -174,4 +253,8 @@ opacity: 1; } } + + &__icon-list { + display: flex; + } } diff --git a/ui/app/components/app/account-menu/tests/account-menu.test.js b/ui/app/components/app/account-menu/tests/account-menu.test.js new file mode 100644 index 000000000000..e0166dd08ec1 --- /dev/null +++ b/ui/app/components/app/account-menu/tests/account-menu.test.js @@ -0,0 +1,196 @@ +import assert from 'assert' +import React from 'react' +import sinon from 'sinon' +import configureMockStore from 'redux-mock-store' +import { Provider } from 'react-redux' +import { mountWithRouter } from '../../../../../../test/lib/render-helpers' +import AccountMenu from '..' + +describe('Account Menu', function () { + + let wrapper + + const mockStore = { + metamask: { + provider: { + type: 'test', + }, + preferences: { + useNativeCurrencyAsPrimaryCurrency: true, + }, + }, + } + + const store = configureMockStore()(mockStore) + + const props = { + isAccountMenuOpen: true, + addressConnectedDomainMap: {}, + accounts: [ + { + address: '0xAddress', + name: 'Account 1', + balance: '0x0', + }, + { + address: '0xImportedAddress', + name: 'Imported Account 1', + balance: '0x0', + }, + ], + keyrings: [ + { + type: 'HD Key Tree', + accounts: [ + '0xAdress', + ], + }, + { + type: 'Simple Key Pair', + accounts: [ + '0xImportedAddress', + ], + }, + ], + prevIsAccountMenuOpen: false, + lockMetamask: sinon.spy(), + showAccountDetail: sinon.spy(), + showRemoveAccountConfirmationModal: sinon.spy(), + toggleAccountMenu: sinon.spy(), + history: { + push: sinon.spy(), + }, + + } + + before(function () { + wrapper = mountWithRouter( + + + , store, + ) + }) + + afterEach(function () { + props.toggleAccountMenu.resetHistory() + props.history.push.resetHistory() + }) + + describe('Render Content', function () { + it('returns account name from identities', function () { + const accountName = wrapper.find('.account-menu__name') + assert.equal(accountName.length, 2) + }) + + it('renders user preference currency display balance from account balance', function () { + const accountBalance = wrapper.find('.currency-display-component.account-menu__balance') + assert.equal(accountBalance.length, 2) + }) + + it('simulate click', function () { + const click = wrapper.find('.account-menu__account.menu__item--clickable') + click.first().simulate('click') + + assert(props.showAccountDetail.calledOnce) + assert.equal(props.showAccountDetail.getCall(0).args[0], '0xAddress') + }) + + it('render imported account label', function () { + const importedAccount = wrapper.find('.keyring-label.allcaps') + assert.equal(importedAccount.text(), 'imported') + }) + }) + + describe('Log Out', function () { + let logout + + it('logout', function () { + logout = wrapper.find('.account-menu__lock-button') + assert.equal(logout.length, 1) + }) + + it('simulate click', function () { + logout.simulate('click') + assert(props.lockMetamask.calledOnce) + assert.equal(props.history.push.getCall(0).args[0], '/') + }) + }) + + describe('Create Account', function () { + let createAccount + + it('renders create account item', function () { + createAccount = wrapper.find({ text: 'createAccount' }) + assert.equal(createAccount.length, 1) + }) + + it('calls toggle menu and push new-account route to history', function () { + createAccount.simulate('click') + assert(props.toggleAccountMenu.calledOnce) + assert.equal(props.history.push.getCall(0).args[0], '/new-account') + }) + }) + + describe('Import Account', function () { + let importAccount + + it('renders import account item', function () { + importAccount = wrapper.find({ text: 'importAccount' }) + assert.equal(importAccount.length, 1) + }) + + it('calls toggle menu and push /new-account/import route to history', function () { + importAccount.simulate('click') + assert(props.toggleAccountMenu.calledOnce) + assert(props.history.push.getCall(0).args[0], '/new-account/import') + }) + }) + + describe('Connect Hardware Wallet', function () { + + let connectHardwareWallet + + it('renders import account item', function () { + connectHardwareWallet = wrapper.find({ text: 'connectHardwareWallet' }) + assert.equal(connectHardwareWallet.length, 1) + }) + + it('calls toggle menu and push /new-account/connect route to history', function () { + connectHardwareWallet.simulate('click') + assert(props.toggleAccountMenu.calledOnce) + assert.equal(props.history.push.getCall(0).args[0], '/new-account/connect') + }) + }) + + describe('Info & Help', function () { + + let infoHelp + + it('renders import account item', function () { + infoHelp = wrapper.find({ text: 'infoHelp' }) + assert.equal(infoHelp.length, 1) + }) + + it('calls toggle menu and push /new-account/connect route to history', function () { + infoHelp.simulate('click') + assert(props.toggleAccountMenu.calledOnce) + assert.equal(props.history.push.getCall(0).args[0], '/settings/about-us') + }) + }) + + describe('Settings', function () { + + let settings + + it('renders import account item', function () { + settings = wrapper.find({ text: 'settings' }) + assert.equal(settings.length, 1) + }) + + it('calls toggle menu and push /new-account/connect route to history', function () { + settings.simulate('click') + assert(props.toggleAccountMenu.calledOnce) + assert.equal(props.history.push.getCall(0).args[0], '/settings') + }) + }) +}) diff --git a/ui/app/components/app/account-panel.js b/ui/app/components/app/account-panel.js deleted file mode 100644 index e61cb8ad67fe..000000000000 --- a/ui/app/components/app/account-panel.js +++ /dev/null @@ -1,77 +0,0 @@ -const inherits = require('util').inherits -const Component = require('react').Component -const h = require('react-hyperscript') -import Identicon from '../ui/identicon' -const formatBalance = require('../../helpers/utils/util').formatBalance -const addressSummary = require('../../helpers/utils/util').addressSummary - -module.exports = AccountPanel - - -inherits(AccountPanel, Component) -function AccountPanel () { - Component.call(this) -} - -AccountPanel.prototype.render = function () { - var state = this.props - var identity = state.identity || {} - var account = state.account || {} - var isFauceting = state.isFauceting - - var panelState = { - key: `accountPanel${identity.address}`, - identiconKey: identity.address, - identiconLabel: identity.name || '', - attributes: [ - { - key: 'ADDRESS', - value: addressSummary(identity.address), - }, - balanceOrFaucetingIndication(account, isFauceting), - ], - } - - return ( - - h('.identity-panel.flex-row.flex-space-between', { - style: { - flex: '1 0 auto', - cursor: panelState.onClick ? 'pointer' : undefined, - }, - onClick: panelState.onClick, - }, [ - - // account identicon - h('.identicon-wrapper.flex-column.select-none', [ - h(Identicon, { - address: panelState.identiconKey, - imageify: state.imageifyIdenticons, - }), - h('span.font-small', panelState.identiconLabel.substring(0, 7) + '...'), - ]), - - // account address, balance - h('.identity-data.flex-column.flex-justify-center.flex-grow.select-none', [ - - panelState.attributes.map((attr) => { - return h('.flex-row.flex-space-between', { - key: '' + Math.round(Math.random() * 1000000), - }, [ - h('label.font-small.no-select', attr.key), - h('span.font-small', attr.value), - ]) - }), - ]), - - ]) - - ) -} - -function balanceOrFaucetingIndication (account) { - return { - key: 'BALANCE', - value: formatBalance(account.balance), - } -} diff --git a/ui/app/components/app/add-token-button/add-token-button.component.js b/ui/app/components/app/add-token-button/add-token-button.component.js index 10887aed82c3..1ddf2b1ffe05 100644 --- a/ui/app/components/app/add-token-button/add-token-button.component.js +++ b/ui/app/components/app/add-token-button/add-token-button.component.js @@ -1,34 +1,34 @@ -import PropTypes from 'prop-types' -import React, {PureComponent} from 'react' +import React from 'react' +import { useHistory } from 'react-router-dom' +import { useMetricEvent } from '../../../hooks/useMetricEvent' +import { useI18nContext } from '../../../hooks/useI18nContext' +import { ADD_TOKEN_ROUTE } from '../../../helpers/constants/routes' +import Button from '../../ui/button' -export default class AddTokenButton extends PureComponent { - static contextTypes = { - t: PropTypes.func.isRequired, - } +export default function AddTokenButton () { + const addTokenEvent = useMetricEvent({ + eventOpts: { + category: 'Navigation', + action: 'Token Menu', + name: 'Clicked "Add Token"', + }, + }) + const t = useI18nContext() + const history = useHistory() - static defaultProps = { - onClick: () => {}, - } - - static propTypes = { - onClick: PropTypes.func, - } - - render () { - const { t } = this.context - const { onClick } = this.props - - return ( -
-

{t('missingYourTokens')}

-

{t('clickToAdd', [t('addToken')])}

-
- {t('addToken')} -
-
- ) - } + return ( +
+ +
+ ) } diff --git a/ui/app/components/app/add-token-button/index.scss b/ui/app/components/app/add-token-button/index.scss index c4350a2d34d8..e8b2c1a43160 100644 --- a/ui/app/components/app/add-token-button/index.scss +++ b/ui/app/components/app/add-token-button/index.scss @@ -1,23 +1,6 @@ .add-token-button { - display: flex; - flex-direction: column; - color: lighten($scorpion, 25%); - width: 185px; - margin: 36px auto; - text-align: center; - - &__help-header { - font-weight: bold; - font-size: 1rem; - } - - &__help-desc { - font-size: 0.75rem; - margin-top: 1rem; - } - &__button { - @extend %small-link; - margin: 1rem; + max-width: 200px; + margin: 16px auto; } } diff --git a/ui/app/components/app/alerts/alerts.js b/ui/app/components/app/alerts/alerts.js new file mode 100644 index 000000000000..72bb4910a229 --- /dev/null +++ b/ui/app/components/app/alerts/alerts.js @@ -0,0 +1,19 @@ +import React from 'react' +import { useSelector } from 'react-redux' + +import { alertIsOpen as unconnectedAccountAlertIsOpen } from '../../../ducks/alerts/unconnected-account' +import UnconnectedAccountAlert from './unconnected-account-alert' + +const Alerts = () => { + const _unconnectedAccountAlertIsOpen = useSelector(unconnectedAccountAlertIsOpen) + + if (_unconnectedAccountAlertIsOpen) { + return ( + + ) + } + + return null +} + +export default Alerts diff --git a/ui/app/components/app/alerts/alerts.scss b/ui/app/components/app/alerts/alerts.scss new file mode 100644 index 000000000000..280171f5e354 --- /dev/null +++ b/ui/app/components/app/alerts/alerts.scss @@ -0,0 +1 @@ +@import './unconnected-account-alert/unconnected-account-alert'; diff --git a/ui/app/components/app/alerts/index.js b/ui/app/components/app/alerts/index.js new file mode 100644 index 000000000000..b52e5d6502f2 --- /dev/null +++ b/ui/app/components/app/alerts/index.js @@ -0,0 +1 @@ +export { default } from './alerts' diff --git a/ui/app/components/app/alerts/unconnected-account-alert/index.js b/ui/app/components/app/alerts/unconnected-account-alert/index.js new file mode 100644 index 000000000000..495f14c33371 --- /dev/null +++ b/ui/app/components/app/alerts/unconnected-account-alert/index.js @@ -0,0 +1 @@ +export { default } from './unconnected-account-alert' diff --git a/ui/app/components/app/alerts/unconnected-account-alert/tests/unconnected-account-alert.test.js b/ui/app/components/app/alerts/unconnected-account-alert/tests/unconnected-account-alert.test.js new file mode 100644 index 000000000000..ff85ed553848 --- /dev/null +++ b/ui/app/components/app/alerts/unconnected-account-alert/tests/unconnected-account-alert.test.js @@ -0,0 +1,158 @@ +import assert from 'assert' +import React from 'react' + +import sinon from 'sinon' +import thunk from 'redux-thunk' + +import { fireEvent } from '@testing-library/react' +import configureMockStore from 'redux-mock-store' + +import { renderWithProvider } from '../../../../../../../test/lib/render-helpers' + +import * as actions from '../../../../../store/actions' +import UnconnectedAccountAlert from '..' + +describe('Unconnected Account Alert', function () { + + const network = '123' + + const selectedAddress = '0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b' + + const identities = { + '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc': { + address: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc', + name: 'Account 1', + }, + '0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b': { + address: '0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b', + name: 'Account 2', + }, + } + + const accounts = { + '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc': { + address: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc', + balance: '0x0', + }, + '0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b': { + address: '0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b', + balance: '0x0', + }, + } + + const cachedBalances = { + '123': { + '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc': '0x0', + '0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b': '0x0', + }, + } + + const keyrings = [ + { + type: 'HD Key Tree', + accounts: [ + '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc', + '0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b', + ], + }, + ] + + const mockState = { + metamask: { + network, + selectedAddress, + identities, + accounts, + cachedBalances, + keyrings, + permissionsHistory: { + 'https://test.dapp': { + eth_accounts: { + accounts: { + '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc': 1596681857076, + }, + }, + }, + }, + domains: { + 'https://test.dapp': { + permissions: [ + { + caveats: [ + { + name: 'primaryAccountOnly', + type: 'limitResponseLength', + value: 1, + }, + { + name: 'exposedAccounts', + type: 'filterResponse', + value: [ + '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc', + ], + }, + ], + invoker: 'https://test.dapp', + parentCapability: 'eth_accounts', + }, + ], + }, + }, + }, + activeTab: { + origin: 'https://test.dapp', + }, + unconnectedAccount: { + state: 'OPEN', + }, + } + + afterEach(function () { + sinon.restore() + }) + + it('checks that checkbox is checked', function () { + + const store = configureMockStore()(mockState) + + const { getByRole } = renderWithProvider(, store) + + const dontShowCheckbox = getByRole('checkbox') + + assert.equal(dontShowCheckbox.checked, false) + fireEvent.click(dontShowCheckbox) + assert.equal(dontShowCheckbox.checked, true) + }) + + it('clicks dismiss button and calls dismissAlert action', function () { + const store = configureMockStore()(mockState) + + const { getByText } = renderWithProvider(, store) + + const dismissButton = getByText(/dismiss/u) + fireEvent.click(dismissButton) + + assert.equal(store.getActions()[0].type, 'unconnectedAccount/dismissAlert') + }) + + it('clicks Dont Show checkbox and dismiss to call disable alert request action', async function () { + sinon.stub(actions, 'setAlertEnabledness').returns(() => Promise.resolve()) + + const store = configureMockStore([thunk])(mockState) + + const { getByText, getByRole } = renderWithProvider(, store) + + const dismissButton = getByText(/dismiss/u) + const dontShowCheckbox = getByRole('checkbox') + + fireEvent.click(dontShowCheckbox) + fireEvent.click(dismissButton) + + setImmediate(() => { + assert.equal(store.getActions()[0].type, 'unconnectedAccount/disableAlertRequested') + assert.equal(store.getActions()[1].type, 'unconnectedAccount/disableAlertSucceeded') + }) + + }) + +}) diff --git a/ui/app/components/app/alerts/unconnected-account-alert/unconnected-account-alert.js b/ui/app/components/app/alerts/unconnected-account-alert/unconnected-account-alert.js new file mode 100644 index 000000000000..b56408a484fb --- /dev/null +++ b/ui/app/components/app/alerts/unconnected-account-alert/unconnected-account-alert.js @@ -0,0 +1,113 @@ +import React, { useState } from 'react' +import { useDispatch, useSelector } from 'react-redux' + +import { + ALERT_STATE, + connectAccount, + dismissAlert, + dismissAndDisableAlert, + getAlertState, + switchToAccount, +} from '../../../../ducks/alerts/unconnected-account' +import { + getOriginOfCurrentTab, + getOrderedConnectedAccountsForActiveTab, + getSelectedAddress, + getSelectedIdentity, +} from '../../../../selectors' +import { isExtensionUrl } from '../../../../helpers/utils/util' +import Popover from '../../../ui/popover' +import Button from '../../../ui/button' +import Checkbox from '../../../ui/check-box' +import Tooltip from '../../../ui/tooltip' +import ConnectedAccountsList from '../../connected-accounts-list' +import { useI18nContext } from '../../../../hooks/useI18nContext' + +const { + ERROR, + LOADING, +} = ALERT_STATE + +const UnconnectedAccountAlert = () => { + const t = useI18nContext() + const dispatch = useDispatch() + const alertState = useSelector(getAlertState) + const connectedAccounts = useSelector(getOrderedConnectedAccountsForActiveTab) + const origin = useSelector(getOriginOfCurrentTab) + const selectedIdentity = useSelector(getSelectedIdentity) + const selectedAddress = useSelector(getSelectedAddress) + const [dontShowThisAgain, setDontShowThisAgain] = useState(false) + + const onClose = async () => { + return dontShowThisAgain + ? await dispatch(dismissAndDisableAlert()) + : dispatch(dismissAlert()) + } + + const footer = ( + <> + { + alertState === ERROR + ? ( +
+ { t('failureMessage') } +
+ ) + : null + } +
+
+ setDontShowThisAgain((checked) => !checked)} + /> + +
+ +
+ + ) + + return ( + + dispatch(connectAccount(selectedAddress))} + connectedAccounts={connectedAccounts} + selectedAddress={selectedAddress} + setSelectedAddress={(address) => dispatch(switchToAccount(address))} + shouldRenderListOptions={false} + /> + + ) +} + +export default UnconnectedAccountAlert diff --git a/ui/app/components/app/alerts/unconnected-account-alert/unconnected-account-alert.scss b/ui/app/components/app/alerts/unconnected-account-alert/unconnected-account-alert.scss new file mode 100644 index 000000000000..1ae28dd507b2 --- /dev/null +++ b/ui/app/components/app/alerts/unconnected-account-alert/unconnected-account-alert.scss @@ -0,0 +1,60 @@ +.unconnected-account-alert { + &__content { + border-radius: 0; + } + + &__footer { + flex-direction: column; + + > :only-child { + margin: 0; + } + } + + &__footer-row { + display: flex; + flex-direction: row; + } + + &__dismiss-button { + background: $primary-blue; + color: white; + height: 40px; + width: 100px; + border: 0; + border-radius: 100px; + } + + &__error { + margin-bottom: 16px; + padding: 16px; + font-size: 14px; + border: 1px solid $accent-red; + background: #f8eae8; + border-radius: 3px; + } + + &__checkbox-wrapper { + width: 100%; + display: flex; + flex-direction: row; + align-items: center; + } + + &__checkbox { + margin-right: 8px; + padding-top: 1px; // better alignment with rest of content + } + + &__checkbox-label { + display: flex; + font-size: 12px; + margin-top: auto; + margin-bottom: auto; + color: $Grey-500; + } + + &__checkbox-label-tooltip { + margin-left: 8px; + } +} diff --git a/ui/app/components/app/app-components.scss b/ui/app/components/app/app-components.scss new file mode 100644 index 000000000000..07eac6ce137d --- /dev/null +++ b/ui/app/components/app/app-components.scss @@ -0,0 +1,38 @@ +/** Please import your files in alphabetical order **/ +@import 'account-list-item/index'; +@import 'account-menu/index'; +@import 'add-token-button/index'; +@import 'alerts/alerts'; +@import 'app-header/index'; +@import 'asset-list-item/asset-list-item'; +@import 'confirm-page-container/index'; +@import 'connected-accounts-list/index'; +@import 'connected-accounts-permissions/index'; +@import 'connected-sites-list/index'; +@import 'connected-status-indicator/index'; +@import 'gas-customization/gas-modal-page-container/index'; +@import 'gas-customization/gas-price-button-group/index'; +@import 'gas-customization/index'; +@import 'home-notification/index'; +@import 'info-box/index'; +@import 'menu-bar/index'; +@import 'modal/index'; +@import 'modals/index'; +@import 'multiple-notifications/index'; +@import 'network-display/index'; +@import 'permission-page-container/index'; +@import 'permissions-connect-footer/index'; +@import 'permissions-connect-header/index'; +@import 'selected-account/index'; +@import 'sidebars/index'; +@import 'signature-request/index'; +@import 'signature-request-original/index'; +@import 'tab-bar/index'; +@import 'token-cell/token-cell'; +@import 'transaction-activity-log/index'; +@import 'transaction-breakdown/index'; +@import 'transaction-list-item-details/index'; +@import 'transaction-list-item/index'; +@import 'transaction-list/index'; +@import 'transaction-status/index'; +@import 'wallet-overview/index'; diff --git a/ui/app/components/app/app-header/app-header.component.js b/ui/app/components/app/app-header/app-header.component.js index 171a3499fb87..b4c4fa992a6f 100644 --- a/ui/app/components/app/app-header/app-header.component.js +++ b/ui/app/components/app/app-header/app-header.component.js @@ -2,8 +2,9 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' import Identicon from '../../ui/identicon' +import MetaFoxLogo from '../../ui/metafox-logo' import { DEFAULT_ROUTE } from '../../../helpers/constants/routes' -const NetworkIndicator = require('../network') +import NetworkIndicator from '../network' export default class AppHeader extends PureComponent { static propTypes = { @@ -70,6 +71,7 @@ export default class AppHeader extends PureComponent { ) @@ -87,22 +89,13 @@ export default class AppHeader extends PureComponent { return (
+ className={classnames('app-header', { 'app-header--back-drop': isUnlocked })} + >
-
history.push(DEFAULT_ROUTE)} - > - - -
+ />
{ !hideNetworkIndicator && ( @@ -110,7 +103,7 @@ export default class AppHeader extends PureComponent { this.handleNetworkIndicatorClick(event)} + onClick={(event) => this.handleNetworkIndicatorClick(event)} disabled={disabled} />
diff --git a/ui/app/components/app/app-header/app-header.container.js b/ui/app/components/app/app-header/app-header.container.js index b673382451b4..955f2f320274 100644 --- a/ui/app/components/app/app-header/app-header.container.js +++ b/ui/app/components/app/app-header/app-header.container.js @@ -1,11 +1,11 @@ import { connect } from 'react-redux' import { withRouter } from 'react-router-dom' -import { compose } from 'recompose' +import { compose } from 'redux' +import * as actions from '../../../store/actions' import AppHeader from './app-header.component' -const actions = require('../../../store/actions') -const mapStateToProps = state => { +const mapStateToProps = (state) => { const { appState, metamask } = state const { networkDropdownOpen } = appState const { @@ -26,7 +26,7 @@ const mapStateToProps = state => { } } -const mapDispatchToProps = dispatch => { +const mapDispatchToProps = (dispatch) => { return { showNetworkDropdown: () => dispatch(actions.showNetworkDropdown()), hideNetworkDropdown: () => dispatch(actions.hideNetworkDropdown()), @@ -36,5 +36,5 @@ const mapDispatchToProps = dispatch => { export default compose( withRouter, - connect(mapStateToProps, mapDispatchToProps) + connect(mapStateToProps, mapDispatchToProps), )(AppHeader) diff --git a/ui/app/components/app/app-header/index.scss b/ui/app/components/app/app-header/index.scss index d3f37b7a218e..aacbbf9be933 100644 --- a/ui/app/components/app/app-header/index.scss +++ b/ui/app/components/app/app-header/index.scss @@ -10,7 +10,6 @@ @media screen and (max-width: 575px) { padding: 1rem; - box-shadow: 0 0 0 1px rgba(0, 0, 0, .08); z-index: $mobile-header-z-index; } @@ -24,17 +23,16 @@ position: absolute; width: 100%; height: 32px; - background: $gallery; + background: $Grey-000; bottom: -32px; } } } &__metafox-logo { - cursor: pointer; - &--icon { height: 32px; + @media screen and (min-width: $break-large) { display: none; } @@ -73,8 +71,11 @@ display: flex; flex-direction: row; align-items: center; - cursor: pointer; flex: 0 0 auto; + + &--clickable { + cursor: pointer; + } } &__account-menu-container { diff --git a/ui/app/components/app/app-header/tests/app-header.test.js b/ui/app/components/app/app-header/tests/app-header.test.js new file mode 100644 index 000000000000..76ece07a7c17 --- /dev/null +++ b/ui/app/components/app/app-header/tests/app-header.test.js @@ -0,0 +1,99 @@ +import assert from 'assert' +import React from 'react' +import sinon from 'sinon' +import { shallow } from 'enzyme' +import MetaFoxLogo from '../../../ui/metafox-logo' +import AppHeader from '..' + +describe('App Header', function () { + let wrapper + + const props = { + hideNetworkDropdown: sinon.spy(), + showNetworkDropdown: sinon.spy(), + toggleAccountMenu: sinon.spy(), + history: { + push: sinon.spy(), + }, + network: 'test', + provider: {}, + selectedAddress: '0xAddress', + disabled: false, + hideNetworkIndicator: false, + networkDropdownOpen: false, + isAccountMenuOpen: false, + isUnlocked: true, + } + + beforeEach(function () { + wrapper = shallow( + , { + context: { + t: (str) => str, + metricsEvent: () => undefined, + }, + }, + ) + }) + + afterEach(function () { + props.toggleAccountMenu.resetHistory() + }) + + describe('App Header Logo', function () { + it('routes to default route when logo is clicked', function () { + const appLogo = wrapper.find(MetaFoxLogo) + appLogo.simulate('click') + assert(props.history.push.calledOnce) + assert.equal(props.history.push.getCall(0).args[0], '/') + }) + }) + + describe('Network', function () { + it('shows network dropdown when networkDropdownOpen is false', function () { + const network = wrapper.find({ network: 'test' }) + + network.simulate('click', { + preventDefault: () => undefined, + stopPropagation: () => undefined, + }) + + assert(props.showNetworkDropdown.calledOnce) + }) + + it('hides network dropdown when networkDropdownOpen is true', function () { + wrapper.setProps({ networkDropdownOpen: true }) + const network = wrapper.find({ network: 'test' }) + + network.simulate('click', { + preventDefault: () => undefined, + stopPropagation: () => undefined, + }) + + assert(props.hideNetworkDropdown.calledOnce) + }) + + it('hides network indicator', function () { + wrapper.setProps({ hideNetworkIndicator: true }) + const network = wrapper.find({ network: 'test' }) + assert.equal(network.length, 0) + }) + }) + + describe('Account Menu', function () { + + it('toggles account menu', function () { + const accountMenu = wrapper.find('.account-menu__icon') + accountMenu.simulate('click') + assert(props.toggleAccountMenu.calledOnce) + }) + + it('does not toggle account menu when disabled', function () { + wrapper.setProps({ disabled: true }) + const accountMenu = wrapper.find('.account-menu__icon') + accountMenu.simulate('click') + assert(props.toggleAccountMenu.notCalled) + }) + }) + +}) diff --git a/ui/app/components/app/asset-list-item/asset-list-item.js b/ui/app/components/app/asset-list-item/asset-list-item.js new file mode 100644 index 000000000000..e5ff8212f4fe --- /dev/null +++ b/ui/app/components/app/asset-list-item/asset-list-item.js @@ -0,0 +1,143 @@ +import React, { useMemo } from 'react' +import PropTypes from 'prop-types' +import classnames from 'classnames' +import { useDispatch } from 'react-redux' +import { useHistory } from 'react-router-dom' +import Identicon from '../../ui/identicon' +import ListItem from '../../ui/list-item' +import Tooltip from '../../ui/tooltip' +import InfoIcon from '../../ui/icon/info-icon.component' +import Button from '../../ui/button' +import { useI18nContext } from '../../../hooks/useI18nContext' +import { useMetricEvent } from '../../../hooks/useMetricEvent' +import { updateSendToken } from '../../../store/actions' +import { SEND_ROUTE } from '../../../helpers/constants/routes' + +const AssetListItem = ({ + className, + 'data-testid': dataTestId, + iconClassName, + onClick, + tokenAddress, + tokenSymbol, + tokenDecimals, + tokenImage, + warning, + primary, + secondary, +}) => { + const t = useI18nContext() + const dispatch = useDispatch() + const history = useHistory() + const sendTokenEvent = useMetricEvent({ + eventOpts: { + category: 'Navigation', + action: 'Home', + name: 'Clicked Send: Token', + }, + }) + const titleIcon = warning + ? ( + + + + ) + : null + + const midContent = warning + ? ( + <> + +
{warning}
+ + ) + : null + + const sendTokenButton = useMemo(() => { + if (tokenAddress === null || tokenAddress === undefined) { + return null + } + return ( + + ) + }, [ + tokenSymbol, + sendTokenEvent, + tokenAddress, + tokenDecimals, + history, + t, + dispatch, + ]) + + return ( + {secondary}} + onClick={onClick} + icon={( + + )} + midContent={midContent} + rightContent={( + <> + + {sendTokenButton} + + )} + /> + ) +} + +AssetListItem.propTypes = { + className: PropTypes.string, + 'data-testid': PropTypes.string, + iconClassName: PropTypes.string, + onClick: PropTypes.func.isRequired, + tokenAddress: PropTypes.string, + tokenSymbol: PropTypes.string, + tokenDecimals: PropTypes.number, + tokenImage: PropTypes.string, + warning: PropTypes.node, + primary: PropTypes.string, + secondary: PropTypes.string, +} + +AssetListItem.defaultProps = { + className: undefined, + 'data-testid': undefined, + iconClassName: undefined, + tokenAddress: undefined, + tokenImage: undefined, + warning: undefined, +} + +export default AssetListItem diff --git a/ui/app/components/app/asset-list-item/asset-list-item.scss b/ui/app/components/app/asset-list-item/asset-list-item.scss new file mode 100644 index 000000000000..ddc6fd562b4c --- /dev/null +++ b/ui/app/components/app/asset-list-item/asset-list-item.scss @@ -0,0 +1,44 @@ +.asset-list-item { + &__chevron-right { + color: $Grey-500; + } + + .list-item__right-content { + align-self: center; + } + + .list-item__subheading { + margin-top: 6px; + font-size: 14px; + } + + &__warning { + flex: 1; + margin-left: 8px; + } + + & &__send-token-button { + display: none; + text-transform: uppercase; + width: fit-content; + font-size: 14px; + } + + @media (min-width: 576px) { + &__warning-tooltip { + display: none; + } + + .list-item__mid-content { + display: flex; + } + + & &__send-token-button { + display: inline-block; + } + + &__chevron-right { + display: none; + } + } +} diff --git a/ui/app/components/app/asset-list-item/index.js b/ui/app/components/app/asset-list-item/index.js new file mode 100644 index 000000000000..48b7de3d28e2 --- /dev/null +++ b/ui/app/components/app/asset-list-item/index.js @@ -0,0 +1 @@ +export { default } from './asset-list-item' diff --git a/ui/app/components/app/asset-list/asset-list.js b/ui/app/components/app/asset-list/asset-list.js new file mode 100644 index 000000000000..12d54e9dc2c6 --- /dev/null +++ b/ui/app/components/app/asset-list/asset-list.js @@ -0,0 +1,82 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { useSelector } from 'react-redux' +import { useHistory } from 'react-router-dom' +import AddTokenButton from '../add-token-button' +import TokenList from '../token-list' +import { ADD_TOKEN_ROUTE } from '../../../helpers/constants/routes' +import AssetListItem from '../asset-list-item' +import { PRIMARY, SECONDARY } from '../../../helpers/constants/common' +import { useMetricEvent } from '../../../hooks/useMetricEvent' +import { useUserPreferencedCurrency } from '../../../hooks/useUserPreferencedCurrency' +import { getCurrentAccountWithSendEtherInfo, getNativeCurrency, getShouldShowFiat } from '../../../selectors' +import { useCurrencyDisplay } from '../../../hooks/useCurrencyDisplay' + +const AssetList = ({ onClickAsset }) => { + const history = useHistory() + const selectedAccountBalance = useSelector((state) => getCurrentAccountWithSendEtherInfo(state).balance) + const nativeCurrency = useSelector(getNativeCurrency) + const showFiat = useSelector(getShouldShowFiat) + const selectTokenEvent = useMetricEvent({ + eventOpts: { + category: 'Navigation', + action: 'Token Menu', + name: 'Clicked Token', + }, + }) + const addTokenEvent = useMetricEvent({ + eventOpts: { + category: 'Navigation', + action: 'Token Menu', + name: 'Clicked "Add Token"', + }, + }) + + const { + currency: primaryCurrency, + numberOfDecimals: primaryNumberOfDecimals, + } = useUserPreferencedCurrency(PRIMARY, { ethNumberOfDecimals: 4 }) + const { + currency: secondaryCurrency, + numberOfDecimals: secondaryNumberOfDecimals, + } = useUserPreferencedCurrency(SECONDARY, { ethNumberOfDecimals: 4 }) + + const [primaryCurrencyDisplay] = useCurrencyDisplay( + selectedAccountBalance, + { numberOfDecimals: primaryNumberOfDecimals, currency: primaryCurrency }, + ) + + const [secondaryCurrencyDisplay] = useCurrencyDisplay( + selectedAccountBalance, + { numberOfDecimals: secondaryNumberOfDecimals, currency: secondaryCurrency }, + ) + + return ( + <> + onClickAsset(nativeCurrency)} + data-testid="wallet-balance" + primary={primaryCurrencyDisplay} + secondary={showFiat ? secondaryCurrencyDisplay : undefined} + /> + { + onClickAsset(tokenAddress) + selectTokenEvent() + }} + /> + { + history.push(ADD_TOKEN_ROUTE) + addTokenEvent() + }} + /> + + ) +} + +AssetList.propTypes = { + onClickAsset: PropTypes.func.isRequired, +} + +export default AssetList diff --git a/ui/app/components/app/asset-list/index.js b/ui/app/components/app/asset-list/index.js new file mode 100644 index 000000000000..47ee5ce9fe69 --- /dev/null +++ b/ui/app/components/app/asset-list/index.js @@ -0,0 +1 @@ +export { default } from './asset-list' diff --git a/ui/app/components/app/bn-as-decimal-input.js b/ui/app/components/app/bn-as-decimal-input.js deleted file mode 100644 index 834bab0a4d8c..000000000000 --- a/ui/app/components/app/bn-as-decimal-input.js +++ /dev/null @@ -1,188 +0,0 @@ -const Component = require('react').Component -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const inherits = require('util').inherits -const ethUtil = require('ethereumjs-util') -const BN = ethUtil.BN -const extend = require('xtend') -const connect = require('react-redux').connect - -BnAsDecimalInput.contextTypes = { - t: PropTypes.func, -} - -module.exports = connect()(BnAsDecimalInput) - - -inherits(BnAsDecimalInput, Component) -function BnAsDecimalInput () { - this.state = { invalid: null } - Component.call(this) -} - -/* Bn as Decimal Input - * - * A component for allowing easy, decimal editing - * of a passed in bn string value. - * - * On change, calls back its `onChange` function parameter - * and passes it an updated bn string. - */ - -BnAsDecimalInput.prototype.render = function () { - const props = this.props - const state = this.state - - const { value, scale, precision, onChange, min, max } = props - - const suffix = props.suffix - const style = props.style - const valueString = value.toString(10) - const newMin = min && this.downsize(min.toString(10), scale) - const newMax = max && this.downsize(max.toString(10), scale) - const newValue = this.downsize(valueString, scale) - - return ( - h('.flex-column', [ - h('.flex-row', { - style: { - alignItems: 'flex-end', - lineHeight: '13px', - fontFamily: 'Montserrat Light', - textRendering: 'geometricPrecision', - }, - }, [ - h('input.hex-input', { - type: 'number', - step: 'any', - required: true, - min: newMin, - max: newMax, - style: extend({ - display: 'block', - textAlign: 'right', - backgroundColor: 'transparent', - border: '1px solid #bdbdbd', - - }, style), - value: newValue, - onBlur: (event) => { - this.updateValidity(event) - }, - onChange: (event) => { - this.updateValidity(event) - const value = (event.target.value === '') ? '' : event.target.value - - - const scaledNumber = this.upsize(value, scale, precision) - const precisionBN = new BN(scaledNumber, 10) - onChange(precisionBN, event.target.checkValidity()) - }, - onInvalid: (event) => { - const msg = this.constructWarning() - if (msg === state.invalid) { - return - } - this.setState({ invalid: msg }) - event.preventDefault() - return false - }, - }), - h('div', { - style: { - color: ' #AEAEAE', - fontSize: '12px', - marginLeft: '5px', - marginRight: '6px', - width: '20px', - }, - }, suffix), - ]), - - state.invalid ? h('span.error', { - style: { - position: 'absolute', - right: '0px', - textAlign: 'right', - transform: 'translateY(26px)', - padding: '3px', - background: 'rgba(255,255,255,0.85)', - zIndex: '1', - textTransform: 'capitalize', - border: '2px solid #E20202', - }, - }, state.invalid) : null, - ]) - ) -} - -BnAsDecimalInput.prototype.setValid = function () { - this.setState({ invalid: null }) -} - -BnAsDecimalInput.prototype.updateValidity = function (event) { - const target = event.target - const value = this.props.value - const newValue = target.value - - if (value === newValue) { - return - } - - const valid = target.checkValidity() - - if (valid) { - this.setState({ invalid: null }) - } -} - -BnAsDecimalInput.prototype.constructWarning = function () { - const { name, min, max, scale, suffix } = this.props - const newMin = min && this.downsize(min.toString(10), scale) - const newMax = max && this.downsize(max.toString(10), scale) - let message = name ? name + ' ' : '' - - if (min && max) { - message += this.context.t('betweenMinAndMax', [`${newMin} ${suffix}`, `${newMax} ${suffix}`]) - } else if (min) { - message += this.context.t('greaterThanMin', [`${newMin} ${suffix}`]) - } else if (max) { - message += this.context.t('lessThanMax', [`${newMax} ${suffix}`]) - } else { - message += this.context.t('invalidInput') - } - - return message -} - - -BnAsDecimalInput.prototype.downsize = function (number, scale) { - // if there is no scaling, simply return the number - if (scale === 0) { - return Number(number) - } else { - // if the scale is the same as the precision, account for this edge case. - var adjustedNumber = number - while (adjustedNumber.length < scale) { - adjustedNumber = '0' + adjustedNumber - } - return Number(adjustedNumber.slice(0, -scale) + '.' + adjustedNumber.slice(-scale)) - } -} - -BnAsDecimalInput.prototype.upsize = function (number, scale, precision) { - var stringArray = number.toString().split('.') - var decimalLength = stringArray[1] ? stringArray[1].length : 0 - var newString = stringArray[0] - - // If there is scaling and decimal parts exist, integrate them in. - if ((scale !== 0) && (decimalLength !== 0)) { - newString += stringArray[1].slice(0, precision) - } - - // Add 0s to account for the upscaling. - for (var i = decimalLength; i < scale; i++) { - newString += '0' - } - return newString -} diff --git a/ui/app/components/app/confirm-page-container/confirm-detail-row/confirm-detail-row.component.js b/ui/app/components/app/confirm-page-container/confirm-detail-row/confirm-detail-row.component.js index 18571eccbfb4..0cdb53a32c85 100644 --- a/ui/app/components/app/confirm-page-container/confirm-detail-row/confirm-detail-row.component.js +++ b/ui/app/components/app/confirm-page-container/confirm-detail-row/confirm-detail-row.component.js @@ -4,7 +4,7 @@ import classnames from 'classnames' import UserPreferencedCurrencyDisplay from '../../user-preferenced-currency-display' import { PRIMARY, SECONDARY } from '../../../../helpers/constants/common' -const ConfirmDetailRow = props => { +const ConfirmDetailRow = (props) => { const { label, primaryText, @@ -22,12 +22,16 @@ const ConfirmDetailRow = props => { { label }
-
onHeaderClick && onHeaderClick()} - > - { headerText } -
+ { + headerText && ( +
onHeaderClick && onHeaderClick()} + > + { headerText } +
+ ) + } { primaryText ? ( diff --git a/ui/app/components/app/confirm-page-container/confirm-detail-row/index.scss b/ui/app/components/app/confirm-page-container/confirm-detail-row/index.scss index 1672ef8c60e4..cfd888817ac7 100644 --- a/ui/app/components/app/confirm-page-container/confirm-detail-row/index.scss +++ b/ui/app/components/app/confirm-page-container/confirm-detail-row/index.scss @@ -6,7 +6,7 @@ align-items: center; &__label { - font-size: .75rem; + font-size: 0.75rem; font-weight: 500; color: $scorpion; text-transform: uppercase; @@ -29,22 +29,29 @@ } &__header-text { - font-size: .75rem; + font-size: 0.75rem; text-transform: uppercase; margin-bottom: 6px; color: $scorpion; &--edit { - color: $curious-blue; + color: $primary-blue; cursor: pointer; } &--total { - font-size: .625rem; + font-size: 0.625rem; } } .advanced-gas-inputs__gas-edit-rows { margin-bottom: 16px; } + + .custom-nonce-input { + input { + width: 90px; + font-size: 1rem; + } + } } diff --git a/ui/app/components/app/confirm-page-container/confirm-detail-row/tests/confirm-detail-row.component.test.js b/ui/app/components/app/confirm-page-container/confirm-detail-row/tests/confirm-detail-row.component.test.js index c8507985d9ba..d431033c3740 100644 --- a/ui/app/components/app/confirm-page-container/confirm-detail-row/tests/confirm-detail-row.component.test.js +++ b/ui/app/components/app/confirm-page-container/confirm-detail-row/tests/confirm-detail-row.component.test.js @@ -1,64 +1,64 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { shallow } from 'enzyme' -import ConfirmDetailRow from '../confirm-detail-row.component.js' import sinon from 'sinon' +import ConfirmDetailRow from '../confirm-detail-row.component' const propsMethodSpies = { onHeaderClick: sinon.spy(), } describe('Confirm Detail Row Component', function () { - let wrapper + describe('render', function () { + let wrapper - beforeEach(() => { - wrapper = shallow( - - ) - }) + beforeEach(function () { + wrapper = shallow( + , + ) + }) - describe('render', () => { - it('should render a div with a confirm-detail-row class', () => { + it('should render a div with a confirm-detail-row class', function () { assert.equal(wrapper.find('div.confirm-detail-row').length, 1) }) - it('should render the label as a child of the confirm-detail-row__label', () => { + it('should render the label as a child of the confirm-detail-row__label', function () { assert.equal(wrapper.find('.confirm-detail-row > .confirm-detail-row__label').childAt(0).text(), 'mockLabel') }) - it('should render the headerText as a child of the confirm-detail-row__header-text', () => { + it('should render the headerText as a child of the confirm-detail-row__header-text', function () { assert.equal(wrapper.find('.confirm-detail-row__details > .confirm-detail-row__header-text').childAt(0).text(), 'mockHeaderText') }) - it('should render the primaryText as a child of the confirm-detail-row__primary', () => { + it('should render the primaryText as a child of the confirm-detail-row__primary', function () { assert.equal(wrapper.find('.confirm-detail-row__details > .confirm-detail-row__primary').childAt(0).text(), 'mockFiatText') }) - it('should render the ethText as a child of the confirm-detail-row__secondary', () => { + it('should render the ethText as a child of the confirm-detail-row__secondary', function () { assert.equal(wrapper.find('.confirm-detail-row__details > .confirm-detail-row__secondary').childAt(0).text(), 'mockEthText') }) - it('should set the fiatTextColor on confirm-detail-row__primary', () => { + it('should set the fiatTextColor on confirm-detail-row__primary', function () { assert.equal(wrapper.find('.confirm-detail-row__primary').props().style.color, 'mockColor') }) - it('should assure the confirm-detail-row__header-text classname is correct', () => { + it('should assure the confirm-detail-row__header-text classname is correct', function () { assert.equal(wrapper.find('.confirm-detail-row__header-text').props().className, 'confirm-detail-row__header-text mockHeaderClass') }) - it('should call onHeaderClick when headerText div gets clicked', () => { + it('should call onHeaderClick when headerText div gets clicked', function () { wrapper.find('.confirm-detail-row__header-text').props().onClick() - assert.equal(assert.equal(propsMethodSpies.onHeaderClick.callCount, 1)) + assert.ok(propsMethodSpies.onHeaderClick.calledOnce) }) - }) + }) }) diff --git a/ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js b/ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js index 8a5f90c7630f..bf226df7e2ef 100644 --- a/ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js +++ b/ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js @@ -2,8 +2,9 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' import { Tabs, Tab } from '../../../ui/tabs' -import { ConfirmPageContainerSummary, ConfirmPageContainerWarning } from '.' import ErrorMessage from '../../../ui/error-message' +import { PageContainerFooter } from '../../../ui/page-container' +import { ConfirmPageContainerSummary, ConfirmPageContainerWarning } from '.' export default class ConfirmPageContainerContent extends Component { static propTypes = { @@ -22,6 +23,15 @@ export default class ConfirmPageContainerContent extends Component { title: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), titleComponent: PropTypes.node, warning: PropTypes.string, + // Footer + onCancelAll: PropTypes.func, + onCancel: PropTypes.func, + cancelText: PropTypes.string, + onSubmit: PropTypes.func, + submitText: PropTypes.string, + disabled: PropTypes.bool, + unapprovedTxCount: PropTypes.number, + rejectNText: PropTypes.string, } renderContent () { @@ -29,9 +39,9 @@ export default class ConfirmPageContainerContent extends Component { if (detailsComponent && dataComponent) { return this.renderTabs() - } else { - return detailsComponent || dataComponent } + return detailsComponent || dataComponent + } renderTabs () { @@ -39,10 +49,10 @@ export default class ConfirmPageContainerContent extends Component { return ( - + { detailsComponent } - + { dataComponent } @@ -66,6 +76,14 @@ export default class ConfirmPageContainerContent extends Component { detailsComponent, dataComponent, warning, + onCancelAll, + onCancel, + cancelText, + onSubmit, + submitText, + disabled, + unapprovedTxCount, + rejectNText, } = this.props return ( @@ -104,6 +122,21 @@ export default class ConfirmPageContainerContent extends Component {
) } + + {unapprovedTxCount > 1 && ( +
+ {rejectNText} + + )} + +
) } diff --git a/ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/confirm-page-container-summary.component.js b/ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/confirm-page-container-summary.component.js index 0cc4d8262bab..85cbc0076c99 100644 --- a/ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/confirm-page-container-summary.component.js +++ b/ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/confirm-page-container-summary.component.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types' import classnames from 'classnames' import Identicon from '../../../../ui/identicon' -const ConfirmPageContainerSummary = props => { +const ConfirmPageContainerSummary = (props) => { const { action, title, @@ -47,9 +47,11 @@ const ConfirmPageContainerSummary = props => { { - hideSubtitle ||
- { subtitleComponent || subtitle } -
+ hideSubtitle || ( +
+ { subtitleComponent || subtitle } +
+ ) } ) diff --git a/ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/index.scss b/ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/index.scss index 7f0f5d37a4dc..4f1e1547ae83 100644 --- a/ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/index.scss +++ b/ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-summary/index.scss @@ -12,7 +12,7 @@ &__action { text-transform: uppercase; color: $oslo-gray; - font-size: .75rem; + font-size: 0.75rem; padding: 3px 8px; border: 1px solid $oslo-gray; border-radius: 4px; diff --git a/ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-warning/confirm-page-container-warning.component.js b/ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-warning/confirm-page-container-warning.component.js index 79901c8fc7e0..8865fb976e6a 100644 --- a/ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-warning/confirm-page-container-warning.component.js +++ b/ui/app/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-warning/confirm-page-container-warning.component.js @@ -1,7 +1,7 @@ import React from 'react' import PropTypes from 'prop-types' -const ConfirmPageContainerWarning = props => { +const ConfirmPageContainerWarning = (props) => { return (
-
- - onEdit()} - > - { this.context.t('edit') } - -
+ { showAccountInHeader + ? ( +
+
+ +
+
+ { shortenAddress(accountAddress) } +
+ +
+ ) + : ( +
+ + onEdit()} + > + { t('edit') } + +
+ ) + } { !isFullScreen && }
- ) - } - - render () { - const { children } = this.props + { children } +
+ ) +} - return ( -
- { this.renderTop() } - { children } -
- ) - } +ConfirmPageContainerHeader.propTypes = { + accountAddress: PropTypes.string, + showAccountInHeader: PropTypes.bool, + showEdit: PropTypes.bool, + onEdit: PropTypes.func, + children: PropTypes.node, } diff --git a/ui/app/components/app/confirm-page-container/confirm-page-container-header/index.scss b/ui/app/components/app/confirm-page-container/confirm-page-container-header/index.scss index be77edbdf67e..fb24feb58be9 100644 --- a/ui/app/components/app/confirm-page-container/confirm-page-container-header/index.scss +++ b/ui/app/components/app/confirm-page-container/confirm-page-container-header/index.scss @@ -9,12 +9,17 @@ border-bottom: 1px solid $geyser; padding: 4px 13px 4px 13px; flex: 0 0 auto; + align-items: center; } &__back-button-container { display: flex; justify-content: center; align-items: center; + + [dir='rtl'] & img { + transform: rotate(180deg); + } } &__back-button { @@ -24,4 +29,16 @@ font-weight: 400; padding-left: 5px; } + + &__address-container { + display: flex; + align-items: center; + margin-top: 2px; + margin-bottom: 2px; + } + + &__address { + margin-left: 6px; + font-size: 14px; + } } diff --git a/ui/app/components/app/confirm-page-container/confirm-page-container-navigation/confirm-page-container-navigation.component.js b/ui/app/components/app/confirm-page-container/confirm-page-container-navigation/confirm-page-container-navigation.component.js index 8327f997bae1..0adc54fdb67a 100755 --- a/ui/app/components/app/confirm-page-container/confirm-page-container-navigation/confirm-page-container-navigation.component.js +++ b/ui/app/components/app/confirm-page-container/confirm-page-container-navigation/confirm-page-container-navigation.component.js @@ -1,27 +1,34 @@ import React from 'react' import PropTypes from 'prop-types' -const ConfirmPageContainerNavigation = props => { +const ConfirmPageContainerNavigation = (props) => { const { onNextTx, totalTx, positionOfCurrentTx, nextTxId, prevTxId, showNavigation, firstTx, lastTx, ofText, requestsWaitingText } = props return ( -
-
+ }} + >
onNextTx(firstTx)}> + data-testid="first-page" + onClick={() => onNextTx(firstTx)} + >
onNextTx(prevTxId)}> + data-testid="previous-page" + onClick={() => onNextTx(prevTxId)} + >
@@ -37,15 +44,20 @@ const ConfirmPageContainerNavigation = props => { className="confirm-page-container-navigation__container" style={{ visibility: nextTxId ? 'initial' : 'hidden', - }}> + }} + >
onNextTx(nextTxId)}> + data-testid="next-page" + onClick={() => onNextTx(nextTxId)} + >
onNextTx(lastTx)}> + data-testid="last-page" + onClick={() => onNextTx(lastTx)} + >
diff --git a/ui/app/components/app/confirm-page-container/confirm-page-container-navigation/index.scss b/ui/app/components/app/confirm-page-container/confirm-page-container-navigation/index.scss index 0cf184c60587..fe3106aa8d64 100755 --- a/ui/app/components/app/confirm-page-container/confirm-page-container-navigation/index.scss +++ b/ui/app/components/app/confirm-page-container/confirm-page-container-navigation/index.scss @@ -16,19 +16,19 @@ padding-left: 5px; padding-right: 5px; } - + &__arrow:hover { -webkit-transform: scale(1.1); - -moz-transform: scale(1.1); - -o-transform: scale(1.1); - transform: scale(1.1); + -moz-transform: scale(1.1); + -o-transform: scale(1.1); + transform: scale(1.1); } &__arrow:active { -webkit-transform: scale(0.95); - -moz-transform: scale(0.95); - -o-transform: scale(0.95); - transform: scale(0.95); + -moz-transform: scale(0.95); + -o-transform: scale(0.95); + transform: scale(0.95); } &__textcontainer { @@ -47,8 +47,8 @@ &__imageflip { -webkit-transform: scaleX(-1); - -moz-transform: scaleX(-1); - -o-transform: scaleX(-1); - transform: scaleX(-1); + -moz-transform: scaleX(-1); + -o-transform: scaleX(-1); + transform: scaleX(-1); } -} \ No newline at end of file +} diff --git a/ui/app/components/app/confirm-page-container/confirm-page-container.component.js b/ui/app/components/app/confirm-page-container/confirm-page-container.component.js index 326e4f83e673..baf75bbd3ae7 100644 --- a/ui/app/components/app/confirm-page-container/confirm-page-container.component.js +++ b/ui/app/components/app/confirm-page-container/confirm-page-container.component.js @@ -19,22 +19,19 @@ export default class ConfirmPageContainer extends Component { subtitleComponent: PropTypes.node, title: PropTypes.string, titleComponent: PropTypes.node, + hideSenderToRecipient: PropTypes.bool, + showAccountInHeader: PropTypes.bool, // Sender to Recipient fromAddress: PropTypes.string, fromName: PropTypes.string, toAddress: PropTypes.string, toName: PropTypes.string, + toEns: PropTypes.string, + toNickname: PropTypes.string, // Content contentComponent: PropTypes.node, errorKey: PropTypes.string, errorMessage: PropTypes.string, - fiatTransactionAmount: PropTypes.string, - fiatTransactionFee: PropTypes.string, - fiatTransactionTotal: PropTypes.string, - ethTransactionAmount: PropTypes.string, - ethTransactionFee: PropTypes.string, - ethTransactionTotal: PropTypes.string, - onEditGas: PropTypes.func, dataComponent: PropTypes.node, detailsComponent: PropTypes.node, identiconAddress: PropTypes.string, @@ -68,6 +65,8 @@ export default class ConfirmPageContainer extends Component { fromName, fromAddress, toName, + toEns, + toNickname, toAddress, disabled, errorKey, @@ -100,34 +99,45 @@ export default class ConfirmPageContainer extends Component { lastTx, ofText, requestsWaitingText, + hideSenderToRecipient, + showAccountInHeader, } = this.props const renderAssetImage = contentComponent || (!contentComponent && !identiconAddress) return (
onNextTx(txId)} - firstTx={firstTx} - lastTx={lastTx} - ofText={ofText} - requestsWaitingText={requestsWaitingText} + totalTx={totalTx} + positionOfCurrentTx={positionOfCurrentTx} + nextTxId={nextTxId} + prevTxId={prevTxId} + showNavigation={showNavigation} + onNextTx={(txId) => onNextTx(txId)} + firstTx={firstTx} + lastTx={lastTx} + ofText={ofText} + requestsWaitingText={requestsWaitingText} /> onEdit()} + showAccountInHeader={showAccountInHeader} + accountAddress={fromAddress} > - + { hideSenderToRecipient + ? null + : ( + + ) + } { contentComponent || ( @@ -147,23 +157,35 @@ export default class ConfirmPageContainer extends Component { nonce={nonce} assetImage={assetImage} warning={warning} + onCancelAll={onCancelAll} + onCancel={onCancel} + cancelText={this.context.t('reject')} + onSubmit={onSubmit} + submitText={this.context.t('confirm')} + disabled={disabled} + unapprovedTxCount={unapprovedTxCount} + rejectNText={this.context.t('rejectTxsN', [unapprovedTxCount])} /> ) } - onCancel()} - cancelText={this.context.t('reject')} - onSubmit={() => onSubmit()} - submitText={this.context.t('confirm')} - submitButtonType="confirm" - disabled={disabled} - > - {unapprovedTxCount > 1 && ( - onCancelAll()}> - {this.context.t('rejectTxsN', [unapprovedTxCount])} - - )} - + { + contentComponent && ( + + {unapprovedTxCount > 1 && ( + + {this.context.t('rejectTxsN', [unapprovedTxCount])} + + )} + + ) + }
) } diff --git a/ui/app/components/app/confirm-page-container/index.js b/ui/app/components/app/confirm-page-container/index.js index 28b17614e75f..62fc9cedc080 100644 --- a/ui/app/components/app/confirm-page-container/index.js +++ b/ui/app/components/app/confirm-page-container/index.js @@ -6,5 +6,4 @@ export { default as ConfirmPageContainerNavigation } from './confirm-page-contai export { default as ConfirmPageContainerContent, ConfirmPageContainerSummary, - ConfirmPageContainerError, } from './confirm-page-container-content' diff --git a/ui/app/components/app/confirm-page-container/index.scss b/ui/app/components/app/confirm-page-container/index.scss index c0277eff57e5..9723c2d2345d 100644 --- a/ui/app/components/app/confirm-page-container/index.scss +++ b/ui/app/components/app/confirm-page-container/index.scss @@ -1,7 +1,10 @@ @import 'confirm-page-container-content/index'; - @import 'confirm-page-container-header/index'; - @import 'confirm-detail-row/index'; - @import 'confirm-page-container-navigation/index'; + +.page-container { + &__content-component-wrapper { + height: 100%; + } +} diff --git a/ui/app/components/app/connected-accounts-list/connected-accounts-list-item/connected-accounts-list-item.component.js b/ui/app/components/app/connected-accounts-list/connected-accounts-list-item/connected-accounts-list-item.component.js new file mode 100644 index 000000000000..cfff63c1cb68 --- /dev/null +++ b/ui/app/components/app/connected-accounts-list/connected-accounts-list-item/connected-accounts-list-item.component.js @@ -0,0 +1,65 @@ +import classnames from 'classnames' +import PropTypes from 'prop-types' +import React, { PureComponent } from 'react' +import Identicon from '../../../ui/identicon' + +export default class ConnectedAccountsListItem extends PureComponent { + static contextTypes = { + t: PropTypes.func.isRequired, + } + + static propTypes = { + address: PropTypes.string.isRequired, + className: PropTypes.string, + name: PropTypes.node.isRequired, + status: PropTypes.string, + action: PropTypes.node, + options: PropTypes.node, + } + + static defaultProps = { + className: null, + options: null, + action: null, + } + + render () { + const { + address, + className, + name, + status, + action, + options, + } = this.props + + return ( +
+
+ +
+

+ {name} +

+ { + status + ? ( +

+    + {status} +

+ ) + : null + } + {action} +
+
+ {options} +
+ ) + } +} diff --git a/ui/app/components/app/connected-accounts-list/connected-accounts-list-item/index.js b/ui/app/components/app/connected-accounts-list/connected-accounts-list-item/index.js new file mode 100644 index 000000000000..3fb33c23eecd --- /dev/null +++ b/ui/app/components/app/connected-accounts-list/connected-accounts-list-item/index.js @@ -0,0 +1 @@ +export { default } from './connected-accounts-list-item.component' diff --git a/ui/app/components/app/connected-accounts-list/connected-accounts-list-options/connected-accounts-list-options.component.js b/ui/app/components/app/connected-accounts-list/connected-accounts-list-options/connected-accounts-list-options.component.js new file mode 100644 index 000000000000..0fcc2d8185b9 --- /dev/null +++ b/ui/app/components/app/connected-accounts-list/connected-accounts-list-options/connected-accounts-list-options.component.js @@ -0,0 +1,35 @@ +import PropTypes from 'prop-types' +import React, { useState } from 'react' +import { Menu } from '../../../ui/menu' + +const ConnectedAccountsListOptions = ({ children, onShowOptions, onHideOptions, show }) => { + const [optionsButtonElement, setOptionsButtonElement] = useState(null) + + return ( + <> + + ) + } +} diff --git a/ui/app/components/app/connected-status-indicator/connected-status-indicator.container.js b/ui/app/components/app/connected-status-indicator/connected-status-indicator.container.js new file mode 100644 index 000000000000..17034f32dbc8 --- /dev/null +++ b/ui/app/components/app/connected-status-indicator/connected-status-indicator.container.js @@ -0,0 +1,37 @@ +import { findKey } from 'lodash' +import { connect } from 'react-redux' +import { + STATUS_CONNECTED, + STATUS_CONNECTED_TO_ANOTHER_ACCOUNT, + STATUS_NOT_CONNECTED, +} from '../../../helpers/constants/connected-sites' +import { + getAddressConnectedDomainMap, + getOriginOfCurrentTab, + getSelectedAddress, +} from '../../../selectors' +import ConnectedStatusIndicator from './connected-status-indicator.component' + +const mapStateToProps = (state) => { + const selectedAddress = getSelectedAddress(state) + const addressConnectedDomainMap = getAddressConnectedDomainMap(state) + const originOfCurrentTab = getOriginOfCurrentTab(state) + + const selectedAddressDomainMap = addressConnectedDomainMap[selectedAddress] + const currentTabIsConnectedToSelectedAddress = Boolean(selectedAddressDomainMap && selectedAddressDomainMap[originOfCurrentTab]) + + let status + if (currentTabIsConnectedToSelectedAddress) { + status = STATUS_CONNECTED + } else if (findKey(addressConnectedDomainMap, originOfCurrentTab)) { + status = STATUS_CONNECTED_TO_ANOTHER_ACCOUNT + } else { + status = STATUS_NOT_CONNECTED + } + + return { + status, + } +} + +export default connect(mapStateToProps)(ConnectedStatusIndicator) diff --git a/ui/app/components/app/connected-status-indicator/index.js b/ui/app/components/app/connected-status-indicator/index.js new file mode 100644 index 000000000000..37679809bbfa --- /dev/null +++ b/ui/app/components/app/connected-status-indicator/index.js @@ -0,0 +1 @@ +export { default } from './connected-status-indicator.container' diff --git a/ui/app/components/app/connected-status-indicator/index.scss b/ui/app/components/app/connected-status-indicator/index.scss new file mode 100644 index 000000000000..6d9711c0b3aa --- /dev/null +++ b/ui/app/components/app/connected-status-indicator/index.scss @@ -0,0 +1,59 @@ +.connected-status-indicator { + display: flex; + align-items: center; + place-self: center start; + background: none; + font-size: inherit; + padding: 8px; + border-radius: 100px; + + &:hover { + background-color: #f2f3f4; + } + + &:active { + background-color: #ededed; + } + + &__inner-circle { + border-radius: 4px; + height: 4px; + width: 4px; + background-color: transparent; + } + + &__green-circle, + &__yellow-circle, + &__grey-circle { + border-radius: 4px; + height: 8px; + width: 8px; + border: 1px solid transparent; + display: flex; + align-items: center; + justify-content: center; + } + + &__green-circle { + border-color: #4cd964; + } + + &__green-circle &__inner-circle { + background-color: #4cd964; + } + + &__yellow-circle { + border-color: #ffd33d; + } + + &__grey-circle { + border-color: $Grey-500; + } + + &__text { + font-size: 10px; + color: $Grey-500; + margin-left: 6px; + white-space: nowrap; + } +} diff --git a/ui/app/components/app/contact-list/contact-list.component.js b/ui/app/components/app/contact-list/contact-list.component.js new file mode 100644 index 000000000000..0e151d23d124 --- /dev/null +++ b/ui/app/components/app/contact-list/contact-list.component.js @@ -0,0 +1,115 @@ +import React, { PureComponent } from 'react' +import PropTypes from 'prop-types' +import Button from '../../ui/button' +import RecipientGroup from './recipient-group/recipient-group.component' + +export default class ContactList extends PureComponent { + static propTypes = { + searchForContacts: PropTypes.func, + searchForRecents: PropTypes.func, + searchForMyAccounts: PropTypes.func, + selectRecipient: PropTypes.func, + children: PropTypes.node, + selectedAddress: PropTypes.string, + } + + static contextTypes = { + t: PropTypes.func, + } + + state = { + isShowingAllRecent: false, + } + + renderRecents () { + const { t } = this.context + const { isShowingAllRecent } = this.state + const nonContacts = this.props.searchForRecents() + + const showLoadMore = !isShowingAllRecent && nonContacts.length > 2 + + return ( +
+ + { + showLoadMore && ( + + ) + } +
+ ) + } + + renderAddressBook () { + const contacts = this.props.searchForContacts() + + const contactGroups = contacts.reduce((acc, contact) => { + const firstLetter = contact.name.slice(0, 1).toUpperCase() + acc[firstLetter] = acc[firstLetter] || [] + const bucket = acc[firstLetter] + bucket.push(contact) + return acc + }, {}) + + return Object + .entries(contactGroups) + .sort(([letter1], [letter2]) => { + if (letter1 > letter2) { + return 1 + } else if (letter1 === letter2) { + return 0 + } + return -1 + }) + .map(([letter, groupItems]) => ( + + )) + } + + renderMyAccounts () { + const myAccounts = this.props.searchForMyAccounts() + + return ( + + ) + } + + render () { + const { + children, + searchForRecents, + searchForContacts, + searchForMyAccounts, + } = this.props + + return ( +
+ { children || null } + { searchForRecents && this.renderRecents() } + { searchForContacts && this.renderAddressBook() } + { searchForMyAccounts && this.renderMyAccounts() } +
+ ) + } +} diff --git a/ui/app/components/app/contact-list/index.js b/ui/app/components/app/contact-list/index.js new file mode 100644 index 000000000000..d90c29b2b0fe --- /dev/null +++ b/ui/app/components/app/contact-list/index.js @@ -0,0 +1 @@ +export { default } from './contact-list.component' diff --git a/ui/app/components/app/contact-list/recipient-group/index.js b/ui/app/components/app/contact-list/recipient-group/index.js new file mode 100644 index 000000000000..7d827523f21c --- /dev/null +++ b/ui/app/components/app/contact-list/recipient-group/index.js @@ -0,0 +1 @@ +export { default } from './recipient-group.component' diff --git a/ui/app/components/app/contact-list/recipient-group/recipient-group.component.js b/ui/app/components/app/contact-list/recipient-group/recipient-group.component.js new file mode 100644 index 000000000000..9614b16a92bc --- /dev/null +++ b/ui/app/components/app/contact-list/recipient-group/recipient-group.component.js @@ -0,0 +1,61 @@ +import React from 'react' +import PropTypes from 'prop-types' +import classnames from 'classnames' +import Identicon from '../../../ui/identicon' +import { ellipsify } from '../../../../pages/send/send.utils' + +function addressesEqual (address1, address2) { + return String(address1).toLowerCase() === String(address2).toLowerCase() +} + +export default function RecipientGroup ({ label, items, onSelect, selectedAddress }) { + if (!items || !items.length) { + return null + } + + return ( +
+ {label && ( +
+ {label} +
+ )} + { + items.map(({ address, name }) => ( +
onSelect(address, name)} + className={classnames({ + 'send__select-recipient-wrapper__group-item': !addressesEqual(address, selectedAddress), + 'send__select-recipient-wrapper__group-item--selected': addressesEqual(address, selectedAddress), + })} + > + +
+
+ {name || ellipsify(address)} +
+ { + name && ( +
+ {ellipsify(address)} +
+ ) + } +
+
+ )) + } +
+ ) +} + +RecipientGroup.propTypes = { + label: PropTypes.string, + items: PropTypes.arrayOf(PropTypes.shape({ + address: PropTypes.string.isRequired, + name: PropTypes.string, + })), + onSelect: PropTypes.func.isRequired, + selectedAddress: PropTypes.string, +} diff --git a/ui/app/components/app/copyable.js b/ui/app/components/app/copyable.js deleted file mode 100644 index 6869d674d932..000000000000 --- a/ui/app/components/app/copyable.js +++ /dev/null @@ -1,53 +0,0 @@ -const Component = require('react').Component -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const inherits = require('util').inherits - -const Tooltip = require('../ui/tooltip') -const copyToClipboard = require('copy-to-clipboard') -const connect = require('react-redux').connect - -Copyable.contextTypes = { - t: PropTypes.func, -} - -module.exports = connect()(Copyable) - - -inherits(Copyable, Component) -function Copyable () { - Component.call(this) - this.state = { - copied: false, - } -} - -Copyable.prototype.render = function () { - const props = this.props - const state = this.state - const { value, children } = props - const { copied } = state - - return h(Tooltip, { - title: copied ? this.context.t('copiedExclamation') : this.context.t('copy'), - position: 'bottom', - }, h('span', { - style: { - cursor: 'pointer', - }, - onClick: (event) => { - event.preventDefault() - event.stopPropagation() - copyToClipboard(value) - this.debounceRestore() - }, - }, children)) -} - -Copyable.prototype.debounceRestore = function () { - this.setState({ copied: true }) - clearTimeout(this.timeout) - this.timeout = setTimeout(() => { - this.setState({ copied: false }) - }, 850) -} diff --git a/ui/app/components/app/customize-gas-modal/gas-modal-card.js b/ui/app/components/app/customize-gas-modal/gas-modal-card.js deleted file mode 100644 index 23754d819bd3..000000000000 --- a/ui/app/components/app/customize-gas-modal/gas-modal-card.js +++ /dev/null @@ -1,54 +0,0 @@ -const Component = require('react').Component -const h = require('react-hyperscript') -const inherits = require('util').inherits -const InputNumber = require('../input-number.js') -// const GasSlider = require('./gas-slider.js') - -module.exports = GasModalCard - -inherits(GasModalCard, Component) -function GasModalCard () { - Component.call(this) -} - -GasModalCard.prototype.render = function () { - const { - // memo, - onChange, - unitLabel, - value, - min, - // max, - step, - title, - copy, - } = this.props - - return h('div.send-v2__gas-modal-card', [ - - h('div.send-v2__gas-modal-card__title', {}, title), - - h('div.send-v2__gas-modal-card__copy', {}, copy), - - h(InputNumber, { - unitLabel, - step, - // max, - min, - placeholder: '0', - value, - onChange, - }), - - // h(GasSlider, { - // value, - // step, - // max, - // min, - // onChange, - // }), - - ]) - -} - diff --git a/ui/app/components/app/customize-gas-modal/gas-slider.js b/ui/app/components/app/customize-gas-modal/gas-slider.js deleted file mode 100644 index 69fd6f985610..000000000000 --- a/ui/app/components/app/customize-gas-modal/gas-slider.js +++ /dev/null @@ -1,50 +0,0 @@ -// const Component = require('react').Component -// const h = require('react-hyperscript') -// const inherits = require('util').inherits - -// module.exports = GasSlider - -// inherits(GasSlider, Component) -// function GasSlider () { -// Component.call(this) -// } - -// GasSlider.prototype.render = function () { -// const { -// memo, -// identities, -// onChange, -// unitLabel, -// value, -// id, -// step, -// max, -// min, -// } = this.props - -// return h('div.gas-slider', [ - -// h('input.gas-slider__input', { -// type: 'range', -// step, -// max, -// min, -// value, -// id: 'gasSlider', -// onChange: event => onChange(event.target.value), -// }, []), - -// h('div.gas-slider__bar', [ - -// h('div.gas-slider__low'), - -// h('div.gas-slider__mid'), - -// h('div.gas-slider__high'), - -// ]), - -// ]) - -// } - diff --git a/ui/app/components/app/customize-gas-modal/index.js b/ui/app/components/app/customize-gas-modal/index.js deleted file mode 100644 index 1f9436810742..000000000000 --- a/ui/app/components/app/customize-gas-modal/index.js +++ /dev/null @@ -1,396 +0,0 @@ -const Component = require('react').Component -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const inherits = require('util').inherits -const connect = require('react-redux').connect -const BigNumber = require('bignumber.js') -const actions = require('../../../store/actions') -const GasModalCard = require('./gas-modal-card') -import Button from '../../ui/button' - -const ethUtil = require('ethereumjs-util') - -import { - updateSendErrors, -} from '../../../ducks/send/send.duck' - -const { - MIN_GAS_PRICE_DEC, - MIN_GAS_LIMIT_DEC, - MIN_GAS_PRICE_GWEI, -} = require('../../../pages/send/send.constants') - -const { - isBalanceSufficient, -} = require('../../../pages/send/send.utils') - -const { - conversionUtil, - multiplyCurrencies, - conversionGreaterThan, - conversionMax, - subtractCurrencies, -} = require('../../../helpers/utils/conversion-util') - -const { - getGasIsLoading, - getForceGasMin, - conversionRateSelector, - getSendAmount, - getSelectedToken, - getSendFrom, - getCurrentAccountWithSendEtherInfo, - getSelectedTokenToFiatRate, - getSendMaxModeState, -} = require('../../../selectors/selectors') - -const { - getGasPrice, - getGasLimit, -} = require('../../../pages/send/send.selectors') - -function mapStateToProps (state) { - const selectedToken = getSelectedToken(state) - const currentAccount = getSendFrom(state) || getCurrentAccountWithSendEtherInfo(state) - const conversionRate = conversionRateSelector(state) - - return { - gasPrice: getGasPrice(state), - gasLimit: getGasLimit(state), - gasIsLoading: getGasIsLoading(state), - forceGasMin: getForceGasMin(state), - conversionRate, - amount: getSendAmount(state), - maxModeOn: getSendMaxModeState(state), - balance: currentAccount.balance, - primaryCurrency: selectedToken && selectedToken.symbol, - selectedToken, - amountConversionRate: selectedToken ? getSelectedTokenToFiatRate(state) : conversionRate, - } -} - -function mapDispatchToProps (dispatch) { - return { - hideModal: () => dispatch(actions.hideModal()), - setGasPrice: newGasPrice => dispatch(actions.setGasPrice(newGasPrice)), - setGasLimit: newGasLimit => dispatch(actions.setGasLimit(newGasLimit)), - setGasTotal: newGasTotal => dispatch(actions.setGasTotal(newGasTotal)), - updateSendAmount: newAmount => dispatch(actions.updateSendAmount(newAmount)), - updateSendErrors: error => dispatch(updateSendErrors(error)), - } -} - -function getFreshState (props) { - const gasPrice = props.gasPrice || MIN_GAS_PRICE_DEC - const gasLimit = props.gasLimit || MIN_GAS_LIMIT_DEC - - const gasTotal = multiplyCurrencies(gasLimit, gasPrice, { - toNumericBase: 'hex', - multiplicandBase: 16, - multiplierBase: 16, - }) - - return { - gasPrice, - gasLimit, - gasTotal, - error: null, - priceSigZeros: '', - priceSigDec: '', - } -} - -inherits(CustomizeGasModal, Component) -function CustomizeGasModal (props) { - Component.call(this) - - const originalState = getFreshState(props) - this.state = { - ...originalState, - originalState, - } -} - -CustomizeGasModal.contextTypes = { - t: PropTypes.func, - metricsEvent: PropTypes.func, -} - -module.exports = connect(mapStateToProps, mapDispatchToProps)(CustomizeGasModal) - -CustomizeGasModal.prototype.componentWillReceiveProps = function (nextProps) { - const currentState = getFreshState(this.props) - const { - gasPrice: currentGasPrice, - gasLimit: currentGasLimit, - } = currentState - const newState = getFreshState(nextProps) - const { - gasPrice: newGasPrice, - gasLimit: newGasLimit, - gasTotal: newGasTotal, - } = newState - const gasPriceChanged = currentGasPrice !== newGasPrice - const gasLimitChanged = currentGasLimit !== newGasLimit - - if (gasPriceChanged) { - this.setState({ - gasPrice: newGasPrice, - gasTotal: newGasTotal, - priceSigZeros: '', - priceSigDec: '', - }) - } - if (gasLimitChanged) { - this.setState({ gasLimit: newGasLimit, gasTotal: newGasTotal }) - } - if (gasLimitChanged || gasPriceChanged) { - this.validate({ gasLimit: newGasLimit, gasTotal: newGasTotal }) - } -} - -CustomizeGasModal.prototype.save = function (gasPrice, gasLimit, gasTotal) { - const { metricsEvent } = this.context - const { - setGasPrice, - setGasLimit, - hideModal, - setGasTotal, - maxModeOn, - selectedToken, - balance, - updateSendAmount, - updateSendErrors, - } = this.props - const { - originalState, - } = this.state - - if (maxModeOn && !selectedToken) { - const maxAmount = subtractCurrencies( - ethUtil.addHexPrefix(balance), - ethUtil.addHexPrefix(gasTotal), - { toNumericBase: 'hex' } - ) - updateSendAmount(maxAmount) - } - - metricsEvent({ - eventOpts: { - category: 'Activation', - action: 'userCloses', - name: 'closeCustomizeGas', - }, - pageOpts: { - section: 'customizeGasModal', - component: 'customizeGasSaveButton', - }, - customVariables: { - gasPriceChange: (new BigNumber(ethUtil.addHexPrefix(gasPrice))).minus(new BigNumber(ethUtil.addHexPrefix(originalState.gasPrice))).toString(10), - gasLimitChange: (new BigNumber(ethUtil.addHexPrefix(gasLimit))).minus(new BigNumber(ethUtil.addHexPrefix(originalState.gasLimit))).toString(10), - }, - }) - - setGasPrice(ethUtil.addHexPrefix(gasPrice)) - setGasLimit(ethUtil.addHexPrefix(gasLimit)) - setGasTotal(ethUtil.addHexPrefix(gasTotal)) - updateSendErrors({ insufficientFunds: false }) - hideModal() -} - -CustomizeGasModal.prototype.revert = function () { - this.setState(this.state.originalState) -} - -CustomizeGasModal.prototype.validate = function ({ gasTotal, gasLimit }) { - const { - amount, - balance, - selectedToken, - amountConversionRate, - conversionRate, - maxModeOn, - } = this.props - - let error = null - - const balanceIsSufficient = isBalanceSufficient({ - amount: selectedToken || maxModeOn ? '0' : amount, - gasTotal, - balance, - selectedToken, - amountConversionRate, - conversionRate, - }) - - if (!balanceIsSufficient) { - error = this.context.t('balanceIsInsufficientGas') - } - - const gasLimitTooLow = gasLimit && conversionGreaterThan( - { - value: MIN_GAS_LIMIT_DEC, - fromNumericBase: 'dec', - conversionRate, - }, - { - value: gasLimit, - fromNumericBase: 'hex', - }, - ) - - if (gasLimitTooLow) { - error = this.context.t('gasLimitTooLow') - } - - this.setState({ error }) - return error -} - -CustomizeGasModal.prototype.convertAndSetGasLimit = function (newGasLimit) { - const { gasPrice } = this.state - - const gasLimit = conversionUtil(newGasLimit, { - fromNumericBase: 'dec', - toNumericBase: 'hex', - }) - - const gasTotal = multiplyCurrencies(gasLimit, gasPrice, { - toNumericBase: 'hex', - multiplicandBase: 16, - multiplierBase: 16, - }) - - this.validate({ gasTotal, gasLimit }) - - this.setState({ gasTotal, gasLimit }) -} - -CustomizeGasModal.prototype.convertAndSetGasPrice = function (newGasPrice) { - const { gasLimit } = this.state - const sigZeros = String(newGasPrice).match(/^\d+[.]\d*?(0+)$/) - const sigDec = String(newGasPrice).match(/^\d+([.])0*$/) - - this.setState({ - priceSigZeros: sigZeros && sigZeros[1] || '', - priceSigDec: sigDec && sigDec[1] || '', - }) - - const gasPrice = conversionUtil(newGasPrice, { - fromNumericBase: 'dec', - toNumericBase: 'hex', - fromDenomination: 'GWEI', - toDenomination: 'WEI', - }) - - const gasTotal = multiplyCurrencies(gasLimit, gasPrice, { - toNumericBase: 'hex', - multiplicandBase: 16, - multiplierBase: 16, - }) - - this.validate({ gasTotal }) - - this.setState({ gasTotal, gasPrice }) -} - -CustomizeGasModal.prototype.render = function () { - const { hideModal, forceGasMin, gasIsLoading } = this.props - const { gasPrice, gasLimit, gasTotal, error, priceSigZeros, priceSigDec } = this.state - - let convertedGasPrice = conversionUtil(gasPrice, { - fromNumericBase: 'hex', - toNumericBase: 'dec', - fromDenomination: 'WEI', - toDenomination: 'GWEI', - }) - - convertedGasPrice += convertedGasPrice.match(/[.]/) ? priceSigZeros : `${priceSigDec}${priceSigZeros}` - - let newGasPrice = gasPrice - if (forceGasMin) { - const convertedMinPrice = conversionUtil(forceGasMin, { - fromNumericBase: 'hex', - toNumericBase: 'dec', - }) - convertedGasPrice = conversionMax( - { value: convertedMinPrice, fromNumericBase: 'dec' }, - { value: convertedGasPrice, fromNumericBase: 'dec' } - ) - newGasPrice = conversionMax( - { value: gasPrice, fromNumericBase: 'hex' }, - { value: forceGasMin, fromNumericBase: 'hex' } - ) - } - - const convertedGasLimit = conversionUtil(gasLimit, { - fromNumericBase: 'hex', - toNumericBase: 'dec', - }) - - return !gasIsLoading && h('div.send-v2__customize-gas', {}, [ - h('div.send-v2__customize-gas__content', { - }, [ - h('div.send-v2__customize-gas__header', {}, [ - - h('div.send-v2__customize-gas__title', this.context.t('customGas')), - - h('div.send-v2__customize-gas__close', { - onClick: hideModal, - }), - - ]), - - h('div.send-v2__customize-gas__body', {}, [ - - h(GasModalCard, { - value: convertedGasPrice, - min: forceGasMin || MIN_GAS_PRICE_GWEI, - step: 1, - onChange: value => this.convertAndSetGasPrice(value), - title: this.context.t('gasPrice'), - copy: this.context.t('gasPriceCalculation'), - gasIsLoading, - }), - - h(GasModalCard, { - value: convertedGasLimit, - min: 1, - step: 1, - onChange: value => this.convertAndSetGasLimit(value), - title: this.context.t('gasLimit'), - copy: this.context.t('gasLimitCalculation'), - gasIsLoading, - }), - - ]), - - h('div.send-v2__customize-gas__footer', {}, [ - - error && h('div.send-v2__customize-gas__error-message', [ - error, - ]), - - h('div.send-v2__customize-gas__revert', { - onClick: () => this.revert(), - }, [this.context.t('revert')]), - - h('div.send-v2__customize-gas__buttons', [ - h(Button, { - type: 'default', - className: 'send-v2__customize-gas__cancel', - onClick: this.props.hideModal, - }, [this.context.t('cancel')]), - h(Button, { - type: 'secondary', - className: 'send-v2__customize-gas__save', - onClick: () => !error && this.save(newGasPrice, gasLimit, gasTotal), - disabled: error, - }, [this.context.t('save')]), - ]), - - ]), - - ]), - ]) -} diff --git a/ui/app/components/app/dropdowns/account-details-dropdown.js b/ui/app/components/app/dropdowns/account-details-dropdown.js deleted file mode 100644 index a4c33620a0aa..000000000000 --- a/ui/app/components/app/dropdowns/account-details-dropdown.js +++ /dev/null @@ -1,139 +0,0 @@ -const Component = require('react').Component -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const inherits = require('util').inherits -const connect = require('react-redux').connect -const actions = require('../../../store/actions') -const { getSelectedIdentity, getRpcPrefsForCurrentProvider } = require('../../../selectors/selectors') -const genAccountLink = require('../../../../lib/account-link.js') -const { Menu, Item, CloseArea } = require('./components/menu') - -AccountDetailsDropdown.contextTypes = { - t: PropTypes.func, - metricsEvent: PropTypes.func, -} - -module.exports = connect(mapStateToProps, mapDispatchToProps)(AccountDetailsDropdown) - -function mapStateToProps (state) { - return { - selectedIdentity: getSelectedIdentity(state), - network: state.metamask.network, - keyrings: state.metamask.keyrings, - rpcPrefs: getRpcPrefsForCurrentProvider(state), - } -} - -function mapDispatchToProps (dispatch) { - return { - showAccountDetailModal: () => { - dispatch(actions.showModal({ name: 'ACCOUNT_DETAILS' })) - }, - viewOnEtherscan: (address, network, rpcPrefs) => { - global.platform.openWindow({ url: genAccountLink(address, network, rpcPrefs) }) - }, - showRemoveAccountConfirmationModal: (identity) => { - return dispatch(actions.showModal({ name: 'CONFIRM_REMOVE_ACCOUNT', identity })) - }, - } -} - -inherits(AccountDetailsDropdown, Component) -function AccountDetailsDropdown () { - Component.call(this) - - this.onClose = this.onClose.bind(this) -} - -AccountDetailsDropdown.prototype.onClose = function (e) { - e.stopPropagation() - this.props.onClose() -} - -AccountDetailsDropdown.prototype.render = function () { - const { - selectedIdentity, - network, - keyrings, - showAccountDetailModal, - viewOnEtherscan, - showRemoveAccountConfirmationModal, - rpcPrefs, - } = this.props - - const address = selectedIdentity.address - - const keyring = keyrings.find((kr) => { - return kr.accounts.includes(address) - }) - - const isRemovable = keyring.type !== 'HD Key Tree' - - return h(Menu, { className: 'account-details-dropdown', isShowing: true }, [ - h(CloseArea, { - onClick: this.onClose, - }), - h(Item, { - onClick: (e) => { - e.stopPropagation() - this.context.metricsEvent({ - eventOpts: { - category: 'Navigation', - action: 'Account Options', - name: 'Clicked Expand View', - }, - }) - global.platform.openExtensionInBrowser() - this.props.onClose() - }, - text: this.context.t('expandView'), - icon: h(`img`, { src: 'images/expand.svg', style: { height: '15px' } }), - }), - h(Item, { - onClick: (e) => { - e.stopPropagation() - showAccountDetailModal() - this.context.metricsEvent({ - eventOpts: { - category: 'Navigation', - action: 'Account Options', - name: 'Viewed Account Details', - }, - }) - this.props.onClose() - }, - text: this.context.t('accountDetails'), - icon: h(`img`, { src: 'images/info.svg', style: { height: '15px' } }), - }), - h(Item, { - onClick: (e) => { - e.stopPropagation() - this.context.metricsEvent({ - eventOpts: { - category: 'Navigation', - action: 'Account Options', - name: 'Clicked View on Etherscan', - }, - }) - viewOnEtherscan(address, network, rpcPrefs) - this.props.onClose() - }, - text: (rpcPrefs.blockExplorerUrl - ? this.context.t('viewinExplorer') - : this.context.t('viewOnEtherscan')), - subText: (rpcPrefs.blockExplorerUrl - ? rpcPrefs.blockExplorerUrl.match(/^https?:\/\/(.+)/)[1] - : null), - icon: h(`img`, { src: 'images/open-etherscan.svg', style: { height: '15px' } }), - }), - isRemovable ? h(Item, { - onClick: (e) => { - e.stopPropagation() - showRemoveAccountConfirmationModal(selectedIdentity) - this.props.onClose() - }, - text: this.context.t('removeAccount'), - icon: h(`img`, { src: 'images/hide.svg', style: { height: '15px' } }), - }) : null, - ]) -} diff --git a/ui/app/components/app/dropdowns/components/dropdown.js b/ui/app/components/app/dropdowns/components/dropdown.js index 149f063a73b9..b0b9cac9957b 100644 --- a/ui/app/components/app/dropdowns/components/dropdown.js +++ b/ui/app/components/app/dropdowns/components/dropdown.js @@ -1,12 +1,8 @@ -const Component = require('react').Component -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const MenuDroppo = require('../../menu-droppo') -const extend = require('xtend') +import React, { Component } from 'react' +import PropTypes from 'prop-types' +import MenuDroppo from '../../menu-droppo' -const noop = () => {} - -class Dropdown extends Component { +export class Dropdown extends Component { render () { const { containerClassName, @@ -18,51 +14,45 @@ class Dropdown extends Component { useCssTransition, } = this.props - const innerStyleDefaults = extend({ + const innerStyleDefaults = { borderRadius: '4px', padding: '8px 16px', background: 'rgba(0, 0, 0, 0.8)', - boxShadow: 'rgba(0, 0, 0, 0.15) 0px 2px 2px 2px', - }, innerStyle) + boxShadow: 'rgba(0, 0, 0, 0.15) 0px 2px 2px 2px', ...innerStyle, + } - return h( - MenuDroppo, - { - containerClassName, - useCssTransition, - isOpen, - zIndex: 55, - onClickOutside, - style, - innerStyle: innerStyleDefaults, - }, - [ - h( - 'style', - ` - li.dropdown-menu-item:hover { - color:rgb(225, 225, 225); - background-color: rgba(255, 255, 255, 0.05); - border-radius: 4px; - } - li.dropdown-menu-item { color: rgb(185, 185, 185); } - ` - ), - ...children, - ] + return ( + + + { children } + ) } } Dropdown.defaultProps = { - isOpen: false, - onClick: noop, useCssTransition: false, } Dropdown.propTypes = { isOpen: PropTypes.bool.isRequired, - onClick: PropTypes.func.isRequired, children: PropTypes.node, style: PropTypes.object.isRequired, onClickOutside: PropTypes.func, @@ -71,18 +61,18 @@ Dropdown.propTypes = { containerClassName: PropTypes.string, } -class DropdownMenuItem extends Component { +export class DropdownMenuItem extends Component { render () { const { onClick, closeMenu, children, style } = this.props - return h( - 'li.dropdown-menu-item', - { - onClick: () => { + return ( +
  • { onClick() closeMenu() - }, - style: Object.assign({ + }} + style={({ listStyle: 'none', padding: '8px 0px', fontSize: '18px', @@ -91,10 +81,11 @@ class DropdownMenuItem extends Component { display: 'flex', justifyContent: 'flex-start', alignItems: 'center', - color: 'white', - }, style), - }, - children + color: 'white', ...style, + })} + > + {children} +
  • ) } } @@ -105,8 +96,3 @@ DropdownMenuItem.propTypes = { children: PropTypes.node, style: PropTypes.object, } - -module.exports = { - Dropdown, - DropdownMenuItem, -} diff --git a/ui/app/components/app/dropdowns/components/menu.js b/ui/app/components/app/dropdowns/components/menu.js deleted file mode 100644 index 63501eaa964d..000000000000 --- a/ui/app/components/app/dropdowns/components/menu.js +++ /dev/null @@ -1,53 +0,0 @@ -const inherits = require('util').inherits -const Component = require('react').Component -const h = require('react-hyperscript') - -inherits(Menu, Component) -function Menu () { Component.call(this) } - -Menu.prototype.render = function () { - const { className = '', children, isShowing } = this.props - return isShowing - ? h('div', { className: `menu ${className}` }, children) - : h('noscript') -} - -inherits(Item, Component) -function Item () { Component.call(this) } - -Item.prototype.render = function () { - const { - icon, - children, - text, - subText, - className = '', - onClick, - } = this.props - const itemClassName = `menu__item ${className} ${onClick ? 'menu__item--clickable' : ''}` - const iconComponent = icon ? h('div.menu__item__icon', [icon]) : null - const textComponent = text ? h('div.menu__item__text', text) : null - const subTextComponent = subText ? h('div.menu__item__subtext', subText) : null - - return children - ? h('div', { className: itemClassName, onClick }, children) - : h('div.menu__item', { className: itemClassName, onClick }, [ iconComponent, textComponent, subTextComponent ] - .filter(d => Boolean(d)) - ) -} - -inherits(Divider, Component) -function Divider () { Component.call(this) } - -Divider.prototype.render = function () { - return h('div.menu__divider') -} - -inherits(CloseArea, Component) -function CloseArea () { Component.call(this) } - -CloseArea.prototype.render = function () { - return h('div.menu__close-area', { onClick: this.props.onClick }) -} - -module.exports = { Menu, Item, Divider, CloseArea } diff --git a/ui/app/components/app/dropdowns/components/network-dropdown-icon.js b/ui/app/components/app/dropdowns/components/network-dropdown-icon.js index d4a2c2ff73e5..d152120019c5 100644 --- a/ui/app/components/app/dropdowns/components/network-dropdown-icon.js +++ b/ui/app/components/app/dropdowns/components/network-dropdown-icon.js @@ -1,47 +1,56 @@ -const inherits = require('util').inherits -const Component = require('react').Component -const h = require('react-hyperscript') +import PropTypes from 'prop-types' +import React from 'react' - -inherits(NetworkDropdownIcon, Component) -module.exports = NetworkDropdownIcon - -function NetworkDropdownIcon () { - Component.call(this) -} - -NetworkDropdownIcon.prototype.render = function () { +function NetworkDropdownIcon (props) { const { backgroundColor, isSelected, - innerBorder = 'none', - diameter = '12', + innerBorder, + diameter, loading, - } = this.props + } = props return loading - ? h('span.pointer.network-indicator', { - style: { - display: 'flex', - alignItems: 'center', - flexDirection: 'row', - }, - }, [ - h('img', { - style: { - width: '27px', - }, - src: 'images/loading.svg', - }), - ]) - : h(`.menu-icon-circle${isSelected ? '--active' : ''}`, {}, - h('div', { - style: { - background: backgroundColor, - border: innerBorder, - height: `${diameter}px`, - width: `${diameter}px`, - }, - }) + ? ( + + + + ) + : ( +
    +
    +
    ) } + +NetworkDropdownIcon.defaultProps = { + backgroundColor: undefined, + loading: false, + innerBorder: 'none', + diameter: '12', + isSelected: false, +} + +NetworkDropdownIcon.propTypes = { + backgroundColor: PropTypes.string, + loading: PropTypes.bool, + innerBorder: PropTypes.string, + diameter: PropTypes.string, + isSelected: PropTypes.bool, +} + +export default NetworkDropdownIcon diff --git a/ui/app/components/app/dropdowns/index.js b/ui/app/components/app/dropdowns/index.js deleted file mode 100644 index 6055070581ed..000000000000 --- a/ui/app/components/app/dropdowns/index.js +++ /dev/null @@ -1,11 +0,0 @@ -// Reusable Dropdown Components -// TODO: Refactor into separate components -const Dropdown = require('./components/dropdown').Dropdown - -// App-Specific Instances -const NetworkDropdown = require('./network-dropdown').default - -module.exports = { - NetworkDropdown, - Dropdown, -} diff --git a/ui/app/components/app/dropdowns/network-dropdown.js b/ui/app/components/app/dropdowns/network-dropdown.js index 378ad3ba6d02..16b645858f55 100644 --- a/ui/app/components/app/dropdowns/network-dropdown.js +++ b/ui/app/components/app/dropdowns/network-dropdown.js @@ -1,16 +1,12 @@ -const Component = require('react').Component -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const inherits = require('util').inherits -const connect = require('react-redux').connect -const { withRouter } = require('react-router-dom') -const { compose } = require('recompose') -const actions = require('../../../store/actions') -const Dropdown = require('./components/dropdown').Dropdown -const DropdownMenuItem = require('./components/dropdown').DropdownMenuItem -const NetworkDropdownIcon = require('./components/network-dropdown-icon') -const R = require('ramda') -const { NETWORKS_ROUTE } = require('../../../helpers/constants/routes') +import PropTypes from 'prop-types' +import React, { Component } from 'react' +import { connect } from 'react-redux' +import { withRouter } from 'react-router-dom' +import { compose } from 'redux' +import * as actions from '../../../store/actions' +import { NETWORKS_ROUTE } from '../../../helpers/constants/routes' +import { Dropdown, DropdownMenuItem } from './components/dropdown' +import NetworkDropdownIcon from './components/network-dropdown-icon' // classes from nodes of the toggle element. const notToggleElementClassnames = [ @@ -32,377 +28,393 @@ function mapStateToProps (state) { function mapDispatchToProps (dispatch) { return { - hideModal: () => { - dispatch(actions.hideModal()) - }, setProviderType: (type) => { dispatch(actions.setProviderType(type)) }, - setDefaultRpcTarget: type => { - dispatch(actions.setDefaultRpcTarget(type)) - }, setRpcTarget: (target, network, ticker, nickname) => { dispatch(actions.setRpcTarget(target, network, ticker, nickname)) }, delRpcTarget: (target) => { dispatch(actions.delRpcTarget(target)) }, - showNetworkDropdown: () => dispatch(actions.showNetworkDropdown()), hideNetworkDropdown: () => dispatch(actions.hideNetworkDropdown()), - setNetworksTabAddMode: isInAddMode => dispatch(actions.setNetworksTabAddMode(isInAddMode)), + setNetworksTabAddMode: (isInAddMode) => dispatch(actions.setNetworksTabAddMode(isInAddMode)), } } - -inherits(NetworkDropdown, Component) -function NetworkDropdown () { - Component.call(this) -} - -NetworkDropdown.contextTypes = { - t: PropTypes.func, - metricsEvent: PropTypes.func, -} - -module.exports = compose( - withRouter, - connect(mapStateToProps, mapDispatchToProps) -)(NetworkDropdown) - - -// TODO: specify default props and proptypes -NetworkDropdown.prototype.render = function () { - const props = this.props - const { provider: { type: providerType, rpcTarget: activeNetwork }, setNetworksTabAddMode } = props - const rpcListDetail = props.frequentRpcListDetail - const isOpen = this.props.networkDropdownOpen - const dropdownMenuItemStyle = { - fontSize: '16px', - lineHeight: '20px', - padding: '12px 0', +class NetworkDropdown extends Component { + static contextTypes = { + t: PropTypes.func, + metricsEvent: PropTypes.func, } - return h(Dropdown, { - isOpen, - onClickOutside: (event) => { - const { classList } = event.target - const isInClassList = className => classList.contains(className) - const notToggleElementIndex = R.findIndex(isInClassList)(notToggleElementClassnames) - - if (notToggleElementIndex === -1) { - this.props.hideNetworkDropdown() - } - }, - containerClassName: 'network-droppo', - zIndex: 55, - style: { - position: 'absolute', - top: '58px', - width: '309px', - zIndex: '55px', - }, - innerStyle: { - padding: '18px 8px', - }, - }, [ - - h('div.network-dropdown-header', {}, [ - h('div.network-dropdown-title', {}, this.context.t('networks')), - - h('div.network-dropdown-divider'), - - h('div.network-dropdown-content', - {}, - this.context.t('defaultNetwork') - ), - ]), - - h( - DropdownMenuItem, - { - key: 'main', - closeMenu: () => this.props.hideNetworkDropdown(), - onClick: () => this.handleClick('mainnet'), - style: { ...dropdownMenuItemStyle, borderColor: '#038789' }, - }, - [ - providerType === 'mainnet' ? h('i.fa.fa-check') : h('.network-check__transparent', '✓'), - h(NetworkDropdownIcon, { - backgroundColor: '#29B6AF', // $java - isSelected: providerType === 'mainnet', - }), - h('span.network-name-item', { - style: { - color: providerType === 'mainnet' ? '#ffffff' : '#9b9b9b', - }, - }, this.context.t('mainnet')), - ] - ), - - h( - DropdownMenuItem, - { - key: 'ropsten', - closeMenu: () => this.props.hideNetworkDropdown(), - onClick: () => this.handleClick('ropsten'), - style: dropdownMenuItemStyle, - }, - [ - providerType === 'ropsten' ? h('i.fa.fa-check') : h('.network-check__transparent', '✓'), - h(NetworkDropdownIcon, { - backgroundColor: '#ff4a8d', // $wild-strawberry - isSelected: providerType === 'ropsten', - }), - h('span.network-name-item', { - style: { - color: providerType === 'ropsten' ? '#ffffff' : '#9b9b9b', - }, - }, this.context.t('ropsten')), - ] - ), - - h( - DropdownMenuItem, - { - key: 'kovan', - closeMenu: () => this.props.hideNetworkDropdown(), - onClick: () => this.handleClick('kovan'), - style: dropdownMenuItemStyle, - }, - [ - providerType === 'kovan' ? h('i.fa.fa-check') : h('.network-check__transparent', '✓'), - h(NetworkDropdownIcon, { - backgroundColor: '#7057ff', // $cornflower-blue - isSelected: providerType === 'kovan', - }), - h('span.network-name-item', { - style: { - color: providerType === 'kovan' ? '#ffffff' : '#9b9b9b', - }, - }, this.context.t('kovan')), - ] - ), - - h( - DropdownMenuItem, - { - key: 'rinkeby', - closeMenu: () => this.props.hideNetworkDropdown(), - onClick: () => this.handleClick('rinkeby'), - style: dropdownMenuItemStyle, - }, - [ - providerType === 'rinkeby' ? h('i.fa.fa-check') : h('.network-check__transparent', '✓'), - h(NetworkDropdownIcon, { - backgroundColor: '#f6c343', // $saffron - isSelected: providerType === 'rinkeby', - }), - h('span.network-name-item', { - style: { - color: providerType === 'rinkeby' ? '#ffffff' : '#9b9b9b', - }, - }, this.context.t('rinkeby')), - ] - ), + static propTypes = { + provider: PropTypes.shape({ + nickname: PropTypes.string, + rpcTarget: PropTypes.string, + type: PropTypes.string, + ticker: PropTypes.string, + }).isRequired, + setProviderType: PropTypes.func.isRequired, + network: PropTypes.string.isRequired, + setRpcTarget: PropTypes.func.isRequired, + hideNetworkDropdown: PropTypes.func.isRequired, + setNetworksTabAddMode: PropTypes.func.isRequired, + frequentRpcListDetail: PropTypes.array.isRequired, + networkDropdownOpen: PropTypes.bool.isRequired, + history: PropTypes.object.isRequired, + delRpcTarget: PropTypes.func.isRequired, + } - h( - DropdownMenuItem, - { - key: 'goerli', - closeMenu: () => this.props.hideNetworkDropdown(), - onClick: () => this.handleClick('goerli'), - style: dropdownMenuItemStyle, - }, - [ - providerType === 'goerli' ? h('i.fa.fa-check') : h('.network-check__transparent', '✓'), - h(NetworkDropdownIcon, { - backgroundColor: '#3099f2', // $dodger-blue - isSelected: providerType === 'goerli', - }), - h('span.network-name-item', { - style: { - color: providerType === 'goerli' ? '#ffffff' : '#9b9b9b', - }, - }, this.context.t('goerli')), - ] - ), + handleClick (newProviderType) { + const { provider: { type: providerType }, setProviderType } = this.props + const { metricsEvent } = this.context - h( - DropdownMenuItem, - { - key: 'default', - closeMenu: () => this.props.hideNetworkDropdown(), - onClick: () => this.handleClick('localhost'), - style: dropdownMenuItemStyle, + metricsEvent({ + eventOpts: { + category: 'Navigation', + action: 'Home', + name: 'Switched Networks', }, - [ - providerType === 'localhost' ? h('i.fa.fa-check') : h('.network-check__transparent', '✓'), - h(NetworkDropdownIcon, { - isSelected: providerType === 'localhost', - innerBorder: '1px solid #9b9b9b', - }), - h('span.network-name-item', { - style: { - color: providerType === 'localhost' ? '#ffffff' : '#9b9b9b', - }, - }, this.context.t('localhost')), - ] - ), - - this.renderCustomOption(props.provider), - this.renderCommonRpc(rpcListDetail, props.provider), - - h( - DropdownMenuItem, - { - closeMenu: () => this.props.hideNetworkDropdown(), - onClick: () => { - setNetworksTabAddMode(true) - this.props.history.push(NETWORKS_ROUTE) - }, - style: dropdownMenuItemStyle, + customVariables: { + fromNetwork: providerType, + toNetwork: newProviderType, }, - [ - activeNetwork === 'custom' ? h('i.fa.fa-check') : h('.network-check__transparent', '✓'), - h(NetworkDropdownIcon, { - isSelected: activeNetwork === 'custom', - innerBorder: '1px solid #9b9b9b', - }), - h('span.network-name-item', { - style: { - color: activeNetwork === 'custom' ? '#ffffff' : '#9b9b9b', - }, - }, this.context.t('customRPC')), - ] - ), - - ]) -} - -NetworkDropdown.prototype.handleClick = function (newProviderType) { - const { provider: { type: providerType }, setProviderType } = this.props - const { metricsEvent } = this.context - - metricsEvent({ - eventOpts: { - category: 'Navigation', - action: 'Home', - name: 'Switched Networks', - }, - customVariables: { - fromNetwork: providerType, - toNetwork: newProviderType, - }, - }) - setProviderType(newProviderType) -} + }) + setProviderType(newProviderType) + } -NetworkDropdown.prototype.getNetworkName = function () { - const { provider } = this.props - const providerName = provider.type + renderCustomOption (provider) { + const { rpcTarget, type, ticker, nickname } = provider + const { network } = this.props - let name + if (type !== 'rpc') { + return null + } - if (providerName === 'mainnet') { - name = this.context.t('mainnet') - } else if (providerName === 'ropsten') { - name = this.context.t('ropsten') - } else if (providerName === 'kovan') { - name = this.context.t('kovan') - } else if (providerName === 'rinkeby') { - name = this.context.t('rinkeby') - } else if (providerName === 'localhost') { - name = this.context.t('localhost') - } else if (providerName === 'goerli') { - name = this.context.t('goerli') - } else { - name = provider.nickname || this.context.t('unknownNetwork') + switch (rpcTarget) { + + case 'http://localhost:8545': + return null + + default: + return ( + this.props.setRpcTarget(rpcTarget, network, ticker, nickname)} + closeMenu={() => this.props.hideNetworkDropdown()} + style={{ + fontSize: '16px', + lineHeight: '20px', + padding: '12px 0', + }} + > + + + + {nickname || rpcTarget} + + + ) + } } - return name -} - -NetworkDropdown.prototype.renderCommonRpc = function (rpcListDetail, provider) { - const props = this.props - const reversedRpcListDetail = rpcListDetail.slice().reverse() + renderCommonRpc (rpcListDetail, provider) { + const reversedRpcListDetail = rpcListDetail.slice().reverse() - return reversedRpcListDetail.map((entry) => { - const rpc = entry.rpcUrl - const ticker = entry.ticker || 'ETH' - const nickname = entry.nickname || '' - const currentRpcTarget = provider.type === 'rpc' && rpc === provider.rpcTarget + return reversedRpcListDetail.map((entry) => { + const rpc = entry.rpcUrl + const ticker = entry.ticker || 'ETH' + const nickname = entry.nickname || '' + const currentRpcTarget = provider.type === 'rpc' && rpc === provider.rpcTarget - if ((rpc === 'http://localhost:8545') || currentRpcTarget) { - return null - } else { - const chainId = entry.chainId - return h( - DropdownMenuItem, - { - key: `common${rpc}`, - closeMenu: () => this.props.hideNetworkDropdown(), - onClick: () => props.setRpcTarget(rpc, chainId, ticker, nickname), - style: { + if ((rpc === 'http://localhost:8545') || currentRpcTarget) { + return null + } + const { chainId } = entry + return ( + this.props.hideNetworkDropdown()} + onClick={() => this.props.setRpcTarget(rpc, chainId, ticker, nickname)} + style={{ fontSize: '16px', lineHeight: '20px', padding: '12px 0', - }, - }, - [ - currentRpcTarget ? h('i.fa.fa-check') : h('.network-check__transparent', '✓'), - h('i.fa.fa-question-circle.fa-med.menu-icon-circle'), - h('span.network-name-item', { - style: { - color: currentRpcTarget ? '#ffffff' : '#9b9b9b', - }, - }, nickname || rpc), - h('i.fa.fa-times.delete', + }} + > { - onClick: (e) => { + currentRpcTarget + ? + :
    ✓
    + } + + + {nickname || rpc} + + { e.stopPropagation() - props.delRpcTarget(rpc) - }, - }), - ] + this.props.delRpcTarget(rpc) + }} + /> +
    ) - } - }) -} - -NetworkDropdown.prototype.renderCustomOption = function (provider) { - const { rpcTarget, type, ticker, nickname } = provider - const props = this.props - const network = props.network + }) + } - if (type !== 'rpc') return null + getNetworkName () { + const { provider } = this.props + const providerName = provider.type + + let name + + if (providerName === 'mainnet') { + name = this.context.t('mainnet') + } else if (providerName === 'ropsten') { + name = this.context.t('ropsten') + } else if (providerName === 'kovan') { + name = this.context.t('kovan') + } else if (providerName === 'rinkeby') { + name = this.context.t('rinkeby') + } else if (providerName === 'localhost') { + name = this.context.t('localhost') + } else if (providerName === 'goerli') { + name = this.context.t('goerli') + } else { + name = provider.nickname || this.context.t('unknownNetwork') + } - switch (rpcTarget) { + return name + } - case 'http://localhost:8545': - return null + render () { + const { provider: { type: providerType, rpcTarget: activeNetwork }, setNetworksTabAddMode } = this.props + const rpcListDetail = this.props.frequentRpcListDetail + const isOpen = this.props.networkDropdownOpen + const dropdownMenuItemStyle = { + fontSize: '16px', + lineHeight: '20px', + padding: '12px 0', + } - default: - return h( - DropdownMenuItem, - { - key: rpcTarget, - onClick: () => props.setRpcTarget(rpcTarget, network, ticker, nickname), - closeMenu: () => this.props.hideNetworkDropdown(), - style: { - fontSize: '16px', - lineHeight: '20px', - padding: '12px 0', - }, - }, - [ - h('i.fa.fa-check'), - h('i.fa.fa-question-circle.fa-med.menu-icon-circle'), - h('span.network-name-item', { - style: { - color: '#ffffff', - }, - }, nickname || rpcTarget), - ] - ) + return ( + { + const { classList } = event.target + const isInClassList = (className) => classList.contains(className) + const notToggleElementIndex = notToggleElementClassnames.findIndex(isInClassList) + + if (notToggleElementIndex === -1) { + this.props.hideNetworkDropdown() + } + }} + containerClassName="network-droppo" + zIndex={55} + style={{ + position: 'absolute', + top: '58px', + width: '309px', + zIndex: '55px', + }} + innerStyle={{ + padding: '18px 8px', + }} + > +
    +
    + {this.context.t('networks')} +
    +
    +
    + {this.context.t('defaultNetwork')} +
    +
    + this.props.hideNetworkDropdown()} + onClick={() => this.handleClick('mainnet')} + style={{ ...dropdownMenuItemStyle, borderColor: '#038789' }} + > + { + providerType === 'mainnet' + ? + :
    ✓
    + } + + + {this.context.t('mainnet')} + +
    + this.props.hideNetworkDropdown()} + onClick={() => this.handleClick('ropsten')} + style={dropdownMenuItemStyle} + > + { + providerType === 'ropsten' + ? + :
    ✓
    + } + + + {this.context.t('ropsten')} + +
    + this.props.hideNetworkDropdown()} + onClick={() => this.handleClick('kovan')} + style={dropdownMenuItemStyle} + > + { + providerType === 'kovan' + ? + :
    ✓
    + } + + + {this.context.t('kovan')} + +
    + this.props.hideNetworkDropdown()} + onClick={() => this.handleClick('rinkeby')} + style={dropdownMenuItemStyle} + > + { + providerType === 'rinkeby' + ? + :
    ✓
    + } + + + {this.context.t('rinkeby')} + +
    + this.props.hideNetworkDropdown()} + onClick={() => this.handleClick('goerli')} + style={dropdownMenuItemStyle} + > + { + providerType === 'goerli' + ? + :
    ✓
    + } + + + {this.context.t('goerli')} + +
    + this.props.hideNetworkDropdown()} + onClick={() => this.handleClick('localhost')} + style={dropdownMenuItemStyle} + > + { + providerType === 'localhost' + ? + :
    ✓
    + } + + + {this.context.t('localhost')} + +
    + {this.renderCustomOption(this.props.provider)} + {this.renderCommonRpc(rpcListDetail, this.props.provider)} + this.props.hideNetworkDropdown()} + onClick={() => { + setNetworksTabAddMode(true) + this.props.history.push(NETWORKS_ROUTE) + }} + style={dropdownMenuItemStyle} + > + { + activeNetwork === 'custom' + ? + :
    ✓
    + } + + + {this.context.t('customRPC')} + +
    + + ) } } + +export default compose( + withRouter, + connect(mapStateToProps, mapDispatchToProps), +)(NetworkDropdown) diff --git a/ui/app/components/app/dropdowns/simple-dropdown.js b/ui/app/components/app/dropdowns/simple-dropdown.js index bba088ed1d28..a8de50851af9 100644 --- a/ui/app/components/app/dropdowns/simple-dropdown.js +++ b/ui/app/components/app/dropdowns/simple-dropdown.js @@ -1,21 +1,23 @@ -const { Component } = require('react') -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const classnames = require('classnames') -const R = require('ramda') +import classnames from 'classnames' +import PropTypes from 'prop-types' +import React, { Component } from 'react' class SimpleDropdown extends Component { - constructor (props) { - super(props) - this.state = { - isOpen: false, - } + static propTypes = { + options: PropTypes.array.isRequired, + placeholder: PropTypes.string, + onSelect: PropTypes.func, + selectedOption: PropTypes.string, + } + + state = { + isOpen: false, } getDisplayValue () { const { selectedOption, options } = this.props - const matchesOption = option => option.value === selectedOption - const matchingOption = R.find(matchesOption)(options) + const matchesOption = (option) => option.value === selectedOption + const matchingOption = options.find(matchesOption) return matchingOption ? matchingOption.displayValue || matchingOption.value : selectedOption @@ -26,67 +28,59 @@ class SimpleDropdown extends Component { } toggleOpen () { - const { isOpen } = this.state - this.setState({ isOpen: !isOpen }) + this.setState((prevState) => ({ + isOpen: !prevState.isOpen, + })) } renderOptions () { const { options, onSelect, selectedOption } = this.props - return h('div', [ - h('div.simple-dropdown__close-area', { - onClick: event => { - event.stopPropagation() - this.handleClose() - }, - }), - h('div.simple-dropdown__options', [ - ...options.map(option => { - return h( - 'div.simple-dropdown__option', - { - className: classnames({ + return ( +
    +
    { + event.stopPropagation() + this.handleClose() + }} + /> +
    + {options.map((option) => ( +
    { + })} + key={option.value} + onClick={(event) => { + event.stopPropagation() if (option.value !== selectedOption) { onSelect(option.value) } this.handleClose() - }, - }, - option.displayValue || option.value, - ) - }), - ]), - ]) + }} + > + {option.displayValue || option.value} +
    + ))} +
    +
    + ) } render () { const { placeholder } = this.props const { isOpen } = this.state - return h( - 'div.simple-dropdown', - { - onClick: () => this.toggleOpen(), - }, - [ - h('div.simple-dropdown__selected', this.getDisplayValue() || placeholder || 'Select'), - h('i.fa.fa-caret-down.fa-lg.simple-dropdown__caret'), - isOpen && this.renderOptions(), - ] + return ( +
    this.toggleOpen()}> +
    {this.getDisplayValue() || placeholder || 'Select'}
    + + {isOpen && this.renderOptions()} +
    ) } } -SimpleDropdown.propTypes = { - options: PropTypes.array.isRequired, - placeholder: PropTypes.string, - onSelect: PropTypes.func, - selectedOption: PropTypes.string, -} - -module.exports = SimpleDropdown +export default SimpleDropdown diff --git a/ui/app/components/app/dropdowns/tests/dropdown.test.js b/ui/app/components/app/dropdowns/tests/dropdown.test.js index 2b026589a297..20d73680011c 100644 --- a/ui/app/components/app/dropdowns/tests/dropdown.test.js +++ b/ui/app/components/app/dropdowns/tests/dropdown.test.js @@ -1,34 +1,34 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import sinon from 'sinon' import { shallow } from 'enzyme' -import { DropdownMenuItem } from '../components/dropdown.js' +import { DropdownMenuItem } from '../components/dropdown' -describe('', () => { +describe('Dropdown', function () { let wrapper const onClickSpy = sinon.spy() const closeMenuSpy = sinon.spy() - beforeEach(() => { + beforeEach(function () { wrapper = shallow( - + , ) }) - it('renders li with dropdown-menu-item class', () => { + it('renders li with dropdown-menu-item class', function () { assert.equal(wrapper.find('li.dropdown-menu-item').length, 1) }) - it('adds style based on props passed', () => { + it('adds style based on props passed', function () { assert.equal(wrapper.prop('style').test, 'style') }) - it('simulates click event and calls onClick and closeMenu', () => { + it('simulates click event and calls onClick and closeMenu', function () { wrapper.prop('onClick')() assert.equal(onClickSpy.callCount, 1) assert.equal(closeMenuSpy.callCount, 1) diff --git a/ui/app/components/app/dropdowns/tests/menu.test.js b/ui/app/components/app/dropdowns/tests/menu.test.js deleted file mode 100644 index 9f5f13f00a8b..000000000000 --- a/ui/app/components/app/dropdowns/tests/menu.test.js +++ /dev/null @@ -1,87 +0,0 @@ -import React from 'react' -import assert from 'assert' -import sinon from 'sinon' -import { shallow } from 'enzyme' -import { Menu, Item, Divider, CloseArea } from '../components/menu' - -describe('Dropdown Menu Components', () => { - - describe('Menu', () => { - let wrapper - - beforeEach(() => { - wrapper = shallow( - - ) - }) - - it('adds prop className to menu', () => { - assert.equal(wrapper.find('.menu').prop('className'), 'menu Test Class') - }) - - }) - - describe('Item', () => { - let wrapper - - const onClickSpy = sinon.spy() - - beforeEach(() => { - wrapper = shallow( - - ) - }) - - it('add className based on props', () => { - assert.equal(wrapper.find('.menu__item').prop('className'), 'menu__item menu__item test className menu__item--clickable') - }) - - it('simulates onClick called', () => { - wrapper.find('.menu__item').prop('onClick')() - assert.equal(onClickSpy.callCount, 1) - }) - - it('adds icon based on icon props', () => { - assert.equal(wrapper.find('.menu__item__icon').text(), 'test icon') - }) - - it('adds html text based on text props', () => { - assert.equal(wrapper.find('.menu__item__text').text(), 'test text') - }) - }) - - describe('Divider', () => { - let wrapper - - before(() => { - wrapper = shallow() - }) - - it('renders menu divider', () => { - assert.equal(wrapper.find('.menu__divider').length, 1) - }) - }) - - describe('CloseArea', () => { - let wrapper - - const onClickSpy = sinon.spy() - - beforeEach(() => { - wrapper = shallow() - }) - - it('simulates click', () => { - wrapper.prop('onClick')() - assert.equal(onClickSpy.callCount, 1) - }) - }) - -}) diff --git a/ui/app/components/app/dropdowns/tests/network-dropdown-icon.test.js b/ui/app/components/app/dropdowns/tests/network-dropdown-icon.test.js index 67b192c118ee..370ed334f496 100644 --- a/ui/app/components/app/dropdowns/tests/network-dropdown-icon.test.js +++ b/ui/app/components/app/dropdowns/tests/network-dropdown-icon.test.js @@ -1,21 +1,18 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { shallow } from 'enzyme' import NetworkDropdownIcon from '../components/network-dropdown-icon' -describe('Network Dropdown Icon', () => { - let wrapper - - beforeEach(() => { - wrapper = shallow() - }) - - it('adds style props based on props', () => { +describe('Network Dropdown Icon', function () { + it('adds style props based on props', function () { + const wrapper = shallow(( + + )) const styleProp = wrapper.find('.menu-icon-circle').children().prop('style') assert.equal(styleProp.background, 'red') assert.equal(styleProp.border, 'none') diff --git a/ui/app/components/app/dropdowns/tests/network-dropdown.test.js b/ui/app/components/app/dropdowns/tests/network-dropdown.test.js index 4a81b973fd9c..5aa458ddbe5d 100644 --- a/ui/app/components/app/dropdowns/tests/network-dropdown.test.js +++ b/ui/app/components/app/dropdowns/tests/network-dropdown.test.js @@ -1,47 +1,51 @@ -import React from 'react' import assert from 'assert' -import { createMockStore } from 'redux-test-utils' +import React from 'react' +import configureMockStore from 'redux-mock-store' +import thunk from 'redux-thunk' import { mountWithRouter } from '../../../../../../test/lib/render-helpers' import NetworkDropdown from '../network-dropdown' import { DropdownMenuItem } from '../components/dropdown' import NetworkDropdownIcon from '../components/network-dropdown-icon' -describe('Network Dropdown', () => { +describe('Network Dropdown', function () { let wrapper + const createMockStore = configureMockStore([thunk]) - describe('NetworkDropdown in appState in false', () => { + describe('NetworkDropdown in appState in false', function () { const mockState = { metamask: { + network: '1', provider: { type: 'test', }, }, appState: { - networkDropdown: false, + networkDropdownOpen: false, }, } const store = createMockStore(mockState) - beforeEach(() => { + beforeEach(function () { wrapper = mountWithRouter( - + , ) }) - it('checks for network droppo class', () => { + it('checks for network droppo class', function () { assert.equal(wrapper.find('.network-droppo').length, 1) }) - it('renders only one child when networkDropdown is false in state', () => { + it('renders only one child when networkDropdown is false in state', function () { assert.equal(wrapper.children().length, 1) }) }) - describe('NetworkDropdown in appState is true', () => { + describe('NetworkDropdown in appState is true', function () { const mockState = { metamask: { + network: '1', provider: { 'type': 'test', }, @@ -55,45 +59,45 @@ describe('Network Dropdown', () => { } const store = createMockStore(mockState) - beforeEach(() => { + beforeEach(function () { wrapper = mountWithRouter( - , + , ) }) - it('renders 7 DropDownMenuItems ', () => { + it('renders 7 DropDownMenuItems ', function () { assert.equal(wrapper.find(DropdownMenuItem).length, 8) }) - it('checks background color for first NetworkDropdownIcon', () => { + it('checks background color for first NetworkDropdownIcon', function () { assert.equal(wrapper.find(NetworkDropdownIcon).at(0).prop('backgroundColor'), '#29B6AF') // Main Ethereum Network Teal }) - it('checks background color for second NetworkDropdownIcon', () => { + it('checks background color for second NetworkDropdownIcon', function () { assert.equal(wrapper.find(NetworkDropdownIcon).at(1).prop('backgroundColor'), '#ff4a8d') // Ropsten Red }) - it('checks background color for third NetworkDropdownIcon', () => { + it('checks background color for third NetworkDropdownIcon', function () { assert.equal(wrapper.find(NetworkDropdownIcon).at(2).prop('backgroundColor'), '#7057ff') // Kovan Purple }) - it('checks background color for fourth NetworkDropdownIcon', () => { + it('checks background color for fourth NetworkDropdownIcon', function () { assert.equal(wrapper.find(NetworkDropdownIcon).at(3).prop('backgroundColor'), '#f6c343') // Rinkeby Yellow }) - it('checks background color for fifth NetworkDropdownIcon', () => { + it('checks background color for fifth NetworkDropdownIcon', function () { assert.equal(wrapper.find(NetworkDropdownIcon).at(4).prop('backgroundColor'), '#3099f2') // Goerli Blue }) - it('checks background color for sixth NetworkDropdownIcon', () => { + it('checks background color for sixth NetworkDropdownIcon', function () { assert.equal(wrapper.find(NetworkDropdownIcon).at(5).prop('innerBorder'), '1px solid #9b9b9b') }) - it('checks dropdown for frequestRPCList from state ', () => { + it('checks dropdown for frequestRPCList from state ', function () { assert.equal(wrapper.find(DropdownMenuItem).at(6).text(), '✓http://localhost:7545') }) - it('checks background color for seventh NetworkDropdownIcon', () => { + it('checks background color for seventh NetworkDropdownIcon', function () { assert.equal(wrapper.find(NetworkDropdownIcon).at(6).prop('innerBorder'), '1px solid #9b9b9b') }) diff --git a/ui/app/components/app/dropdowns/token-menu-dropdown.js b/ui/app/components/app/dropdowns/token-menu-dropdown.js deleted file mode 100644 index e2730aea2111..000000000000 --- a/ui/app/components/app/dropdowns/token-menu-dropdown.js +++ /dev/null @@ -1,68 +0,0 @@ -const Component = require('react').Component -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const inherits = require('util').inherits -const connect = require('react-redux').connect -const actions = require('../../../store/actions') -const genAccountLink = require('etherscan-link').createAccountLink -const { Menu, Item, CloseArea } = require('./components/menu') - -TokenMenuDropdown.contextTypes = { - t: PropTypes.func, -} - -module.exports = connect(mapStateToProps, mapDispatchToProps)(TokenMenuDropdown) - -function mapStateToProps (state) { - return { - network: state.metamask.network, - } -} - -function mapDispatchToProps (dispatch) { - return { - showHideTokenConfirmationModal: (token) => { - dispatch(actions.showModal({ name: 'HIDE_TOKEN_CONFIRMATION', token })) - }, - } -} - - -inherits(TokenMenuDropdown, Component) -function TokenMenuDropdown () { - Component.call(this) - - this.onClose = this.onClose.bind(this) -} - -TokenMenuDropdown.prototype.onClose = function (e) { - e.stopPropagation() - this.props.onClose() -} - -TokenMenuDropdown.prototype.render = function () { - const { showHideTokenConfirmationModal } = this.props - - return h(Menu, { className: 'token-menu-dropdown', isShowing: true }, [ - h(CloseArea, { - onClick: this.onClose, - }), - h(Item, { - onClick: (e) => { - e.stopPropagation() - showHideTokenConfirmationModal(this.props.token) - this.props.onClose() - }, - text: this.context.t('hideToken'), - }), - h(Item, { - onClick: (e) => { - e.stopPropagation() - const url = genAccountLink(this.props.token.address, this.props.network) - global.platform.openWindow({ url }) - this.props.onClose() - }, - text: this.context.t('viewOnEtherscan'), - }), - ]) -} diff --git a/ui/app/components/app/ens-input.js b/ui/app/components/app/ens-input.js deleted file mode 100644 index 5eea0dd90b35..000000000000 --- a/ui/app/components/app/ens-input.js +++ /dev/null @@ -1,181 +0,0 @@ -const Component = require('react').Component -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const inherits = require('util').inherits -const extend = require('xtend') -const debounce = require('debounce') -const copyToClipboard = require('copy-to-clipboard') -const ENS = require('ethjs-ens') -const networkMap = require('ethjs-ens/lib/network-map.json') -const ensRE = /.+\..+$/ -const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' -const connect = require('react-redux').connect -const ToAutoComplete = require('../../pages/send/to-autocomplete').default -const log = require('loglevel') -const { isValidENSAddress } = require('../../helpers/utils/util') - -EnsInput.contextTypes = { - t: PropTypes.func, -} - -module.exports = connect()(EnsInput) - - -inherits(EnsInput, Component) -function EnsInput () { - Component.call(this) -} - -EnsInput.prototype.onChange = function (recipient) { - - const network = this.props.network - const networkHasEnsSupport = getNetworkEnsSupport(network) - - this.props.onChange({ toAddress: recipient }) - - if (!networkHasEnsSupport) return - - if (recipient.match(ensRE) === null) { - return this.setState({ - loadingEns: false, - ensResolution: null, - ensFailure: null, - toError: null, - }) - } - - this.setState({ - loadingEns: true, - }) - this.checkName(recipient) -} - -EnsInput.prototype.render = function () { - const props = this.props - const opts = extend(props, { - list: 'addresses', - onChange: this.onChange.bind(this), - qrScanner: true, - }) - return h('div', { - style: { width: '100%', position: 'relative' }, - }, [ - h(ToAutoComplete, { ...opts }), - this.ensIcon(), - ]) -} - -EnsInput.prototype.componentDidMount = function () { - const network = this.props.network - const networkHasEnsSupport = getNetworkEnsSupport(network) - this.setState({ ensResolution: ZERO_ADDRESS }) - - if (networkHasEnsSupport) { - const provider = global.ethereumProvider - this.ens = new ENS({ provider, network }) - this.checkName = debounce(this.lookupEnsName.bind(this), 200) - } -} - -EnsInput.prototype.lookupEnsName = function (recipient) { - const { ensResolution } = this.state - - log.info(`ENS attempting to resolve name: ${recipient}`) - this.ens.lookup(recipient.trim()) - .then((address) => { - if (address === ZERO_ADDRESS) throw new Error(this.context.t('noAddressForName')) - if (address !== ensResolution) { - this.setState({ - loadingEns: false, - ensResolution: address, - nickname: recipient.trim(), - hoverText: address + '\n' + this.context.t('clickCopy'), - ensFailure: false, - toError: null, - }) - } - }) - .catch((reason) => { - const setStateObj = { - loadingEns: false, - ensResolution: recipient, - ensFailure: true, - toError: null, - } - if (isValidENSAddress(recipient) && reason.message === 'ENS name not defined.') { - setStateObj.hoverText = this.context.t('ensNameNotFound') - setStateObj.toError = 'ensNameNotFound' - setStateObj.ensFailure = false - } else { - log.error(reason) - setStateObj.hoverText = reason.message - } - - return this.setState(setStateObj) - }) -} - -EnsInput.prototype.componentDidUpdate = function (prevProps, prevState) { - const state = this.state || {} - const ensResolution = state.ensResolution - // If an address is sent without a nickname, meaning not from ENS or from - // the user's own accounts, a default of a one-space string is used. - const nickname = state.nickname || ' ' - if (prevProps.network !== this.props.network) { - const provider = global.ethereumProvider - this.ens = new ENS({ provider, network: this.props.network }) - this.onChange(ensResolution) - } - if (prevState && ensResolution && this.props.onChange && - ensResolution !== prevState.ensResolution) { - this.props.onChange({ toAddress: ensResolution, nickname, toError: state.toError, toWarning: state.toWarning }) - } -} - -EnsInput.prototype.ensIcon = function (recipient) { - const { hoverText } = this.state || {} - return h('span.#ensIcon', { - title: hoverText, - style: { - position: 'absolute', - top: '16px', - left: '-25px', - }, - }, this.ensIconContents(recipient)) -} - -EnsInput.prototype.ensIconContents = function () { - const { loadingEns, ensFailure, ensResolution, toError } = this.state || { ensResolution: ZERO_ADDRESS } - - if (toError) return - - if (loadingEns) { - return h('img', { - src: 'images/loading.svg', - style: { - width: '30px', - height: '30px', - transform: 'translateY(-6px)', - }, - }) - } - - if (ensFailure) { - return h('i.fa.fa-warning.fa-lg.warning') - } - - if (ensResolution && (ensResolution !== ZERO_ADDRESS)) { - return h('i.fa.fa-check-circle.fa-lg.cursor-pointer', { - style: { color: 'green' }, - onClick: (event) => { - event.preventDefault() - event.stopPropagation() - copyToClipboard(ensResolution) - }, - }) - } -} - -function getNetworkEnsSupport (network) { - return Boolean(networkMap[network]) -} diff --git a/ui/app/components/app/gas-customization/advanced-gas-inputs/advanced-gas-inputs.component.js b/ui/app/components/app/gas-customization/advanced-gas-inputs/advanced-gas-inputs.component.js index d942fd15048c..a3d97c0355af 100644 --- a/ui/app/components/app/gas-customization/advanced-gas-inputs/advanced-gas-inputs.component.js +++ b/ui/app/components/app/gas-customization/advanced-gas-inputs/advanced-gas-inputs.component.js @@ -1,29 +1,18 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' -import debounce from 'lodash.debounce' +import { debounce } from 'lodash' -export default class AdvancedTabContent extends Component { +export default class AdvancedGasInputs extends Component { static contextTypes = { t: PropTypes.func, } - constructor (props) { - super(props) - this.state = { - gasPrice: this.props.customGasPrice, - gasLimit: this.props.customGasLimit, - } - this.changeGasPrice = debounce(this.changeGasPrice, 500) - this.changeGasLimit = debounce(this.changeGasLimit, 500) - } - - static propTypes = { updateCustomGasPrice: PropTypes.func, updateCustomGasLimit: PropTypes.func, - customGasPrice: PropTypes.number, - customGasLimit: PropTypes.number, + customGasPrice: PropTypes.number.isRequired, + customGasLimit: PropTypes.number.isRequired, insufficientBalance: PropTypes.bool, customPriceIsSafe: PropTypes.bool, isSpeedUp: PropTypes.bool, @@ -31,6 +20,16 @@ export default class AdvancedTabContent extends Component { showGasLimitInfoModal: PropTypes.func, } + constructor (props) { + super(props) + this.state = { + gasPrice: this.props.customGasPrice, + gasLimit: this.props.customGasLimit, + } + this.changeGasPrice = debounce(this.changeGasPrice, 500) + this.changeGasLimit = debounce(this.changeGasLimit, 500) + } + componentDidUpdate (prevProps) { const { customGasPrice: prevCustomGasPrice, customGasLimit: prevCustomGasLimit } = prevProps const { customGasPrice, customGasLimit } = this.props @@ -50,12 +49,7 @@ export default class AdvancedTabContent extends Component { } changeGasLimit = (e) => { - if (e.target.value < 21000) { - this.setState({ gasLimit: 21000 }) - this.props.updateCustomGasLimit(21000) - } else { - this.props.updateCustomGasLimit(Number(e.target.value)) - } + this.props.updateCustomGasLimit(Number(e.target.value)) } onChangeGasPrice = (e) => { @@ -67,89 +61,86 @@ export default class AdvancedTabContent extends Component { this.props.updateCustomGasPrice(Number(e.target.value)) } - gasInputError ({ labelKey, insufficientBalance, customPriceIsSafe, isSpeedUp, value }) { + gasPriceError ({ insufficientBalance, customPriceIsSafe, isSpeedUp, gasPrice }) { const { t } = this.context - let errorText - let errorType - let isInError = true - if (insufficientBalance) { - errorText = t('insufficientBalance') - errorType = 'error' - } else if (labelKey === 'gasPrice' && isSpeedUp && value === 0) { - errorText = t('zeroGasPriceOnSpeedUpError') - errorType = 'error' - } else if (labelKey === 'gasPrice' && !customPriceIsSafe) { - errorText = t('gasPriceExtremelyLow') - errorType = 'warning' - } else { - isInError = false + return { + errorText: t('insufficientBalance'), + errorType: 'error', + } + } else if (isSpeedUp && gasPrice === 0) { + return { + errorText: t('zeroGasPriceOnSpeedUpError'), + errorType: 'error', + } + } else if (!customPriceIsSafe) { + return { + errorText: t('gasPriceExtremelyLow'), + errorType: 'warning', + } } - return { - isInError, - errorText, - errorType, - } + return {} } - gasInput ({ labelKey, value, onChange, insufficientBalance, customPriceIsSafe, isSpeedUp }) { - const { - isInError, - errorText, - errorType, - } = this.gasInputError({ labelKey, insufficientBalance, customPriceIsSafe, isSpeedUp, value }) + gasLimitError ({ insufficientBalance, gasLimit }) { + const { t } = this.context - return ( -
    - -
    -
    onChange({ target: { value: value + 1 } })} - > - -
    -
    onChange({ target: { value: Math.max(value - 1, 0) } })} - > - -
    -
    - { isInError - ?
    - { errorText } -
    - : null } -
    - ) - } + if (insufficientBalance) { + return { + errorText: t('insufficientBalance'), + errorType: 'error', + } + } else if (gasLimit < 21000) { + return { + errorText: t('gasLimitTooLow'), + errorType: 'error', + } + } - infoButton (onClick) { - return + return {} } - renderGasEditRow (gasInputArgs) { + renderGasInput ({ value, onChange, errorComponent, errorType, infoOnClick, label }) { return (
    - { this.context.t(gasInputArgs.labelKey) } - { this.infoButton(() => gasInputArgs.infoOnClick()) } + { label } + +
    +
    + +
    +
    onChange({ target: { value: value + 1 } })} + > + +
    +
    onChange({ target: { value: Math.max(value - 1, 0) } })} + > + +
    +
    + { errorComponent }
    - { this.gasInput(gasInputArgs) }
    ) } @@ -162,25 +153,47 @@ export default class AdvancedTabContent extends Component { showGasPriceInfoModal, showGasLimitInfoModal, } = this.props + const { + gasPrice, + gasLimit, + } = this.state + + const { + errorText: gasPriceErrorText, + errorType: gasPriceErrorType, + } = this.gasPriceError({ insufficientBalance, customPriceIsSafe, isSpeedUp, gasPrice }) + const gasPriceErrorComponent = gasPriceErrorType ? ( +
    + { gasPriceErrorText } +
    + ) : null + + const { + errorText: gasLimitErrorText, + errorType: gasLimitErrorType, + } = this.gasLimitError({ insufficientBalance, gasLimit }) + const gasLimitErrorComponent = gasLimitErrorType ? ( +
    + { gasLimitErrorText } +
    + ) : null return (
    - { this.renderGasEditRow({ - labelKey: 'gasPrice', + { this.renderGasInput({ + label: this.context.t('gasPrice'), value: this.state.gasPrice, onChange: this.onChangeGasPrice, - insufficientBalance, - customPriceIsSafe, - showGWEI: true, - isSpeedUp, + errorComponent: gasPriceErrorComponent, + errorType: gasPriceErrorType, infoOnClick: showGasPriceInfoModal, }) } - { this.renderGasEditRow({ - labelKey: 'gasLimit', + { this.renderGasInput({ + label: this.context.t('gasLimit'), value: this.state.gasLimit, onChange: this.onChangeGasLimit, - insufficientBalance, - customPriceIsSafe, + errorComponent: gasLimitErrorComponent, + errorType: gasLimitErrorType, infoOnClick: showGasLimitInfoModal, }) }
    diff --git a/ui/app/components/app/gas-customization/advanced-gas-inputs/advanced-gas-inputs.container.js b/ui/app/components/app/gas-customization/advanced-gas-inputs/advanced-gas-inputs.container.js index 73bc13481d18..61c73bcf14d8 100644 --- a/ui/app/components/app/gas-customization/advanced-gas-inputs/advanced-gas-inputs.container.js +++ b/ui/app/components/app/gas-customization/advanced-gas-inputs/advanced-gas-inputs.container.js @@ -12,10 +12,10 @@ function convertGasPriceForInputs (gasPriceInHexWEI) { } function convertGasLimitForInputs (gasLimitInHexWEI) { - return parseInt(gasLimitInHexWEI, 16) + return parseInt(gasLimitInHexWEI, 16) || 0 } -const mapDispatchToProps = dispatch => { +const mapDispatchToProps = (dispatch) => { return { showGasPriceInfoModal: () => dispatch(showModal({ name: 'GAS_PRICE_INFO_MODAL' })), showGasLimitInfoModal: () => dispatch(showModal({ name: 'GAS_LIMIT_INFO_MODAL' })), @@ -23,11 +23,11 @@ const mapDispatchToProps = dispatch => { } const mergeProps = (stateProps, dispatchProps, ownProps) => { - const {customGasPrice, customGasLimit, updateCustomGasPrice, updateCustomGasLimit} = ownProps + const { customGasPrice, customGasLimit, updateCustomGasPrice, updateCustomGasLimit } = ownProps return { + ...ownProps, ...stateProps, ...dispatchProps, - ...ownProps, customGasPrice: convertGasPriceForInputs(customGasPrice), customGasLimit: convertGasLimitForInputs(customGasLimit), updateCustomGasPrice: (price) => updateCustomGasPrice(decGWEIToHexWEI(price)), diff --git a/ui/app/components/app/gas-customization/advanced-gas-inputs/index.scss b/ui/app/components/app/gas-customization/advanced-gas-inputs/index.scss index 50953cbe5a79..b30a6a3b9b3d 100644 --- a/ui/app/components/app/gas-customization/advanced-gas-inputs/index.scss +++ b/ui/app/components/app/gas-customization/advanced-gas-inputs/index.scss @@ -11,7 +11,7 @@ width: 47.5%; &__label { - color: #313B5E; + color: #313b5e; font-size: 12px; display: flex; justify-content: space-between; @@ -20,10 +20,9 @@ @media screen and (max-width: 576px) { font-size: 10px; } - + .fa-info-circle { color: $silver; - margin-left: 10px; cursor: pointer; } @@ -47,6 +46,8 @@ } &__input { + /*rtl:ignore*/ + direction: ltr; border: 1px solid $dusty-gray; border-radius: 4px; color: $mid-gray; @@ -59,17 +60,19 @@ } &__input--error { - border: 1px solid $red; + border: 1px solid $red; } &__input--warning { - border: 1px solid $orange; + border: 1px solid $orange; } &__input-arrows { position: absolute; top: 7px; - right: 0px; + + /*rtl:ignore*/ + right: 0; width: 17px; height: 24px; border: 1px solid #dadada; @@ -77,7 +80,7 @@ display: flex; flex-direction: column; color: #9b9b9b; - font-size: .8em; + font-size: 0.8em; border-bottom-right-radius: 4px; cursor: pointer; @@ -90,12 +93,12 @@ } &__i-wrap:hover { - background: #4EADE7; + background: #4eade7; color: $white; } i:hover { - background: #4EADE7; + background: #4eade7; } i { @@ -130,4 +133,4 @@ color: $dusty-gray; } } -} \ No newline at end of file +} diff --git a/ui/app/components/app/gas-customization/advanced-gas-inputs/tests/advanced-gas-input-component.test.js b/ui/app/components/app/gas-customization/advanced-gas-inputs/tests/advanced-gas-input-component.test.js new file mode 100644 index 000000000000..a18e0e114bea --- /dev/null +++ b/ui/app/components/app/gas-customization/advanced-gas-inputs/tests/advanced-gas-input-component.test.js @@ -0,0 +1,105 @@ +import assert from 'assert' +import React from 'react' +import sinon from 'sinon' +import { mount } from 'enzyme' +import AdvancedTabContent from '..' + +describe('Advanced Gas Inputs', function () { + let wrapper, clock + + const props = { + updateCustomGasPrice: sinon.spy(), + updateCustomGasLimit: sinon.spy(), + showGasPriceInfoModal: sinon.spy(), + showGasLimitInfoModal: sinon.spy(), + customGasPrice: 0, + customGasLimit: 0, + insufficientBalance: false, + customPriceIsSafe: true, + isSpeedUp: false, + } + + beforeEach(function () { + clock = sinon.useFakeTimers() + + wrapper = mount( + , { + context: { + t: (str) => str, + }, + }, + ) + }) + + afterEach(function () { + clock.restore() + }) + + it('wont update gasPrice in props before debounce', function () { + const event = { target: { value: 1 } } + + wrapper.find('input').at(0).simulate('change', event) + clock.tick(499) + + assert.equal(props.updateCustomGasPrice.callCount, 0) + }) + + it('simulates onChange on gas price after debounce', function () { + const event = { target: { value: 1 } } + + wrapper.find('input').at(0).simulate('change', event) + clock.tick(500) + + assert.equal(props.updateCustomGasPrice.calledOnce, true) + assert.equal(props.updateCustomGasPrice.calledWith(1), true) + }) + + it('wont update gasLimit in props before debounce', function () { + const event = { target: { value: 21000 } } + + wrapper.find('input').at(1).simulate('change', event) + clock.tick(499) + + assert.equal(props.updateCustomGasLimit.callCount, 0) + }) + + it('simulates onChange on gas limit after debounce', function () { + const event = { target: { value: 21000 } } + + wrapper.find('input').at(1).simulate('change', event) + clock.tick(500) + + assert.equal(props.updateCustomGasLimit.calledOnce, true) + assert.equal(props.updateCustomGasLimit.calledWith(21000), true) + }) + + it('errors when insufficientBalance under gas price and gas limit', function () { + wrapper.setProps({ insufficientBalance: true }) + const renderError = wrapper.find('.advanced-gas-inputs__gas-edit-row__error-text') + assert.equal(renderError.length, 2) + + assert.equal(renderError.at(0).text(), 'insufficientBalance') + assert.equal(renderError.at(1).text(), 'insufficientBalance') + }) + + it('errors zero gas price / speed up', function () { + wrapper.setProps({ isSpeedUp: true }) + + const renderError = wrapper.find('.advanced-gas-inputs__gas-edit-row__error-text') + assert.equal(renderError.length, 2) + + assert.equal(renderError.at(0).text(), 'zeroGasPriceOnSpeedUpError') + assert.equal(renderError.at(1).text(), 'gasLimitTooLow') + }) + + it('warns when custom gas price is too low', function () { + wrapper.setProps({ customPriceIsSafe: false }) + + const renderWarning = wrapper.find('.advanced-gas-inputs__gas-edit-row__warning-text') + assert.equal(renderWarning.length, 1) + + assert.equal(renderWarning.text(), 'gasPriceExtremelyLow') + }) +}) diff --git a/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/advanced-tab-content.component.js b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/advanced-tab-content.component.js index eab3434df4bb..91c36f0a4171 100644 --- a/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/advanced-tab-content.component.js +++ b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/advanced-tab-content.component.js @@ -1,9 +1,11 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import classnames from 'classnames' +import { + decGWEIToHexWEI, +} from '../../../../../helpers/utils/conversions.util' import Loading from '../../../../ui/loading-screen' import GasPriceChart from '../../gas-price-chart' -import debounce from 'lodash.debounce' +import AdvancedGasInputs from '../../advanced-gas-inputs' export default class AdvancedTabContent extends Component { static contextTypes = { @@ -13,8 +15,8 @@ export default class AdvancedTabContent extends Component { static propTypes = { updateCustomGasPrice: PropTypes.func, updateCustomGasLimit: PropTypes.func, - customGasPrice: PropTypes.number, - customGasLimit: PropTypes.number, + customModalGasPriceInHex: PropTypes.string, + customModalGasLimitInHex: PropTypes.string, gasEstimatesLoading: PropTypes.bool, millisecondsRemaining: PropTypes.number, transactionFee: PropTypes.string, @@ -26,95 +28,6 @@ export default class AdvancedTabContent extends Component { isEthereumNetwork: PropTypes.bool, } - constructor (props) { - super(props) - - this.debouncedGasLimitReset = debounce((dVal) => { - if (dVal < 21000) { - props.updateCustomGasLimit(21000) - } - }, 1000, { trailing: true }) - this.onChangeGasLimit = (val) => { - props.updateCustomGasLimit(val) - this.debouncedGasLimitReset(val) - } - } - - gasInputError ({ labelKey, insufficientBalance, customPriceIsSafe, isSpeedUp, value }) { - const { t } = this.context - let errorText - let errorType - let isInError = true - - - if (insufficientBalance) { - errorText = t('insufficientBalance') - errorType = 'error' - } else if (labelKey === 'gasPrice' && isSpeedUp && value === 0) { - errorText = t('zeroGasPriceOnSpeedUpError') - errorType = 'error' - } else if (labelKey === 'gasPrice' && !customPriceIsSafe) { - errorText = t('gasPriceExtremelyLow') - errorType = 'warning' - } else { - isInError = false - } - - return { - isInError, - errorText, - errorType, - } - } - - gasInput ({ labelKey, value, onChange, insufficientBalance, customPriceIsSafe, isSpeedUp }) { - const { - isInError, - errorText, - errorType, - } = this.gasInputError({ labelKey, insufficientBalance, customPriceIsSafe, isSpeedUp, value }) - - return ( -
    - onChange(Number(event.target.value))} - /> -
    -
    onChange(value + 1)} - > - -
    -
    onChange(Math.max(value - 1, 0))} - > - -
    -
    - { isInError - ?
    - { errorText } -
    - : null } -
    - ) - } - - infoButton (onClick) { - return - } - renderDataSummary (transactionFee, timeRemaining) { return (
    @@ -126,52 +39,15 @@ export default class AdvancedTabContent extends Component {
    {transactionFee}
    -
    {timeRemaining}
    +
    {timeRemaining}
    ) } - renderGasEditRow (gasInputArgs) { - return ( -
    -
    - { this.context.t(gasInputArgs.labelKey) } - { this.infoButton(() => {}) } -
    - { this.gasInput(gasInputArgs) } -
    - ) - } - - renderGasEditRows ({ - customGasPrice, - updateCustomGasPrice, - customGasLimit, - insufficientBalance, - customPriceIsSafe, - isSpeedUp, - }) { - return ( -
    - { this.renderGasEditRow({ - labelKey: 'gasPrice', - value: customGasPrice, - onChange: updateCustomGasPrice, - insufficientBalance, - customPriceIsSafe, - showGWEI: true, - isSpeedUp, - }) } - { this.renderGasEditRow({ - labelKey: 'gasLimit', - value: customGasLimit, - onChange: this.onChangeGasLimit, - insufficientBalance, - customPriceIsSafe, - }) } -
    - ) + onGasChartUpdate = (price) => { + const { updateCustomGasPrice } = this.props + updateCustomGasPrice(decGWEIToHexWEI(price)) } render () { @@ -180,8 +56,8 @@ export default class AdvancedTabContent extends Component { updateCustomGasPrice, updateCustomGasLimit, timeRemaining, - customGasPrice, - customGasLimit, + customModalGasPriceInHex, + customModalGasLimitInHex, insufficientBalance, gasChartProps, gasEstimatesLoading, @@ -195,27 +71,31 @@ export default class AdvancedTabContent extends Component {
    { this.renderDataSummary(transactionFee, timeRemaining) }
    - { this.renderGasEditRows({ - customGasPrice, - updateCustomGasPrice, - customGasLimit, - updateCustomGasLimit, - insufficientBalance, - customPriceIsSafe, - isSpeedUp, - }) } +
    + +
    { isEthereumNetwork - ?
    -
    { t('liveGasPricePredictions') }
    - {!gasEstimatesLoading - ? - : - } -
    - { t('slower') } - { t('faster') } + ? ( +
    +
    { t('liveGasPricePredictions') }
    + {gasEstimatesLoading + ? + : + } +
    + { t('slower') } + { t('faster') } +
    -
    + ) :
    { t('chartOnlyAvailableEth') }
    }
    diff --git a/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/index.scss b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/index.scss index 20a503018eb2..039ccab2bcaa 100644 --- a/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/index.scss +++ b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/index.scss @@ -1,5 +1,3 @@ -@import './time-remaining/index'; - .advanced-tab { display: flex; flex-flow: column; @@ -24,31 +22,53 @@ flex-flow: row; justify-content: space-between; font-size: 12px; - color: #888EA3; + color: #888ea3; } &__container { font-size: 16px; - margin-top: 0px; + margin-top: 0; } &__fee { font-size: 16px; - color: #313A5E; + color: #313a5e; + } + + &__time-remaining { + /*rtl:ignore*/ + direction: ltr; + color: #313a5e; + font-size: 16px; + + .minutes-num, + .seconds-num { + font-size: 16px; + } + + .seconds-num { + margin-left: 7px; + font-size: 16px; + } + + .minutes-label, + .seconds-label { + font-size: 16px; + } } } &__fee-chart { margin-top: 8px; height: 265px; - background: #F8F9FB; + background: #f8f9fb; border-bottom: 1px solid #d2d8dd; border-top: 1px solid #d2d8dd; position: relative; &__title { font-size: 12px; - color: #313A5E; + color: #313a5e; margin-left: 22px; } @@ -61,7 +81,7 @@ padding-right: 19px; width: 100%; font-size: 10px; - color: #888EA3; + color: #888ea3; } .loading-overlay { @@ -74,134 +94,13 @@ padding-right: 27px; } - &__gas-edit-rows { - height: 73px; + &__gas-inputs { display: flex; flex-flow: row; justify-content: space-between; margin-left: 20px; margin-right: 10px; - margin-top: 9px; - } - - &__gas-edit-row { - display: flex; - flex-flow: column; - - &__label { - color: #313B5E; - font-size: 14px; - display: flex; - justify-content: space-between; - align-items: center; - - .fa-info-circle { - color: $silver; - margin-left: 10px; - cursor: pointer; - } - - .fa-info-circle:hover { - color: $mid-gray; - } - } - - &__error-text { - font-size: 12px; - color: red; - } - - &__warning-text { - font-size: 12px; - color: orange; - } - - &__input-wrapper { - position: relative; - } - - &__input { - border: 1px solid $dusty-gray; - border-radius: 4px; - color: $mid-gray; - font-size: 16px; - height: 24px; - width: 155px; - padding-left: 8px; - padding-top: 2px; - margin-top: 7px; - } - - &__input--error { - border: 1px solid $red; - } - - &__input--warning { - border: 1px solid $orange; - } - - &__input-arrows { - position: absolute; - top: 7px; - right: 0px; - width: 17px; - height: 24px; - border: 1px solid #dadada; - border-top-right-radius: 4px; - display: flex; - flex-direction: column; - color: #9b9b9b; - font-size: .8em; - border-bottom-right-radius: 4px; - cursor: pointer; - - &__i-wrap { - width: 100%; - height: 100%; - display: flex; - justify-content: center; - cursor: pointer; - } - - &__i-wrap:hover { - background: #4EADE7; - color: $white; - } - - i:hover { - background: #4EADE7; - } - - i { - font-size: 10px; - } - } - - &__input-arrows--error { - border: 1px solid $red; - } - - &__input-arrows--warning { - border: 1px solid $orange; - } - - input[type="number"]::-webkit-inner-spin-button { - -webkit-appearance: none; - -moz-appearance: none; - display: none; - } - - input[type="number"]:hover::-webkit-inner-spin-button { - -webkit-appearance: none; - -moz-appearance: none; - display: none; - } - - &__gwei-symbol { - position: absolute; - top: 8px; - right: 10px; - color: $dusty-gray; - } + margin-top: 10px; + margin-bottom: 20px; } -} \ No newline at end of file +} diff --git a/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/tests/advanced-tab-content-component.test.js b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/tests/advanced-tab-content-component.test.js index 5f7d909224f6..4668ced0bc25 100644 --- a/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/tests/advanced-tab-content-component.test.js +++ b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/tests/advanced-tab-content-component.test.js @@ -1,56 +1,48 @@ -import React from 'react' import assert from 'assert' -import shallow from '../../../../../../../lib/shallow-with-context' +import React from 'react' import sinon from 'sinon' -import AdvancedTabContent from '../advanced-tab-content.component.js' +import shallow from '../../../../../../../lib/shallow-with-context' +import AdvancedTabContent from '../advanced-tab-content.component' import GasPriceChart from '../../../gas-price-chart' import Loading from '../../../../../ui/loading-screen' -const propsMethodSpies = { - updateCustomGasPrice: sinon.spy(), - updateCustomGasLimit: sinon.spy(), -} - -sinon.spy(AdvancedTabContent.prototype, 'renderGasEditRow') -sinon.spy(AdvancedTabContent.prototype, 'gasInput') -sinon.spy(AdvancedTabContent.prototype, 'renderGasEditRows') -sinon.spy(AdvancedTabContent.prototype, 'renderDataSummary') -sinon.spy(AdvancedTabContent.prototype, 'gasInputError') - describe('AdvancedTabContent Component', function () { let wrapper - beforeEach(() => { - wrapper = shallow(, { context: { t: (str1, str2) => str2 ? str1 + str2 : str1 } }) + beforeEach(function () { + const propsMethodSpies = { + updateCustomGasPrice: sinon.spy(), + updateCustomGasLimit: sinon.spy(), + } + sinon.spy(AdvancedTabContent.prototype, 'renderDataSummary') + + wrapper = shallow(( + + )) }) - afterEach(() => { - propsMethodSpies.updateCustomGasPrice.resetHistory() - propsMethodSpies.updateCustomGasLimit.resetHistory() - AdvancedTabContent.prototype.renderGasEditRow.resetHistory() - AdvancedTabContent.prototype.gasInput.resetHistory() - AdvancedTabContent.prototype.renderGasEditRows.resetHistory() - AdvancedTabContent.prototype.renderDataSummary.resetHistory() + afterEach(function () { + sinon.restore() }) - describe('render()', () => { - it('should render the advanced-tab root node', () => { + describe('render()', function () { + it('should render the advanced-tab root node', function () { assert(wrapper.hasClass('advanced-tab')) }) - it('should render the expected four children of the advanced-tab div', () => { + it('should render the expected four children of the advanced-tab div', function () { const advancedTabChildren = wrapper.children() assert.equal(advancedTabChildren.length, 2) @@ -59,13 +51,12 @@ describe('AdvancedTabContent Component', function () { const feeChartDiv = advancedTabChildren.at(1) - assert(feeChartDiv.childAt(0).hasClass('advanced-tab__gas-edit-rows')) assert(feeChartDiv.childAt(1).childAt(0).hasClass('advanced-tab__fee-chart__title')) assert(feeChartDiv.childAt(1).childAt(1).is(GasPriceChart)) assert(feeChartDiv.childAt(1).childAt(2).hasClass('advanced-tab__fee-chart__speed-buttons')) }) - it('should render a loading component instead of the chart if gasEstimatesLoading is true', () => { + it('should render a loading component instead of the chart if gasEstimatesLoading is true', function () { wrapper.setProps({ gasEstimatesLoading: true }) const advancedTabChildren = wrapper.children() assert.equal(advancedTabChildren.length, 2) @@ -75,291 +66,42 @@ describe('AdvancedTabContent Component', function () { const feeChartDiv = advancedTabChildren.at(1) - assert(feeChartDiv.childAt(0).hasClass('advanced-tab__gas-edit-rows')) assert(feeChartDiv.childAt(1).childAt(0).hasClass('advanced-tab__fee-chart__title')) assert(feeChartDiv.childAt(1).childAt(1).is(Loading)) assert(feeChartDiv.childAt(1).childAt(2).hasClass('advanced-tab__fee-chart__speed-buttons')) }) - it('should call renderDataSummary with the expected params', () => { - assert.equal(AdvancedTabContent.prototype.renderGasEditRows.callCount, 1) + it('should call renderDataSummary with the expected params', function () { const renderDataSummaryArgs = AdvancedTabContent.prototype.renderDataSummary.getCall(0).args assert.deepEqual(renderDataSummaryArgs, ['$0.25', 21500]) }) - - it('should call renderGasEditRows with the expected params', () => { - assert.equal(AdvancedTabContent.prototype.renderGasEditRows.callCount, 1) - const renderGasEditRowArgs = AdvancedTabContent.prototype.renderGasEditRows.getCall(0).args - assert.deepEqual(renderGasEditRowArgs, [{ - customGasPrice: 11, - customGasLimit: 23456, - insufficientBalance: false, - customPriceIsSafe: true, - updateCustomGasPrice: propsMethodSpies.updateCustomGasPrice, - updateCustomGasLimit: propsMethodSpies.updateCustomGasLimit, - isSpeedUp: false, - }]) - }) }) - describe('renderDataSummary()', () => { + describe('renderDataSummary()', function () { let dataSummary - beforeEach(() => { + beforeEach(function () { dataSummary = shallow(wrapper.instance().renderDataSummary('mockTotalFee', 'mockMsRemaining')) }) - it('should render the transaction-data-summary root node', () => { + it('should render the transaction-data-summary root node', function () { assert(dataSummary.hasClass('advanced-tab__transaction-data-summary')) }) - it('should render titles of the data', () => { + it('should render titles of the data', function () { const titlesNode = dataSummary.children().at(0) assert(titlesNode.hasClass('advanced-tab__transaction-data-summary__titles')) assert.equal(titlesNode.children().at(0).text(), 'newTransactionFee') assert.equal(titlesNode.children().at(1).text(), '~transactionTime') }) - it('should render the data', () => { + it('should render the data', function () { const dataNode = dataSummary.children().at(1) assert(dataNode.hasClass('advanced-tab__transaction-data-summary__container')) assert.equal(dataNode.children().at(0).text(), 'mockTotalFee') - assert(dataNode.children().at(1).hasClass('time-remaining')) + assert(dataNode.children().at(1).hasClass('advanced-tab__transaction-data-summary__time-remaining')) assert.equal(dataNode.children().at(1).text(), 'mockMsRemaining') }) }) - describe('renderGasEditRow()', () => { - let gasEditRow - - beforeEach(() => { - AdvancedTabContent.prototype.gasInput.resetHistory() - gasEditRow = shallow(wrapper.instance().renderGasEditRow({ - labelKey: 'mockLabelKey', - someArg: 'argA', - })) - }) - - it('should render the gas-edit-row root node', () => { - assert(gasEditRow.hasClass('advanced-tab__gas-edit-row')) - }) - - it('should render a label and an input', () => { - const gasEditRowChildren = gasEditRow.children() - assert.equal(gasEditRowChildren.length, 2) - assert(gasEditRowChildren.at(0).hasClass('advanced-tab__gas-edit-row__label')) - assert(gasEditRowChildren.at(1).hasClass('advanced-tab__gas-edit-row__input-wrapper')) - }) - - it('should render the label key and info button', () => { - const gasRowLabelChildren = gasEditRow.children().at(0).children() - assert.equal(gasRowLabelChildren.length, 2) - assert(gasRowLabelChildren.at(0), 'mockLabelKey') - assert(gasRowLabelChildren.at(1).hasClass('fa-info-circle')) - }) - - it('should call this.gasInput with the correct args', () => { - const gasInputSpyArgs = AdvancedTabContent.prototype.gasInput.args - assert.deepEqual(gasInputSpyArgs[0], [ { labelKey: 'mockLabelKey', someArg: 'argA' } ]) - }) - }) - - describe('renderGasEditRows()', () => { - let gasEditRows - let tempOnChangeGasLimit - - beforeEach(() => { - tempOnChangeGasLimit = wrapper.instance().onChangeGasLimit - wrapper.instance().onChangeGasLimit = () => 'mockOnChangeGasLimit' - AdvancedTabContent.prototype.renderGasEditRow.resetHistory() - gasEditRows = shallow(wrapper.instance().renderGasEditRows( - 'mockGasPrice', - () => 'mockUpdateCustomGasPriceReturn', - 'mockGasLimit', - () => 'mockUpdateCustomGasLimitReturn', - false - )) - }) - - afterEach(() => { - wrapper.instance().onChangeGasLimit = tempOnChangeGasLimit - }) - - it('should render the gas-edit-rows root node', () => { - assert(gasEditRows.hasClass('advanced-tab__gas-edit-rows')) - }) - - it('should render two rows', () => { - const gasEditRowsChildren = gasEditRows.children() - assert.equal(gasEditRowsChildren.length, 2) - assert(gasEditRowsChildren.at(0).hasClass('advanced-tab__gas-edit-row')) - assert(gasEditRowsChildren.at(1).hasClass('advanced-tab__gas-edit-row')) - }) - - it('should call this.renderGasEditRow twice, with the expected args', () => { - const renderGasEditRowSpyArgs = AdvancedTabContent.prototype.renderGasEditRow.args - assert.equal(renderGasEditRowSpyArgs.length, 2) - assert.deepEqual(renderGasEditRowSpyArgs[0].map(String), [{ - labelKey: 'gasPrice', - value: 'mockGasLimit', - onChange: () => 'mockOnChangeGasLimit', - insufficientBalance: false, - customPriceIsSafe: true, - showGWEI: true, - }].map(String)) - assert.deepEqual(renderGasEditRowSpyArgs[1].map(String), [{ - labelKey: 'gasPrice', - value: 'mockGasPrice', - onChange: () => 'mockUpdateCustomGasPriceReturn', - insufficientBalance: false, - customPriceIsSafe: true, - showGWEI: true, - }].map(String)) - }) - }) - - describe('infoButton()', () => { - let infoButton - - beforeEach(() => { - AdvancedTabContent.prototype.renderGasEditRow.resetHistory() - infoButton = shallow(wrapper.instance().infoButton(() => 'mockOnClickReturn')) - }) - - it('should render the i element', () => { - assert(infoButton.hasClass('fa-info-circle')) - }) - - it('should pass the onClick argument to the i tag onClick prop', () => { - assert(infoButton.props().onClick(), 'mockOnClickReturn') - }) - }) - - describe('gasInput()', () => { - let gasInput - - beforeEach(() => { - AdvancedTabContent.prototype.renderGasEditRow.resetHistory() - AdvancedTabContent.prototype.gasInputError.resetHistory() - gasInput = shallow(wrapper.instance().gasInput({ - labelKey: 'gasPrice', - value: 321, - onChange: value => value + 7, - insufficientBalance: false, - showGWEI: true, - customPriceIsSafe: true, - isSpeedUp: false, - })) - }) - - it('should render the input-wrapper root node', () => { - assert(gasInput.hasClass('advanced-tab__gas-edit-row__input-wrapper')) - }) - - it('should render two children, including an input', () => { - assert.equal(gasInput.children().length, 2) - assert(gasInput.children().at(0).hasClass('advanced-tab__gas-edit-row__input')) - }) - - it('should call the passed onChange method with the value of the input onChange event', () => { - const inputOnChange = gasInput.find('input').props().onChange - assert.equal(inputOnChange({ target: { value: 8} }), 15) - }) - - it('should have two input arrows', () => { - const upArrow = gasInput.find('.fa-angle-up') - assert.equal(upArrow.length, 1) - const downArrow = gasInput.find('.fa-angle-down') - assert.equal(downArrow.length, 1) - }) - - it('should call onChange with the value incremented decremented when its onchange method is called', () => { - const upArrow = gasInput.find('.advanced-tab__gas-edit-row__input-arrows__i-wrap').at(0) - assert.equal(upArrow.props().onClick(), 329) - const downArrow = gasInput.find('.advanced-tab__gas-edit-row__input-arrows__i-wrap').at(1) - assert.equal(downArrow.props().onClick(), 327) - }) - - it('should call gasInputError with the expected params', () => { - assert.equal(AdvancedTabContent.prototype.gasInputError.callCount, 1) - const gasInputErrorArgs = AdvancedTabContent.prototype.gasInputError.getCall(0).args - assert.deepEqual(gasInputErrorArgs, [{ - labelKey: 'gasPrice', - insufficientBalance: false, - customPriceIsSafe: true, - value: 321, - isSpeedUp: false, - }]) - }) - }) - - describe('gasInputError()', () => { - let gasInputError - - beforeEach(() => { - AdvancedTabContent.prototype.renderGasEditRow.resetHistory() - gasInputError = wrapper.instance().gasInputError({ - labelKey: '', - insufficientBalance: false, - customPriceIsSafe: true, - isSpeedUp: false, - }) - }) - - it('should return an insufficientBalance error', () => { - const gasInputError = wrapper.instance().gasInputError({ - labelKey: 'gasPrice', - insufficientBalance: true, - customPriceIsSafe: true, - isSpeedUp: false, - value: 1, - }) - assert.deepEqual(gasInputError, { - isInError: true, - errorText: 'insufficientBalance', - errorType: 'error', - }) - }) - - it('should return a zero gas on retry error', () => { - const gasInputError = wrapper.instance().gasInputError({ - labelKey: 'gasPrice', - insufficientBalance: false, - customPriceIsSafe: false, - isSpeedUp: true, - value: 0, - }) - assert.deepEqual(gasInputError, { - isInError: true, - errorText: 'zeroGasPriceOnSpeedUpError', - errorType: 'error', - }) - }) - - it('should return a low gas warning', () => { - const gasInputError = wrapper.instance().gasInputError({ - labelKey: 'gasPrice', - insufficientBalance: false, - customPriceIsSafe: false, - isSpeedUp: false, - value: 1, - }) - assert.deepEqual(gasInputError, { - isInError: true, - errorText: 'gasPriceExtremelyLow', - errorType: 'warning', - }) - }) - - it('should return isInError false if there is no error', () => { - gasInputError = wrapper.instance().gasInputError({ - labelKey: 'gasPrice', - insufficientBalance: false, - customPriceIsSafe: true, - value: 1, - }) - assert.equal(gasInputError.isInError, false) - }) - }) - }) diff --git a/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/index.js b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/index.js deleted file mode 100644 index 61b681e1a1e7..000000000000 --- a/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './time-remaining.component' diff --git a/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/index.scss b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/index.scss deleted file mode 100644 index e2115af7f632..000000000000 --- a/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/index.scss +++ /dev/null @@ -1,17 +0,0 @@ -.time-remaining { - color: #313A5E; - font-size: 16px; - - .minutes-num, .seconds-num { - font-size: 16px; - } - - .seconds-num { - margin-left: 7px; - font-size: 16px; - } - - .minutes-label, .seconds-label { - font-size: 16px; - } -} \ No newline at end of file diff --git a/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/tests/time-remaining-component.test.js b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/tests/time-remaining-component.test.js deleted file mode 100644 index 17f0345d583b..000000000000 --- a/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/tests/time-remaining-component.test.js +++ /dev/null @@ -1,30 +0,0 @@ -import React from 'react' -import assert from 'assert' -import shallow from '../../../../../../../../lib/shallow-with-context' -import TimeRemaining from '../time-remaining.component.js' - -describe('TimeRemaining Component', function () { - let wrapper - - beforeEach(() => { - wrapper = shallow() - }) - - describe('render()', () => { - it('should render the time-remaining root node', () => { - assert(wrapper.hasClass('time-remaining')) - }) - - it('should render minutes and seconds numbers and labels', () => { - const timeRemainingChildren = wrapper.children() - assert.equal(timeRemainingChildren.length, 4) - assert.equal(timeRemainingChildren.at(0).text(), 8) - assert.equal(timeRemainingChildren.at(1).text(), 'minutesShorthand') - assert.equal(timeRemainingChildren.at(2).text(), 15) - assert.equal(timeRemainingChildren.at(3).text(), 'secondsShorthand') - }) - }) - -}) diff --git a/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/time-remaining.component.js b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/time-remaining.component.js deleted file mode 100644 index 826d41f9c174..000000000000 --- a/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/time-remaining.component.js +++ /dev/null @@ -1,33 +0,0 @@ -import React, { Component } from 'react' -import PropTypes from 'prop-types' -import { getTimeBreakdown } from './time-remaining.utils' - -export default class TimeRemaining extends Component { - static contextTypes = { - t: PropTypes.func, - } - - static propTypes = { - milliseconds: PropTypes.number, - } - - render () { - const { - milliseconds, - } = this.props - - const { - minutes, - seconds, - } = getTimeBreakdown(milliseconds) - - return ( -
    - {minutes} - {this.context.t('minutesShorthand')} - {seconds} - {this.context.t('secondsShorthand')} -
    - ) - } -} diff --git a/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/time-remaining.utils.js b/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/time-remaining.utils.js deleted file mode 100644 index cf43e0acb9f3..000000000000 --- a/ui/app/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/time-remaining/time-remaining.utils.js +++ /dev/null @@ -1,11 +0,0 @@ -function getTimeBreakdown (milliseconds) { - return { - hours: Math.floor(milliseconds / 3600000), - minutes: Math.floor((milliseconds % 3600000) / 60000), - seconds: Math.floor((milliseconds % 60000) / 1000), - } -} - -module.exports = { - getTimeBreakdown, -} diff --git a/ui/app/components/app/gas-customization/gas-modal-page-container/basic-tab-content/basic-tab-content.component.js b/ui/app/components/app/gas-customization/gas-modal-page-container/basic-tab-content/basic-tab-content.component.js index 5f3925fa51b9..5a80e4c9820b 100644 --- a/ui/app/components/app/gas-customization/gas-modal-page-container/basic-tab-content/basic-tab-content.component.js +++ b/ui/app/components/app/gas-customization/gas-modal-page-container/basic-tab-content/basic-tab-content.component.js @@ -20,13 +20,15 @@ export default class BasicTabContent extends Component {
    { t('estimatedProcessingTimes') }
    { t('selectAHigherGasFee') }
    - {!gasPriceButtonGroupProps.loading - ? + : ( + - : + ) }
    { t('acceleratingATransaction') }
    diff --git a/ui/app/components/app/gas-customization/gas-modal-page-container/basic-tab-content/index.scss b/ui/app/components/app/gas-customization/gas-modal-page-container/basic-tab-content/index.scss index e34e4e328923..06587323b337 100644 --- a/ui/app/components/app/gas-customization/gas-modal-page-container/basic-tab-content/index.scss +++ b/ui/app/components/app/gas-customization/gas-modal-page-container/basic-tab-content/index.scss @@ -4,7 +4,7 @@ align-items: flex-start; padding-left: 21px; height: 324px; - background: #F5F7F8; + background: #f5f7f8; border-bottom: 1px solid #d2d8dd; &__title { diff --git a/ui/app/components/app/gas-customization/gas-modal-page-container/basic-tab-content/tests/basic-tab-content-component.test.js b/ui/app/components/app/gas-customization/gas-modal-page-container/basic-tab-content/tests/basic-tab-content-component.test.js index 0989ac6770be..f8cec8a0cadd 100644 --- a/ui/app/components/app/gas-customization/gas-modal-page-container/basic-tab-content/tests/basic-tab-content-component.test.js +++ b/ui/app/components/app/gas-customization/gas-modal-page-container/basic-tab-content/tests/basic-tab-content-component.test.js @@ -1,10 +1,10 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import shallow from '../../../../../../../lib/shallow-with-context' import BasicTabContent from '../basic-tab-content.component' - import GasPriceButtonGroup from '../../../gas-price-button-group' import Loading from '../../../../../ui/loading-screen' +import { GAS_ESTIMATE_TYPES } from '../../../../../../helpers/constants/common' const mockGasPriceButtonGroupProps = { buttonDataLoading: false, @@ -15,44 +15,49 @@ const mockGasPriceButtonGroupProps = { feeInSecondaryCurrency: '0.0048 ETH', timeEstimate: '~ 1 min 0 sec', priceInHexWei: '0xa1b2c3f', + gasEstimateType: GAS_ESTIMATE_TYPES.AVERAGE, }, { feeInPrimaryCurrency: '$0.39', feeInSecondaryCurrency: '0.004 ETH', timeEstimate: '~ 1 min 30 sec', priceInHexWei: '0xa1b2c39', + gasEstimateType: GAS_ESTIMATE_TYPES.AVERAGE, }, { feeInPrimaryCurrency: '$0.30', feeInSecondaryCurrency: '0.00354 ETH', timeEstimate: '~ 2 min 1 sec', priceInHexWei: '0xa1b2c30', + gasEstimateType: GAS_ESTIMATE_TYPES.AVERAGE, }, ], - handleGasPriceSelection: newPrice => console.log('NewPrice: ', newPrice), + handleGasPriceSelection: (newPrice) => console.log('NewPrice: ', newPrice), noButtonActiveByDefault: true, showCheck: true, } describe('BasicTabContent Component', function () { - let wrapper + describe('render', function () { + let wrapper - beforeEach(() => { - wrapper = shallow() - }) + beforeEach(function () { + wrapper = shallow(( + + )) + }) - describe('render', () => { - it('should have a title', () => { + it('should have a title', function () { assert(wrapper.find('.basic-tab-content').childAt(0).hasClass('basic-tab-content__title')) }) - it('should render a GasPriceButtonGroup compenent', () => { + it('should render a GasPriceButtonGroup compenent', function () { assert.equal(wrapper.find(GasPriceButtonGroup).length, 1) }) - it('should pass correct props to GasPriceButtonGroup', () => { + it('should pass correct props to GasPriceButtonGroup', function () { const { buttonDataLoading, className, @@ -70,7 +75,7 @@ describe('BasicTabContent Component', function () { assert.equal(JSON.stringify(handleGasPriceSelection), JSON.stringify(mockGasPriceButtonGroupProps.handleGasPriceSelection)) }) - it('should render a loading component instead of the GasPriceButtonGroup if gasPriceButtonGroupProps.loading is true', () => { + it('should render a loading component instead of the GasPriceButtonGroup if gasPriceButtonGroupProps.loading is true', function () { wrapper.setProps({ gasPriceButtonGroupProps: { ...mockGasPriceButtonGroupProps, loading: true }, }) diff --git a/ui/app/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container.component.js b/ui/app/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container.component.js index e18c1067e4f4..9199dc1d1742 100644 --- a/ui/app/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container.component.js +++ b/ui/app/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container.component.js @@ -8,35 +8,39 @@ import BasicTabContent from './basic-tab-content' export default class GasModalPageContainer extends Component { static contextTypes = { t: PropTypes.func, + metricsEvent: PropTypes.func, } static propTypes = { - hideModal: PropTypes.func, hideBasic: PropTypes.bool, updateCustomGasPrice: PropTypes.func, updateCustomGasLimit: PropTypes.func, - customGasPrice: PropTypes.number, - customGasLimit: PropTypes.number, + currentTimeEstimate: PropTypes.string, + insufficientBalance: PropTypes.bool, fetchBasicGasAndTimeEstimates: PropTypes.func, fetchGasEstimates: PropTypes.func, gasPriceButtonGroupProps: PropTypes.object, + gasChartProps: PropTypes.object, + gasEstimatesLoading: PropTypes.bool, infoRowProps: PropTypes.shape({ originalTotalFiat: PropTypes.string, originalTotalEth: PropTypes.string, newTotalFiat: PropTypes.string, newTotalEth: PropTypes.string, + sendAmount: PropTypes.string, + transactionFee: PropTypes.string, }), onSubmit: PropTypes.func, customModalGasPriceInHex: PropTypes.string, customModalGasLimitInHex: PropTypes.string, cancelAndClose: PropTypes.func, - transactionFee: PropTypes.string, blockTime: PropTypes.oneOfType([ PropTypes.string, PropTypes.number, ]), customPriceIsSafe: PropTypes.bool, isSpeedUp: PropTypes.bool, + isRetry: PropTypes.bool, disableSave: PropTypes.bool, isEthereumNetwork: PropTypes.bool, } @@ -47,10 +51,10 @@ export default class GasModalPageContainer extends Component { const promise = this.props.hideBasic ? Promise.resolve(this.props.blockTime) : this.props.fetchBasicGasAndTimeEstimates() - .then(basicEstimates => basicEstimates.blockTime) + .then((basicEstimates) => basicEstimates.blockTime) promise - .then(blockTime => { + .then((blockTime) => { this.props.fetchGasEstimates(blockTime) }) } @@ -63,35 +67,39 @@ export default class GasModalPageContainer extends Component { ) } - renderAdvancedTabContent ({ - convertThenUpdateCustomGasPrice, - convertThenUpdateCustomGasLimit, - customGasPrice, - customGasLimit, - newTotalFiat, - gasChartProps, - currentTimeEstimate, - insufficientBalance, - gasEstimatesLoading, - customPriceIsSafe, - isSpeedUp, - transactionFee, - isEthereumNetwork, - }) { + renderAdvancedTabContent () { + const { + updateCustomGasPrice, + updateCustomGasLimit, + customModalGasPriceInHex, + customModalGasLimitInHex, + gasChartProps, + currentTimeEstimate, + insufficientBalance, + gasEstimatesLoading, + customPriceIsSafe, + isSpeedUp, + isRetry, + infoRowProps: { + transactionFee, + }, + isEthereumNetwork, + } = this.props + return ( ) @@ -106,7 +114,7 @@ export default class GasModalPageContainer extends Component { {sendAmount}
    - {this.context.t('transactionFee')} + {this.context.t('transactionFee')} {transactionFee}
    @@ -121,20 +129,27 @@ export default class GasModalPageContainer extends Component { ) } - renderTabs ({ - newTotalFiat, - newTotalEth, - sendAmount, - transactionFee, - }, - { - gasPriceButtonGroupProps, - hideBasic, - ...advancedTabProps - }) { + renderTabs () { + const { + gasPriceButtonGroupProps, + hideBasic, + infoRowProps: { + newTotalFiat, + newTotalEth, + sendAmount, + transactionFee, + }, + } = this.props + let tabsToRender = [ - { name: 'basic', content: this.renderBasicTabContent(gasPriceButtonGroupProps) }, - { name: 'advanced', content: this.renderAdvancedTabContent({ transactionFee, ...advancedTabProps }) }, + { + name: this.context.t('basic'), + content: this.renderBasicTabContent(gasPriceButtonGroupProps), + }, + { + name: this.context.t('advanced'), + content: this.renderAdvancedTabContent(), + }, ] if (hideBasic) { @@ -143,13 +158,14 @@ export default class GasModalPageContainer extends Component { return ( - {tabsToRender.map(({ name, content }, i) => + {tabsToRender.map(({ name, content }, i) => ( +
    { content } { this.renderInfoRows(newTotalFiat, newTotalEth, sendAmount, transactionFee) }
    - )} + ))}
    ) } @@ -157,12 +173,11 @@ export default class GasModalPageContainer extends Component { render () { const { cancelAndClose, - infoRowProps, onSubmit, customModalGasPriceInHex, customModalGasLimitInHex, disableSave, - ...tabProps + isSpeedUp, } = this.props return ( @@ -170,16 +185,25 @@ export default class GasModalPageContainer extends Component { cancelAndClose()} onClose={() => cancelAndClose()} onSubmit={() => { + if (isSpeedUp) { + this.context.metricsEvent({ + eventOpts: { + category: 'Navigation', + action: 'Activity Log', + name: 'Saved "Speed Up"', + }, + }) + } onSubmit(customModalGasLimitInHex, customModalGasPriceInHex) }} submitText={this.context.t('save')} headerCloseText={this.context.t('close')} - hideCancel={true} + hideCancel />
    ) diff --git a/ui/app/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container.container.js b/ui/app/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container.container.js index c260d6798d8a..c56f705b2d9a 100644 --- a/ui/app/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container.container.js +++ b/ui/app/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container.container.js @@ -1,10 +1,11 @@ import { connect } from 'react-redux' -import { pipe, partialRight } from 'ramda' -import GasModalPageContainer from './gas-modal-page-container.component' +import { captureException } from '@sentry/browser' +import { addHexPrefix } from 'ethereumjs-util' import { hideModal, setGasLimit, setGasPrice, + createRetryTransaction, createSpeedUpTransaction, hideSidebar, updateSendAmount, @@ -15,7 +16,6 @@ import { setCustomGasPrice, setCustomGasLimit, resetCustomData, - setCustomTimeEstimate, fetchGasEstimates, fetchBasicGasAndTimeEstimates, } from '../../../../ducks/gas/gas.duck' @@ -28,13 +28,9 @@ import { getCurrentCurrency, getCurrentEthBalance, getIsMainnet, - getSelectedToken, + getSendToken, isEthereumNetwork, - preferencesSelector, -} from '../../../../selectors/selectors.js' -import { - formatTimeEstimate, - getFastPriceEstimateInHexWEI, + getPreferences, getBasicGasEstimateLoadingStatus, getGasEstimatesLoadingStatus, getCustomGasLimit, @@ -45,10 +41,11 @@ import { getRenderableBasicEstimateData, getBasicGasEstimateBlockTime, isCustomPriceSafe, -} from '../../../../selectors/custom-gas' -import { getTokenBalance, -} from '../../../../pages/send/send.selectors' + getSendMaxModeState, + getFastPriceEstimateInHexWEI, +} from '../../../../selectors' + import { formatCurrency, } from '../../../../helpers/utils/confirm-tx.util' @@ -56,9 +53,9 @@ import { addHexWEIsToDec, subtractHexWEIsToDec, decEthToConvertedCurrency as ethTotalToConvertedCurrency, - decGWEIToHexWEI, hexWEIToDecGWEI, } from '../../../../helpers/utils/conversions.util' +import { getRenderableTimeEstimate } from '../../../../helpers/utils/gas-time-estimates.util' import { formatETHFee, } from '../../../../helpers/utils/formatters' @@ -66,24 +63,32 @@ import { calcGasTotal, isBalanceSufficient, } from '../../../../pages/send/send.utils' -import { addHexPrefix } from 'ethereumjs-util' -import { getAdjacentGasPrices, extrapolateY } from '../gas-price-chart/gas-price-chart.utils' -import { getMaxModeOn } from '../../../../pages/send/send-content/send-amount-row/amount-max-button/amount-max-button.selectors' import { calcMaxAmount } from '../../../../pages/send/send-content/send-amount-row/amount-max-button/amount-max-button.utils' +import GasModalPageContainer from './gas-modal-page-container.component' const mapStateToProps = (state, ownProps) => { - const { selectedAddressTxList } = state.metamask + const { currentNetworkTxList, send } = state.metamask const { modalState: { props: modalProps } = {} } = state.appState.modal || {} const { txData = {} } = modalProps || {} const { transaction = {} } = ownProps - const selectedTransaction = selectedAddressTxList.find(({ id }) => id === (transaction.id || txData.id)) + const selectedTransaction = currentNetworkTxList.find(({ id }) => id === (transaction.id || txData.id)) const buttonDataLoading = getBasicGasEstimateLoadingStatus(state) const gasEstimatesLoading = getGasEstimatesLoadingStatus(state) - - const { gasPrice: currentGasPrice, gas: currentGasLimit, value } = getTxParams(state, selectedTransaction) + const sendToken = getSendToken(state) + + // a "default" txParams is used during the send flow, since the transaction doesn't exist yet in that case + const txParams = selectedTransaction?.txParams + ? selectedTransaction.txParams + : { + gas: send.gasLimit || '0x5208', + gasPrice: send.gasPrice || getFastPriceEstimateInHexWEI(state, true), + value: sendToken ? '0x0' : send.amount, + } + + const { gasPrice: currentGasPrice, gas: currentGasLimit, value } = txParams const customModalGasPriceInHex = getCustomGasPrice(state) || currentGasPrice - const customModalGasLimitInHex = getCustomGasLimit(state) || currentGasLimit + const customModalGasLimitInHex = getCustomGasLimit(state) || currentGasLimit || '0x5208' const customGasTotal = calcGasTotal(customModalGasLimitInHex, customModalGasPriceInHex) const gasButtonInfo = getRenderableBasicEstimateData(state, customModalGasLimitInHex) @@ -93,23 +98,25 @@ const mapStateToProps = (state, ownProps) => { const newTotalFiat = addHexWEIsToRenderableFiat(value, customGasTotal, currentCurrency, conversionRate) - const hideBasic = state.appState.modal.modalState.props.hideBasic + const { hideBasic } = state.appState.modal.modalState.props const customGasPrice = calcCustomGasPrice(customModalGasPriceInHex) - const maxModeOn = getMaxModeOn(state) + const maxModeOn = getSendMaxModeState(state) const gasPrices = getEstimatedGasPrices(state) const estimatedTimes = getEstimatedGasTimes(state) const balance = getCurrentEthBalance(state) - const { showFiatInTestnets } = preferencesSelector(state) + const { showFiatInTestnets } = getPreferences(state) const isMainnet = getIsMainnet(state) const showFiat = Boolean(isMainnet || showFiatInTestnets) - const newTotalEth = maxModeOn ? addHexWEIsToRenderableEth(balance, '0x0') : addHexWEIsToRenderableEth(value, customGasTotal) + const isSendTokenSet = Boolean(sendToken) + + const newTotalEth = maxModeOn && !isSendTokenSet ? addHexWEIsToRenderableEth(balance, '0x0') : addHexWEIsToRenderableEth(value, customGasTotal) - const sendAmount = maxModeOn ? subtractHexWEIsFromRenderableEth(balance, customGasTotal) : addHexWEIsToRenderableEth(value, '0x0') + const sendAmount = maxModeOn && !isSendTokenSet ? subtractHexWEIsFromRenderableEth(balance, customGasTotal) : addHexWEIsToRenderableEth(value, '0x0') const insufficientBalance = maxModeOn ? false : !isBalanceSufficient({ amount: value, @@ -118,6 +125,12 @@ const mapStateToProps = (state, ownProps) => { conversionRate, }) + let currentTimeEstimate = '' + try { + currentTimeEstimate = getRenderableTimeEstimate(customGasPrice, gasPrices, estimatedTimes) + } catch (error) { + captureException(error) + } return { hideBasic, @@ -128,7 +141,7 @@ const mapStateToProps = (state, ownProps) => { customGasLimit: calcCustomGasLimit(customModalGasLimitInHex), customGasTotal, newTotalFiat, - currentTimeEstimate: getRenderableTimeEstimate(customGasPrice, gasPrices, estimatedTimes), + currentTimeEstimate, blockTime: getBasicGasEstimateBlockTime(state), customPriceIsSafe: isCustomPriceSafe(state), maxModeOn, @@ -154,19 +167,20 @@ const mapStateToProps = (state, ownProps) => { }, transaction: txData || transaction, isSpeedUp: transaction.status === 'submitted', + isRetry: transaction.status === 'failed', txId: transaction.id, insufficientBalance, gasEstimatesLoading, isMainnet, isEthereumNetwork: isEthereumNetwork(state), - selectedToken: getSelectedToken(state), + sendToken, balance, tokenBalance: getTokenBalance(state), } } -const mapDispatchToProps = dispatch => { - const updateCustomGasPrice = newPrice => dispatch(setCustomGasPrice(addHexPrefix(newPrice))) +const mapDispatchToProps = (dispatch) => { + const updateCustomGasPrice = (newPrice) => dispatch(setCustomGasPrice(addHexPrefix(newPrice))) return { cancelAndClose: () => { @@ -175,8 +189,7 @@ const mapDispatchToProps = dispatch => { }, hideModal: () => dispatch(hideModal()), updateCustomGasPrice, - convertThenUpdateCustomGasPrice: newPrice => updateCustomGasPrice(decGWEIToHexWEI(newPrice)), - convertThenUpdateCustomGasLimit: newLimit => dispatch(setCustomGasLimit(addHexPrefix(newLimit.toString(16)))), + updateCustomGasLimit: (newLimit) => dispatch(setCustomGasLimit(addHexPrefix(newLimit))), setGasData: (newLimit, newPrice) => { dispatch(setGasLimit(newLimit)) dispatch(setGasPrice(newPrice)) @@ -186,11 +199,13 @@ const mapDispatchToProps = dispatch => { dispatch(setCustomGasLimit(addHexPrefix(gasLimit.toString(16)))) return dispatch(updateTransaction(updatedTx)) }, - createSpeedUpTransaction: (txId, gasPrice) => { - return dispatch(createSpeedUpTransaction(txId, gasPrice)) + createRetryTransaction: (txId, gasPrice, gasLimit) => { + return dispatch(createRetryTransaction(txId, gasPrice, gasLimit)) + }, + createSpeedUpTransaction: (txId, gasPrice, gasLimit) => { + return dispatch(createSpeedUpTransaction(txId, gasPrice, gasLimit)) }, hideGasButtonGroup: () => dispatch(hideGasButtonGroup()), - setCustomTimeEstimate: (timeEstimateInSeconds) => dispatch(setCustomTimeEstimate(timeEstimateInSeconds)), hideSidebar: () => dispatch(hideSidebar()), fetchGasEstimates: (blockTime) => dispatch(fetchGasEstimates(blockTime)), fetchBasicGasAndTimeEstimates: () => dispatch(fetchBasicGasAndTimeEstimates()), @@ -205,25 +220,27 @@ const mapDispatchToProps = dispatch => { const mergeProps = (stateProps, dispatchProps, ownProps) => { const { gasPriceButtonGroupProps, + // eslint-disable-next-line no-shadow isConfirm, txId, isSpeedUp, + isRetry, insufficientBalance, maxModeOn, customGasPrice, customGasTotal, balance, - selectedToken, + sendToken, tokenBalance, customGasLimit, transaction, } = stateProps const { - updateCustomGasPrice: dispatchUpdateCustomGasPrice, hideGasButtonGroup: dispatchHideGasButtonGroup, setGasData: dispatchSetGasData, updateConfirmTxGasAndCalculate: dispatchUpdateConfirmTxGasAndCalculate, createSpeedUpTransaction: dispatchCreateSpeedUpTransaction, + createRetryTransaction: dispatchCreateRetryTransaction, hideSidebar: dispatchHideSidebar, cancelAndClose: dispatchCancelAndClose, hideModal: dispatchHideModal, @@ -248,7 +265,11 @@ const mergeProps = (stateProps, dispatchProps, ownProps) => { dispatchUpdateConfirmTxGasAndCalculate(gasLimit, gasPrice, updatedTx) dispatchHideModal() } else if (isSpeedUp) { - dispatchCreateSpeedUpTransaction(txId, gasPrice) + dispatchCreateSpeedUpTransaction(txId, gasPrice, gasLimit) + dispatchHideSidebar() + dispatchCancelAndClose() + } else if (isRetry) { + dispatchCreateRetryTransaction(txId, gasPrice, gasLimit) dispatchHideSidebar() dispatchCancelAndClose() } else { @@ -260,18 +281,18 @@ const mergeProps = (stateProps, dispatchProps, ownProps) => { dispatchSetAmountToMax({ balance, gasTotal: customGasTotal, - selectedToken, + sendToken, tokenBalance, }) } }, gasPriceButtonGroupProps: { ...gasPriceButtonGroupProps, - handleGasPriceSelection: dispatchUpdateCustomGasPrice, + handleGasPriceSelection: otherDispatchProps.updateCustomGasPrice, }, cancelAndClose: () => { dispatchCancelAndClose() - if (isSpeedUp) { + if (isSpeedUp || isRetry) { dispatchHideSidebar() } }, @@ -293,64 +314,19 @@ function calcCustomGasLimit (customGasLimitInHex) { return parseInt(customGasLimitInHex, 16) } -function getTxParams (state, selectedTransaction = {}) { - const { metamask: { send } } = state - const { txParams } = selectedTransaction - return txParams || { - from: send.from, - gas: send.gasLimit || '0x5208', - gasPrice: send.gasPrice || getFastPriceEstimateInHexWEI(state, true), - to: send.to, - value: getSelectedToken(state) ? '0x0' : send.amount, - } -} - function addHexWEIsToRenderableEth (aHexWEI, bHexWEI) { - return pipe( - addHexWEIsToDec, - formatETHFee - )(aHexWEI, bHexWEI) + return formatETHFee(addHexWEIsToDec(aHexWEI, bHexWEI)) } -function subtractHexWEIsFromRenderableEth (aHexWEI, bHexWei) { - return pipe( - subtractHexWEIsToDec, - formatETHFee - )(aHexWEI, bHexWei) +function subtractHexWEIsFromRenderableEth (aHexWEI, bHexWEI) { + return formatETHFee(subtractHexWEIsToDec(aHexWEI, bHexWEI)) } function addHexWEIsToRenderableFiat (aHexWEI, bHexWEI, convertedCurrency, conversionRate) { - return pipe( - addHexWEIsToDec, - partialRight(ethTotalToConvertedCurrency, [convertedCurrency, conversionRate]), - partialRight(formatCurrency, [convertedCurrency]), - )(aHexWEI, bHexWEI) -} - -function getRenderableTimeEstimate (currentGasPrice, gasPrices, estimatedTimes) { - const minGasPrice = gasPrices[0] - const maxGasPrice = gasPrices[gasPrices.length - 1] - let priceForEstimation = currentGasPrice - if (currentGasPrice < minGasPrice) { - priceForEstimation = minGasPrice - } else if (currentGasPrice > maxGasPrice) { - priceForEstimation = maxGasPrice - } - - const { - closestLowerValueIndex, - closestHigherValueIndex, - closestHigherValue, - closestLowerValue, - } = getAdjacentGasPrices({ gasPrices, priceToPosition: priceForEstimation }) - - const newTimeEstimate = extrapolateY({ - higherY: estimatedTimes[closestHigherValueIndex], - lowerY: estimatedTimes[closestLowerValueIndex], - higherX: closestHigherValue, - lowerX: closestLowerValue, - xForExtrapolation: priceForEstimation, - }) - - return formatTimeEstimate(newTimeEstimate, currentGasPrice > maxGasPrice, currentGasPrice < minGasPrice) + const ethTotal = ethTotalToConvertedCurrency( + addHexWEIsToDec(aHexWEI, bHexWEI), + convertedCurrency, + conversionRate, + ) + return formatCurrency(ethTotal, convertedCurrency) } diff --git a/ui/app/components/app/gas-customization/gas-modal-page-container/index.scss b/ui/app/components/app/gas-customization/gas-modal-page-container/index.scss index b9e0f59c4b26..d8edc10c1a34 100644 --- a/ui/app/components/app/gas-customization/gas-modal-page-container/index.scss +++ b/ui/app/components/app/gas-customization/gas-modal-page-container/index.scss @@ -15,7 +15,7 @@ } &__header { - padding: 0px; + padding: 0; padding-top: 16px; &--no-padding-bottom { @@ -24,7 +24,7 @@ } &__footer { - header { + footer { padding-top: 12px; padding-bottom: 12px; } @@ -32,12 +32,13 @@ &__header-close-text { font-size: 14px; - color: #4EADE7; + color: #4eade7; position: absolute; - top: 16px; + top: 4px; right: 16px; cursor: pointer; overflow: hidden; + width: min-content; } &__title { @@ -56,7 +57,7 @@ } &__tabs { - margin-top: 0px; + margin-top: 0; } &__tab { @@ -68,8 +69,8 @@ } &--selected { - color: $curious-blue; - border-bottom: 2px solid $curious-blue; + color: $primary-blue; + border-bottom: 2px solid $primary-blue; } } } @@ -85,7 +86,8 @@ } - &__info-row, &__info-row--fade { + &__info-row, + &__info-row--fade { width: 100%; background: $polar; padding: 15px 21px; @@ -98,7 +100,10 @@ padding: 4px 21px; } - &__send-info, &__transaction-info, &__total-info, &__fiat-total-info { + &__send-info, + &__transaction-info, + &__total-info, + &__fiat-total-info { display: flex; flex-flow: row; justify-content: space-between; @@ -127,7 +132,8 @@ } } - &__transaction-info, &__send-info { + &__transaction-info, + &__send-info { &__label { font-size: 12px; } diff --git a/ui/app/components/app/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-component.test.js b/ui/app/components/app/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-component.test.js index 7557eefe5419..9c8b399fe443 100644 --- a/ui/app/components/app/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-component.test.js +++ b/ui/app/components/app/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-component.test.js @@ -1,8 +1,8 @@ -import React from 'react' import assert from 'assert' -import shallow from '../../../../../../lib/shallow-with-context' +import React from 'react' import sinon from 'sinon' -import GasModalPageContainer from '../gas-modal-page-container.component.js' +import shallow from '../../../../../../lib/shallow-with-context' +import GasModalPageContainer from '../gas-modal-page-container.component' import timeout from '../../../../../../lib/test-timeout' import PageContainer from '../../../../ui/page-container' @@ -62,39 +62,41 @@ const GP = GasModalPageContainer.prototype describe('GasModalPageContainer Component', function () { let wrapper - beforeEach(() => { - wrapper = shallow( 'mockupdateCustomGasPrice'} - updateCustomGasLimit={() => 'mockupdateCustomGasLimit'} - customGasPrice={21} - customGasLimit={54321} - gasPriceButtonGroupProps={mockGasPriceButtonGroupProps} - infoRowProps={mockInfoRowProps} - currentTimeEstimate={'1 min 31 sec'} - customGasPriceInHex={'mockCustomGasPriceInHex'} - customGasLimitInHex={'mockCustomGasLimitInHex'} - insufficientBalance={false} - disableSave={false} - />, { context: { t: (str1, str2) => str2 ? str1 + str2 : str1 } }) + beforeEach(function () { + wrapper = shallow(( + 'mockupdateCustomGasPrice'} + updateCustomGasLimit={() => 'mockupdateCustomGasLimit'} + customGasPrice={21} + customGasLimit={54321} + gasPriceButtonGroupProps={mockGasPriceButtonGroupProps} + infoRowProps={mockInfoRowProps} + currentTimeEstimate="1 min 31 sec" + customGasPriceInHex="mockCustomGasPriceInHex" + customGasLimitInHex="mockCustomGasLimitInHex" + insufficientBalance={false} + disableSave={false} + /> + )) }) - afterEach(() => { + afterEach(function () { propsMethodSpies.cancelAndClose.resetHistory() }) - describe('componentDidMount', () => { - it('should call props.fetchBasicGasAndTimeEstimates', () => { + describe('componentDidMount', function () { + it('should call props.fetchBasicGasAndTimeEstimates', function () { propsMethodSpies.fetchBasicGasAndTimeEstimates.resetHistory() assert.equal(propsMethodSpies.fetchBasicGasAndTimeEstimates.callCount, 0) wrapper.instance().componentDidMount() assert.equal(propsMethodSpies.fetchBasicGasAndTimeEstimates.callCount, 1) }) - it('should call props.fetchGasEstimates with the block time returned by fetchBasicGasAndTimeEstimates', async () => { + it('should call props.fetchGasEstimates with the block time returned by fetchBasicGasAndTimeEstimates', async function () { propsMethodSpies.fetchGasEstimates.resetHistory() assert.equal(propsMethodSpies.fetchGasEstimates.callCount, 0) wrapper.instance().componentDidMount() @@ -104,12 +106,12 @@ describe('GasModalPageContainer Component', function () { }) }) - describe('render', () => { - it('should render a PageContainer compenent', () => { + describe('render', function () { + it('should render a PageContainer compenent', function () { assert.equal(wrapper.find(PageContainer).length, 1) }) - it('should pass correct props to PageContainer', () => { + it('should pass correct props to PageContainer', function () { const { title, subtitle, @@ -120,7 +122,7 @@ describe('GasModalPageContainer Component', function () { assert.equal(disabled, false) }) - it('should pass the correct onCancel and onClose methods to PageContainer', () => { + it('should pass the correct onCancel and onClose methods to PageContainer', function () { const { onCancel, onClose, @@ -132,36 +134,35 @@ describe('GasModalPageContainer Component', function () { assert.equal(propsMethodSpies.cancelAndClose.callCount, 2) }) - it('should pass the correct renderTabs property to PageContainer', () => { + it('should pass the correct renderTabs property to PageContainer', function () { sinon.stub(GP, 'renderTabs').returns('mockTabs') - const renderTabsWrapperTester = shallow(, { context: { t: (str1, str2) => str2 ? str1 + str2 : str1 } }) + const renderTabsWrapperTester = shallow(( + + ), { context: { t: (str1, str2) => (str2 ? str1 + str2 : str1) } }) const { tabsComponent } = renderTabsWrapperTester.find(PageContainer).props() assert.equal(tabsComponent, 'mockTabs') GasModalPageContainer.prototype.renderTabs.restore() }) }) - describe('renderTabs', () => { - beforeEach(() => { + describe('renderTabs', function () { + beforeEach(function () { sinon.spy(GP, 'renderBasicTabContent') sinon.spy(GP, 'renderAdvancedTabContent') sinon.spy(GP, 'renderInfoRows') }) - afterEach(() => { + afterEach(function () { GP.renderBasicTabContent.restore() GP.renderAdvancedTabContent.restore() GP.renderInfoRows.restore() }) - it('should render a Tabs component with "Basic" and "Advanced" tabs', () => { - const renderTabsResult = wrapper.instance().renderTabs(mockInfoRowProps, { - gasPriceButtonGroupProps: mockGasPriceButtonGroupProps, - otherProps: 'mockAdvancedTabProps', - }) + it('should render a Tabs component with "Basic" and "Advanced" tabs', function () { + const renderTabsResult = wrapper.instance().renderTabs() const renderedTabs = shallow(renderTabsResult) assert.equal(renderedTabs.props().className, 'tabs') @@ -175,23 +176,10 @@ describe('GasModalPageContainer Component', function () { assert.equal(tabs.at(1).childAt(0).props().className, 'gas-modal-content') }) - it('should call renderBasicTabContent and renderAdvancedTabContent with the expected props', () => { - assert.equal(GP.renderBasicTabContent.callCount, 0) - assert.equal(GP.renderAdvancedTabContent.callCount, 0) - - wrapper.instance().renderTabs(mockInfoRowProps, { gasPriceButtonGroupProps: mockGasPriceButtonGroupProps, otherProps: 'mockAdvancedTabProps' }) - - assert.equal(GP.renderBasicTabContent.callCount, 1) - assert.equal(GP.renderAdvancedTabContent.callCount, 1) - - assert.deepEqual(GP.renderBasicTabContent.getCall(0).args[0], mockGasPriceButtonGroupProps) - assert.deepEqual(GP.renderAdvancedTabContent.getCall(0).args[0], { transactionFee: 'mockTransactionFee', otherProps: 'mockAdvancedTabProps' }) - }) - - it('should call renderInfoRows with the expected props', () => { + it('should call renderInfoRows with the expected props', function () { assert.equal(GP.renderInfoRows.callCount, 0) - wrapper.instance().renderTabs(mockInfoRowProps, { gasPriceButtonGroupProps: mockGasPriceButtonGroupProps, otherProps: 'mockAdvancedTabProps' }) + wrapper.instance().renderTabs() assert.equal(GP.renderInfoRows.callCount, 2) @@ -199,12 +187,28 @@ describe('GasModalPageContainer Component', function () { assert.deepEqual(GP.renderInfoRows.getCall(1).args, ['mockNewTotalFiat', 'mockNewTotalEth', 'mockSendAmount', 'mockTransactionFee']) }) - it('should not render the basic tab if hideBasic is true', () => { - const renderTabsResult = wrapper.instance().renderTabs(mockInfoRowProps, { - gasPriceButtonGroupProps: mockGasPriceButtonGroupProps, - otherProps: 'mockAdvancedTabProps', - hideBasic: true, - }) + it('should not render the basic tab if hideBasic is true', function () { + wrapper = shallow(( + 'mockupdateCustomGasPrice'} + updateCustomGasLimit={() => 'mockupdateCustomGasLimit'} + customGasPrice={21} + customGasLimit={54321} + gasPriceButtonGroupProps={mockGasPriceButtonGroupProps} + infoRowProps={mockInfoRowProps} + currentTimeEstimate="1 min 31 sec" + customGasPriceInHex="mockCustomGasPriceInHex" + customGasLimitInHex="mockCustomGasLimitInHex" + insufficientBalance={false} + disableSave={false} + hideBasic + /> + )) + const renderTabsResult = wrapper.instance().renderTabs() const renderedTabs = shallow(renderTabsResult) const tabs = renderedTabs.find(Tab) @@ -213,47 +217,25 @@ describe('GasModalPageContainer Component', function () { }) }) - describe('renderBasicTabContent', () => { - it('should render', () => { + describe('renderBasicTabContent', function () { + it('should render', function () { const renderBasicTabContentResult = wrapper.instance().renderBasicTabContent(mockGasPriceButtonGroupProps) assert.deepEqual( renderBasicTabContentResult.props.gasPriceButtonGroupProps, - mockGasPriceButtonGroupProps + mockGasPriceButtonGroupProps, ) }) }) - describe('renderAdvancedTabContent', () => { - it('should render with the correct props', () => { - const renderAdvancedTabContentResult = wrapper.instance().renderAdvancedTabContent({ - convertThenUpdateCustomGasPrice: () => 'mockConvertThenUpdateCustomGasPrice', - convertThenUpdateCustomGasLimit: () => 'mockConvertThenUpdateCustomGasLimit', - customGasPrice: 123, - customGasLimit: 456, - newTotalFiat: '$0.30', - currentTimeEstimate: '1 min 31 sec', - gasEstimatesLoading: 'mockGasEstimatesLoading', - }) - const advancedTabContentProps = renderAdvancedTabContentResult.props - assert.equal(advancedTabContentProps.updateCustomGasPrice(), 'mockConvertThenUpdateCustomGasPrice') - assert.equal(advancedTabContentProps.updateCustomGasLimit(), 'mockConvertThenUpdateCustomGasLimit') - assert.equal(advancedTabContentProps.customGasPrice, 123) - assert.equal(advancedTabContentProps.customGasLimit, 456) - assert.equal(advancedTabContentProps.timeRemaining, '1 min 31 sec') - assert.equal(advancedTabContentProps.totalFee, '$0.30') - assert.equal(advancedTabContentProps.gasEstimatesLoading, 'mockGasEstimatesLoading') - }) - }) - - describe('renderInfoRows', () => { - it('should render the info rows with the passed data', () => { + describe('renderInfoRows', function () { + it('should render the info rows with the passed data', function () { const baseClassName = 'gas-modal-content__info-row' const renderedInfoRowsContainer = shallow(wrapper.instance().renderInfoRows( 'mockNewTotalFiat', ' mockNewTotalEth', ' mockSendAmount', - ' mockTransactionFee' + ' mockTransactionFee', )) assert(renderedInfoRowsContainer.childAt(0).hasClass(baseClassName)) diff --git a/ui/app/components/app/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-container.test.js b/ui/app/components/app/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-container.test.js index 03d254eeeb4a..f27d0de522ae 100644 --- a/ui/app/components/app/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-container.test.js +++ b/ui/app/components/app/gas-customization/gas-modal-page-container/tests/gas-modal-page-container-container.test.js @@ -35,28 +35,24 @@ proxyquire('../gas-modal-page-container.container.js', { return () => ({}) }, }, - '../../../../selectors/custom-gas': { + '../../../../selectors': { getBasicGasEstimateLoadingStatus: (s) => `mockBasicGasEstimateLoadingStatus:${Object.keys(s).length}`, getRenderableBasicEstimateData: (s) => `mockRenderableBasicEstimateData:${Object.keys(s).length}`, getDefaultActiveButtonIndex: (a, b) => a + b, + getCurrentEthBalance: (state) => state.metamask.balance || '0x0', + getSendToken: () => null, + getTokenBalance: (state) => state.metamask.send.tokenBalance || '0x0', }, '../../../../store/actions': actionSpies, '../../../../ducks/gas/gas.duck': gasActionSpies, '../../../../ducks/confirm-transaction/confirm-transaction.duck': confirmTransactionActionSpies, '../../../../ducks/send/send.duck': sendActionSpies, - '../../../../selectors/selectors.js': { - getCurrentEthBalance: (state) => state.metamask.balance || '0x0', - getSelectedToken: () => null, - }, - '../../../../pages/send/send.selectors': { - getTokenBalance: (state) => state.metamask.send.tokenBalance || '0x0', - }, }) -describe('gas-modal-page-container container', () => { +describe('gas-modal-page-container container', function () { - describe('mapStateToProps()', () => { - it('should map the correct properties to props', () => { + describe('mapStateToProps()', function () { + it('should map the correct properties to props', function () { const baseMockState = { appState: { modal: { @@ -85,7 +81,7 @@ describe('gas-modal-page-container container', () => { provider: { type: 'mainnet', }, - selectedAddressTxList: [{ + currentNetworkTxList: [{ id: 34, txParams: { gas: '0x1600000', @@ -157,11 +153,12 @@ describe('gas-modal-page-container container', () => { }, insufficientBalance: true, isSpeedUp: false, + isRetry: false, txId: 34, isEthereumNetwork: true, isMainnet: true, maxModeOn: false, - selectedToken: null, + sendToken: null, tokenBalance: '0x0', transaction: { id: 34, @@ -171,21 +168,18 @@ describe('gas-modal-page-container container', () => { const tests = [ { mockState: baseMockState, expectedResult: baseExpectedResult, mockOwnProps: baseMockOwnProps }, { - mockState: Object.assign({}, baseMockState, { - metamask: { ...baseMockState.metamask, balance: '0xfffffffffffffffffffff' }, - }), - expectedResult: Object.assign({}, baseExpectedResult, { balance: '0xfffffffffffffffffffff', insufficientBalance: false }), + mockState: { ...baseMockState, metamask: { ...baseMockState.metamask, balance: '0xfffffffffffffffffffff' } }, + expectedResult: { ...baseExpectedResult, balance: '0xfffffffffffffffffffff', insufficientBalance: false }, mockOwnProps: baseMockOwnProps, }, { mockState: baseMockState, - mockOwnProps: Object.assign({}, baseMockOwnProps, { - transaction: { id: 34, status: 'submitted' }, - }), - expectedResult: Object.assign({}, baseExpectedResult, { isSpeedUp: true, transaction: { id: 34 } }), + mockOwnProps: { ...baseMockOwnProps, transaction: { id: 34, status: 'submitted' } }, + expectedResult: { ...baseExpectedResult, isSpeedUp: true, transaction: { id: 34 } }, }, { - mockState: Object.assign({}, baseMockState, { + mockState: { + ...baseMockState, metamask: { ...baseMockState.metamask, preferences: { @@ -197,7 +191,7 @@ describe('gas-modal-page-container container', () => { type: 'rinkeby', }, }, - }), + }, mockOwnProps: baseMockOwnProps, expectedResult: { ...baseExpectedResult, @@ -209,7 +203,8 @@ describe('gas-modal-page-container container', () => { }, }, { - mockState: Object.assign({}, baseMockState, { + mockState: { + ...baseMockState, metamask: { ...baseMockState.metamask, preferences: { @@ -221,7 +216,7 @@ describe('gas-modal-page-container container', () => { type: 'rinkeby', }, }, - }), + }, mockOwnProps: baseMockOwnProps, expectedResult: { ...baseExpectedResult, @@ -229,7 +224,8 @@ describe('gas-modal-page-container container', () => { }, }, { - mockState: Object.assign({}, baseMockState, { + mockState: { + ...baseMockState, metamask: { ...baseMockState.metamask, preferences: { @@ -241,14 +237,14 @@ describe('gas-modal-page-container container', () => { type: 'mainnet', }, }, - }), + }, mockOwnProps: baseMockOwnProps, expectedResult: baseExpectedResult, }, ] let result - tests.forEach(({ mockState, mockOwnProps, expectedResult}) => { + tests.forEach(({ mockState, mockOwnProps, expectedResult }) => { result = mapStateToProps(mockState, mockOwnProps) assert.deepEqual(result, expectedResult) }) @@ -256,31 +252,31 @@ describe('gas-modal-page-container container', () => { }) - describe('mapDispatchToProps()', () => { + describe('mapDispatchToProps()', function () { let dispatchSpy let mapDispatchToPropsObject - beforeEach(() => { + beforeEach(function () { dispatchSpy = sinon.spy() mapDispatchToPropsObject = mapDispatchToProps(dispatchSpy) }) - afterEach(() => { + afterEach(function () { actionSpies.hideModal.resetHistory() gasActionSpies.setCustomGasPrice.resetHistory() gasActionSpies.setCustomGasLimit.resetHistory() }) - describe('hideGasButtonGroup()', () => { - it('should dispatch a hideGasButtonGroup action', () => { + describe('hideGasButtonGroup()', function () { + it('should dispatch a hideGasButtonGroup action', function () { mapDispatchToPropsObject.hideGasButtonGroup() assert(dispatchSpy.calledOnce) assert(sendActionSpies.hideGasButtonGroup.calledOnce) }) }) - describe('cancelAndClose()', () => { - it('should dispatch a hideModal action', () => { + describe('cancelAndClose()', function () { + it('should dispatch a hideModal action', function () { mapDispatchToPropsObject.cancelAndClose() assert(dispatchSpy.calledTwice) assert(actionSpies.hideModal.calledOnce) @@ -288,36 +284,33 @@ describe('gas-modal-page-container container', () => { }) }) - describe('updateCustomGasPrice()', () => { - it('should dispatch a setCustomGasPrice action with the arg passed to updateCustomGasPrice hex prefixed', () => { + describe('updateCustomGasPrice()', function () { + it('should dispatch a setCustomGasPrice action with the arg passed to updateCustomGasPrice hex prefixed', function () { mapDispatchToPropsObject.updateCustomGasPrice('ffff') assert(dispatchSpy.calledOnce) assert(gasActionSpies.setCustomGasPrice.calledOnce) assert.equal(gasActionSpies.setCustomGasPrice.getCall(0).args[0], '0xffff') }) - }) - describe('convertThenUpdateCustomGasPrice()', () => { - it('should dispatch a setCustomGasPrice action with the arg passed to convertThenUpdateCustomGasPrice converted to WEI', () => { - mapDispatchToPropsObject.convertThenUpdateCustomGasPrice('0xffff') + it('should dispatch a setCustomGasPrice action', function () { + mapDispatchToPropsObject.updateCustomGasPrice('0xffff') assert(dispatchSpy.calledOnce) assert(gasActionSpies.setCustomGasPrice.calledOnce) - assert.equal(gasActionSpies.setCustomGasPrice.getCall(0).args[0], '0x3b9a8e653600') + assert.equal(gasActionSpies.setCustomGasPrice.getCall(0).args[0], '0xffff') }) }) - - describe('convertThenUpdateCustomGasLimit()', () => { - it('should dispatch a setCustomGasLimit action with the arg passed to convertThenUpdateCustomGasLimit converted to hex', () => { - mapDispatchToPropsObject.convertThenUpdateCustomGasLimit(16) + describe('updateCustomGasLimit()', function () { + it('should dispatch a setCustomGasLimit action', function () { + mapDispatchToPropsObject.updateCustomGasLimit('0x10') assert(dispatchSpy.calledOnce) assert(gasActionSpies.setCustomGasLimit.calledOnce) assert.equal(gasActionSpies.setCustomGasLimit.getCall(0).args[0], '0x10') }) }) - describe('setGasData()', () => { - it('should dispatch a setGasPrice and setGasLimit action with the correct props', () => { + describe('setGasData()', function () { + it('should dispatch a setGasPrice and setGasLimit action with the correct props', function () { mapDispatchToPropsObject.setGasData('ffff', 'aaaa') assert(dispatchSpy.calledTwice) assert(actionSpies.setGasPrice.calledOnce) @@ -327,8 +320,8 @@ describe('gas-modal-page-container container', () => { }) }) - describe('updateConfirmTxGasAndCalculate()', () => { - it('should dispatch a updateGasAndCalculate action with the correct props', () => { + describe('updateConfirmTxGasAndCalculate()', function () { + it('should dispatch a updateGasAndCalculate action with the correct props', function () { mapDispatchToPropsObject.updateConfirmTxGasAndCalculate('ffff', 'aaaa') assert.equal(dispatchSpy.callCount, 3) assert(actionSpies.setGasPrice.calledOnce) @@ -340,46 +333,46 @@ describe('gas-modal-page-container container', () => { }) - describe('mergeProps', () => { - let stateProps - let dispatchProps - let ownProps + describe('mergeProps', function () { + let stateProps + let dispatchProps + let ownProps - beforeEach(() => { - stateProps = { - gasPriceButtonGroupProps: { - someGasPriceButtonGroupProp: 'foo', - anotherGasPriceButtonGroupProp: 'bar', - }, - isConfirm: true, - someOtherStateProp: 'baz', - transaction: {}, - } - dispatchProps = { - updateCustomGasPrice: sinon.spy(), - hideGasButtonGroup: sinon.spy(), - setGasData: sinon.spy(), - updateConfirmTxGasAndCalculate: sinon.spy(), - someOtherDispatchProp: sinon.spy(), - createSpeedUpTransaction: sinon.spy(), - hideSidebar: sinon.spy(), - hideModal: sinon.spy(), - cancelAndClose: sinon.spy(), - } - ownProps = { someOwnProp: 123 } - }) + beforeEach(function () { + stateProps = { + gasPriceButtonGroupProps: { + someGasPriceButtonGroupProp: 'foo', + anotherGasPriceButtonGroupProp: 'bar', + }, + isConfirm: true, + someOtherStateProp: 'baz', + transaction: {}, + } + dispatchProps = { + updateCustomGasPrice: sinon.spy(), + hideGasButtonGroup: sinon.spy(), + setGasData: sinon.spy(), + updateConfirmTxGasAndCalculate: sinon.spy(), + someOtherDispatchProp: sinon.spy(), + createSpeedUpTransaction: sinon.spy(), + hideSidebar: sinon.spy(), + hideModal: sinon.spy(), + cancelAndClose: sinon.spy(), + } + ownProps = { someOwnProp: 123 } + }) - afterEach(() => { - dispatchProps.updateCustomGasPrice.resetHistory() - dispatchProps.hideGasButtonGroup.resetHistory() - dispatchProps.setGasData.resetHistory() - dispatchProps.updateConfirmTxGasAndCalculate.resetHistory() - dispatchProps.someOtherDispatchProp.resetHistory() - dispatchProps.createSpeedUpTransaction.resetHistory() - dispatchProps.hideSidebar.resetHistory() - dispatchProps.hideModal.resetHistory() - }) - it('should return the expected props when isConfirm is true', () => { + afterEach(function () { + dispatchProps.updateCustomGasPrice.resetHistory() + dispatchProps.hideGasButtonGroup.resetHistory() + dispatchProps.setGasData.resetHistory() + dispatchProps.updateConfirmTxGasAndCalculate.resetHistory() + dispatchProps.someOtherDispatchProp.resetHistory() + dispatchProps.createSpeedUpTransaction.resetHistory() + dispatchProps.hideSidebar.resetHistory() + dispatchProps.hideModal.resetHistory() + }) + it('should return the expected props when isConfirm is true', function () { const result = mergeProps(stateProps, dispatchProps, ownProps) assert.equal(result.isConfirm, true) @@ -409,8 +402,8 @@ describe('gas-modal-page-container container', () => { assert.equal(dispatchProps.someOtherDispatchProp.callCount, 1) }) - it('should return the expected props when isConfirm is false', () => { - const result = mergeProps(Object.assign({}, stateProps, { isConfirm: false }), dispatchProps, ownProps) + it('should return the expected props when isConfirm is false', function () { + const result = mergeProps({ ...stateProps, isConfirm: false }, dispatchProps, ownProps) assert.equal(result.isConfirm, false) assert.equal(result.someOtherStateProp, 'baz') @@ -440,8 +433,8 @@ describe('gas-modal-page-container container', () => { assert.equal(dispatchProps.someOtherDispatchProp.callCount, 1) }) - it('should dispatch the expected actions from obSubmit when isConfirm is false and isSpeedUp is true', () => { - const result = mergeProps(Object.assign({}, stateProps, { isSpeedUp: true, isConfirm: false }), dispatchProps, ownProps) + it('should dispatch the expected actions from obSubmit when isConfirm is false and isSpeedUp is true', function () { + const result = mergeProps({ ...stateProps, isSpeedUp: true, isConfirm: false }, dispatchProps, ownProps) result.onSubmit() diff --git a/ui/app/components/app/gas-customization/gas-price-button-group/gas-price-button-group.component.js b/ui/app/components/app/gas-customization/gas-price-button-group/gas-price-button-group.component.js index 14952a49ab7f..77c098983cf0 100644 --- a/ui/app/components/app/gas-customization/gas-price-button-group/gas-price-button-group.component.js +++ b/ui/app/components/app/gas-customization/gas-price-button-group/gas-price-button-group.component.js @@ -2,9 +2,10 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' import ButtonGroup from '../../../ui/button-group' import Button from '../../../ui/button' +import { GAS_ESTIMATE_TYPES } from '../../../../helpers/constants/common' const GAS_OBJECT_PROPTYPES_SHAPE = { - label: PropTypes.string, + gasEstimateType: PropTypes.oneOf(Object.values(GAS_ESTIMATE_TYPES)).isRequired, feeInPrimaryCurrency: PropTypes.string, feeInSecondaryCurrency: PropTypes.string, timeEstimate: PropTypes.string, @@ -27,8 +28,19 @@ export default class GasPriceButtonGroup extends Component { showCheck: PropTypes.bool, } + gasEstimateTypeLabel (gasEstimateType) { + if (gasEstimateType === GAS_ESTIMATE_TYPES.SLOW) { + return this.context.t('slow') + } else if (gasEstimateType === GAS_ESTIMATE_TYPES.AVERAGE) { + return this.context.t('average') + } else if (gasEstimateType === GAS_ESTIMATE_TYPES.FAST) { + return this.context.t('fast') + } + throw new Error(`Unrecognized gas estimate type: ${gasEstimateType}`) + } + renderButtonContent ({ - labelKey, + gasEstimateType, feeInPrimaryCurrency, feeInSecondaryCurrency, timeEstimate, @@ -36,13 +48,15 @@ export default class GasPriceButtonGroup extends Component { className, showCheck, }) { - return (
    - { labelKey &&
    { this.context.t(labelKey) }
    } - { timeEstimate &&
    { timeEstimate }
    } - { feeInPrimaryCurrency &&
    { feeInPrimaryCurrency }
    } - { feeInSecondaryCurrency &&
    { feeInSecondaryCurrency }
    } - { showCheck &&
    } -
    ) + return ( +
    + { gasEstimateType &&
    { this.gasEstimateTypeLabel(gasEstimateType) }
    } + { timeEstimate &&
    { timeEstimate }
    } + { feeInPrimaryCurrency &&
    { feeInPrimaryCurrency }
    } + { feeInSecondaryCurrency &&
    { feeInSecondaryCurrency }
    } + { showCheck &&
    } +
    + ) } renderButton ({ @@ -74,16 +88,18 @@ export default class GasPriceButtonGroup extends Component { } = this.props return ( - !buttonDataLoading - ? - { gasButtonInfo.map((obj, index) => this.renderButton(obj, buttonPropsAndFlags, index)) } - - :
    { this.context.t('loading') }
    + buttonDataLoading + ?
    {this.context.t('loading')}
    + : ( + + {gasButtonInfo.map((obj, index) => this.renderButton(obj, buttonPropsAndFlags, index))} + + ) ) } } diff --git a/ui/app/components/app/gas-customization/gas-price-button-group/index.scss b/ui/app/components/app/gas-customization/gas-price-button-group/index.scss index 92b4aba425e8..2d4ab5f82e09 100644 --- a/ui/app/components/app/gas-customization/gas-price-button-group/index.scss +++ b/ui/app/components/app/gas-customization/gas-price-button-group/index.scss @@ -22,7 +22,8 @@ height: 130px; } - .button-group__button, .button-group__button--active { + .button-group__button, + .button-group__button--active { height: 130px; max-width: 108px; font-size: 12px; @@ -49,14 +50,14 @@ } .button-group__button--active { - border: 2px solid $curious-blue; + border: 2px solid $primary-blue; color: $scorpion; i { &:last-child { display: flex; - color: $curious-blue; - margin-top: 8px + color: $primary-blue; + margin-top: 8px; } } } @@ -109,7 +110,8 @@ height: 54px; } - .button-group__button, .button-group__button--active { + .button-group__button, + .button-group__button--active { background: white; color: $scorpion; padding: 0 4px; @@ -135,8 +137,8 @@ i { &:last-child { display: flex; - color: $curious-blue; - margin-top: 10px + color: $primary-blue; + margin-top: 10px; } } } @@ -181,19 +183,20 @@ color: $black; } - .button-group__button, .button-group__button--active { + .button-group__button, + .button-group__button--active { height: 78px; background: white; - color: #2A4055; + color: #2a4055; width: 108px; height: 97px; - box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.151579); + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.151579); border-radius: 6px; border: none; div { display: flex; - flex-flow: column;; + flex-flow: column; align-items: flex-start; justify-content: flex-start; position: relative; @@ -213,8 +216,8 @@ } .button-group__button--active { - background: #F7FCFF; - border: 2px solid #2C8BDC; + background: #f7fcff; + border: 2px solid #2c8bdc; .button-check-wrapper { height: 16px; @@ -223,7 +226,7 @@ position: absolute; top: -11px; right: -10px; - background: #D5ECFA; + background: #d5ecfa; display: flex; flex-flow: row; justify-content: center; @@ -232,7 +235,7 @@ i { display: flex; - color: $curious-blue; + color: $primary-blue; font-size: 12px; } } diff --git a/ui/app/components/app/gas-customization/gas-price-button-group/tests/gas-price-button-group-component.test.js b/ui/app/components/app/gas-customization/gas-price-button-group/tests/gas-price-button-group-component.test.js index 37840a8a54a9..4cd44066ca3d 100644 --- a/ui/app/components/app/gas-customization/gas-price-button-group/tests/gas-price-button-group-component.test.js +++ b/ui/app/components/app/gas-customization/gas-price-button-group/tests/gas-price-button-group-component.test.js @@ -1,70 +1,72 @@ -import React from 'react' import assert from 'assert' -import shallow from '../../../../../../lib/shallow-with-context' +import React from 'react' import sinon from 'sinon' +import shallow from '../../../../../../lib/shallow-with-context' import GasPriceButtonGroup from '../gas-price-button-group.component' import ButtonGroup from '../../../../ui/button-group' -const mockGasPriceButtonGroupProps = { - buttonDataLoading: false, - className: 'gas-price-button-group', - gasButtonInfo: [ - { - feeInPrimaryCurrency: '$0.52', - feeInSecondaryCurrency: '0.0048 ETH', - timeEstimate: '~ 1 min 0 sec', - priceInHexWei: '0xa1b2c3f', - }, - { - feeInPrimaryCurrency: '$0.39', - feeInSecondaryCurrency: '0.004 ETH', - timeEstimate: '~ 1 min 30 sec', - priceInHexWei: '0xa1b2c39', - }, - { - feeInPrimaryCurrency: '$0.30', - feeInSecondaryCurrency: '0.00354 ETH', - timeEstimate: '~ 2 min 1 sec', - priceInHexWei: '0xa1b2c30', - }, - ], - handleGasPriceSelection: sinon.spy(), - noButtonActiveByDefault: true, - defaultActiveButtonIndex: 2, - showCheck: true, -} - -const mockButtonPropsAndFlags = Object.assign({}, { - className: mockGasPriceButtonGroupProps.className, - handleGasPriceSelection: mockGasPriceButtonGroupProps.handleGasPriceSelection, - showCheck: mockGasPriceButtonGroupProps.showCheck, -}) - -sinon.spy(GasPriceButtonGroup.prototype, 'renderButton') -sinon.spy(GasPriceButtonGroup.prototype, 'renderButtonContent') - describe('GasPriceButtonGroup Component', function () { + let mockButtonPropsAndFlags + let mockGasPriceButtonGroupProps let wrapper - beforeEach(() => { - wrapper = shallow() + beforeEach(function () { + mockGasPriceButtonGroupProps = { + buttonDataLoading: false, + className: 'gas-price-button-group', + gasButtonInfo: [ + { + feeInPrimaryCurrency: '$0.52', + feeInSecondaryCurrency: '0.0048 ETH', + timeEstimate: '~ 1 min 0 sec', + priceInHexWei: '0xa1b2c3f', + }, + { + feeInPrimaryCurrency: '$0.39', + feeInSecondaryCurrency: '0.004 ETH', + timeEstimate: '~ 1 min 30 sec', + priceInHexWei: '0xa1b2c39', + }, + { + feeInPrimaryCurrency: '$0.30', + feeInSecondaryCurrency: '0.00354 ETH', + timeEstimate: '~ 2 min 1 sec', + priceInHexWei: '0xa1b2c30', + }, + ], + handleGasPriceSelection: sinon.spy(), + noButtonActiveByDefault: true, + defaultActiveButtonIndex: 2, + showCheck: true, + } + + mockButtonPropsAndFlags = { + className: mockGasPriceButtonGroupProps.className, + handleGasPriceSelection: mockGasPriceButtonGroupProps.handleGasPriceSelection, + showCheck: mockGasPriceButtonGroupProps.showCheck, + } + + sinon.spy(GasPriceButtonGroup.prototype, 'renderButton') + sinon.spy(GasPriceButtonGroup.prototype, 'renderButtonContent') + + wrapper = shallow(( + + )) }) - afterEach(() => { - GasPriceButtonGroup.prototype.renderButton.resetHistory() - GasPriceButtonGroup.prototype.renderButtonContent.resetHistory() - mockGasPriceButtonGroupProps.handleGasPriceSelection.resetHistory() + afterEach(function () { + sinon.restore() }) - describe('render', () => { - it('should render a ButtonGroup', () => { + describe('render', function () { + it('should render a ButtonGroup', function () { assert(wrapper.is(ButtonGroup)) }) - it('should render the correct props on the ButtonGroup', () => { + it('should render the correct props on the ButtonGroup', function () { const { className, defaultActiveButtonIndex, @@ -75,25 +77,25 @@ describe('GasPriceButtonGroup Component', function () { assert.equal(noButtonActiveByDefault, true) }) - function renderButtonArgsTest (i, mockButtonPropsAndFlags) { + function renderButtonArgsTest (i, mockPropsAndFlags) { assert.deepEqual( GasPriceButtonGroup.prototype.renderButton.getCall(i).args, [ - Object.assign({}, mockGasPriceButtonGroupProps.gasButtonInfo[i]), - mockButtonPropsAndFlags, + { ...mockGasPriceButtonGroupProps.gasButtonInfo[i] }, + mockPropsAndFlags, i, - ] + ], ) } - it('should call this.renderButton 3 times, with the correct args', () => { + it('should call this.renderButton 3 times, with the correct args', function () { assert.equal(GasPriceButtonGroup.prototype.renderButton.callCount, 3) renderButtonArgsTest(0, mockButtonPropsAndFlags) renderButtonArgsTest(1, mockButtonPropsAndFlags) renderButtonArgsTest(2, mockButtonPropsAndFlags) }) - it('should show loading if buttonDataLoading', () => { + it('should show loading if buttonDataLoading', function () { wrapper.setProps({ buttonDataLoading: true }) assert(wrapper.is('div')) assert(wrapper.hasClass('gas-price-button-group__loading-container')) @@ -101,33 +103,33 @@ describe('GasPriceButtonGroup Component', function () { }) }) - describe('renderButton', () => { + describe('renderButton', function () { let wrappedRenderButtonResult - beforeEach(() => { + beforeEach(function () { GasPriceButtonGroup.prototype.renderButtonContent.resetHistory() const renderButtonResult = GasPriceButtonGroup.prototype.renderButton( - Object.assign({}, mockGasPriceButtonGroupProps.gasButtonInfo[0]), - mockButtonPropsAndFlags + { ...mockGasPriceButtonGroupProps.gasButtonInfo[0] }, + mockButtonPropsAndFlags, ) wrappedRenderButtonResult = shallow(renderButtonResult) }) - it('should render a button', () => { + it('should render a button', function () { assert.equal(wrappedRenderButtonResult.type(), 'button') }) - it('should call the correct method when clicked', () => { + it('should call the correct method when clicked', function () { assert.equal(mockGasPriceButtonGroupProps.handleGasPriceSelection.callCount, 0) wrappedRenderButtonResult.props().onClick() assert.equal(mockGasPriceButtonGroupProps.handleGasPriceSelection.callCount, 1) assert.deepEqual( mockGasPriceButtonGroupProps.handleGasPriceSelection.getCall(0).args, - [mockGasPriceButtonGroupProps.gasButtonInfo[0].priceInHexWei] + [mockGasPriceButtonGroupProps.gasButtonInfo[0].priceInHexWei], ) }) - it('should call this.renderButtonContent with the correct args', () => { + it('should call this.renderButtonContent with the correct args', function () { assert.equal(GasPriceButtonGroup.prototype.renderButtonContent.callCount, 1) const { feeInPrimaryCurrency, @@ -150,24 +152,24 @@ describe('GasPriceButtonGroup Component', function () { showCheck, className, }, - ] + ], ) }) }) - describe('renderButtonContent', () => { - it('should render a label if passed a labelKey', () => { + describe('renderButtonContent', function () { + it('should render a label if passed a gasEstimateType', function () { const renderButtonContentResult = wrapper.instance().renderButtonContent({ - labelKey: 'mockLabelKey', + gasEstimateType: 'SLOW', }, { className: 'someClass', }) const wrappedRenderButtonContentResult = shallow(renderButtonContentResult) assert.equal(wrappedRenderButtonContentResult.childAt(0).children().length, 1) - assert.equal(wrappedRenderButtonContentResult.find('.someClass__label').text(), 'mockLabelKey') + assert.equal(wrappedRenderButtonContentResult.find('.someClass__label').text(), 'slow') }) - it('should render a feeInPrimaryCurrency if passed a feeInPrimaryCurrency', () => { + it('should render a feeInPrimaryCurrency if passed a feeInPrimaryCurrency', function () { const renderButtonContentResult = GasPriceButtonGroup.prototype.renderButtonContent({ feeInPrimaryCurrency: 'mockFeeInPrimaryCurrency', }, { @@ -178,7 +180,7 @@ describe('GasPriceButtonGroup Component', function () { assert.equal(wrappedRenderButtonContentResult.find('.someClass__primary-currency').text(), 'mockFeeInPrimaryCurrency') }) - it('should render a feeInSecondaryCurrency if passed a feeInSecondaryCurrency', () => { + it('should render a feeInSecondaryCurrency if passed a feeInSecondaryCurrency', function () { const renderButtonContentResult = GasPriceButtonGroup.prototype.renderButtonContent({ feeInSecondaryCurrency: 'mockFeeInSecondaryCurrency', }, { @@ -189,7 +191,7 @@ describe('GasPriceButtonGroup Component', function () { assert.equal(wrappedRenderButtonContentResult.find('.someClass__secondary-currency').text(), 'mockFeeInSecondaryCurrency') }) - it('should render a timeEstimate if passed a timeEstimate', () => { + it('should render a timeEstimate if passed a timeEstimate', function () { const renderButtonContentResult = GasPriceButtonGroup.prototype.renderButtonContent({ timeEstimate: 'mockTimeEstimate', }, { @@ -200,7 +202,7 @@ describe('GasPriceButtonGroup Component', function () { assert.equal(wrappedRenderButtonContentResult.find('.someClass__time-estimate').text(), 'mockTimeEstimate') }) - it('should render a check if showCheck is true', () => { + it('should render a check if showCheck is true', function () { const renderButtonContentResult = GasPriceButtonGroup.prototype.renderButtonContent({}, { className: 'someClass', showCheck: true, @@ -209,9 +211,9 @@ describe('GasPriceButtonGroup Component', function () { assert.equal(wrappedRenderButtonContentResult.find('.fa-check').length, 1) }) - it('should render all elements if all args passed', () => { + it('should render all elements if all args passed', function () { const renderButtonContentResult = wrapper.instance().renderButtonContent({ - labelKey: 'mockLabel', + gasEstimateType: 'SLOW', feeInPrimaryCurrency: 'mockFeeInPrimaryCurrency', feeInSecondaryCurrency: 'mockFeeInSecondaryCurrency', timeEstimate: 'mockTimeEstimate', @@ -223,8 +225,7 @@ describe('GasPriceButtonGroup Component', function () { assert.equal(wrappedRenderButtonContentResult.children().length, 5) }) - - it('should render no elements if all args passed', () => { + it('should render no elements if all args passed', function () { const renderButtonContentResult = GasPriceButtonGroup.prototype.renderButtonContent({}, {}) const wrappedRenderButtonContentResult = shallow(renderButtonContentResult) assert.equal(wrappedRenderButtonContentResult.children().length, 0) diff --git a/ui/app/components/app/gas-customization/gas-price-chart/gas-price-chart.component.js b/ui/app/components/app/gas-customization/gas-price-chart/gas-price-chart.component.js index c0eaf485269f..ef5f9e074601 100644 --- a/ui/app/components/app/gas-customization/gas-price-chart/gas-price-chart.component.js +++ b/ui/app/components/app/gas-customization/gas-price-chart/gas-price-chart.component.js @@ -8,7 +8,7 @@ import { hideDataUI, setTickPosition, handleMouseMove, -} from './gas-price-chart.utils.js' +} from './gas-price-chart.utils' export default class GasPriceChart extends Component { static contextTypes = { @@ -24,14 +24,15 @@ export default class GasPriceChart extends Component { updateCustomGasPrice: PropTypes.func, } - renderChart ({ - currentPrice, - gasPrices, - estimatedTimes, - gasPricesMax, - estimatedTimesMax, - updateCustomGasPrice, - }) { + renderChart () { + const { + currentPrice, + gasPrices, + estimatedTimes, + gasPricesMax, + estimatedTimesMax, + updateCustomGasPrice, + } = this.props const chart = generateChart(gasPrices, estimatedTimes, gasPricesMax, estimatedTimesMax, this.context.t) setTimeout(function () { setTickPosition('y', 0, -5, 8) @@ -43,9 +44,9 @@ export default class GasPriceChart extends Component { const { x: yAxisX } = getCoordinateData('.c3-axis-y-label') const { x: tickX } = getCoordinateData('.c3-axis-x .tick') - d3.select('.c3-axis-x .tick').attr('transform', 'translate(' + (domainX - tickX) / 2 + ', 0)') + d3.select('.c3-axis-x .tick').attr('transform', `translate(${(domainX - tickX) / 2}, 0)`) d3.select('.c3-axis-x-label').attr('transform', 'translate(0,-15)') - d3.select('.c3-axis-y-label').attr('transform', 'translate(' + (domainX - yAxisX - 12) + ', 2) rotate(-90)') + d3.select('.c3-axis-y-label').attr('transform', `translate(${domainX - yAxisX - 12}, 2) rotate(-90)`) d3.select('.c3-xgrid-focus line').attr('y2', 98) d3.select('.c3-chart').on('mouseout', () => { @@ -95,7 +96,7 @@ export default class GasPriceChart extends Component { } componentDidMount () { - this.renderChart(this.props) + this.renderChart() } render () { diff --git a/ui/app/components/app/gas-customization/gas-price-chart/gas-price-chart.utils.js b/ui/app/components/app/gas-customization/gas-price-chart/gas-price-chart.utils.js index 55512ce0990f..ff6dd9390ee5 100644 --- a/ui/app/components/app/gas-customization/gas-price-chart/gas-price-chart.utils.js +++ b/ui/app/components/app/gas-customization/gas-price-chart/gas-price-chart.utils.js @@ -1,11 +1,12 @@ import * as d3 from 'd3' import c3 from 'c3' -import BigNumber from 'bignumber.js' - -const newBigSigDig = n => (new BigNumber(n.toPrecision(15))) -const createOp = (a, b, op) => (newBigSigDig(a))[op](newBigSigDig(b)) -const bigNumMinus = (a = 0, b = 0) => createOp(a, b, 'minus') -const bigNumDiv = (a = 0, b = 1) => createOp(a, b, 'div') +import { + extrapolateY, + getAdjacentGasPrices, + newBigSigDig, + bigNumMinus, + bigNumDiv, +} from '../../../../helpers/utils/gas-time-estimates.util' export function handleMouseMove ({ xMousePos, chartXStart, chartWidth, gasPrices, estimatedTimes, chart }) { const { currentPosValue, newTimeEstimate } = getNewXandTimeEstimate({ @@ -66,25 +67,6 @@ export function handleChartUpdate ({ chart, gasPrices, newPrice, cssId }) { } } -export function getAdjacentGasPrices ({ gasPrices, priceToPosition }) { - const closestLowerValueIndex = gasPrices.findIndex((e, i, a) => e <= priceToPosition && a[i + 1] >= priceToPosition) - const closestHigherValueIndex = gasPrices.findIndex((e) => e > priceToPosition) - return { - closestLowerValueIndex, - closestHigherValueIndex, - closestHigherValue: gasPrices[closestHigherValueIndex], - closestLowerValue: gasPrices[closestLowerValueIndex], - } -} - -export function extrapolateY ({ higherY = 0, lowerY = 0, higherX = 0, lowerX = 0, xForExtrapolation = 0 }) { - const slope = bigNumMinus(higherY, lowerY).div(bigNumMinus(higherX, lowerX)) - const newTimeEstimate = slope.times(bigNumMinus(higherX, xForExtrapolation)).minus(newBigSigDig(higherY)).negated() - - return newTimeEstimate.toNumber() -} - - export function getNewXandTimeEstimate ({ xMousePos, chartXStart, chartWidth, gasPrices, estimatedTimes }) { const chartMouseXPos = bigNumMinus(xMousePos, chartXStart) const posPercentile = bigNumDiv(chartMouseXPos, chartWidth) @@ -142,9 +124,10 @@ export function setTickPosition (axis, n, newPosition, secondNewPosition) { .style('visibility', 'visible') } +/* eslint-disable babel/no-invalid-this */ export function appendOrUpdateCircle ({ data, itemIndex, cx, cy, cssId, appendOnly }) { const circle = this.main - .select('.c3-selected-circles' + this.getTargetSelectorSuffix(data.id)) + .select(`.c3-selected-circles${this.getTargetSelectorSuffix(data.id)}`) .selectAll(`.c3-selected-circle-${itemIndex}`) if (appendOnly || circle.empty()) { @@ -162,6 +145,7 @@ export function appendOrUpdateCircle ({ data, itemIndex, cx, cy, cssId, appendOn .attr('cy', cy) } } +/* eslint-enable babel/no-invalid-this */ export function setSelectedCircle ({ chart, @@ -181,7 +165,7 @@ export function setSelectedCircle ({ while (lowerX === higherX) { higherX = getCoordinateData(`.c3-circle-${count}`).x higherY = getCoordinateData(`.c3-circle-${count}`).y - count++ + count += 1 } } @@ -194,11 +178,10 @@ export function setSelectedCircle ({ chart.internal.selectPoint( generateDataUIObj(currentX.toNumber(), numberOfValues, newTimeEstimate), - numberOfValues + numberOfValues, ) } - export function generateChart (gasPrices, estimatedTimes, gasPricesMax, estimatedTimesMax) { const gasPricesMaxPadded = gasPricesMax + 1 const chart = c3.generate({ @@ -208,19 +191,19 @@ export function generateChart (gasPrices, estimatedTimes, gasPricesMax, estimate transition: { duration: 0, }, - padding: {left: 20, right: 15, top: 6, bottom: 10}, + padding: { left: 20, right: 15, top: 6, bottom: 10 }, data: { - x: 'x', - columns: [ - ['x', ...gasPrices], - ['data1', ...estimatedTimes], - ], - types: { - data1: 'area', - }, - selection: { - enabled: false, - }, + x: 'x', + columns: [ + ['x', ...gasPrices], + ['data1', ...estimatedTimes], + ], + types: { + data1: 'area', + }, + selection: { + enabled: false, + }, }, color: { data1: '#259de5', @@ -232,16 +215,18 @@ export function generateChart (gasPrices, estimatedTimes, gasPricesMax, estimate tick: { values: [Math.floor(gasPrices[0]), Math.ceil(gasPricesMax)], outer: false, - format: function (val) { return val + ' GWEI' }, + format (val) { + return `${val} GWEI` + }, }, - padding: {left: gasPricesMax / 50, right: gasPricesMax / 50}, + padding: { left: gasPricesMax / 50, right: gasPricesMax / 50 }, label: { text: 'Gas Price ($)', position: 'outer-center', }, }, y: { - padding: {top: 7, bottom: 7}, + padding: { top: 7, bottom: 7 }, tick: { values: [Math.floor(estimatedTimesMax * 0.05), Math.ceil(estimatedTimesMax * 0.97)], outer: false, @@ -254,13 +239,13 @@ export function generateChart (gasPrices, estimatedTimes, gasPricesMax, estimate }, }, legend: { - show: false, + show: false, }, grid: { - x: {}, - lines: { - front: false, - }, + x: {}, + lines: { + front: false, + }, }, point: { focus: { @@ -274,17 +259,17 @@ export function generateChart (gasPrices, estimatedTimes, gasPricesMax, estimate format: { title: (v) => v.toPrecision(4), }, - contents: function (d) { + contents (d) { const titleFormat = this.config.tooltip_format_title let text - d.forEach(el => { + d.forEach((el) => { if (el && (el.value || el.value === 0) && !text) { - text = "" + "' + text = `
    " + titleFormat(el.x) + '
    ` } }) - return text + '
    ${titleFormat(el.x)}
    ' + "
    " + return `${text}
    ` }, - position: function () { + position () { if (d3.select('#overlayed-circle').empty()) { return { top: -100, left: -100 } } @@ -296,8 +281,8 @@ export function generateChart (gasPrices, estimatedTimes, gasPricesMax, estimate const flipTooltip = circleY - circleWidth < chartYStart + 5 d3 - .select('.tooltip-arrow') - .style('margin-top', flipTooltip ? '-16px' : '4px') + .select('.tooltip-arrow') + .style('margin-top', flipTooltip ? '-16px' : '4px') return { top: bigNumMinus(circleY, chartYStart).minus(19).plus(flipTooltip ? circleWidth + 38 : 0).toNumber(), @@ -338,7 +323,7 @@ export function generateChart (gasPrices, estimatedTimes, gasPricesMax, estimate if (dataToShow.length) { this.tooltip.html( - this.config.tooltip_contents.call(this, selectedData, this.axis.getXAxisTickFormat(), this.getYFormat(), this.color) + this.config.tooltip_contents.call(this, selectedData, this.axis.getXAxisTickFormat(), this.getYFormat(), this.color), ).style('display', 'flex') // Get tooltip dimensions @@ -346,7 +331,7 @@ export function generateChart (gasPrices, estimatedTimes, gasPricesMax, estimate const tHeight = this.tooltip.property('offsetHeight') const position = this.config.tooltip_position.call(this, dataToShow, tWidth, tHeight, element) // Set tooltip - this.tooltip.style('top', position.top + 'px').style('left', position.left + 'px') + this.tooltip.style('top', `${position.top}px`).style('left', `${position.left}px`) } } diff --git a/ui/app/components/app/gas-customization/gas-price-chart/index.scss b/ui/app/components/app/gas-customization/gas-price-chart/index.scss index 097543104cb4..774760cffd7c 100644 --- a/ui/app/components/app/gas-customization/gas-price-chart/index.scss +++ b/ui/app/components/app/gas-customization/gas-price-chart/index.scss @@ -14,14 +14,15 @@ } } - .tick text, .c3-axis-x-label, .c3-axis-y-label { - font-family: Roboto; + .tick text, + .c3-axis-x-label, + .c3-axis-y-label { font-style: normal; font-weight: bold; line-height: normal; font-size: 8px; text-align: center; - fill: #9A9CA6 !important; + fill: #9a9ca6 !important; } .c3-tooltip-container { @@ -32,7 +33,7 @@ .custom-tooltip { background: rgba(0, 0, 0, 1); - box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); + box-shadow: 0 4px 4px rgba(0, 0, 0, 0.25); border-radius: 3px; opacity: 1 !important; height: 21px; @@ -41,7 +42,7 @@ .tooltip-arrow { background: black; - box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.5); + box-shadow: 0 4px 4px rgba(0, 0, 0, 0.5); -webkit-transform: rotate(45deg); transform: rotate(45deg); opacity: 1 !important; @@ -51,33 +52,35 @@ } .custom-tooltip th { - font-family: Roboto; font-style: normal; font-weight: 500; line-height: normal; font-size: 10px; text-align: center; padding: 3px; - color: #FFFFFF; + color: #fff; } .c3-circle { visibility: hidden; } - .c3-selected-circle, .c3-circle._expanded_ { - fill: #FFFFFF !important; + .c3-selected-circle, + .c3-circle._expanded_ { + fill: #fff !important; stroke-width: 2.4px !important; stroke: #2d9fd9 !important; + /* visibility: visible; */ } #set-circle { - fill: #313A5E !important; - stroke: #313A5E !important; + fill: #313a5e !important; + stroke: #313a5e !important; } - .c3-axis-x-label, .c3-axis-y-label { + .c3-axis-x-label, + .c3-axis-y-label { font-weight: normal; } @@ -91,8 +94,8 @@ .c3-line-data1 { stroke: #2d9fd9 !important; - background: rgba(0,0,0,0) !important; - color: rgba(0,0,0,0) !important; + background: rgba(0, 0, 0, 0) !important; + color: rgba(0, 0, 0, 0) !important; } .c3 path { @@ -105,7 +108,7 @@ } .c3-xgrid-line line { - stroke: #B8B8B8 !important; + stroke: #b8b8b8 !important; } .c3-xgrid-focus { @@ -119,7 +122,7 @@ .c3-axis-y .domain { fill: none; - stroke: #C8CCD6; + stroke: #c8ccd6; } .c3-event-rect { @@ -128,5 +131,5 @@ } #chart { - background: #F8F9FB + background: #f8f9fb; } diff --git a/ui/app/components/app/gas-customization/gas-price-chart/tests/gas-price-chart.component.test.js b/ui/app/components/app/gas-customization/gas-price-chart/tests/gas-price-chart.component.test.js index c960f49a7a52..d95fa63a1ad6 100644 --- a/ui/app/components/app/gas-customization/gas-price-chart/tests/gas-price-chart.component.test.js +++ b/ui/app/components/app/gas-customization/gas-price-chart/tests/gas-price-chart.component.test.js @@ -1,9 +1,9 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import proxyquire from 'proxyquire' import sinon from 'sinon' -import shallow from '../../../../../../lib/shallow-with-context' import * as d3 from 'd3' +import shallow from '../../../../../../lib/shallow-with-context' function timeout (time) { return new Promise((resolve) => { @@ -11,104 +11,111 @@ function timeout (time) { }) } -const propsMethodSpies = { - updateCustomGasPrice: sinon.spy(), -} - -const selectReturnSpies = { - empty: sinon.spy(), - remove: sinon.spy(), - style: sinon.spy(), - select: d3.select, - attr: sinon.spy(), - on: sinon.spy(), - datum: sinon.stub().returns({ x: 'mockX' }), -} - -const mockSelectReturn = { - ...d3.select('div'), - node: () => ({ - getBoundingClientRect: () => ({ x: 123, y: 321, width: 400 }), - }), - ...selectReturnSpies, -} - -const gasPriceChartUtilsSpies = { - appendOrUpdateCircle: sinon.spy(), - generateChart: sinon.stub().returns({ mockChart: true }), - generateDataUIObj: sinon.spy(), - getAdjacentGasPrices: sinon.spy(), - getCoordinateData: sinon.stub().returns({ x: 'mockCoordinateX', width: 'mockWidth' }), - getNewXandTimeEstimate: sinon.spy(), - handleChartUpdate: sinon.spy(), - hideDataUI: sinon.spy(), - setSelectedCircle: sinon.spy(), - setTickPosition: sinon.spy(), - handleMouseMove: sinon.spy(), -} - -const testProps = { - gasPrices: [1.5, 2.5, 4, 8], - estimatedTimes: [100, 80, 40, 10], - gasPricesMax: 9, - estimatedTimesMax: '100', - currentPrice: 6, - updateCustomGasPrice: propsMethodSpies.updateCustomGasPrice, -} - -const GasPriceChart = proxyquire('../gas-price-chart.component.js', { - './gas-price-chart.utils.js': gasPriceChartUtilsSpies, - 'd3': { - ...d3, - select: function (...args) { - const result = d3.select(...args) - return result.empty() - ? mockSelectReturn - : result - }, - event: { - clientX: 'mockClientX', - }, - }, -}).default - -sinon.spy(GasPriceChart.prototype, 'renderChart') - describe('GasPriceChart Component', function () { + let GasPriceChart + let gasPriceChartUtilsSpies + let propsMethodSpies + let selectReturnSpies + let testProps let wrapper - beforeEach(() => { + beforeEach(function () { + propsMethodSpies = { + updateCustomGasPrice: sinon.spy(), + } + + selectReturnSpies = { + empty: sinon.spy(), + remove: sinon.spy(), + style: sinon.spy(), + select: d3.select, + attr: sinon.spy(), + on: sinon.spy(), + datum: sinon.stub().returns({ x: 'mockX' }), + } + + const mockSelectReturn = { + ...d3.select('div'), + node: () => ({ + getBoundingClientRect: () => ({ x: 123, y: 321, width: 400 }), + }), + ...selectReturnSpies, + } + + gasPriceChartUtilsSpies = { + appendOrUpdateCircle: sinon.spy(), + generateChart: sinon.stub().returns({ mockChart: true }), + generateDataUIObj: sinon.spy(), + getAdjacentGasPrices: sinon.spy(), + getCoordinateData: sinon.stub().returns({ x: 'mockCoordinateX', width: 'mockWidth' }), + getNewXandTimeEstimate: sinon.spy(), + handleChartUpdate: sinon.spy(), + hideDataUI: sinon.spy(), + setSelectedCircle: sinon.spy(), + setTickPosition: sinon.spy(), + handleMouseMove: sinon.spy(), + } + + testProps = { + gasPrices: [1.5, 2.5, 4, 8], + estimatedTimes: [100, 80, 40, 10], + gasPricesMax: 9, + estimatedTimesMax: 100, + currentPrice: 6, + updateCustomGasPrice: propsMethodSpies.updateCustomGasPrice, + } + + GasPriceChart = proxyquire('../gas-price-chart.component.js', { + './gas-price-chart.utils.js': gasPriceChartUtilsSpies, + 'd3': { + ...d3, + select (...args) { + const result = d3.select(...args) + return result.empty() + ? mockSelectReturn + : result + }, + event: { + clientX: 'mockClientX', + }, + }, + }).default + sinon.spy(GasPriceChart.prototype, 'renderChart') + wrapper = shallow() }) - describe('render()', () => { - it('should render', () => { + afterEach(function () { + sinon.restore() + }) + + describe('render()', function () { + it('should render', function () { assert(wrapper.hasClass('gas-price-chart')) }) - it('should render the chart div', () => { + it('should render the chart div', function () { assert(wrapper.childAt(0).hasClass('gas-price-chart__root')) assert.equal(wrapper.childAt(0).props().id, 'chart') }) }) - describe('componentDidMount', () => { - it('should call this.renderChart with the components props', () => { + describe('componentDidMount', function () { + it('should call this.renderChart', function () { assert(GasPriceChart.prototype.renderChart.callCount, 1) wrapper.instance().componentDidMount() assert(GasPriceChart.prototype.renderChart.callCount, 2) - assert.deepEqual(GasPriceChart.prototype.renderChart.getCall(1).args, [{...testProps}]) }) }) - describe('componentDidUpdate', () => { - it('should call handleChartUpdate if props.currentPrice has changed', () => { + describe('componentDidUpdate', function () { + it('should call handleChartUpdate if props.currentPrice has changed', function () { gasPriceChartUtilsSpies.handleChartUpdate.resetHistory() wrapper.instance().componentDidUpdate({ currentPrice: 7 }) assert.equal(gasPriceChartUtilsSpies.handleChartUpdate.callCount, 1) }) - it('should call handleChartUpdate with the correct props', () => { + it('should call handleChartUpdate with the correct props', function () { gasPriceChartUtilsSpies.handleChartUpdate.resetHistory() wrapper.instance().componentDidUpdate({ currentPrice: 7 }) assert.deepEqual(gasPriceChartUtilsSpies.handleChartUpdate.getCall(0).args, [{ @@ -119,15 +126,15 @@ describe('GasPriceChart Component', function () { }]) }) - it('should not call handleChartUpdate if props.currentPrice has not changed', () => { + it('should not call handleChartUpdate if props.currentPrice has not changed', function () { gasPriceChartUtilsSpies.handleChartUpdate.resetHistory() wrapper.instance().componentDidUpdate({ currentPrice: 6 }) assert.equal(gasPriceChartUtilsSpies.handleChartUpdate.callCount, 0) }) }) - describe('renderChart', () => { - it('should call setTickPosition 4 times, with the expected props', async () => { + describe('renderChart', function () { + it('should call setTickPosition 4 times, with the expected props', async function () { await timeout(0) gasPriceChartUtilsSpies.setTickPosition.resetHistory() assert.equal(gasPriceChartUtilsSpies.setTickPosition.callCount, 0) @@ -140,7 +147,7 @@ describe('GasPriceChart Component', function () { assert.deepEqual(gasPriceChartUtilsSpies.setTickPosition.getCall(3).args, ['x', 1, 3, -8]) }) - it('should call handleChartUpdate with the correct props', async () => { + it('should call handleChartUpdate with the correct props', async function () { await timeout(0) gasPriceChartUtilsSpies.handleChartUpdate.resetHistory() wrapper.instance().renderChart(testProps) @@ -153,7 +160,7 @@ describe('GasPriceChart Component', function () { }]) }) - it('should add three events to the chart', async () => { + it('should add three events to the chart', async function () { await timeout(0) selectReturnSpies.on.resetHistory() assert.equal(selectReturnSpies.on.callCount, 0) @@ -169,7 +176,7 @@ describe('GasPriceChart Component', function () { assert.equal(thirdOnEventArgs[0], 'mousemove') }) - it('should hide the data UI on mouseout', async () => { + it('should hide the data UI on mouseout', async function () { await timeout(0) selectReturnSpies.on.resetHistory() wrapper.instance().renderChart(testProps) @@ -182,7 +189,7 @@ describe('GasPriceChart Component', function () { assert.deepEqual(gasPriceChartUtilsSpies.hideDataUI.getCall(0).args, [{ mockChart: true }, '#overlayed-circle']) }) - it('should updateCustomGasPrice on click', async () => { + it('should updateCustomGasPrice on click', async function () { await timeout(0) selectReturnSpies.on.resetHistory() wrapper.instance().renderChart(testProps) @@ -195,7 +202,7 @@ describe('GasPriceChart Component', function () { assert.equal(propsMethodSpies.updateCustomGasPrice.getCall(0).args[0], 'mockX') }) - it('should handle mousemove', async () => { + it('should handle mousemove', async function () { await timeout(0) selectReturnSpies.on.resetHistory() wrapper.instance().renderChart(testProps) diff --git a/ui/app/components/app/gas-customization/gas-slider/gas-slider.component.js b/ui/app/components/app/gas-customization/gas-slider/gas-slider.component.js index 5836e7dfca2d..1e072d300bf4 100644 --- a/ui/app/components/app/gas-customization/gas-slider/gas-slider.component.js +++ b/ui/app/components/app/gas-customization/gas-slider/gas-slider.component.js @@ -1,7 +1,7 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -export default class AdvancedTabContent extends Component { +export default class GasSlider extends Component { static propTypes = { onChange: PropTypes.func, lowLabel: PropTypes.string, @@ -33,10 +33,10 @@ export default class AdvancedTabContent extends Component { min={min} value={value} id="gasSlider" - onChange={event => onChange(event.target.value)} + onChange={(event) => onChange(event.target.value)} />
    -
    +
    {lowLabel} diff --git a/ui/app/components/app/gas-customization/gas-slider/index.scss b/ui/app/components/app/gas-customization/gas-slider/index.scss index e6c73436753c..aacbea9e62fb 100644 --- a/ui/app/components/app/gas-customization/gas-slider/index.scss +++ b/ui/app/components/app/gas-customization/gas-slider/index.scss @@ -16,8 +16,8 @@ -webkit-appearance: none !important; height: 34px; width: 34px; - background-color: $curious-blue; - box-shadow: 0 2px 4px 0 rgba(0,0,0,0.08); + background-color: $primary-blue; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08); border-radius: 50%; position: relative; z-index: 10; @@ -38,7 +38,7 @@ &__colored { height: 6px; border-radius: 4px; - margin-left: 102px; + margin-left: 102px; width: 322px; z-index: 1; background-color: $blizzard-blue; @@ -51,4 +51,4 @@ margin-top: -6px; color: $mid-gray; } -} \ No newline at end of file +} diff --git a/ui/app/components/app/gas-customization/gas.selectors.js b/ui/app/components/app/gas-customization/gas.selectors.js deleted file mode 100644 index 89374b5f1beb..000000000000 --- a/ui/app/components/app/gas-customization/gas.selectors.js +++ /dev/null @@ -1,14 +0,0 @@ -const selectors = { - getCurrentBlockTime, - getBasicGasEstimateLoadingStatus, -} - -module.exports = selectors - -function getCurrentBlockTime (state) { - return state.gas.currentBlockTime -} - -function getBasicGasEstimateLoadingStatus (state) { - return state.gas.basicEstimateIsLoading -} diff --git a/ui/app/components/app/gas-customization/index.scss b/ui/app/components/app/gas-customization/index.scss index b06c1d044baf..06a9d7820ee9 100644 --- a/ui/app/components/app/gas-customization/index.scss +++ b/ui/app/components/app/gas-customization/index.scss @@ -1,7 +1,4 @@ @import './gas-slider/index'; - @import './gas-modal-page-container/index'; - @import './gas-price-chart/index'; - @import './advanced-gas-inputs/index'; diff --git a/ui/app/components/app/home-notification/home-notification.component.js b/ui/app/components/app/home-notification/home-notification.component.js new file mode 100644 index 000000000000..b17622e79ac0 --- /dev/null +++ b/ui/app/components/app/home-notification/home-notification.component.js @@ -0,0 +1,112 @@ +import React, { PureComponent } from 'react' +import classnames from 'classnames' +import { Tooltip as ReactTippy } from 'react-tippy' +import PropTypes from 'prop-types' +import Button from '../../ui/button' + +export default class HomeNotification extends PureComponent { + static contextTypes = { + metricsEvent: PropTypes.func, + } + + static defaultProps = { + onAccept: null, + ignoreText: null, + onIgnore: null, + infoText: null, + } + + static propTypes = { + acceptText: PropTypes.node.isRequired, + onAccept: PropTypes.func, + ignoreText: PropTypes.node, + onIgnore: PropTypes.func, + descriptionText: PropTypes.node.isRequired, + infoText: PropTypes.node, + classNames: PropTypes.array, + } + + handleAccept = () => { + this.props.onAccept() + } + + handleIgnore = () => { + this.props.onIgnore() + } + + render () { + const { descriptionText, acceptText, onAccept, ignoreText, onIgnore, infoText, classNames = [] } = this.props + + return ( +
    +
    +
    + +
    + { descriptionText } +
    +
    + { + infoText ? ( + + {infoText} +

    + )} + offset={-36} + distance={36} + animation="none" + position="top" + arrow + theme="info" + > + +
    + ) : ( + null + ) + } +
    +
    + { + (onAccept && acceptText) ? ( + + ) : ( + null + ) + } + { + (onIgnore && ignoreText) ? ( + + ) : ( + null + ) + } +
    +
    + ) + } +} diff --git a/ui/app/components/app/home-notification/index.js b/ui/app/components/app/home-notification/index.js new file mode 100644 index 000000000000..918a35be2003 --- /dev/null +++ b/ui/app/components/app/home-notification/index.js @@ -0,0 +1 @@ +export { default } from './home-notification.component' diff --git a/ui/app/components/app/home-notification/index.scss b/ui/app/components/app/home-notification/index.scss new file mode 100644 index 000000000000..56222b454adb --- /dev/null +++ b/ui/app/components/app/home-notification/index.scss @@ -0,0 +1,122 @@ +.tippy-tooltip.info-theme { + background: rgba(36, 41, 46, 0.9); + color: $white; + border-radius: 8px; +} + +.home-notification { + background: rgba(36, 41, 46, 0.9); + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.12); + border-radius: 8px; + min-height: 116px; + padding: 16px; + + @media screen and (min-width: 576px) { + min-width: 472px; + } + + display: flex; + flex-flow: column; + justify-content: space-between; + + &__header-container { + display: flex; + } + + &__header { + display: flex; + align-items: center; + justify-content: space-between; + } + + &__icon { + height: 16px; + align-self: center; + } + + &__text { + font-style: normal; + font-weight: normal; + font-size: 12px; + color: $white; + margin-left: 10px; + margin-right: 8px; + } + + .fa-info-circle { + color: #6a737d; + } + + &__ignore-button { + border: 2px solid #6a737d; + box-sizing: border-box; + border-radius: 6px; + color: $white; + background-color: inherit; + height: 34px; + width: 155px; + padding: 0; + + @media screen and (max-width: 575px) { + width: 135px; + } + + &:hover { + border-color: #6a737d; + background-color: #6a737d; + } + + &:active { + background-color: #141618; + } + } + + &__accept-button { + border: 2px solid #6a737d; + box-sizing: border-box; + border-radius: 6px; + color: $white; + background-color: inherit; + height: 34px; + width: 155px; + padding: 0; + margin-left: 4px; + + @media screen and (max-width: 575px) { + width: 135px; + } + + &:hover { + border-color: #6a737d; + background-color: #6a737d; + } + + &:active { + background-color: #141618; + } + } + + &__buttons { + display: flex; + width: 100%; + margin-top: 10px; + justify-content: flex-start; + flex-direction: row-reverse; + } +} + +.home-notification-tooltip { + &__tooltip-container { + display: flex; + } + + &__content { + font-style: normal; + font-weight: normal; + font-size: 12px; + color: $white; + text-align: left; + display: inline-block; + width: 200px; + } +} diff --git a/ui/app/components/app/index.scss b/ui/app/components/app/index.scss deleted file mode 100644 index e9bb4ac9f2b8..000000000000 --- a/ui/app/components/app/index.scss +++ /dev/null @@ -1,81 +0,0 @@ -@import 'account-menu/index'; - -@import 'add-token-button/index'; - -@import 'app-header/index'; - -@import '../ui/breadcrumbs/index'; - -@import '../ui/button-group/index'; - -@import '../ui/card/index'; - -@import 'confirm-page-container/index'; - -@import '../ui/currency-input/index'; - -@import '../ui/currency-display/index'; - -@import '../ui/error-message/index'; - -@import '../ui/export-text-container/index'; - -@import '../ui/identicon/index'; - -@import 'info-box/index'; - -@import 'menu-bar/index'; - -@import 'modal/index'; - -@import 'modals/index'; - -@import 'network-display/index'; - -@import '../ui/page-container/index'; - -@import '../../pages/index'; - -@import 'provider-page-container/index'; - -@import 'selected-account/index'; - -@import '../ui/sender-to-recipient/index'; - -@import '../ui/tabs/index'; - -@import '../ui/token-balance/index'; - -@import 'transaction-activity-log/index'; - -@import 'transaction-breakdown/index'; - -@import 'transaction-view/index'; - -@import 'transaction-view-balance/index'; - -@import 'transaction-list/index'; - -@import 'transaction-list-item/index'; - -@import 'transaction-list-item-details/index'; - -@import 'transaction-status/index'; - -@import 'app-header/index'; - -@import 'sidebars/index'; - -@import '../ui/unit-input/index'; - -@import 'gas-customization/gas-modal-page-container/index'; - -@import 'gas-customization/gas-modal-page-container/index'; - -@import 'gas-customization/gas-modal-page-container/index'; - -@import 'gas-customization/index'; - -@import 'gas-customization/gas-price-button-group/index'; - -@import 'ui-migration-annoucement/index'; diff --git a/ui/app/components/app/info-box/index.js b/ui/app/components/app/info-box/index.js index 6110422ed026..59b0d294be0e 100644 --- a/ui/app/components/app/info-box/index.js +++ b/ui/app/components/app/info-box/index.js @@ -1,2 +1,3 @@ import InfoBox from './info-box.component' -module.exports = InfoBox + +export default InfoBox diff --git a/ui/app/components/app/info-box/index.scss b/ui/app/components/app/info-box/index.scss index 8b5626d799ad..bad69cd53e68 100644 --- a/ui/app/components/app/info-box/index.scss +++ b/ui/app/components/app/info-box/index.scss @@ -19,6 +19,6 @@ } &__description { - font-size: .75rem; + font-size: 0.75rem; } } diff --git a/ui/app/components/app/info-box/info-box.component.js b/ui/app/components/app/info-box/info-box.component.js index 8688b8e8f59e..163869ef5245 100644 --- a/ui/app/components/app/info-box/info-box.component.js +++ b/ui/app/components/app/info-box/info-box.component.js @@ -12,12 +12,8 @@ export default class InfoBox extends Component { description: PropTypes.string, } - constructor (props) { - super(props) - - this.state = { - isShowing: true, - } + state = { + isShowing: true, } handleClose () { @@ -33,17 +29,17 @@ export default class InfoBox extends Component { render () { const { title, description } = this.props - return !this.state.isShowing - ? null - : ( + return this.state.isShowing + ? (
    this.handleClose()} /> -
    { title }
    -
    { description }
    +
    {title}
    +
    {description}
    ) + : null } } diff --git a/ui/app/components/app/info-box/tests/info-box.test.js b/ui/app/components/app/info-box/tests/info-box.test.js new file mode 100644 index 000000000000..5ad89b4fda60 --- /dev/null +++ b/ui/app/components/app/info-box/tests/info-box.test.js @@ -0,0 +1,37 @@ +import assert from 'assert' +import React from 'react' +import sinon from 'sinon' +import { shallow } from 'enzyme' + +import InfoBox from '..' + +describe('InfoBox', function () { + + let wrapper + + const props = { + title: 'Title', + description: 'Description', + onClose: sinon.spy(), + } + + beforeEach(function () { + wrapper = shallow() + }) + + it('renders title from props', function () { + const title = wrapper.find('.info-box__title') + assert.equal(title.text(), props.title) + }) + + it('renders description from props', function () { + const description = wrapper.find('.info-box__description') + assert.equal(description.text(), props.description) + }) + + it('closes info box', function () { + const close = wrapper.find('.info-box__close') + close.simulate('click') + assert(props.onClose.calledOnce) + }) +}) diff --git a/ui/app/components/app/input-number.js b/ui/app/components/app/input-number.js deleted file mode 100644 index 8a6ec725c386..000000000000 --- a/ui/app/components/app/input-number.js +++ /dev/null @@ -1,81 +0,0 @@ -const Component = require('react').Component -const h = require('react-hyperscript') -const inherits = require('util').inherits -const { - addCurrencies, - conversionGTE, - conversionLTE, - subtractCurrencies, -} = require('../../helpers/utils/conversion-util') - -module.exports = InputNumber - -inherits(InputNumber, Component) -function InputNumber () { - Component.call(this) - - this.setValue = this.setValue.bind(this) -} - -function isValidInput (text) { - const re = /^([1-9]\d*|0)(\.|\.\d*)?$/ - return re.test(text) -} - -function removeLeadingZeroes (str) { - return str.replace(/^0*(?=\d)/, '') -} - -InputNumber.prototype.setValue = function (newValue) { - newValue = removeLeadingZeroes(newValue) - if (newValue && !isValidInput(newValue)) return - const { fixed, min = -1, max = Infinity, onChange } = this.props - - newValue = fixed ? newValue.toFixed(4) : newValue - const newValueGreaterThanMin = conversionGTE( - { value: newValue || '0', fromNumericBase: 'dec' }, - { value: min, fromNumericBase: 'hex' }, - ) - - const newValueLessThanMax = conversionLTE( - { value: newValue || '0', fromNumericBase: 'dec' }, - { value: max, fromNumericBase: 'hex' }, - ) - if (newValueGreaterThanMin && newValueLessThanMax) { - onChange(newValue) - } else if (!newValueGreaterThanMin) { - onChange(min) - } else if (!newValueLessThanMax) { - onChange(max) - } -} - -InputNumber.prototype.render = function () { - const { unitLabel, step = 1, placeholder, value } = this.props - - return h('div.customize-gas-input-wrapper', {}, [ - h('input', { - className: 'customize-gas-input', - value, - placeholder, - type: 'number', - onChange: e => { - this.setValue(e.target.value) - }, - min: 0, - }), - h('span.gas-tooltip-input-detail', {}, [unitLabel]), - h('div.gas-tooltip-input-arrows', {}, [ - h('div.gas-tooltip-input-arrow-wrapper', { - onClick: () => this.setValue(addCurrencies(value, step, { toNumericBase: 'dec' })), - }, [ - h('i.fa.fa-angle-up'), - ]), - h('div.gas-tooltip-input-arrow-wrapper', { - onClick: () => this.setValue(subtractCurrencies(value, step, { toNumericBase: 'dec' })), - }, [ - h('i.fa.fa-angle-down'), - ]), - ]), - ]) -} diff --git a/ui/app/components/app/loading-network-screen/loading-network-screen.component.js b/ui/app/components/app/loading-network-screen/loading-network-screen.component.js index 97b16d08fb57..9b9b966199df 100644 --- a/ui/app/components/app/loading-network-screen/loading-network-screen.component.js +++ b/ui/app/components/app/loading-network-screen/loading-network-screen.component.js @@ -1,7 +1,7 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' -import Spinner from '../../ui/spinner' import Button from '../../ui/button' +import LoadingScreen from '../../ui/loading-screen' export default class LoadingNetworkScreen extends PureComponent { state = { @@ -56,47 +56,38 @@ export default class LoadingNetworkScreen extends PureComponent { return name } - renderMessage = () => { - return { this.getConnectingLabel(this.props.loadingMessage) } - } - - renderLoadingScreenContent = () => { - return
    - - {this.renderMessage()} -
    - } - renderErrorScreenContent = () => { const { showNetworkDropdown, setProviderArgs, setProviderType } = this.props - return
    - 😞 - { this.context.t('somethingWentWrong') } -
    - - - + return ( +
    + 😞 + { this.context.t('somethingWentWrong') } +
    + + + +
    -
    + ) } cancelCall = () => { @@ -125,18 +116,16 @@ export default class LoadingNetworkScreen extends PureComponent { const { lastSelectedProvider, setProviderType } = this.props return ( -
    -
    setProviderType(lastSelectedProvider || 'ropsten')} - /> -
    - { this.state.showErrorScreen - ? this.renderErrorScreenContent() - : this.renderLoadingScreenContent() - } -
    -
    + setProviderType(lastSelectedProvider || 'ropsten')} + /> + )} + showLoadingSpinner={!this.state.showErrorScreen} + loadingMessage={this.state.showErrorScreen ? this.renderErrorScreenContent() : this.getConnectingLabel(this.props.loadingMessage)} + /> ) } } diff --git a/ui/app/components/app/loading-network-screen/loading-network-screen.container.js b/ui/app/components/app/loading-network-screen/loading-network-screen.container.js index 87f1397ce5b6..9c348dab7e5d 100644 --- a/ui/app/components/app/loading-network-screen/loading-network-screen.container.js +++ b/ui/app/components/app/loading-network-screen/loading-network-screen.container.js @@ -1,16 +1,15 @@ import { connect } from 'react-redux' +import * as actions from '../../../store/actions' +import { getNetworkIdentifier } from '../../../selectors' import LoadingNetworkScreen from './loading-network-screen.component' -import actions from '../../../store/actions' -import { getNetworkIdentifier } from '../../../selectors/selectors' -const mapStateToProps = state => { +const mapStateToProps = (state) => { const { loadingMessage, - currentView, + lastSelectedProvider, } = state.appState const { provider, - lastSelectedProvider, network, } = state.metamask const { rpcTarget, chainId, ticker, nickname, type } = provider @@ -20,7 +19,7 @@ const mapStateToProps = state => { : [provider.type] return { - isLoadingNetwork: network === 'loading' && currentView.name !== 'config', + isLoadingNetwork: network === 'loading', loadingMessage, lastSelectedProvider, setProviderArgs, @@ -29,7 +28,7 @@ const mapStateToProps = state => { } } -const mapDispatchToProps = dispatch => { +const mapDispatchToProps = (dispatch) => { return { setProviderType: (type) => { dispatch(actions.setProviderType(type)) diff --git a/ui/app/components/app/menu-bar/account-options-menu.js b/ui/app/components/app/menu-bar/account-options-menu.js new file mode 100644 index 000000000000..241f6dc9212f --- /dev/null +++ b/ui/app/components/app/menu-bar/account-options-menu.js @@ -0,0 +1,151 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { useHistory } from 'react-router-dom' +import { useDispatch, useSelector } from 'react-redux' + +import { showModal } from '../../../store/actions' +import { CONNECTED_ROUTE } from '../../../helpers/constants/routes' +import { Menu, MenuItem } from '../../ui/menu' +import getAccountLink from '../../../../lib/account-link' +import { getCurrentKeyring, getCurrentNetwork, getRpcPrefsForCurrentProvider, getSelectedIdentity } from '../../../selectors' +import { useI18nContext } from '../../../hooks/useI18nContext' +import { useMetricEvent } from '../../../hooks/useMetricEvent' +import { getEnvironmentType } from '../../../../../app/scripts/lib/util' +import { ENVIRONMENT_TYPE_FULLSCREEN } from '../../../../../app/scripts/lib/enums' + +export default function AccountOptionsMenu ({ anchorElement, onClose }) { + const t = useI18nContext() + const dispatch = useDispatch() + const history = useHistory() + const openFullscreenEvent = useMetricEvent({ + eventOpts: { + category: 'Navigation', + action: 'Account Options', + name: 'Clicked Expand View', + }, + }) + const viewAccountDetailsEvent = useMetricEvent({ + eventOpts: { + category: 'Navigation', + action: 'Account Options', + name: 'Viewed Account Details', + }, + }) + const viewOnEtherscanEvent = useMetricEvent({ + eventOpts: { + category: 'Navigation', + action: 'Account Options', + name: 'Clicked View on Etherscan', + }, + }) + const openConnectedSitesEvent = useMetricEvent({ + eventOpts: { + category: 'Navigation', + action: 'Account Options', + name: 'Opened Connected Sites', + }, + }) + + const keyring = useSelector(getCurrentKeyring) + const network = useSelector(getCurrentNetwork) + const rpcPrefs = useSelector(getRpcPrefsForCurrentProvider) + const selectedIdentity = useSelector(getSelectedIdentity) + + const { address } = selectedIdentity + const isRemovable = keyring.type !== 'HD Key Tree' + + return ( + + { + getEnvironmentType() === ENVIRONMENT_TYPE_FULLSCREEN + ? null + : ( + { + openFullscreenEvent() + global.platform.openExtensionInBrowser() + onClose() + }} + iconClassName="fas fa-expand-alt" + > + { t('expandView') } + + ) + } + { + dispatch(showModal({ name: 'ACCOUNT_DETAILS' })) + viewAccountDetailsEvent() + onClose() + }} + iconClassName="fas fa-qrcode" + > + { t('accountDetails') } + + { + viewOnEtherscanEvent() + global.platform.openTab({ url: getAccountLink(address, network, rpcPrefs) }) + onClose() + }} + subtitle={ + rpcPrefs.blockExplorerUrl + ? ( + + { rpcPrefs.blockExplorerUrl.match(/^https?:\/\/(.+)/u)[1] } + + ) + : null + } + iconClassName="fas fa-external-link-alt" + > + { + rpcPrefs.blockExplorerUrl + ? t('viewinExplorer') + : t('viewOnEtherscan') + } + + { + openConnectedSitesEvent() + history.push(CONNECTED_ROUTE) + onClose() + }} + iconClassName="account-options-menu__connected-sites" + > + { t('connectedSites') } + + { + isRemovable + ? ( + { + dispatch(showModal({ name: 'CONFIRM_REMOVE_ACCOUNT', identity: selectedIdentity })) + onClose() + }} + iconClassName="fas fa-trash-alt" + > + { t('removeAccount') } + + ) + : null + } + + ) +} + +AccountOptionsMenu.propTypes = { + anchorElement: PropTypes.instanceOf(window.Element), + onClose: PropTypes.func.isRequired, +} + +AccountOptionsMenu.defaultProps = { + anchorElement: undefined, +} diff --git a/ui/app/components/app/menu-bar/index.js b/ui/app/components/app/menu-bar/index.js index c5760847f6c6..19db09e191fb 100644 --- a/ui/app/components/app/menu-bar/index.js +++ b/ui/app/components/app/menu-bar/index.js @@ -1 +1 @@ -export { default } from './menu-bar.container' +export { default } from './menu-bar' diff --git a/ui/app/components/app/menu-bar/index.scss b/ui/app/components/app/menu-bar/index.scss index eaa50619ce8c..ac99b6b903ae 100644 --- a/ui/app/components/app/menu-bar/index.scss +++ b/ui/app/components/app/menu-bar/index.scss @@ -1,32 +1,35 @@ .menu-bar { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - flex: 0 0 auto; - margin-bottom: 16px; - padding: 0 22px; + display: grid; + grid-template-columns: 30% minmax(30%, 1fr) 30%; + column-gap: 5px; + padding: 0 8px; border-bottom: 1px solid $Grey-100; - &__sidebar-button { - width: 20px; - height: 20px; - background-image: url(/images/icons/hamburger.svg); - background-repeat: no-repeat; - background-size: contain; - background-position: center; - cursor: pointer; + .menu-bar__account-options { + background: none; + font-size: inherit; + padding: 0 8px 0 5px; + place-self: center end; } - &__open-in-browser { - width: 20px; - height: 20px; - background-image: url(/images/icons/3dots.svg); - background-repeat: no-repeat; + .selected-account { + grid-column: 2 / span 1; + place-self: center stretch; + } +} + +.account-options-menu { + &__connected-sites::before { + content: ""; + background-image: url(/images/icons/connected-sites.svg); background-size: contain; + background-repeat: no-repeat; background-position: center; - cursor: pointer; - display: flex; - justify-content: center; + padding: 8px; + } + + &__explorer-origin { + color: $Grey-500; + font-size: 12px; } } diff --git a/ui/app/components/app/menu-bar/menu-bar.component.js b/ui/app/components/app/menu-bar/menu-bar.component.js deleted file mode 100644 index c830d8a19b63..000000000000 --- a/ui/app/components/app/menu-bar/menu-bar.component.js +++ /dev/null @@ -1,79 +0,0 @@ -import React, { PureComponent } from 'react' -import PropTypes from 'prop-types' -import Tooltip from '../../ui/tooltip' -import SelectedAccount from '../selected-account' -import AccountDetailsDropdown from '../dropdowns/account-details-dropdown.js' - -export default class MenuBar extends PureComponent { - static contextTypes = { - t: PropTypes.func, - metricsEvent: PropTypes.func, - } - - static propTypes = { - hideSidebar: PropTypes.func, - sidebarOpen: PropTypes.bool, - showSidebar: PropTypes.func, - } - - state = { accountDetailsMenuOpen: false } - - render () { - const { t } = this.context - const { sidebarOpen, hideSidebar, showSidebar } = this.props - const { accountDetailsMenuOpen } = this.state - - return ( -
    - -
    { - this.context.metricsEvent({ - eventOpts: { - category: 'Navigation', - action: 'Home', - name: 'Opened Hamburger', - }, - }) - sidebarOpen ? hideSidebar() : showSidebar() - }} - /> - - - - -
    { - this.context.metricsEvent({ - eventOpts: { - category: 'Navigation', - action: 'Home', - name: 'Opened Account Options', - }, - }) - this.setState({ accountDetailsMenuOpen: true }) - }} - > -
    -
    - - { - accountDetailsMenuOpen && ( - this.setState({ accountDetailsMenuOpen: false })} - /> - ) - } -
    - ) - } -} diff --git a/ui/app/components/app/menu-bar/menu-bar.container.js b/ui/app/components/app/menu-bar/menu-bar.container.js deleted file mode 100644 index 059263ff38c8..000000000000 --- a/ui/app/components/app/menu-bar/menu-bar.container.js +++ /dev/null @@ -1,26 +0,0 @@ -import { connect } from 'react-redux' -import { WALLET_VIEW_SIDEBAR } from '../sidebars/sidebar.constants' -import MenuBar from './menu-bar.component' -import { showSidebar, hideSidebar } from '../../../store/actions' - -const mapStateToProps = state => { - const { appState: { sidebar: { isOpen } } } = state - - return { - sidebarOpen: isOpen, - } -} - -const mapDispatchToProps = dispatch => { - return { - showSidebar: () => { - dispatch(showSidebar({ - transitionName: 'sidebar-right', - type: WALLET_VIEW_SIDEBAR, - })) - }, - hideSidebar: () => dispatch(hideSidebar()), - } -} - -export default connect(mapStateToProps, mapDispatchToProps)(MenuBar) diff --git a/ui/app/components/app/menu-bar/menu-bar.js b/ui/app/components/app/menu-bar/menu-bar.js new file mode 100644 index 000000000000..8c4f5c8b93cb --- /dev/null +++ b/ui/app/components/app/menu-bar/menu-bar.js @@ -0,0 +1,62 @@ +import React, { useState } from 'react' +import extension from 'extensionizer' +import { useHistory } from 'react-router-dom' +import { useSelector } from 'react-redux' +import SelectedAccount from '../selected-account' +import ConnectedStatusIndicator from '../connected-status-indicator' +import { getEnvironmentType } from '../../../../../app/scripts/lib/util' +import { ENVIRONMENT_TYPE_POPUP } from '../../../../../app/scripts/lib/enums' +import { CONNECTED_ACCOUNTS_ROUTE } from '../../../helpers/constants/routes' +import { useI18nContext } from '../../../hooks/useI18nContext' +import { useMetricEvent } from '../../../hooks/useMetricEvent' +import { getOriginOfCurrentTab } from '../../../selectors' +import AccountOptionsMenu from './account-options-menu' + +export default function MenuBar () { + const t = useI18nContext() + const openAccountOptionsEvent = useMetricEvent({ + eventOpts: { + category: 'Navigation', + action: 'Home', + name: 'Opened Account Options', + }, + }) + const history = useHistory() + const [accountOptionsButtonElement, setAccountOptionsButtonElement] = useState(null) + const [accountOptionsMenuOpen, setAccountOptionsMenuOpen] = useState(false) + const origin = useSelector(getOriginOfCurrentTab) + + const showStatus = getEnvironmentType() === ENVIRONMENT_TYPE_POPUP && origin && origin !== extension.runtime.id + + return ( +
    + { + showStatus + ? history.push(CONNECTED_ACCOUNTS_ROUTE)} /> + : null + } + + + +
    + ) +} diff --git a/ui/app/components/app/menu-bar/tests/menu-bar.test.js b/ui/app/components/app/menu-bar/tests/menu-bar.test.js new file mode 100644 index 000000000000..1212977bed40 --- /dev/null +++ b/ui/app/components/app/menu-bar/tests/menu-bar.test.js @@ -0,0 +1,63 @@ +import assert from 'assert' +import React from 'react' +import { Provider } from 'react-redux' +import configureStore from 'redux-mock-store' +import { mountWithRouter } from '../../../../../../test/lib/render-helpers' +import MenuBar from '..' + +const initState = { + activeTab: {}, + metamask: { + network: '1', + selectedAddress: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc', + identities: { + '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc': { + address: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc', + name: 'Account 1', + }, + }, + keyrings: [ + { + type: 'HD Key Tree', + accounts: [ + '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc', + ], + }, + ], + frequentRpcListDetail: [], + }, +} +const mockStore = configureStore() + +describe('MenuBar', function () { + it('opens account detail menu when account options is clicked', function () { + const store = mockStore(initState) + const wrapper = mountWithRouter( + + + , + ) + assert.ok(!wrapper.exists('AccountOptionsMenu')) + const accountOptions = wrapper.find('.menu-bar__account-options') + accountOptions.simulate('click') + wrapper.update() + assert.ok(wrapper.exists('AccountOptionsMenu')) + }) + + it('sets accountDetailsMenuOpen to false when closed', function () { + const store = mockStore(initState) + const wrapper = mountWithRouter( + + + , + ) + const accountOptions = wrapper.find('.menu-bar__account-options') + accountOptions.simulate('click') + wrapper.update() + assert.ok(wrapper.exists('AccountOptionsMenu')) + const accountDetailsMenu = wrapper.find('AccountOptionsMenu') + accountDetailsMenu.prop('onClose')() + wrapper.update() + assert.ok(!wrapper.exists('AccountOptionsMenu')) + }) +}) diff --git a/ui/app/components/app/menu-droppo.js b/ui/app/components/app/menu-droppo.js index c80bee2be0ec..35d7b458eaa3 100644 --- a/ui/app/components/app/menu-droppo.js +++ b/ui/app/components/app/menu-droppo.js @@ -1,128 +1,130 @@ -const Component = require('react').Component -const h = require('react-hyperscript') -const inherits = require('util').inherits -const findDOMNode = require('react-dom').findDOMNode -const ReactCSSTransitionGroup = require('react-addons-css-transition-group') - -module.exports = MenuDroppoComponent - - -inherits(MenuDroppoComponent, Component) -function MenuDroppoComponent () { - Component.call(this) -} - -MenuDroppoComponent.prototype.render = function () { - const { containerClassName = '' } = this.props - const speed = this.props.speed || '300ms' - const useCssTransition = this.props.useCssTransition - const zIndex = ('zIndex' in this.props) ? this.props.zIndex : 0 - - this.manageListeners() - - const style = this.props.style || {} - if (!('position' in style)) { - style.position = 'fixed' +import PropTypes from 'prop-types' +import React, { Component } from 'react' +import { findDOMNode } from 'react-dom' +import ReactCSSTransitionGroup from 'react-transition-group/CSSTransitionGroup' + +export default class MenuDroppoComponent extends Component { + static propTypes = { + isOpen: PropTypes.bool.isRequired, + innerStyle: PropTypes.object, + children: PropTypes.node.isRequired, + onClickOutside: PropTypes.func, + containerClassName: PropTypes.string, + zIndex: PropTypes.number, + style: PropTypes.object.isRequired, + useCssTransition: PropTypes.bool, + speed: PropTypes.string, } - style.zIndex = zIndex - - return ( - h('div', { - style, - className: `.menu-droppo-container ${containerClassName}`, - }, [ - h('style', ` - .menu-droppo-enter { - transition: transform ${speed} ease-in-out; - transform: translateY(-200%); - } - .menu-droppo-enter.menu-droppo-enter-active { - transition: transform ${speed} ease-in-out; - transform: translateY(0%); - } + renderPrimary () { + const { isOpen } = this.props + if (!isOpen) { + return null + } - .menu-droppo-leave { - transition: transform ${speed} ease-in-out; - transform: translateY(0%); - } + const innerStyle = this.props.innerStyle || {} - .menu-droppo-leave.menu-droppo-leave-active { - transition: transform ${speed} ease-in-out; - transform: translateY(-200%); - } - `), - - useCssTransition - ? h(ReactCSSTransitionGroup, { - className: 'css-transition-group', - transitionName: 'menu-droppo', - transitionEnterTimeout: parseInt(speed), - transitionLeaveTimeout: parseInt(speed), - }, this.renderPrimary()) - : this.renderPrimary(), - ]) - ) -} - -MenuDroppoComponent.prototype.renderPrimary = function () { - const isOpen = this.props.isOpen - if (!isOpen) { - return null + return ( +
    + {this.props.children} +
    + ) } - const innerStyle = this.props.innerStyle || {} + manageListeners () { + const { isOpen, onClickOutside } = this.props - return ( - h('.menu-droppo', { - key: 'menu-droppo-drawer', - style: innerStyle, - }, - [ this.props.children ]) - ) -} + if (isOpen) { + this.outsideClickHandler = onClickOutside + } + } -MenuDroppoComponent.prototype.manageListeners = function () { - const isOpen = this.props.isOpen - const onClickOutside = this.props.onClickOutside + globalClickOccurred = (event) => { + const { target } = event + // eslint-disable-next-line react/no-find-dom-node + const container = findDOMNode(this) - if (isOpen) { - this.outsideClickHandler = onClickOutside - } else if (isOpen) { - this.outsideClickHandler = null + if (target !== container && + !isDescendant(this.container, event.target) && + this.outsideClickHandler) { + this.outsideClickHandler(event) + } } -} -MenuDroppoComponent.prototype.componentDidMount = function () { - if (this && document.body) { - this.globalClickHandler = this.globalClickOccurred.bind(this) - document.body.addEventListener('click', this.globalClickHandler) - // eslint-disable-next-line react/no-find-dom-node - var container = findDOMNode(this) - this.container = container + componentDidMount () { + if (this && document.body) { + document.body.addEventListener('click', this.globalClickOccurred) + // eslint-disable-next-line react/no-find-dom-node + const container = findDOMNode(this) + this.container = container + } } -} -MenuDroppoComponent.prototype.componentWillUnmount = function () { - if (this && document.body) { - document.body.removeEventListener('click', this.globalClickHandler) + componentWillUnmount () { + if (this && document.body) { + document.body.removeEventListener('click', this.globalClickOccurred) + } } -} -MenuDroppoComponent.prototype.globalClickOccurred = function (event) { - const target = event.target - // eslint-disable-next-line react/no-find-dom-node - const container = findDOMNode(this) + render () { + const { containerClassName = '', style } = this.props + const speed = this.props.speed || '300ms' + const { useCssTransition } = this.props + const zIndex = ('zIndex' in this.props) ? this.props.zIndex : 0 + + this.manageListeners() - if (target !== container && - !isDescendant(this.container, event.target) && - this.outsideClickHandler) { - this.outsideClickHandler(event) + const baseStyle = { + position: 'fixed', + ...style, + zIndex, + } + + return ( +
    + + { + useCssTransition + ? ( + + {this.renderPrimary()} + + ) + : this.renderPrimary() + } +
    + ) } } function isDescendant (parent, child) { - var node = child.parentNode + let node = child.parentNode while (node !== null) { if (node === parent) { return true diff --git a/ui/app/components/app/modal/modal-content/index.scss b/ui/app/components/app/modal/modal-content/index.scss index 560505b84e3e..560c2cbd48b6 100644 --- a/ui/app/components/app/modal/modal-content/index.scss +++ b/ui/app/components/app/modal/modal-content/index.scss @@ -14,6 +14,6 @@ &__description { text-align: center; - font-size: .875rem; + font-size: 0.875rem; } } diff --git a/ui/app/components/app/modal/modal-content/tests/modal-content.component.test.js b/ui/app/components/app/modal/modal-content/tests/modal-content.component.test.js index 17af09f45f07..058727cc2977 100644 --- a/ui/app/components/app/modal/modal-content/tests/modal-content.component.test.js +++ b/ui/app/components/app/modal/modal-content/tests/modal-content.component.test.js @@ -1,14 +1,14 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { shallow } from 'enzyme' import ModalContent from '../modal-content.component' -describe('ModalContent Component', () => { - it('should render a title', () => { +describe('ModalContent Component', function () { + it('should render a title', function () { const wrapper = shallow( + />, ) assert.equal(wrapper.find('.modal-content__title').length, 1) @@ -16,11 +16,11 @@ describe('ModalContent Component', () => { assert.equal(wrapper.find('.modal-content__description').length, 0) }) - it('should render a description', () => { + it('should render a description', function () { const wrapper = shallow( + />, ) assert.equal(wrapper.find('.modal-content__title').length, 0) @@ -28,12 +28,12 @@ describe('ModalContent Component', () => { assert.equal(wrapper.find('.modal-content__description').text(), 'Modal Description') }) - it('should render both a title and a description', () => { + it('should render both a title and a description', function () { const wrapper = shallow( + />, ) assert.equal(wrapper.find('.modal-content__title').length, 1) diff --git a/ui/app/components/app/modal/modal.component.js b/ui/app/components/app/modal/modal.component.js index 44b180ac8361..5e2ad00f5fa2 100644 --- a/ui/app/components/app/modal/modal.component.js +++ b/ui/app/components/app/modal/modal.component.js @@ -1,10 +1,13 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' +import classnames from 'classnames' import Button from '../../ui/button' export default class Modal extends PureComponent { static propTypes = { children: PropTypes.node, + contentClass: PropTypes.string, + containerClass: PropTypes.string, // Header text headerText: PropTypes.string, onClose: PropTypes.func, @@ -13,6 +16,7 @@ export default class Modal extends PureComponent { submitType: PropTypes.string, submitText: PropTypes.string, submitDisabled: PropTypes.bool, + hideFooter: PropTypes.bool, // Cancel button (left button) onCancel: PropTypes.func, cancelType: PropTypes.string, @@ -36,10 +40,13 @@ export default class Modal extends PureComponent { onCancel, cancelType, cancelText, + contentClass, + containerClass, + hideFooter, } = this.props return ( -
    +
    { headerText && (
    @@ -53,30 +60,36 @@ export default class Modal extends PureComponent {
    ) } -
    +
    { children }
    -
    - { - onCancel && ( - + { + hideFooter + ? null + : ( +
    + { + onCancel && ( + + ) + } + +
    ) - } - -
    + }
    ) } diff --git a/ui/app/components/app/modal/tests/modal.component.test.js b/ui/app/components/app/modal/tests/modal.component.test.js index 5922177a6a00..5dceb4292f8f 100644 --- a/ui/app/components/app/modal/tests/modal.component.test.js +++ b/ui/app/components/app/modal/tests/modal.component.test.js @@ -1,12 +1,12 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { mount, shallow } from 'enzyme' import sinon from 'sinon' import Modal from '../modal.component' import Button from '../../../ui/button' -describe('Modal Component', () => { - it('should render a modal with a submit button', () => { +describe('Modal Component', function () { + it('should render a modal with a submit button', function () { const wrapper = shallow() assert.equal(wrapper.find('.modal-container').length, 1) @@ -15,7 +15,7 @@ describe('Modal Component', () => { assert.equal(buttons.at(0).props().type, 'secondary') }) - it('should render a modal with a cancel and a submit button', () => { + it('should render a modal with a cancel and a submit button', function () { const handleCancel = sinon.spy() const handleSubmit = sinon.spy() const wrapper = shallow( @@ -24,7 +24,7 @@ describe('Modal Component', () => { cancelText="Cancel" onSubmit={handleSubmit} submitText="Submit" - /> + />, ) const buttons = wrapper.find(Button) @@ -45,16 +45,16 @@ describe('Modal Component', () => { assert.equal(handleSubmit.callCount, 1) }) - it('should render a modal with different button types', () => { + it('should render a modal with different button types', function () { const wrapper = shallow( {}} + onCancel={() => undefined} cancelText="Cancel" cancelType="secondary" - onSubmit={() => {}} + onSubmit={() => undefined} submitText="Submit" submitType="confirm" - /> + />, ) const buttons = wrapper.find(Button) @@ -63,22 +63,22 @@ describe('Modal Component', () => { assert.equal(buttons.at(1).props().type, 'confirm') }) - it('should render a modal with children', () => { + it('should render a modal with children', function () { const wrapper = shallow( {}} + onCancel={() => undefined} cancelText="Cancel" - onSubmit={() => {}} + onSubmit={() => undefined} submitText="Submit" >
    - + , ) assert.ok(wrapper.find('.test-class')) }) - it('should render a modal with a header', () => { + it('should render a modal with a header', function () { const handleCancel = sinon.spy() const handleSubmit = sinon.spy() const wrapper = shallow( @@ -89,7 +89,7 @@ describe('Modal Component', () => { submitText="Submit" headerText="My Header" onClose={handleCancel} - /> + />, ) assert.ok(wrapper.find('.modal-container__header')) @@ -101,7 +101,7 @@ describe('Modal Component', () => { assert.equal(handleSubmit.callCount, 0) }) - it('should disable the submit button if submitDisabled is true', () => { + it('should disable the submit button if submitDisabled is true', function () { const handleCancel = sinon.spy() const handleSubmit = sinon.spy() const wrapper = mount( @@ -110,10 +110,10 @@ describe('Modal Component', () => { cancelText="Cancel" onSubmit={handleSubmit} submitText="Submit" - submitDisabled={true} + submitDisabled headerText="My Header" onClose={handleCancel} - /> + />, ) const buttons = wrapper.find(Button) diff --git a/ui/app/components/app/modals/account-details-modal/account-details-modal.component.js b/ui/app/components/app/modals/account-details-modal/account-details-modal.component.js index e3919edcf509..faa910c43fd2 100644 --- a/ui/app/components/app/modals/account-details-modal/account-details-modal.component.js +++ b/ui/app/components/app/modals/account-details-modal/account-details-modal.component.js @@ -1,7 +1,7 @@ -import React, { Component} from 'react' +import React, { Component } from 'react' import PropTypes from 'prop-types' import AccountModalContainer from '../account-modal-container' -import genAccountLink from '../../../../../lib/account-link.js' +import getAccountLink from '../../../../../lib/account-link' import QrView from '../../../ui/qr-code' import EditableLabel from '../../../ui/editable-label' import Button from '../../../ui/button' @@ -42,44 +42,46 @@ export default class AccountDetailsModal extends Component { } return ( - + setAccountLabel(address, label)} + onSubmit={(label) => setAccountLabel(address, label)} /> -
    +
    {exportPrivateKeyFeatureEnabled - ? - : null + ? ( + + ) + : null } ) diff --git a/ui/app/components/app/modals/account-details-modal/account-details-modal.container.js b/ui/app/components/app/modals/account-details-modal/account-details-modal.container.js index 4b2283cedeec..807fad84e64c 100644 --- a/ui/app/components/app/modals/account-details-modal/account-details-modal.container.js +++ b/ui/app/components/app/modals/account-details-modal/account-details-modal.container.js @@ -1,6 +1,9 @@ import { connect } from 'react-redux' -import actions from '../../../../store/actions' -import { getSelectedIdentity, getRpcPrefsForCurrentProvider } from '../../../../selectors/selectors' +import { showModal, setAccountLabel } from '../../../../store/actions' +import { + getSelectedIdentity, + getRpcPrefsForCurrentProvider, +} from '../../../../selectors' import AccountDetailsModal from './account-details-modal.component' const mapStateToProps = (state) => { @@ -14,13 +17,8 @@ const mapStateToProps = (state) => { const mapDispatchToProps = (dispatch) => { return { - // Is this supposed to be used somewhere? - showQrView: (selected, identity) => dispatch(actions.showQrView(selected, identity)), - showExportPrivateKeyModal: () => { - dispatch(actions.showModal({ name: 'EXPORT_PRIVATE_KEY' })) - }, - hideModal: () => dispatch(actions.hideModal()), - setAccountLabel: (address, label) => dispatch(actions.setAccountLabel(address, label)), + showExportPrivateKeyModal: () => dispatch(showModal({ name: 'EXPORT_PRIVATE_KEY' })), + setAccountLabel: (address, label) => dispatch(setAccountLabel(address, label)), } } diff --git a/ui/app/components/app/modals/account-details-modal/index.scss b/ui/app/components/app/modals/account-details-modal/index.scss new file mode 100644 index 000000000000..1f14aeaac4cc --- /dev/null +++ b/ui/app/components/app/modals/account-details-modal/index.scss @@ -0,0 +1,37 @@ +.account-details-modal { + &__name { + margin-top: 9px; + font-size: 20px; + } + + & &__button { + margin-top: 17px; + padding: 10px 22px; + width: 286px; + } + + &__divider { + width: 100%; + height: 1px; + margin: 19px 0 8px 0; + background-color: $alto; + } + + & .qr-header { + margin-top: 9px; + font-size: 20px; + } + + & .qr-wrapper { + margin-top: 5px; + } + + & .ellip-address-wrapper { + display: flex; + justify-content: center; + border: 1px solid $alto; + padding: 5px 10px; + margin-top: 7px; + width: 286px; + } +} diff --git a/ui/app/components/app/modals/account-modal-container.js b/ui/app/components/app/modals/account-modal-container.js deleted file mode 100644 index b7ae0b5b87a3..000000000000 --- a/ui/app/components/app/modals/account-modal-container.js +++ /dev/null @@ -1,80 +0,0 @@ -const Component = require('react').Component -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const inherits = require('util').inherits -const connect = require('react-redux').connect -const actions = require('../../../store/actions') -const { getSelectedIdentity } = require('../../../selectors/selectors') -import Identicon from '../../ui/identicon' - -function mapStateToProps (state, ownProps) { - return { - selectedIdentity: ownProps.selectedIdentity || getSelectedIdentity(state), - } -} - -function mapDispatchToProps (dispatch) { - return { - hideModal: () => { - dispatch(actions.hideModal()) - }, - } -} - -inherits(AccountModalContainer, Component) -function AccountModalContainer () { - Component.call(this) -} - -AccountModalContainer.contextTypes = { - t: PropTypes.func, -} - -module.exports = connect(mapStateToProps, mapDispatchToProps)(AccountModalContainer) - - -AccountModalContainer.prototype.render = function () { - const { - selectedIdentity, - showBackButton = false, - backButtonAction, - } = this.props - let { children } = this.props - - if (children.constructor !== Array) { - children = [children] - } - - return h('div', { style: { borderRadius: '4px' }}, [ - h('div.account-modal-container', [ - - h('div', [ - - // Needs a border; requires changes to svg - h(Identicon, { - address: selectedIdentity.address, - diameter: 64, - style: {}, - }), - - ]), - - showBackButton && h('div.account-modal-back', { - onClick: backButtonAction, - }, [ - - h('i.fa.fa-angle-left.fa-lg'), - - h('span.account-modal-back__text', ' ' + this.context.t('back')), - - ]), - - h('div.account-modal-close', { - onClick: this.props.hideModal, - }), - - ...children, - - ]), - ]) -} diff --git a/ui/app/components/app/modals/account-modal-container/account-modal-container.component.js b/ui/app/components/app/modals/account-modal-container/account-modal-container.component.js new file mode 100644 index 000000000000..93f4ae25bac9 --- /dev/null +++ b/ui/app/components/app/modals/account-modal-container/account-modal-container.component.js @@ -0,0 +1,55 @@ +import PropTypes from 'prop-types' +import React from 'react' +import classnames from 'classnames' +import Identicon from '../../../ui/identicon' + +export default function AccountModalContainer (props, context) { + const { + className, + selectedIdentity, + showBackButton, + backButtonAction, + hideModal, + children, + } = props + + return ( +
    +
    +
    + +
    + {showBackButton && ( +
    + + {context.t('back')} +
    + )} +
    +
    + ) +} + +AccountModalContainer.contextTypes = { + t: PropTypes.func, +} + +AccountModalContainer.defaultProps = { + showBackButton: false, + children: null, + backButtonAction: undefined, +} + +AccountModalContainer.propTypes = { + className: PropTypes.string, + selectedIdentity: PropTypes.object.isRequired, + showBackButton: PropTypes.bool, + backButtonAction: PropTypes.func, + hideModal: PropTypes.func.isRequired, + children: PropTypes.node, +} diff --git a/ui/app/components/app/modals/account-modal-container/account-modal-container.container.js b/ui/app/components/app/modals/account-modal-container/account-modal-container.container.js new file mode 100644 index 000000000000..0c85c67cf2c6 --- /dev/null +++ b/ui/app/components/app/modals/account-modal-container/account-modal-container.container.js @@ -0,0 +1,20 @@ +import { connect } from 'react-redux' +import { hideModal } from '../../../../store/actions' +import { getSelectedIdentity } from '../../../../selectors' +import AccountModalContainer from './account-modal-container.component' + +function mapStateToProps (state, ownProps) { + return { + selectedIdentity: ownProps.selectedIdentity || getSelectedIdentity(state), + } +} + +function mapDispatchToProps (dispatch) { + return { + hideModal: () => { + dispatch(hideModal()) + }, + } +} + +export default connect(mapStateToProps, mapDispatchToProps)(AccountModalContainer) diff --git a/ui/app/components/app/modals/account-modal-container/index.js b/ui/app/components/app/modals/account-modal-container/index.js new file mode 100644 index 000000000000..e37684b963b3 --- /dev/null +++ b/ui/app/components/app/modals/account-modal-container/index.js @@ -0,0 +1 @@ +export { default } from './account-modal-container.container' diff --git a/ui/app/components/app/modals/account-modal-container/index.scss b/ui/app/components/app/modals/account-modal-container/index.scss new file mode 100644 index 000000000000..6e553249b050 --- /dev/null +++ b/ui/app/components/app/modals/account-modal-container/index.scss @@ -0,0 +1,52 @@ +// Account Modal Container +.account-modal { + &__container { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; + position: relative; + padding: 5px 0 31px 0; + border: 1px solid $silver; + border-radius: 4px; + } + + &__back { + color: $dusty-gray; + position: absolute; + top: 13px; + left: 17px; + cursor: pointer; + display: flex; + align-items: center; + } + + &__back-text { + font-size: 14px; + line-height: 18px; + padding-left: 3px; + } + + &__close { + font-size: 40px; + background-color: transparent; + color: $dusty-gray; + position: absolute; + cursor: pointer; + top: 10px; + right: 12px; + + &::after { + content: '\00D7'; + } + } + + & .identicon { + position: relative; + left: 0; + right: 0; + margin: 0 auto; + top: -32px; + margin-bottom: -32px; + } +} diff --git a/ui/app/components/app/modals/add-to-addressbook-modal/add-to-addressbook-modal.component.js b/ui/app/components/app/modals/add-to-addressbook-modal/add-to-addressbook-modal.component.js new file mode 100644 index 000000000000..685d0506ca89 --- /dev/null +++ b/ui/app/components/app/modals/add-to-addressbook-modal/add-to-addressbook-modal.component.js @@ -0,0 +1,79 @@ +import React, { Component } from 'react' +import PropTypes from 'prop-types' +import Button from '../../../ui/button/button.component' + +export default class AddToAddressBookModal extends Component { + + static contextTypes = { + t: PropTypes.func, + } + + static propTypes = { + hideModal: PropTypes.func.isRequired, + addToAddressBook: PropTypes.func.isRequired, + recipient: PropTypes.string.isRequired, + } + + state = { + alias: '', + } + + onSave = async () => { + const { recipient, addToAddressBook, hideModal } = this.props + await addToAddressBook(recipient, this.state.alias) + hideModal() + } + + onChange = (e) => { + this.setState({ + alias: e.target.value, + }) + } + + onKeyPress = async (e) => { + if (e.key === 'Enter' && this.state.alias) { + this.onSave() + } + } + + render () { + const { t } = this.context + + return ( +
    +
    +
    + {t('addToAddressBook')} +
    +
    + {t('enterAnAlias')} +
    + +
    +
    + + +
    +
    + ) + } +} diff --git a/ui/app/components/app/modals/add-to-addressbook-modal/add-to-addressbook-modal.container.js b/ui/app/components/app/modals/add-to-addressbook-modal/add-to-addressbook-modal.container.js new file mode 100644 index 000000000000..176ac86bcdd4 --- /dev/null +++ b/ui/app/components/app/modals/add-to-addressbook-modal/add-to-addressbook-modal.container.js @@ -0,0 +1,18 @@ +import { connect } from 'react-redux' +import * as actions from '../../../../store/actions' +import AddToAddressBookModal from './add-to-addressbook-modal.component' + +function mapStateToProps (state) { + return { + ...(state.appState.modal.modalState.props || {}), + } +} + +function mapDispatchToProps (dispatch) { + return { + hideModal: () => dispatch(actions.hideModal()), + addToAddressBook: (recipient, nickname) => dispatch(actions.addToAddressBook(recipient, nickname)), + } +} + +export default connect(mapStateToProps, mapDispatchToProps)(AddToAddressBookModal) diff --git a/ui/app/components/app/modals/add-to-addressbook-modal/index.js b/ui/app/components/app/modals/add-to-addressbook-modal/index.js new file mode 100644 index 000000000000..9ed4f018ff8b --- /dev/null +++ b/ui/app/components/app/modals/add-to-addressbook-modal/index.js @@ -0,0 +1 @@ +export { default } from './add-to-addressbook-modal.container' diff --git a/ui/app/components/app/modals/add-to-addressbook-modal/index.scss b/ui/app/components/app/modals/add-to-addressbook-modal/index.scss new file mode 100644 index 000000000000..96e04007ffcd --- /dev/null +++ b/ui/app/components/app/modals/add-to-addressbook-modal/index.scss @@ -0,0 +1,47 @@ +.add-to-address-book-modal { + display: flex; + flex-flow: column nowrap; + background-color: $white; + border-radius: 10px; + box-shadow: 0 5px 16px rgba($black, 0.25); + + &__content { + @extend %col-nowrap; + + padding: 1.5rem; + border-bottom: 1px solid $Grey-100; + + &__header { + @include H3; + } + } + + &__input-label { + color: $Grey-600; + margin-top: 1.25rem; + } + + &__input { + background: $white; + border: 1px solid $Grey-100; + box-sizing: border-box; + border-radius: 8px; + padding: 0.625rem 0.75rem; + font-size: 1.25rem; + margin-top: 0.75rem; + + &::placeholder { + color: $Grey-300; + } + } + + &__footer { + @extend %row-nowrap; + + padding: 1rem; + + button + button { + margin-left: 1rem; + } + } +} diff --git a/ui/app/components/app/modals/buy-options-modal.js b/ui/app/components/app/modals/buy-options-modal.js deleted file mode 100644 index 2df20e65c41b..000000000000 --- a/ui/app/components/app/modals/buy-options-modal.js +++ /dev/null @@ -1,101 +0,0 @@ -const Component = require('react').Component -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const inherits = require('util').inherits -const connect = require('react-redux').connect -const actions = require('../../../store/actions') -const { getNetworkDisplayName } = require('../../../../../app/scripts/controllers/network/util') - -function mapStateToProps (state) { - return { - network: state.metamask.network, - address: state.metamask.selectedAddress, - } -} - -function mapDispatchToProps (dispatch) { - return { - toCoinbase: (address) => { - dispatch(actions.buyEth({ network: '1', address, amount: 0 })) - }, - hideModal: () => { - dispatch(actions.hideModal()) - }, - showAccountDetailModal: () => { - dispatch(actions.showModal({ name: 'ACCOUNT_DETAILS' })) - }, - toFaucet: network => dispatch(actions.buyEth({ network })), - } -} - -inherits(BuyOptions, Component) -function BuyOptions () { - Component.call(this) -} - -BuyOptions.contextTypes = { - t: PropTypes.func, -} - -module.exports = connect(mapStateToProps, mapDispatchToProps)(BuyOptions) - - -BuyOptions.prototype.renderModalContentOption = function (title, header, onClick) { - return h('div.buy-modal-content-option', { - onClick, - }, [ - h('div.buy-modal-content-option-title', {}, title), - h('div.buy-modal-content-option-subtitle', {}, header), - ]) -} - -BuyOptions.prototype.render = function () { - const { network, toCoinbase, address, toFaucet } = this.props - const isTestNetwork = ['3', '4', '42'].find(n => n === network) - const networkName = getNetworkDisplayName(network) - - return h('div', {}, [ - h('div.buy-modal-content.transfers-subview', { - }, [ - h('div.buy-modal-content-title-wrapper.flex-column.flex-center', { - style: {}, - }, [ - h('div.buy-modal-content-title', { - style: {}, - }, this.context.t('transfers')), - h('div', {}, this.context.t('howToDeposit')), - ]), - - h('div.buy-modal-content-options.flex-column.flex-center', {}, [ - - isTestNetwork - ? this.renderModalContentOption(networkName, this.context.t('testFaucet'), () => toFaucet(network)) - : this.renderModalContentOption('Coinbase', this.context.t('depositFiat'), () => toCoinbase(address)), - - // h('div.buy-modal-content-option', {}, [ - // h('div.buy-modal-content-option-title', {}, 'Shapeshift'), - // h('div.buy-modal-content-option-subtitle', {}, 'Trade any digital asset for any other'), - // ]),, - - this.renderModalContentOption( - this.context.t('directDeposit'), - this.context.t('depositFromAccount'), - () => this.goToAccountDetailsModal() - ), - - ]), - - h('button', { - style: { - background: 'white', - }, - onClick: () => { this.props.hideModal() }, - }, h('div.buy-modal-content-footer#buy-modal-content-footer-text', {}, this.context.t('cancel'))), - ]), - ]) -} - -BuyOptions.prototype.goToAccountDetailsModal = function () { - this.props.hideModal() - this.props.showAccountDetailModal() -} diff --git a/ui/app/components/app/modals/cancel-transaction/cancel-transaction-gas-fee/index.scss b/ui/app/components/app/modals/cancel-transaction/cancel-transaction-gas-fee/index.scss index ce81dd44894e..5d99e66d569d 100644 --- a/ui/app/components/app/modals/cancel-transaction/cancel-transaction-gas-fee/index.scss +++ b/ui/app/components/app/modals/cancel-transaction/cancel-transaction-gas-fee/index.scss @@ -1,5 +1,5 @@ .cancel-transaction-gas-fee { - background: #F1F4F9; + background: #f1f4f9; padding: 16px; display: flex; flex-direction: column; @@ -12,6 +12,6 @@ } &__fiat { - font-size: .75rem; + font-size: 0.75rem; } } diff --git a/ui/app/components/app/modals/cancel-transaction/cancel-transaction-gas-fee/tests/cancel-transaction-gas-fee.component.test.js b/ui/app/components/app/modals/cancel-transaction/cancel-transaction-gas-fee/tests/cancel-transaction-gas-fee.component.test.js index 014815503de6..339d3454456d 100644 --- a/ui/app/components/app/modals/cancel-transaction/cancel-transaction-gas-fee/tests/cancel-transaction-gas-fee.component.test.js +++ b/ui/app/components/app/modals/cancel-transaction/cancel-transaction-gas-fee/tests/cancel-transaction-gas-fee.component.test.js @@ -1,15 +1,15 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { shallow } from 'enzyme' import CancelTransactionGasFee from '../cancel-transaction-gas-fee.component' import UserPreferencedCurrencyDisplay from '../../../../user-preferenced-currency-display' -describe('CancelTransactionGasFee Component', () => { - it('should render', () => { +describe('CancelTransactionGasFee Component', function () { + it('should render', function () { const wrapper = shallow( + />, ) assert.ok(wrapper) diff --git a/ui/app/components/app/modals/cancel-transaction/cancel-transaction.component.js b/ui/app/components/app/modals/cancel-transaction/cancel-transaction.component.js index 6bab5ec1fbe8..f13cca55091a 100644 --- a/ui/app/components/app/modals/cancel-transaction/cancel-transaction.component.js +++ b/ui/app/components/app/modals/cancel-transaction/cancel-transaction.component.js @@ -1,8 +1,8 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import Modal from '../../modal' -import CancelTransactionGasFee from './cancel-transaction-gas-fee' import { SUBMITTED_STATUS } from '../../../../helpers/constants/transactions' +import CancelTransactionGasFee from './cancel-transaction-gas-fee' export default class CancelTransaction extends PureComponent { static contextTypes = { @@ -26,7 +26,6 @@ export default class CancelTransaction extends PureComponent { if (transactionStatus !== SUBMITTED_STATUS) { showTransactionConfirmedModal() - return } } diff --git a/ui/app/components/app/modals/cancel-transaction/cancel-transaction.container.js b/ui/app/components/app/modals/cancel-transaction/cancel-transaction.container.js index 6959889d9192..9645a5df1159 100644 --- a/ui/app/components/app/modals/cancel-transaction/cancel-transaction.container.js +++ b/ui/app/components/app/modals/cancel-transaction/cancel-transaction.container.js @@ -1,17 +1,17 @@ import { connect } from 'react-redux' -import { compose } from 'recompose' +import { compose } from 'redux' import ethUtil from 'ethereumjs-util' import { multiplyCurrencies } from '../../../../helpers/utils/conversion-util' import withModalProps from '../../../../helpers/higher-order-components/with-modal-props' -import CancelTransaction from './cancel-transaction.component' import { showModal, createCancelTransaction } from '../../../../store/actions' import { getHexGasTotal } from '../../../../helpers/utils/confirm-tx.util' +import CancelTransaction from './cancel-transaction.component' const mapStateToProps = (state, ownProps) => { const { metamask } = state const { transactionId, originalGasPrice } = ownProps - const { selectedAddressTxList } = metamask - const transaction = selectedAddressTxList.find(({ id }) => id === transactionId) + const { currentNetworkTxList } = metamask + const transaction = currentNetworkTxList.find(({ id }) => id === transactionId) const transactionStatus = transaction ? transaction.status : '' const defaultNewGasPrice = ethUtil.addHexPrefix( @@ -19,7 +19,7 @@ const mapStateToProps = (state, ownProps) => { toNumericBase: 'hex', multiplicandBase: 16, multiplierBase: 10, - }) + }), ) const newGasFee = getHexGasTotal({ gasPrice: defaultNewGasPrice, gasLimit: '0x5208' }) @@ -33,7 +33,7 @@ const mapStateToProps = (state, ownProps) => { } } -const mapDispatchToProps = dispatch => { +const mapDispatchToProps = (dispatch) => { return { createCancelTransaction: (txId, customGasPrice) => { return dispatch(createCancelTransaction(txId, customGasPrice)) @@ -44,6 +44,7 @@ const mapDispatchToProps = dispatch => { const mergeProps = (stateProps, dispatchProps, ownProps) => { const { transactionId, defaultNewGasPrice, ...restStateProps } = stateProps + // eslint-disable-next-line no-shadow const { createCancelTransaction, ...restDispatchProps } = dispatchProps return { diff --git a/ui/app/components/app/modals/cancel-transaction/index.scss b/ui/app/components/app/modals/cancel-transaction/index.scss index 4ffb5a0f892c..93ba99ad42a7 100644 --- a/ui/app/components/app/modals/cancel-transaction/index.scss +++ b/ui/app/components/app/modals/cancel-transaction/index.scss @@ -9,7 +9,7 @@ &__description { text-align: center; - font-size: .875rem; + font-size: 0.875rem; } &__cancel-transaction-gas-fee-container { diff --git a/ui/app/components/app/modals/cancel-transaction/tests/cancel-transaction.component.test.js b/ui/app/components/app/modals/cancel-transaction/tests/cancel-transaction.component.test.js index 345951b0fe49..aaa87c21bada 100644 --- a/ui/app/components/app/modals/cancel-transaction/tests/cancel-transaction.component.test.js +++ b/ui/app/components/app/modals/cancel-transaction/tests/cancel-transaction.component.test.js @@ -1,20 +1,20 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { shallow } from 'enzyme' import sinon from 'sinon' import CancelTransaction from '../cancel-transaction.component' import CancelTransactionGasFee from '../cancel-transaction-gas-fee' import Modal from '../../../modal' -describe('CancelTransaction Component', () => { - const t = key => key +describe('CancelTransaction Component', function () { + const t = (key) => key - it('should render a CancelTransaction modal', () => { + it('should render a CancelTransaction modal', function () { const wrapper = shallow( , - { context: { t }} + { context: { t } }, ) assert.ok(wrapper) @@ -25,7 +25,7 @@ describe('CancelTransaction Component', () => { assert.equal(wrapper.find('.cancel-transaction__description').text(), 'attemptToCancelDescription') }) - it('should pass the correct props to the Modal component', async () => { + it('should pass the correct props to the Modal component', async function () { const createCancelTransactionSpy = sinon.stub().callsFake(() => Promise.resolve()) const hideModalSpy = sinon.spy() @@ -34,9 +34,9 @@ describe('CancelTransaction Component', () => { defaultNewGasPrice="0x3b9aca00" createCancelTransaction={createCancelTransactionSpy} hideModal={hideModalSpy} - showTransactionConfirmedModal={() => {}} + showTransactionConfirmedModal={() => undefined} />, - { context: { t }} + { context: { t } }, ) assert.equal(wrapper.find(Modal).length, 1) diff --git a/ui/app/components/app/modals/clear-approved-origins/clear-approved-origins.component.js b/ui/app/components/app/modals/clear-approved-origins/clear-approved-origins.component.js deleted file mode 100644 index ceaa20a951b0..000000000000 --- a/ui/app/components/app/modals/clear-approved-origins/clear-approved-origins.component.js +++ /dev/null @@ -1,39 +0,0 @@ -import React, { PureComponent } from 'react' -import PropTypes from 'prop-types' -import Modal, { ModalContent } from '../../modal' - -export default class ClearApprovedOrigins extends PureComponent { - static propTypes = { - hideModal: PropTypes.func.isRequired, - clearApprovedOrigins: PropTypes.func.isRequired, - } - - static contextTypes = { - t: PropTypes.func, - } - - handleClear = () => { - const { clearApprovedOrigins, hideModal } = this.props - clearApprovedOrigins() - hideModal() - } - - render () { - const { t } = this.context - - return ( - this.props.hideModal()} - submitText={t('ok')} - cancelText={t('nevermind')} - submitType="secondary" - > - - - ) - } -} diff --git a/ui/app/components/app/modals/clear-approved-origins/clear-approved-origins.container.js b/ui/app/components/app/modals/clear-approved-origins/clear-approved-origins.container.js deleted file mode 100644 index 2276bc7e7822..000000000000 --- a/ui/app/components/app/modals/clear-approved-origins/clear-approved-origins.container.js +++ /dev/null @@ -1,16 +0,0 @@ -import { connect } from 'react-redux' -import { compose } from 'recompose' -import withModalProps from '../../../../helpers/higher-order-components/with-modal-props' -import ClearApprovedOriginsComponent from './clear-approved-origins.component' -import { clearApprovedOrigins } from '../../../../store/actions' - -const mapDispatchToProps = dispatch => { - return { - clearApprovedOrigins: () => dispatch(clearApprovedOrigins()), - } -} - -export default compose( - withModalProps, - connect(null, mapDispatchToProps) -)(ClearApprovedOriginsComponent) diff --git a/ui/app/components/app/modals/clear-approved-origins/index.js b/ui/app/components/app/modals/clear-approved-origins/index.js deleted file mode 100644 index b3e321995189..000000000000 --- a/ui/app/components/app/modals/clear-approved-origins/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './clear-approved-origins.container' diff --git a/ui/app/components/app/modals/confirm-delete-network/confirm-delete-network.component.js b/ui/app/components/app/modals/confirm-delete-network/confirm-delete-network.component.js new file mode 100644 index 000000000000..ea92e340c542 --- /dev/null +++ b/ui/app/components/app/modals/confirm-delete-network/confirm-delete-network.component.js @@ -0,0 +1,43 @@ +import React, { PureComponent } from 'react' +import PropTypes from 'prop-types' +import Modal, { ModalContent } from '../../modal' + +export default class ConfirmDeleteNetwork extends PureComponent { + static propTypes = { + hideModal: PropTypes.func.isRequired, + delRpcTarget: PropTypes.func.isRequired, + onConfirm: PropTypes.func.isRequired, + target: PropTypes.string.isRequired, + } + + static contextTypes = { + t: PropTypes.func, + } + + handleDelete = () => { + this.props.delRpcTarget(this.props.target) + .then(() => { + this.props.onConfirm() + this.props.hideModal() + }) + } + + render () { + const { t } = this.context + + return ( + this.props.hideModal()} + submitText={t('delete')} + cancelText={t('cancel')} + submitType="danger" + > + + + ) + } +} diff --git a/ui/app/components/app/modals/confirm-delete-network/confirm-delete-network.container.js b/ui/app/components/app/modals/confirm-delete-network/confirm-delete-network.container.js new file mode 100644 index 000000000000..b6a5c99f5ece --- /dev/null +++ b/ui/app/components/app/modals/confirm-delete-network/confirm-delete-network.container.js @@ -0,0 +1,16 @@ +import { connect } from 'react-redux' +import { compose } from 'redux' +import withModalProps from '../../../../helpers/higher-order-components/with-modal-props' +import { delRpcTarget } from '../../../../store/actions' +import ConfirmDeleteNetwork from './confirm-delete-network.component' + +const mapDispatchToProps = (dispatch) => { + return { + delRpcTarget: (target) => dispatch(delRpcTarget(target)), + } +} + +export default compose( + withModalProps, + connect(null, mapDispatchToProps), +)(ConfirmDeleteNetwork) diff --git a/ui/app/components/app/modals/confirm-delete-network/index.js b/ui/app/components/app/modals/confirm-delete-network/index.js new file mode 100644 index 000000000000..de9543eea3a3 --- /dev/null +++ b/ui/app/components/app/modals/confirm-delete-network/index.js @@ -0,0 +1 @@ +export { default } from './confirm-delete-network.container' diff --git a/ui/app/components/app/modals/confirm-delete-network/tests/confirm-delete-network.test.js b/ui/app/components/app/modals/confirm-delete-network/tests/confirm-delete-network.test.js new file mode 100644 index 000000000000..adf8de80af36 --- /dev/null +++ b/ui/app/components/app/modals/confirm-delete-network/tests/confirm-delete-network.test.js @@ -0,0 +1,58 @@ +import assert from 'assert' +import React from 'react' +import sinon from 'sinon' +import { mount } from 'enzyme' +import ConfirmDeleteNetwork from '..' + +describe('Confirm Delete Network', function () { + let wrapper + + const props = { + hideModal: sinon.spy(), + delRpcTarget: sinon.stub().resolves(), + onConfirm: sinon.spy(), + target: '', + } + + beforeEach(function () { + wrapper = mount( + , { + context: { + t: (str) => str, + }, + }, + ) + }) + + afterEach(function () { + props.hideModal.resetHistory() + props.delRpcTarget.resetHistory() + props.onConfirm.resetHistory() + }) + + it('renders delete network modal title', function () { + const modalTitle = wrapper.find('.modal-content__title') + assert.equal(modalTitle.text(), 'deleteNetwork') + }) + + it('clicks cancel to hide modal', function () { + const cancelButton = wrapper.find('.button.btn-default.modal-container__footer-button') + cancelButton.simulate('click') + + assert(props.hideModal.calledOnce) + + }) + + it('clicks delete to delete the target and hides modal', function () { + const deleteButton = wrapper.find('.button.btn-danger.modal-container__footer-button') + + deleteButton.simulate('click') + + setImmediate(() => { + assert(props.delRpcTarget.calledOnce) + assert(props.hideModal.calledOnce) + assert(props.onConfirm.calledOnce) + }) + }) + +}) diff --git a/ui/app/components/app/modals/confirm-remove-account/confirm-remove-account.component.js b/ui/app/components/app/modals/confirm-remove-account/confirm-remove-account.component.js index f35fb85a01d9..4258d9462a64 100644 --- a/ui/app/components/app/modals/confirm-remove-account/confirm-remove-account.component.js +++ b/ui/app/components/app/modals/confirm-remove-account/confirm-remove-account.component.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types' import Modal from '../../modal' import { addressSummary } from '../../../../helpers/utils/util' import Identicon from '../../../ui/identicon' -import genAccountLink from '../../../../../lib/account-link' +import getAccountLink from '../../../../../lib/account-link' export default class ConfirmRemoveAccount extends Component { static propTypes = { @@ -47,8 +47,9 @@ export default class ConfirmRemoveAccount extends Component { diff --git a/ui/app/components/app/modals/confirm-remove-account/confirm-remove-account.container.js b/ui/app/components/app/modals/confirm-remove-account/confirm-remove-account.container.js index 0a3cda5b6f47..c3b54577c966 100644 --- a/ui/app/components/app/modals/confirm-remove-account/confirm-remove-account.container.js +++ b/ui/app/components/app/modals/confirm-remove-account/confirm-remove-account.container.js @@ -1,16 +1,16 @@ import { connect } from 'react-redux' -import { compose } from 'recompose' -import ConfirmRemoveAccount from './confirm-remove-account.component' +import { compose } from 'redux' import withModalProps from '../../../../helpers/higher-order-components/with-modal-props' import { removeAccount } from '../../../../store/actions' +import ConfirmRemoveAccount from './confirm-remove-account.component' -const mapStateToProps = state => { +const mapStateToProps = (state) => { return { network: state.metamask.network, } } -const mapDispatchToProps = dispatch => { +const mapDispatchToProps = (dispatch) => { return { removeAccount: (address) => dispatch(removeAccount(address)), } @@ -18,5 +18,5 @@ const mapDispatchToProps = dispatch => { export default compose( withModalProps, - connect(mapStateToProps, mapDispatchToProps) + connect(mapStateToProps, mapDispatchToProps), )(ConfirmRemoveAccount) diff --git a/ui/app/components/app/modals/confirm-remove-account/index.scss b/ui/app/components/app/modals/confirm-remove-account/index.scss index 3be3a19677dc..90fa7dd537b6 100644 --- a/ui/app/components/app/modals/confirm-remove-account/index.scss +++ b/ui/app/components/app/modals/confirm-remove-account/index.scss @@ -1,7 +1,7 @@ .confirm-remove-account { &__description { text-align: center; - font-size: .875rem; + font-size: 0.875rem; } &__account { @@ -55,4 +55,4 @@ &__link { color: #2f9ae0; } -} \ No newline at end of file +} diff --git a/ui/app/components/app/modals/confirm-remove-account/tests/confirm-remove-account.test.js b/ui/app/components/app/modals/confirm-remove-account/tests/confirm-remove-account.test.js new file mode 100644 index 000000000000..12f6d365563d --- /dev/null +++ b/ui/app/components/app/modals/confirm-remove-account/tests/confirm-remove-account.test.js @@ -0,0 +1,81 @@ +import assert from 'assert' +import React from 'react' +import PropTypes from 'prop-types' +import { Provider } from 'react-redux' +import sinon from 'sinon' +import configureStore from 'redux-mock-store' +import { mount } from 'enzyme' +import ConfirmRemoveAccount from '..' + +describe('Confirm Remove Account', function () { + let wrapper + + const state = { + metamask: { + + }, + } + + const props = { + hideModal: sinon.spy(), + removeAccount: sinon.stub().resolves(), + network: '101', + identity: { + address: '0xAddress', + name: 'Account 1', + }, + } + + const mockStore = configureStore() + const store = mockStore(state) + + beforeEach(function () { + + wrapper = mount( + + + , { + context: { + t: (str) => str, + store, + }, + childContextTypes: { + t: PropTypes.func, + store: PropTypes.object, + }, + }, + ) + }) + + afterEach(function () { + props.hideModal.resetHistory() + }) + + it('nevermind', function () { + const nevermind = wrapper.find({ type: 'default' }) + nevermind.simulate('click') + + assert(props.hideModal.calledOnce) + }) + + it('remove', function (done) { + const remove = wrapper.find({ type: 'secondary' }) + remove.simulate('click') + + assert(props.removeAccount.calledOnce) + assert.equal(props.removeAccount.getCall(0).args[0], props.identity.address) + + setImmediate(() => { + assert(props.hideModal.calledOnce) + done() + }) + + }) + + it('closes', function () { + const close = wrapper.find('.modal-container__header-close') + close.simulate('click') + + assert(props.hideModal.calledOnce) + }) +}) diff --git a/ui/app/components/app/modals/confirm-reset-account/confirm-reset-account.component.js b/ui/app/components/app/modals/confirm-reset-account/confirm-reset-account.component.js index f1a4542ac157..84dd7fead4d6 100644 --- a/ui/app/components/app/modals/confirm-reset-account/confirm-reset-account.component.js +++ b/ui/app/components/app/modals/confirm-reset-account/confirm-reset-account.component.js @@ -26,7 +26,7 @@ export default class ConfirmResetAccount extends PureComponent { onCancel={() => this.props.hideModal()} submitText={t('reset')} cancelText={t('nevermind')} - submitType="secondary" + submitType="danger" > { +const mapDispatchToProps = (dispatch) => { return { resetAccount: () => dispatch(resetAccount()), } @@ -12,5 +12,5 @@ const mapDispatchToProps = dispatch => { export default compose( withModalProps, - connect(null, mapDispatchToProps) + connect(null, mapDispatchToProps), )(ConfirmResetAccount) diff --git a/ui/app/components/app/modals/confirm-reset-account/tests/confirm-reset-account.test.js b/ui/app/components/app/modals/confirm-reset-account/tests/confirm-reset-account.test.js new file mode 100644 index 000000000000..0059930594bc --- /dev/null +++ b/ui/app/components/app/modals/confirm-reset-account/tests/confirm-reset-account.test.js @@ -0,0 +1,46 @@ +import assert from 'assert' +import React from 'react' +import sinon from 'sinon' +import { mount } from 'enzyme' +import ConfirmResetAccount from '..' + +describe('Confirm Reset Account', function () { + let wrapper + + const props = { + hideModal: sinon.spy(), + resetAccount: sinon.stub().resolves(), + } + + beforeEach(function () { + wrapper = mount( + , { + context: { + t: (str) => str, + }, + }, + ) + }) + + afterEach(function () { + props.hideModal.resetHistory() + }) + + it('hides modal when nevermind button is clicked', function () { + const nevermind = wrapper.find('.btn-default.modal-container__footer-button') + nevermind.simulate('click') + + assert(props.hideModal.calledOnce) + }) + + it('resets account and hides modal when reset button is clicked', function (done) { + const reset = wrapper.find('.btn-danger.modal-container__footer-button') + reset.simulate('click') + + setImmediate(() => { + assert(props.resetAccount.calledOnce) + assert(props.hideModal.calledOnce) + done() + }) + }) +}) diff --git a/ui/app/components/app/modals/customize-gas/customize-gas.component.js b/ui/app/components/app/modals/customize-gas/customize-gas.component.js deleted file mode 100644 index 387da2f79937..000000000000 --- a/ui/app/components/app/modals/customize-gas/customize-gas.component.js +++ /dev/null @@ -1,162 +0,0 @@ -import React, { Component } from 'react' -import PropTypes from 'prop-types' -import BigNumber from 'bignumber.js' -import GasModalCard from '../../customize-gas-modal/gas-modal-card' -import { MIN_GAS_PRICE_GWEI } from '../../../../pages/send/send.constants' -import Button from '../../../ui/button' - -import { - getDecimalGasLimit, - getDecimalGasPrice, - getPrefixedHexGasLimit, - getPrefixedHexGasPrice, -} from './customize-gas.util' - -export default class CustomizeGas extends Component { - static contextTypes = { - t: PropTypes.func, - metricsEvent: PropTypes.func, - } - - static propTypes = { - txData: PropTypes.object.isRequired, - hideModal: PropTypes.func, - validate: PropTypes.func, - onSubmit: PropTypes.func, - } - - state = { - gasPrice: 0, - gasLimit: 0, - originalGasPrice: 0, - originalGasLimit: 0, - } - - componentDidMount () { - const { txData = {} } = this.props - const { txParams: { gas: hexGasLimit, gasPrice: hexGasPrice } = {} } = txData - - const gasLimit = getDecimalGasLimit(hexGasLimit) - const gasPrice = getDecimalGasPrice(hexGasPrice) - - this.setState({ - gasPrice, - gasLimit, - originalGasPrice: gasPrice, - originalGasLimit: gasLimit, - }) - } - - handleRevert () { - const { originalGasPrice, originalGasLimit } = this.state - - this.setState({ - gasPrice: originalGasPrice, - gasLimit: originalGasLimit, - }) - } - - handleSave () { - const { onSubmit, hideModal } = this.props - const { gasLimit, gasPrice } = this.state - const prefixedHexGasPrice = getPrefixedHexGasPrice(gasPrice) - const prefixedHexGasLimit = getPrefixedHexGasLimit(gasLimit) - - Promise.resolve(onSubmit({ gasPrice: prefixedHexGasPrice, gasLimit: prefixedHexGasLimit })) - .then(() => hideModal()) - } - - validate () { - const { gasLimit, gasPrice } = this.state - return this.props.validate({ - gasPrice: getPrefixedHexGasPrice(gasPrice), - gasLimit: getPrefixedHexGasLimit(gasLimit), - }) - } - - render () { - const { t, metricsEvent } = this.context - const { hideModal } = this.props - const { gasPrice, gasLimit, originalGasPrice, originalGasLimit } = this.state - const { valid, errorKey } = this.validate() - - return ( -
    -
    -
    -
    - { this.context.t('customGas') } -
    -
    hideModal()} - /> -
    -
    - this.setState({ gasPrice: value })} - title={t('gasPrice')} - copy={t('gasPriceCalculation')} - /> - this.setState({ gasLimit: value })} - title={t('gasLimit')} - copy={t('gasLimitCalculation')} - /> -
    -
    - { !valid &&
    { t(errorKey) }
    } -
    this.handleRevert()} - > - { t('revert') } -
    -
    - - -
    -
    -
    -
    - ) - } -} diff --git a/ui/app/components/app/modals/customize-gas/customize-gas.container.js b/ui/app/components/app/modals/customize-gas/customize-gas.container.js deleted file mode 100644 index 221881a8ae89..000000000000 --- a/ui/app/components/app/modals/customize-gas/customize-gas.container.js +++ /dev/null @@ -1,22 +0,0 @@ -import { connect } from 'react-redux' -import CustomizeGas from './customize-gas.component' -import { hideModal } from '../../../../store/actions' - -const mapStateToProps = state => { - const { appState: { modal: { modalState: { props } } } } = state - const { txData, onSubmit, validate } = props - - return { - txData, - onSubmit, - validate, - } -} - -const mapDispatchToProps = dispatch => { - return { - hideModal: () => dispatch(hideModal()), - } -} - -export default connect(mapStateToProps, mapDispatchToProps)(CustomizeGas) diff --git a/ui/app/components/app/modals/customize-gas/customize-gas.util.js b/ui/app/components/app/modals/customize-gas/customize-gas.util.js deleted file mode 100644 index e686183bddd6..000000000000 --- a/ui/app/components/app/modals/customize-gas/customize-gas.util.js +++ /dev/null @@ -1,34 +0,0 @@ -import ethUtil from 'ethereumjs-util' -import { conversionUtil } from '../../../../helpers/utils/conversion-util' - -export function getDecimalGasLimit (hexGasLimit) { - return conversionUtil(hexGasLimit, { - fromNumericBase: 'hex', - toNumericBase: 'dec', - }) -} - -export function getDecimalGasPrice (hexGasPrice) { - return conversionUtil(hexGasPrice, { - fromNumericBase: 'hex', - toNumericBase: 'dec', - fromDenomination: 'WEI', - toDenomination: 'GWEI', - }) -} - -export function getPrefixedHexGasLimit (gasLimit) { - return ethUtil.addHexPrefix(conversionUtil(gasLimit, { - fromNumericBase: 'dec', - toNumericBase: 'hex', - })) -} - -export function getPrefixedHexGasPrice (gasPrice) { - return ethUtil.addHexPrefix(conversionUtil(gasPrice, { - fromNumericBase: 'dec', - toNumericBase: 'hex', - fromDenomination: 'GWEI', - toDenomination: 'WEI', - })) -} diff --git a/ui/app/components/app/modals/customize-gas/index.js b/ui/app/components/app/modals/customize-gas/index.js deleted file mode 100644 index 3a0ab7edcde7..000000000000 --- a/ui/app/components/app/modals/customize-gas/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './customize-gas.container' diff --git a/ui/app/components/app/modals/customize-gas/index.scss b/ui/app/components/app/modals/customize-gas/index.scss deleted file mode 100644 index e10452691293..000000000000 --- a/ui/app/components/app/modals/customize-gas/index.scss +++ /dev/null @@ -1,110 +0,0 @@ -.customize-gas { - border: 1px solid #D8D8D8; - border-radius: 4px; - background-color: #FFFFFF; - box-shadow: 0 2px 4px 0 rgba(0,0,0,0.14); - font-family: Roboto; - display: flex; - flex-flow: column; - - @media screen and (max-width: $break-small) { - width: 100vw; - height: 100vh; - } - - &__header { - height: 52px; - border-bottom: 1px solid $alto; - display: flex; - align-items: center; - justify-content: space-between; - font-size: 22px; - - @media screen and (max-width: $break-small) { - flex: 0 0 auto; - } - } - - &__title { - margin-left: 19.25px; - } - - &__close::after { - content: '\00D7'; - font-size: 1.8em; - color: $dusty-gray; - font-family: sans-serif; - cursor: pointer; - margin-right: 19.25px; - } - - &__content { - display: flex; - flex-flow: column nowrap; - height: 100%; - } - - &__body { - display: flex; - margin-bottom: 24px; - - @media screen and (max-width: $break-small) { - flex-flow: column; - flex: 1 1 auto; - } - } - - &__footer { - height: 75px; - border-top: 1px solid $alto; - display: flex; - align-items: center; - justify-content: space-between; - font-size: 22px; - position: relative; - - @media screen and (max-width: $break-small) { - flex: 0 0 auto; - } - } - - &__buttons { - display: flex; - justify-content: space-between; - margin-right: 21.25px; - } - - &__revert, &__cancel, &__save, &__save__error { - display: flex; - justify-content: center; - align-items: center; - padding: 0 3px; - cursor: pointer; - } - - &__revert { - color: $silver-chalice; - font-size: 16px; - margin-left: 21.25px; - } - - &__cancel, &__save, &__save__error { - width: 85.74px; - min-width: initial; - } - - &__save__error { - opacity: 0.5; - cursor: auto; - } - - &__error-message { - display: block; - position: absolute; - top: 4px; - right: 4px; - font-size: 12px; - line-height: 12px; - color: $red; - } -} diff --git a/ui/app/components/app/modals/deposit-ether-modal.js b/ui/app/components/app/modals/deposit-ether-modal.js deleted file mode 100644 index 20c4d018c49f..000000000000 --- a/ui/app/components/app/modals/deposit-ether-modal.js +++ /dev/null @@ -1,209 +0,0 @@ -const Component = require('react').Component -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const inherits = require('util').inherits -const connect = require('react-redux').connect -const actions = require('../../../store/actions') -const { getNetworkDisplayName } = require('../../../../../app/scripts/controllers/network/util') - -import Button from '../../ui/button' - -let DIRECT_DEPOSIT_ROW_TITLE -let DIRECT_DEPOSIT_ROW_TEXT -let WYRE_ROW_TITLE -let WYRE_ROW_TEXT -let FAUCET_ROW_TITLE -let COINSWITCH_ROW_TITLE -let COINSWITCH_ROW_TEXT - -function mapStateToProps (state) { - return { - network: state.metamask.network, - address: state.metamask.selectedAddress, - } -} - -function mapDispatchToProps (dispatch) { - return { - toWyre: (address) => { - dispatch(actions.buyEth({ service: 'wyre', address, amount: 0 })) - }, - toCoinSwitch: (address) => { - dispatch(actions.buyEth({ service: 'coinswitch', address })) - }, - hideModal: () => { - dispatch(actions.hideModal()) - }, - hideWarning: () => { - dispatch(actions.hideWarning()) - }, - showAccountDetailModal: () => { - dispatch(actions.showModal({ name: 'ACCOUNT_DETAILS' })) - }, - toFaucet: network => dispatch(actions.buyEth({ network })), - } -} - -inherits(DepositEtherModal, Component) -function DepositEtherModal (_, context) { - Component.call(this) - - // need to set after i18n locale has loaded - DIRECT_DEPOSIT_ROW_TITLE = context.t('directDepositEther') - DIRECT_DEPOSIT_ROW_TEXT = context.t('directDepositEtherExplainer') - WYRE_ROW_TITLE = context.t('buyWithWyre') - WYRE_ROW_TEXT = context.t('buyWithWyreDescription') - FAUCET_ROW_TITLE = context.t('testFaucet') - COINSWITCH_ROW_TITLE = context.t('buyCoinSwitch') - COINSWITCH_ROW_TEXT = context.t('buyCoinSwitchExplainer') -} - -DepositEtherModal.contextTypes = { - t: PropTypes.func, -} - -module.exports = connect(mapStateToProps, mapDispatchToProps)(DepositEtherModal) - - -DepositEtherModal.prototype.facuetRowText = function (networkName) { - return this.context.t('getEtherFromFaucet', [networkName]) -} - -DepositEtherModal.prototype.renderRow = function ({ - logo, - title, - text, - buttonLabel, - onButtonClick, - hide, - className, - hideButton, - hideTitle, - onBackClick, - showBackButton, -}) { - if (hide) { - return null - } - - return h('div', { - className: className || 'deposit-ether-modal__buy-row', - }, [ - - onBackClick && showBackButton && h('div.deposit-ether-modal__buy-row__back', { - onClick: onBackClick, - }, [ - - h('i.fa.fa-arrow-left.cursor-pointer'), - - ]), - - h('div.deposit-ether-modal__buy-row__logo-container', [logo]), - - h('div.deposit-ether-modal__buy-row__description', [ - - !hideTitle && h('div.deposit-ether-modal__buy-row__description__title', [title]), - - h('div.deposit-ether-modal__buy-row__description__text', [text]), - - ]), - - !hideButton && h('div.deposit-ether-modal__buy-row__button', [ - h(Button, { - type: 'secondary', - className: 'deposit-ether-modal__deposit-button', - large: true, - onClick: onButtonClick, - }, [buttonLabel]), - ]), - - ]) -} - -DepositEtherModal.prototype.render = function () { - const { network, toWyre, toCoinSwitch, address, toFaucet } = this.props - - const isTestNetwork = ['3', '4', '5', '42'].find(n => n === network) - const networkName = getNetworkDisplayName(network) - - return h('div.page-container.page-container--full-width.page-container--full-height', {}, [ - - h('div.page-container__header', [ - - h('div.page-container__title', [this.context.t('depositEther')]), - - h('div.page-container__subtitle', [ - this.context.t('needEtherInWallet'), - ]), - - h('div.page-container__header-close', { - onClick: () => { - this.props.hideWarning() - this.props.hideModal() - }, - }), - - ]), - - h('.page-container__content', {}, [ - - h('div.deposit-ether-modal__buy-rows', [ - - this.renderRow({ - logo: h('img.deposit-ether-modal__logo', { - src: './images/deposit-eth.svg', - }), - title: DIRECT_DEPOSIT_ROW_TITLE, - text: DIRECT_DEPOSIT_ROW_TEXT, - buttonLabel: this.context.t('viewAccount'), - onButtonClick: () => this.goToAccountDetailsModal(), - }), - - this.renderRow({ - logo: h('i.fa.fa-tint.fa-2x'), - title: FAUCET_ROW_TITLE, - text: this.facuetRowText(networkName), - buttonLabel: this.context.t('getEther'), - onButtonClick: () => toFaucet(network), - hide: !isTestNetwork, - }), - - this.renderRow({ - logo: h('div.deposit-ether-modal__logo', { - style: { - backgroundImage: 'url(\'./images/wyre.svg\')', - height: '40px', - }, - }), - title: WYRE_ROW_TITLE, - text: WYRE_ROW_TEXT, - buttonLabel: this.context.t('continueToWyre'), - onButtonClick: () => toWyre(address), - hide: isTestNetwork, - }), - - this.renderRow({ - logo: h('div.deposit-ether-modal__logo', { - style: { - backgroundImage: 'url(\'./images/coinswitch_logo.png\')', - height: '40px', - }, - }), - title: COINSWITCH_ROW_TITLE, - text: COINSWITCH_ROW_TEXT, - buttonLabel: this.context.t('continueToCoinSwitch'), - onButtonClick: () => toCoinSwitch(address), - hide: isTestNetwork, - }), - - ]), - - ]), - ]) -} - -DepositEtherModal.prototype.goToAccountDetailsModal = function () { - this.props.hideWarning() - this.props.hideModal() - this.props.showAccountDetailModal() -} diff --git a/ui/app/components/app/modals/deposit-ether-modal/deposit-ether-modal.component.js b/ui/app/components/app/modals/deposit-ether-modal/deposit-ether-modal.component.js new file mode 100644 index 000000000000..0170682d9b06 --- /dev/null +++ b/ui/app/components/app/modals/deposit-ether-modal/deposit-ether-modal.component.js @@ -0,0 +1,187 @@ +import PropTypes from 'prop-types' +import React, { Component } from 'react' +import { getNetworkDisplayName } from '../../../../../../app/scripts/controllers/network/util' +import Button from '../../../ui/button' + +export default class DepositEtherModal extends Component { + static contextTypes = { + t: PropTypes.func, + metricsEvent: PropTypes.func.isRequired, + } + + static propTypes = { + network: PropTypes.string.isRequired, + toWyre: PropTypes.func.isRequired, + toCoinSwitch: PropTypes.func.isRequired, + address: PropTypes.string.isRequired, + toFaucet: PropTypes.func.isRequired, + hideWarning: PropTypes.func.isRequired, + hideModal: PropTypes.func.isRequired, + showAccountDetailModal: PropTypes.func.isRequired, + } + + faucetRowText = (networkName) => { + return this.context.t('getEtherFromFaucet', [networkName]) + } + + goToAccountDetailsModal = () => { + this.props.hideWarning() + this.props.hideModal() + this.props.showAccountDetailModal() + } + + renderRow ({ + logo, + title, + text, + buttonLabel, + onButtonClick, + hide, + className, + hideButton, + hideTitle, + onBackClick, + showBackButton, + }) { + if (hide) { + return null + } + + return ( +
    + {onBackClick && showBackButton && ( +
    + +
    + )} +
    {logo}
    +
    + {!hideTitle && ( +
    {title}
    + )} +
    {text}
    +
    + {!hideButton && ( +
    + +
    + )} +
    + ) + } + + render () { + const { network, toWyre, toCoinSwitch, address, toFaucet } = this.props + + const isTestNetwork = ['3', '4', '5', '42'].find((n) => n === network) + const networkName = getNetworkDisplayName(network) + + return ( +
    +
    +
    + {this.context.t('depositEther')} +
    +
    + {this.context.t('needEtherInWallet')} +
    +
    { + this.props.hideWarning() + this.props.hideModal() + }} + /> +
    +
    +
    + {this.renderRow({ + logo: ( + + ), + title: this.context.t('directDepositEther'), + text: this.context.t('directDepositEtherExplainer'), + buttonLabel: this.context.t('viewAccount'), + onButtonClick: () => this.goToAccountDetailsModal(), + })} + {this.renderRow({ + logo: , + title: this.context.t('testFaucet'), + text: this.faucetRowText(networkName), + buttonLabel: this.context.t('getEther'), + onButtonClick: () => toFaucet(network), + hide: !isTestNetwork, + })} + {this.renderRow({ + logo: ( +
    + ), + title: this.context.t('buyWithWyre'), + text: this.context.t('buyWithWyreDescription'), + buttonLabel: this.context.t('continueToWyre'), + onButtonClick: () => { + this.context.metricsEvent({ + eventOpts: { + category: 'Accounts', + action: 'Deposit Ether', + name: 'Click buy Ether via Wyre', + }, + }) + toWyre(address) + }, + hide: isTestNetwork, + })} + {this.renderRow({ + logo: ( +
    + ), + title: this.context.t('buyCoinSwitch'), + text: this.context.t('buyCoinSwitchExplainer'), + buttonLabel: this.context.t('continueToCoinSwitch'), + onButtonClick: () => { + this.context.metricsEvent({ + eventOpts: { + category: 'Accounts', + action: 'Deposit Ether', + name: 'Click buy Ether via CoinSwitch', + }, + }) + toCoinSwitch(address) + }, + hide: isTestNetwork, + })} +
    +
    +
    + ) + } +} diff --git a/ui/app/components/app/modals/deposit-ether-modal/deposit-ether-modal.container.js b/ui/app/components/app/modals/deposit-ether-modal/deposit-ether-modal.container.js new file mode 100644 index 000000000000..7217ac21e128 --- /dev/null +++ b/ui/app/components/app/modals/deposit-ether-modal/deposit-ether-modal.container.js @@ -0,0 +1,33 @@ +import { connect } from 'react-redux' +import { buyEth, hideModal, showModal, hideWarning } from '../../../../store/actions' +import DepositEtherModal from './deposit-ether-modal.component' + +function mapStateToProps (state) { + return { + network: state.metamask.network, + address: state.metamask.selectedAddress, + } +} + +function mapDispatchToProps (dispatch) { + return { + toWyre: (address) => { + dispatch(buyEth({ service: 'wyre', address })) + }, + toCoinSwitch: (address) => { + dispatch(buyEth({ service: 'coinswitch', address })) + }, + hideModal: () => { + dispatch(hideModal()) + }, + hideWarning: () => { + dispatch(hideWarning()) + }, + showAccountDetailModal: () => { + dispatch(showModal({ name: 'ACCOUNT_DETAILS' })) + }, + toFaucet: (network) => dispatch(buyEth({ network })), + } +} + +export default connect(mapStateToProps, mapDispatchToProps)(DepositEtherModal) diff --git a/ui/app/components/app/modals/deposit-ether-modal/index.js b/ui/app/components/app/modals/deposit-ether-modal/index.js new file mode 100644 index 000000000000..01a262a73ea7 --- /dev/null +++ b/ui/app/components/app/modals/deposit-ether-modal/index.js @@ -0,0 +1 @@ +export { default } from './deposit-ether-modal.container' diff --git a/ui/app/components/app/modals/deposit-ether-modal/index.scss b/ui/app/components/app/modals/deposit-ether-modal/index.scss new file mode 100644 index 000000000000..c52e4e5637ca --- /dev/null +++ b/ui/app/components/app/modals/deposit-ether-modal/index.scss @@ -0,0 +1,162 @@ +.deposit-ether-modal { + border-radius: 8px; + display: flex; + flex-flow: column; + height: 100%; + + &__header { + width: 100%; + border-radius: 8px 8px 0 0; + background-color: $mid-gray; + display: flex; + position: relative; + padding: 25px; + flex-flow: column; + align-items: flex-start; + + &__title { + color: $white; + font-size: 24px; + line-height: 32px; + } + + &__description { + color: $white; + font-size: 16px; + line-height: 22px; + margin-top: 10px; + } + + &__close::after { + content: '\00D7'; + font-size: 2em; + color: $white; + position: absolute; + top: 20.8px; + right: 28px; + cursor: pointer; + } + } + + &__buy-rows { + width: 100%; + padding: 0 30px; + display: flex; + flex-flow: column nowrap; + flex: 1; + align-items: center; + + @media screen and (max-width: 575px) { + height: 0; + } + } + + &__logo { + height: 60px; + background-repeat: no-repeat; + background-size: contain; + background-position: center; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + } + + &__buy-row { + border-bottom: 1px solid $alto; + display: flex; + justify-content: space-between; + align-items: center; + flex: 1 0 auto; + padding: 30px 0 20px; + min-height: 170px; + + @media screen and (max-width: 575px) { + min-height: 270px; + flex-flow: column; + justify-content: flex-start; + } + + &__back { + position: absolute; + top: 10px; + left: 0; + } + + &__logo-container { + display: flex; + justify-content: center; + flex: 0 0 auto; + padding: 0 20px; + + @media screen and (min-width: 576px) { + width: 12rem; + } + + @media screen and (max-width: 575px) { + width: 100%; + max-height: 6rem; + padding-bottom: 20px; + } + } + + &__right { + display: flex; + } + + &__description { + color: $cape-cod; + padding-bottom: 20px; + align-self: flex-start; + + @media screen and (min-width: 575px) { + width: 15rem; + } + + &__title { + font-size: 20px; + line-height: 30px; + } + + &__text { + font-size: 14px; + line-height: 22px; + margin-top: 7px; + } + } + + &__button { + display: flex; + justify-content: flex-end; + + @media screen and (min-width: 575px) { + min-width: 300px; + } + } + } + + &__buy-row:last-of-type { + border-bottom: 0; + } + + &__deposit-button { + width: 257px; + } + + .simple-dropdown { + color: #5b5d67; + font-size: 16px; + line-height: 21px; + border: 1px solid #d8d8d8; + background-color: #fff; + text-align: center; + width: 100%; + height: 45px; + line-height: 44px; + font-weight: 300; + } + + .simple-dropdown__selected { + text-align: center; + } +} diff --git a/ui/app/components/app/modals/edit-account-name-modal.js b/ui/app/components/app/modals/edit-account-name-modal.js deleted file mode 100644 index aa21765c43e4..000000000000 --- a/ui/app/components/app/modals/edit-account-name-modal.js +++ /dev/null @@ -1,83 +0,0 @@ -const Component = require('react').Component -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const inherits = require('util').inherits -const connect = require('react-redux').connect -const actions = require('../../../store/actions') -const { getSelectedAccount } = require('../../../selectors/selectors') - -function mapStateToProps (state) { - return { - selectedAccount: getSelectedAccount(state), - identity: state.appState.modal.modalState.props.identity, - } -} - -function mapDispatchToProps (dispatch) { - return { - hideModal: () => { - dispatch(actions.hideModal()) - }, - setAccountLabel: (account, label) => { - dispatch(actions.setAccountLabel(account, label)) - }, - } -} - -inherits(EditAccountNameModal, Component) -function EditAccountNameModal (props) { - Component.call(this) - - this.state = { - inputText: props.identity.name, - } -} - -EditAccountNameModal.contextTypes = { - t: PropTypes.func, -} - -module.exports = connect(mapStateToProps, mapDispatchToProps)(EditAccountNameModal) - - -EditAccountNameModal.prototype.render = function () { - const { hideModal, setAccountLabel, identity } = this.props - - return h('div', {}, [ - h('div.flex-column.edit-account-name-modal-content', { - }, [ - - h('div.edit-account-name-modal-cancel', { - onClick: () => { - hideModal() - }, - }, [ - h('i.fa.fa-times'), - ]), - - h('div.edit-account-name-modal-title', { - }, [this.context.t('editAccountName')]), - - h('input.edit-account-name-modal-input', { - placeholder: identity.name, - onChange: (event) => { - this.setState({ inputText: event.target.value }) - }, - value: this.state.inputText, - }, []), - - h('button.button.btn-secondary.edit-account-name-modal-save-button.allcaps', { - onClick: () => { - if (this.state.inputText.length !== 0) { - setAccountLabel(identity.address, this.state.inputText) - hideModal() - } - }, - disabled: this.state.inputText.length === 0, - }, [ - this.context.t('save'), - ]), - - ]), - ]) -} diff --git a/ui/app/components/app/modals/edit-approval-permission/edit-approval-permission.component.js b/ui/app/components/app/modals/edit-approval-permission/edit-approval-permission.component.js new file mode 100644 index 000000000000..9354dad2c2a3 --- /dev/null +++ b/ui/app/components/app/modals/edit-approval-permission/edit-approval-permission.component.js @@ -0,0 +1,220 @@ +import React, { PureComponent } from 'react' +import PropTypes from 'prop-types' +import log from 'loglevel' +import classnames from 'classnames' +import BigNumber from 'bignumber.js' +import Modal from '../../modal' +import Identicon from '../../../ui/identicon' +import TextField from '../../../ui/text-field' +import { calcTokenAmount } from '../../../../helpers/utils/token-util' + +const MAX_UNSIGNED_256_INT = new BigNumber(2).pow(256).minus(1).toString(10) + +export default class EditApprovalPermission extends PureComponent { + static propTypes = { + decimals: PropTypes.number, + hideModal: PropTypes.func.isRequired, + selectedIdentity: PropTypes.object, + tokenAmount: PropTypes.string, + customTokenAmount: PropTypes.string, + tokenSymbol: PropTypes.string, + tokenBalance: PropTypes.string, + setCustomAmount: PropTypes.func, + origin: PropTypes.string.isRequired, + } + + static contextTypes = { + t: PropTypes.func, + } + + state = { + customSpendLimit: this.props.customTokenAmount, + selectedOptionIsUnlimited: !this.props.customTokenAmount, + } + + renderModalContent (error) { + const { t } = this.context + const { + hideModal, + selectedIdentity, + tokenAmount, + tokenSymbol, + tokenBalance, + customTokenAmount, + origin, + } = this.props + const { name, address } = selectedIdentity || {} + const { selectedOptionIsUnlimited } = this.state + + return ( +
    +
    +
    + { t('editPermission') } +
    +
    hideModal()} + /> +
    +
    +
    + +
    { name }
    +
    { t('balance') }
    +
    +
    + {`${Number(tokenBalance).toPrecision(9)} ${tokenSymbol}`} +
    +
    +
    +
    + { t('spendLimitPermission') } +
    +
    + { t('allowWithdrawAndSpend', [origin]) } +
    +
    +
    this.setState({ selectedOptionIsUnlimited: true })} + > +
    +
    + { selectedOptionIsUnlimited &&
    } +
    +
    +
    + { + (new BigNumber(tokenAmount)).lessThan(new BigNumber(tokenBalance)) + ? t('proposedApprovalLimit') + : t('unlimited') + } +
    +
    + { t('spendLimitRequestedBy', [origin]) } +
    +
    + {`${Number(tokenAmount)} ${tokenSymbol}`} +
    +
    +
    +
    +
    this.setState({ selectedOptionIsUnlimited: false })} + > +
    +
    + { !selectedOptionIsUnlimited &&
    } +
    +
    +
    + { t('customSpendLimit') } +
    +
    + { t('enterMaxSpendLimit') } +
    +
    + { + this.setState({ customSpendLimit: event.target.value }) + if (selectedOptionIsUnlimited) { + this.setState({ selectedOptionIsUnlimited: false }) + } + }} + fullWidth + margin="dense" + value={ this.state.customSpendLimit } + error={error} + /> +
    +
    +
    +
    +
    + ) + } + + validateSpendLimit () { + const { t } = this.context + const { decimals } = this.props + const { selectedOptionIsUnlimited, customSpendLimit } = this.state + + if (selectedOptionIsUnlimited || !customSpendLimit) { + return undefined + } + + let customSpendLimitNumber + try { + customSpendLimitNumber = new BigNumber(customSpendLimit) + } catch (error) { + log.debug(`Error converting '${customSpendLimit}' to BigNumber:`, error) + return t('spendLimitInvalid') + } + + if (customSpendLimitNumber.isNegative()) { + return t('spendLimitInvalid') + } + + const maxTokenAmount = calcTokenAmount(MAX_UNSIGNED_256_INT, decimals) + if (customSpendLimitNumber.greaterThan(maxTokenAmount)) { + return t('spendLimitTooLarge') + } + + return undefined + } + + render () { + const { t } = this.context + const { setCustomAmount, hideModal, customTokenAmount } = this.props + const { selectedOptionIsUnlimited, customSpendLimit } = this.state + + const error = this.validateSpendLimit() + const disabled = Boolean( + (customSpendLimit === customTokenAmount && !selectedOptionIsUnlimited) || + error, + ) + + return ( + { + setCustomAmount(selectedOptionIsUnlimited ? '' : customSpendLimit) + hideModal() + }} + submitText={t('save')} + submitType="primary" + contentClass="edit-approval-permission-modal-content" + containerClass="edit-approval-permission-modal-container" + submitDisabled={disabled} + > + { this.renderModalContent(error) } + + ) + } +} diff --git a/ui/app/components/app/modals/edit-approval-permission/edit-approval-permission.container.js b/ui/app/components/app/modals/edit-approval-permission/edit-approval-permission.container.js new file mode 100644 index 000000000000..671d99cf616a --- /dev/null +++ b/ui/app/components/app/modals/edit-approval-permission/edit-approval-permission.container.js @@ -0,0 +1,18 @@ +import { connect } from 'react-redux' +import { compose } from 'redux' +import withModalProps from '../../../../helpers/higher-order-components/with-modal-props' +import { getSelectedIdentity } from '../../../../selectors' +import EditApprovalPermission from './edit-approval-permission.component' + +const mapStateToProps = (state) => { + const modalStateProps = state.appState.modal.modalState.props || {} + return { + selectedIdentity: getSelectedIdentity(state), + ...modalStateProps, + } +} + +export default compose( + withModalProps, + connect(mapStateToProps), +)(EditApprovalPermission) diff --git a/ui/app/components/app/modals/edit-approval-permission/index.js b/ui/app/components/app/modals/edit-approval-permission/index.js new file mode 100644 index 000000000000..3f50d3e9991e --- /dev/null +++ b/ui/app/components/app/modals/edit-approval-permission/index.js @@ -0,0 +1 @@ +export { default } from './edit-approval-permission.container' diff --git a/ui/app/components/app/modals/edit-approval-permission/index.scss b/ui/app/components/app/modals/edit-approval-permission/index.scss new file mode 100644 index 000000000000..0b80db408300 --- /dev/null +++ b/ui/app/components/app/modals/edit-approval-permission/index.scss @@ -0,0 +1,167 @@ +.edit-approval-permission { + width: 100%; + + &__header, + &__account-info { + display: flex; + justify-content: center; + align-items: center; + position: relative; + border-bottom: 1px solid #d2d8dd; + } + + &__header { + padding: 24px; + + &__close { + position: absolute; + right: 24px; + background-image: url("/images/close-gray.svg"); + width: 0.75rem; + height: 0.75rem; + cursor: pointer; + } + } + + &__title { + font-weight: bold; + font-size: 18px; + line-height: 25px; + } + + &__account-info { + justify-content: space-between; + padding: 8px 24px; + + &__account, + &__balance { + font-weight: normal; + font-size: 14px; + color: #24292e; + } + + &__account { + display: flex; + align-items: center; + } + + &__name { + margin-left: 8px; + margin-right: 8px; + } + + &__balance { + color: #6a737d; + } + } + + &__edit-section { + padding: 24px; + + &__title { + font-weight: bold; + font-size: 14px; + line-height: 20px; + color: #24292e; + } + + &__description { + font-weight: normal; + font-size: 12px; + line-height: 17px; + color: #6a737d; + margin-top: 8px; + } + + &__option { + display: flex; + align-items: flex-start; + margin-top: 20px; + } + + &__radio-button { + width: 18px; + } + + &__option-text { + display: flex; + flex-direction: column; + } + + &__option-label, + &__option-label--selected { + font-weight: normal; + font-size: 14px; + line-height: 20px; + color: #474b4d; + } + + &__option-label--selected { + color: $primary-blue; + } + + &__option-description { + font-weight: normal; + font-size: 12px; + line-height: 17px; + color: #6a737d; + margin-top: 8px; + margin-bottom: 6px; + } + + &__option-value { + font-weight: normal; + font-size: 18px; + line-height: 25px; + color: #24292e; + } + + &__radio-button { + position: relative; + width: 18px; + height: 18px; + display: flex; + justify-content: center; + align-items: center; + margin-right: 4px; + } + + &__radio-button-outline, + &__radio-button-outline--selected { + width: 18px; + height: 18px; + background: #dadcdd; + border-radius: 9px; + position: absolute; + } + + &__radio-button-outline--selected { + background: $primary-blue; + } + + &__radio-button-fill { + width: 14px; + height: 14px; + background: white; + border-radius: 7px; + position: absolute; + } + + &__radio-button-dot { + width: 8px; + height: 8px; + background: $primary-blue; + border-radius: 4px; + position: absolute; + } + } +} + +.edit-approval-permission-modal-content { + padding: 0; +} + +.edit-approval-permission-modal-container { + max-height: 550px; + width: 100%; +} diff --git a/ui/app/components/app/modals/export-private-key-modal.js b/ui/app/components/app/modals/export-private-key-modal.js deleted file mode 100644 index c3098a16c1b9..000000000000 --- a/ui/app/components/app/modals/export-private-key-modal.js +++ /dev/null @@ -1,177 +0,0 @@ -const log = require('loglevel') -const Component = require('react').Component -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const inherits = require('util').inherits -const connect = require('react-redux').connect -const { stripHexPrefix } = require('ethereumjs-util') -const actions = require('../../../store/actions') -const AccountModalContainer = require('./account-modal-container') -const { getSelectedIdentity } = require('../../../selectors/selectors') -const ReadOnlyInput = require('../../ui/readonly-input') -const copyToClipboard = require('copy-to-clipboard') -const { checksumAddress } = require('../../../helpers/utils/util') -import Button from '../../ui/button' - -function mapStateToPropsFactory () { - let selectedIdentity = null - return function mapStateToProps (state) { - // We should **not** change the identity displayed here even if it changes from underneath us. - // If we do, we will be showing the user one private key and a **different** address and name. - // Note that the selected identity **will** change from underneath us when we unlock the keyring - // which is the expected behavior that we are side-stepping. - selectedIdentity = selectedIdentity || getSelectedIdentity(state) - return { - warning: state.appState.warning, - privateKey: state.appState.accountDetail.privateKey, - network: state.metamask.network, - selectedIdentity, - previousModalState: state.appState.modal.previousModalState.name, - } - } -} - -function mapDispatchToProps (dispatch) { - return { - exportAccount: (password, address) => { - return dispatch(actions.exportAccount(password, address)) - .then((res) => { - dispatch(actions.hideWarning()) - return res - }) - }, - showAccountDetailModal: () => dispatch(actions.showModal({ name: 'ACCOUNT_DETAILS' })), - hideModal: () => dispatch(actions.hideModal()), - } -} - -inherits(ExportPrivateKeyModal, Component) -function ExportPrivateKeyModal () { - Component.call(this) - - this.state = { - password: '', - privateKey: null, - showWarning: true, - } -} - -ExportPrivateKeyModal.contextTypes = { - t: PropTypes.func, -} - -module.exports = connect(mapStateToPropsFactory, mapDispatchToProps)(ExportPrivateKeyModal) - - -ExportPrivateKeyModal.prototype.exportAccountAndGetPrivateKey = function (password, address) { - const { exportAccount } = this.props - - exportAccount(password, address) - .then(privateKey => this.setState({ - privateKey, - showWarning: false, - })) - .catch((e) => log.error(e)) -} - -ExportPrivateKeyModal.prototype.renderPasswordLabel = function (privateKey) { - return h('span.private-key-password-label', privateKey - ? this.context.t('copyPrivateKey') - : this.context.t('typePassword') - ) -} - -ExportPrivateKeyModal.prototype.renderPasswordInput = function (privateKey) { - const plainKey = privateKey && stripHexPrefix(privateKey) - - return privateKey - ? h(ReadOnlyInput, { - wrapperClass: 'private-key-password-display-wrapper', - inputClass: 'private-key-password-display-textarea', - textarea: true, - value: plainKey, - onClick: () => copyToClipboard(plainKey), - }) - : h('input.private-key-password-input', { - type: 'password', - onChange: event => this.setState({ password: event.target.value }), - }) -} - -ExportPrivateKeyModal.prototype.renderButtons = function (privateKey, address, hideModal) { - return h('div.export-private-key-buttons', {}, [ - !privateKey && h(Button, { - type: 'default', - large: true, - className: 'export-private-key__button export-private-key__button--cancel', - onClick: () => hideModal(), - }, this.context.t('cancel')), - - (privateKey - ? ( - h(Button, { - type: 'secondary', - large: true, - className: 'export-private-key__button', - onClick: () => hideModal(), - }, this.context.t('done')) - ) : ( - h(Button, { - type: 'secondary', - large: true, - className: 'export-private-key__button', - onClick: () => this.exportAccountAndGetPrivateKey(this.state.password, address), - }, this.context.t('confirm')) - ) - ), - - ]) -} - -ExportPrivateKeyModal.prototype.render = function () { - const { - selectedIdentity, - warning, - showAccountDetailModal, - hideModal, - previousModalState, - } = this.props - const { name, address } = selectedIdentity - - const { - privateKey, - showWarning, - } = this.state - - return h(AccountModalContainer, { - selectedIdentity, - showBackButton: previousModalState === 'ACCOUNT_DETAILS', - backButtonAction: () => showAccountDetailModal(), - }, [ - - h('span.account-name', name), - - h(ReadOnlyInput, { - wrapperClass: 'ellip-address-wrapper', - inputClass: 'qr-ellip-address ellip-address', - value: checksumAddress(address), - }), - - h('div.account-modal-divider'), - - h('span.modal-body-title', this.context.t('showPrivateKeys')), - - h('div.private-key-password', {}, [ - this.renderPasswordLabel(privateKey), - - this.renderPasswordInput(privateKey), - - showWarning && warning ? h('span.private-key-password-error', warning) : null, - ]), - - h('div.private-key-password-warning', this.context.t('privateKeyWarning')), - - this.renderButtons(privateKey, address, hideModal), - - ]) -} diff --git a/ui/app/components/app/modals/export-private-key-modal/export-private-key-modal.component.js b/ui/app/components/app/modals/export-private-key-modal/export-private-key-modal.component.js new file mode 100644 index 000000000000..965d5a703a9d --- /dev/null +++ b/ui/app/components/app/modals/export-private-key-modal/export-private-key-modal.component.js @@ -0,0 +1,173 @@ +import log from 'loglevel' +import PropTypes from 'prop-types' +import React, { Component } from 'react' + +import { stripHexPrefix } from 'ethereumjs-util' +import copyToClipboard from 'copy-to-clipboard' +import { checksumAddress } from '../../../../helpers/utils/util' +import ReadOnlyInput from '../../../ui/readonly-input' +import Button from '../../../ui/button' +import AccountModalContainer from '../account-modal-container' + +export default class ExportPrivateKeyModal extends Component { + static contextTypes = { + t: PropTypes.func, + } + + static defaultProps = { + warning: null, + previousModalState: null, + } + + static propTypes = { + exportAccount: PropTypes.func.isRequired, + selectedIdentity: PropTypes.object.isRequired, + warning: PropTypes.node, + showAccountDetailModal: PropTypes.func.isRequired, + hideModal: PropTypes.func.isRequired, + clearAccountDetails: PropTypes.func.isRequired, + previousModalState: PropTypes.string, + } + + state = { + password: '', + privateKey: null, + showWarning: true, + } + + componentWillUnmount () { + this.props.clearAccountDetails() + } + + exportAccountAndGetPrivateKey = (password, address) => { + const { exportAccount } = this.props + + exportAccount(password, address) + .then((privateKey) => this.setState({ + privateKey, + showWarning: false, + })) + .catch((e) => log.error(e)) + } + + renderPasswordLabel (privateKey) { + return ( + + { + privateKey + ? this.context.t('copyPrivateKey') + : this.context.t('typePassword') + } + + ) + } + + renderPasswordInput (privateKey) { + const plainKey = privateKey && stripHexPrefix(privateKey) + + if (!privateKey) { + return ( + this.setState({ password: event.target.value })} + /> + ) + } + + return ( + copyToClipboard(plainKey)} + /> + ) + } + + renderButtons (privateKey, address, hideModal) { + return ( +
    + {!privateKey && ( + + )} + { + privateKey + ? ( + + ) + : ( + + ) + } +
    + ) + } + + render () { + const { + selectedIdentity, + warning, + showAccountDetailModal, + hideModal, + previousModalState, + } = this.props + const { name, address } = selectedIdentity + + const { + privateKey, + showWarning, + } = this.state + + return ( + showAccountDetailModal()} + > + {name} + +
    + {this.context.t('showPrivateKeys')} +
    + {this.renderPasswordLabel(privateKey)} + {this.renderPasswordInput(privateKey)} + { + (showWarning && warning) + ? {warning} + : null + } +
    +
    {this.context.t('privateKeyWarning')}
    + {this.renderButtons(privateKey, address, hideModal)} + + ) + } +} diff --git a/ui/app/components/app/modals/export-private-key-modal/export-private-key-modal.container.js b/ui/app/components/app/modals/export-private-key-modal/export-private-key-modal.container.js new file mode 100644 index 000000000000..e1676f8be925 --- /dev/null +++ b/ui/app/components/app/modals/export-private-key-modal/export-private-key-modal.container.js @@ -0,0 +1,39 @@ +import { connect } from 'react-redux' +import { exportAccount, hideWarning, showModal, hideModal, clearAccountDetails } from '../../../../store/actions' +import { getSelectedIdentity } from '../../../../selectors' +import ExportPrivateKeyModal from './export-private-key-modal.component' + +function mapStateToPropsFactory () { + let selectedIdentity = null + return function mapStateToProps (state) { + // We should **not** change the identity displayed here even if it changes from underneath us. + // If we do, we will be showing the user one private key and a **different** address and name. + // Note that the selected identity **will** change from underneath us when we unlock the keyring + // which is the expected behavior that we are side-stepping. + selectedIdentity = selectedIdentity || getSelectedIdentity(state) + return { + warning: state.appState.warning, + privateKey: state.appState.accountDetail.privateKey, + network: state.metamask.network, + selectedIdentity, + previousModalState: state.appState.modal.previousModalState.name, + } + } +} + +function mapDispatchToProps (dispatch) { + return { + exportAccount: (password, address) => { + return dispatch(exportAccount(password, address)) + .then((res) => { + dispatch(hideWarning()) + return res + }) + }, + showAccountDetailModal: () => dispatch(showModal({ name: 'ACCOUNT_DETAILS' })), + hideModal: () => dispatch(hideModal()), + clearAccountDetails: () => dispatch(clearAccountDetails()), + } +} + +export default connect(mapStateToPropsFactory, mapDispatchToProps)(ExportPrivateKeyModal) diff --git a/ui/app/components/app/modals/export-private-key-modal/index.js b/ui/app/components/app/modals/export-private-key-modal/index.js new file mode 100644 index 000000000000..996c995ca717 --- /dev/null +++ b/ui/app/components/app/modals/export-private-key-modal/index.js @@ -0,0 +1 @@ +export { default } from './export-private-key-modal.container' diff --git a/ui/app/components/app/modals/export-private-key-modal/index.scss b/ui/app/components/app/modals/export-private-key-modal/index.scss new file mode 100644 index 000000000000..8fd3c31336d2 --- /dev/null +++ b/ui/app/components/app/modals/export-private-key-modal/index.scss @@ -0,0 +1,106 @@ +.export-private-key-modal { + &__body-title { + margin-top: 16px; + margin-bottom: 16px; + font-size: 18px; + } + + &__divider { + width: 100%; + height: 1px; + margin: 19px 0 8px 0; + background-color: $alto; + } + + &__account-name { + margin-top: 9px; + font-size: 20px; + } + + &__password { + display: flex; + flex-direction: column; + } + + &__password-label, + &__password--error { + color: $scorpion; + font-size: 14px; + line-height: 18px; + margin-bottom: 10px; + } + + &__password--error { + color: $crimson; + margin-bottom: 0; + } + + &__password-input { + padding: 10px 0 13px 17px; + font-size: 16px; + line-height: 21px; + width: 291px; + height: 44px; + } + + &__password::-webkit-input-placeholder { + color: $dusty-gray; + } + + &__password--warning { + border-radius: 8px; + background-color: #fff6f6; + font-size: 12px; + font-weight: 500; + line-height: 15px; + color: $crimson; + width: 292px; + padding: 9px 15px; + margin-top: 18px; + } + + &__password-display-wrapper { + height: 80px; + width: 291px; + border: 1px solid $silver; + border-radius: 2px; + } + + &__password-display-textarea { + color: $crimson; + font-size: 16px; + line-height: 21px; + border: none; + height: 75px; + width: 100%; + overflow: hidden; + resize: none; + padding: 9px 13px 8px; + } + + &__buttons { + display: flex; + flex-direction: row; + justify-content: center; + } + + &__button { + margin-top: 17px; + width: 141px; + min-width: initial; + } + + &__button--cancel { + margin-right: 15px; + } + + & .ellip-address-wrapper { + display: flex; + justify-content: center; + border: 1px solid $alto; + padding: 5px 10px; + margin-top: 7px; + width: 286px; + } +} + diff --git a/ui/app/components/app/modals/fade-modal.js b/ui/app/components/app/modals/fade-modal.js new file mode 100644 index 000000000000..72d1c7288301 --- /dev/null +++ b/ui/app/components/app/modals/fade-modal.js @@ -0,0 +1,286 @@ +import React, { Component } from 'react' +import PropTypes from 'prop-types' + +let index = 0 +let extraSheet + +const insertRule = (css) => { + + if (!extraSheet) { + // First time, create an extra stylesheet for adding rules + extraSheet = document.createElement('style') + document.getElementsByTagName('head')[0].appendChild(extraSheet) + // Keep reference to actual StyleSheet object (`styleSheet` for IE < 9) + extraSheet = extraSheet.sheet || extraSheet.styleSheet + } + + extraSheet.insertRule(css, (extraSheet.cssRules || extraSheet.rules).length) + + return extraSheet +} + +const insertKeyframesRule = (keyframes) => { + // random name + // eslint-disable-next-line no-plusplus + const name = `anim_${++index}${Number(new Date())}` + let css = `@keyframes ${name} {` + + Object.keys(keyframes).forEach((key) => { + css += `${key} {` + + Object.keys(keyframes[key]).forEach((property) => { + const part = `:${keyframes[key][property]};` + css += property + part + }) + + css += '}' + }) + + css += '}' + + insertRule(css) + + return name +} + +const animation = { + show: { + animationDuration: '0.3s', + animationTimingFunction: 'ease-out', + }, + hide: { + animationDuration: '0.3s', + animationTimingFunction: 'ease-out', + }, + showContentAnimation: insertKeyframesRule({ + '0%': { + opacity: 0, + }, + '100%': { + opacity: 1, + }, + }), + hideContentAnimation: insertKeyframesRule({ + '0%': { + opacity: 1, + }, + '100%': { + opacity: 0, + }, + }), + showBackdropAnimation: insertKeyframesRule({ + '0%': { + opacity: 0, + }, + '100%': { + opacity: 0.9, + }, + }), + hideBackdropAnimation: insertKeyframesRule({ + '0%': { + opacity: 0.9, + }, + '100%': { + opacity: 0, + }, + }), +} + +const endEvents = ['transitionend', 'animationend'] + +function addEventListener (node, eventName, eventListener) { + node.addEventListener(eventName, eventListener, false) +} + +function removeEventListener (node, eventName, eventListener) { + node.removeEventListener(eventName, eventListener, false) +} + +const removeEndEventListener = (node, eventListener) => { + if (endEvents.length === 0) { + return + } + endEvents.forEach(function (endEvent) { + removeEventListener(node, endEvent, eventListener) + }) +} + +const addEndEventListener = (node, eventListener) => { + if (endEvents.length === 0) { + // If CSS transitions are not supported, trigger an "end animation" + // event immediately. + window.setTimeout(eventListener, 0) + return + } + endEvents.forEach(function (endEvent) { + addEventListener(node, endEvent, eventListener) + }) +} + +class FadeModal extends Component { + content = null + + static propTypes = { + backdrop: PropTypes.bool, + backdropStyle: PropTypes.object, + closeOnClick: PropTypes.bool, + contentStyle: PropTypes.object, + keyboard: PropTypes.bool, + modalStyle: PropTypes.object, + onShow: PropTypes.func, + onHide: PropTypes.func, + children: PropTypes.node, + } + + static defaultProps = { + onShow: () => undefined, + onHide: () => undefined, + keyboard: true, + backdrop: true, + closeOnClick: true, + modalStyle: {}, + backdropStyle: {}, + contentStyle: {}, + children: [], + } + + state = { + willHide: true, + hidden: true, + } + + addTransitionListener = (node, handle) => { + if (node) { + const endListener = function (e) { + if (e && e.target !== node) { + return + } + removeEndEventListener(node, endListener) + handle() + } + addEndEventListener(node, endListener) + } + } + + handleBackdropClick = () => { + if (this.props.closeOnClick) { + this.hide() + } + } + + hasHidden = () => { + return this.state.hidden + } + + render () { + if (this.state.hidden) { + return null + } + + const { willHide } = this.state + const { modalStyle } = this.props + const backdropStyle = { + animationName: willHide ? animation.hideBackdropAnimation : animation.showBackdropAnimation, + animationTimingFunction: (willHide ? animation.hide : animation.show).animationTimingFunction, ...this.props.backdropStyle, + } + const contentStyle = { + animationDuration: (willHide ? animation.hide : animation.show).animationDuration, + animationName: willHide ? animation.hideContentAnimation : animation.showContentAnimation, + animationTimingFunction: (willHide ? animation.hide : animation.show).animationTimingFunction, ...this.props.contentStyle, + } + + const backdrop = this.props.backdrop + ? ( +
    + ) : undefined + + if (willHide) { + this.addTransitionListener(this.content, this.leave) + } + + return ( + +
    +
    (this.content = el)} + tabIndex="-1" + style={contentStyle} + > + {this.props.children} +
    +
    + {backdrop} +
    + ) + + } + + leave = () => { + this.setState({ + hidden: true, + }) + this.props.onHide(this.state.hideSource) + } + + enter = () => { + this.props.onShow() + } + + show = () => { + if (!this.state.hidden) { + return + } + + this.setState({ + willHide: false, + hidden: false, + }) + + setTimeout(function () { + this.addTransitionListener(this.content, this.enter) + }.bind(this), 0) + } + + hide = () => { + if (this.hasHidden()) { + return + } + + this.setState({ + willHide: true, + }) + } + + listenKeyboard = (event) => { + if (typeof this.props.keyboard === 'function') { + this.props.keyboard(event) + } else { + this.closeOnEsc(event) + } + } + + closeOnEsc = (event) => { + if (this.props.keyboard && + (event.key === 'Escape' || + event.keyCode === 27)) { + this.hide() + } + } + + UNSAFE_componentDidMount = () => { + window.addEventListener('keydown', this.listenKeyboard, true) + } + + UNSAFE_componentWillUnmount = () => { + window.removeEventListener('keydown', this.listenKeyboard, true) + } +} + +export default FadeModal diff --git a/ui/app/components/app/modals/hide-token-confirmation-modal.js b/ui/app/components/app/modals/hide-token-confirmation-modal.js deleted file mode 100644 index e2b098923c81..000000000000 --- a/ui/app/components/app/modals/hide-token-confirmation-modal.js +++ /dev/null @@ -1,83 +0,0 @@ -const Component = require('react').Component -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const inherits = require('util').inherits -const connect = require('react-redux').connect -const actions = require('../../../store/actions') -import Identicon from '../../ui/identicon' - -function mapStateToProps (state) { - return { - network: state.metamask.network, - token: state.appState.modal.modalState.props.token, - assetImages: state.metamask.assetImages, - } -} - -function mapDispatchToProps (dispatch) { - return { - hideModal: () => dispatch(actions.hideModal()), - hideToken: address => { - dispatch(actions.removeToken(address)) - .then(() => { - dispatch(actions.hideModal()) - }) - }, - } -} - -inherits(HideTokenConfirmationModal, Component) -function HideTokenConfirmationModal () { - Component.call(this) - - this.state = {} -} - -HideTokenConfirmationModal.contextTypes = { - t: PropTypes.func, -} - -module.exports = connect(mapStateToProps, mapDispatchToProps)(HideTokenConfirmationModal) - - -HideTokenConfirmationModal.prototype.render = function () { - const { token, network, hideToken, hideModal, assetImages } = this.props - const { symbol, address } = token - const image = assetImages[address] - - return h('div.hide-token-confirmation', {}, [ - h('div.hide-token-confirmation__container', { - }, [ - h('div.hide-token-confirmation__title', {}, [ - this.context.t('hideTokenPrompt'), - ]), - - h(Identicon, { - className: 'hide-token-confirmation__identicon', - diameter: 45, - address, - network, - image, - }), - - h('div.hide-token-confirmation__symbol', {}, symbol), - - h('div.hide-token-confirmation__copy', {}, [ - this.context.t('readdToken'), - ]), - - h('div.hide-token-confirmation__buttons', {}, [ - h('button.btn-default.hide-token-confirmation__button.btn--large', { - onClick: () => hideModal(), - }, [ - this.context.t('cancel'), - ]), - h('button.btn-secondary.hide-token-confirmation__button.btn--large', { - onClick: () => hideToken(address), - }, [ - this.context.t('hide'), - ]), - ]), - ]), - ]) -} diff --git a/ui/app/components/app/modals/hide-token-confirmation-modal/hide-token-confirmation-modal.js b/ui/app/components/app/modals/hide-token-confirmation-modal/hide-token-confirmation-modal.js new file mode 100644 index 000000000000..57a0bdc01007 --- /dev/null +++ b/ui/app/components/app/modals/hide-token-confirmation-modal/hide-token-confirmation-modal.js @@ -0,0 +1,90 @@ +import PropTypes from 'prop-types' +import React, { Component } from 'react' +import { connect } from 'react-redux' +import * as actions from '../../../../store/actions' +import Identicon from '../../../ui/identicon' +import Button from '../../../ui/button' + +function mapStateToProps (state) { + return { + network: state.metamask.network, + token: state.appState.modal.modalState.props.token, + assetImages: state.metamask.assetImages, + } +} + +function mapDispatchToProps (dispatch) { + return { + hideModal: () => dispatch(actions.hideModal()), + hideToken: (address) => { + dispatch(actions.removeToken(address)) + .then(() => { + dispatch(actions.hideModal()) + }) + }, + } +} + +class HideTokenConfirmationModal extends Component { + static contextTypes = { + t: PropTypes.func, + } + + static propTypes = { + hideToken: PropTypes.func.isRequired, + hideModal: PropTypes.func.isRequired, + assetImages: PropTypes.object.isRequired, + token: PropTypes.shape({ + symbol: PropTypes.string, + address: PropTypes.string, + }), + } + + state = {} + + render () { + const { token, hideToken, hideModal, assetImages } = this.props + const { symbol, address } = token + const image = assetImages[address] + + return ( +
    +
    +
    + {this.context.t('hideTokenPrompt')} +
    + +
    {symbol}
    +
    + {this.context.t('readdToken')} +
    +
    + + +
    +
    +
    + ) + } +} + +export default connect(mapStateToProps, mapDispatchToProps)(HideTokenConfirmationModal) diff --git a/ui/app/components/app/modals/hide-token-confirmation-modal/index.js b/ui/app/components/app/modals/hide-token-confirmation-modal/index.js new file mode 100644 index 000000000000..31e8663986e6 --- /dev/null +++ b/ui/app/components/app/modals/hide-token-confirmation-modal/index.js @@ -0,0 +1 @@ +export { default } from './hide-token-confirmation-modal' diff --git a/ui/app/components/app/modals/hide-token-confirmation-modal/index.scss b/ui/app/components/app/modals/hide-token-confirmation-modal/index.scss new file mode 100644 index 000000000000..9482caeba871 --- /dev/null +++ b/ui/app/components/app/modals/hide-token-confirmation-modal/index.scss @@ -0,0 +1,56 @@ +.hide-token-confirmation { + min-height: 250.72px; + border-radius: 4px; + background-color: $white; + box-shadow: 0 1px 7px 0 rgba(0, 0, 0, 0.5); + + &__container { + padding: 24px 27px 21px; + display: flex; + flex-direction: column; + align-items: center; + } + + &__identicon { + margin-bottom: 10px; + } + + &__symbol { + color: $tundora; + font-size: 16px; + line-height: 24px; + text-align: center; + margin-bottom: 7.5px; + } + + &__title { + height: 30px; + width: 271.28px; + color: $tundora; + font-size: 22px; + line-height: 30px; + text-align: center; + margin-bottom: 10.5px; + } + + &__copy { + height: 41px; + width: 318px; + color: $scorpion; + font-size: 14px; + line-height: 18px; + text-align: center; + } + + &__buttons { + display: flex; + flex-direction: row; + justify-content: center; + margin-top: 15px; + width: 100%; + } + + &__button { + margin: 0 5px; + } +} diff --git a/ui/app/components/app/modals/index.js b/ui/app/components/app/modals/index.js index 1db1d33d4d30..9667e0d32851 100644 --- a/ui/app/components/app/modals/index.js +++ b/ui/app/components/app/modals/index.js @@ -1,5 +1,3 @@ -const Modal = require('./modal') +import Modal from './modal' -module.exports = { - Modal, -} +export { Modal } diff --git a/ui/app/components/app/modals/index.scss b/ui/app/components/app/modals/index.scss index 09b0bb73c527..b6232aa1602e 100644 --- a/ui/app/components/app/modals/index.scss +++ b/ui/app/components/app/modals/index.scss @@ -1,11 +1,46 @@ +@import 'account-details-modal/index'; +@import 'account-modal-container/index'; +@import 'add-to-addressbook-modal/index'; @import 'cancel-transaction/index'; - @import 'confirm-remove-account/index'; +@import 'deposit-ether-modal/index'; +@import 'edit-approval-permission/index'; +@import 'export-private-key-modal/index'; +@import 'hide-token-confirmation-modal/index'; +@import 'metametrics-opt-in-modal/index'; +@import 'new-account-modal/index'; +@import 'notification-modal/index'; +@import 'qr-scanner/index'; +@import 'transaction-confirmed/index'; -@import 'customize-gas/index'; +.modal { + z-index: 1050; + position: fixed; + width: 500px; + transform: translate3d(-50%, -50%, 0); + top: 50%; + left: 50%; -@import 'qr-scanner/index'; + &__content { + margin: 0; + background-color: white; + animation-fill-mode: forwards; + } -@import 'transaction-confirmed/index'; + &__backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #373a47; + animation-fill-mode: forwards; + animation-duration: 0.3s; + } + + & > div:focus { + outline: none !important; + } +} -@import 'metametrics-opt-in-modal/index'; diff --git a/ui/app/components/app/modals/loading-network-error/loading-network-error.component.js b/ui/app/components/app/modals/loading-network-error/loading-network-error.component.js index 44f71e4b257e..6cac4942fe41 100644 --- a/ui/app/components/app/modals/loading-network-error/loading-network-error.component.js +++ b/ui/app/components/app/modals/loading-network-error/loading-network-error.component.js @@ -12,7 +12,7 @@ const LoadingNetworkError = (props, context) => { submitText={t('tryAgain')} > ) diff --git a/ui/app/components/app/modals/loading-network-error/loading-network-error.container.js b/ui/app/components/app/modals/loading-network-error/loading-network-error.container.js index 38ea9b2ab2a2..765cdf9c5704 100644 --- a/ui/app/components/app/modals/loading-network-error/loading-network-error.container.js +++ b/ui/app/components/app/modals/loading-network-error/loading-network-error.container.js @@ -1,4 +1,4 @@ -import LoadingNetworkError from './loading-network-error.component' import withModalProps from '../../../../helpers/higher-order-components/with-modal-props' +import LoadingNetworkError from './loading-network-error.component' export default withModalProps(LoadingNetworkError) diff --git a/ui/app/components/app/modals/metametrics-opt-in-modal/index.scss b/ui/app/components/app/modals/metametrics-opt-in-modal/index.scss index 88b6d7a4da19..4c99ecc28a44 100644 --- a/ui/app/components/app/modals/metametrics-opt-in-modal/index.scss +++ b/ui/app/components/app/modals/metametrics-opt-in-modal/index.scss @@ -27,4 +27,4 @@ max-height: 520px; } } -} \ No newline at end of file +} diff --git a/ui/app/components/app/modals/metametrics-opt-in-modal/metametrics-opt-in-modal.component.js b/ui/app/components/app/modals/metametrics-opt-in-modal/metametrics-opt-in-modal.component.js index 0335991fc0e9..9dc9533156f3 100644 --- a/ui/app/components/app/modals/metametrics-opt-in-modal/metametrics-opt-in-modal.component.js +++ b/ui/app/components/app/modals/metametrics-opt-in-modal/metametrics-opt-in-modal.component.js @@ -1,5 +1,6 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' +import MetaFoxLogo from '../../../ui/metafox-logo' import PageContainerFooter from '../../../ui/page-container/page-container-footer' export default class MetaMetricsOptInModal extends Component { @@ -20,19 +21,7 @@ export default class MetaMetricsOptInModal extends Component {
    -
    - - -
    +
    @@ -86,7 +75,8 @@ export default class MetaMetricsOptInModal extends Component {
    - This data is aggregated and is therefore anonymous for the purposes of General Data Protection Regulation (EU) 2016/679. For more information in relation to our privacy practices, please see our { setParticipateInMetaMetrics(true) @@ -129,8 +119,8 @@ export default class MetaMetricsOptInModal extends Component { hideModal() }) }} - submitText={'I agree'} - submitButtonType={'confirm'} + submitText="I agree" + submitButtonType="confirm" disabled={false} />
    diff --git a/ui/app/components/app/modals/metametrics-opt-in-modal/metametrics-opt-in-modal.container.js b/ui/app/components/app/modals/metametrics-opt-in-modal/metametrics-opt-in-modal.container.js index ea7d71a73a33..8cef4a07684f 100644 --- a/ui/app/components/app/modals/metametrics-opt-in-modal/metametrics-opt-in-modal.container.js +++ b/ui/app/components/app/modals/metametrics-opt-in-modal/metametrics-opt-in-modal.container.js @@ -1,8 +1,8 @@ import { connect } from 'react-redux' -import { compose } from 'recompose' -import MetaMetricsOptInModal from './metametrics-opt-in-modal.component' +import { compose } from 'redux' import withModalProps from '../../../../helpers/higher-order-components/with-modal-props' import { setParticipateInMetaMetrics } from '../../../../store/actions' +import MetaMetricsOptInModal from './metametrics-opt-in-modal.component' const mapStateToProps = (_, ownProps) => { const { unapprovedTxCount } = ownProps @@ -12,7 +12,7 @@ const mapStateToProps = (_, ownProps) => { } } -const mapDispatchToProps = dispatch => { +const mapDispatchToProps = (dispatch) => { return { setParticipateInMetaMetrics: (val) => dispatch(setParticipateInMetaMetrics(val)), } diff --git a/ui/app/components/app/modals/metametrics-opt-in-modal/tests/metametrics-opt-in-modal.test.js b/ui/app/components/app/modals/metametrics-opt-in-modal/tests/metametrics-opt-in-modal.test.js new file mode 100644 index 000000000000..bd39976b300b --- /dev/null +++ b/ui/app/components/app/modals/metametrics-opt-in-modal/tests/metametrics-opt-in-modal.test.js @@ -0,0 +1,55 @@ +import assert from 'assert' +import React from 'react' +import sinon from 'sinon' +import { mount } from 'enzyme' +import MetaMetricsOptIn from '..' + +describe('MetaMetrics Opt In', function () { + let wrapper + + const props = { + setParticipateInMetaMetrics: sinon.stub().resolves(), + hideModal: sinon.spy(), + participateInMetaMetrics: null, + } + + beforeEach(function () { + wrapper = mount( + , { + context: { + metricsEvent: () => undefined, + }, + }, + ) + }) + + afterEach(function () { + props.setParticipateInMetaMetrics.resetHistory() + props.hideModal.resetHistory() + }) + + it('passes false to setParticipateInMetaMetrics and hides modal', function (done) { + const noThanks = wrapper.find('.btn-default.page-container__footer-button') + noThanks.simulate('click') + + setImmediate(() => { + assert(props.setParticipateInMetaMetrics.calledOnce) + assert.equal(props.setParticipateInMetaMetrics.getCall(0).args[0], false) + assert(props.hideModal.calledOnce) + done() + }) + }) + + it('passes true to setParticipateInMetaMetrics and hides modal', function (done) { + const iAgree = wrapper.find('.btn-primary.page-container__footer-button') + iAgree.simulate('click') + + setImmediate(() => { + assert(props.setParticipateInMetaMetrics.calledOnce) + assert.equal(props.setParticipateInMetaMetrics.getCall(0).args[0], true) + assert(props.hideModal.calledOnce) + done() + }) + }) + +}) diff --git a/ui/app/components/app/modals/modal.js b/ui/app/components/app/modals/modal.js index 394367c46f05..d8e6ef214f19 100644 --- a/ui/app/components/app/modals/modal.js +++ b/ui/app/components/app/modals/modal.js @@ -1,34 +1,34 @@ -const Component = require('react').Component -const h = require('react-hyperscript') -const inherits = require('util').inherits -const connect = require('react-redux').connect -const FadeModal = require('boron').FadeModal -const actions = require('../../../store/actions') -const { resetCustomData: resetCustomGasData } = require('../../../ducks/gas/gas.duck') -const isMobileView = require('../../../../lib/is-mobile-view') -const { getEnvironmentType } = require('../../../../../app/scripts/lib/util') -const { ENVIRONMENT_TYPE_POPUP } = require('../../../../../app/scripts/lib/enums') +import PropTypes from 'prop-types' +import React, { Component } from 'react' + +import { connect } from 'react-redux' +import * as actions from '../../../store/actions' +import { resetCustomData as resetCustomGasData } from '../../../ducks/gas/gas.duck' +import isMobileView from '../../../../lib/is-mobile-view' +import { getEnvironmentType } from '../../../../../app/scripts/lib/util' +import { ENVIRONMENT_TYPE_POPUP } from '../../../../../app/scripts/lib/enums' // Modal Components -const BuyOptions = require('./buy-options-modal') -const DepositEtherModal = require('./deposit-ether-modal') +import ConfirmCustomizeGasModal from '../gas-customization/gas-modal-page-container' +import DepositEtherModal from './deposit-ether-modal' import AccountDetailsModal from './account-details-modal' -const EditAccountNameModal = require('./edit-account-name-modal') -const ExportPrivateKeyModal = require('./export-private-key-modal') -const NewAccountModal = require('./new-account-modal') -const HideTokenConfirmationModal = require('./hide-token-confirmation-modal') -const NotifcationModal = require('./notification-modal') -const QRScanner = require('./qr-scanner') +import ExportPrivateKeyModal from './export-private-key-modal' +import HideTokenConfirmationModal from './hide-token-confirmation-modal' +import NotifcationModal from './notification-modal' +import QRScanner from './qr-scanner' import ConfirmRemoveAccount from './confirm-remove-account' import ConfirmResetAccount from './confirm-reset-account' import TransactionConfirmed from './transaction-confirmed' import CancelTransaction from './cancel-transaction' +import FadeModal from './fade-modal' import MetaMetricsOptInModal from './metametrics-opt-in-modal' import RejectTransactions from './reject-transactions' -import ClearApprovedOrigins from './clear-approved-origins' -import ConfirmCustomizeGasModal from '../gas-customization/gas-modal-page-container' +import ConfirmDeleteNetwork from './confirm-delete-network' +import AddToAddressBookModal from './add-to-addressbook-modal' +import EditApprovalPermission from './edit-approval-permission' +import NewAccountModal from './new-account-modal' const modalContainerBaseStyle = { transform: 'translate3d(-50%, 0, 0px)', @@ -79,36 +79,8 @@ const accountModalStyle = { } const MODALS = { - BUY: { - contents: [ - h(BuyOptions, {}, []), - ], - mobileModalStyle: { - width: '95%', - // top: isPopupOrNotification() === 'popup' ? '48vh' : '36.5vh', - transform: 'none', - left: '0', - right: '0', - margin: '0 auto', - boxShadow: '0 0 7px 0 rgba(0,0,0,0.08)', - top: '10%', - }, - laptopModalStyle: { - width: '66%', - maxWidth: '550px', - top: 'calc(10% + 10px)', - left: '0', - right: '0', - margin: '0 auto', - boxShadow: '0 0 7px 0 rgba(0,0,0,0.08)', - transform: 'none', - }, - }, - DEPOSIT_ETHER: { - contents: [ - h(DepositEtherModal, {}, []), - ], + contents: , onHide: (props) => props.hideWarning(), mobileModalStyle: { width: '100%', @@ -140,53 +112,75 @@ const MODALS = { }, }, - EDIT_ACCOUNT_NAME: { - contents: [ - h(EditAccountNameModal, {}, []), - ], + ADD_TO_ADDRESSBOOK: { + contents: , + mobileModalStyle: { + width: '95%', + top: '10%', + boxShadow: 'rgba(0, 0, 0, 0.15) 0px 2px 2px 2px', + transform: 'none', + left: '0', + right: '0', + margin: '0 auto', + borderRadius: '10px', + }, + laptopModalStyle: { + width: '375px', + top: '10%', + boxShadow: 'rgba(0, 0, 0, 0.15) 0px 2px 2px 2px', + transform: 'none', + left: '0', + right: '0', + margin: '0 auto', + borderRadius: '10px', + }, + contentStyle: { + borderRadius: '10px', + }, + }, + + NEW_ACCOUNT: { + contents: , mobileModalStyle: { width: '95%', - // top: isPopupOrNotification() === 'popup' ? '48vh' : '36.5vh', top: '10%', boxShadow: 'rgba(0, 0, 0, 0.15) 0px 2px 2px 2px', transform: 'none', left: '0', right: '0', margin: '0 auto', + borderRadius: '10px', }, laptopModalStyle: { width: '375px', - // top: 'calc(30% + 10px)', top: '10%', boxShadow: 'rgba(0, 0, 0, 0.15) 0px 2px 2px 2px', transform: 'none', left: '0', right: '0', margin: '0 auto', + borderRadius: '10px', + }, + contentStyle: { + borderRadius: '10px', }, }, ACCOUNT_DETAILS: { - contents: [ - h(AccountDetailsModal, {}, []), - ], + contents: , ...accountModalStyle, }, EXPORT_PRIVATE_KEY: { - contents: [ - h(ExportPrivateKeyModal, {}, []), - ], + contents: , ...accountModalStyle, }, HIDE_TOKEN_CONFIRMATION: { - contents: [ - h(HideTokenConfirmationModal, {}, []), - ], + contents: , mobileModalStyle: { width: '95%', - top: getEnvironmentType(window.location.href) === ENVIRONMENT_TYPE_POPUP ? '52vh' : '36.5vh', + top: getEnvironmentType() === ENVIRONMENT_TYPE_POPUP ? '52vh' : '36.5vh', }, laptopModalStyle: { width: '449px', @@ -194,21 +188,8 @@ const MODALS = { }, }, - CLEAR_APPROVED_ORIGINS: { - contents: h(ClearApprovedOrigins), - mobileModalStyle: { - ...modalContainerMobileStyle, - }, - laptopModalStyle: { - ...modalContainerLaptopStyle, - }, - contentStyle: { - borderRadius: '8px', - }, - }, - METAMETRICS_OPT_IN_MODAL: { - contents: h(MetaMetricsOptInModal), + contents: , mobileModalStyle: { ...modalContainerMobileStyle, width: '100%', @@ -224,16 +205,11 @@ const MODALS = { }, }, - OLD_UI_NOTIFICATION_MODAL: { - contents: [ - h(NotifcationModal, { - header: 'oldUI', - message: 'oldUIMessage', - }), - ], + GAS_PRICE_INFO_MODAL: { + contents: , mobileModalStyle: { width: '95%', - top: getEnvironmentType(window.location.href) === ENVIRONMENT_TYPE_POPUP ? '52vh' : '36.5vh', + top: getEnvironmentType() === ENVIRONMENT_TYPE_POPUP ? '52vh' : '36.5vh', }, laptopModalStyle: { width: '449px', @@ -241,16 +217,11 @@ const MODALS = { }, }, - GAS_PRICE_INFO_MODAL: { - contents: [ - h(NotifcationModal, { - header: 'gasPriceNoDenom', - message: 'gasPriceInfoModalContent', - }), - ], + GAS_LIMIT_INFO_MODAL: { + contents: , mobileModalStyle: { width: '95%', - top: getEnvironmentType(window.location.href) === ENVIRONMENT_TYPE_POPUP ? '52vh' : '36.5vh', + top: getEnvironmentType() === ENVIRONMENT_TYPE_POPUP ? '52vh' : '36.5vh', }, laptopModalStyle: { width: '449px', @@ -258,25 +229,21 @@ const MODALS = { }, }, - GAS_LIMIT_INFO_MODAL: { - contents: [ - h(NotifcationModal, { - header: 'gasLimit', - message: 'gasLimitInfoModalContent', - }), - ], + CONFIRM_RESET_ACCOUNT: { + contents: , mobileModalStyle: { - width: '95%', - top: getEnvironmentType(window.location.href) === ENVIRONMENT_TYPE_POPUP ? '52vh' : '36.5vh', + ...modalContainerMobileStyle, }, laptopModalStyle: { - width: '449px', - top: 'calc(33% + 45px)', + ...modalContainerLaptopStyle, + }, + contentStyle: { + borderRadius: '8px', }, }, - CONFIRM_RESET_ACCOUNT: { - contents: h(ConfirmResetAccount), + CONFIRM_REMOVE_ACCOUNT: { + contents: , mobileModalStyle: { ...modalContainerMobileStyle, }, @@ -288,8 +255,8 @@ const MODALS = { }, }, - CONFIRM_REMOVE_ACCOUNT: { - contents: h(ConfirmRemoveAccount), + CONFIRM_DELETE_NETWORK: { + contents: , mobileModalStyle: { ...modalContainerMobileStyle, }, @@ -301,38 +268,41 @@ const MODALS = { }, }, - NEW_ACCOUNT: { - contents: [ - h(NewAccountModal, {}, []), - ], + CUSTOMIZE_GAS: { + contents: , mobileModalStyle: { - width: '95%', - // top: isPopupOrNotification() === 'popup' ? '52vh' : '36.5vh', - top: '10%', + width: '100vw', + height: '100vh', + top: '0', transform: 'none', left: '0', right: '0', margin: '0 auto', }, laptopModalStyle: { - width: '449px', - // top: 'calc(33% + 45px)', - top: '10%', + width: 'auto', + height: '0px', + top: '80px', + left: '0px', transform: 'none', - left: '0', - right: '0', margin: '0 auto', + position: 'relative', + }, + contentStyle: { + borderRadius: '8px', + }, + customOnHideOpts: { + action: resetCustomGasData, + args: [], }, }, - CUSTOMIZE_GAS: { - contents: [ - h(ConfirmCustomizeGasModal), - ], + EDIT_APPROVAL_PERMISSION: { + contents: , mobileModalStyle: { - width: '100vw', + width: '95vw', height: '100vh', - top: '0', + top: '50px', transform: 'none', left: '0', right: '0', @@ -350,15 +320,11 @@ const MODALS = { contentStyle: { borderRadius: '8px', }, - customOnHideOpts: { - action: resetCustomGasData, - args: [], - }, }, TRANSACTION_CONFIRMED: { disableBackdropClick: true, - contents: h(TransactionConfirmed), + contents: , mobileModalStyle: { ...modalContainerMobileStyle, }, @@ -371,7 +337,7 @@ const MODALS = { }, QR_SCANNER: { - contents: h(QRScanner), + contents: , mobileModalStyle: { ...modalContainerMobileStyle, }, @@ -384,7 +350,7 @@ const MODALS = { }, CANCEL_TRANSACTION: { - contents: h(CancelTransaction), + contents: , mobileModalStyle: { ...modalContainerMobileStyle, }, @@ -397,7 +363,7 @@ const MODALS = { }, REJECT_TRANSACTIONS: { - contents: h(RejectTransactions), + contents: , mobileModalStyle: { ...modalContainerMobileStyle, }, @@ -442,62 +408,59 @@ function mapDispatchToProps (dispatch) { } } -// Global Modal Component -inherits(Modal, Component) -function Modal () { - Component.call(this) -} +class Modal extends Component { + static propTypes = { + active: PropTypes.bool.isRequired, + hideModal: PropTypes.func.isRequired, + hideWarning: PropTypes.func.isRequired, + modalState: PropTypes.object.isRequired, + } -module.exports = connect(mapStateToProps, mapDispatchToProps)(Modal) - -Modal.prototype.render = function () { - const modal = MODALS[this.props.modalState.name || 'DEFAULT'] - - const { contents: children, disableBackdropClick = false } = modal - const modalStyle = modal[isMobileView() ? 'mobileModalStyle' : 'laptopModalStyle'] - const contentStyle = modal.contentStyle || {} - - return h(FadeModal, - { - className: 'modal', - keyboard: false, - onHide: () => { - if (modal.onHide) { - modal.onHide(this.props) - } - this.onHide(modal.customOnHideOpts) - }, - ref: (ref) => { - this.modalRef = ref - }, - modalStyle, - contentStyle, - backdropStyle: BACKDROPSTYLE, - closeOnClick: !disableBackdropClick, - }, - children, - ) -} + hide () { + this.modalRef.hide() + } -Modal.prototype.componentWillReceiveProps = function (nextProps) { - if (nextProps.active) { - this.show() - } else if (this.props.active) { - this.hide() + show () { + this.modalRef.show() } -} -Modal.prototype.onHide = function (customOnHideOpts) { - if (this.props.onHideCallback) { - this.props.onHideCallback() + UNSAFE_componentWillReceiveProps (nextProps, _) { + if (nextProps.active) { + this.show() + } else if (this.props.active) { + this.hide() + } } - this.props.hideModal(customOnHideOpts) -} -Modal.prototype.hide = function () { - this.modalRef.hide() + render () { + const modal = MODALS[this.props.modalState.name || 'DEFAULT'] + const { contents: children, disableBackdropClick = false } = modal + const modalStyle = modal[isMobileView() ? 'mobileModalStyle' : 'laptopModalStyle'] + const contentStyle = modal.contentStyle || {} + + return ( + { + if (modal.onHide) { + modal.onHide({ + hideWarning: this.props.hideWarning, + }) + } + this.props.hideModal(modal.customOnHideOpts) + }} + ref={(ref) => { + this.modalRef = ref + }} + modalStyle={modalStyle} + contentStyle={contentStyle} + backdropStyle={BACKDROPSTYLE} + closeOnClick={!disableBackdropClick} + > + {children} + + ) + } } -Modal.prototype.show = function () { - this.modalRef.show() -} +export default connect(mapStateToProps, mapDispatchToProps)(Modal) diff --git a/ui/app/components/app/modals/new-account-modal.js b/ui/app/components/app/modals/new-account-modal.js deleted file mode 100644 index 27c81a7013ab..000000000000 --- a/ui/app/components/app/modals/new-account-modal.js +++ /dev/null @@ -1,112 +0,0 @@ -const { Component } = require('react') -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const connect = require('react-redux').connect -const actions = require('../../../store/actions') - -class NewAccountModal extends Component { - constructor (props) { - super(props) - const { numberOfExistingAccounts = 0 } = props - const newAccountNumber = numberOfExistingAccounts + 1 - - this.state = { - newAccountName: `${this.context.t('account')} ${newAccountNumber}`, - } - } - - render () { - const { newAccountName } = this.state - - return h('div', [ - h('div.new-account-modal-wrapper', { - }, [ - h('div.new-account-modal-header', {}, [ - this.context.t('newAccount'), - ]), - - h('div.modal-close-x', { - onClick: this.props.hideModal, - }), - - h('div.new-account-modal-content', {}, [ - this.context.t('accountName'), - ]), - - h('div.new-account-input-wrapper', {}, [ - h('input.new-account-input', { - value: this.state.newAccountName, - placeholder: this.context.t('sampleAccountName'), - onChange: event => this.setState({ newAccountName: event.target.value }), - }, []), - ]), - - h('div.new-account-modal-content.after-input', {}, [ - this.context.t('or'), - ]), - - h('div.new-account-modal-content.after-input.pointer', { - onClick: () => { - this.props.hideModal() - this.props.showImportPage() - }, - }, this.context.t('importAnAccount')), - - h('div.new-account-modal-content.button.allcaps', {}, [ - h('button.btn-clear', { - onClick: () => this.props.createAccount(newAccountName), - }, [ - this.context.t('save'), - ]), - ]), - ]), - ]) - } -} - -NewAccountModal.propTypes = { - hideModal: PropTypes.func, - showImportPage: PropTypes.func, - createAccount: PropTypes.func, - numberOfExistingAccounts: PropTypes.number, - t: PropTypes.func, -} - -const mapStateToProps = state => { - const { metamask: { network, selectedAddress, identities = {} } } = state - const numberOfExistingAccounts = Object.keys(identities).length - - return { - network, - address: selectedAddress, - numberOfExistingAccounts, - } -} - -const mapDispatchToProps = dispatch => { - return { - toCoinbase: (address) => { - dispatch(actions.buyEth({ network: '1', address, amount: 0 })) - }, - hideModal: () => { - dispatch(actions.hideModal()) - }, - createAccount: (newAccountName) => { - dispatch(actions.addNewAccount()) - .then((newAccountAddress) => { - if (newAccountName) { - dispatch(actions.setAccountLabel(newAccountAddress, newAccountName)) - } - dispatch(actions.hideModal()) - }) - }, - showImportPage: () => dispatch(actions.showImportPage()), - } -} - -NewAccountModal.contextTypes = { - t: PropTypes.func, -} - -module.exports = connect(mapStateToProps, mapDispatchToProps)(NewAccountModal) - diff --git a/ui/app/components/app/modals/new-account-modal/index.js b/ui/app/components/app/modals/new-account-modal/index.js new file mode 100644 index 000000000000..2c8b788904a4 --- /dev/null +++ b/ui/app/components/app/modals/new-account-modal/index.js @@ -0,0 +1 @@ +export { default } from './new-account-modal.container' diff --git a/ui/app/components/app/modals/new-account-modal/index.scss b/ui/app/components/app/modals/new-account-modal/index.scss new file mode 100644 index 000000000000..3c20a34e52ab --- /dev/null +++ b/ui/app/components/app/modals/new-account-modal/index.scss @@ -0,0 +1,58 @@ +.new-account-modal { + display: flex; + flex-flow: column nowrap; + background-color: $white; + border-radius: 10px; + box-shadow: 0 5px 16px rgba($black, 0.25); + + &__content { + @extend %col-nowrap; + + padding: 1.5rem; + border-bottom: 1px solid $Grey-100; + + &__header { + @include H4; + + font-weight: bold; + display: flex; + justify-content: space-between; + align-items: center; + } + + &__header-close { + color: #24292e; + background: none; + font-size: 1.1rem; + } + } + + &__input-label { + color: $Grey-600; + margin-top: 1.25rem; + } + + &__input { + background: $white; + border: 1px solid $Grey-100; + box-sizing: border-box; + border-radius: 8px; + padding: 0.625rem 0.75rem; + font-size: 1.25rem; + margin-top: 0.75rem; + + &::placeholder { + color: $Grey-300; + } + } + + &__footer { + @extend %row-nowrap; + + padding: 1rem; + + button + button { + margin-left: 1rem; + } + } +} diff --git a/ui/app/components/app/modals/new-account-modal/new-account-modal.component.js b/ui/app/components/app/modals/new-account-modal/new-account-modal.component.js new file mode 100644 index 000000000000..f560036adce9 --- /dev/null +++ b/ui/app/components/app/modals/new-account-modal/new-account-modal.component.js @@ -0,0 +1,82 @@ +import React, { Component } from 'react' +import PropTypes from 'prop-types' +import Button from '../../../ui/button/button.component' + +export default class NewAccountModal extends Component { + + static contextTypes = { + t: PropTypes.func, + } + + static propTypes = { + hideModal: PropTypes.func.isRequired, + newAccountNumber: PropTypes.number.isRequired, + onSave: PropTypes.func.isRequired, + } + + state = { + alias: this.context.t('newAccountNumberName', [this.props.newAccountNumber]), + } + + onChange = (e) => { + this.setState({ + alias: e.target.value, + }) + } + + onSubmit = () => { + this.props.onSave(this.state.alias) + .then(this.props.hideModal) + } + + onKeyPress = (e) => { + if (e.key === 'Enter' && this.state.alias) { + this.onSubmit() + } + } + + render () { + const { t } = this.context + + return ( +
    +
    +
    + {t('newAccount')} +
    +
    + {t('accountName')} +
    + +
    +
    + + +
    +
    + ) + } +} diff --git a/ui/app/components/app/modals/new-account-modal/new-account-modal.container.js b/ui/app/components/app/modals/new-account-modal/new-account-modal.container.js new file mode 100644 index 000000000000..c787af9a068e --- /dev/null +++ b/ui/app/components/app/modals/new-account-modal/new-account-modal.container.js @@ -0,0 +1,44 @@ +import { connect } from 'react-redux' +import * as actions from '../../../../store/actions' +import NewAccountModal from './new-account-modal.component' + +function mapStateToProps (state) { + return { + ...(state.appState.modal.modalState.props || {}), + } +} + +function mapDispatchToProps (dispatch) { + return { + hideModal: () => dispatch(actions.hideModal()), + createAccount: (newAccountName) => { + return dispatch(actions.addNewAccount()) + .then((newAccountAddress) => { + if (newAccountName) { + dispatch(actions.setAccountLabel(newAccountAddress, newAccountName)) + } + return newAccountAddress + }) + }, + } +} + +function mergeProps (stateProps, dispatchProps) { + const { + onCreateNewAccount, + } = stateProps + const { + createAccount, + } = dispatchProps + + return { + ...stateProps, + ...dispatchProps, + onSave: (newAccountName) => { + return createAccount(newAccountName) + .then((newAccountAddress) => onCreateNewAccount(newAccountAddress)) + }, + } +} + +export default connect(mapStateToProps, mapDispatchToProps, mergeProps)(NewAccountModal) diff --git a/ui/app/components/app/modals/notification-modal.js b/ui/app/components/app/modals/notification-modal.js deleted file mode 100644 index b8503ec1ade2..000000000000 --- a/ui/app/components/app/modals/notification-modal.js +++ /dev/null @@ -1,81 +0,0 @@ -const { Component } = require('react') -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const connect = require('react-redux').connect -const actions = require('../../../store/actions') - -class NotificationModal extends Component { - render () { - const { - header, - message, - showCancelButton = false, - showConfirmButton = false, - hideModal, - onConfirm, - } = this.props - - const showButtons = showCancelButton || showConfirmButton - - return h('div', [ - h('div.notification-modal__wrapper', { - }, [ - - h('div.notification-modal__header', {}, [ - this.context.t(header), - ]), - - h('div.notification-modal__message-wrapper', {}, [ - h('div.notification-modal__message', {}, [ - this.context.t(message), - ]), - ]), - - h('div.modal-close-x', { - onClick: hideModal, - }), - - showButtons && h('div.notification-modal__buttons', [ - - showCancelButton && h('div.btn-default.notification-modal__buttons__btn', { - onClick: hideModal, - }, 'Cancel'), - - showConfirmButton && h('div.button.btn-secondary.notification-modal__buttons__btn', { - onClick: () => { - onConfirm() - hideModal() - }, - }, 'Confirm'), - - ]), - - ]), - ]) - } -} - -NotificationModal.propTypes = { - hideModal: PropTypes.func, - header: PropTypes.string, - message: PropTypes.node, - showCancelButton: PropTypes.bool, - showConfirmButton: PropTypes.bool, - onConfirm: PropTypes.func, - t: PropTypes.func, -} - -const mapDispatchToProps = dispatch => { - return { - hideModal: () => { - dispatch(actions.hideModal()) - }, - } -} - -NotificationModal.contextTypes = { - t: PropTypes.func, -} - -module.exports = connect(null, mapDispatchToProps)(NotificationModal) - diff --git a/ui/app/components/app/modals/notification-modal/index.js b/ui/app/components/app/modals/notification-modal/index.js new file mode 100644 index 000000000000..a2aab7c1d6b4 --- /dev/null +++ b/ui/app/components/app/modals/notification-modal/index.js @@ -0,0 +1 @@ +export { default } from './notification-modal' diff --git a/ui/app/components/app/modals/notification-modal/index.scss b/ui/app/components/app/modals/notification-modal/index.scss new file mode 100644 index 000000000000..93e085496967 --- /dev/null +++ b/ui/app/components/app/modals/notification-modal/index.scss @@ -0,0 +1,56 @@ +.notification-modal { + &__wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; + position: relative; + border: 1px solid $alto; + box-shadow: 0 0 2px 2px $alto; + } + + &__header { + background: $wild-sand; + width: 100%; + display: flex; + justify-content: center; + padding: 30px; + font-size: 22px; + color: $nile-blue; + } + + &__message { + padding: 20px; + width: 100%; + display: flex; + justify-content: center; + font-size: 17px; + color: $nile-blue; + } + + &__buttons { + display: flex; + justify-content: space-evenly; + width: 100%; + margin-bottom: 24px; + padding: 0 42px; + + &__btn { + cursor: pointer; + } + } + + &__link { + color: $primary-blue; + } + + .modal-close-x::after { + content: '\00D7'; + font-size: 2em; + color: $dusty-gray; + position: absolute; + top: 25px; + right: 17.5px; + cursor: pointer; + } +} diff --git a/ui/app/components/app/modals/notification-modal/notification-modal.js b/ui/app/components/app/modals/notification-modal/notification-modal.js new file mode 100644 index 000000000000..2cda614283e4 --- /dev/null +++ b/ui/app/components/app/modals/notification-modal/notification-modal.js @@ -0,0 +1,89 @@ +import PropTypes from 'prop-types' +import React, { Component } from 'react' +import { connect } from 'react-redux' +import { hideModal } from '../../../../store/actions' + +class NotificationModal extends Component { + static contextProps = { + t: PropTypes.func.isRequired, + } + + render () { + const { + header, + message, + showCancelButton = false, + showConfirmButton = false, + // eslint-disable-next-line no-shadow + hideModal, + onConfirm, + } = this.props + + const { t } = this.context + + const showButtons = showCancelButton || showConfirmButton + + return ( +
    +
    +
    + {this.context.t(header)} +
    +
    +
    + {this.context.t(message)} +
    +
    +
    + {showButtons && ( +
    + {showCancelButton && ( +
    + {t('cancel')} +
    + )} + {showConfirmButton && ( +
    { + onConfirm() + hideModal() + }} + > + {t('confirm')} +
    + )} +
    + )} +
    +
    + ) + } +} + +NotificationModal.propTypes = { + hideModal: PropTypes.func, + header: PropTypes.string, + message: PropTypes.node, + showCancelButton: PropTypes.bool, + showConfirmButton: PropTypes.bool, + onConfirm: PropTypes.func, +} + +const mapDispatchToProps = (dispatch) => { + return { + hideModal: () => { + dispatch(hideModal()) + }, + } +} + +NotificationModal.contextTypes = { + t: PropTypes.func, +} + +export default connect(null, mapDispatchToProps)(NotificationModal) + diff --git a/ui/app/components/app/modals/qr-scanner/index.js b/ui/app/components/app/modals/qr-scanner/index.js index 470dee1f4b79..d96782c135a4 100644 --- a/ui/app/components/app/modals/qr-scanner/index.js +++ b/ui/app/components/app/modals/qr-scanner/index.js @@ -1,2 +1,3 @@ import QrScanner from './qr-scanner.container' -module.exports = QrScanner + +export default QrScanner diff --git a/ui/app/components/app/modals/qr-scanner/qr-scanner.component.js b/ui/app/components/app/modals/qr-scanner/qr-scanner.component.js index a83ba8f8ed75..d78db3d14103 100644 --- a/ui/app/components/app/modals/qr-scanner/qr-scanner.component.js +++ b/ui/app/components/app/modals/qr-scanner/qr-scanner.component.js @@ -1,100 +1,139 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' +import log from 'loglevel' import { BrowserQRCodeReader } from '@zxing/library' -import adapter from 'webrtc-adapter' // eslint-disable-line import/no-nodejs-modules, no-unused-vars +import { getEnvironmentType } from '../../../../../../app/scripts/lib/util' +import { ENVIRONMENT_TYPE_FULLSCREEN } from '../../../../../../app/scripts/lib/enums' import Spinner from '../../../ui/spinner' import WebcamUtils from '../../../../../lib/webcam-utils' import PageContainerFooter from '../../../ui/page-container/page-container-footer/page-container-footer.component' +const READY_STATE = { + ACCESSING_CAMERA: 'ACCESSING_CAMERA', + NEED_TO_ALLOW_ACCESS: 'NEED_TO_ALLOW_ACCESS', + READY: 'READY', +} + export default class QrScanner extends Component { static propTypes = { hideModal: PropTypes.func.isRequired, - qrCodeDetected: PropTypes.func, - scanQrCode: PropTypes.func, - error: PropTypes.bool, - errorType: PropTypes.string, + qrCodeDetected: PropTypes.func.isRequired, } static contextTypes = { t: PropTypes.func, } - constructor (props, context) { + constructor (props) { super(props) - this.state = { - ready: false, - msg: context.t('accessingYourCamera'), - } + this.state = this.getInitialState() this.codeReader = null this.permissionChecker = null - this.needsToReinit = false + this.mounted = false // Clear pre-existing qr code data before scanning this.props.qrCodeDetected(null) } componentDidMount () { + this.mounted = true + this.checkEnvironment() + } + + componentDidUpdate (_, prevState) { + const { ready } = this.state + + if (prevState.ready !== ready) { + if (ready === READY_STATE.READY) { + this.initCamera() + } else if (ready === READY_STATE.NEED_TO_ALLOW_ACCESS) { + this.checkPermissions() + } + } + } + + getInitialState () { + return { + ready: READY_STATE.ACCESSING_CAMERA, + error: null, + } + } + + checkEnvironment = async () => { + try { + const { environmentReady } = await WebcamUtils.checkStatus() + if (!environmentReady && getEnvironmentType() !== ENVIRONMENT_TYPE_FULLSCREEN) { + const currentUrl = new URL(window.location.href) + const currentHash = currentUrl.hash + const currentRoute = currentHash + ? currentHash.substring(1) + : null + global.platform.openExtensionInBrowser(currentRoute) + } + } catch (error) { + if (this.mounted) { + this.setState({ error }) + } + } + // initial attempt is required to trigger permission prompt this.initCamera() } - async checkPermisisions () { - const { permissions } = await WebcamUtils.checkStatus() - if (permissions) { - clearTimeout(this.permissionChecker) - // Let the video stream load first... - setTimeout(_ => { - this.setState({ - ready: true, - msg: this.context.t('scanInstructions'), - }) - if (this.needsToReinit) { - this.initCamera() - this.needsToReinit = false + checkPermissions = async () => { + try { + const { permissions } = await WebcamUtils.checkStatus() + if (permissions) { + // Let the video stream load first... + await new Promise((resolve) => setTimeout(resolve, 2000)) + if (!this.mounted) { + return } - }, 2000) - } else { - // Keep checking for permissions - this.permissionChecker = setTimeout(_ => { - this.checkPermisisions() - }, 1000) + this.setState({ ready: READY_STATE.READY }) + } else if (this.mounted) { + // Keep checking for permissions + this.permissionChecker = setTimeout(this.checkPermissions, 1000) + } + } catch (error) { + if (this.mounted) { + this.setState({ error }) + } } } componentWillUnmount () { + this.mounted = false clearTimeout(this.permissionChecker) if (this.codeReader) { this.codeReader.reset() } } - initCamera () { + initCamera = async () => { this.codeReader = new BrowserQRCodeReader() - this.codeReader.getVideoInputDevices() - .then(() => { - clearTimeout(this.permissionChecker) - this.checkPermisisions() - this.codeReader.decodeFromInputVideoDevice(undefined, 'video') - .then(content => { - const result = this.parseContent(content.text) - if (result.type !== 'unknown') { - this.props.qrCodeDetected(result) - this.stopAndClose() - } else { - this.setState({msg: this.context.t('unknownQrCode')}) - } - }) - .catch(err => { - if (err && err.name === 'NotAllowedError') { - this.setState({msg: this.context.t('youNeedToAllowCameraAccess')}) - clearTimeout(this.permissionChecker) - this.needsToReinit = true - this.checkPermisisions() - } - }) - }).catch(err => { - console.error('[QR-SCANNER]: getVideoInputDevices threw an exception: ', err) - }) + try { + await this.codeReader.getVideoInputDevices() + const content = await this.codeReader.decodeFromInputVideoDevice(undefined, 'video') + const result = this.parseContent(content.text) + if (!this.mounted) { + return + } else if (result.type === 'unknown') { + this.setState({ error: new Error(this.context.t('unknownQrCode')) }) + } else { + this.props.qrCodeDetected(result) + this.stopAndClose() + } + } catch (error) { + if (!this.mounted) { + return + } + if (error.name === 'NotAllowedError') { + log.info(`Permission denied: '${error}'`) + this.setState({ ready: READY_STATE.NEED_TO_ALLOW_ACCESS }) + } else { + this.setState({ error }) + } + } } parseContent (content) { @@ -105,111 +144,128 @@ export default class QrScanner extends Component { // To parse other type of links // For ex. EIP-681 (https://eips.ethereum.org/EIPS/eip-681) - // Ethereum address links - fox ex. ethereum:0x.....1111 if (content.split('ethereum:').length > 1) { type = 'address' - values = {'address': content.split('ethereum:')[1] } + values = { 'address': content.split('ethereum:')[1] } // Regular ethereum addresses - fox ex. 0x.....1111 } else if (content.substring(0, 2).toLowerCase() === '0x') { type = 'address' - values = {'address': content } + values = { 'address': content } } - return {type, values} + return { type, values } } - stopAndClose = () => { if (this.codeReader) { this.codeReader.reset() } - this.setState({ ready: false }) this.props.hideModal() } tryAgain = () => { - // close the modal - this.stopAndClose() - // wait for the animation and try again - setTimeout(_ => { - this.props.scanQrCode() - }, 1000) + clearTimeout(this.permissionChecker) + if (this.codeReader) { + this.codeReader.reset() + } + this.setState(this.getInitialState(), () => { + this.checkEnvironment() + }) } - renderVideo () { - return ( -
    -
    - ) - } + renderError () { + const { t } = this.context + const { error } = this.state - renderErrorModal () { let title, msg - - if (this.props.error) { - if (this.props.errorType === 'NO_WEBCAM_FOUND') { - title = this.context.t('noWebcamFoundTitle') - msg = this.context.t('noWebcamFound') - } else { - title = this.context.t('unknownCameraErrorTitle') - msg = this.context.t('unknownCameraError') - } + if (error.type === 'NO_WEBCAM_FOUND') { + title = t('noWebcamFoundTitle') + msg = t('noWebcamFound') + } else if (error.message === t('unknownQrCode')) { + msg = t('unknownQrCode') + } else { + title = t('unknownCameraErrorTitle') + msg = t('unknownCameraError') } return ( -
    -
    - + <>
    - -
    -
    - { title } +
    -
    + { + title + ? ( +
    + { title } +
    + ) + : null + } +
    {msg}
    -
    + ) } - render () { + renderVideo () { const { t } = this.context + const { ready } = this.state - if (this.props.error) { - return this.renderErrorModal() + let message + if (ready === READY_STATE.ACCESSING_CAMERA) { + message = t('accessingYourCamera') + } else if (ready === READY_STATE.READY) { + message = t('scanInstructions') + } else if (ready === READY_STATE.NEED_TO_ALLOW_ACCESS) { + message = t('youNeedToAllowCameraAccess') } return ( -
    -
    + <>
    { `${t('scanQrCode')}` }
    - { this.renderVideo() } +
    +
    -
    - {this.state.msg} +
    + {message}
    + + ) + } + + render () { + const { error } = this.state + return ( +
    +
    + { + error + ? this.renderError() + : this.renderVideo() + }
    ) } diff --git a/ui/app/components/app/modals/qr-scanner/qr-scanner.container.js b/ui/app/components/app/modals/qr-scanner/qr-scanner.container.js index 2210fbed2fe6..98472c6ea3cb 100644 --- a/ui/app/components/app/modals/qr-scanner/qr-scanner.container.js +++ b/ui/app/components/app/modals/qr-scanner/qr-scanner.container.js @@ -1,24 +1,12 @@ import { connect } from 'react-redux' +import { hideModal, qrCodeDetected } from '../../../../store/actions' import QrScanner from './qr-scanner.component' -const { hideModal, qrCodeDetected, showQrScanner } = require('../../../../store/actions') -import { - SEND_ROUTE, -} from '../../../../helpers/constants/routes' - -const mapStateToProps = state => { - return { - error: state.appState.modal.modalState.props.error, - errorType: state.appState.modal.modalState.props.errorType, - } -} - -const mapDispatchToProps = dispatch => { +const mapDispatchToProps = (dispatch) => { return { hideModal: () => dispatch(hideModal()), qrCodeDetected: (data) => dispatch(qrCodeDetected(data)), - scanQrCode: () => dispatch(showQrScanner(SEND_ROUTE)), } } -export default connect(mapStateToProps, mapDispatchToProps)(QrScanner) +export default connect(null, mapDispatchToProps)(QrScanner) diff --git a/ui/app/components/app/modals/reject-transactions/index.scss b/ui/app/components/app/modals/reject-transactions/index.scss index 75346688321b..278689246b45 100644 --- a/ui/app/components/app/modals/reject-transactions/index.scss +++ b/ui/app/components/app/modals/reject-transactions/index.scss @@ -1,6 +1,6 @@ .reject-transactions { &__description { text-align: center; - font-size: .875rem; + font-size: 0.875rem; } } diff --git a/ui/app/components/app/modals/reject-transactions/reject-transactions.container.js b/ui/app/components/app/modals/reject-transactions/reject-transactions.container.js index aa74fd80095d..08061a48d6c2 100644 --- a/ui/app/components/app/modals/reject-transactions/reject-transactions.container.js +++ b/ui/app/components/app/modals/reject-transactions/reject-transactions.container.js @@ -1,7 +1,7 @@ import { connect } from 'react-redux' -import { compose } from 'recompose' -import RejectTransactionsModal from './reject-transactions.component' +import { compose } from 'redux' import withModalProps from '../../../../helpers/higher-order-components/with-modal-props' +import RejectTransactionsModal from './reject-transactions.component' const mapStateToProps = (_, ownProps) => { const { unapprovedTxCount } = ownProps diff --git a/ui/app/components/app/modals/reject-transactions/tests/reject-transactions.test.js b/ui/app/components/app/modals/reject-transactions/tests/reject-transactions.test.js new file mode 100644 index 000000000000..1d8a1df68047 --- /dev/null +++ b/ui/app/components/app/modals/reject-transactions/tests/reject-transactions.test.js @@ -0,0 +1,48 @@ +import assert from 'assert' +import React from 'react' +import sinon from 'sinon' +import { mount } from 'enzyme' +import RejectTransactionsModal from '..' + +describe('Reject Transactions Model', function () { + let wrapper + + const props = { + onSubmit: sinon.spy(), + hideModal: sinon.spy(), + unapprovedTxCount: 2, + } + + beforeEach(function () { + wrapper = mount( + , { + context: { + t: (str) => str, + }, + }, + ) + }) + + afterEach(function () { + props.hideModal.resetHistory() + }) + + it('hides modal when cancel button is clicked', function () { + const cancelButton = wrapper.find('.btn-default.modal-container__footer-button') + cancelButton.simulate('click') + + assert(props.hideModal.calledOnce) + }) + + it('onSubmit is called and hides modal when reject all clicked', function (done) { + const rejectAllButton = wrapper.find('.btn-secondary.modal-container__footer-button') + rejectAllButton.simulate('click') + + setImmediate(() => { + assert(props.onSubmit.calledOnce) + assert(props.hideModal.calledOnce) + done() + }) + + }) +}) diff --git a/ui/app/components/app/modals/tests/account-details-modal.test.js b/ui/app/components/app/modals/tests/account-details-modal.test.js new file mode 100644 index 000000000000..cc2dabdf2d58 --- /dev/null +++ b/ui/app/components/app/modals/tests/account-details-modal.test.js @@ -0,0 +1,81 @@ +import assert from 'assert' +import React from 'react' +import sinon from 'sinon' +import { shallow } from 'enzyme' +import AccountDetailsModal from '../account-details-modal' + +describe('Account Details Modal', function () { + let wrapper + + global.platform = { openTab: sinon.spy() } + + const props = { + hideModal: sinon.spy(), + setAccountLabel: sinon.spy(), + showExportPrivateKeyModal: sinon.spy(), + network: 'test', + rpcPrefs: {}, + selectedIdentity: { + address: '0xAddress', + name: 'Account 1', + }, + keyrings: [ + { + type: 'HD Key Tree', + accounts: [ + '0xAddress', + ], + }, + ], + identities: { + '0xAddress': { + address: '0xAddress', + name: 'Account 1', + }, + }, + } + + beforeEach(function () { + wrapper = shallow( + , { + context: { + t: (str) => str, + }, + }, + ) + }) + + it('sets account label when changing default account label', function () { + const accountLabel = wrapper.find('.account-details-modal__name').first() + accountLabel.simulate('submit', 'New Label') + + assert(props.setAccountLabel.calledOnce) + assert.equal(props.setAccountLabel.getCall(0).args[1], 'New Label') + }) + + it('opens new tab when view block explorer is clicked', function () { + const modalButton = wrapper.find('.account-details-modal__button') + const etherscanLink = modalButton.first() + + etherscanLink.simulate('click') + assert(global.platform.openTab.calledOnce) + }) + + it('shows export private key modal when clicked', function () { + const modalButton = wrapper.find('.account-details-modal__button') + const etherscanLink = modalButton.last() + + etherscanLink.simulate('click') + assert(props.showExportPrivateKeyModal.calledOnce) + }) + + it('sets blockexplorerview text when block explorer url in rpcPrefs exists', function () { + const blockExplorerUrl = 'https://block.explorer' + wrapper.setProps({ rpcPrefs: { blockExplorerUrl } }) + + const modalButton = wrapper.find('.account-details-modal__button') + const blockExplorerLink = modalButton.first() + + assert.equal(blockExplorerLink.html(), '') + }) +}) diff --git a/ui/app/components/app/modals/transaction-confirmed/index.scss b/ui/app/components/app/modals/transaction-confirmed/index.scss index c97371fb664f..6135f9b0c17a 100644 --- a/ui/app/components/app/modals/transaction-confirmed/index.scss +++ b/ui/app/components/app/modals/transaction-confirmed/index.scss @@ -8,7 +8,7 @@ &__description { text-align: center; - font-size: .875rem; + font-size: 0.875rem; } &__content { diff --git a/ui/app/components/app/modals/transaction-confirmed/tests/transaction-confirmed.test.js b/ui/app/components/app/modals/transaction-confirmed/tests/transaction-confirmed.test.js new file mode 100644 index 000000000000..971ed324cb2d --- /dev/null +++ b/ui/app/components/app/modals/transaction-confirmed/tests/transaction-confirmed.test.js @@ -0,0 +1,26 @@ +import assert from 'assert' +import React from 'react' +import sinon from 'sinon' +import { mount } from 'enzyme' +import TransactionConfirmed from '..' + +describe('Transaction Confirmed', function () { + it('clicks ok to submit and hide modal', function () { + const props = { + onSubmit: sinon.spy(), + hideModal: sinon.spy(), + } + const wrapper = mount( + , { + context: { + t: (str) => str, + }, + }, + ) + const submit = wrapper.find('.btn-secondary.modal-container__footer-button') + submit.simulate('click') + + assert(props.onSubmit.calledOnce) + assert(props.hideModal.calledOnce) + }) +}) diff --git a/ui/app/components/app/modals/transaction-confirmed/transaction-confirmed.container.js b/ui/app/components/app/modals/transaction-confirmed/transaction-confirmed.container.js index 9089ec158441..3109c5e27c81 100644 --- a/ui/app/components/app/modals/transaction-confirmed/transaction-confirmed.container.js +++ b/ui/app/components/app/modals/transaction-confirmed/transaction-confirmed.container.js @@ -1,4 +1,4 @@ -import TransactionConfirmed from './transaction-confirmed.component' import withModalProps from '../../../../helpers/higher-order-components/with-modal-props' +import TransactionConfirmed from './transaction-confirmed.component' export default withModalProps(TransactionConfirmed) diff --git a/ui/app/components/app/multiple-notifications/index.js b/ui/app/components/app/multiple-notifications/index.js new file mode 100644 index 000000000000..a27a651876af --- /dev/null +++ b/ui/app/components/app/multiple-notifications/index.js @@ -0,0 +1 @@ +export { default } from './multiple-notifications.component' diff --git a/ui/app/components/app/multiple-notifications/index.scss b/ui/app/components/app/multiple-notifications/index.scss new file mode 100644 index 000000000000..c1a52cf95d15 --- /dev/null +++ b/ui/app/components/app/multiple-notifications/index.scss @@ -0,0 +1,75 @@ +.home-notification-wrapper--show-all, +.home-notification-wrapper--show-first { + display: flex; + flex-direction: column; + width: 472px; + position: absolute; + bottom: 0; + right: 0; + margin: 8px; + + @media screen and (max-width: 576px) { + width: 340px; + } + + .home-notification-wrapper__i-container { + position: relative; + width: 100%; + height: 100%; + + .fa-sm { + display: initial; + position: absolute; + bottom: 14px; + left: 16px; + color: white; + cursor: pointer; + visibility: visible; + + &:hover { + color: #b0d7f2; + font-size: 1.1rem; + } + } + } +} + +.home-notification-wrapper--show-all { + justify-content: flex-end; + margin-bottom: 0; + + .home-notification-wrapper__i-container { + height: 0; + } + + > div { + position: relative; + margin-top: 8px; + } + + .fa-sm { + margin-bottom: 8px; + } +} + +.home-notification-wrapper--show-first { + > div { + position: absolute; + bottom: 0; + right: 0; + visibility: hidden; + } + + > div:first-of-type { + visibility: visible; + } + + .fa-sm { + position: relative; + display: initial; + } +} + +.flipped { + transform: rotate(180deg); +} diff --git a/ui/app/components/app/multiple-notifications/multiple-notifications.component.js b/ui/app/components/app/multiple-notifications/multiple-notifications.component.js new file mode 100644 index 000000000000..410bef6a9079 --- /dev/null +++ b/ui/app/components/app/multiple-notifications/multiple-notifications.component.js @@ -0,0 +1,52 @@ +import React, { PureComponent } from 'react' +import classnames from 'classnames' +import PropTypes from 'prop-types' + +export default class MultipleNotifications extends PureComponent { + static defaultProps = { + children: [], + classNames: [], + } + + static propTypes = { + children: PropTypes.array, + classNames: PropTypes.array, + } + + state = { + showAll: false, + } + + render () { + const { showAll } = this.state + const { children, classNames } = this.props + + const childrenToRender = children.filter((child) => child) + if (childrenToRender.length === 0) { + return null + } + + return ( +
    + { childrenToRender } +
    this.setState({ showAll: !showAll })} + > + {childrenToRender.length > 1 ? ( + + ) : null} +
    +
    + ) + } +} diff --git a/ui/app/components/app/network-display/index.js b/ui/app/components/app/network-display/index.js index f6878ae5ba7d..9fbb1670066b 100644 --- a/ui/app/components/app/network-display/index.js +++ b/ui/app/components/app/network-display/index.js @@ -1,2 +1,3 @@ import NetworkDisplay from './network-display.container' -module.exports = NetworkDisplay + +export default NetworkDisplay diff --git a/ui/app/components/app/network-display/index.scss b/ui/app/components/app/network-display/index.scss index d70786d20628..a17e47bc9d8a 100644 --- a/ui/app/components/app/network-display/index.scss +++ b/ui/app/components/app/network-display/index.scss @@ -33,7 +33,7 @@ } &__name { - font-size: .75rem; + font-size: 0.75rem; padding-left: 5px; } diff --git a/ui/app/components/app/network-display/network-display.component.js b/ui/app/components/app/network-display/network-display.component.js index 9ef5341b04aa..eb89755c3e58 100644 --- a/ui/app/components/app/network-display/network-display.component.js +++ b/ui/app/components/app/network-display/network-display.component.js @@ -2,19 +2,19 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' import { - MAINNET_CODE, - ROPSTEN_CODE, - RINKEYBY_CODE, - KOVAN_CODE, - GOERLI_CODE, + MAINNET_NETWORK_ID, + ROPSTEN_NETWORK_ID, + RINKEBY_NETWORK_ID, + KOVAN_NETWORK_ID, + GOERLI_NETWORK_ID, } from '../../../../../app/scripts/controllers/network/enums' -const networkToClassHash = { - [MAINNET_CODE]: 'mainnet', - [ROPSTEN_CODE]: 'ropsten', - [RINKEYBY_CODE]: 'rinkeby', - [GOERLI_CODE]: 'goerli', - [KOVAN_CODE]: 'kovan', +const networkIdToTypeMap = { + [MAINNET_NETWORK_ID]: 'mainnet', + [ROPSTEN_NETWORK_ID]: 'ropsten', + [RINKEBY_NETWORK_ID]: 'rinkeby', + [GOERLI_NETWORK_ID]: 'goerli', + [KOVAN_NETWORK_ID]: 'kovan', } export default class NetworkDisplay extends Component { @@ -34,40 +34,44 @@ export default class NetworkDisplay extends Component { renderNetworkIcon () { const { network } = this.props - const networkClass = networkToClassHash[network] + const networkClass = networkIdToTypeMap[network] return networkClass ?
    - :
    + ) } render () { const { colored, network, provider: { type, nickname } } = this.props - const networkClass = networkToClassHash[network] + const networkClass = networkIdToTypeMap[network] return (
    { networkClass ?
    - :
    + ) }
    { type === 'rpc' && nickname ? nickname : this.context.t(type) } diff --git a/ui/app/components/app/network.js b/ui/app/components/app/network.js index e778700cdd71..a156f676d6a5 100644 --- a/ui/app/components/app/network.js +++ b/ui/app/components/app/network.js @@ -1,151 +1,166 @@ -const Component = require('react').Component -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const connect = require('react-redux').connect -const classnames = require('classnames') -const inherits = require('util').inherits -const NetworkDropdownIcon = require('./dropdowns/components/network-dropdown-icon') +import PropTypes from 'prop-types' +import React, { Component } from 'react' +import classnames from 'classnames' +import NetworkDropdownIcon from './dropdowns/components/network-dropdown-icon' -Network.contextTypes = { - t: PropTypes.func, +function NetworkIndicator ({ disabled, children, hoverText, onClick, providerName }) { + return ( +
    { + if (!disabled) { + onClick(event) + } + }} + > +
    + {children} +
    +
    +
    + ) } -module.exports = connect()(Network) - - -inherits(Network, Component) - -function Network () { - Component.call(this) +NetworkIndicator.propTypes = { + children: PropTypes.node.isRequired, + disabled: PropTypes.bool, + hoverText: PropTypes.string, + onClick: PropTypes.func, + providerName: PropTypes.string, } -Network.prototype.render = function () { - const props = this.props - const context = this.context - const networkNumber = props.network - let providerName, providerNick, providerUrl - try { - providerName = props.provider.type - providerNick = props.provider.nickname || '' - providerUrl = props.provider.rpcTarget - } catch (e) { - providerName = null +export default class Network extends Component { + static contextTypes = { + t: PropTypes.func, } - const providerId = providerNick || providerName || providerUrl || null - let iconName - let hoverText - if (providerName === 'mainnet') { - hoverText = context.t('mainnet') - iconName = 'ethereum-network' - } else if (providerName === 'ropsten') { - hoverText = context.t('ropsten') - iconName = 'ropsten-test-network' - } else if (providerName === 'kovan') { - hoverText = context.t('kovan') - iconName = 'kovan-test-network' - } else if (providerName === 'rinkeby') { - hoverText = context.t('rinkeby') - iconName = 'rinkeby-test-network' - } else if (providerName === 'goerli') { - hoverText = context.t('goerli') - iconName = 'goerli-test-network' - } else { - hoverText = providerId - iconName = 'private-network' + static propTypes = { + network: PropTypes.string.isRequired, + provider: PropTypes.shape({ + type: PropTypes.string, + nickname: PropTypes.string, + rpcTarget: PropTypes.string, + }).isRequired, + disabled: PropTypes.bool, + onClick: PropTypes.func.isRequired, } - return ( - h('div.network-component.pointer', { - className: classnames({ - 'network-component--disabled': this.props.disabled, - 'ethereum-network': providerName === 'mainnet', - 'ropsten-test-network': providerName === 'ropsten', - 'kovan-test-network': providerName === 'kovan', - 'rinkeby-test-network': providerName === 'rinkeby', - 'goerli-test-network': providerName === 'goerli', - }), - title: hoverText, - onClick: (event) => { - if (!this.props.disabled) { - this.props.onClick(event) - } - }, - }, [ - (function () { - switch (iconName) { - case 'ethereum-network': - return h('.network-indicator', [ - h(NetworkDropdownIcon, { - backgroundColor: '#038789', // $blue-lagoon - nonSelectBackgroundColor: '#15afb2', - loading: networkNumber === 'loading', - }), - h('.network-name', context.t('mainnet')), - h('.network-indicator__down-arrow'), - ]) - case 'ropsten-test-network': - return h('.network-indicator', [ - h(NetworkDropdownIcon, { - backgroundColor: '#e91550', // $crimson - nonSelectBackgroundColor: '#ec2c50', - loading: networkNumber === 'loading', - }), - h('.network-name', context.t('ropsten')), - h('.network-indicator__down-arrow'), - ]) - case 'kovan-test-network': - return h('.network-indicator', [ - h(NetworkDropdownIcon, { - backgroundColor: '#690496', // $purple - nonSelectBackgroundColor: '#b039f3', - loading: networkNumber === 'loading', - }), - h('.network-name', context.t('kovan')), - h('.network-indicator__down-arrow'), - ]) - case 'rinkeby-test-network': - return h('.network-indicator', [ - h(NetworkDropdownIcon, { - backgroundColor: '#ebb33f', // $tulip-tree - nonSelectBackgroundColor: '#ecb23e', - loading: networkNumber === 'loading', - }), - h('.network-name', context.t('rinkeby')), - h('.network-indicator__down-arrow'), - ]) - case 'goerli-test-network': - return h('.network-indicator', [ - h(NetworkDropdownIcon, { - backgroundColor: '#3099f2', // $dodger-blue - nonSelectBackgroundColor: '#ecb23e', - loading: networkNumber === 'loading', - }), - h('.network-name', context.t('goerli')), - h('.network-indicator__down-arrow'), - ]) - default: - return h('.network-indicator', [ - networkNumber === 'loading' - ? h('span.pointer.network-loading-spinner', { - onClick: (event) => this.props.onClick(event), - }, [ - h('img', { - title: context.t('attemptingConnect'), - src: 'images/loading.svg', - }), - ]) - : h('i.fa.fa-question-circle.fa-lg', { - style: { - color: 'rgb(125, 128, 130)', - }, - }), + render () { + const { + t, + } = this.context - h('.network-name', providerName === 'localhost' ? context.t('localhost') : providerNick || context.t('privateNetwork')), - h('.network-indicator__down-arrow'), - ]) - } - })(), - ]) - ) + const { + disabled, + network: networkNumber, + onClick, + provider, + } = this.props + + let providerName, providerNick, providerUrl + if (provider) { + providerName = provider.type + providerNick = provider.nickname || '' + providerUrl = provider.rpcTarget + } + + switch (providerName) { + case 'mainnet': + return ( + + +
    {t('mainnet')}
    +
    + ) + + case 'ropsten': + return ( + + +
    {t('ropsten')}
    +
    + ) + + case 'kovan': + return ( + + +
    {t('kovan')}
    +
    + ) + + case 'rinkeby': + return ( + + +
    {t('rinkeby')}
    +
    + ) + + case 'goerli': + return ( + + +
    {t('goerli')}
    +
    + ) + + default: + return ( + + { + networkNumber === 'loading' + ? ( + onClick(event)}> + + + ) + : ( + + ) + } +
    + { + providerName === 'localhost' + ? t('localhost') + : providerNick || t('privateNetwork') + } +
    +
    + ) + } + } } diff --git a/ui/app/components/app/permission-page-container/index.js b/ui/app/components/app/permission-page-container/index.js new file mode 100644 index 000000000000..63e8265c2e7b --- /dev/null +++ b/ui/app/components/app/permission-page-container/index.js @@ -0,0 +1,3 @@ +export { default } from './permission-page-container.container' +export { default as PermissionPageContainerContent } from './permission-page-container-content' +export { default as PermissionPageContainerHeader } from './permission-page-container-header' diff --git a/ui/app/components/app/permission-page-container/index.scss b/ui/app/components/app/permission-page-container/index.scss new file mode 100644 index 000000000000..2e3f10aa8919 --- /dev/null +++ b/ui/app/components/app/permission-page-container/index.scss @@ -0,0 +1,139 @@ +.permission-approval-container { + display: flex; + border: none; + box-shadow: none; + width: 100%; + margin-top: 2px; + height: 100%; + flex-direction: column; + justify-content: space-between; + + @media screen and (min-width: 576px) { + width: 426px; + flex: 1; + + &__footers { + display: flex; + flex-direction: column-reverse; + flex: 1; + padding-bottom: 20px; + justify-content: space-between; + } + } + + + &__header { + display: flex; + flex-direction: column; + align-items: flex-end; + border-bottom: 1px solid $geyser; + padding: 9px; + } + + &__title { + @include H4; + + line-height: 25px; + text-align: center; + margin-top: 32px; + width: 100%; + } + + &__content { + display: flex; + overflow-y: auto; + flex-direction: column; + color: #7c808e; + padding-left: 24px; + padding-right: 24px; + + a, + a:hover { + color: $dodger-blue; + } + + &__requested { + text-align: left; + } + + &__revoke-note { + margin-top: 60px; + } + + &__permission { + display: flex; + align-items: center; + + label { + font-size: 14px; + margin-left: 16px; + color: $Black-100; + } + } + } + + & &__checkbox { + font-size: 1.4rem; + margin: 0; + } + + &__content-container { + display: flex; + flex-direction: column; + align-items: center; + } + + &__permissions-header { + @include H6; + + line-height: 20px; + color: #6a737d; + } + + &__permissions-container { + display: flex; + flex-direction: column; + margin-top: 38px; + } + + .page-container__footer { + align-items: center; + margin-top: 12px; + + @media screen and (min-width: 576px) { + border-top: none; + } + + footer { + width: 100%; + justify-content: space-between; + + button { + width: 124px; + } + } + } + + @media screen and (max-width: 575px) { + &__title { + position: initial; + } + + &__content-approval-visual { + margin-top: 16px; + } + + .page-container__footer header { + padding: 0; + } + } + + &__tooltip-body { + display: flex; + flex-direction: column; + } + + &__bold-title-elements { + font-weight: bold; + } +} diff --git a/ui/app/components/app/permission-page-container/permission-page-container-content/index.js b/ui/app/components/app/permission-page-container/permission-page-container-content/index.js new file mode 100644 index 000000000000..014e4ff59c34 --- /dev/null +++ b/ui/app/components/app/permission-page-container/permission-page-container-content/index.js @@ -0,0 +1 @@ +export { default } from './permission-page-container-content.component' diff --git a/ui/app/components/app/permission-page-container/permission-page-container-content/permission-page-container-content.component.js b/ui/app/components/app/permission-page-container/permission-page-container-content/permission-page-container-content.component.js new file mode 100644 index 000000000000..94895e92da97 --- /dev/null +++ b/ui/app/components/app/permission-page-container/permission-page-container-content/permission-page-container-content.component.js @@ -0,0 +1,159 @@ +import PropTypes from 'prop-types' +import React, { PureComponent } from 'react' +import PermissionsConnectHeader from '../../permissions-connect-header' +import Tooltip from '../../../ui/tooltip' +import CheckBox from '../../../ui/check-box' + +export default class PermissionPageContainerContent extends PureComponent { + + static propTypes = { + domainMetadata: PropTypes.shape({ + extensionId: PropTypes.string, + icon: PropTypes.string, + host: PropTypes.string.isRequired, + name: PropTypes.string.isRequired, + origin: PropTypes.string.isRequired, + }), + selectedPermissions: PropTypes.object.isRequired, + onPermissionToggle: PropTypes.func.isRequired, + selectedIdentities: PropTypes.array, + allIdentitiesSelected: PropTypes.bool, + } + + static defaultProps = { + selectedIdentities: [], + allIdentitiesSelected: false, + } + + static contextTypes = { + t: PropTypes.func, + } + + renderRequestedPermissions () { + const { + selectedPermissions, onPermissionToggle, + } = this.props + const { t } = this.context + + const items = Object.keys(selectedPermissions).map((permissionName) => { + + const description = t(permissionName) + // don't allow deselecting eth_accounts + const isDisabled = permissionName === 'eth_accounts' + const isChecked = Boolean(selectedPermissions[permissionName]) + const title = isChecked ? t('permissionCheckedIconDescription') : t('permissionUncheckedIconDescription') + + return ( +
    { + if (!isDisabled) { + onPermissionToggle(permissionName) + } + }} + > + + +
    + ) + }) + + return ( +
    + {items} +
    + ) + } + + getAccountDescriptor (identity) { + return `${identity.label} (...${identity.address.slice(identity.address.length - 4)})` + } + + renderAccountTooltip (textContent) { + const { selectedIdentities } = this.props + const { t } = this.context + + return ( + + { selectedIdentities.slice(0, 6).map((identity, index) => { + return ( +
    + { this.getAccountDescriptor(identity) } +
    + ) + }) } + { selectedIdentities.length > 6 + ? t('plusXMore', [selectedIdentities.length - 6]) + : null + } +
    + )} + > + { textContent } + + ) + } + + getTitle () { + const { domainMetadata, selectedIdentities, allIdentitiesSelected } = this.props + const { t } = this.context + + if (domainMetadata.extensionId) { + return t('externalExtension', [domainMetadata.extensionId]) + } else if (allIdentitiesSelected) { + return t( + 'connectToAll', + [this.renderAccountTooltip(t('connectToAllAccounts'))], + ) + } else if (selectedIdentities.length > 1) { + return t( + 'connectToMultiple', + [ + this.renderAccountTooltip(t('connectToMultipleNumberOfAccounts', [selectedIdentities.length])), + ], + ) + } + return t('connectTo', [ + this.getAccountDescriptor(selectedIdentities[0]), + ]) + } + + render () { + const { domainMetadata } = this.props + const { t } = this.context + + const title = this.getTitle() + + return ( +
    +
    + +
    + { this.renderRequestedPermissions() } +
    +
    +
    + ) + } +} diff --git a/ui/app/components/app/permission-page-container/permission-page-container-header/index.js b/ui/app/components/app/permission-page-container/permission-page-container-header/index.js new file mode 100644 index 000000000000..d57a5370b4fc --- /dev/null +++ b/ui/app/components/app/permission-page-container/permission-page-container-header/index.js @@ -0,0 +1 @@ +export { default } from './permission-page-container-header.component' diff --git a/ui/app/components/app/permission-page-container/permission-page-container-header/permission-page-container-header.component.js b/ui/app/components/app/permission-page-container/permission-page-container-header/permission-page-container-header.component.js new file mode 100644 index 000000000000..72bd17f82ad5 --- /dev/null +++ b/ui/app/components/app/permission-page-container/permission-page-container-header/permission-page-container-header.component.js @@ -0,0 +1,12 @@ +import React from 'react' +import NetworkDisplay from '../../network-display' + +const ProviderPageContainerHeader = () => { + return ( +
    + +
    + ) +} + +export default ProviderPageContainerHeader diff --git a/ui/app/components/app/permission-page-container/permission-page-container.component.js b/ui/app/components/app/permission-page-container/permission-page-container.component.js new file mode 100644 index 000000000000..8598ab976230 --- /dev/null +++ b/ui/app/components/app/permission-page-container/permission-page-container.component.js @@ -0,0 +1,149 @@ +import PropTypes from 'prop-types' +import React, { Component } from 'react' +import { isEqual } from 'lodash' +import { PageContainerFooter } from '../../ui/page-container' +import PermissionsConnectFooter from '../permissions-connect-footer' +import { PermissionPageContainerContent } from '.' + +export default class PermissionPageContainer extends Component { + + static propTypes = { + approvePermissionsRequest: PropTypes.func.isRequired, + rejectPermissionsRequest: PropTypes.func.isRequired, + selectedIdentities: PropTypes.array, + allIdentitiesSelected: PropTypes.bool, + request: PropTypes.object, + requestMetadata: PropTypes.object, + targetDomainMetadata: PropTypes.shape({ + extensionId: PropTypes.string, + icon: PropTypes.string, + host: PropTypes.string.isRequired, + name: PropTypes.string.isRequired, + origin: PropTypes.string.isRequired, + }), + } + + static defaultProps = { + request: {}, + requestMetadata: {}, + selectedIdentities: [], + allIdentitiesSelected: false, + } + + static contextTypes = { + t: PropTypes.func, + metricsEvent: PropTypes.func, + } + + state = { + selectedPermissions: this.getRequestedMethodState( + this.getRequestedMethodNames(this.props), + ), + } + + componentDidUpdate () { + const newMethodNames = this.getRequestedMethodNames(this.props) + + if (!isEqual(Object.keys(this.state.selectedPermissions), newMethodNames)) { + // this should be a new request, so just overwrite + this.setState({ + selectedPermissions: this.getRequestedMethodState(newMethodNames), + }) + } + } + + getRequestedMethodState (methodNames) { + return methodNames.reduce( + (acc, methodName) => { + acc[methodName] = true + return acc + }, + {}, + ) + } + + getRequestedMethodNames (props) { + return Object.keys(props.request.permissions || {}) + } + + onPermissionToggle = (methodName) => { + this.setState({ + selectedPermissions: { + ...this.state.selectedPermissions, + [methodName]: !this.state.selectedPermissions[methodName], + }, + }) + } + + componentDidMount () { + this.context.metricsEvent({ + eventOpts: { + category: 'Auth', + action: 'Connect', + name: 'Tab Opened', + }, + }) + } + + onCancel = () => { + const { request, rejectPermissionsRequest } = this.props + rejectPermissionsRequest(request.metadata.id) + } + + onSubmit = () => { + const { + request: _request, approvePermissionsRequest, rejectPermissionsRequest, selectedIdentities, + } = this.props + + const request = { + ..._request, + permissions: { ..._request.permissions }, + } + + Object.keys(this.state.selectedPermissions).forEach((key) => { + if (!this.state.selectedPermissions[key]) { + delete request.permissions[key] + } + }) + + if (Object.keys(request.permissions).length > 0) { + approvePermissionsRequest(request, selectedIdentities.map((selectedIdentity) => selectedIdentity.address)) + } else { + rejectPermissionsRequest(request.metadata.id) + } + } + + render () { + const { + requestMetadata, + targetDomainMetadata, + selectedIdentities, + allIdentitiesSelected, + } = this.props + + return ( +
    + +
    + + this.onCancel()} + cancelText={this.context.t('cancel')} + onSubmit={() => this.onSubmit()} + submitText={this.context.t('connect')} + submitButtonType="confirm" + buttonSizeLarge={false} + /> +
    +
    + ) + } +} diff --git a/ui/app/components/app/permission-page-container/permission-page-container.container.js b/ui/app/components/app/permission-page-container/permission-page-container.container.js new file mode 100644 index 000000000000..bae0f43d9cb1 --- /dev/null +++ b/ui/app/components/app/permission-page-container/permission-page-container.container.js @@ -0,0 +1,16 @@ +import { connect } from 'react-redux' +import { getMetaMaskIdentities } from '../../../selectors' +import PermissionPageContainer from './permission-page-container.component' + +const mapStateToProps = (state, ownProps) => { + const { selectedIdentities } = ownProps + + const allIdentities = getMetaMaskIdentities(state) + const allIdentitiesSelected = Object.keys(selectedIdentities).length === Object.keys(allIdentities).length && selectedIdentities.length > 1 + + return { + allIdentitiesSelected, + } +} + +export default connect(mapStateToProps)(PermissionPageContainer) diff --git a/ui/app/components/app/permissions-connect-footer/index.js b/ui/app/components/app/permissions-connect-footer/index.js new file mode 100644 index 000000000000..8096e1e3d6d4 --- /dev/null +++ b/ui/app/components/app/permissions-connect-footer/index.js @@ -0,0 +1 @@ +export { default } from './permissions-connect-footer.component' diff --git a/ui/app/components/app/permissions-connect-footer/index.scss b/ui/app/components/app/permissions-connect-footer/index.scss new file mode 100644 index 000000000000..51ee8a09fc57 --- /dev/null +++ b/ui/app/components/app/permissions-connect-footer/index.scss @@ -0,0 +1,21 @@ +.permissions-connect-footer { + display: flex; + flex-direction: column; + width: 100%; + align-items: center; + + &__text { + @include H7; + + line-height: 17px; + color: #6a737d; + display: flex; + margin-top: 10px; + + &--link { + color: $primary-blue; + margin-left: 4px; + cursor: pointer; + } + } +} diff --git a/ui/app/components/app/permissions-connect-footer/permissions-connect-footer.component.js b/ui/app/components/app/permissions-connect-footer/permissions-connect-footer.component.js new file mode 100644 index 000000000000..7bc2a8afd952 --- /dev/null +++ b/ui/app/components/app/permissions-connect-footer/permissions-connect-footer.component.js @@ -0,0 +1,26 @@ +import PropTypes from 'prop-types' +import React, { Component } from 'react' + +export default class PermissionsConnectFooter extends Component { + static contextTypes = { + t: PropTypes.func, + } + + render () { + const { t } = this.context + return ( +
    +
    +
    { t('onlyConnectTrust') }
    +
    { + global.platform.openTab({ url: 'https://medium.com/metamask/privacy-mode-is-now-enabled-by-default-1c1c957f4d57' }) + }} + >{ t('learnMore') } +
    +
    +
    + ) + } +} diff --git a/ui/app/components/app/permissions-connect-header/index.js b/ui/app/components/app/permissions-connect-header/index.js new file mode 100644 index 000000000000..e9de1a06a98f --- /dev/null +++ b/ui/app/components/app/permissions-connect-header/index.js @@ -0,0 +1 @@ +export { default } from './permissions-connect-header.component' diff --git a/ui/app/components/app/permissions-connect-header/index.scss b/ui/app/components/app/permissions-connect-header/index.scss new file mode 100644 index 000000000000..1ec0628e053a --- /dev/null +++ b/ui/app/components/app/permissions-connect-header/index.scss @@ -0,0 +1,56 @@ +.permissions-connect-header { + display: flex; + flex: 0; + flex-direction: column; + justify-content: center; + width: 92%; + + &__icon { + display: flex; + flex-direction: column; + align-items: center; + + .icon-with-fallback__identicon-container, + .icon-with-fallback__identicon-border { + height: 64px; + width: 64px; + } + + .icon-with-fallback__identicon-border { + border: 1px solid $Grey-100; + } + + .icon-with-fallback__identicon-container { + margin-bottom: 8px; + } + } + + &__title { + @include H3; + + text-align: center; + color: $Black-100; + margin-top: 14px; + } + + &__text, + &__subtitle { + @include H6; + + text-align: center; + color: $Grey-500; + } + + &__text { + width: 100%; + text-overflow: ellipsis; + overflow: hidden; + + /*rtl:ignore*/ + direction: rtl; + } + + &__subtitle { + margin-top: 4px; + } +} diff --git a/ui/app/components/app/permissions-connect-header/permissions-connect-header.component.js b/ui/app/components/app/permissions-connect-header/permissions-connect-header.component.js new file mode 100644 index 000000000000..c1bc5d775724 --- /dev/null +++ b/ui/app/components/app/permissions-connect-header/permissions-connect-header.component.js @@ -0,0 +1,45 @@ +import PropTypes from 'prop-types' +import React, { Component } from 'react' +import SiteIcon from '../../ui/site-icon' + +export default class PermissionsConnectHeader extends Component { + static propTypes = { + icon: PropTypes.string, + iconName: PropTypes.string.isRequired, + siteOrigin: PropTypes.string.isRequired, + headerTitle: PropTypes.node, + headerText: PropTypes.string, + } + + static defaultProps = { + icon: null, + headerTitle: '', + headerText: '', + } + + renderHeaderIcon () { + const { icon, iconName, siteOrigin } = this.props + + return ( +
    + +
    {siteOrigin}
    +
    + ) + } + + render () { + const { headerTitle, headerText } = this.props + return ( +
    + { this.renderHeaderIcon() } +
    + { headerTitle } +
    +
    + { headerText } +
    +
    + ) + } +} diff --git a/ui/app/components/app/provider-page-container/index.js b/ui/app/components/app/provider-page-container/index.js deleted file mode 100644 index 927c35940cb1..000000000000 --- a/ui/app/components/app/provider-page-container/index.js +++ /dev/null @@ -1,3 +0,0 @@ -export {default} from './provider-page-container.component' -export {default as ProviderPageContainerContent} from './provider-page-container-content' -export {default as ProviderPageContainerHeader} from './provider-page-container-header' diff --git a/ui/app/components/app/provider-page-container/index.scss b/ui/app/components/app/provider-page-container/index.scss deleted file mode 100644 index 8d35ac179052..000000000000 --- a/ui/app/components/app/provider-page-container/index.scss +++ /dev/null @@ -1,121 +0,0 @@ -.provider-approval-container { - display: flex; - - &__header { - display: flex; - flex-direction: column; - align-items: flex-end; - border-bottom: 1px solid $geyser; - padding: 9px; - } - - &__content { - display: flex; - overflow-y: auto; - flex: 1; - flex-direction: column; - justify-content: space-between; - color: #7C808E; - - h1, h2 { - color: #4A4A4A; - display: flex; - justify-content: center; - text-align: center; - } - - h2 { - font-size: 16px; - line-height: 18px; - padding: 20px; - } - - h1 { - font-size: 22px; - line-height: 26px; - padding: 20px; - } - - p { - padding: 0 40px; - text-align: center; - font-size: 12px; - line-height: 18px; - } - - a, a:hover { - color: $dodger-blue; - } - - .provider-approval-visual { - display: flex; - flex-direction: row; - justify-content: space-evenly; - position: relative; - margin: 0 32px; - - section { - display: flex; - flex-direction: column; - align-items: center; - flex: 1; - } - - h1 { - font-size: 14px; - line-height: 18px; - padding: 8px 0 0; - } - - h2 { - font-size: 10px; - line-height: 14px; - padding: 0; - color: #A2A4AC; - } - - &__check { - width: 40px; - height: 40px; - background: white url("/images/provider-approval-check.svg") no-repeat; - margin-top: 14px; - } - - &__identicon { - width: 64px; - height: 64px; - - &--default { - background-color: #777A87; - color: white; - width: 64px; - height: 64px; - border-radius: 32px; - display: flex; - align-items: center; - justify-content: center; - font-weight: bold; - } - } - - &:before { - border-top: 2px dashed #CDD1E4; - content: ""; - margin: 0 auto; - position: absolute; - top: 32px; - left: 0; - bottom: 0; - right: 0; - width: 65%; - z-index: -1; - } - } - - .secure-badge { - display: flex; - justify-content: center; - padding: 25px; - } - } -} diff --git a/ui/app/components/app/provider-page-container/provider-page-container-content/index.js b/ui/app/components/app/provider-page-container/provider-page-container-content/index.js deleted file mode 100644 index 73e491adc89f..000000000000 --- a/ui/app/components/app/provider-page-container/provider-page-container-content/index.js +++ /dev/null @@ -1 +0,0 @@ -export {default} from './provider-page-container-content.container' diff --git a/ui/app/components/app/provider-page-container/provider-page-container-content/provider-page-container-content.component.js b/ui/app/components/app/provider-page-container/provider-page-container-content/provider-page-container-content.component.js deleted file mode 100644 index 0eb1d616a67e..000000000000 --- a/ui/app/components/app/provider-page-container/provider-page-container-content/provider-page-container-content.component.js +++ /dev/null @@ -1,77 +0,0 @@ -import PropTypes from 'prop-types' -import React, {PureComponent} from 'react' -import Identicon from '../../../ui/identicon' - -export default class ProviderPageContainerContent extends PureComponent { - static propTypes = { - origin: PropTypes.string.isRequired, - selectedIdentity: PropTypes.string.isRequired, - siteImage: PropTypes.string, - siteTitle: PropTypes.string.isRequired, - } - - static contextTypes = { - t: PropTypes.func, - }; - - renderConnectVisual = () => { - const { origin, selectedIdentity, siteImage, siteTitle } = this.props - - return ( -
    -
    - {siteImage ? ( - - ) : ( - - {siteTitle.charAt(0).toUpperCase()} - - )} -

    {siteTitle}

    -

    {origin}

    -
    - -
    - -

    {selectedIdentity.name}

    -
    -
    - ) - } - - render () { - const { siteTitle } = this.props - const { t } = this.context - - return ( -
    -
    -

    {t('connectRequest')}

    - {this.renderConnectVisual()} -

    {t('providerRequest', [siteTitle])}

    -

    - {t('providerRequestInfo')} -
    - - {t('learnMore')}. - -

    -
    -
    - -
    -
    - ) - } -} diff --git a/ui/app/components/app/provider-page-container/provider-page-container-content/provider-page-container-content.container.js b/ui/app/components/app/provider-page-container/provider-page-container-content/provider-page-container-content.container.js deleted file mode 100644 index 4dbdddd161b0..000000000000 --- a/ui/app/components/app/provider-page-container/provider-page-container-content/provider-page-container-content.container.js +++ /dev/null @@ -1,11 +0,0 @@ -import { connect } from 'react-redux' -import ProviderPageContainerContent from './provider-page-container-content.component' -import { getSelectedIdentity } from '../../../../selectors/selectors' - -const mapStateToProps = (state) => { - return { - selectedIdentity: getSelectedIdentity(state), - } -} - -export default connect(mapStateToProps)(ProviderPageContainerContent) diff --git a/ui/app/components/app/provider-page-container/provider-page-container-header/index.js b/ui/app/components/app/provider-page-container/provider-page-container-header/index.js deleted file mode 100644 index 430627d3a3ae..000000000000 --- a/ui/app/components/app/provider-page-container/provider-page-container-header/index.js +++ /dev/null @@ -1 +0,0 @@ -export {default} from './provider-page-container-header.component' diff --git a/ui/app/components/app/provider-page-container/provider-page-container-header/provider-page-container-header.component.js b/ui/app/components/app/provider-page-container/provider-page-container-header/provider-page-container-header.component.js deleted file mode 100644 index 41bf6c3dd244..000000000000 --- a/ui/app/components/app/provider-page-container/provider-page-container-header/provider-page-container-header.component.js +++ /dev/null @@ -1,12 +0,0 @@ -import React, {PureComponent} from 'react' -import NetworkDisplay from '../../network-display' - -export default class ProviderPageContainerHeader extends PureComponent { - render () { - return ( -
    - -
    - ) - } -} diff --git a/ui/app/components/app/provider-page-container/provider-page-container.component.js b/ui/app/components/app/provider-page-container/provider-page-container.component.js deleted file mode 100644 index 1c655d4047cd..000000000000 --- a/ui/app/components/app/provider-page-container/provider-page-container.component.js +++ /dev/null @@ -1,75 +0,0 @@ -import PropTypes from 'prop-types' -import React, {PureComponent} from 'react' -import { ProviderPageContainerContent, ProviderPageContainerHeader } from '.' -import { PageContainerFooter } from '../../ui/page-container' - -export default class ProviderPageContainer extends PureComponent { - static propTypes = { - approveProviderRequestByOrigin: PropTypes.func.isRequired, - rejectProviderRequestByOrigin: PropTypes.func.isRequired, - origin: PropTypes.string.isRequired, - siteImage: PropTypes.string, - siteTitle: PropTypes.string.isRequired, - }; - - static contextTypes = { - t: PropTypes.func, - metricsEvent: PropTypes.func, - }; - - componentDidMount () { - this.context.metricsEvent({ - eventOpts: { - category: 'Auth', - action: 'Connect', - name: 'Popup Opened', - }, - }) - } - - onCancel = () => { - const { origin, rejectProviderRequestByOrigin } = this.props - this.context.metricsEvent({ - eventOpts: { - category: 'Auth', - action: 'Connect', - name: 'Canceled', - }, - }) - rejectProviderRequestByOrigin(origin) - } - - onSubmit = () => { - const { approveProviderRequestByOrigin, origin } = this.props - this.context.metricsEvent({ - eventOpts: { - category: 'Auth', - action: 'Connect', - name: 'Confirmed', - }, - }) - approveProviderRequestByOrigin(origin) - } - - render () { - const {origin, siteImage, siteTitle} = this.props - - return ( -
    - - - this.onCancel()} - cancelText={this.context.t('cancel')} - onSubmit={() => this.onSubmit()} - submitText={this.context.t('connect')} - submitButtonType="confirm" - /> -
    - ) - } -} diff --git a/ui/app/components/app/selected-account/index.js b/ui/app/components/app/selected-account/index.js index eb342181fb81..7a362f09ef26 100644 --- a/ui/app/components/app/selected-account/index.js +++ b/ui/app/components/app/selected-account/index.js @@ -1,2 +1,3 @@ import SelectedAccount from './selected-account.container' -module.exports = SelectedAccount + +export default SelectedAccount diff --git a/ui/app/components/app/selected-account/index.scss b/ui/app/components/app/selected-account/index.scss index fa3079d7730a..c90ef7d786c5 100644 --- a/ui/app/components/app/selected-account/index.scss +++ b/ui/app/components/app/selected-account/index.scss @@ -5,8 +5,12 @@ align-items: center; flex: 1; + &__tooltip-wrapper { + width: 100%; + } + &__name { - max-width: 200px; + width: 100%; font-size: 1rem; font-weight: 500; line-height: 19px; @@ -19,8 +23,8 @@ } &__address { - font-size: .75rem; - line-height: .75rem; + font-size: 0.75rem; + line-height: 0.75rem; color: #989a9b; } @@ -30,12 +34,12 @@ align-items: center; justify-content: center; margin: 4px 0; - padding: 6px 15px; + padding: 6px 1px; border-radius: 10px; cursor: pointer; &:hover { - background-color: #e8e6e8; + background-color: $Grey-000; } &:active { diff --git a/ui/app/components/app/selected-account/selected-account.component.js b/ui/app/components/app/selected-account/selected-account.component.js index 5a3fa815f036..ff2dd17c9641 100644 --- a/ui/app/components/app/selected-account/selected-account.component.js +++ b/ui/app/components/app/selected-account/selected-account.component.js @@ -1,9 +1,9 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' import copyToClipboard from 'copy-to-clipboard' -import { addressSlicer, checksumAddress } from '../../../helpers/utils/util' +import { shortenAddress, checksumAddress } from '../../../helpers/utils/util' -const Tooltip = require('../../ui/tooltip-v2.js').default +import Tooltip from '../../ui/tooltip' class SelectedAccount extends Component { state = { @@ -15,19 +15,18 @@ class SelectedAccount extends Component { } static propTypes = { - selectedAddress: PropTypes.string, - selectedIdentity: PropTypes.object, - network: PropTypes.string, + selectedIdentity: PropTypes.object.isRequired, } render () { const { t } = this.context - const { selectedAddress, selectedIdentity, network } = this.props - const checksummedAddress = checksumAddress(selectedAddress, network) + const { selectedIdentity } = this.props + const checksummedAddress = checksumAddress(selectedIdentity.address) return (
    @@ -43,7 +42,7 @@ class SelectedAccount extends Component { { selectedIdentity.name }
    - { addressSlicer(checksummedAddress) } + { shortenAddress(checksummedAddress) }
    diff --git a/ui/app/components/app/selected-account/selected-account.container.js b/ui/app/components/app/selected-account/selected-account.container.js index b5dbe74f36a0..154bf431148d 100644 --- a/ui/app/components/app/selected-account/selected-account.container.js +++ b/ui/app/components/app/selected-account/selected-account.container.js @@ -1,13 +1,10 @@ import { connect } from 'react-redux' +import { getSelectedIdentity } from '../../../selectors' import SelectedAccount from './selected-account.component' -const selectors = require('../../../selectors/selectors') - -const mapStateToProps = state => { +const mapStateToProps = (state) => { return { - selectedAddress: selectors.getSelectedAddress(state), - selectedIdentity: selectors.getSelectedIdentity(state), - network: state.metamask.network, + selectedIdentity: getSelectedIdentity(state), } } diff --git a/ui/app/components/app/selected-account/tests/selected-account-component.test.js b/ui/app/components/app/selected-account/tests/selected-account-component.test.js index 78a94d1c89aa..943ccf00a68d 100644 --- a/ui/app/components/app/selected-account/tests/selected-account-component.test.js +++ b/ui/app/components/app/selected-account/tests/selected-account-component.test.js @@ -1,14 +1,15 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { render } from 'enzyme' import SelectedAccount from '../selected-account.component' -describe('SelectedAccount Component', () => { - it('should render checksummed address', () => { - const wrapper = render(, { context: { t: () => {}}}) +describe('SelectedAccount Component', function () { + it('should render checksummed address', function () { + const wrapper = render(( + + ), { context: { t: () => undefined } }) // Checksummed version of address is displayed assert.equal(wrapper.find('.selected-account__address').text(), '0x1B82...5C9D') assert.equal(wrapper.find('.selected-account__name').text(), 'testName') diff --git a/ui/app/components/app/shift-list-item.js b/ui/app/components/app/shift-list-item.js deleted file mode 100644 index f5fa00047bce..000000000000 --- a/ui/app/components/app/shift-list-item.js +++ /dev/null @@ -1,204 +0,0 @@ -const inherits = require('util').inherits -const Component = require('react').Component -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const connect = require('react-redux').connect -const explorerLink = require('etherscan-link').createExplorerLink -const actions = require('../../store/actions') -const { formatDate, addressSummary } = require('../../helpers/utils/util') - -const CopyButton = require('../ui/copyButton') -const EthBalance = require('../ui/eth-balance') -const Tooltip = require('../ui/tooltip') - - -ShiftListItem.contextTypes = { - t: PropTypes.func, -} - -module.exports = connect(mapStateToProps)(ShiftListItem) - - -function mapStateToProps (state) { - return { - selectedAddress: state.metamask.selectedAddress, - conversionRate: state.metamask.conversionRate, - currentCurrency: state.metamask.currentCurrency, - } -} - -inherits(ShiftListItem, Component) - -function ShiftListItem () { - Component.call(this) -} - -ShiftListItem.prototype.render = function () { - return h('div.transaction-list-item.tx-list-clickable', { - style: { - paddingTop: '20px', - paddingBottom: '20px', - justifyContent: 'space-around', - alignItems: 'center', - flexDirection: 'row', - }, - }, [ - h('div', { - style: { - width: '0px', - position: 'relative', - bottom: '19px', - }, - }, [ - h('img', { - src: 'https://shapeshift.io/logo.png', - style: { - height: '35px', - width: '132px', - position: 'absolute', - clip: 'rect(0px,30px,34px,0px)', - }, - }), - ]), - - this.renderInfo(), - this.renderUtilComponents(), - ]) -} - -ShiftListItem.prototype.renderUtilComponents = function () { - var props = this.props - const { conversionRate, currentCurrency } = props - - switch (props.response.status) { - case 'no_deposits': - return h('.flex-row', [ - h(CopyButton, { - value: this.props.depositAddress, - }), - h(Tooltip, { - title: this.context.t('qrCode'), - }, [ - h('i.fa.fa-qrcode.pointer.pop-hover', { - onClick: () => props.dispatch(actions.reshowQrCode(props.depositAddress, props.depositType)), - style: { - margin: '5px', - marginLeft: '23px', - marginRight: '12px', - fontSize: '20px', - color: '#F7861C', - }, - }), - ]), - ]) - case 'received': - return h('.flex-row') - - case 'complete': - return h('.flex-row', [ - h(CopyButton, { - value: this.props.response.transaction, - }), - h(EthBalance, { - value: `${props.response.outgoingCoin}`, - conversionRate, - currentCurrency, - width: '55px', - shorten: true, - needsParse: false, - incoming: true, - style: { - fontSize: '15px', - color: '#01888C', - }, - }), - ]) - - case 'failed': - return '' - default: - return '' - } -} - -ShiftListItem.prototype.renderInfo = function () { - var props = this.props - switch (props.response.status) { - case 'no_deposits': - return h('.flex-column', { - style: { - overflow: 'hidden', - }, - }, [ - h('div', { - style: { - fontSize: 'x-small', - color: '#ABA9AA', - width: '100%', - }, - }, this.context.t('toETHviaShapeShift', [props.depositType])), - h('div', this.context.t('noDeposits')), - h('div', { - style: { - fontSize: 'x-small', - color: '#ABA9AA', - width: '100%', - }, - }, formatDate(props.time)), - ]) - case 'received': - return h('.flex-column', { - style: { - width: '200px', - overflow: 'hidden', - }, - }, [ - h('div', { - style: { - fontSize: 'x-small', - color: '#ABA9AA', - width: '100%', - }, - }, this.context.t('toETHviaShapeShift', [props.depositType])), - h('div', this.context.t('conversionProgress')), - h('div', { - style: { - fontSize: 'x-small', - color: '#ABA9AA', - width: '100%', - }, - }, formatDate(props.time)), - ]) - case 'complete': - var url = explorerLink(props.response.transaction, parseInt('1')) - - return h('.flex-column.pointer', { - style: { - width: '200px', - overflow: 'hidden', - }, - onClick: () => global.platform.openWindow({ url }), - }, [ - h('div', { - style: { - fontSize: 'x-small', - color: '#ABA9AA', - width: '100%', - }, - }, this.context.t('fromShapeShift')), - h('div', formatDate(props.time)), - h('div', { - style: { - fontSize: 'x-small', - color: '#ABA9AA', - width: '100%', - }, - }, addressSummary(props.response.transaction)), - ]) - - case 'failed': - return h('span.error', '(' + this.context.t('failed') + ')') - default: - return '' - } -} diff --git a/ui/app/components/app/sidebars/index.scss b/ui/app/components/app/sidebars/index.scss index 08181426faa7..d2d224eb0a5b 100644 --- a/ui/app/components/app/sidebars/index.scss +++ b/ui/app/components/app/sidebars/index.scss @@ -52,7 +52,7 @@ visibility: visible; will-change: transform; overflow-y: auto; - box-shadow: rgba(0, 0, 0, .15) 2px 2px 4px; + box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 4px; width: 85%; height: 100%; @@ -77,5 +77,5 @@ bottom: 0; opacity: 1; visibility: visible; - background-color: rgba(0, 0, 0, .3); + background-color: rgba(0, 0, 0, 0.3); } diff --git a/ui/app/components/app/sidebars/sidebar-content.scss b/ui/app/components/app/sidebars/sidebar-content.scss index ca6b0a458a3f..e67bab43ab43 100644 --- a/ui/app/components/app/sidebars/sidebar-content.scss +++ b/ui/app/components/app/sidebars/sidebar-content.scss @@ -34,7 +34,6 @@ .page-container__bottom { display: flex; flex-direction: column; - flex-flow: space-between; height: 100%; } @@ -44,7 +43,7 @@ .basic-tab-content { height: auto; - margin-bottom: 0px; + margin-bottom: 0; border-bottom: 1px solid #d2d8dd; flex: 1 1 70%; @@ -93,6 +92,7 @@ &__info-row-wrapper { display: flex; + @media screen and (min-width: $break-small) { flex: 1 1 30%; } @@ -109,4 +109,4 @@ } } } -} \ No newline at end of file +} diff --git a/ui/app/components/app/sidebars/sidebar.component.js b/ui/app/components/app/sidebars/sidebar.component.js index b9e0f9e817a0..3f514001a679 100644 --- a/ui/app/components/app/sidebars/sidebar.component.js +++ b/ui/app/components/app/sidebars/sidebar.component.js @@ -1,9 +1,7 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import ReactCSSTransitionGroup from 'react-addons-css-transition-group' -import WalletView from '../wallet-view' -import { WALLET_VIEW_SIDEBAR } from './sidebar.constants' -import CustomizeGas from '../gas-customization/gas-modal-page-container/' +import ReactCSSTransitionGroup from 'react-transition-group/CSSTransitionGroup' +import CustomizeGas from '../gas-customization/gas-modal-page-container' export default class Sidebar extends Component { @@ -15,28 +13,28 @@ export default class Sidebar extends Component { type: PropTypes.string, sidebarProps: PropTypes.object, onOverlayClose: PropTypes.func, - }; + } renderOverlay () { const { onOverlayClose } = this.props - return
    { - onOverlayClose && onOverlayClose() - this.props.hideSidebar() - } - } /> + return ( +
    { + onOverlayClose && onOverlayClose() + this.props.hideSidebar() + }} + /> + ) } renderSidebarContent () { const { type, sidebarProps = {} } = this.props const { transaction = {} } = sidebarProps switch (type) { - case WALLET_VIEW_SIDEBAR: - return case 'customize-gas': - return
    + return
    default: return null } diff --git a/ui/app/components/app/sidebars/sidebar.constants.js b/ui/app/components/app/sidebars/sidebar.constants.js deleted file mode 100644 index 1613a8245f6d..000000000000 --- a/ui/app/components/app/sidebars/sidebar.constants.js +++ /dev/null @@ -1 +0,0 @@ -export const WALLET_VIEW_SIDEBAR = 'wallet-view' diff --git a/ui/app/components/app/sidebars/tests/sidebars-component.test.js b/ui/app/components/app/sidebars/tests/sidebars-component.test.js index cee22aca8433..ea9958775fdb 100644 --- a/ui/app/components/app/sidebars/tests/sidebars-component.test.js +++ b/ui/app/components/app/sidebars/tests/sidebars-component.test.js @@ -1,12 +1,11 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { shallow } from 'enzyme' import sinon from 'sinon' -import ReactCSSTransitionGroup from 'react-addons-css-transition-group' -import Sidebar from '../sidebar.component.js' +import ReactCSSTransitionGroup from 'react-transition-group/CSSTransitionGroup' +import Sidebar from '../sidebar.component' -import WalletView from '../../wallet-view' -import CustomizeGas from '../../gas-customization/gas-modal-page-container/' +import CustomizeGas from '../../gas-customization/gas-modal-page-container' const propsMethodSpies = { hideSidebar: sinon.spy(), @@ -15,83 +14,78 @@ const propsMethodSpies = { describe('Sidebar Component', function () { let wrapper - beforeEach(() => { - wrapper = shallow() + beforeEach(function () { + wrapper = shallow(( + + )) }) - afterEach(() => { + afterEach(function () { propsMethodSpies.hideSidebar.resetHistory() }) - describe('renderOverlay', () => { + describe('renderOverlay', function () { let renderOverlay - beforeEach(() => { + beforeEach(function () { renderOverlay = shallow(wrapper.instance().renderOverlay()) }) - it('should render a overlay element', () => { + it('should render a overlay element', function () { assert(renderOverlay.hasClass('sidebar-overlay')) }) - it('should pass the correct onClick function to the element', () => { + it('should pass the correct onClick function to the element', function () { assert.equal(propsMethodSpies.hideSidebar.callCount, 0) renderOverlay.props().onClick() assert.equal(propsMethodSpies.hideSidebar.callCount, 1) }) }) - describe('renderSidebarContent', () => { + describe('renderSidebarContent', function () { let renderSidebarContent - beforeEach(() => { - wrapper.setProps({ type: 'wallet-view' }) - renderSidebarContent = wrapper.instance().renderSidebarContent() - }) - - it('should render sidebar content with the correct props', () => { - wrapper.setProps({ type: 'wallet-view' }) + beforeEach(function () { renderSidebarContent = wrapper.instance().renderSidebarContent() - assert.equal(renderSidebarContent.props.responsiveDisplayClassname, 'sidebar-right') }) - it('should render sidebar content with the correct props', () => { - wrapper.setProps({ type: 'customize-gas' }) + it('should render sidebar content with the type customize-gas', function () { renderSidebarContent = wrapper.instance().renderSidebarContent() const renderedSidebarContent = shallow(renderSidebarContent) assert(renderedSidebarContent.hasClass('sidebar-left')) assert(renderedSidebarContent.childAt(0).is(CustomizeGas)) }) - it('should not render with an unrecognized type', () => { + it('should not render with an unrecognized type', function () { wrapper.setProps({ type: 'foobar' }) renderSidebarContent = wrapper.instance().renderSidebarContent() assert.equal(renderSidebarContent, undefined) }) }) - describe('render', () => { - it('should render a div with one child', () => { + describe('render', function () { + it('should render a div with one child', function () { assert(wrapper.is('div')) assert.equal(wrapper.children().length, 1) }) - it('should render the ReactCSSTransitionGroup without any children', () => { + it('should render the ReactCSSTransitionGroup without any children', function () { assert(wrapper.children().at(0).is(ReactCSSTransitionGroup)) assert.equal(wrapper.children().at(0).children().length, 0) }) - it('should render sidebar content and the overlay if sidebarOpen is true', () => { + it('should render sidebar content and the overlay if sidebarOpen is true', function () { wrapper.setProps({ sidebarOpen: true }) assert.equal(wrapper.children().length, 2) assert(wrapper.children().at(1).hasClass('sidebar-overlay')) assert.equal(wrapper.children().at(0).children().length, 1) - assert(wrapper.children().at(0).children().at(0).is(WalletView)) + assert(wrapper.children().at(0).children().at(0).hasClass('sidebar-left')) + assert(wrapper.children().at(0).children().at(0).children().at(0).is(CustomizeGas)) }) }) }) diff --git a/ui/app/components/app/signature-request-original/index.js b/ui/app/components/app/signature-request-original/index.js new file mode 100644 index 000000000000..00a90678574e --- /dev/null +++ b/ui/app/components/app/signature-request-original/index.js @@ -0,0 +1 @@ +export { default } from './signature-request-original.container' diff --git a/ui/app/components/app/signature-request-original/index.scss b/ui/app/components/app/signature-request-original/index.scss new file mode 100644 index 000000000000..6af476fd697d --- /dev/null +++ b/ui/app/components/app/signature-request-original/index.scss @@ -0,0 +1,248 @@ +.request-signature { + &__container { + width: 380px; + border-radius: 8px; + background-color: $white; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08); + display: flex; + flex-flow: column nowrap; + z-index: 25; + align-items: center; + position: relative; + height: 100%; + + @media screen and (max-width: $break-small) { + width: 100%; + top: 0; + box-shadow: none; + } + + @media screen and (min-width: $break-large) { + height: 620px; + } + } + + &__typed-container { + padding: 17px; + + h1 { + font-weight: 900; + margin-bottom: 5px; + } + + * { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + > div { + margin-bottom: 10px; + } + } + + &__header { + height: 64px; + width: 100%; + position: relative; + display: flex; + flex-flow: column; + justify-content: center; + align-items: center; + flex: 0 0 auto; + } + + &__header-background { + position: absolute; + background-color: $athens-grey; + z-index: 2; + width: 100%; + height: 100%; + } + + &__header__text { + color: #5b5d67; + font-size: 22px; + line-height: 29px; + z-index: 3; + } + + &__header__tip-container { + width: 100%; + display: flex; + justify-content: center; + } + + &__header__tip { + height: 25px; + width: 25px; + background: $athens-grey; + transform: rotate(45deg); + position: absolute; + bottom: -8px; + z-index: 1; + } + + &__account-info { + display: flex; + justify-content: space-between; + margin-top: 18px; + margin-bottom: 20px; + } + + &__account { + color: $dusty-gray; + margin-left: 17px; + } + + &__account-text { + font-size: 14px; + } + + &__account-item { + height: 22px; + background-color: $white; + line-height: 16px; + font-size: 12px; + width: 124px; + + .account-list-item { + margin-top: 6px; + } + + .account-list-item__account-name { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + width: 80px; + } + + .account-list-item__top-row { + margin: 0; + } + } + + &__balance { + color: $dusty-gray; + margin-right: 17px; + width: 124px; + } + + &__balance-text { + text-align: right; + font-size: 14px; + } + + &__balance-value { + text-align: right; + margin-top: 2.5px; + } + + &__request-icon { + margin-top: 25px; + } + + &__body { + width: 100%; + height: 100%; + display: flex; + flex-flow: column; + flex: 1 1 auto; + height: 0; + } + + &__request-info { + display: flex; + justify-content: center; + } + + &__headline { + height: 48px; + width: 240px; + color: $tundora; + font-size: 18px; + line-height: 24px; + text-align: center; + margin-top: 20px; + } + + &__notice, + &__warning { + font-size: 14px; + line-height: 19px; + text-align: center; + margin-top: 41px; + margin-bottom: 11px; + width: 100%; + } + + &__notice { + color: $dusty-gray; + } + + &__warning { + color: $crimson; + } + + &__rows { + height: 100%; + overflow-y: scroll; + overflow-x: hidden; + border-top: 1px solid $geyser; + display: flex; + flex-flow: column; + } + + &__row { + display: flex; + flex-flow: column; + flex: 1 0 auto; + } + + &__row-title { + width: 80px; + color: $dusty-gray; + font-size: 16px; + line-height: 22px; + margin-top: 12px; + margin-left: 18px; + width: 100%; + } + + &__row-value { + color: $scorpion; + font-size: 14px; + line-height: 19px; + width: 100%; + overflow-wrap: break-word; + border-bottom: 1px solid #d2d8dd; + padding: 6px 18px 15px; + white-space: pre-line; + } + + &__help-link { + cursor: pointer; + text-decoration: underline; + color: $primary-blue; + } + + &__footer { + width: 100%; + display: flex; + align-items: center; + justify-content: center; + font-size: 22px; + position: relative; + flex: 0 0 auto; + border-top: 1px solid $geyser; + padding: 1.6rem; + + button { + width: 165px; + } + + &__cancel-button { + margin-right: 1.2rem; + } + } +} diff --git a/ui/app/components/app/signature-request-original/signature-request-original.component.js b/ui/app/components/app/signature-request-original/signature-request-original.component.js new file mode 100644 index 000000000000..31c214e38e6d --- /dev/null +++ b/ui/app/components/app/signature-request-original/signature-request-original.component.js @@ -0,0 +1,329 @@ +import React, { Component } from 'react' +import PropTypes from 'prop-types' +import ethUtil from 'ethereumjs-util' +import classnames from 'classnames' +import { ObjectInspector } from 'react-inspector' + +import { ENVIRONMENT_TYPE_NOTIFICATION, MESSAGE_TYPE } from '../../../../../app/scripts/lib/enums' +import { getEnvironmentType } from '../../../../../app/scripts/lib/util' +import Identicon from '../../ui/identicon' +import AccountListItem from '../account-list-item' +import { conversionUtil } from '../../../helpers/utils/conversion-util' +import Button from '../../ui/button' + +export default class SignatureRequestOriginal extends Component { + static contextTypes = { + t: PropTypes.func.isRequired, + metricsEvent: PropTypes.func.isRequired, + } + + static propTypes = { + fromAccount: PropTypes.shape({ + address: PropTypes.string.isRequired, + balance: PropTypes.string, + name: PropTypes.string, + }).isRequired, + cancel: PropTypes.func.isRequired, + clearConfirmTransaction: PropTypes.func.isRequired, + conversionRate: PropTypes.number, + history: PropTypes.object.isRequired, + mostRecentOverviewPage: PropTypes.string.isRequired, + requesterAddress: PropTypes.string, + sign: PropTypes.func.isRequired, + txData: PropTypes.object.isRequired, + } + + state = { + fromAccount: this.props.fromAccount, + } + + componentDidMount = () => { + if (getEnvironmentType() === ENVIRONMENT_TYPE_NOTIFICATION) { + window.addEventListener('beforeunload', this._beforeUnload) + } + } + + componentWillUnmount = () => { + this._removeBeforeUnload() + } + + _beforeUnload = (event) => { + const { clearConfirmTransaction, cancel } = this.props + const { metricsEvent } = this.context + metricsEvent({ + eventOpts: { + category: 'Transactions', + action: 'Sign Request', + name: 'Cancel Sig Request Via Notification Close', + }, + }) + clearConfirmTransaction() + cancel(event) + } + + _removeBeforeUnload = () => { + if (getEnvironmentType() === ENVIRONMENT_TYPE_NOTIFICATION) { + window.removeEventListener('beforeunload', this._beforeUnload) + } + } + + renderHeader = () => { + return ( +
    +
    + +
    + { this.context.t('sigRequest') } +
    + +
    +
    +
    +
    + ) + } + + renderAccount = () => { + const { fromAccount } = this.state + + return ( +
    +
    + { `${this.context.t('account')}:` } +
    + +
    + +
    +
    + ) + } + + renderBalance = () => { + const { conversionRate } = this.props + const { fromAccount: { balance } } = this.state + + const balanceInEther = conversionUtil(balance, { + fromNumericBase: 'hex', + toNumericBase: 'dec', + fromDenomination: 'WEI', + numberOfDecimals: 6, + conversionRate, + }) + + return ( +
    +
    + { `${this.context.t('balance')}:` } +
    +
    + { `${balanceInEther} ETH` } +
    +
    + ) + } + + renderRequestIcon = () => { + const { requesterAddress } = this.props + + return ( +
    + +
    + ) + } + + renderAccountInfo = () => { + return ( +
    + { this.renderAccount() } + { this.renderRequestIcon() } + { this.renderBalance() } +
    + ) + } + + renderRequestInfo = () => { + return ( +
    +
    + { this.context.t('yourSigRequested') } +
    +
    + ) + } + + msgHexToText = (hex) => { + try { + const stripped = ethUtil.stripHexPrefix(hex) + const buff = Buffer.from(stripped, 'hex') + return buff.length === 32 ? hex : buff.toString('utf8') + } catch (e) { + return hex + } + } + + renderTypedData = (data) => { + const { domain, message } = JSON.parse(data) + return ( +
    + { + domain + ? ( +
    +

    + Domain +

    + +
    + ) + : '' + } + { + message + ? ( +
    +

    + Message +

    + +
    + ) + : '' + } +
    + ) + } + + renderBody = () => { + let rows + let notice = `${this.context.t('youSign')}:` + + const { txData } = this.props + const { type, msgParams: { data } } = txData + + if (type === MESSAGE_TYPE.PERSONAL_SIGN) { + rows = [{ name: this.context.t('message'), value: this.msgHexToText(data) }] + } else if (type === MESSAGE_TYPE.ETH_SIGN_TYPED_DATA) { + rows = data + } else if (type === MESSAGE_TYPE.ETH_SIGN) { + rows = [{ name: this.context.t('message'), value: data }] + notice = this.context.t('signNotice') + } + + return ( +
    + { this.renderAccountInfo() } + { this.renderRequestInfo() } +
    + { notice } + { + type === MESSAGE_TYPE.ETH_SIGN + ? ( + { + global.platform.openTab({ + url: 'https://metamask.zendesk.com/hc/en-us/articles/360015488751', + }) + }} + > + { this.context.t('learnMore') } + + ) + : null + } +
    +
    + { + rows.map(({ name, value }, index) => { + if (typeof value === 'boolean') { + // eslint-disable-next-line no-param-reassign + value = value.toString() + } + return ( +
    +
    + { `${name}:` } +
    +
    + { value } +
    +
    + ) + }) + } +
    +
    + ) + } + + renderFooter = () => { + const { cancel, clearConfirmTransaction, history, mostRecentOverviewPage, sign } = this.props + + return ( +
    + + +
    + ) + } + + render = () => { + return ( +
    + { this.renderHeader() } + { this.renderBody() } + { this.renderFooter() } +
    + ) + } +} diff --git a/ui/app/components/app/signature-request-original/signature-request-original.container.js b/ui/app/components/app/signature-request-original/signature-request-original.container.js new file mode 100644 index 000000000000..8d0a397ef92f --- /dev/null +++ b/ui/app/components/app/signature-request-original/signature-request-original.container.js @@ -0,0 +1,79 @@ +import { connect } from 'react-redux' +import { compose } from 'redux' +import { withRouter } from 'react-router-dom' + +import { MESSAGE_TYPE } from '../../../../../app/scripts/lib/enums' +import { goHome } from '../../../store/actions' +import { + accountsWithSendEtherInfoSelector, + conversionRateSelector, +} from '../../../selectors' +import { getAccountByAddress } from '../../../helpers/utils/util' +import { clearConfirmTransaction } from '../../../ducks/confirm-transaction/confirm-transaction.duck' +import { getMostRecentOverviewPage } from '../../../ducks/history/history' +import SignatureRequestOriginal from './signature-request-original.component' + +function mapStateToProps (state) { + return { + requester: null, + requesterAddress: null, + conversionRate: conversionRateSelector(state), + mostRecentOverviewPage: getMostRecentOverviewPage(state), + // not passed to component + allAccounts: accountsWithSendEtherInfoSelector(state), + } +} + +function mapDispatchToProps (dispatch) { + return { + goHome: () => dispatch(goHome()), + clearConfirmTransaction: () => dispatch(clearConfirmTransaction()), + } +} + +function mergeProps (stateProps, dispatchProps, ownProps) { + const { + signPersonalMessage, + signTypedMessage, + cancelPersonalMessage, + cancelTypedMessage, + signMessage, + cancelMessage, + txData, + } = ownProps + + const { allAccounts } = stateProps + delete stateProps.allAccounts + + const { type, msgParams: { from } } = txData + + const fromAccount = getAccountByAddress(allAccounts, from) + + let cancel + let sign + if (type === MESSAGE_TYPE.PERSONAL_SIGN) { + cancel = cancelPersonalMessage + sign = signPersonalMessage + } else if (type === MESSAGE_TYPE.ETH_SIGN_TYPED_DATA) { + cancel = cancelTypedMessage + sign = signTypedMessage + } else if (type === MESSAGE_TYPE.ETH_SIGN) { + cancel = cancelMessage + sign = signMessage + } + + return { + ...ownProps, + ...stateProps, + ...dispatchProps, + fromAccount, + txData, + cancel, + sign, + } +} + +export default compose( + withRouter, + connect(mapStateToProps, mapDispatchToProps, mergeProps), +)(SignatureRequestOriginal) diff --git a/ui/app/components/app/signature-request.js b/ui/app/components/app/signature-request.js deleted file mode 100644 index fa237f1d1e04..000000000000 --- a/ui/app/components/app/signature-request.js +++ /dev/null @@ -1,349 +0,0 @@ -const Component = require('react').Component -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const inherits = require('util').inherits -import { ENVIRONMENT_TYPE_NOTIFICATION } from '../../../../app/scripts/lib/enums' -import { getEnvironmentType } from '../../../../app/scripts/lib/util' -import Identicon from '../ui/identicon' -const connect = require('react-redux').connect -const ethUtil = require('ethereumjs-util') -const classnames = require('classnames') -const { compose } = require('recompose') -const { withRouter } = require('react-router-dom') -const { ObjectInspector } = require('react-inspector') - -import AccountDropdownMini from '../ui/account-dropdown-mini' - -const actions = require('../../store/actions') -const { conversionUtil } = require('../../helpers/utils/conversion-util') - -const { - getSelectedAccount, - getCurrentAccountWithSendEtherInfo, - getSelectedAddress, - accountsWithSendEtherInfoSelector, - conversionRateSelector, -} = require('../../selectors/selectors.js') - -import { clearConfirmTransaction } from '../../ducks/confirm-transaction/confirm-transaction.duck' -import Button from '../ui/button' - -const { DEFAULT_ROUTE } = require('../../helpers/constants/routes') - -function mapStateToProps (state) { - return { - balance: getSelectedAccount(state).balance, - selectedAccount: getCurrentAccountWithSendEtherInfo(state), - selectedAddress: getSelectedAddress(state), - requester: null, - requesterAddress: null, - accounts: accountsWithSendEtherInfoSelector(state), - conversionRate: conversionRateSelector(state), - } -} - -function mapDispatchToProps (dispatch) { - return { - goHome: () => dispatch(actions.goHome()), - clearConfirmTransaction: () => dispatch(clearConfirmTransaction()), - } -} - -function mergeProps (stateProps, dispatchProps, ownProps) { - const { - signPersonalMessage, - signTypedMessage, - cancelPersonalMessage, - cancelTypedMessage, - signMessage, - cancelMessage, - txData, - } = ownProps - - const { type } = txData - - let cancel - let sign - if (type === 'personal_sign') { - cancel = cancelPersonalMessage - sign = signPersonalMessage - } else if (type === 'eth_signTypedData') { - cancel = cancelTypedMessage - sign = signTypedMessage - } else if (type === 'eth_sign') { - cancel = cancelMessage - sign = signMessage - } - - return { - ...stateProps, - ...dispatchProps, - ...ownProps, - txData, - cancel, - sign, - } -} - -SignatureRequest.contextTypes = { - t: PropTypes.func, - metricsEvent: PropTypes.func, -} - -module.exports = compose( - withRouter, - connect(mapStateToProps, mapDispatchToProps, mergeProps) -)(SignatureRequest) - - -inherits(SignatureRequest, Component) -function SignatureRequest (props) { - Component.call(this) - - this.state = { - selectedAccount: props.selectedAccount, - } -} - -SignatureRequest.prototype.componentDidMount = function () { - const { clearConfirmTransaction, cancel } = this.props - const { metricsEvent } = this.context - if (getEnvironmentType(window.location.href) === ENVIRONMENT_TYPE_NOTIFICATION) { - window.onbeforeunload = event => { - metricsEvent({ - eventOpts: { - category: 'Transactions', - action: 'Sign Request', - name: 'Cancel Sig Request Via Notification Close', - }, - }) - clearConfirmTransaction() - cancel(event) - } - } -} - -SignatureRequest.prototype.renderHeader = function () { - return h('div.request-signature__header', [ - - h('div.request-signature__header-background'), - - h('div.request-signature__header__text', this.context.t('sigRequest')), - - h('div.request-signature__header__tip-container', [ - h('div.request-signature__header__tip'), - ]), - - ]) -} - -SignatureRequest.prototype.renderAccountDropdown = function () { - const { selectedAccount } = this.state - - const { - accounts, - } = this.props - - return h('div.request-signature__account', [ - - h('div.request-signature__account-text', [this.context.t('account') + ':']), - - h(AccountDropdownMini, { - selectedAccount, - accounts, - disabled: true, - }), - - ]) -} - -SignatureRequest.prototype.renderBalance = function () { - const { balance, conversionRate } = this.props - - const balanceInEther = conversionUtil(balance, { - fromNumericBase: 'hex', - toNumericBase: 'dec', - fromDenomination: 'WEI', - numberOfDecimals: 6, - conversionRate, - }) - - return h('div.request-signature__balance', [ - - h('div.request-signature__balance-text', `${this.context.t('balance')}:`), - - h('div.request-signature__balance-value', `${balanceInEther} ETH`), - - ]) -} - -SignatureRequest.prototype.renderAccountInfo = function () { - return h('div.request-signature__account-info', [ - - this.renderAccountDropdown(), - - this.renderRequestIcon(), - - this.renderBalance(), - - ]) -} - -SignatureRequest.prototype.renderRequestIcon = function () { - const { requesterAddress } = this.props - - return h('div.request-signature__request-icon', [ - h(Identicon, { - diameter: 40, - address: requesterAddress, - }), - ]) -} - -SignatureRequest.prototype.renderRequestInfo = function () { - return h('div.request-signature__request-info', [ - - h('div.request-signature__headline', [ - this.context.t('yourSigRequested'), - ]), - - ]) -} - -SignatureRequest.prototype.msgHexToText = function (hex) { - try { - const stripped = ethUtil.stripHexPrefix(hex) - const buff = Buffer.from(stripped, 'hex') - return buff.length === 32 ? hex : buff.toString('utf8') - } catch (e) { - return hex - } -} - -// eslint-disable-next-line react/display-name -SignatureRequest.prototype.renderTypedDataV3 = function (data) { - const { domain, message } = JSON.parse(data) - return [ - h('div.request-signature__typed-container', [ - domain ? h('div', [ - h('h1', 'Domain'), - h(ObjectInspector, { data: domain, expandLevel: 1, name: 'domain' }), - ]) : '', - message ? h('div', [ - h('h1', 'Message'), - h(ObjectInspector, { data: message, expandLevel: 1, name: 'message' }), - ]) : '', - ]), - ] -} - -SignatureRequest.prototype.renderBody = function () { - let rows - let notice = this.context.t('youSign') + ':' - - const { txData } = this.props - const { type, msgParams: { data, version } } = txData - - if (type === 'personal_sign') { - rows = [{ name: this.context.t('message'), value: this.msgHexToText(data) }] - } else if (type === 'eth_signTypedData') { - rows = data - } else if (type === 'eth_sign') { - rows = [{ name: this.context.t('message'), value: data }] - notice = [this.context.t('signNotice'), - h('span.request-signature__help-link', { - onClick: () => { - global.platform.openWindow({ - url: 'https://metamask.zendesk.com/hc/en-us/articles/360015488751', - }) - }, - }, this.context.t('learnMore'))] - } - - return h('div.request-signature__body', {}, [ - - this.renderAccountInfo(), - - this.renderRequestInfo(), - - h('div.request-signature__notice', { - className: classnames({ - 'request-signature__notice': type === 'personal_sign' || type === 'eth_signTypedData', - 'request-signature__warning': type === 'eth_sign', - }), - }, [notice]), - - h('div.request-signature__rows', type === 'eth_signTypedData' && version === 'V3' ? - this.renderTypedDataV3(data) : - rows.map(({ name, value }) => { - if (typeof value === 'boolean') { - value = value.toString() - } - return h('div.request-signature__row', [ - h('div.request-signature__row-title', [`${name}:`]), - h('div.request-signature__row-value', value), - ]) - }), - ), - ]) -} - -SignatureRequest.prototype.renderFooter = function () { - const { cancel, sign } = this.props - - return h('div.request-signature__footer', [ - h(Button, { - type: 'default', - large: true, - className: 'request-signature__footer__cancel-button', - onClick: event => { - cancel(event).then(() => { - this.context.metricsEvent({ - eventOpts: { - category: 'Transactions', - action: 'Sign Request', - name: 'Cancel', - }, - }) - this.props.clearConfirmTransaction() - this.props.history.push(DEFAULT_ROUTE) - }) - }, - }, this.context.t('cancel')), - h(Button, { - type: 'secondary', - large: true, - className: 'request-signature__footer__sign-button', - onClick: event => { - sign(event).then(() => { - this.context.metricsEvent({ - eventOpts: { - category: 'Transactions', - action: 'Sign Request', - name: 'Confirm', - }, - }) - this.props.clearConfirmTransaction() - this.props.history.push(DEFAULT_ROUTE) - }) - }, - }, this.context.t('sign')), - ]) -} - -SignatureRequest.prototype.render = function () { - return ( - - h('div.request-signature__container', [ - - this.renderHeader(), - - this.renderBody(), - - this.renderFooter(), - - ]) - - ) - -} diff --git a/ui/app/components/app/signature-request/index.js b/ui/app/components/app/signature-request/index.js new file mode 100644 index 000000000000..b1c8a1960ded --- /dev/null +++ b/ui/app/components/app/signature-request/index.js @@ -0,0 +1 @@ +export { default } from './signature-request.container' diff --git a/ui/app/components/app/signature-request/index.scss b/ui/app/components/app/signature-request/index.scss new file mode 100644 index 000000000000..4de4f249b9ac --- /dev/null +++ b/ui/app/components/app/signature-request/index.scss @@ -0,0 +1,94 @@ +@import 'signature-request-footer/index'; +@import 'signature-request-header/index'; +@import 'signature-request-message/index'; + +.signature-request { + display: flex; + flex: 1 1 auto; + flex-direction: column; + min-width: 0; + + @media screen and (min-width: 576px) { + flex: initial; + } +} + +.signature-request-header { + flex: 1; + + .network-display__container { + padding: 0; + justify-content: flex-end; + } + + .network-display__name { + font-size: 12px; + white-space: nowrap; + font-weight: 500; + } +} + +.signature-request-content { + flex: 1 40%; + margin-top: 1rem; + display: flex; + align-items: center; + flex-direction: column; + margin-bottom: 25px; + min-height: min-content; + + &__title { + font-style: normal; + font-weight: 500; + font-size: 18px; + } + + &__identicon-container { + padding: 1rem; + flex: 1; + position: relative; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + } + + &__identicon-border { + height: 75px; + width: 75px; + border-radius: 50%; + border: 1px solid white; + position: absolute; + box-shadow: 0 2px 2px 0.5px rgba(0, 0, 0, 0.19); + } + + &__identicon-initial { + position: absolute; + font-style: normal; + font-weight: 500; + font-size: 60px; + color: white; + z-index: 1; + text-shadow: 0 4px 6px rgba(0, 0, 0, 0.422); + } + + &__info { + font-size: 12px; + } + + &__info--bolded { + font-size: 16px; + font-weight: 500; + } + + p { + color: #999; + font-size: 0.8rem; + } + + .identicon {} +} + +.signature-request-footer { + flex: 1 1 auto; +} diff --git a/ui/app/components/app/signature-request/signature-request-footer/index.js b/ui/app/components/app/signature-request/signature-request-footer/index.js new file mode 100644 index 000000000000..11d0b3944e60 --- /dev/null +++ b/ui/app/components/app/signature-request/signature-request-footer/index.js @@ -0,0 +1 @@ +export { default } from './signature-request-footer.component' diff --git a/ui/app/components/app/signature-request/signature-request-footer/index.scss b/ui/app/components/app/signature-request/signature-request-footer/index.scss new file mode 100644 index 000000000000..b0c07f0b1209 --- /dev/null +++ b/ui/app/components/app/signature-request/signature-request-footer/index.scss @@ -0,0 +1,19 @@ +.signature-request-footer { + display: flex; + border-top: 1px solid #d2d8dd; + + button { + text-transform: uppercase; + flex: 1; + margin: 1rem 0.5rem; + border-radius: 3px; + } + + button:first-child { + margin-left: 1rem; + } + + button:last-child { + margin-right: 1rem; + } +} diff --git a/ui/app/components/app/signature-request/signature-request-footer/signature-request-footer.component.js b/ui/app/components/app/signature-request/signature-request-footer/signature-request-footer.component.js new file mode 100644 index 000000000000..591b9a03a15a --- /dev/null +++ b/ui/app/components/app/signature-request/signature-request-footer/signature-request-footer.component.js @@ -0,0 +1,24 @@ +import React, { PureComponent } from 'react' +import PropTypes from 'prop-types' +import Button from '../../../ui/button' + +export default class SignatureRequestFooter extends PureComponent { + static propTypes = { + cancelAction: PropTypes.func.isRequired, + signAction: PropTypes.func.isRequired, + } + + static contextTypes = { + t: PropTypes.func, + } + + render () { + const { cancelAction, signAction } = this.props + return ( +
    + + +
    + ) + } +} diff --git a/ui/app/components/app/signature-request/signature-request-header/index.js b/ui/app/components/app/signature-request/signature-request-header/index.js new file mode 100644 index 000000000000..fa596383ad2d --- /dev/null +++ b/ui/app/components/app/signature-request/signature-request-header/index.js @@ -0,0 +1 @@ +export { default } from './signature-request-header.component' diff --git a/ui/app/components/app/signature-request/signature-request-header/index.scss b/ui/app/components/app/signature-request/signature-request-header/index.scss new file mode 100644 index 000000000000..cd94a0e312cb --- /dev/null +++ b/ui/app/components/app/signature-request/signature-request-header/index.scss @@ -0,0 +1,33 @@ +.signature-request-header { + display: flex; + padding: 1rem; + border-bottom: 1px solid $geyser; + justify-content: space-between; + font-size: 0.75rem; + + &--account, + &--network { + flex: 1; + } + + &--account { + display: flex; + align-items: center; + + .account-list-item { + &__top-row { + display: flex; + align-items: center; + } + + &__account-name { + font-size: 12px; + font-weight: 500; + } + + &__top-row { + margin: 0; + } + } + } +} diff --git a/ui/app/components/app/signature-request/signature-request-header/signature-request-header.component.js b/ui/app/components/app/signature-request/signature-request-header/signature-request-header.component.js new file mode 100644 index 000000000000..2ec74748c7c1 --- /dev/null +++ b/ui/app/components/app/signature-request/signature-request-header/signature-request-header.component.js @@ -0,0 +1,29 @@ +import React, { PureComponent } from 'react' +import PropTypes from 'prop-types' +import AccountListItem from '../../account-list-item' +import NetworkDisplay from '../../network-display' + +export default class SignatureRequestHeader extends PureComponent { + static propTypes = { + fromAccount: PropTypes.object, + } + + render () { + const { fromAccount } = this.props + + return ( +
    +
    + {fromAccount && ( + + )} +
    +
    + +
    +
    + ) + } +} diff --git a/ui/app/components/app/signature-request/signature-request-message/index.js b/ui/app/components/app/signature-request/signature-request-message/index.js new file mode 100644 index 000000000000..e62265a5f8cc --- /dev/null +++ b/ui/app/components/app/signature-request/signature-request-message/index.js @@ -0,0 +1 @@ +export { default } from './signature-request-message.component' diff --git a/ui/app/components/app/signature-request/signature-request-message/index.scss b/ui/app/components/app/signature-request/signature-request-message/index.scss new file mode 100644 index 000000000000..37c0fba7250c --- /dev/null +++ b/ui/app/components/app/signature-request/signature-request-message/index.scss @@ -0,0 +1,66 @@ +.signature-request-message { + flex: 1 60%; + display: flex; + flex-direction: column; + + &__title { + font-weight: 500; + font-size: 14px; + color: #636778; + margin-left: 12px; + } + + h2 { + flex: 1 1 0; + text-align: left; + font-size: 0.8rem; + border-bottom: 1px solid #d2d8dd; + padding: 0.5rem; + margin: 0; + color: #ccc; + } + + &--root { + flex: 1 100%; + background-color: #f8f9fb; + padding-bottom: 0.5rem; + overflow: auto; + padding-left: 12px; + padding-right: 12px; + width: 360px; + + @media screen and (min-width: 576px) { + width: auto; + } + } + + &__type-title { + font-style: normal; + font-weight: normal; + font-size: 14px; + margin-left: 12px; + margin-top: 6px; + margin-bottom: 10px; + } + + &--node, + &--node-leaf { + padding-left: 0.8rem; + + &-label { + color: #5b5d67; + } + + &-value { + color: black; + margin-left: 0.5rem; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + } + + &--node-leaf { + display: flex; + } +} diff --git a/ui/app/components/app/signature-request/signature-request-message/signature-request-message.component.js b/ui/app/components/app/signature-request/signature-request-message/signature-request-message.component.js new file mode 100644 index 000000000000..5c4b455d32e6 --- /dev/null +++ b/ui/app/components/app/signature-request/signature-request-message/signature-request-message.component.js @@ -0,0 +1,49 @@ +import React, { PureComponent } from 'react' +import PropTypes from 'prop-types' +import classnames from 'classnames' + +export default class SignatureRequestMessage extends PureComponent { + static propTypes = { + data: PropTypes.object.isRequired, + } + + static contextTypes = { + t: PropTypes.func, + } + + renderNode (data) { + return ( +
    + {Object.entries(data).map(([label, value], i) => ( +
    + {label}: + { + typeof value === 'object' && value !== null ? + this.renderNode(value) + : {value} + } +
    + ))} +
    + ) + } + + render () { + const { data } = this.props + + return ( +
    +
    {this.context.t('signatureRequest1')}
    +
    +
    {this.context.t('signatureRequest1')}
    + {this.renderNode(data)} +
    +
    + ) + } +} diff --git a/ui/app/components/app/signature-request/signature-request.component.js b/ui/app/components/app/signature-request/signature-request.component.js new file mode 100644 index 000000000000..d3a42107cdf4 --- /dev/null +++ b/ui/app/components/app/signature-request/signature-request.component.js @@ -0,0 +1,83 @@ +import React, { PureComponent } from 'react' +import PropTypes from 'prop-types' +import { getEnvironmentType } from '../../../../../app/scripts/lib/util' +import Identicon from '../../ui/identicon' +import Header from './signature-request-header' +import Footer from './signature-request-footer' +import Message from './signature-request-message' +import { ENVIRONMENT_TYPE_NOTIFICATION } from './signature-request.constants' + +export default class SignatureRequest extends PureComponent { + static propTypes = { + txData: PropTypes.object.isRequired, + fromAccount: PropTypes.shape({ + address: PropTypes.string.isRequired, + balance: PropTypes.string, + name: PropTypes.string, + }).isRequired, + + clearConfirmTransaction: PropTypes.func.isRequired, + cancel: PropTypes.func.isRequired, + sign: PropTypes.func.isRequired, + } + + static contextTypes = { + t: PropTypes.func, + metricsEvent: PropTypes.func, + } + + componentDidMount () { + const { clearConfirmTransaction, cancel } = this.props + const { metricsEvent } = this.context + if (getEnvironmentType() === ENVIRONMENT_TYPE_NOTIFICATION) { + window.addEventListener('beforeunload', (event) => { + metricsEvent({ + eventOpts: { + category: 'Transactions', + action: 'Sign Request', + name: 'Cancel Sig Request Via Notification Close', + }, + }) + clearConfirmTransaction() + cancel(event) + }) + } + } + + formatWallet (wallet) { + return `${wallet.slice(0, 8)}...${wallet.slice(wallet.length - 8, wallet.length)}` + } + + render () { + const { + fromAccount, + txData: { msgParams: { data, origin } }, + cancel, + sign, + } = this.props + const { address: fromAddress } = fromAccount + const { message, domain = {} } = JSON.parse(data) + + return ( +
    +
    +
    +
    {this.context.t('sigRequest')}
    +
    +
    { domain.name && domain.name[0] }
    +
    + +
    +
    {domain.name}
    +
    {origin}
    +
    {this.formatWallet(fromAddress)}
    +
    + +
    +
    + ) + } +} diff --git a/ui/app/components/app/signature-request/signature-request.constants.js b/ui/app/components/app/signature-request/signature-request.constants.js new file mode 100644 index 000000000000..9cf241928b56 --- /dev/null +++ b/ui/app/components/app/signature-request/signature-request.constants.js @@ -0,0 +1,3 @@ +import { ENVIRONMENT_TYPE_NOTIFICATION } from '../../../../../app/scripts/lib/enums' + +export { ENVIRONMENT_TYPE_NOTIFICATION } diff --git a/ui/app/components/app/signature-request/signature-request.container.js b/ui/app/components/app/signature-request/signature-request.container.js new file mode 100644 index 000000000000..93974190486a --- /dev/null +++ b/ui/app/components/app/signature-request/signature-request.container.js @@ -0,0 +1,63 @@ +import { connect } from 'react-redux' +import { clearConfirmTransaction } from '../../../ducks/confirm-transaction/confirm-transaction.duck' +import { + accountsWithSendEtherInfoSelector, +} from '../../../selectors' +import { getAccountByAddress } from '../../../helpers/utils/util' +import { MESSAGE_TYPE } from '../../../../../app/scripts/lib/enums' +import SignatureRequest from './signature-request.component' + +function mapStateToProps (state) { + return { + // not forwarded to component + allAccounts: accountsWithSendEtherInfoSelector(state), + } +} + +function mapDispatchToProps (dispatch) { + return { + clearConfirmTransaction: () => dispatch(clearConfirmTransaction()), + } +} + +function mergeProps (stateProps, dispatchProps, ownProps) { + const { allAccounts } = stateProps + const { + signPersonalMessage, + signTypedMessage, + cancelPersonalMessage, + cancelTypedMessage, + signMessage, + cancelMessage, + txData, + } = ownProps + + const { type, msgParams: { from } } = txData + + const fromAccount = getAccountByAddress(allAccounts, from) + + let cancel + let sign + + if (type === MESSAGE_TYPE.PERSONAL_SIGN) { + cancel = cancelPersonalMessage + sign = signPersonalMessage + } else if (type === MESSAGE_TYPE.ETH_SIGN_TYPED_DATA) { + cancel = cancelTypedMessage + sign = signTypedMessage + } else if (type === MESSAGE_TYPE.ETH_SIGN) { + cancel = cancelMessage + sign = signMessage + } + + return { + ...ownProps, + ...dispatchProps, + fromAccount, + txData, + cancel, + sign, + } +} + +export default connect(mapStateToProps, mapDispatchToProps, mergeProps)(SignatureRequest) diff --git a/ui/app/components/app/signature-request/tests/signature-request.test.js b/ui/app/components/app/signature-request/tests/signature-request.test.js new file mode 100644 index 000000000000..5d2874833333 --- /dev/null +++ b/ui/app/components/app/signature-request/tests/signature-request.test.js @@ -0,0 +1,30 @@ +import assert from 'assert' +import React from 'react' +import shallow from '../../../../../lib/shallow-with-context' +import SignatureRequest from '../signature-request.component' + +describe('Signature Request Component', function () { + describe('render', function () { + const fromAddress = '0x123456789abcdef' + it('should render a div with one child', function () { + const wrapper = shallow(( + undefined} + cancel={() => undefined} + sign={() => undefined} + txData={{ + msgParams: { + data: '{"message": {"from": {"name": "hello"}}}', + from: fromAddress, + }, + }} + fromAccount={{ address: fromAddress }} + /> + )) + + assert(wrapper.is('div')) + assert.equal(wrapper.length, 1) + assert(wrapper.hasClass('signature-request')) + }) + }) +}) diff --git a/ui/app/components/app/tab-bar.js b/ui/app/components/app/tab-bar.js deleted file mode 100644 index 43923989acf8..000000000000 --- a/ui/app/components/app/tab-bar.js +++ /dev/null @@ -1,37 +0,0 @@ -import React, { Component } from 'react' -const PropTypes = require('prop-types') -const classnames = require('classnames') - -class TabBar extends Component { - render () { - const { tabs = [], onSelect, isActive } = this.props - - return ( -
    - {tabs.map(({ key, content, description }) => ( -
    onSelect(key)} - > -
    -
    {content}
    -
    {description}
    -
    -
    -
    - ))} -
    - ) - } -} - -TabBar.propTypes = { - isActive: PropTypes.func.isRequired, - tabs: PropTypes.array, - onSelect: PropTypes.func, -} - -module.exports = TabBar diff --git a/ui/app/components/app/tab-bar/index.js b/ui/app/components/app/tab-bar/index.js new file mode 100644 index 000000000000..74f9a752921d --- /dev/null +++ b/ui/app/components/app/tab-bar/index.js @@ -0,0 +1 @@ +export { default } from './tab-bar' diff --git a/ui/app/components/app/tab-bar/index.scss b/ui/app/components/app/tab-bar/index.scss new file mode 100644 index 000000000000..0b9d0605d250 --- /dev/null +++ b/ui/app/components/app/tab-bar/index.scss @@ -0,0 +1,80 @@ +.tab-bar { + display: flex; + flex-direction: column; + justify-content: flex-start; + + + &__tab { + display: flex; + flex-flow: row nowrap; + align-items: flex-start; + min-width: 0; + flex: 0 0 auto; + box-sizing: border-box; + font-size: 16px; + padding: 16px 24px; + opacity: 0.5; + transition: opacity 200ms ease-in-out; + + @media screen and (min-width: 576px) { + &:hover { + opacity: 0.4; + } + + &:active { + opacity: 0.6; + } + } + + @media screen and (max-width: 575px) { + font-size: 18px; + padding: 24px; + border-bottom: 1px solid $alto; + opacity: 1; + } + + &__content { + flex: 1 1 auto; + width: 0; + + &__description { + display: none; + + @media screen and (max-width: 575px) { + display: block; + font-size: 14px; + font-weight: 300; + margin-top: 8px; + min-height: 14px; + } + } + } + + &__caret { + display: none; + + @media screen and (max-width: 575px) { + display: block; + background-image: url('/images/caret-right.svg'); + width: 36px; + height: 36px; + opacity: 0.5; + background-size: contain; + background-repeat: no-repeat; + background-position: center; + + [dir='rtl'] & { + transform: rotate(180deg); + } + } + } + + &--active { + opacity: 1 !important; + } + } + + &__grow-tab { + flex-grow: 1; + } +} diff --git a/ui/app/components/app/tab-bar/tab-bar.js b/ui/app/components/app/tab-bar/tab-bar.js new file mode 100644 index 000000000000..6abd56936608 --- /dev/null +++ b/ui/app/components/app/tab-bar/tab-bar.js @@ -0,0 +1,35 @@ +import React from 'react' +import PropTypes from 'prop-types' +import classnames from 'classnames' + +const TabBar = (props) => { + const { tabs = [], onSelect, isActive } = props + + return ( +
    + {tabs.map(({ key, content, description }) => ( +
    onSelect(key)} + > +
    +
    {content}
    +
    {description}
    +
    +
    +
    + ))} +
    + ) +} + +TabBar.propTypes = { + isActive: PropTypes.func.isRequired, + tabs: PropTypes.array, + onSelect: PropTypes.func, +} + +export default TabBar diff --git a/ui/app/components/app/tests/signature-request.test.js b/ui/app/components/app/tests/signature-request.test.js new file mode 100644 index 000000000000..9efd70973036 --- /dev/null +++ b/ui/app/components/app/tests/signature-request.test.js @@ -0,0 +1,81 @@ +import assert from 'assert' +import React from 'react' +import { Provider } from 'react-redux' +import sinon from 'sinon' +import configureMockStore from 'redux-mock-store' +import { mountWithRouter } from '../../../../../test/lib/render-helpers' +import SignatureRequest from '../signature-request' + +describe('Signature Request', function () { + let wrapper + + const mockStore = { + metamask: { + provider: { + type: 'test', + }, + accounts: { + '0xd8f6a2ffb0fc5952d16c9768b71cfd35b6399aa5': { + address: '0xd8f6a2ffb0fc5952d16c9768b71cfd35b6399aa5', + balance: '0x03', + }, + }, + cachedBalances: { + + }, + selectedAddress: '0xd8f6a2ffb0fc5952d16c9768b71cfd35b6399aa5', + }, + } + const store = configureMockStore()(mockStore) + + const props = { + fromAccount: { + address: '0xd8f6a2ffb0fc5952d16c9768b71cfd35b6399aa5', + }, + history: { + push: sinon.spy(), + }, + clearConfirmTransaction: sinon.spy(), + cancelMessage: sinon.spy(), + cancel: sinon.stub().resolves(), + sign: sinon.stub().resolves(), + txData: { + msgParams: { + id: 1, + data: '{"types":{"EIP712Domain":[{"name":"name","type":"string"},{"name":"version","type":"string"},{"name":"chainId","type":"uint256"},{"name":"verifyingContract","type":"address"}],"Person":[{"name":"name","type":"string"},{"name":"wallet","type":"address"}],"Mail":[{"name":"from","type":"Person"},{"name":"to","type":"Person"},{"name":"contents","type":"string"}]},"primaryType":"Mail","domain":{"name":"Ether Mail","version":"1","chainId":"4","verifyingContract":"0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC"},"message":{"from":{"name":"Cow","wallet":"0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826"},"to":{"name":"Bob","wallet":"0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB"},"contents":"Hello, Bob!"}}', + from: '0xd8f6a2ffb0fc5952d16c9768b71cfd35b6399aa5', + origin: 'test.domain', + }, + status: 'unapproved', + time: 1, + type: 'eth_sign', + }, + } + + beforeEach(function () { + wrapper = mountWithRouter( + + + , store, + ) + }) + + afterEach(function () { + props.clearConfirmTransaction.resetHistory() + }) + + it('cancel', function () { + const cancelButton = wrapper.find('button.btn-default') + cancelButton.simulate('click') + + assert(props.cancel.calledOnce) + }) + + it('sign', function () { + const signButton = wrapper.find('button.btn-primary') + signButton.simulate('click') + + assert(props.sign.calledOnce) + }) + +}) diff --git a/ui/app/components/app/token-cell.js b/ui/app/components/app/token-cell.js deleted file mode 100644 index 495b9502be07..000000000000 --- a/ui/app/components/app/token-cell.js +++ /dev/null @@ -1,177 +0,0 @@ -const Component = require('react').Component -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const inherits = require('util').inherits -const connect = require('react-redux').connect -import Identicon from '../ui/identicon' -const prefixForNetwork = require('../../../lib/etherscan-prefix-for-network') -const selectors = require('../../selectors/selectors') -const actions = require('../../store/actions') -const { conversionUtil, multiplyCurrencies } = require('../../helpers/utils/conversion-util') - -const TokenMenuDropdown = require('./dropdowns/token-menu-dropdown.js') - -function mapStateToProps (state) { - return { - network: state.metamask.network, - currentCurrency: state.metamask.currentCurrency, - selectedTokenAddress: state.metamask.selectedTokenAddress, - userAddress: selectors.getSelectedAddress(state), - contractExchangeRates: state.metamask.contractExchangeRates, - conversionRate: state.metamask.conversionRate, - sidebarOpen: state.appState.sidebar.isOpen, - } -} - -function mapDispatchToProps (dispatch) { - return { - setSelectedToken: address => dispatch(actions.setSelectedToken(address)), - hideSidebar: () => dispatch(actions.hideSidebar()), - } -} - -module.exports = connect(mapStateToProps, mapDispatchToProps)(TokenCell) - -inherits(TokenCell, Component) -function TokenCell () { - Component.call(this) - - this.state = { - tokenMenuOpen: false, - } -} - -TokenCell.contextTypes = { - metricsEvent: PropTypes.func, -} - -TokenCell.prototype.render = function () { - const { tokenMenuOpen } = this.state - const props = this.props - const { - address, - symbol, - string, - network, - setSelectedToken, - selectedTokenAddress, - contractExchangeRates, - conversionRate, - hideSidebar, - sidebarOpen, - currentCurrency, - // userAddress, - image, - } = props - let currentTokenToFiatRate - let currentTokenInFiat - let formattedFiat = '' - - if (contractExchangeRates[address]) { - currentTokenToFiatRate = multiplyCurrencies( - contractExchangeRates[address], - conversionRate - ) - currentTokenInFiat = conversionUtil(string, { - fromNumericBase: 'dec', - fromCurrency: symbol, - toCurrency: currentCurrency.toUpperCase(), - numberOfDecimals: 2, - conversionRate: currentTokenToFiatRate, - }) - formattedFiat = currentTokenInFiat.toString() === '0' - ? '' - : `${currentTokenInFiat} ${currentCurrency.toUpperCase()}` - } - - const showFiat = Boolean(currentTokenInFiat) && currentCurrency.toUpperCase() !== symbol - - return ( - h('div.token-list-item', { - className: `token-list-item ${selectedTokenAddress === address ? 'token-list-item--active' : ''}`, - // style: { cursor: network === '1' ? 'pointer' : 'default' }, - // onClick: this.view.bind(this, address, userAddress, network), - onClick: () => { - setSelectedToken(address) - this.context.metricsEvent({ - eventOpts: { - category: 'Navigation', - action: 'Token Menu', - name: 'Clicked Token', - }, - }) - selectedTokenAddress !== address && sidebarOpen && hideSidebar() - }, - }, [ - - h(Identicon, { - className: 'token-list-item__identicon', - diameter: 50, - address, - network, - image, - }), - - h('div.token-list-item__balance-ellipsis', null, [ - h('div.token-list-item__balance-wrapper', null, [ - h('div.token-list-item__token-balance', `${string || 0}`), - h('div.token-list-item__token-symbol', symbol), - showFiat && h('div.token-list-item__fiat-amount', { - style: {}, - }, formattedFiat), - ]), - - h('i.fa.fa-ellipsis-h.fa-lg.token-list-item__ellipsis.cursor-pointer', { - onClick: (e) => { - e.stopPropagation() - this.setState({ tokenMenuOpen: true }) - }, - }), - - ]), - - - tokenMenuOpen && h(TokenMenuDropdown, { - onClose: () => this.setState({ tokenMenuOpen: false }), - token: { symbol, address }, - }), - - /* - h('button', { - onClick: this.send.bind(this, address), - }, 'SEND'), - */ - - ]) - ) -} - -TokenCell.prototype.send = function (address, event) { - event.preventDefault() - event.stopPropagation() - const url = tokenFactoryFor(address) - if (url) { - navigateTo(url) - } -} - -TokenCell.prototype.view = function (address, userAddress, network) { - const url = etherscanLinkFor(address, userAddress, network) - if (url) { - navigateTo(url) - } -} - -function navigateTo (url) { - global.platform.openWindow({ url }) -} - -function etherscanLinkFor (tokenAddress, address, network) { - const prefix = prefixForNetwork(network) - return `https://${prefix}etherscan.io/token/${tokenAddress}?a=${address}` -} - -function tokenFactoryFor (tokenAddress) { - return `https://tokenfactory.surge.sh/#/token/${tokenAddress}` -} - diff --git a/ui/app/components/app/token-cell/index.js b/ui/app/components/app/token-cell/index.js new file mode 100644 index 000000000000..c33e36adb2c4 --- /dev/null +++ b/ui/app/components/app/token-cell/index.js @@ -0,0 +1 @@ +export { default } from './token-cell' diff --git a/ui/app/components/app/token-cell/token-cell.js b/ui/app/components/app/token-cell/token-cell.js new file mode 100644 index 000000000000..20de78bf310c --- /dev/null +++ b/ui/app/components/app/token-cell/token-cell.js @@ -0,0 +1,69 @@ +import classnames from 'classnames' +import PropTypes from 'prop-types' +import React from 'react' +import { useSelector } from 'react-redux' +import AssetListItem from '../asset-list-item' +import { getSelectedAddress } from '../../../selectors' +import { useI18nContext } from '../../../hooks/useI18nContext' +import { useTokenFiatAmount } from '../../../hooks/useTokenFiatAmount' + +export default function TokenCell ({ + address, + decimals, + outdatedBalance, + symbol, + string, + image, + onClick, +}) { + const userAddress = useSelector(getSelectedAddress) + const t = useI18nContext() + + const formattedFiat = useTokenFiatAmount(address, string, symbol) + + const warning = outdatedBalance + ? ( + + { t('troubleTokenBalances') } + + { t('here') } + + + ) + : null + + return ( + + + ) +} + +TokenCell.propTypes = { + address: PropTypes.string, + outdatedBalance: PropTypes.bool, + symbol: PropTypes.string, + decimals: PropTypes.number, + string: PropTypes.string, + image: PropTypes.string, + onClick: PropTypes.func.isRequired, +} + +TokenCell.defaultProps = { + outdatedBalance: false, +} diff --git a/ui/app/components/app/token-cell/token-cell.scss b/ui/app/components/app/token-cell/token-cell.scss new file mode 100644 index 000000000000..38adfcb56690 --- /dev/null +++ b/ui/app/components/app/token-cell/token-cell.scss @@ -0,0 +1,5 @@ +.token-cell { + &--outdated .list-item__heading { + color: $Grey-500; + } +} diff --git a/ui/app/components/app/token-cell/token-cell.test.js b/ui/app/components/app/token-cell/token-cell.test.js new file mode 100644 index 000000000000..65a238b6959a --- /dev/null +++ b/ui/app/components/app/token-cell/token-cell.test.js @@ -0,0 +1,84 @@ +import assert from 'assert' +import React from 'react' +import thunk from 'redux-thunk' +import { Provider } from 'react-redux' +import configureMockStore from 'redux-mock-store' +import { mount } from 'enzyme' +import sinon from 'sinon' +import { MemoryRouter } from 'react-router-dom' + +import Identicon from '../../ui/identicon' +import TokenCell from '.' + +describe('Token Cell', function () { + let wrapper + + const state = { + metamask: { + currentCurrency: 'usd', + selectedAddress: '0xAddress', + contractExchangeRates: { + '0xAnotherToken': 0.015, + }, + conversionRate: 7.00, + preferences: {}, + provider: { + chainId: '1', + ticker: 'ETH', + type: 'mainnet', + }, + }, + appState: { + sidebar: { + isOpen: true, + }, + }, + } + + const middlewares = [thunk] + const mockStore = configureMockStore(middlewares) + const store = mockStore(state) + + let onClick + + beforeEach(function () { + onClick = sinon.stub() + wrapper = mount( + + + + + , + ) + }) + + afterEach(function () { + sinon.restore() + }) + + it('renders Identicon with props from token cell', function () { + assert.equal(wrapper.find(Identicon).prop('address'), '0xAnotherToken') + assert.equal(wrapper.find(Identicon).prop('image'), './test-image') + }) + + it('renders token balance and symbol', function () { + assert.equal(wrapper.find('.list-item__heading').text(), '5.000 TEST') + }) + + it('renders converted fiat amount', function () { + assert.equal(wrapper.find('.list-item__subheading').text(), '$0.52 USD') + }) + + it('calls onClick when clicked', function () { + assert.ok(!onClick.called) + wrapper.simulate('click') + assert.ok(onClick.called) + }) +}) diff --git a/ui/app/components/app/token-list.js b/ui/app/components/app/token-list.js deleted file mode 100644 index 2188e7020b49..000000000000 --- a/ui/app/components/app/token-list.js +++ /dev/null @@ -1,188 +0,0 @@ -const Component = require('react').Component -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const inherits = require('util').inherits -const TokenTracker = require('eth-token-tracker') -const TokenCell = require('./token-cell.js') -const connect = require('react-redux').connect -const selectors = require('../../selectors/selectors') -const log = require('loglevel') - -function mapStateToProps (state) { - return { - network: state.metamask.network, - tokens: state.metamask.tokens, - userAddress: selectors.getSelectedAddress(state), - assetImages: state.metamask.assetImages, - } -} - -const defaultTokens = [] -const contracts = require('eth-contract-metadata') -for (const address in contracts) { - const contract = contracts[address] - if (contract.erc20) { - contract.address = address - defaultTokens.push(contract) - } -} - -TokenList.contextTypes = { - t: PropTypes.func, -} - -module.exports = connect(mapStateToProps)(TokenList) - - -inherits(TokenList, Component) -function TokenList () { - this.state = { - tokens: [], - isLoading: true, - network: null, - } - Component.call(this) -} - -TokenList.prototype.render = function () { - const { userAddress, assetImages } = this.props - const state = this.state - const { tokens, isLoading, error } = state - if (isLoading) { - return this.message(this.context.t('loadingTokens')) - } - - if (error) { - log.error(error) - return h('.hotFix', { - style: { - padding: '80px', - }, - }, [ - this.context.t('troubleTokenBalances'), - h('span.hotFix', { - style: { - color: 'rgba(247, 134, 28, 1)', - cursor: 'pointer', - }, - onClick: () => { - global.platform.openWindow({ - url: `https://ethplorer.io/address/${userAddress}`, - }) - }, - }, this.context.t('here')), - ]) - } - - return h('div', tokens.map((tokenData) => { - tokenData.image = assetImages[tokenData.address] - return h(TokenCell, tokenData) - })) - -} - -TokenList.prototype.message = function (body) { - return h('div', { - style: { - display: 'flex', - height: '250px', - alignItems: 'center', - justifyContent: 'center', - padding: '30px', - }, - }, body) -} - -TokenList.prototype.componentDidMount = function () { - this.createFreshTokenTracker() -} - -TokenList.prototype.createFreshTokenTracker = function () { - if (this.tracker) { - // Clean up old trackers when refreshing: - this.tracker.stop() - this.tracker.removeListener('update', this.balanceUpdater) - this.tracker.removeListener('error', this.showError) - } - - if (!global.ethereumProvider) return - const { userAddress } = this.props - - this.tracker = new TokenTracker({ - userAddress, - provider: global.ethereumProvider, - tokens: this.props.tokens, - pollingInterval: 8000, - }) - - - // Set up listener instances for cleaning up - this.balanceUpdater = this.updateBalances.bind(this) - this.showError = (error) => { - this.setState({ error, isLoading: false }) - } - this.tracker.on('update', this.balanceUpdater) - this.tracker.on('error', this.showError) - - this.tracker.updateBalances() - .then(() => { - this.updateBalances(this.tracker.serialize()) - }) - .catch((reason) => { - log.error(`Problem updating balances`, reason) - this.setState({ isLoading: false }) - }) -} - -TokenList.prototype.componentDidUpdate = function (prevProps) { - const { - network: oldNet, - userAddress: oldAddress, - tokens, - } = prevProps - const { - network: newNet, - userAddress: newAddress, - tokens: newTokens, - } = this.props - - const isLoading = newNet === 'loading' - const missingInfo = !oldNet || !newNet || !oldAddress || !newAddress - const sameUserAndNetwork = oldAddress === newAddress && oldNet === newNet - const shouldUpdateTokens = isLoading || missingInfo || sameUserAndNetwork - - const oldTokensLength = tokens ? tokens.length : 0 - const tokensLengthUnchanged = oldTokensLength === newTokens.length - - if (tokensLengthUnchanged && shouldUpdateTokens) return - - this.setState({ isLoading: true }) - this.createFreshTokenTracker() -} - -TokenList.prototype.updateBalances = function (tokens) { - if (!this.tracker.running) { - return - } - this.setState({ tokens, isLoading: false }) -} - -TokenList.prototype.componentWillUnmount = function () { - if (!this.tracker) return - this.tracker.stop() - this.tracker.removeListener('update', this.balanceUpdater) - this.tracker.removeListener('error', this.showError) -} - -// function uniqueMergeTokens (tokensA, tokensB = []) { -// const uniqueAddresses = [] -// const result = [] -// tokensA.concat(tokensB).forEach((token) => { -// const normal = normalizeAddress(token.address) -// if (!uniqueAddresses.includes(normal)) { -// uniqueAddresses.push(normal) -// result.push(token) -// } -// }) -// return result -// } diff --git a/ui/app/components/app/token-list/index.js b/ui/app/components/app/token-list/index.js new file mode 100644 index 000000000000..613fc96682fa --- /dev/null +++ b/ui/app/components/app/token-list/index.js @@ -0,0 +1 @@ +export { default } from './token-list' diff --git a/ui/app/components/app/token-list/token-list.js b/ui/app/components/app/token-list/token-list.js new file mode 100644 index 000000000000..b71e6930bcd9 --- /dev/null +++ b/ui/app/components/app/token-list/token-list.js @@ -0,0 +1,56 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { isEqual } from 'lodash' + +import { useSelector } from 'react-redux' +import TokenCell from '../token-cell' +import { useI18nContext } from '../../../hooks/useI18nContext' +import { useTokenTracker } from '../../../hooks/useTokenTracker' +import { getAssetImages } from '../../../selectors' +import { getTokens } from '../../../ducks/metamask/metamask' + +export default function TokenList ({ onTokenClick }) { + const t = useI18nContext() + const assetImages = useSelector(getAssetImages) + // use `isEqual` comparison function because the token array is serialized + // from the background so it has a new reference with each background update, + // even if the tokens haven't changed + const tokens = useSelector(getTokens, isEqual) + const { loading, error, tokensWithBalances } = useTokenTracker(tokens) + + if (loading) { + return ( +
    + {t('loadingTokens')} +
    + ) + } + + return ( +
    + {tokensWithBalances.map((tokenData, index) => { + tokenData.image = assetImages[tokenData.address] + return ( + + ) + })} +
    + ) +} + +TokenList.propTypes = { + onTokenClick: PropTypes.func.isRequired, +} diff --git a/ui/app/components/app/transaction-action/tests/transaction-action.component.test.js b/ui/app/components/app/transaction-action/tests/transaction-action.component.test.js index 16f2e256f836..5e643a80acb5 100644 --- a/ui/app/components/app/transaction-action/tests/transaction-action.component.test.js +++ b/ui/app/components/app/transaction-action/tests/transaction-action.component.test.js @@ -1,24 +1,23 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { shallow } from 'enzyme' import sinon from 'sinon' import TransactionAction from '../transaction-action.component' -describe('TransactionAction Component', () => { - const t = key => key - +describe('TransactionAction Component', function () { + const t = (key) => key - describe('Outgoing transaction', () => { - beforeEach(() => { + describe('Outgoing transaction', function () { + beforeEach(function () { global.eth = { - getCode: sinon.stub().callsFake(address => { + getCode: sinon.stub().callsFake((address) => { const code = address === 'approveAddress' ? 'contract' : '0x' return Promise.resolve(code) }), } }) - it('should render Sent Ether', () => { + it('should render Sent Ether', function () { const methodData = { data: {}, done: true, error: null } const transaction = { id: 1, @@ -35,18 +34,21 @@ describe('TransactionAction Component', () => { }, } - const wrapper = shallow(, { context: { t }}) + const wrapper = shallow(( + + ), { context: { t } }) assert.equal(wrapper.find('.transaction-action').length, 1) wrapper.setState({ transactionAction: 'sentEther' }) assert.equal(wrapper.text(), 'sentEther') + assert.equal(wrapper.find('.transaction-action').props().title.trim(), 'sentEther') }) - it('should render Approved', async () => { + it('should render Approved', async function () { const methodData = { name: 'Approve', } @@ -73,15 +75,16 @@ describe('TransactionAction Component', () => { transaction={transaction} className="test-class" />, - { context: { t } } + { context: { t } }, ) assert.ok(wrapper) assert.equal(wrapper.find('.transaction-action').length, 1) assert.equal(wrapper.find('.transaction-action').text().trim(), 'Approve') + assert.equal(wrapper.find('.transaction-action').props().title.trim(), 'Approve') }) - it('should render contractInteraction', async () => { + it('should render contractInteraction', async function () { const methodData = {} const transaction = { id: 1, @@ -106,12 +109,13 @@ describe('TransactionAction Component', () => { transaction={transaction} className="test-class" />, - { context: { t }} + { context: { t } }, ) assert.ok(wrapper) assert.equal(wrapper.find('.transaction-action').length, 1) assert.equal(wrapper.find('.transaction-action').text().trim(), 'contractInteraction') + assert.equal(wrapper.find('.transaction-action').props().title.trim(), 'contractInteraction') }) }) }) diff --git a/ui/app/components/app/transaction-action/transaction-action.component.js b/ui/app/components/app/transaction-action/transaction-action.component.js index 26012ff7fbf8..e1617fcbcea4 100644 --- a/ui/app/components/app/transaction-action/transaction-action.component.js +++ b/ui/app/components/app/transaction-action/transaction-action.component.js @@ -29,9 +29,11 @@ export default class TransactionAction extends PureComponent { render () { const { className } = this.props + const action = this.getTransactionAction() + return ( -
    - { this.getTransactionAction() } +
    + { action }
    ) } diff --git a/ui/app/components/app/transaction-activity-log/index.scss b/ui/app/components/app/transaction-activity-log/index.scss index 00c17e6aabe7..d5b748d17c0c 100644 --- a/ui/app/components/app/transaction-activity-log/index.scss +++ b/ui/app/components/app/transaction-activity-log/index.scss @@ -55,7 +55,7 @@ &__activity-text { color: $dusty-gray; - font-size: .75rem; + font-size: 0.75rem; cursor: pointer; &:hover { @@ -73,9 +73,9 @@ } &__action-link { - font-size: .75rem; + font-size: 0.75rem; cursor: pointer; - color: $curious-blue; + color: $primary-blue; } b { diff --git a/ui/app/components/app/transaction-activity-log/tests/transaction-activity-log.component.test.js b/ui/app/components/app/transaction-activity-log/tests/transaction-activity-log.component.test.js index a2946e53da85..9b3c3979282f 100644 --- a/ui/app/components/app/transaction-activity-log/tests/transaction-activity-log.component.test.js +++ b/ui/app/components/app/transaction-activity-log/tests/transaction-activity-log.component.test.js @@ -1,10 +1,10 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { shallow } from 'enzyme' import TransactionActivityLog from '../transaction-activity-log.component' -describe('TransactionActivityLog Component', () => { - it('should render properly', () => { +describe('TransactionActivityLog Component', function () { + it('should render properly', function () { const activities = [ { eventKey: 'transactionCreated', @@ -40,18 +40,18 @@ describe('TransactionActivityLog Component', () => { inlineRetryIndex={-1} inlineCancelIndex={-1} nativeCurrency="ETH" - onCancel={() => {}} - onRetry={() => {}} + onCancel={() => undefined} + onRetry={() => undefined} primaryTransactionStatus="confirmed" />, - { context: { t: (str1, str2) => str2 ? str1 + str2 : str1 } } + { context: { t: (str1, str2) => (str2 ? str1 + str2 : str1) } }, ) assert.ok(wrapper.hasClass('transaction-activity-log')) assert.ok(wrapper.hasClass('test-class')) }) - it('should render inline retry and cancel buttons', () => { + it('should render inline retry and cancel buttons for earliest pending transaction', function () { const activities = [ { eventKey: 'transactionCreated', @@ -87,15 +87,65 @@ describe('TransactionActivityLog Component', () => { inlineRetryIndex={2} inlineCancelIndex={3} nativeCurrency="ETH" - onCancel={() => {}} - onRetry={() => {}} + onCancel={() => undefined} + onRetry={() => undefined} primaryTransactionStatus="pending" + isEarliestNonce />, - { context: { t: (str1, str2) => str2 ? str1 + str2 : str1 } } + { context: { t: (str1, str2) => (str2 ? str1 + str2 : str1) } }, ) assert.ok(wrapper.hasClass('transaction-activity-log')) assert.ok(wrapper.hasClass('test-class')) assert.equal(wrapper.find('.transaction-activity-log__action-link').length, 2) }) + + it('should not render inline retry and cancel buttons for newer pending transactions', function () { + const activities = [ + { + eventKey: 'transactionCreated', + hash: '0xa', + id: 1, + timestamp: 1, + value: '0x1', + }, { + eventKey: 'transactionSubmitted', + hash: '0xa', + id: 1, + timestamp: 2, + value: '0x1', + }, { + eventKey: 'transactionResubmitted', + hash: '0x7d09d337fc6f5d6fe2dbf3a6988d69532deb0a82b665f9180b5a20db377eea87', + id: 2, + timestamp: 3, + value: '0x1', + }, { + eventKey: 'transactionCancelAttempted', + hash: '0x7d09d337fc6f5d6fe2dbf3a6988d69532deb0a82b665f9180b5a20db377eea87', + id: 3, + timestamp: 4, + value: '0x1', + }, + ] + + const wrapper = shallow( + undefined} + onRetry={() => undefined} + primaryTransactionStatus="pending" + isEarliestNonce={false} + />, + { context: { t: (str1, str2) => (str2 ? str1 + str2 : str1) } }, + ) + + assert.ok(wrapper.hasClass('transaction-activity-log')) + assert.ok(wrapper.hasClass('test-class')) + assert.equal(wrapper.find('.transaction-activity-log__action-link').length, 0) + }) }) diff --git a/ui/app/components/app/transaction-activity-log/tests/transaction-activity-log.container.test.js b/ui/app/components/app/transaction-activity-log/tests/transaction-activity-log.container.test.js index a7c35f51ecda..6d72794f3a24 100644 --- a/ui/app/components/app/transaction-activity-log/tests/transaction-activity-log.container.test.js +++ b/ui/app/components/app/transaction-activity-log/tests/transaction-activity-log.container.test.js @@ -5,16 +5,16 @@ let mapStateToProps proxyquire('../transaction-activity-log.container.js', { 'react-redux': { - connect: ms => { + connect: (ms) => { mapStateToProps = ms return () => ({}) }, }, }) -describe('TransactionActivityLog container', () => { - describe('mapStateToProps()', () => { - it('should return the correct props', () => { +describe('TransactionActivityLog container', function () { + describe('mapStateToProps()', function () { + it('should return the correct props', function () { const mockState = { metamask: { conversionRate: 280.45, diff --git a/ui/app/components/app/transaction-activity-log/tests/transaction-activity-log.util.test.js b/ui/app/components/app/transaction-activity-log/tests/transaction-activity-log.util.test.js index d014b88864de..7e4a4313a3f5 100644 --- a/ui/app/components/app/transaction-activity-log/tests/transaction-activity-log.util.test.js +++ b/ui/app/components/app/transaction-activity-log/tests/transaction-activity-log.util.test.js @@ -1,335 +1,321 @@ import assert from 'assert' import { combineTransactionHistories, getActivities } from '../transaction-activity-log.util' -describe('combineTransactionHistories', () => { - it('should return no activites for an empty list of transactions', () => { - assert.deepEqual(combineTransactionHistories([]), []) - }) +describe('TransactionActivityLog utils', function () { + describe('combineTransactionHistories', function () { + it('should return no activities for an empty list of transactions', function () { + assert.deepEqual(combineTransactionHistories([]), []) + }) - it('should return activities for an array of transactions', () => { - const transactions = [ - { - estimatedGas: '0x5208', - hash: '0xa14f13d36b3901e352ce3a7acb9b47b001e5a3370f06232a0953c6fc6fad91b3', - history: [ - { - 'id': 6400627574331058, - 'time': 1543958845581, - 'status': 'unapproved', - 'metamaskNetworkId': '3', - 'loadingDefaults': true, - 'txParams': { - 'from': '0x50a9d56c2b8ba9a5c7f2c08c3d26e0499f23a706', - 'to': '0xc5ae6383e126f901dcb06131d97a88745bfa88d6', - 'value': '0x2386f26fc10000', - 'gas': '0x5208', - 'gasPrice': '0x3b9aca00', + it('should return activities for an array of transactions', function () { + const transactions = [ + { + hash: '0xa14f13d36b3901e352ce3a7acb9b47b001e5a3370f06232a0953c6fc6fad91b3', + history: [ + { + 'id': 6400627574331058, + 'time': 1543958845581, + 'status': 'unapproved', + 'metamaskNetworkId': '3', + 'loadingDefaults': true, + 'txParams': { + 'from': '0x50a9d56c2b8ba9a5c7f2c08c3d26e0499f23a706', + 'to': '0xc5ae6383e126f901dcb06131d97a88745bfa88d6', + 'value': '0x2386f26fc10000', + 'gas': '0x5208', + 'gasPrice': '0x3b9aca00', + }, + 'type': 'standard', }, - 'type': 'standard', + [{ 'op': 'replace', 'path': '/status', 'value': 'approved', 'note': 'txStateManager: setting status to approved', 'timestamp': 1543958847813 }], + [{ 'op': 'replace', 'path': '/status', 'value': 'submitted', 'note': 'txStateManager: setting status to submitted', 'timestamp': 1543958848147 }], + [{ 'op': 'replace', 'path': '/status', 'value': 'dropped', 'note': 'txStateManager: setting status to dropped', 'timestamp': 1543958897181 }, { 'op': 'add', 'path': '/replacedBy', 'value': '0xecbe181ee67c4291d04a7cb9ffbf1d5d831e4fbaa89994fd06bab5dd4cc79b33' }], + ], + id: 6400627574331058, + loadingDefaults: false, + metamaskNetworkId: '3', + status: 'dropped', + submittedTime: 1543958848135, + time: 1543958845581, + txParams: { + from: '0x50a9d56c2b8ba9a5c7f2c08c3d26e0499f23a706', + gas: '0x5208', + gasPrice: '0x3b9aca00', + nonce: '0x32', + to: '0xc5ae6383e126f901dcb06131d97a88745bfa88d6', + value: '0x2386f26fc10000', }, - [{ 'op': 'replace', 'path': '/status', 'value': 'approved', 'note': 'txStateManager: setting status to approved', 'timestamp': 1543958847813 }], - [{ 'op': 'replace', 'path': '/status', 'value': 'submitted', 'note': 'txStateManager: setting status to submitted', 'timestamp': 1543958848147 }], - [{ 'op': 'replace', 'path': '/status', 'value': 'dropped', 'note': 'txStateManager: setting status to dropped', 'timestamp': 1543958897181 }, { 'op': 'add', 'path': '/replacedBy', 'value': '0xecbe181ee67c4291d04a7cb9ffbf1d5d831e4fbaa89994fd06bab5dd4cc79b33' }], - ], - id: 6400627574331058, - loadingDefaults: false, - metamaskNetworkId: '3', - status: 'dropped', - submittedTime: 1543958848135, - time: 1543958845581, + type: 'standard', + }, { + hash: '0xecbe181ee67c4291d04a7cb9ffbf1d5d831e4fbaa89994fd06bab5dd4cc79b33', + history: [ + { + 'id': 6400627574331060, + 'time': 1543958857697, + 'status': 'unapproved', + 'metamaskNetworkId': '3', + 'loadingDefaults': false, + 'txParams': { + 'from': '0x50a9d56c2b8ba9a5c7f2c08c3d26e0499f23a706', + 'to': '0xc5ae6383e126f901dcb06131d97a88745bfa88d6', + 'value': '0x2386f26fc10000', + 'gas': '0x5208', + 'gasPrice': '0x3b9aca00', + 'nonce': '0x32', + }, + 'lastGasPrice': '0x4190ab00', + 'type': 'retry', + }, + [{ 'op': 'replace', 'path': '/txParams/gasPrice', 'value': '0x481f2280', 'note': 'confTx: user approved transaction', 'timestamp': 1543958859470 }], + [{ 'op': 'replace', 'path': '/status', 'value': 'approved', 'note': 'txStateManager: setting status to approved', 'timestamp': 1543958859485 }], + [{ 'op': 'replace', 'path': '/status', 'value': 'signed', 'note': 'transactions#publishTransaction', 'timestamp': 1543958859889 }], + [{ 'op': 'replace', 'path': '/status', 'value': 'submitted', 'note': 'txStateManager: setting status to submitted', 'timestamp': 1543958860061 }], [{ 'op': 'add', 'path': '/firstRetryBlockNumber', 'value': '0x45a0fd', 'note': 'transactions/pending-tx-tracker#event: tx:block-update', 'timestamp': 1543958896466 }], + [{ 'op': 'replace', 'path': '/status', 'value': 'confirmed', 'timestamp': 1543958897165 }], + ], + id: 6400627574331060, + lastGasPrice: '0x4190ab00', + loadingDefaults: false, + metamaskNetworkId: '3', + status: 'confirmed', + submittedTime: 1543958860054, + time: 1543958857697, + txParams: { + from: '0x50a9d56c2b8ba9a5c7f2c08c3d26e0499f23a706', + gas: '0x5208', + gasPrice: '0x481f2280', + nonce: '0x32', + to: '0xc5ae6383e126f901dcb06131d97a88745bfa88d6', + value: '0x2386f26fc10000', + }, + txReceipt: { + status: '0x1', + }, + type: 'retry', + }, + ] + + const expected = [ + { + id: 6400627574331058, + hash: '0xa14f13d36b3901e352ce3a7acb9b47b001e5a3370f06232a0953c6fc6fad91b3', + eventKey: 'transactionCreated', + timestamp: 1543958845581, + value: '0x2386f26fc10000', + }, { + id: 6400627574331058, + hash: '0xa14f13d36b3901e352ce3a7acb9b47b001e5a3370f06232a0953c6fc6fad91b3', + eventKey: 'transactionSubmitted', + timestamp: 1543958848147, + value: '0x1319718a5000', + }, { + id: 6400627574331060, + hash: '0xecbe181ee67c4291d04a7cb9ffbf1d5d831e4fbaa89994fd06bab5dd4cc79b33', + eventKey: 'transactionResubmitted', + timestamp: 1543958860061, + value: '0x171c3a061400', + }, { + id: 6400627574331060, + hash: '0xecbe181ee67c4291d04a7cb9ffbf1d5d831e4fbaa89994fd06bab5dd4cc79b33', + eventKey: 'transactionConfirmed', + timestamp: 1543958897165, + value: '0x171c3a061400', + }, + ] + + assert.deepEqual(combineTransactionHistories(transactions), expected) + }) + }) + + describe('getActivities', function () { + it('should return no activities for an empty history', function () { + const transaction = { + history: [], + id: 1, + status: 'confirmed', txParams: { - from: '0x50a9d56c2b8ba9a5c7f2c08c3d26e0499f23a706', + from: '0x1', gas: '0x5208', gasPrice: '0x3b9aca00', - nonce: '0x32', - to: '0xc5ae6383e126f901dcb06131d97a88745bfa88d6', + nonce: '0xa4', + to: '0x2', value: '0x2386f26fc10000', }, - type: 'standard', - }, { - hash: '0xecbe181ee67c4291d04a7cb9ffbf1d5d831e4fbaa89994fd06bab5dd4cc79b33', + } + + assert.deepEqual(getActivities(transaction), []) + }) + + it('should return activities for a transaction\'s history', function () { + const transaction = { history: [ { - 'id': 6400627574331060, - 'time': 1543958857697, - 'status': 'unapproved', - 'metamaskNetworkId': '3', - 'loadingDefaults': false, - 'txParams': { - 'from': '0x50a9d56c2b8ba9a5c7f2c08c3d26e0499f23a706', - 'to': '0xc5ae6383e126f901dcb06131d97a88745bfa88d6', - 'value': '0x2386f26fc10000', - 'gas': '0x5208', - 'gasPrice': '0x3b9aca00', - 'nonce': '0x32', + id: 5559712943815343, + loadingDefaults: true, + metamaskNetworkId: '3', + status: 'unapproved', + time: 1535507561452, + txParams: { + from: '0x1', + gas: '0x5208', + gasPrice: '0x3b9aca00', + nonce: '0xa4', + to: '0x2', + value: '0x2386f26fc10000', }, - 'lastGasPrice': '0x4190ab00', - 'type': 'retry', }, - [{ 'op': 'replace', 'path': '/txParams/gasPrice', 'value': '0x481f2280', 'note': 'confTx: user approved transaction', 'timestamp': 1543958859470 }], - [{ 'op': 'replace', 'path': '/status', 'value': 'approved', 'note': 'txStateManager: setting status to approved', 'timestamp': 1543958859485 }], - [{ 'op': 'replace', 'path': '/status', 'value': 'signed', 'note': 'transactions#publishTransaction', 'timestamp': 1543958859889 }], - [{ 'op': 'replace', 'path': '/status', 'value': 'submitted', 'note': 'txStateManager: setting status to submitted', 'timestamp': 1543958860061 }], [{ 'op': 'add', 'path': '/firstRetryBlockNumber', 'value': '0x45a0fd', 'note': 'transactions/pending-tx-tracker#event: tx:block-update', 'timestamp': 1543958896466 }], - [{ 'op': 'replace', 'path': '/status', 'value': 'confirmed', 'timestamp': 1543958897165 }], + [ + { + op: 'replace', + path: '/loadingDefaults', + timestamp: 1535507561515, + value: false, + }, + ], + [ + { + note: '#newUnapprovedTransaction - adding the origin', + op: 'add', + path: '/origin', + timestamp: 1535507561516, + value: 'MetaMask', + }, + [], + ], + [ + { + note: 'confTx: user approved transaction', + op: 'replace', + path: '/txParams/gasPrice', + timestamp: 1535664571504, + value: '0x77359400', + }, + ], + [ + { + note: 'txStateManager: setting status to approved', + op: 'replace', + path: '/status', + timestamp: 1535507564302, + value: 'approved', + }, + ], + [ + { + note: 'transactions#approveTransaction', + op: 'add', + path: '/txParams/nonce', + timestamp: 1535507564439, + value: '0xa4', + }, + { + op: 'add', + path: '/nonceDetails', + value: { + local: {}, + network: {}, + params: {}, + }, + }, + ], + [ + { + note: 'transactions#publishTransaction', + op: 'replace', + path: '/status', + timestamp: 1535507564518, + value: 'signed', + }, + { + op: 'add', + path: '/rawTx', + value: '0xf86b81a4843b9aca008252089450a9d56c2b8ba9a5c7f2c08c3d26e0499f23a706872386f26fc10000802aa007b30119fc4fc5954fad727895b7e3ba80a78d197e95703cc603bcf017879151a01c50beda40ffaee541da9c05b9616247074f25f392800e0ad6c7a835d5366edf', + }, + ], + [], + [ + { + note: 'transactions#setTxHash', + op: 'add', + path: '/hash', + timestamp: 1535507564658, + value: '0x7acc4987b5c0dfa8d423798a8c561138259de1f98a62e3d52e7e83c0e0dd9fb7', + }, + ], + [ + { + note: 'txStateManager - add submitted time stamp', + op: 'add', + path: '/submittedTime', + timestamp: 1535507564660, + value: 1535507564660, + }, + ], + [ + { + note: 'txStateManager: setting status to submitted', + op: 'replace', + path: '/status', + timestamp: 1535507564665, + value: 'submitted', + }, + ], + [ + { + note: 'transactions/pending-tx-tracker#event: tx:block-update', + op: 'add', + path: '/firstRetryBlockNumber', + timestamp: 1535507575476, + value: '0x3bf624', + }, + ], + [ + { + note: 'txStateManager: setting status to confirmed', + op: 'replace', + path: '/status', + timestamp: 1535507615993, + value: 'confirmed', + }, + ], ], - id: 6400627574331060, - lastGasPrice: '0x4190ab00', - loadingDefaults: false, - metamaskNetworkId: '3', + id: 1, status: 'confirmed', - submittedTime: 1543958860054, - time: 1543958857697, txParams: { - from: '0x50a9d56c2b8ba9a5c7f2c08c3d26e0499f23a706', + from: '0x1', gas: '0x5208', - gasPrice: '0x481f2280', - nonce: '0x32', - to: '0xc5ae6383e126f901dcb06131d97a88745bfa88d6', + gasPrice: '0x3b9aca00', + nonce: '0xa4', + to: '0x2', value: '0x2386f26fc10000', }, - txReceipt: { - status: '0x1', - }, - type: 'retry', - }, - ] - - const expected = [ - { - id: 6400627574331058, - hash: '0xa14f13d36b3901e352ce3a7acb9b47b001e5a3370f06232a0953c6fc6fad91b3', - eventKey: 'transactionCreated', - timestamp: 1543958845581, - value: '0x2386f26fc10000', - }, { - id: 6400627574331058, - hash: '0xa14f13d36b3901e352ce3a7acb9b47b001e5a3370f06232a0953c6fc6fad91b3', - eventKey: 'transactionSubmitted', - timestamp: 1543958848147, - value: '0x1319718a5000', - }, { - id: 6400627574331060, - hash: '0xecbe181ee67c4291d04a7cb9ffbf1d5d831e4fbaa89994fd06bab5dd4cc79b33', - eventKey: 'transactionResubmitted', - timestamp: 1543958860061, - value: '0x171c3a061400', - }, { - id: 6400627574331060, - hash: '0xecbe181ee67c4291d04a7cb9ffbf1d5d831e4fbaa89994fd06bab5dd4cc79b33', - eventKey: 'transactionConfirmed', - timestamp: 1543958897165, - value: '0x171c3a061400', - }, - ] - - assert.deepEqual(combineTransactionHistories(transactions), expected) - }) -}) + hash: '0xabc', + } -describe('getActivities', () => { - it('should return no activities for an empty history', () => { - const transaction = { - history: [], - id: 1, - status: 'confirmed', - txParams: { - from: '0x1', - gas: '0x5208', - gasPrice: '0x3b9aca00', - nonce: '0xa4', - to: '0x2', - value: '0x2386f26fc10000', - }, - } - - assert.deepEqual(getActivities(transaction), []) - }) - - it('should return activities for a transaction\'s history', () => { - const transaction = { - history: [ + const expectedResult = [ { - id: 5559712943815343, - loadingDefaults: true, - metamaskNetworkId: '3', - status: 'unapproved', - time: 1535507561452, - txParams: { - from: '0x1', - gas: '0x5208', - gasPrice: '0x3b9aca00', - nonce: '0xa4', - to: '0x2', - value: '0x2386f26fc10000', - }, + 'eventKey': 'transactionCreated', + 'timestamp': 1535507561452, + 'value': '0x2386f26fc10000', + 'id': 1, + 'hash': '0xabc', }, - [ - { - op: 'replace', - path: '/loadingDefaults', - timestamp: 1535507561515, - value: false, - }, - { - op: 'add', - path: '/gasPriceSpecified', - value: true, - }, - { - op: 'add', - path: '/gasLimitSpecified', - value: true, - }, - { - op: 'add', - path: '/estimatedGas', - value: '0x5208', - }, - ], - [ - { - note: '#newUnapprovedTransaction - adding the origin', - op: 'add', - path: '/origin', - timestamp: 1535507561516, - value: 'MetaMask', - }, - [], - ], - [ - { - note: 'confTx: user approved transaction', - op: 'replace', - path: '/txParams/gasPrice', - timestamp: 1535664571504, - value: '0x77359400', - }, - ], - [ - { - note: 'txStateManager: setting status to approved', - op: 'replace', - path: '/status', - timestamp: 1535507564302, - value: 'approved', - }, - ], - [ - { - note: 'transactions#approveTransaction', - op: 'add', - path: '/txParams/nonce', - timestamp: 1535507564439, - value: '0xa4', - }, - { - op: 'add', - path: '/nonceDetails', - value: { - local: {}, - network: {}, - params: {}, - }, - }, - ], - [ - { - note: 'transactions#publishTransaction', - op: 'replace', - path: '/status', - timestamp: 1535507564518, - value: 'signed', - }, - { - op: 'add', - path: '/rawTx', - value: '0xf86b81a4843b9aca008252089450a9d56c2b8ba9a5c7f2c08c3d26e0499f23a706872386f26fc10000802aa007b30119fc4fc5954fad727895b7e3ba80a78d197e95703cc603bcf017879151a01c50beda40ffaee541da9c05b9616247074f25f392800e0ad6c7a835d5366edf', - }, - ], - [], - [ - { - note: 'transactions#setTxHash', - op: 'add', - path: '/hash', - timestamp: 1535507564658, - value: '0x7acc4987b5c0dfa8d423798a8c561138259de1f98a62e3d52e7e83c0e0dd9fb7', - }, - ], - [ - { - note: 'txStateManager - add submitted time stamp', - op: 'add', - path: '/submittedTime', - timestamp: 1535507564660, - value: 1535507564660, - }, - ], - [ - { - note: 'txStateManager: setting status to submitted', - op: 'replace', - path: '/status', - timestamp: 1535507564665, - value: 'submitted', - }, - ], - [ - { - note: 'transactions/pending-tx-tracker#event: tx:block-update', - op: 'add', - path: '/firstRetryBlockNumber', - timestamp: 1535507575476, - value: '0x3bf624', - }, - ], - [ - { - note: 'txStateManager: setting status to confirmed', - op: 'replace', - path: '/status', - timestamp: 1535507615993, - value: 'confirmed', - }, - ], - ], - id: 1, - status: 'confirmed', - txParams: { - from: '0x1', - gas: '0x5208', - gasPrice: '0x3b9aca00', - nonce: '0xa4', - to: '0x2', - value: '0x2386f26fc10000', - }, - hash: '0xabc', - } - - const expectedResult = [ - { - 'eventKey': 'transactionCreated', - 'timestamp': 1535507561452, - 'value': '0x2386f26fc10000', - 'id': 1, - 'hash': '0xabc', - }, - { - 'eventKey': 'transactionSubmitted', - 'timestamp': 1535507564665, - 'value': '0x2632e314a000', - 'id': 1, - 'hash': '0xabc', - }, - { - 'eventKey': 'transactionConfirmed', - 'timestamp': 1535507615993, - 'value': '0x2632e314a000', - 'id': 1, - 'hash': '0xabc', - }, - ] + { + 'eventKey': 'transactionSubmitted', + 'timestamp': 1535507564665, + 'value': '0x2632e314a000', + 'id': 1, + 'hash': '0xabc', + }, + { + 'eventKey': 'transactionConfirmed', + 'timestamp': 1535507615993, + 'value': '0x2632e314a000', + 'id': 1, + 'hash': '0xabc', + }, + ] - assert.deepEqual(getActivities(transaction, true), expectedResult) + assert.deepEqual(getActivities(transaction, true), expectedResult) + }) }) }) diff --git a/ui/app/components/app/transaction-activity-log/transaction-activity-log-icon/transaction-activity-log-icon.component.js b/ui/app/components/app/transaction-activity-log/transaction-activity-log-icon/transaction-activity-log-icon.component.js index 871716002bcb..6124325be5ae 100644 --- a/ui/app/components/app/transaction-activity-log/transaction-activity-log-icon/transaction-activity-log-icon.component.js +++ b/ui/app/components/app/transaction-activity-log/transaction-activity-log-icon/transaction-activity-log-icon.component.js @@ -40,15 +40,15 @@ export default class TransactionActivityLogIcon extends PureComponent { return (
    - { - imagePath && ( - - ) - } + { + imagePath && ( + + ) + }
    ) } diff --git a/ui/app/components/app/transaction-activity-log/transaction-activity-log.component.js b/ui/app/components/app/transaction-activity-log/transaction-activity-log.component.js index de4d297506a7..9d071b43240b 100644 --- a/ui/app/components/app/transaction-activity-log/transaction-activity-log.component.js +++ b/ui/app/components/app/transaction-activity-log/transaction-activity-log.component.js @@ -3,9 +3,9 @@ import PropTypes from 'prop-types' import classnames from 'classnames' import { getEthConversionFromWeiHex, getValueFromWeiHex } from '../../../helpers/utils/conversions.util' import { formatDate } from '../../../helpers/utils/util' +import { getEtherscanNetworkPrefix } from '../../../../lib/etherscan-prefix-for-network' import TransactionActivityLogIcon from './transaction-activity-log-icon' import { CONFIRMED_STATUS } from './transaction-activity-log.constants' -import prefixForNetwork from '../../../../lib/etherscan-prefix-for-network' export default class TransactionActivityLog extends PureComponent { static contextTypes = { @@ -23,46 +23,45 @@ export default class TransactionActivityLog extends PureComponent { onCancel: PropTypes.func, onRetry: PropTypes.func, primaryTransaction: PropTypes.object, + isEarliestNonce: PropTypes.bool, } - handleActivityClick = hash => { + handleActivityClick = (hash) => { const { primaryTransaction } = this.props const { metamaskNetworkId } = primaryTransaction - const prefix = prefixForNetwork(metamaskNetworkId) + const prefix = getEtherscanNetworkPrefix(metamaskNetworkId) const etherscanUrl = `https://${prefix}etherscan.io/tx/${hash}` - global.platform.openWindow({ url: etherscanUrl }) + global.platform.openTab({ url: etherscanUrl }) } - renderInlineRetry (index, activity) { + renderInlineRetry (index) { const { t } = this.context - const { inlineRetryIndex, primaryTransaction = {}, onRetry } = this.props + const { inlineRetryIndex, primaryTransaction = {}, onRetry, isEarliestNonce } = this.props const { status } = primaryTransaction - const { id } = activity - return status !== CONFIRMED_STATUS && index === inlineRetryIndex + return isEarliestNonce && status !== CONFIRMED_STATUS && index === inlineRetryIndex ? (
    onRetry(id)} + onClick={onRetry} > { t('speedUpTransaction') }
    ) : null } - renderInlineCancel (index, activity) { + renderInlineCancel (index) { const { t } = this.context - const { inlineCancelIndex, primaryTransaction = {}, onCancel } = this.props + const { inlineCancelIndex, primaryTransaction = {}, onCancel, isEarliestNonce } = this.props const { status } = primaryTransaction - const { id } = activity - return status !== CONFIRMED_STATUS && index === inlineCancelIndex + return isEarliestNonce && status !== CONFIRMED_STATUS && index === inlineCancelIndex ? (
    onCancel(id)} + onClick={onCancel} > { t('speedUpCancellation') }
    @@ -75,14 +74,14 @@ export default class TransactionActivityLog extends PureComponent { const ethValue = index === 0 ? `${getValueFromWeiHex({ value, - fromCurrency: nativeCurrency, - toCurrency: nativeCurrency, + fromCurrency: 'ETH', + toCurrency: 'ETH', conversionRate, numberOfDecimals: 6, })} ${nativeCurrency}` : getEthConversionFromWeiHex({ value, - fromCurrency: nativeCurrency, + fromCurrency: 'ETH', conversionRate, numberOfDecimals: 3, }) @@ -106,8 +105,8 @@ export default class TransactionActivityLog extends PureComponent { > { activityText }
    - { this.renderInlineRetry(index, activity) } - { this.renderInlineCancel(index, activity) } + { this.renderInlineRetry(index) } + { this.renderInlineCancel(index) }
    ) @@ -117,6 +116,10 @@ export default class TransactionActivityLog extends PureComponent { const { t } = this.context const { className, activities } = this.props + if (activities.length === 0) { + return null + } + return (
    diff --git a/ui/app/components/app/transaction-activity-log/transaction-activity-log.container.js b/ui/app/components/app/transaction-activity-log/transaction-activity-log.container.js index 11b20f2457c8..df7a3dc20fbf 100644 --- a/ui/app/components/app/transaction-activity-log/transaction-activity-log.container.js +++ b/ui/app/components/app/transaction-activity-log/transaction-activity-log.container.js @@ -1,16 +1,16 @@ import { connect } from 'react-redux' -import R from 'ramda' +import { findLastIndex } from 'lodash' +import { conversionRateSelector, getNativeCurrency } from '../../../selectors' import TransactionActivityLog from './transaction-activity-log.component' -import { conversionRateSelector, getNativeCurrency } from '../../../selectors/selectors' import { combineTransactionHistories } from './transaction-activity-log.util' import { TRANSACTION_RESUBMITTED_EVENT, TRANSACTION_CANCEL_ATTEMPTED_EVENT, } from './transaction-activity-log.constants' -const matchesEventKey = matchEventKey => ({ eventKey }) => eventKey === matchEventKey +const matchesEventKey = (matchEventKey) => ({ eventKey }) => eventKey === matchEventKey -const mapStateToProps = state => { +const mapStateToProps = (state) => { return { conversionRate: conversionRateSelector(state), nativeCurrency: getNativeCurrency(state), @@ -27,8 +27,8 @@ const mergeProps = (stateProps, dispatchProps, ownProps) => { } = ownProps const activities = combineTransactionHistories(transactions) - const inlineRetryIndex = R.findLastIndex(matchesEventKey(TRANSACTION_RESUBMITTED_EVENT))(activities) - const inlineCancelIndex = R.findLastIndex(matchesEventKey(TRANSACTION_CANCEL_ATTEMPTED_EVENT))(activities) + const inlineRetryIndex = findLastIndex(activities, matchesEventKey(TRANSACTION_RESUBMITTED_EVENT)) + const inlineCancelIndex = findLastIndex(activities, matchesEventKey(TRANSACTION_CANCEL_ATTEMPTED_EVENT)) return { ...stateProps, diff --git a/ui/app/components/app/transaction-activity-log/transaction-activity-log.util.js b/ui/app/components/app/transaction-activity-log/transaction-activity-log.util.js index b74513879ce5..ed07e1ee48d7 100644 --- a/ui/app/components/app/transaction-activity-log/transaction-activity-log.util.js +++ b/ui/app/components/app/transaction-activity-log/transaction-activity-log.util.js @@ -1,13 +1,9 @@ import { getHexGasTotal } from '../../../helpers/utils/confirm-tx.util' -// path constants -const STATUS_PATH = '/status' -const GAS_PRICE_PATH = '/txParams/gasPrice' -const GAS_LIMIT_PATH = '/txParams/gas' - -// op constants -const REPLACE_OP = 'replace' - +import { + TRANSACTION_TYPE_CANCEL, + TRANSACTION_TYPE_RETRY, +} from '../../../../../app/scripts/controllers/transactions/enums' import { // event constants TRANSACTION_CREATED_EVENT, @@ -25,10 +21,13 @@ import { DROPPED_STATUS, } from './transaction-activity-log.constants' -import { - TRANSACTION_TYPE_CANCEL, - TRANSACTION_TYPE_RETRY, -} from '../../../../../app/scripts/controllers/transactions/enums' +// path constants +const STATUS_PATH = '/status' +const GAS_PRICE_PATH = '/txParams/gasPrice' +const GAS_LIMIT_PATH = '/txParams/gas' + +// op constants +const REPLACE_OP = 'replace' const eventPathsHash = { [STATUS_PATH]: true, @@ -55,7 +54,7 @@ export function getActivities (transaction, isFirstTransaction = false) { id, hash, history = [], - txParams: { gas: paramsGasLimit, gasPrice: paramsGasPrice}, + txParams: { gas: paramsGasLimit, gasPrice: paramsGasPrice }, xReceipt: { status } = {}, type, } = transaction @@ -86,11 +85,11 @@ export function getActivities (transaction, isFirstTransaction = false) { } else if (Array.isArray(base)) { const events = [] - base.forEach(entry => { + base.forEach((entry) => { const { op, path, value, timestamp: entryTimestamp } = entry // Not all sub-entries in a history entry have a timestamp. If the sub-entry does not have a // timestamp, the first sub-entry in a history entry should. - const timestamp = entryTimestamp || base[0] && base[0].timestamp + const timestamp = entryTimestamp || (base[0] && base[0].timestamp) if (path in eventPathsHash && op === REPLACE_OP) { switch (path) { @@ -171,7 +170,7 @@ export function getActivities (transaction, isFirstTransaction = false) { return acc }, []) - // If txReceipt.status is '0x0', that means that an on-chain error occured for the transaction, + // If txReceipt.status is '0x0', that means that an on-chain error occurred for the transaction, // so we add an error entry to the Activity Log. return status === '0x0' ? historyActivities.concat({ id, hash, eventKey: TRANSACTION_ERRORED_EVENT }) @@ -194,7 +193,7 @@ function filterSortedActivities (activities) { ))) let addedDroppedActivity = false - activities.forEach(activity => { + activities.forEach((activity) => { if (activity.eventKey === TRANSACTION_DROPPED_EVENT) { if (!hasConfirmedActivity && !addedDroppedActivity) { filteredActivities.push(activity) diff --git a/ui/app/components/app/transaction-breakdown/index.scss b/ui/app/components/app/transaction-breakdown/index.scss index c8144eac2094..7df517d1b886 100644 --- a/ui/app/components/app/transaction-breakdown/index.scss +++ b/ui/app/components/app/transaction-breakdown/index.scss @@ -12,6 +12,8 @@ } &__value { + display: flex; + justify-content: flex-end; text-align: end; white-space: nowrap; overflow: hidden; diff --git a/ui/app/components/app/transaction-breakdown/tests/transaction-breakdown.component.test.js b/ui/app/components/app/transaction-breakdown/tests/transaction-breakdown.component.test.js index 4512b84f0db5..608ba34b9ae8 100644 --- a/ui/app/components/app/transaction-breakdown/tests/transaction-breakdown.component.test.js +++ b/ui/app/components/app/transaction-breakdown/tests/transaction-breakdown.component.test.js @@ -1,10 +1,10 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { shallow } from 'enzyme' import TransactionBreakdown from '../transaction-breakdown.component' -describe('TransactionBreakdown Component', () => { - it('should render properly', () => { +describe('TransactionBreakdown Component', function () { + it('should render properly', function () { const transaction = { history: [], id: 1, @@ -24,7 +24,7 @@ describe('TransactionBreakdown Component', () => { transaction={transaction} className="test-class" />, - { context: { t: (str1, str2) => str2 ? str1 + str2 : str1 } } + { context: { t: (str1, str2) => (str2 ? str1 + str2 : str1) } }, ) assert.ok(wrapper.hasClass('transaction-breakdown')) diff --git a/ui/app/components/app/transaction-breakdown/transaction-breakdown-row/index.scss b/ui/app/components/app/transaction-breakdown/transaction-breakdown-row/index.scss index 8c73be1a6ce7..b36dc48c8422 100644 --- a/ui/app/components/app/transaction-breakdown/transaction-breakdown-row/index.scss +++ b/ui/app/components/app/transaction-breakdown/transaction-breakdown-row/index.scss @@ -1,5 +1,5 @@ .transaction-breakdown-row { - font-size: .75rem; + font-size: 0.75rem; color: $scorpion; display: flex; justify-content: space-between; diff --git a/ui/app/components/app/transaction-breakdown/transaction-breakdown-row/tests/transaction-breakdown-row.component.test.js b/ui/app/components/app/transaction-breakdown/transaction-breakdown-row/tests/transaction-breakdown-row.component.test.js index 82e40fce2d5f..f25773e58fd2 100644 --- a/ui/app/components/app/transaction-breakdown/transaction-breakdown-row/tests/transaction-breakdown-row.component.test.js +++ b/ui/app/components/app/transaction-breakdown/transaction-breakdown-row/tests/transaction-breakdown-row.component.test.js @@ -1,11 +1,11 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { shallow } from 'enzyme' import TransactionBreakdownRow from '../transaction-breakdown-row.component' import Button from '../../../../ui/button' -describe('TransactionBreakdownRow Component', () => { - it('should render text properly', () => { +describe('TransactionBreakdownRow Component', function () { + it('should render text properly', function () { const wrapper = shallow( { > Test , - { context: { t: (str1, str2) => str2 ? str1 + str2 : str1 } } + { context: { t: (str1, str2) => (str2 ? str1 + str2 : str1) } }, ) assert.ok(wrapper.hasClass('transaction-breakdown-row')) @@ -21,15 +21,15 @@ describe('TransactionBreakdownRow Component', () => { assert.equal(wrapper.find('.transaction-breakdown-row__value').text(), 'Test') }) - it('should render components properly', () => { + it('should render components properly', function () { const wrapper = shallow( - + , - { context: { t: (str1, str2) => str2 ? str1 + str2 : str1 } } + { context: { t: (str1, str2) => (str2 ? str1 + str2 : str1) } }, ) assert.ok(wrapper.hasClass('transaction-breakdown-row')) diff --git a/ui/app/components/app/transaction-breakdown/transaction-breakdown.component.js b/ui/app/components/app/transaction-breakdown/transaction-breakdown.component.js index 5642e0fa528e..7e99f02c32a8 100644 --- a/ui/app/components/app/transaction-breakdown/transaction-breakdown.component.js +++ b/ui/app/components/app/transaction-breakdown/transaction-breakdown.component.js @@ -1,11 +1,11 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' -import TransactionBreakdownRow from './transaction-breakdown-row' import CurrencyDisplay from '../../ui/currency-display' import UserPreferencedCurrencyDisplay from '../user-preferenced-currency-display' import HexToDecimal from '../../ui/hex-to-decimal' import { GWEI, PRIMARY, SECONDARY } from '../../../helpers/constants/common' +import TransactionBreakdownRow from './transaction-breakdown-row' export default class TransactionBreakdown extends PureComponent { static contextTypes = { @@ -13,10 +13,10 @@ export default class TransactionBreakdown extends PureComponent { } static propTypes = { - transaction: PropTypes.object, className: PropTypes.string, - nativeCurrency: PropTypes.string.isRequired, + nativeCurrency: PropTypes.string, showFiat: PropTypes.bool, + nonce: PropTypes.string, gas: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), gasPrice: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), @@ -25,19 +25,28 @@ export default class TransactionBreakdown extends PureComponent { } static defaultProps = { - transaction: {}, showFiat: true, } render () { const { t } = this.context - const { gas, gasPrice, value, className, nativeCurrency, showFiat, totalInHex, gasUsed } = this.props - + const { gas, gasPrice, value, className, nonce, nativeCurrency, showFiat, totalInHex, gasUsed } = this.props return (
    { t('transaction') }
    + + {typeof nonce === 'undefined' + ? null + : ( + + ) + } + - {typeof gas !== 'undefined' - ? - : '?' + {typeof gas === 'undefined' + ? '?' + : ( + + ) } { @@ -71,15 +82,18 @@ export default class TransactionBreakdown extends PureComponent { ) } - {typeof gasPrice !== 'undefined' - ? - : '?' + {typeof gasPrice === 'undefined' + ? '?' + : ( + + ) } diff --git a/ui/app/components/app/transaction-breakdown/transaction-breakdown.container.js b/ui/app/components/app/transaction-breakdown/transaction-breakdown.container.js index 82f3773589f8..6aee276a72b7 100644 --- a/ui/app/components/app/transaction-breakdown/transaction-breakdown.container.js +++ b/ui/app/components/app/transaction-breakdown/transaction-breakdown.container.js @@ -1,23 +1,23 @@ import { connect } from 'react-redux' -import TransactionBreakdown from './transaction-breakdown.component' -import {getIsMainnet, getNativeCurrency, preferencesSelector} from '../../../selectors/selectors' +import { getIsMainnet, getNativeCurrency, getPreferences } from '../../../selectors' import { getHexGasTotal } from '../../../helpers/utils/confirm-tx.util' import { sumHexes } from '../../../helpers/utils/transactions.util' +import TransactionBreakdown from './transaction-breakdown.component' const mapStateToProps = (state, ownProps) => { const { transaction } = ownProps const { txParams: { gas, gasPrice, value } = {}, txReceipt: { gasUsed } = {} } = transaction - const { showFiatInTestnets } = preferencesSelector(state) + const { showFiatInTestnets } = getPreferences(state) const isMainnet = getIsMainnet(state) const gasLimit = typeof gasUsed === 'string' ? gasUsed : gas - const hexGasTotal = gasLimit && gasPrice && getHexGasTotal({ gasLimit, gasPrice }) || '0x0' + const hexGasTotal = (gasLimit && gasPrice && getHexGasTotal({ gasLimit, gasPrice })) || '0x0' const totalInHex = sumHexes(hexGasTotal, value) return { nativeCurrency: getNativeCurrency(state), - showFiat: (isMainnet || !!showFiatInTestnets), + showFiat: (isMainnet || Boolean(showFiatInTestnets)), totalInHex, gas, gasPrice, diff --git a/ui/app/components/app/transaction-icon/index.js b/ui/app/components/app/transaction-icon/index.js new file mode 100644 index 000000000000..d41970a54f59 --- /dev/null +++ b/ui/app/components/app/transaction-icon/index.js @@ -0,0 +1 @@ +export { default } from './transaction-icon' diff --git a/ui/app/components/app/transaction-icon/transaction-icon.js b/ui/app/components/app/transaction-icon/transaction-icon.js new file mode 100644 index 000000000000..d0c7ef455d26 --- /dev/null +++ b/ui/app/components/app/transaction-icon/transaction-icon.js @@ -0,0 +1,57 @@ +import React from 'react' +import PropTypes from 'prop-types' +import Approve from '../../ui/icon/approve-icon.component' +import Interaction from '../../ui/icon/interaction-icon.component' +import Receive from '../../ui/icon/receive-icon.component' +import Send from '../../ui/icon/send-icon.component' +import Sign from '../../ui/icon/sign-icon.component' +import { + TRANSACTION_CATEGORY_APPROVAL, + TRANSACTION_CATEGORY_SIGNATURE_REQUEST, + TRANSACTION_CATEGORY_INTERACTION, + TRANSACTION_CATEGORY_SEND, + TRANSACTION_CATEGORY_RECEIVE, + UNAPPROVED_STATUS, + FAILED_STATUS, + REJECTED_STATUS, + CANCELLED_STATUS, + DROPPED_STATUS, + SUBMITTED_STATUS, + APPROVED_STATUS, +} from '../../../helpers/constants/transactions' + +const ICON_MAP = { + [TRANSACTION_CATEGORY_APPROVAL]: Approve, + [TRANSACTION_CATEGORY_INTERACTION]: Interaction, + [TRANSACTION_CATEGORY_SEND]: Send, + [TRANSACTION_CATEGORY_SIGNATURE_REQUEST]: Sign, + [TRANSACTION_CATEGORY_RECEIVE]: Receive, +} + +const FAIL_COLOR = '#D73A49' +const PENDING_COLOR = '#6A737D' +const OK_COLOR = '#2F80ED' + +const COLOR_MAP = { + [SUBMITTED_STATUS]: PENDING_COLOR, + [UNAPPROVED_STATUS]: PENDING_COLOR, + [APPROVED_STATUS]: PENDING_COLOR, + [FAILED_STATUS]: FAIL_COLOR, + [REJECTED_STATUS]: FAIL_COLOR, + [CANCELLED_STATUS]: FAIL_COLOR, + [DROPPED_STATUS]: FAIL_COLOR, +} + +export default function TransactionIcon ({ status, category }) { + + const color = COLOR_MAP[status] || OK_COLOR + + const Icon = ICON_MAP[category] + + return +} + +TransactionIcon.propTypes = { + status: PropTypes.string.isRequired, + category: PropTypes.string.isRequired, +} diff --git a/ui/app/components/app/transaction-list-item-details/index.js b/ui/app/components/app/transaction-list-item-details/index.js index 0e878d032923..83bd53e7d50e 100644 --- a/ui/app/components/app/transaction-list-item-details/index.js +++ b/ui/app/components/app/transaction-list-item-details/index.js @@ -1 +1 @@ -export { default } from './transaction-list-item-details.component' +export { default } from './transaction-list-item-details.container' diff --git a/ui/app/components/app/transaction-list-item-details/index.scss b/ui/app/components/app/transaction-list-item-details/index.scss index 7cb253e4e8b0..145e0e9a18f0 100644 --- a/ui/app/components/app/transaction-list-item-details/index.scss +++ b/ui/app/components/app/transaction-list-item-details/index.scss @@ -16,17 +16,12 @@ flex-direction: row; } - &__header-button { - font-size: .625rem; + & &__header-button { + font-size: 0.625rem; &:not(:last-child) { margin-right: 8px; } - - &__copy-icon { - width: 10px; - height: 10px; - } } &__sender-to-recipient-container { @@ -35,29 +30,19 @@ &__cards-container { display: flex; - flex-direction: row; - - @media screen and (max-width: $break-small) { - flex-direction: column; - } + flex-direction: column; } &__transaction-breakdown { flex: 1; margin-right: 8px; min-width: 0; - - @media screen and (max-width: $break-small) { - margin: 0 0 8px 0; - } + margin: 0 0 8px 0; } &__transaction-activity-log { flex: 2; min-width: 0; - - @media screen and (min-width: $break-large) { - padding-left: 12px; - } + padding-left: 12px; } } diff --git a/ui/app/components/app/transaction-list-item-details/tests/transaction-list-item-details.component.test.js b/ui/app/components/app/transaction-list-item-details/tests/transaction-list-item-details.component.test.js index c4e118b01354..d647362f5c4d 100644 --- a/ui/app/components/app/transaction-list-item-details/tests/transaction-list-item-details.component.test.js +++ b/ui/app/components/app/transaction-list-item-details/tests/transaction-list-item-details.component.test.js @@ -1,5 +1,5 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { shallow } from 'enzyme' import TransactionListItemDetails from '../transaction-list-item-details.component' import Button from '../../../ui/button' @@ -7,8 +7,8 @@ import SenderToRecipient from '../../../ui/sender-to-recipient' import TransactionBreakdown from '../../transaction-breakdown' import TransactionActivityLog from '../../transaction-activity-log' -describe('TransactionListItemDetails Component', () => { - it('should render properly', () => { +describe('TransactionListItemDetails Component', function () { + it('should render properly', function () { const transaction = { history: [], id: 1, @@ -31,19 +31,25 @@ describe('TransactionListItemDetails Component', () => { const wrapper = shallow( undefined} transactionGroup={transactionGroup} + senderNickname="sender-nickname" + recipientNickname="recipient-nickname" />, - { context: { t: (str1, str2) => str2 ? str1 + str2 : str1 } } + { context: { t: (str1, str2) => (str2 ? str1 + str2 : str1) } }, ) - - assert.ok(wrapper.hasClass('transaction-list-item-details')) - assert.equal(wrapper.find(Button).length, 2) - assert.equal(wrapper.find(SenderToRecipient).length, 1) - assert.equal(wrapper.find(TransactionBreakdown).length, 1) - assert.equal(wrapper.find(TransactionActivityLog).length, 1) + const child = wrapper.childAt(0) + assert.ok(child.hasClass('transaction-list-item-details')) + assert.equal(child.find(Button).length, 2) + assert.equal(child.find(SenderToRecipient).length, 1) + assert.equal(child.find(TransactionBreakdown).length, 1) + assert.equal(child.find(TransactionActivityLog).length, 1) }) - it('should render a retry button', () => { + it('should render a retry button', function () { const transaction = { history: [], id: 1, @@ -69,13 +75,103 @@ describe('TransactionListItemDetails Component', () => { const wrapper = shallow( undefined} + transactionGroup={transactionGroup} + showSpeedUp + senderNickname="sender-nickname" + recipientNickname="recipient-nickname" + />, + { context: { t: (str1, str2) => (str2 ? str1 + str2 : str1) } }, + ) + + const child = wrapper.childAt(0) + + assert.ok(child.hasClass('transaction-list-item-details')) + assert.equal(child.find(Button).length, 3) + }) + + it('should disable the Copy Tx ID and View In Etherscan buttons when tx hash is missing', function () { + const transaction = { + history: [], + id: 1, + status: 'confirmed', + txParams: { + from: '0x1', + gas: '0x5208', + gasPrice: '0x3b9aca00', + nonce: '0xa4', + to: '0x2', + value: '0x2386f26fc10000', + }, + } + + const transactionGroup = { + transactions: [transaction], + primaryTransaction: transaction, + initialTransaction: transaction, + } + + const wrapper = shallow( + undefined} transactionGroup={transactionGroup} - showRetry={true} + senderNickname="sender-nickname" + recipientNickname="recipient-nickname" />, - { context: { t: (str1, str2) => str2 ? str1 + str2 : str1 } } + { context: { t: (str1, str2) => (str2 ? str1 + str2 : str1) } }, ) - assert.ok(wrapper.hasClass('transaction-list-item-details')) - assert.equal(wrapper.find(Button).length, 3) + const child = wrapper.childAt(0) + + assert.ok(child.hasClass('transaction-list-item-details')) + const buttons = child.find(Button) + assert.strictEqual(buttons.at(0).prop('disabled'), true) + assert.strictEqual(buttons.at(1).prop('disabled'), true) + }) + + it('should render functional Copy Tx ID and View In Etherscan buttons when tx hash exists', function () { + const transaction = { + history: [], + id: 1, + status: 'confirmed', + hash: '0xaa', + txParams: { + from: '0x1', + gas: '0x5208', + gasPrice: '0x3b9aca00', + nonce: '0xa4', + to: '0x2', + value: '0x2386f26fc10000', + }, + } + + const transactionGroup = { + transactions: [transaction], + primaryTransaction: transaction, + initialTransaction: transaction, + } + + const wrapper = shallow( + undefined} + transactionGroup={transactionGroup} + senderNickname="sender-nickname" + recipientNickname="recipient-nickname" + />, + { context: { t: (str1, str2) => (str2 ? str1 + str2 : str1) } }, + ) + + const child = wrapper.childAt(0) + + assert.ok(child.hasClass('transaction-list-item-details')) + const buttons = child.find(Button) + assert.strictEqual(buttons.at(0).prop('disabled'), false) + assert.strictEqual(buttons.at(1).prop('disabled'), false) }) }) diff --git a/ui/app/components/app/transaction-list-item-details/transaction-list-item-details.component.js b/ui/app/components/app/transaction-list-item-details/transaction-list-item-details.component.js index 72ca784e224b..cfd2aecfddd9 100644 --- a/ui/app/components/app/transaction-list-item-details/transaction-list-item-details.component.js +++ b/ui/app/components/app/transaction-list-item-details/transaction-list-item-details.component.js @@ -10,6 +10,8 @@ import TransactionActivityLog from '../transaction-activity-log' import TransactionBreakdown from '../transaction-breakdown' import Button from '../../ui/button' import Tooltip from '../../ui/tooltip' +import Copy from '../../ui/icon/copy-icon.component' +import Popover from '../../ui/popover' export default class TransactionListItemDetails extends PureComponent { static contextTypes = { @@ -17,19 +19,32 @@ export default class TransactionListItemDetails extends PureComponent { metricsEvent: PropTypes.func, } + static defaultProps = { + recipientEns: null, + } + static propTypes = { onCancel: PropTypes.func, onRetry: PropTypes.func, showCancel: PropTypes.bool, + showSpeedUp: PropTypes.bool, showRetry: PropTypes.bool, + isEarliestNonce: PropTypes.bool, cancelDisabled: PropTypes.bool, transactionGroup: PropTypes.object, + title: PropTypes.string.isRequired, + onClose: PropTypes.func.isRequired, + recipientEns: PropTypes.string, + recipientAddress: PropTypes.string, rpcPrefs: PropTypes.object, + senderAddress: PropTypes.string.isRequired, + tryReverseResolveAddress: PropTypes.func.isRequired, + senderNickname: PropTypes.string.isRequired, + recipientNickname: PropTypes.string, } state = { justCopied: false, - cancelDisabled: false, } handleEtherscanClick = () => { @@ -44,25 +59,23 @@ export default class TransactionListItemDetails extends PureComponent { }, }) - global.platform.openWindow({ url: getBlockExplorerUrlForTx(metamaskNetworkId, hash, rpcPrefs) }) + global.platform.openTab({ url: getBlockExplorerUrlForTx(metamaskNetworkId, hash, rpcPrefs) }) } - handleCancel = event => { - const { transactionGroup: { initialTransaction: { id } = {} } = {}, onCancel } = this.props - - event.stopPropagation() - onCancel(id) + handleCancel = (event) => { + const { onCancel, onClose } = this.props + onCancel(event) + onClose() } - handleRetry = event => { - const { transactionGroup: { initialTransaction: { id } = {} } = {}, onRetry } = this.props - - event.stopPropagation() - onRetry(id) + handleRetry = (event) => { + const { onClose, onRetry } = this.props + onRetry(event) + onClose() } handleCopyTxId = () => { - const { transactionGroup} = this.props + const { transactionGroup } = this.props const { primaryTransaction: transaction } = transactionGroup const { hash } = transaction @@ -80,6 +93,14 @@ export default class TransactionListItemDetails extends PureComponent { }) } + componentDidMount () { + const { recipientAddress, tryReverseResolveAddress } = this.props + + if (recipientAddress) { + tryReverseResolveAddress(recipientAddress) + } + } + renderCancel () { const { t } = this.context const { @@ -93,7 +114,7 @@ export default class TransactionListItemDetails extends PureComponent { return cancelDisabled ? ( - +
    + ) + } + { this.renderCancel() } + - ) - } - { this.renderCancel() } - - - - - - -
    -
    -
    -
    - { - this.context.metricsEvent({ - eventOpts: { - category: 'Navigation', - action: 'Activity Log', - name: 'Copied "To" Address', - }, - }) - }} - onSenderClick={() => { - this.context.metricsEvent({ - eventOpts: { - category: 'Navigation', - action: 'Activity Log', - name: 'Copied "From" Address', - }, - }) - }} - /> + + + + { + showRetry && ( + + + + ) + } +
    -
    - - +
    +
    + { + this.context.metricsEvent({ + eventOpts: { + category: 'Navigation', + action: 'Activity Log', + name: 'Copied "To" Address', + }, + }) + }} + onSenderClick={() => { + this.context.metricsEvent({ + eventOpts: { + category: 'Navigation', + action: 'Activity Log', + name: 'Copied "From" Address', + }, + }) + }} + /> +
    +
    + + +
    -
    + ) } } diff --git a/ui/app/components/app/transaction-list-item-details/transaction-list-item-details.container.js b/ui/app/components/app/transaction-list-item-details/transaction-list-item-details.container.js new file mode 100644 index 000000000000..6bea44d2a15e --- /dev/null +++ b/ui/app/components/app/transaction-list-item-details/transaction-list-item-details.container.js @@ -0,0 +1,44 @@ +import { connect } from 'react-redux' +import { checksumAddress } from '../../../helpers/utils/util' +import { tryReverseResolveAddress } from '../../../store/actions' +import { getAddressBook, getRpcPrefsForCurrentProvider } from '../../../selectors' +import TransactionListItemDetails from './transaction-list-item-details.component' + +const mapStateToProps = (state, ownProps) => { + const { metamask } = state + const { + ensResolutionsByAddress, + } = metamask + const { recipientAddress, senderAddress } = ownProps + let recipientEns + if (recipientAddress) { + const address = checksumAddress(recipientAddress) + recipientEns = ensResolutionsByAddress[address] || '' + } + const addressBook = getAddressBook(state) + + const getNickName = (address) => { + const entry = addressBook.find((contact) => { + return address.toLowerCase() === contact.address.toLowerCase() + }) + return (entry && entry.name) || '' + } + const rpcPrefs = getRpcPrefsForCurrentProvider(state) + + return { + rpcPrefs, + recipientEns, + senderNickname: getNickName(senderAddress), + recipientNickname: recipientAddress ? getNickName(recipientAddress) : null, + } +} + +const mapDispatchToProps = (dispatch) => { + return { + tryReverseResolveAddress: (address) => { + return dispatch(tryReverseResolveAddress(address)) + }, + } +} + +export default connect(mapStateToProps, mapDispatchToProps)(TransactionListItemDetails) diff --git a/ui/app/components/app/transaction-list-item/index.js b/ui/app/components/app/transaction-list-item/index.js index 697cc55e9da1..1fdbb29ac267 100644 --- a/ui/app/components/app/transaction-list-item/index.js +++ b/ui/app/components/app/transaction-list-item/index.js @@ -1 +1 @@ -export { default } from './transaction-list-item.container' +export { default } from './transaction-list-item.component' diff --git a/ui/app/components/app/transaction-list-item/index.scss b/ui/app/components/app/transaction-list-item/index.scss index 4dba4b2c3ec3..53ab7dc945bb 100644 --- a/ui/app/components/app/transaction-list-item/index.scss +++ b/ui/app/components/app/transaction-list-item/index.scss @@ -1,134 +1,60 @@ .transaction-list-item { - box-sizing: border-box; - min-height: 74px; - border-bottom: 1px solid $Grey-100; - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - background: $white; - - &__grid { - cursor: pointer; - width: 100%; - padding: 16px 20px; - display: grid; - grid-template-columns: 45px 1fr 1fr 1fr; - grid-template-areas: - "identicon action status primary-amount" - "identicon nonce status secondary-amount"; - - @media screen and (max-width: $break-small) { - padding: .5rem 1rem; - grid-template-columns: 45px 5fr 3fr; - grid-template-areas: - "nonce nonce nonce" - "identicon action primary-amount" - "identicon status secondary-amount"; - } - - &:hover { - background: rgba($alto, .2); - } + &__primary-currency { + color: $Black-100; } - &__identicon { - grid-area: identicon; - grid-row: 1 / span 2; - align-self: center; + &__secondary-currency { + font-size: 12px; + margin-top: 4px; + color: $Grey-500; + } - @media screen and (max-width: $break-small) { - grid-row: 2 / span 2; - } + & &--unconfirmed { + color: $Grey-500; } - &__action { - text-transform: capitalize; - padding: 0 0 4px 0; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - grid-area: action; - color: $Grey-800; - line-height: 20px; + &--unconfirmed &__primary-currency { + color: $Grey-500; } - &__status { - grid-area: status; - grid-row: 1 / span 2; - align-self: center; + &__pending-actions { + padding-top: 12px; + display: flex; - @media screen and (max-width: $break-small) { - grid-row: 3; + .button { + font-size: 0.625rem; + padding: 8px; + width: 75px; + white-space: nowrap; + line-height: 1rem; } - } - - &__nonce { - font-size: .75rem; - color: #5e6064; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - grid-area: nonce; - align-self: start; - @media screen and (max-width: $break-small) { - padding-bottom: 8px; - line-height: 12px; + &:empty { + padding-top: 0; } } - &__amount { + .list-item__subheading > h3 { + overflow: visible; + display: flex; white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - min-width: 0; - max-width: 100%; - - &--primary { - text-align: end; - grid-area: primary-amount; - align-self: end; - justify-self: end; - line-height: 20px; - - @media screen and (max-width: $break-small) { - padding-bottom: 4px; - height: 100%; - color: $Grey-800; - } - } - - &--secondary { - text-align: end; - font-size: .75rem; - grid-area: secondary-amount; - align-self: start; - justify-self: end; - color: $Grey-500; - } + text-overflow: initial; } - &__retry { - background: #d1edff; - border-radius: 12px; - font-size: .75rem; - padding: 4px 12px; - cursor: pointer; - margin-top: 8px; - - @media screen and (max-width: $break-small) { - font-size: .5rem; - } + .transaction-status::after { + content: "·"; + margin: 0 4px; } - &__expander { - max-height: 0px; - width: 100%; + &__origin, + &__address { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } - &--show { - max-height: 1000px; - transition: max-height 700ms ease-out; - } + &__origin { + /*rtl:ignore*/ + direction: rtl; } } diff --git a/ui/app/components/app/transaction-list-item/transaction-list-item.component.js b/ui/app/components/app/transaction-list-item/transaction-list-item.component.js index 8bdb6a313be6..0b64678ff78d 100644 --- a/ui/app/components/app/transaction-list-item/transaction-list-item.component.js +++ b/ui/app/components/app/transaction-list-item/transaction-list-item.component.js @@ -1,238 +1,177 @@ -import React, { PureComponent } from 'react' +import React, { useMemo, useState, useCallback } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' -import Identicon from '../../ui/identicon' -import TransactionStatus from '../transaction-status' -import TransactionAction from '../transaction-action' -import UserPreferencedCurrencyDisplay from '../user-preferenced-currency-display' -import TokenCurrencyDisplay from '../../ui/token-currency-display' +import { useHistory } from 'react-router-dom' +import ListItem from '../../ui/list-item' +import { useTransactionDisplayData } from '../../../hooks/useTransactionDisplayData' +import Preloader from '../../ui/icon/preloader' +import { useI18nContext } from '../../../hooks/useI18nContext' +import { useCancelTransaction } from '../../../hooks/useCancelTransaction' +import { useRetryTransaction } from '../../../hooks/useRetryTransaction' +import Button from '../../ui/button' +import Tooltip from '../../ui/tooltip' import TransactionListItemDetails from '../transaction-list-item-details' import { CONFIRM_TRANSACTION_ROUTE } from '../../../helpers/constants/routes' -import { UNAPPROVED_STATUS, TOKEN_METHOD_TRANSFER } from '../../../helpers/constants/transactions' -import { PRIMARY, SECONDARY } from '../../../helpers/constants/common' -import { getStatusKey } from '../../../helpers/utils/transactions.util' - -export default class TransactionListItem extends PureComponent { - static propTypes = { - assetImages: PropTypes.object, - history: PropTypes.object, - methodData: PropTypes.object, - nonceAndDate: PropTypes.string, - primaryTransaction: PropTypes.object, - retryTransaction: PropTypes.func, - setSelectedToken: PropTypes.func, - showCancelModal: PropTypes.func, - showCancel: PropTypes.bool, - hasEnoughCancelGas: PropTypes.bool, - showRetry: PropTypes.bool, - showFiat: PropTypes.bool, - token: PropTypes.object, - tokenData: PropTypes.object, - transaction: PropTypes.object, - transactionGroup: PropTypes.object, - value: PropTypes.string, - fetchBasicGasAndTimeEstimates: PropTypes.func, - fetchGasEstimates: PropTypes.func, - rpcPrefs: PropTypes.object, - data: PropTypes.string, - getContractMethodData: PropTypes.func, - } - - static defaultProps = { - showFiat: true, - } - - static contextTypes = { - metricsEvent: PropTypes.func, - } - - state = { - showTransactionDetails: false, - } - - handleClick = () => { - const { - transaction, - history, - } = this.props - const { id, status } = transaction - const { showTransactionDetails } = this.state - - if (status === UNAPPROVED_STATUS) { +import { + TRANSACTION_CATEGORY_SIGNATURE_REQUEST, + UNAPPROVED_STATUS, + TRANSACTION_CATEGORY_APPROVAL, + FAILED_STATUS, + DROPPED_STATUS, + REJECTED_STATUS, +} from '../../../helpers/constants/transactions' +import { useShouldShowSpeedUp } from '../../../hooks/useShouldShowSpeedUp' +import TransactionStatus from '../transaction-status/transaction-status.component' +import TransactionIcon from '../transaction-icon' +import { useTransactionTimeRemaining } from '../../../hooks/useTransactionTimeRemaining' +import IconWithLabel from '../../ui/icon-with-label' + +export default function TransactionListItem ({ transactionGroup, isEarliestNonce = false }) { + const t = useI18nContext() + const history = useHistory() + const { hasCancelled } = transactionGroup + const [showDetails, setShowDetails] = useState(false) + + const { initialTransaction: { id }, primaryTransaction: { err, submittedTime, gasPrice } } = transactionGroup + const [cancelEnabled, cancelTransaction] = useCancelTransaction(transactionGroup) + const retryTransaction = useRetryTransaction(transactionGroup) + const shouldShowSpeedUp = useShouldShowSpeedUp(transactionGroup, isEarliestNonce) + + const { + title, + subtitle, + subtitleContainsOrigin, + date, + category, + primaryCurrency, + recipientAddress, + secondaryCurrency, + status, + isPending, + senderAddress, + } = useTransactionDisplayData(transactionGroup) + + const timeRemaining = useTransactionTimeRemaining(isPending, isEarliestNonce, submittedTime, gasPrice) + + const isSignatureReq = category === TRANSACTION_CATEGORY_SIGNATURE_REQUEST + const isApproval = category === TRANSACTION_CATEGORY_APPROVAL + const isUnapproved = status === UNAPPROVED_STATUS + + const className = classnames('transaction-list-item', { + 'transaction-list-item--unconfirmed': isPending || [FAILED_STATUS, DROPPED_STATUS, REJECTED_STATUS].includes(status), + }) + + const toggleShowDetails = useCallback(() => { + if (isUnapproved) { history.push(`${CONFIRM_TRANSACTION_ROUTE}/${id}`) return } - - if (!showTransactionDetails) { - this.context.metricsEvent({ - eventOpts: { - category: 'Navigation', - action: 'Home', - name: 'Expand Transaction', - }, - }) - } - - this.setState({ showTransactionDetails: !showTransactionDetails }) - } - - handleCancel = id => { - const { - primaryTransaction: { txParams: { gasPrice } } = {}, - transaction: { id: initialTransactionId }, - showCancelModal, - } = this.props - - const cancelId = id || initialTransactionId - showCancelModal(cancelId, gasPrice) - } - - /** - * @name handleRetry - * @description Resubmits a transaction. Retrying a transaction within a list of transactions with - * the same nonce requires keeping the original value while increasing the gas price of the latest - * transaction. - * @param {number} id - Transaction id - */ - handleRetry = id => { - const { - primaryTransaction: { txParams: { gasPrice } } = {}, - transaction: { txParams: { to } = {}, id: initialTransactionId }, - methodData: { name } = {}, - setSelectedToken, - retryTransaction, - fetchBasicGasAndTimeEstimates, - fetchGasEstimates, - } = this.props - - if (name === TOKEN_METHOD_TRANSFER) { - setSelectedToken(to) + setShowDetails((prev) => !prev) + }, [isUnapproved, history, id]) + + const cancelButton = useMemo(() => { + const btn = ( + + ) + if (hasCancelled || !isPending || isUnapproved) { + return null } - const retryId = id || initialTransactionId - - return fetchBasicGasAndTimeEstimates() - .then(basicEstimates => fetchGasEstimates(basicEstimates.blockTime)) - .then(retryTransaction(retryId, gasPrice)) - } - - renderPrimaryCurrency () { - const { token, primaryTransaction: { txParams: { data } = {} } = {}, value } = this.props - - return token - ? ( - - ) : ( - - ) - } - - renderSecondaryCurrency () { - const { token, value, showFiat } = this.props - - return token || !showFiat - ? null + return cancelEnabled + ? btn : ( - + +
    + {btn} +
    +
    ) - } - - componentDidMount () { - if (this.props.data) { - this.props.getContractMethodData(this.props.data) - } - } - render () { - const { - assetImages, - transaction, - methodData, - nonceAndDate, - primaryTransaction, - showCancel, - hasEnoughCancelGas, - showRetry, - tokenData, - transactionGroup, - rpcPrefs, - } = this.props - const { txParams = {} } = transaction - const { showTransactionDetails } = this.state - const toAddress = tokenData - ? tokenData.params && tokenData.params[0] && tokenData.params[0].value || txParams.to - : txParams.to + }, [isPending, t, isUnapproved, cancelEnabled, cancelTransaction, hasCancelled]) + const speedUpButton = useMemo(() => { + if (!shouldShowSpeedUp || !isPending || isUnapproved) { + return null + } return ( -
    -
    - - -
    - { nonceAndDate } -
    - + { t('speedUp') } + + ) + }, [shouldShowSpeedUp, isUnapproved, t, isPending, retryTransaction]) + + return ( + <> + } + label={timeRemaining} /> - { this.renderPrimaryCurrency() } - { this.renderSecondaryCurrency() } -
    -
    - { - showTransactionDetails && ( -
    - -
    - ) - } + )} + icon={} + subtitle={( +

    + + + {subtitle} + +

    + )} + rightContent={!isSignatureReq && !isApproval && ( + <> +

    {primaryCurrency}

    +

    {secondaryCurrency}

    + + )} + > +
    + {speedUpButton} + {cancelButton}
    -
    - ) - } + + {showDetails && ( + + )} + + ) +} + +TransactionListItem.propTypes = { + transactionGroup: PropTypes.object.isRequired, + isEarliestNonce: PropTypes.bool, } diff --git a/ui/app/components/app/transaction-list-item/transaction-list-item.container.js b/ui/app/components/app/transaction-list-item/transaction-list-item.container.js deleted file mode 100644 index 1675958aa9f2..000000000000 --- a/ui/app/components/app/transaction-list-item/transaction-list-item.container.js +++ /dev/null @@ -1,99 +0,0 @@ -import { connect } from 'react-redux' -import { withRouter } from 'react-router-dom' -import { compose } from 'recompose' -import TransactionListItem from './transaction-list-item.component' -import { setSelectedToken, showModal, showSidebar, getContractMethodData } from '../../../store/actions' -import { hexToDecimal } from '../../../helpers/utils/conversions.util' -import { getTokenData } from '../../../helpers/utils/transactions.util' -import { getHexGasTotal, increaseLastGasPrice } from '../../../helpers/utils/confirm-tx.util' -import { formatDate } from '../../../helpers/utils/util' -import { - fetchBasicGasAndTimeEstimates, - fetchGasEstimates, - setCustomGasPriceForRetry, - setCustomGasLimit, -} from '../../../ducks/gas/gas.duck' -import { getIsMainnet, preferencesSelector, getSelectedAddress, conversionRateSelector, getKnownMethodData } from '../../../selectors/selectors' -import { isBalanceSufficient } from '../../../pages/send/send.utils' - -const mapStateToProps = (state, ownProps) => { - const { metamask: { accounts, provider, frequentRpcListDetail } } = state - const { showFiatInTestnets } = preferencesSelector(state) - const isMainnet = getIsMainnet(state) - const { transactionGroup: { primaryTransaction } = {} } = ownProps - const { txParams: { gas: gasLimit, gasPrice, data } = {} } = primaryTransaction - const selectedAccountBalance = accounts[getSelectedAddress(state)].balance - const selectRpcInfo = frequentRpcListDetail.find(rpcInfo => rpcInfo.rpcUrl === provider.rpcTarget) - const { rpcPrefs } = selectRpcInfo || {} - - const hasEnoughCancelGas = primaryTransaction.txParams && isBalanceSufficient({ - amount: '0x0', - gasTotal: getHexGasTotal({ - gasPrice: increaseLastGasPrice(gasPrice), - gasLimit, - }), - balance: selectedAccountBalance, - conversionRate: conversionRateSelector(state), - }) - - return { - methodData: getKnownMethodData(state, data) || {}, - showFiat: (isMainnet || !!showFiatInTestnets), - selectedAccountBalance, - hasEnoughCancelGas, - rpcPrefs, - } -} - -const mapDispatchToProps = dispatch => { - return { - fetchBasicGasAndTimeEstimates: () => dispatch(fetchBasicGasAndTimeEstimates()), - fetchGasEstimates: (blockTime) => dispatch(fetchGasEstimates(blockTime)), - setSelectedToken: tokenAddress => dispatch(setSelectedToken(tokenAddress)), - getContractMethodData: methodData => dispatch(getContractMethodData(methodData)), - retryTransaction: (transaction, gasPrice) => { - dispatch(setCustomGasPriceForRetry(gasPrice || transaction.txParams.gasPrice)) - dispatch(setCustomGasLimit(transaction.txParams.gas)) - dispatch(showSidebar({ - transitionName: 'sidebar-left', - type: 'customize-gas', - props: { transaction }, - })) - }, - showCancelModal: (transactionId, originalGasPrice) => { - return dispatch(showModal({ name: 'CANCEL_TRANSACTION', transactionId, originalGasPrice })) - }, - } -} - -const mergeProps = (stateProps, dispatchProps, ownProps) => { - const { transactionGroup: { primaryTransaction, initialTransaction } = {} } = ownProps - const { retryTransaction, ...restDispatchProps } = dispatchProps - const { txParams: { nonce, data } = {}, time } = initialTransaction - const { txParams: { value } = {} } = primaryTransaction - - const tokenData = data && getTokenData(data) - const nonceAndDate = nonce ? `#${hexToDecimal(nonce)} - ${formatDate(time)}` : formatDate(time) - - return { - ...stateProps, - ...restDispatchProps, - ...ownProps, - value, - nonceAndDate, - tokenData, - transaction: initialTransaction, - primaryTransaction, - retryTransaction: (transactionId, gasPrice) => { - const { transactionGroup: { transactions = [] } } = ownProps - const transaction = transactions.find(tx => tx.id === transactionId) || {} - const increasedGasPrice = increaseLastGasPrice(gasPrice) - retryTransaction(transaction, increasedGasPrice) - }, - } -} - -export default compose( - withRouter, - connect(mapStateToProps, mapDispatchToProps, mergeProps), -)(TransactionListItem) diff --git a/ui/app/components/app/transaction-list/index.js b/ui/app/components/app/transaction-list/index.js index 6889943674d4..1ec6c5124b45 100644 --- a/ui/app/components/app/transaction-list/index.js +++ b/ui/app/components/app/transaction-list/index.js @@ -1 +1 @@ -export { default } from './transaction-list.container' +export { default } from './transaction-list.component' diff --git a/ui/app/components/app/transaction-list/index.scss b/ui/app/components/app/transaction-list/index.scss index 42eddd31e3a9..58feee644d6c 100644 --- a/ui/app/components/app/transaction-list/index.scss +++ b/ui/app/components/app/transaction-list/index.scss @@ -2,7 +2,6 @@ display: flex; flex-direction: column; flex: 1; - margin-top: 8px; &__completed-transactions { display: flex; @@ -35,7 +34,7 @@ flex: 1; display: grid; grid-template-rows: auto; - padding-top: 8px; + padding-top: 24px; } &__empty-text { @@ -44,4 +43,9 @@ justify-content: center; color: $silver; } + + &__view-more { + margin: 16px auto; + max-width: 200px; + } } diff --git a/ui/app/components/app/transaction-list/transaction-list.component.js b/ui/app/components/app/transaction-list/transaction-list.component.js index fc5488884004..a05cf06f9079 100644 --- a/ui/app/components/app/transaction-list/transaction-list.component.js +++ b/ui/app/components/app/transaction-list/transaction-list.component.js @@ -1,58 +1,84 @@ -import React, { PureComponent } from 'react' +import React, { useMemo, useEffect, useRef, useState, useCallback } from 'react' import PropTypes from 'prop-types' +import { useSelector, useDispatch } from 'react-redux' +import { + nonceSortedCompletedTransactionsSelector, + nonceSortedPendingTransactionsSelector, +} from '../../../selectors/transactions' +import { + getFeatureFlags, +} from '../../../selectors/selectors' +import * as actions from '../../../ducks/gas/gas.duck' +import { useI18nContext } from '../../../hooks/useI18nContext' import TransactionListItem from '../transaction-list-item' -import ShapeShiftTransactionListItem from '../shift-list-item' -import { TRANSACTION_TYPE_SHAPESHIFT } from '../../../helpers/constants/transactions' +import Button from '../../ui/button' +import { TOKEN_CATEGORY_HASH } from '../../../helpers/constants/transactions' -export default class TransactionList extends PureComponent { - static contextTypes = { - t: PropTypes.func, - } +const PAGE_INCREMENT = 10 - static defaultProps = { - pendingTransactions: [], - completedTransactions: [], - } +const getTransactionGroupRecipientAddressFilter = (recipientAddress) => { + return ({ initialTransaction: { txParams } }) => txParams && txParams.to === recipientAddress +} - static propTypes = { - pendingTransactions: PropTypes.array, - completedTransactions: PropTypes.array, - selectedToken: PropTypes.object, - updateNetworkNonce: PropTypes.func, - assetImages: PropTypes.object, - } +const tokenTransactionFilter = ({ + initialTransaction: { + transactionCategory, + }, +}) => !TOKEN_CATEGORY_HASH[transactionCategory] - componentDidMount () { - this.props.updateNetworkNonce() +const getFilteredTransactionGroups = (transactionGroups, hideTokenTransactions, tokenAddress) => { + if (hideTokenTransactions) { + return transactionGroups.filter(tokenTransactionFilter) + } else if (tokenAddress) { + return transactionGroups.filter(getTransactionGroupRecipientAddressFilter(tokenAddress)) } + return transactionGroups +} - componentDidUpdate (prevProps) { - const { pendingTransactions: prevPendingTransactions = [] } = prevProps - const { pendingTransactions = [], updateNetworkNonce } = this.props +export default function TransactionList ({ hideTokenTransactions, tokenAddress }) { + const [limit, setLimit] = useState(PAGE_INCREMENT) + const t = useI18nContext() - if (pendingTransactions.length > prevPendingTransactions.length) { - updateNetworkNonce() - } - } + const dispatch = useDispatch() + const unfilteredPendingTransactions = useSelector(nonceSortedPendingTransactionsSelector) + const unfilteredCompletedTransactions = useSelector(nonceSortedCompletedTransactionsSelector) + const { transactionTime: transactionTimeFeatureActive } = useSelector(getFeatureFlags) - shouldShowRetry = (transactionGroup, isEarliestNonce) => { - const { transactions = [], hasRetried } = transactionGroup - const [earliestTransaction = {}] = transactions - const { submittedTime } = earliestTransaction - return Date.now() - submittedTime > 30000 && isEarliestNonce && !hasRetried - } + const pendingTransactions = useMemo( + () => getFilteredTransactionGroups(unfilteredPendingTransactions, hideTokenTransactions, tokenAddress), + [hideTokenTransactions, tokenAddress, unfilteredPendingTransactions], + ) + const completedTransactions = useMemo( + () => getFilteredTransactionGroups(unfilteredCompletedTransactions, hideTokenTransactions, tokenAddress), + [hideTokenTransactions, tokenAddress, unfilteredCompletedTransactions], + ) - shouldShowCancel (transactionGroup) { - const { hasCancelled } = transactionGroup - return !hasCancelled - } + const { fetchGasEstimates, fetchBasicGasAndTimeEstimates } = useMemo(() => ({ + fetchGasEstimates: (blockTime) => dispatch(actions.fetchGasEstimates(blockTime)), + fetchBasicGasAndTimeEstimates: () => dispatch(actions.fetchBasicGasAndTimeEstimates()), + }), [dispatch]) - renderTransactions () { - const { t } = this.context - const { pendingTransactions = [], completedTransactions = [] } = this.props - const pendingLength = pendingTransactions.length + // keep track of previous values from state. + // loaded is used here to determine if our effect has ran at least once. + const prevState = useRef({ loaded: false, pendingTransactions, transactionTimeFeatureActive }) + + useEffect(() => { + const { loaded } = prevState.current + const pendingTransactionAdded = pendingTransactions.length > 0 && prevState.current.pendingTransactions.length === 0 + const transactionTimeFeatureWasActivated = !prevState.current.transactionTimeFeatureActive && transactionTimeFeatureActive + if (transactionTimeFeatureActive && pendingTransactions.length > 0 && (loaded === false || transactionTimeFeatureWasActivated || pendingTransactionAdded)) { + fetchBasicGasAndTimeEstimates() + .then(({ blockTime }) => fetchGasEstimates(blockTime)) + } + prevState.current = { loaded: true, pendingTransactions, transactionTimeFeatureActive } + }, [fetchGasEstimates, fetchBasicGasAndTimeEstimates, transactionTimeFeatureActive, pendingTransactions]) - return ( + const viewMore = useCallback(() => setLimit((prev) => prev + PAGE_INCREMENT), []) + + const pendingLength = pendingTransactions.length + + return ( +
    { pendingLength > 0 && ( @@ -62,65 +88,50 @@ export default class TransactionList extends PureComponent {
    { pendingTransactions.map((transactionGroup, index) => ( - this.renderTransaction(transactionGroup, index, true) + )) }
    ) }
    -
    - { t('history') } -
    + { + pendingLength > 0 + ? ( +
    + { t('history') } +
    + ) + : null + } { completedTransactions.length > 0 - ? completedTransactions.map((transactionGroup, index) => ( - this.renderTransaction(transactionGroup, index) - )) - : this.renderEmpty() + ? completedTransactions.slice(0, limit).map((transactionGroup, index) => ( + + )) + : ( +
    +
    + { t('noTransactions') } +
    +
    + ) } + {completedTransactions.length > limit && ( + + )}
    - ) - } - - renderTransaction (transactionGroup, index, isPendingTx = false) { - const { selectedToken, assetImages } = this.props - const { transactions = [] } = transactionGroup - - return transactions[0].key === TRANSACTION_TYPE_SHAPESHIFT - ? ( - - ) : ( - - ) - } +
    + ) +} - renderEmpty () { - return ( -
    -
    - { this.context.t('noTransactions') } -
    -
    - ) - } +TransactionList.propTypes = { + hideTokenTransactions: PropTypes.bool, + tokenAddress: PropTypes.string, +} - render () { - return ( -
    - { this.renderTransactions() } -
    - ) - } +TransactionList.defaultProps = { + hideTokenTransactions: false, + tokenAddress: undefined, } diff --git a/ui/app/components/app/transaction-list/transaction-list.container.js b/ui/app/components/app/transaction-list/transaction-list.container.js deleted file mode 100644 index 67a24588b6ac..000000000000 --- a/ui/app/components/app/transaction-list/transaction-list.container.js +++ /dev/null @@ -1,44 +0,0 @@ -import { connect } from 'react-redux' -import { withRouter } from 'react-router-dom' -import { compose } from 'recompose' -import TransactionList from './transaction-list.component' -import { - nonceSortedCompletedTransactionsSelector, - nonceSortedPendingTransactionsSelector, -} from '../../../selectors/transactions' -import { getSelectedAddress, getAssetImages } from '../../../selectors/selectors' -import { selectedTokenSelector } from '../../../selectors/tokens' -import { updateNetworkNonce } from '../../../store/actions' - -const mapStateToProps = state => { - return { - completedTransactions: nonceSortedCompletedTransactionsSelector(state), - pendingTransactions: nonceSortedPendingTransactionsSelector(state), - selectedToken: selectedTokenSelector(state), - selectedAddress: getSelectedAddress(state), - assetImages: getAssetImages(state), - } -} - -const mapDispatchToProps = dispatch => { - return { - updateNetworkNonce: address => dispatch(updateNetworkNonce(address)), - } -} - -const mergeProps = (stateProps, dispatchProps, ownProps) => { - const { selectedAddress, ...restStateProps } = stateProps - const { updateNetworkNonce, ...restDispatchProps } = dispatchProps - - return { - ...restStateProps, - ...restDispatchProps, - ...ownProps, - updateNetworkNonce: () => updateNetworkNonce(selectedAddress), - } -} - -export default compose( - withRouter, - connect(mapStateToProps, mapDispatchToProps, mergeProps) -)(TransactionList) diff --git a/ui/app/components/app/transaction-status/index.scss b/ui/app/components/app/transaction-status/index.scss index 024cbf2a129a..0896aa7f8d20 100644 --- a/ui/app/components/app/transaction-status/index.scss +++ b/ui/app/components/app/transaction-status/index.scss @@ -1,46 +1,31 @@ .transaction-status { - height: 26px; - width: 84px; - border-radius: 4px; - background-color: #f0f0f0; - color: #5e6064; - font-size: .625rem; - text-transform: uppercase; - display: flex; - justify-content: center; - align-items: center; + display: inline; - @media screen and (max-width: $break-small) { - height: 16px; - min-width: 72px; - font-size: 10px; - padding: 0 12px; + &--unapproved { + color: $Orange-500; } - &--confirmed { - background-color: #eafad7; - color: #609a1c; + &--failed { + color: $Red-500; + } - .transaction-status__transaction-count { - border: 1px solid #609a1c; - } + &--cancelled { + color: $Red-500; } - &--approved, &--submitted { - background-color: #FFF2DB; - color: #CA810A; + &--dropped { + color: $Red-500; + } - .transaction-status__transaction-count { - border: 1px solid #CA810A; - } + &--rejected { + color: $Red-500; } - &--failed { - background: lighten($monzo, 56%); - color: $monzo; + &--pending { + color: $Orange-500; + } - .transaction-status__transaction-count { - border: 1px solid $monzo; - } + &--queued { + color: $Grey-500; } } diff --git a/ui/app/components/app/transaction-status/tests/transaction-status.component.test.js b/ui/app/components/app/transaction-status/tests/transaction-status.component.test.js index ec1d580bddea..51d02b4511c6 100644 --- a/ui/app/components/app/transaction-status/tests/transaction-status.component.test.js +++ b/ui/app/components/app/transaction-status/tests/transaction-status.component.test.js @@ -1,33 +1,80 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { mount } from 'enzyme' +import sinon from 'sinon' +import * as i18nHook from '../../../../hooks/useI18nContext' import TransactionStatus from '../transaction-status.component' -import Tooltip from '../../../ui/tooltip-v2' +import Tooltip from '../../../ui/tooltip' + +describe('TransactionStatus Component', function () { + before(function () { + sinon.stub(i18nHook, 'useI18nContext').returns((str) => str.toUpperCase()) + }) + + it('should render CONFIRMED properly', function () { + const wrapper = mount( + , + ) + + assert.ok(wrapper) + assert.equal(wrapper.text(), 'June 1') + }) -describe('TransactionStatus Component', () => { - it('should render APPROVED properly', () => { + it('should render PENDING properly when status is APPROVED', function () { const wrapper = mount( , - { context: { t: str => str.toUpperCase() } } ) assert.ok(wrapper) - assert.equal(wrapper.text(), 'APPROVED') + assert.equal(wrapper.text(), 'PENDING') assert.equal(wrapper.find(Tooltip).props().title, 'test-title') }) - it('should render SUBMITTED properly', () => { + it('should render PENDING properly', function () { const wrapper = mount( , - { context: { t: str => str.toUpperCase() } } ) assert.ok(wrapper) assert.equal(wrapper.text(), 'PENDING') }) + + it('should render QUEUED properly', function () { + const wrapper = mount( + , + ) + + assert.ok(wrapper) + assert.ok(wrapper.find('.transaction-status--queued').length, 'queued className not found') + assert.equal(wrapper.text(), 'QUEUED') + }) + + it('should render UNAPPROVED properly', function () { + const wrapper = mount( + , + ) + + assert.ok(wrapper) + assert.ok(wrapper.find('.transaction-status--unapproved').length, 'unapproved className not found') + assert.equal(wrapper.text(), 'UNAPPROVED') + }) + + after(function () { + sinon.restore() + }) }) diff --git a/ui/app/components/app/transaction-status/transaction-status.component.js b/ui/app/components/app/transaction-status/transaction-status.component.js index d3a2395399cf..692745db37a5 100644 --- a/ui/app/components/app/transaction-status/transaction-status.component.js +++ b/ui/app/components/app/transaction-status/transaction-status.component.js @@ -1,63 +1,75 @@ -import React, { PureComponent } from 'react' +import React from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' -import Tooltip from '../../ui/tooltip-v2' +import Tooltip from '../../ui/tooltip' + import { UNAPPROVED_STATUS, REJECTED_STATUS, - APPROVED_STATUS, - SIGNED_STATUS, SUBMITTED_STATUS, CONFIRMED_STATUS, FAILED_STATUS, DROPPED_STATUS, CANCELLED_STATUS, + APPROVED_STATUS, + SIGNED_STATUS, } from '../../../helpers/constants/transactions' +import { useI18nContext } from '../../../hooks/useI18nContext' + +const QUEUED_PSEUDO_STATUS = 'queued' +const PENDING_PSEUDO_STATUS = 'pending' + +/** + * A note about status logic for this component: + * Approved, Signed and Submitted statuses are all treated, effectively + * as pending. Transactions are only approved or signed for less than a + * second, usually, and ultimately should be rendered in the UI no + * differently than a pending transaction. + * + * Confirmed transactions are not especially highlighted except that their + * status label will be the date the transaction was finalized. + */ +const pendingStatusHash = { + [SUBMITTED_STATUS]: PENDING_PSEUDO_STATUS, + [APPROVED_STATUS]: PENDING_PSEUDO_STATUS, + [SIGNED_STATUS]: PENDING_PSEUDO_STATUS, +} const statusToClassNameHash = { [UNAPPROVED_STATUS]: 'transaction-status--unapproved', [REJECTED_STATUS]: 'transaction-status--rejected', - [APPROVED_STATUS]: 'transaction-status--approved', - [SIGNED_STATUS]: 'transaction-status--signed', - [SUBMITTED_STATUS]: 'transaction-status--submitted', - [CONFIRMED_STATUS]: 'transaction-status--confirmed', [FAILED_STATUS]: 'transaction-status--failed', [DROPPED_STATUS]: 'transaction-status--dropped', - [CANCELLED_STATUS]: 'transaction-status--failed', -} - -const statusToTextHash = { - [SUBMITTED_STATUS]: 'pending', + [CANCELLED_STATUS]: 'transaction-status--cancelled', + [QUEUED_PSEUDO_STATUS]: 'transaction-status--queued', + [PENDING_PSEUDO_STATUS]: 'transaction-status--pending', } -export default class TransactionStatus extends PureComponent { - static defaultProps = { - title: null, +export default function TransactionStatus ({ status, date, error, isEarliestNonce, className }) { + const t = useI18nContext() + const tooltipText = error?.rpc?.message || error?.message + let statusKey = status + if (pendingStatusHash[status]) { + statusKey = isEarliestNonce ? PENDING_PSEUDO_STATUS : QUEUED_PSEUDO_STATUS } - static contextTypes = { - t: PropTypes.func, - } + const statusText = statusKey === CONFIRMED_STATUS ? date : t(statusKey) - static propTypes = { - statusKey: PropTypes.string, - className: PropTypes.string, - title: PropTypes.string, - } + return ( + + { statusText } + + ) +} - render () { - const { className, statusKey, title } = this.props - const statusText = this.context.t(statusToTextHash[statusKey] || statusKey) - - return ( -
    - - { statusText } - -
    - ) - } +TransactionStatus.propTypes = { + status: PropTypes.string, + className: PropTypes.string, + date: PropTypes.string, + error: PropTypes.object, + isEarliestNonce: PropTypes.bool, } diff --git a/ui/app/components/app/transaction-view-balance/index.js b/ui/app/components/app/transaction-view-balance/index.js deleted file mode 100644 index 8824737f77c8..000000000000 --- a/ui/app/components/app/transaction-view-balance/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './transaction-view-balance.container' diff --git a/ui/app/components/app/transaction-view-balance/index.scss b/ui/app/components/app/transaction-view-balance/index.scss deleted file mode 100644 index cdb09db8a6fa..000000000000 --- a/ui/app/components/app/transaction-view-balance/index.scss +++ /dev/null @@ -1,98 +0,0 @@ -.transaction-view-balance { - display: flex; - justify-content: space-between; - align-items: center; - flex: 1; - height: 54px; - min-width: 0; - - @media screen and (max-width: $break-small) { - flex-direction: column; - height: initial; - width: 100%; - } - - &__balance { - margin: 0 12px; - display: flex; - flex-direction: column; - min-width: 0; - position: relative; - - @media screen and (max-width: $break-small) { - align-items: center; - margin: 16px 0; - padding: 0 16px; - max-width: 100%; - } - } - - &__primary-container { - display: flex; - } - - &__primary-balance { - font-size: 1.5rem; - color: $black; - - @media screen and (max-width: $break-small) { - font-size: 32px; - line-height: 45px; - width: 100%; - justify-content: center; - - } - } - - &__cached-star { - margin-left: 4px; - } - - &__cached-balance, &__cached-star { - color: $web-orange; - } - - &__cached-secondary-balance { - color: rgba(220, 153, 18, 0.6901960784313725); - font-size: 16px; - line-height: 23px; - } - - &__secondary-balance { - font-size: 16px; - line-height: 23px; - font-weight: 400; - color: $Grey-400; - } - - &__balance-container { - flex: 1; - display: flex; - flex-direction: row; - align-items: center; - min-width: 0; - - @media screen and (max-width: $break-small) { - flex-direction: column; - width: 100%; - } - } - - &__buttons { - display: flex; - flex-direction: row; - - @media screen and (max-width: $break-small) { - margin-bottom: 16px; - } - } - - &__button { - min-width: initial; - width: 100px; - - &:not(:last-child) { - margin-right: 12px; - } - } -} diff --git a/ui/app/components/app/transaction-view-balance/tests/token-view-balance.component.test.js b/ui/app/components/app/transaction-view-balance/tests/token-view-balance.component.test.js deleted file mode 100644 index 0e2882e9c0e2..000000000000 --- a/ui/app/components/app/transaction-view-balance/tests/token-view-balance.component.test.js +++ /dev/null @@ -1,72 +0,0 @@ -import React from 'react' -import assert from 'assert' -import { shallow } from 'enzyme' -import sinon from 'sinon' -import TokenBalance from '../../../ui/token-balance' -import UserPreferencedCurrencyDisplay from '../../user-preferenced-currency-display' -import { SEND_ROUTE } from '../../../../helpers/constants/routes' -import TransactionViewBalance from '../transaction-view-balance.component' - -const propsMethodSpies = { - showDepositModal: sinon.spy(), -} - -const historySpies = { - push: sinon.spy(), -} - -const t = (str1, str2) => str2 ? str1 + str2 : str1 -const metricsEvent = () => ({}) - -describe('TransactionViewBalance Component', () => { - afterEach(() => { - propsMethodSpies.showDepositModal.resetHistory() - historySpies.push.resetHistory() - }) - - it('should render ETH balance properly', () => { - const wrapper = shallow(, { context: { t, metricsEvent } }) - - assert.equal(wrapper.find('.transaction-view-balance').length, 1) - assert.equal(wrapper.find('.transaction-view-balance__button').length, 2) - assert.equal(wrapper.find(UserPreferencedCurrencyDisplay).length, 2) - - const buttons = wrapper.find('.transaction-view-balance__buttons') - assert.equal(propsMethodSpies.showDepositModal.callCount, 0) - buttons.childAt(0).simulate('click') - assert.equal(propsMethodSpies.showDepositModal.callCount, 1) - assert.equal(historySpies.push.callCount, 0) - buttons.childAt(1).simulate('click') - assert.equal(historySpies.push.callCount, 1) - assert.equal(historySpies.push.getCall(0).args[0], SEND_ROUTE) - }) - - it('should render token balance properly', () => { - const token = { - address: '0x35865238f0bec9d5ce6abff0fdaebe7b853dfcc5', - decimals: '2', - symbol: 'ABC', - } - - const wrapper = shallow(, { context: { t } }) - - assert.equal(wrapper.find('.transaction-view-balance').length, 1) - assert.equal(wrapper.find('.transaction-view-balance__button').length, 1) - assert.equal(wrapper.find(TokenBalance).length, 1) - }) -}) diff --git a/ui/app/components/app/transaction-view-balance/transaction-view-balance.component.js b/ui/app/components/app/transaction-view-balance/transaction-view-balance.component.js deleted file mode 100644 index 3f6abbb00503..000000000000 --- a/ui/app/components/app/transaction-view-balance/transaction-view-balance.component.js +++ /dev/null @@ -1,145 +0,0 @@ -import React, { PureComponent } from 'react' -import PropTypes from 'prop-types' -import classnames from 'classnames' -import Button from '../../ui/button' -import Identicon from '../../ui/identicon' -import TokenBalance from '../../ui/token-balance' -import UserPreferencedCurrencyDisplay from '../user-preferenced-currency-display' -import { SEND_ROUTE } from '../../../helpers/constants/routes' -import { PRIMARY, SECONDARY } from '../../../helpers/constants/common' -import Tooltip from '../../ui/tooltip-v2' - -export default class TransactionViewBalance extends PureComponent { - static contextTypes = { - t: PropTypes.func, - metricsEvent: PropTypes.func, - } - - static propTypes = { - showDepositModal: PropTypes.func, - selectedToken: PropTypes.object, - history: PropTypes.object, - network: PropTypes.string, - balance: PropTypes.string, - assetImage: PropTypes.string, - balanceIsCached: PropTypes.bool, - showFiat: PropTypes.bool, - } - - static defaultProps = { - showFiat: true, - } - - renderBalance () { - const { selectedToken, balance, balanceIsCached, showFiat } = this.props - - return selectedToken - ? ( -
    - -
    - ) : ( - -
    -
    - - { - balanceIsCached ? * : null - } -
    - { - showFiat && ( - - ) - } -
    -
    - ) - } - - renderButtons () { - const { t, metricsEvent } = this.context - const { selectedToken, showDepositModal, history } = this.props - - return ( -
    - { - !selectedToken && ( - - ) - } - -
    - ) - } - - render () { - const { network, selectedToken, assetImage } = this.props - - return ( -
    -
    - - { this.renderBalance() } -
    - { this.renderButtons() } -
    - ) - } -} diff --git a/ui/app/components/app/transaction-view-balance/transaction-view-balance.container.js b/ui/app/components/app/transaction-view-balance/transaction-view-balance.container.js deleted file mode 100644 index 41a4525dca41..000000000000 --- a/ui/app/components/app/transaction-view-balance/transaction-view-balance.container.js +++ /dev/null @@ -1,46 +0,0 @@ -import { connect } from 'react-redux' -import { withRouter } from 'react-router-dom' -import { compose } from 'recompose' -import TransactionViewBalance from './transaction-view-balance.component' -import { - getSelectedToken, - getSelectedAddress, - getNativeCurrency, - getSelectedTokenAssetImage, - getMetaMaskAccounts, - isBalanceCached, - preferencesSelector, - getIsMainnet, -} from '../../../selectors/selectors' -import { showModal } from '../../../store/actions' - -const mapStateToProps = state => { - const { showFiatInTestnets } = preferencesSelector(state) - const isMainnet = getIsMainnet(state) - const selectedAddress = getSelectedAddress(state) - const { metamask: { network } } = state - const accounts = getMetaMaskAccounts(state) - const account = accounts[selectedAddress] - const { balance } = account - - return { - selectedToken: getSelectedToken(state), - network, - balance, - nativeCurrency: getNativeCurrency(state), - assetImage: getSelectedTokenAssetImage(state), - balanceIsCached: isBalanceCached(state), - showFiat: (isMainnet || !!showFiatInTestnets), - } -} - -const mapDispatchToProps = dispatch => { - return { - showDepositModal: () => dispatch(showModal({ name: 'DEPOSIT_ETHER' })), - } -} - -export default compose( - withRouter, - connect(mapStateToProps, mapDispatchToProps) -)(TransactionViewBalance) diff --git a/ui/app/components/app/transaction-view/index.js b/ui/app/components/app/transaction-view/index.js deleted file mode 100644 index 9eb0c3c83ca1..000000000000 --- a/ui/app/components/app/transaction-view/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './transaction-view.component' diff --git a/ui/app/components/app/transaction-view/index.scss b/ui/app/components/app/transaction-view/index.scss deleted file mode 100644 index 13187f0e5db9..000000000000 --- a/ui/app/components/app/transaction-view/index.scss +++ /dev/null @@ -1,28 +0,0 @@ -.transaction-view { - flex: 1 1 66.5%; - background: $white; - min-width: 0; - display: flex; - flex-direction: column; - overflow-y: auto; - - &__balance-wrapper { - @media screen and (max-width: $break-small) { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: center; - flex: 0 0 auto; - padding-top: 16px; - } - - @media screen and (min-width: $break-large) { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - margin: 2.3em 2.37em .8em; - flex: 0 0 auto; - } - } -} diff --git a/ui/app/components/app/transaction-view/transaction-view.component.js b/ui/app/components/app/transaction-view/transaction-view.component.js deleted file mode 100644 index 7014ca173965..000000000000 --- a/ui/app/components/app/transaction-view/transaction-view.component.js +++ /dev/null @@ -1,27 +0,0 @@ -import React, { PureComponent } from 'react' -import PropTypes from 'prop-types' -import Media from 'react-media' -import MenuBar from '../menu-bar' -import TransactionViewBalance from '../transaction-view-balance' -import TransactionList from '../transaction-list' - -export default class TransactionView extends PureComponent { - static contextTypes = { - t: PropTypes.func, - } - - render () { - return ( -
    - } - /> -
    - -
    - -
    - ) - } -} diff --git a/ui/app/components/app/ui-migration-annoucement/index.js b/ui/app/components/app/ui-migration-annoucement/index.js deleted file mode 100644 index c6c8cc619e9d..000000000000 --- a/ui/app/components/app/ui-migration-annoucement/index.js +++ /dev/null @@ -1 +0,0 @@ -export {default} from './ui-migration-announcement.container' diff --git a/ui/app/components/app/ui-migration-annoucement/index.scss b/ui/app/components/app/ui-migration-annoucement/index.scss deleted file mode 100644 index 6138a30799be..000000000000 --- a/ui/app/components/app/ui-migration-annoucement/index.scss +++ /dev/null @@ -1,22 +0,0 @@ -.ui-migration-announcement { - position: absolute; - z-index: 9999; - width: 100vw; - height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - background: $white; - - p { - box-sizing: border-box; - padding: 1em; - font-size: 12pt; - } - - p:last-of-type { - cursor: pointer; - text-decoration: underline; - font-weight: bold; - } -} diff --git a/ui/app/components/app/ui-migration-annoucement/ui-migration-annoucement.component.js b/ui/app/components/app/ui-migration-annoucement/ui-migration-annoucement.component.js deleted file mode 100644 index 7a4124972783..000000000000 --- a/ui/app/components/app/ui-migration-annoucement/ui-migration-annoucement.component.js +++ /dev/null @@ -1,33 +0,0 @@ -import PropTypes from 'prop-types' -import React, {PureComponent} from 'react' - -export default class UiMigrationAnnouncement extends PureComponent { - static contextTypes = { - t: PropTypes.func.isRequired, - } - - static defaultProps = { - shouldShowAnnouncement: true, - }; - - static propTypes = { - onClose: PropTypes.func.isRequired, - shouldShowAnnouncement: PropTypes.bool, - } - - render () { - const { t } = this.context - const { onClose, shouldShowAnnouncement } = this.props - - if (!shouldShowAnnouncement) { - return null - } - - return ( -
    -

    {t('uiMigrationAnnouncement')}

    -

    {t('close')}

    -
    - ) - } -} diff --git a/ui/app/components/app/ui-migration-annoucement/ui-migration-announcement.container.js b/ui/app/components/app/ui-migration-annoucement/ui-migration-announcement.container.js deleted file mode 100644 index 55efd5a44bf5..000000000000 --- a/ui/app/components/app/ui-migration-annoucement/ui-migration-announcement.container.js +++ /dev/null @@ -1,21 +0,0 @@ -import { connect } from 'react-redux' -import UiMigrationAnnouncement from './ui-migration-annoucement.component' -import { setCompletedUiMigration } from '../../../store/actions' - -const mapStateToProps = (state) => { - const shouldShowAnnouncement = !state.metamask.completedUiMigration - - return { - shouldShowAnnouncement, - } -} - -const mapDispatchToProps = dispatch => { - return { - onClose () { - dispatch(setCompletedUiMigration()) - }, - } -} - -export default connect(mapStateToProps, mapDispatchToProps)(UiMigrationAnnouncement) diff --git a/ui/app/components/app/user-preferenced-currency-display/index.js b/ui/app/components/app/user-preferenced-currency-display/index.js index 0deddaecff6e..5bc2d4246534 100644 --- a/ui/app/components/app/user-preferenced-currency-display/index.js +++ b/ui/app/components/app/user-preferenced-currency-display/index.js @@ -1 +1 @@ -export { default } from './user-preferenced-currency-display.container' +export { default } from './user-preferenced-currency-display.component' diff --git a/ui/app/components/app/user-preferenced-currency-display/tests/user-preferenced-currency-display.component.test.js b/ui/app/components/app/user-preferenced-currency-display/tests/user-preferenced-currency-display.component.test.js index 51b2a3c4f43e..d9f271e105b7 100644 --- a/ui/app/components/app/user-preferenced-currency-display/tests/user-preferenced-currency-display.component.test.js +++ b/ui/app/components/app/user-preferenced-currency-display/tests/user-preferenced-currency-display.component.test.js @@ -1,27 +1,34 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { shallow } from 'enzyme' +import sinon from 'sinon' import UserPreferencedCurrencyDisplay from '../user-preferenced-currency-display.component' import CurrencyDisplay from '../../../ui/currency-display' +import * as currencyHook from '../../../../hooks/useCurrencyDisplay' +import * as currencyPrefHook from '../../../../hooks/useUserPreferencedCurrency' -describe('UserPreferencedCurrencyDisplay Component', () => { - describe('rendering', () => { - it('should render properly', () => { +describe('UserPreferencedCurrencyDisplay Component', function () { + describe('rendering', function () { + beforeEach(function () { + sinon.stub(currencyHook, 'useCurrencyDisplay').returns(['1', {}]) + sinon.stub(currencyPrefHook, 'useUserPreferencedCurrency').returns({ currency: 'ETH', decimals: 6 }) + }) + it('should render properly', function () { const wrapper = shallow( - + , ) assert.ok(wrapper) assert.equal(wrapper.find(CurrencyDisplay).length, 1) }) - it('should pass all props to the CurrencyDisplay child component', () => { + it('should pass all props to the CurrencyDisplay child component', function () { const wrapper = shallow( + />, ) assert.ok(wrapper) @@ -30,5 +37,8 @@ describe('UserPreferencedCurrencyDisplay Component', () => { assert.equal(wrapper.find(CurrencyDisplay).props().prop2, 'test') assert.equal(wrapper.find(CurrencyDisplay).props().prop3, 1) }) + afterEach(function () { + sinon.restore() + }) }) }) diff --git a/ui/app/components/app/user-preferenced-currency-display/tests/user-preferenced-currency-display.container.test.js b/ui/app/components/app/user-preferenced-currency-display/tests/user-preferenced-currency-display.container.test.js deleted file mode 100644 index 4ecc0dabb15e..000000000000 --- a/ui/app/components/app/user-preferenced-currency-display/tests/user-preferenced-currency-display.container.test.js +++ /dev/null @@ -1,202 +0,0 @@ -import assert from 'assert' -import proxyquire from 'proxyquire' - -let mapStateToProps, mergeProps - -proxyquire('../user-preferenced-currency-display.container.js', { - 'react-redux': { - connect: (ms, _, mp) => { - mapStateToProps = ms - mergeProps = mp - return () => ({}) - }, - }, -}) - -describe('UserPreferencedCurrencyDisplay container', () => { - describe('mapStateToProps()', () => { - it('should return the correct props', () => { - const mockState = { - metamask: { - nativeCurrency: 'ETH', - preferences: { - useNativeCurrencyAsPrimaryCurrency: true, - showFiatInTestnets: false, - }, - provider: { - type: 'mainnet', - }, - }, - } - - assert.deepEqual(mapStateToProps(mockState), { - nativeCurrency: 'ETH', - useNativeCurrencyAsPrimaryCurrency: true, - isMainnet: true, - showFiatInTestnets: false, - }) - }) - - it('should return the correct props when not in mainnet and showFiatInTestnets is true', () => { - const mockState = { - metamask: { - nativeCurrency: 'ETH', - preferences: { - useNativeCurrencyAsPrimaryCurrency: true, - showFiatInTestnets: true, - }, - provider: { - type: 'rinkeby', - }, - }, - } - - assert.deepEqual(mapStateToProps(mockState), { - nativeCurrency: 'ETH', - useNativeCurrencyAsPrimaryCurrency: true, - isMainnet: false, - showFiatInTestnets: true, - }) - }) - }) - - describe('mergeProps()', () => { - it('should return the correct props', () => { - const mockDispatchProps = {} - - const tests = [ - { - stateProps: { - useNativeCurrencyAsPrimaryCurrency: true, - nativeCurrency: 'ETH', - isMainnet: true, - showFiatInTestnets: false, - }, - ownProps: { - type: 'PRIMARY', - }, - result: { - currency: 'ETH', - nativeCurrency: 'ETH', - numberOfDecimals: 6, - prefix: undefined, - }, - }, - { - stateProps: { - useNativeCurrencyAsPrimaryCurrency: false, - nativeCurrency: 'ETH', - isMainnet: true, - showFiatInTestnets: false, - }, - ownProps: { - type: 'PRIMARY', - }, - result: { - currency: undefined, - nativeCurrency: 'ETH', - numberOfDecimals: 2, - prefix: undefined, - }, - }, - { - stateProps: { - useNativeCurrencyAsPrimaryCurrency: true, - nativeCurrency: 'ETH', - isMainnet: true, - showFiatInTestnets: false, - }, - ownProps: { - type: 'SECONDARY', - fiatNumberOfDecimals: 4, - fiatPrefix: '-', - }, - result: { - nativeCurrency: 'ETH', - currency: undefined, - numberOfDecimals: 4, - prefix: '-', - }, - }, - { - stateProps: { - useNativeCurrencyAsPrimaryCurrency: false, - nativeCurrency: 'ETH', - isMainnet: true, - showFiatInTestnets: false, - }, - ownProps: { - type: 'SECONDARY', - fiatNumberOfDecimals: 4, - numberOfDecimals: 3, - fiatPrefix: 'a', - prefix: 'b', - }, - result: { - currency: 'ETH', - nativeCurrency: 'ETH', - numberOfDecimals: 3, - prefix: 'b', - }, - }, - { - stateProps: { - useNativeCurrencyAsPrimaryCurrency: false, - nativeCurrency: 'ETH', - isMainnet: false, - showFiatInTestnets: false, - }, - ownProps: { - type: 'PRIMARY', - }, - result: { - currency: 'ETH', - nativeCurrency: 'ETH', - numberOfDecimals: 6, - prefix: undefined, - }, - }, - { - stateProps: { - useNativeCurrencyAsPrimaryCurrency: false, - nativeCurrency: 'ETH', - isMainnet: false, - showFiatInTestnets: true, - }, - ownProps: { - type: 'PRIMARY', - }, - result: { - currency: undefined, - nativeCurrency: 'ETH', - numberOfDecimals: 2, - prefix: undefined, - }, - }, - { - stateProps: { - useNativeCurrencyAsPrimaryCurrency: false, - nativeCurrency: 'ETH', - isMainnet: true, - showFiatInTestnets: true, - }, - ownProps: { - type: 'PRIMARY', - }, - result: { - currency: undefined, - nativeCurrency: 'ETH', - numberOfDecimals: 2, - prefix: undefined, - }, - }, - ] - - tests.forEach(({ stateProps, ownProps, result }) => { - assert.deepEqual(mergeProps({ ...stateProps }, mockDispatchProps, { ...ownProps }), { - ...result, - }) - }) - }) - }) -}) diff --git a/ui/app/components/app/user-preferenced-currency-display/user-preferenced-currency-display.component.js b/ui/app/components/app/user-preferenced-currency-display/user-preferenced-currency-display.component.js index 4b64b26c0221..fd7072239276 100644 --- a/ui/app/components/app/user-preferenced-currency-display/user-preferenced-currency-display.component.js +++ b/ui/app/components/app/user-preferenced-currency-display/user-preferenced-currency-display.component.js @@ -1,47 +1,53 @@ -import React, { PureComponent } from 'react' +import React, { useMemo } from 'react' import PropTypes from 'prop-types' import { PRIMARY, SECONDARY, ETH } from '../../../helpers/constants/common' import CurrencyDisplay from '../../ui/currency-display' +import { useUserPreferencedCurrency } from '../../../hooks/useUserPreferencedCurrency' -export default class UserPreferencedCurrencyDisplay extends PureComponent { - static propTypes = { - className: PropTypes.string, - prefix: PropTypes.string, - value: PropTypes.string, - numberOfDecimals: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), - hideLabel: PropTypes.bool, - hideTitle: PropTypes.bool, - style: PropTypes.object, - showEthLogo: PropTypes.bool, - ethLogoHeight: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), - // Used in container - type: PropTypes.oneOf([PRIMARY, SECONDARY]), - ethNumberOfDecimals: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), - fiatNumberOfDecimals: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), - ethPrefix: PropTypes.string, - fiatPrefix: PropTypes.string, - // From container - currency: PropTypes.string, - nativeCurrency: PropTypes.string, - } - - renderEthLogo () { - const { currency, showEthLogo, ethLogoHeight = 12 } = this.props +export default function UserPreferencedCurrencyDisplay ({ + 'data-testid': dataTestId, + ethLogoHeight = 12, + ethNumberOfDecimals, + fiatNumberOfDecimals, + numberOfDecimals: propsNumberOfDecimals, + showEthLogo, + type, + ...restProps +}) { + const { currency, numberOfDecimals } = useUserPreferencedCurrency(type, { ethNumberOfDecimals, fiatNumberOfDecimals, numberOfDecimals: propsNumberOfDecimals }) + const prefixComponent = useMemo(() => { return currency === ETH && showEthLogo && ( ) - } + }, [currency, showEthLogo, ethLogoHeight]) - render () { - return ( - - ) - } + return ( + + ) +} + +UserPreferencedCurrencyDisplay.propTypes = { + className: PropTypes.string, + 'data-testid': PropTypes.string, + prefix: PropTypes.string, + value: PropTypes.string, + numberOfDecimals: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + hideLabel: PropTypes.bool, + hideTitle: PropTypes.bool, + style: PropTypes.object, + showEthLogo: PropTypes.bool, + ethLogoHeight: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + type: PropTypes.oneOf([PRIMARY, SECONDARY]), + ethNumberOfDecimals: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + fiatNumberOfDecimals: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), } diff --git a/ui/app/components/app/user-preferenced-currency-display/user-preferenced-currency-display.container.js b/ui/app/components/app/user-preferenced-currency-display/user-preferenced-currency-display.container.js deleted file mode 100644 index 2a4635955aa5..000000000000 --- a/ui/app/components/app/user-preferenced-currency-display/user-preferenced-currency-display.container.js +++ /dev/null @@ -1,67 +0,0 @@ -import { connect } from 'react-redux' -import UserPreferencedCurrencyDisplay from './user-preferenced-currency-display.component' -import { preferencesSelector, getIsMainnet } from '../../../selectors/selectors' -import { ETH, PRIMARY, SECONDARY } from '../../../helpers/constants/common' - -const mapStateToProps = (state) => { - const { - useNativeCurrencyAsPrimaryCurrency, - showFiatInTestnets, - } = preferencesSelector(state) - - const isMainnet = getIsMainnet(state) - - return { - useNativeCurrencyAsPrimaryCurrency, - showFiatInTestnets, - isMainnet, - nativeCurrency: state.metamask.nativeCurrency, - } -} - -const mergeProps = (stateProps, dispatchProps, ownProps) => { - const { useNativeCurrencyAsPrimaryCurrency, showFiatInTestnets, isMainnet, nativeCurrency, ...restStateProps } = stateProps - const { - type, - numberOfDecimals: propsNumberOfDecimals, - ethNumberOfDecimals, - fiatNumberOfDecimals, - ethPrefix, - fiatPrefix, - prefix: propsPrefix, - ...restOwnProps - } = ownProps - - let currency, numberOfDecimals, prefix - - if (type === PRIMARY && useNativeCurrencyAsPrimaryCurrency || - type === SECONDARY && !useNativeCurrencyAsPrimaryCurrency) { - // Display ETH - currency = nativeCurrency || ETH - numberOfDecimals = propsNumberOfDecimals || ethNumberOfDecimals || 6 - prefix = propsPrefix || ethPrefix - } else if (type === SECONDARY && useNativeCurrencyAsPrimaryCurrency || - type === PRIMARY && !useNativeCurrencyAsPrimaryCurrency) { - // Display Fiat - numberOfDecimals = propsNumberOfDecimals || fiatNumberOfDecimals || 2 - prefix = propsPrefix || fiatPrefix - } - - if (!isMainnet && !showFiatInTestnets) { - currency = nativeCurrency || ETH - numberOfDecimals = propsNumberOfDecimals || ethNumberOfDecimals || 6 - prefix = propsPrefix || ethPrefix - } - - return { - ...restStateProps, - ...dispatchProps, - ...restOwnProps, - nativeCurrency, - currency, - numberOfDecimals, - prefix, - } -} - -export default connect(mapStateToProps, null, mergeProps)(UserPreferencedCurrencyDisplay) diff --git a/ui/app/components/app/user-preferenced-currency-input/tests/user-preferenced-currency-input.component.test.js b/ui/app/components/app/user-preferenced-currency-input/tests/user-preferenced-currency-input.component.test.js index 3802e16f38d8..3241008e439f 100644 --- a/ui/app/components/app/user-preferenced-currency-input/tests/user-preferenced-currency-input.component.test.js +++ b/ui/app/components/app/user-preferenced-currency-input/tests/user-preferenced-currency-input.component.test.js @@ -1,25 +1,25 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { shallow } from 'enzyme' import UserPreferencedCurrencyInput from '../user-preferenced-currency-input.component' import CurrencyInput from '../../../ui/currency-input' -describe('UserPreferencedCurrencyInput Component', () => { - describe('rendering', () => { - it('should render properly', () => { +describe('UserPreferencedCurrencyInput Component', function () { + describe('rendering', function () { + it('should render properly', function () { const wrapper = shallow( - + , ) assert.ok(wrapper) assert.equal(wrapper.find(CurrencyInput).length, 1) }) - it('should render useFiat for CurrencyInput based on preferences.useNativeCurrencyAsPrimaryCurrency', () => { + it('should render useFiat for CurrencyInput based on preferences.useNativeCurrencyAsPrimaryCurrency', function () { const wrapper = shallow( + />, ) assert.ok(wrapper) diff --git a/ui/app/components/app/user-preferenced-currency-input/tests/user-preferenced-currency-input.container.test.js b/ui/app/components/app/user-preferenced-currency-input/tests/user-preferenced-currency-input.container.test.js index 95972644391f..84c67f4536e7 100644 --- a/ui/app/components/app/user-preferenced-currency-input/tests/user-preferenced-currency-input.container.test.js +++ b/ui/app/components/app/user-preferenced-currency-input/tests/user-preferenced-currency-input.container.test.js @@ -5,16 +5,16 @@ let mapStateToProps proxyquire('../user-preferenced-currency-input.container.js', { 'react-redux': { - connect: ms => { + connect: (ms) => { mapStateToProps = ms return () => ({}) }, }, }) -describe('UserPreferencedCurrencyInput container', () => { - describe('mapStateToProps()', () => { - it('should return the correct props', () => { +describe('UserPreferencedCurrencyInput container', function () { + describe('mapStateToProps()', function () { + it('should return the correct props', function () { const mockState = { metamask: { preferences: { diff --git a/ui/app/components/app/user-preferenced-currency-input/user-preferenced-currency-input.container.js b/ui/app/components/app/user-preferenced-currency-input/user-preferenced-currency-input.container.js index 72f17fde43bd..2cce58027909 100644 --- a/ui/app/components/app/user-preferenced-currency-input/user-preferenced-currency-input.container.js +++ b/ui/app/components/app/user-preferenced-currency-input/user-preferenced-currency-input.container.js @@ -1,9 +1,9 @@ import { connect } from 'react-redux' +import { getPreferences } from '../../../selectors' import UserPreferencedCurrencyInput from './user-preferenced-currency-input.component' -import { preferencesSelector } from '../../../selectors/selectors' -const mapStateToProps = state => { - const { useNativeCurrencyAsPrimaryCurrency } = preferencesSelector(state) +const mapStateToProps = (state) => { + const { useNativeCurrencyAsPrimaryCurrency } = getPreferences(state) return { useNativeCurrencyAsPrimaryCurrency, diff --git a/ui/app/components/app/user-preferenced-token-input/tests/user-preferenced-token-input.component.test.js b/ui/app/components/app/user-preferenced-token-input/tests/user-preferenced-token-input.component.test.js index 41cfd51f96c2..ce882f6e5a6f 100644 --- a/ui/app/components/app/user-preferenced-token-input/tests/user-preferenced-token-input.component.test.js +++ b/ui/app/components/app/user-preferenced-token-input/tests/user-preferenced-token-input.component.test.js @@ -1,25 +1,26 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { shallow } from 'enzyme' import UserPreferencedTokenInput from '../user-preferenced-token-input.component' import TokenInput from '../../../ui/token-input' -describe('UserPreferencedCurrencyInput Component', () => { - describe('rendering', () => { - it('should render properly', () => { +describe('UserPreferencedCurrencyInput Component', function () { + describe('rendering', function () { + it('should render properly', function () { const wrapper = shallow( - + , ) assert.ok(wrapper) assert.equal(wrapper.find(TokenInput).length, 1) }) - it('should render showFiat for TokenInput based on preferences.useNativeCurrencyAsPrimaryCurrency', () => { + it('should render showFiat for TokenInput based on preferences.useNativeCurrencyAsPrimaryCurrency', function () { const wrapper = shallow( + />, ) assert.ok(wrapper) diff --git a/ui/app/components/app/user-preferenced-token-input/tests/user-preferenced-token-input.container.test.js b/ui/app/components/app/user-preferenced-token-input/tests/user-preferenced-token-input.container.test.js index 2f89fba9050c..f7bef30e4869 100644 --- a/ui/app/components/app/user-preferenced-token-input/tests/user-preferenced-token-input.container.test.js +++ b/ui/app/components/app/user-preferenced-token-input/tests/user-preferenced-token-input.container.test.js @@ -5,16 +5,16 @@ let mapStateToProps proxyquire('../user-preferenced-token-input.container.js', { 'react-redux': { - connect: ms => { + connect: (ms) => { mapStateToProps = ms return () => ({}) }, }, }) -describe('UserPreferencedTokenInput container', () => { - describe('mapStateToProps()', () => { - it('should return the correct props', () => { +describe('UserPreferencedTokenInput container', function () { + describe('mapStateToProps()', function () { + it('should return the correct props', function () { const mockState = { metamask: { preferences: { diff --git a/ui/app/components/app/user-preferenced-token-input/user-preferenced-token-input.component.js b/ui/app/components/app/user-preferenced-token-input/user-preferenced-token-input.component.js index 24133188d4d7..c75cfbf3353d 100644 --- a/ui/app/components/app/user-preferenced-token-input/user-preferenced-token-input.component.js +++ b/ui/app/components/app/user-preferenced-token-input/user-preferenced-token-input.component.js @@ -4,6 +4,11 @@ import TokenInput from '../../ui/token-input' export default class UserPreferencedTokenInput extends PureComponent { static propTypes = { + token: PropTypes.shape({ + address: PropTypes.string.isRequired, + decimals: PropTypes.number, + symbol: PropTypes.string, + }).isRequired, useNativeCurrencyAsPrimaryCurrency: PropTypes.bool, } diff --git a/ui/app/components/app/user-preferenced-token-input/user-preferenced-token-input.container.js b/ui/app/components/app/user-preferenced-token-input/user-preferenced-token-input.container.js index 4a20b20d960d..daddded7f7ca 100644 --- a/ui/app/components/app/user-preferenced-token-input/user-preferenced-token-input.container.js +++ b/ui/app/components/app/user-preferenced-token-input/user-preferenced-token-input.container.js @@ -1,13 +1,24 @@ import { connect } from 'react-redux' +import PropTypes from 'prop-types' +import { getPreferences } from '../../../selectors' import UserPreferencedTokenInput from './user-preferenced-token-input.component' -import { preferencesSelector } from '../../../selectors/selectors' -const mapStateToProps = state => { - const { useNativeCurrencyAsPrimaryCurrency } = preferencesSelector(state) +const mapStateToProps = (state) => { + const { useNativeCurrencyAsPrimaryCurrency } = getPreferences(state) return { useNativeCurrencyAsPrimaryCurrency, } } -export default connect(mapStateToProps)(UserPreferencedTokenInput) +const UserPreferencedTokenInputContainer = connect(mapStateToProps)(UserPreferencedTokenInput) + +UserPreferencedTokenInputContainer.propTypes = { + token: PropTypes.shape({ + address: PropTypes.string.isRequired, + decimals: PropTypes.number, + symbol: PropTypes.string, + }).isRequired, +} + +export default UserPreferencedTokenInputContainer diff --git a/ui/app/components/app/wallet-overview/eth-overview.js b/ui/app/components/app/wallet-overview/eth-overview.js new file mode 100644 index 000000000000..a98904f245da --- /dev/null +++ b/ui/app/components/app/wallet-overview/eth-overview.js @@ -0,0 +1,123 @@ +import React, { useContext } from 'react' +import PropTypes from 'prop-types' +import { useDispatch, useSelector } from 'react-redux' +import classnames from 'classnames' +import { useHistory } from 'react-router-dom' + +import Button from '../../ui/button' +import Identicon from '../../ui/identicon' +import { I18nContext } from '../../../contexts/i18n' +import { SEND_ROUTE } from '../../../helpers/constants/routes' +import { useMetricEvent } from '../../../hooks/useMetricEvent' +import Tooltip from '../../ui/tooltip' +import UserPreferencedCurrencyDisplay from '../user-preferenced-currency-display' +import { PRIMARY, SECONDARY } from '../../../helpers/constants/common' +import { showModal } from '../../../store/actions' +import { isBalanceCached, getSelectedAccount, getShouldShowFiat } from '../../../selectors/selectors' +import PaperAirplane from '../../ui/icon/paper-airplane-icon' +import WalletOverview from './wallet-overview' + +const EthOverview = ({ className }) => { + const dispatch = useDispatch() + const t = useContext(I18nContext) + const sendEvent = useMetricEvent({ + eventOpts: { + category: 'Navigation', + action: 'Home', + name: 'Clicked Send: Eth', + }, + }) + const depositEvent = useMetricEvent({ + eventOpts: { + category: 'Navigation', + action: 'Home', + name: 'Clicked Deposit', + }, + }) + const history = useHistory() + const balanceIsCached = useSelector(isBalanceCached) + const showFiat = useSelector(getShouldShowFiat) + const selectedAccount = useSelector(getSelectedAccount) + const { balance } = selectedAccount + + return ( + +
    +
    + + { + balanceIsCached ? * : null + } +
    + { + showFiat && ( + + ) + } +
    + + )} + buttons={( + <> + + + + )} + className={className} + icon={} + /> + ) +} + +EthOverview.propTypes = { + className: PropTypes.string, +} + +EthOverview.defaultProps = { + className: undefined, +} + +export default EthOverview diff --git a/ui/app/components/app/wallet-overview/index.js b/ui/app/components/app/wallet-overview/index.js new file mode 100644 index 000000000000..e8205ea58638 --- /dev/null +++ b/ui/app/components/app/wallet-overview/index.js @@ -0,0 +1,2 @@ +export { default as EthOverview } from './eth-overview' +export { default as TokenOverview } from './token-overview' diff --git a/ui/app/components/app/wallet-overview/index.scss b/ui/app/components/app/wallet-overview/index.scss new file mode 100644 index 000000000000..2deaa5d5559d --- /dev/null +++ b/ui/app/components/app/wallet-overview/index.scss @@ -0,0 +1,121 @@ +.wallet-overview { + display: flex; + justify-content: space-between; + align-items: center; + flex: 1; + height: 209px; + min-width: 0; + padding-top: 10px; + flex-direction: column; + width: 100%; + + &__balance { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + width: 100%; + } + + &__buttons { + display: flex; + flex-direction: row; + height: 44px; + margin-bottom: 24px; + } +} + +%asset-buttons { + min-width: initial; + width: 100px; + + &:not(:last-child) { + margin-right: 12px; + } + + text-transform: uppercase; + font-weight: bold; +} + +.eth-overview { + &__balance { + display: flex; + flex-direction: column; + min-width: 0; + position: relative; + align-items: center; + margin: 16px 0; + padding: 0 16px; + max-width: 100%; + } + + &__primary-container { + display: flex; + } + + &__primary-balance { + color: $black; + font-size: 32px; + line-height: 45px; + width: 100%; + justify-content: center; + } + + &__cached-star { + margin-left: 4px; + } + + &__cached-balance, + &__cached-star { + color: $web-orange; + } + + &__cached-secondary-balance { + color: rgba(220, 153, 18, 0.6901960784313725); + font-size: 16px; + line-height: 23px; + } + + &__secondary-balance { + font-size: 16px; + line-height: 23px; + font-weight: 400; + color: $Grey-400; + } + + .wallet-overview &__button { + @extend %asset-buttons; + } +} + +.token-overview { + &__balance { + display: flex; + flex-direction: column; + min-width: 0; + position: relative; + align-items: center; + margin: 16px 0; + padding: 0 16px; + max-width: 100%; + } + + &__primary-balance { + color: $black; + font-size: 32px; + line-height: 45px; + width: 100%; + justify-content: center; + } + + &__secondary-balance { + font-size: 16px; + line-height: 23px; + font-weight: 400; + color: $Grey-400; + } + + .wallet-overview &__button { + @extend %asset-buttons; + } +} diff --git a/ui/app/components/app/wallet-overview/token-overview.js b/ui/app/components/app/wallet-overview/token-overview.js new file mode 100644 index 000000000000..ea7e870f969b --- /dev/null +++ b/ui/app/components/app/wallet-overview/token-overview.js @@ -0,0 +1,97 @@ +import React, { useContext } from 'react' +import PropTypes from 'prop-types' +import { useDispatch, useSelector } from 'react-redux' +import { useHistory } from 'react-router-dom' + +import Button from '../../ui/button' +import Identicon from '../../ui/identicon' +import CurrencyDisplay from '../../ui/currency-display' +import { I18nContext } from '../../../contexts/i18n' +import { SEND_ROUTE } from '../../../helpers/constants/routes' +import { useMetricEvent } from '../../../hooks/useMetricEvent' +import { useTokenTracker } from '../../../hooks/useTokenTracker' +import { useTokenFiatAmount } from '../../../hooks/useTokenFiatAmount' +import { getAssetImages } from '../../../selectors/selectors' +import { updateSendToken } from '../../../store/actions' +import PaperAirplane from '../../ui/icon/paper-airplane-icon' +import WalletOverview from './wallet-overview' + +const TokenOverview = ({ className, token }) => { + const dispatch = useDispatch() + const t = useContext(I18nContext) + const sendTokenEvent = useMetricEvent({ + eventOpts: { + category: 'Navigation', + action: 'Home', + name: 'Clicked Send: Token', + }, + }) + const history = useHistory() + const assetImages = useSelector(getAssetImages) + const { tokensWithBalances } = useTokenTracker([token]) + const balance = tokensWithBalances[0]?.string + const formattedFiatBalance = useTokenFiatAmount(token.address, balance, token.symbol) + + return ( + + + { + formattedFiatBalance + ? ( + + ) + : null + } +
    + )} + buttons={( + + )} + className={className} + icon={( + + )} + /> + ) +} + +TokenOverview.propTypes = { + className: PropTypes.string, + token: PropTypes.shape({ + address: PropTypes.string.isRequired, + decimals: PropTypes.number, + symbol: PropTypes.string, + }).isRequired, +} + +TokenOverview.defaultProps = { + className: undefined, +} + +export default TokenOverview diff --git a/ui/app/components/app/wallet-overview/wallet-overview.js b/ui/app/components/app/wallet-overview/wallet-overview.js new file mode 100644 index 000000000000..30bbd1529835 --- /dev/null +++ b/ui/app/components/app/wallet-overview/wallet-overview.js @@ -0,0 +1,30 @@ +import React from 'react' +import PropTypes from 'prop-types' +import classnames from 'classnames' + +const WalletOverview = ({ balance, buttons, className, icon }) => { + return ( +
    +
    + { icon } + { balance } +
    +
    + { buttons } +
    +
    + ) +} + +WalletOverview.propTypes = { + balance: PropTypes.element.isRequired, + buttons: PropTypes.element.isRequired, + className: PropTypes.string, + icon: PropTypes.element.isRequired, +} + +WalletOverview.defaultProps = { + className: undefined, +} + +export default WalletOverview diff --git a/ui/app/components/app/wallet-view.js b/ui/app/components/app/wallet-view.js deleted file mode 100644 index b8bae542183f..000000000000 --- a/ui/app/components/app/wallet-view.js +++ /dev/null @@ -1,246 +0,0 @@ -const Component = require('react').Component -const PropTypes = require('prop-types') -const connect = require('react-redux').connect -const h = require('react-hyperscript') -const { withRouter } = require('react-router-dom') -const { compose } = require('recompose') -const inherits = require('util').inherits -const classnames = require('classnames') -const { checksumAddress } = require('../../helpers/utils/util') -import Identicon from '../ui/identicon' -// const AccountDropdowns = require('./dropdowns/index.js').AccountDropdowns -const Tooltip = require('../ui/tooltip-v2.js').default -const copyToClipboard = require('copy-to-clipboard') -const actions = require('../../store/actions') -import BalanceComponent from '../ui/balance' -const TokenList = require('./token-list') -const selectors = require('../../selectors/selectors') -const { ADD_TOKEN_ROUTE } = require('../../helpers/constants/routes') - -import AddTokenButton from './add-token-button' - -module.exports = compose( - withRouter, - connect(mapStateToProps, mapDispatchToProps) -)(WalletView) - -WalletView.contextTypes = { - t: PropTypes.func, - metricsEvent: PropTypes.func, -} - -WalletView.defaultProps = { - responsiveDisplayClassname: '', -} - -function mapStateToProps (state) { - - return { - network: state.metamask.network, - sidebarOpen: state.appState.sidebar.isOpen, - identities: state.metamask.identities, - accounts: selectors.getMetaMaskAccounts(state), - keyrings: state.metamask.keyrings, - selectedAddress: selectors.getSelectedAddress(state), - selectedAccount: selectors.getSelectedAccount(state), - selectedTokenAddress: state.metamask.selectedTokenAddress, - } -} - -function mapDispatchToProps (dispatch) { - return { - showSendPage: () => dispatch(actions.showSendPage()), - hideSidebar: () => dispatch(actions.hideSidebar()), - unsetSelectedToken: () => dispatch(actions.setSelectedToken()), - showAccountDetailModal: () => { - dispatch(actions.showModal({ name: 'ACCOUNT_DETAILS' })) - }, - showAddTokenPage: () => dispatch(actions.showAddTokenPage()), - } -} - -inherits(WalletView, Component) -function WalletView () { - Component.call(this) - this.state = { - hasCopied: false, - copyToClipboardPressed: false, - } -} - -WalletView.prototype.renderWalletBalance = function () { - const { - selectedTokenAddress, - selectedAccount, - unsetSelectedToken, - hideSidebar, - sidebarOpen, - } = this.props - - const selectedClass = selectedTokenAddress - ? '' - : 'wallet-balance-wrapper--active' - const className = `flex-column wallet-balance-wrapper ${selectedClass}` - - return h('div', { className }, [ - h('div.wallet-balance', - { - onClick: () => { - unsetSelectedToken() - selectedTokenAddress && sidebarOpen && hideSidebar() - }, - }, - [ - h(BalanceComponent, { - balanceValue: selectedAccount ? selectedAccount.balance : '', - style: {}, - }), - ] - ), - ]) -} - -WalletView.prototype.renderAddToken = function () { - const { - sidebarOpen, - hideSidebar, - history, - } = this.props - const { metricsEvent } = this.context - - return h(AddTokenButton, { - onClick () { - history.push(ADD_TOKEN_ROUTE) - metricsEvent({ - eventOpts: { - category: 'Navigation', - action: 'Token Menu', - name: 'Clicked "Add Token"', - }, - }) - if (sidebarOpen) { - hideSidebar() - } - }, - }) -} - -WalletView.prototype.render = function () { - const { - responsiveDisplayClassname, - selectedAddress, - keyrings, - showAccountDetailModal, - hideSidebar, - identities, - network, - } = this.props - // temporary logs + fake extra wallets - - const checksummedAddress = checksumAddress(selectedAddress, network) - - if (!selectedAddress) { - throw new Error('selectedAddress should not be ' + String(selectedAddress)) - } - - const keyring = keyrings.find((kr) => { - return kr.accounts.includes(selectedAddress) - }) - - let label = '' - let type - if (keyring) { - type = keyring.type - if (type !== 'HD Key Tree') { - if (type.toLowerCase().search('hardware') !== -1) { - label = this.context.t('hardware') - } else { - label = this.context.t('imported') - } - } - } - - return h('div.wallet-view.flex-column', { - style: {}, - className: responsiveDisplayClassname, - }, [ - - // TODO: Separate component: wallet account details - h('div.flex-column.wallet-view-account-details', { - style: {}, - }, [ - h('div.wallet-view__sidebar-close', { - onClick: hideSidebar, - }), - - h('div.wallet-view__keyring-label.allcaps', label), - - h('div.flex-column.flex-center.wallet-view__name-container', { - style: { margin: '0 auto' }, - onClick: showAccountDetailModal, - }, [ - h(Identicon, { - diameter: 54, - address: checksummedAddress, - }), - - h('span.account-name', { - style: {}, - }, [ - identities[selectedAddress].name, - ]), - - h('button.btn-secondary.wallet-view__details-button', this.context.t('details')), - ]), - ]), - - h(Tooltip, { - position: 'bottom', - title: this.state.hasCopied ? this.context.t('copiedExclamation') : this.context.t('copyToClipboard'), - wrapperClassName: 'wallet-view__tooltip', - }, [ - h('button.wallet-view__address', { - className: classnames({ - 'wallet-view__address__pressed': this.state.copyToClipboardPressed, - }), - onClick: () => { - copyToClipboard(checksummedAddress) - this.context.metricsEvent({ - eventOpts: { - category: 'Navigation', - action: 'Home', - name: 'Copied Address', - }, - }) - this.setState({ hasCopied: true }) - setTimeout(() => this.setState({ hasCopied: false }), 3000) - }, - onMouseDown: () => { - this.setState({ copyToClipboardPressed: true }) - }, - onMouseUp: () => { - this.setState({ copyToClipboardPressed: false }) - }, - }, [ - `${checksummedAddress.slice(0, 6)}...${checksummedAddress.slice(-4)}`, - h('i.fa.fa-clipboard', { style: { marginLeft: '8px' } }), - ]), - ]), - - this.renderWalletBalance(), - - h(TokenList), - - this.renderAddToken(), - ]) -} - -// TODO: Extra wallets, for dev testing. Remove when PRing to master. -// const extraWallet = h('div.flex-column.wallet-balance-wrapper', {}, [ -// h('div.wallet-balance', {}, [ -// h(BalanceComponent, { -// balanceValue: selectedAccount.balance, -// style: {}, -// }), -// ]), -// ]) diff --git a/ui/app/components/ui/account-dropdown-mini/account-dropdown-mini.component.js b/ui/app/components/ui/account-dropdown-mini/account-dropdown-mini.component.js deleted file mode 100644 index d9627e31b3fc..000000000000 --- a/ui/app/components/ui/account-dropdown-mini/account-dropdown-mini.component.js +++ /dev/null @@ -1,84 +0,0 @@ -import React, { PureComponent } from 'react' -import PropTypes from 'prop-types' -import AccountListItem from '../../../pages/send/account-list-item/account-list-item.component' - -export default class AccountDropdownMini extends PureComponent { - static propTypes = { - accounts: PropTypes.array.isRequired, - closeDropdown: PropTypes.func, - disabled: PropTypes.bool, - dropdownOpen: PropTypes.bool, - onSelect: PropTypes.func, - openDropdown: PropTypes.func, - selectedAccount: PropTypes.object.isRequired, - } - - static defaultProps = { - closeDropdown: () => {}, - disabled: false, - dropdownOpen: false, - onSelect: () => {}, - openDropdown: () => {}, - } - - getListItemIcon (currentAccount, selectedAccount) { - return currentAccount.address === selectedAccount.address && ( - - ) - } - - renderDropdown () { - const { accounts, selectedAccount, closeDropdown, onSelect } = this.props - - return ( -
    -
    -
    - { - accounts.map(account => ( - { - onSelect(account) - closeDropdown() - }} - icon={this.getListItemIcon(account, selectedAccount)} - /> - )) - } -
    -
    - ) - } - - render () { - const { disabled, selectedAccount, openDropdown, dropdownOpen } = this.props - - return ( -
    - !disabled && openDropdown()} - displayBalance={false} - displayAddress={false} - icon={ - !disabled && - } - /> - { !disabled && dropdownOpen && this.renderDropdown() } -
    - ) - } -} diff --git a/ui/app/components/ui/account-dropdown-mini/index.js b/ui/app/components/ui/account-dropdown-mini/index.js deleted file mode 100644 index cb0839e72e59..000000000000 --- a/ui/app/components/ui/account-dropdown-mini/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './account-dropdown-mini.component' diff --git a/ui/app/components/ui/account-dropdown-mini/tests/account-dropdown-mini.component.test.js b/ui/app/components/ui/account-dropdown-mini/tests/account-dropdown-mini.component.test.js deleted file mode 100644 index 9691f38aa927..000000000000 --- a/ui/app/components/ui/account-dropdown-mini/tests/account-dropdown-mini.component.test.js +++ /dev/null @@ -1,107 +0,0 @@ -import React from 'react' -import assert from 'assert' -import { shallow } from 'enzyme' -import AccountDropdownMini from '../account-dropdown-mini.component' -import AccountListItem from '../../../../pages/send/account-list-item/account-list-item.component' - -describe('AccountDropdownMini', () => { - it('should render an account with an icon', () => { - const accounts = [ - { - address: '0x1', - name: 'account1', - balance: '0x1', - }, - { - address: '0x2', - name: 'account2', - balance: '0x2', - }, - { - address: '0x3', - name: 'account3', - balance: '0x3', - }, - ] - - const wrapper = shallow( - - ) - - assert.ok(wrapper) - assert.equal(wrapper.find(AccountListItem).length, 1) - const accountListItemProps = wrapper.find(AccountListItem).at(0).props() - assert.equal(accountListItemProps.account.address, '0x1') - const iconProps = accountListItemProps.icon.props - assert.equal(iconProps.className, 'fa fa-caret-down fa-lg') - }) - - it('should render a list of accounts', () => { - const accounts = [ - { - address: '0x1', - name: 'account1', - balance: '0x1', - }, - { - address: '0x2', - name: 'account2', - balance: '0x2', - }, - { - address: '0x3', - name: 'account3', - balance: '0x3', - }, - ] - - const wrapper = shallow( - - ) - - assert.ok(wrapper) - assert.equal(wrapper.find(AccountListItem).length, 4) - }) - - it('should render a single account when disabled', () => { - const accounts = [ - { - address: '0x1', - name: 'account1', - balance: '0x1', - }, - { - address: '0x2', - name: 'account2', - balance: '0x2', - }, - { - address: '0x3', - name: 'account3', - balance: '0x3', - }, - ] - - const wrapper = shallow( - - ) - - assert.ok(wrapper) - assert.equal(wrapper.find(AccountListItem).length, 1) - const accountListItemProps = wrapper.find(AccountListItem).at(0).props() - assert.equal(accountListItemProps.account.address, '0x1') - assert.equal(accountListItemProps.icon, false) - }) -}) diff --git a/ui/app/components/ui/account-mismatch-warning/account-mismatch-warning.component.js b/ui/app/components/ui/account-mismatch-warning/account-mismatch-warning.component.js new file mode 100644 index 000000000000..fc20a9900e07 --- /dev/null +++ b/ui/app/components/ui/account-mismatch-warning/account-mismatch-warning.component.js @@ -0,0 +1,30 @@ +import React from 'react' +import { useSelector } from 'react-redux' +import PropTypes from 'prop-types' +import Tooltip from '../tooltip' +import { getSelectedAccount } from '../../../selectors' +import InfoIcon from '../icon/info-icon.component' +import { useI18nContext } from '../../../hooks/useI18nContext' + +export default function AccountMismatchWarning ({ address }) { + const selectedAccount = useSelector(getSelectedAccount) + const t = useI18nContext() + if (selectedAccount.address === address) { + return null + } + + return ( + {t('notCurrentAccount')}

    } + wrapperClassName="account-mismatch-warning__tooltip-wrapper" + containerClassName="account-mismatch-warning__tooltip-container" + > +
    +
    + ) +} + +AccountMismatchWarning.propTypes = { + address: PropTypes.string.isRequired, +} diff --git a/ui/app/components/ui/account-mismatch-warning/index.scss b/ui/app/components/ui/account-mismatch-warning/index.scss new file mode 100644 index 000000000000..751640871a16 --- /dev/null +++ b/ui/app/components/ui/account-mismatch-warning/index.scss @@ -0,0 +1,8 @@ +.account-mismatch-warning { + &__tooltip-container { + &-icon { + display: flex; + align-items: center; + } + } +} diff --git a/ui/app/components/ui/account-mismatch-warning/tests/acccount-mismatch-warning.component.test.js b/ui/app/components/ui/account-mismatch-warning/tests/acccount-mismatch-warning.component.test.js new file mode 100644 index 000000000000..f49935770029 --- /dev/null +++ b/ui/app/components/ui/account-mismatch-warning/tests/acccount-mismatch-warning.component.test.js @@ -0,0 +1,32 @@ +import assert from 'assert' +import React from 'react' +import * as reactRedux from 'react-redux' +import sinon from 'sinon' +import { shallow } from 'enzyme' +import InfoIcon from '../../icon/info-icon.component' +import AccountMismatchWarning from '../account-mismatch-warning.component' +import { getSelectedAccount } from '../../../../selectors' + +describe('AccountMismatchWarning', function () { + before(function () { + sinon.stub(reactRedux, 'useSelector').callsFake((selector) => { + if (selector === getSelectedAccount) { + return { address: 'mockedAddress' } + } + throw new Error( + `${selector.name} is not cared for in the AccountMismatchWarning test useSelector stub`, + ) + }) + }) + it('renders nothing when the addresses match', function () { + const wrapper = shallow() + assert.equal(wrapper.find(InfoIcon).length, 0) + }) + it('renders a warning info icon when addresses do not match', function () { + const wrapper = shallow() + assert.equal(wrapper.find(InfoIcon).length, 1) + }) + after(function () { + sinon.restore() + }) +}) diff --git a/ui/app/components/ui/alert-circle-icon/alert-circle-icon.component.js b/ui/app/components/ui/alert-circle-icon/alert-circle-icon.component.js new file mode 100644 index 000000000000..8569f873d279 --- /dev/null +++ b/ui/app/components/ui/alert-circle-icon/alert-circle-icon.component.js @@ -0,0 +1,26 @@ +import React, { Component } from 'react' +import PropTypes from 'prop-types' +import CircleIcon from '../circle-icon' + +const typeConfig = { + danger: { + circleClass: 'alert-circle-icon--danger', + iconSource: 'images/icons/red-triangle-exclaim.svg', + }, + warning: { + circleClass: 'alert-circle-icon--warning', + iconSource: 'images/icons/yellow-bell.svg', + }, +} + +export default class AlertCircleIcon extends Component { + static propTypes = { + type: PropTypes.oneOf(Object.keys(typeConfig)).isRequired, + } + + render () { + return ( + + ) + } +} diff --git a/ui/app/components/ui/alert-circle-icon/alert-circle-icon.stories.js b/ui/app/components/ui/alert-circle-icon/alert-circle-icon.stories.js new file mode 100644 index 000000000000..9f873bf2bbd8 --- /dev/null +++ b/ui/app/components/ui/alert-circle-icon/alert-circle-icon.stories.js @@ -0,0 +1,18 @@ +import React from 'react' +import AlertCircleIcon from './alert-circle-icon.component' + +export default { + title: 'AlertCircleIcon', +} + +export const dangerCircleIcon = () => ( + +) + +export const warningCircleIcon = () => ( + +) diff --git a/ui/app/components/ui/alert-circle-icon/index.js b/ui/app/components/ui/alert-circle-icon/index.js new file mode 100644 index 000000000000..3cf319925344 --- /dev/null +++ b/ui/app/components/ui/alert-circle-icon/index.js @@ -0,0 +1 @@ +export { default } from './alert-circle-icon.component' diff --git a/ui/app/components/ui/alert-circle-icon/index.scss b/ui/app/components/ui/alert-circle-icon/index.scss new file mode 100644 index 000000000000..4bdd9baf28ae --- /dev/null +++ b/ui/app/components/ui/alert-circle-icon/index.scss @@ -0,0 +1,13 @@ +.alert-circle-icon { + &--danger { + border-color: $accent-red; + color: $accent-red; + background: $Red-000; + } + + &--warning { + border-color: $accent-yellow; + color: $accent-yellow; + background: $Yellow-000; + } +} diff --git a/ui/app/components/ui/alert/index.js b/ui/app/components/ui/alert/index.js index b1229f502099..437bf492bb5c 100644 --- a/ui/app/components/ui/alert/index.js +++ b/ui/app/components/ui/alert/index.js @@ -1,62 +1,57 @@ -const { Component } = require('react') -const PropTypes = require('prop-types') -const h = require('react-hyperscript') +import classnames from 'classnames' +import PropTypes from 'prop-types' +import React, { Component } from 'react' class Alert extends Component { - - constructor (props) { - super(props) - - this.state = { - visble: false, - msg: false, - className: '', - } - } - - componentWillReceiveProps (nextProps) { - if (!this.props.visible && nextProps.visible) { - this.animateIn(nextProps) - } else if (this.props.visible && !nextProps.visible) { - this.animateOut() - } - } - - animateIn (props) { - this.setState({ - msg: props.msg, - visible: true, - className: '.visible', - }) + state = { + visible: false, + msg: false, + className: '', + } + + UNSAFE_componentWillReceiveProps (nextProps) { + if (!this.props.visible && nextProps.visible) { + this.animateIn(nextProps.msg) + } else if (this.props.visible && !nextProps.visible) { + this.animateOut() } - - animateOut () { - this.setState({ - msg: null, - className: '.hidden', - }) - - setTimeout(_ => { - this.setState({visible: false}) - }, 500) - - } - - render () { - if (this.state.visible) { - return ( - h(`div.global-alert${this.state.className}`, {}, - h('a.msg', {}, this.state.msg) - ) - ) - } - return null + } + + animateIn (msg) { + this.setState({ + msg, + visible: true, + className: 'visible', + }) + } + + animateOut () { + this.setState({ + msg: null, + className: 'hidden', + }) + + setTimeout((_) => { + this.setState({ visible: false }) + }, 500) + + } + + render () { + if (this.state.visible) { + return ( +
    + ) } + return null + } } Alert.propTypes = { - visible: PropTypes.bool.isRequired, - msg: PropTypes.string, + visible: PropTypes.bool.isRequired, + msg: PropTypes.string, /* eslint-disable-line react/no-unused-prop-types */ } -module.exports = Alert +export default Alert diff --git a/ui/app/components/ui/alert/index.scss b/ui/app/components/ui/alert/index.scss new file mode 100644 index 000000000000..0e58f2aac899 --- /dev/null +++ b/ui/app/components/ui/alert/index.scss @@ -0,0 +1,57 @@ +.global-alert { + position: relative; + width: 100%; + background-color: #33a4e7; + + .msg { + width: 100%; + display: block; + color: white; + font-size: 12px; + text-align: center; + } +} + +.global-alert.hidden { + animation: alertHidden 0.5s ease forwards; +} + +.global-alert.visible { + animation: alert 0.5s ease forwards; +} + +/* Animation */ +@keyframes alert { + 0% { + opacity: 0; + top: -50px; + padding: 0; + line-height: 12px; + } + + 50% { + opacity: 1; + } + + 100% { + top: 0; + padding: 8px; + line-height: 12px; + } +} + +@keyframes alertHidden { + 0% { + top: 0; + opacity: 1; + padding: 8px; + line-height: 12px; + } + + 100% { + opacity: 0; + top: -50px; + padding: 0; + line-height: 0; + } +} diff --git a/ui/app/components/ui/alert/tests/alert.test.js b/ui/app/components/ui/alert/tests/alert.test.js new file mode 100644 index 000000000000..70aaa5e16fa8 --- /dev/null +++ b/ui/app/components/ui/alert/tests/alert.test.js @@ -0,0 +1,43 @@ +import assert from 'assert' +import React from 'react' +import sinon from 'sinon' +import { shallow } from 'enzyme' +import Alert from '..' + +describe('Alert', function () { + let wrapper + + beforeEach(function () { + wrapper = shallow( + , + ) + }) + + it('renders nothing with no visible boolean in state', function () { + const alert = wrapper.find('.global-alert') + assert.equal(alert.length, 0) + }) + + it('renders when visible in state is true, and message', function () { + const errorMessage = 'Error Message' + + wrapper.setState({ visible: true, msg: errorMessage }) + + const alert = wrapper.find('.global-alert') + assert.equal(alert.length, 1) + + const errorText = wrapper.find('.msg') + assert.equal(errorText.text(), errorMessage) + }) + + it('calls component method when componentWillReceiveProps is called', function () { + const animateInSpy = sinon.stub(wrapper.instance(), 'animateIn') + const animateOutSpy = sinon.stub(wrapper.instance(), 'animateOut') + + wrapper.setProps({ visible: true }) + assert(animateInSpy.calledOnce) + + wrapper.setProps({ visible: false }) + assert(animateOutSpy.calledOnce) + }) +}) diff --git a/ui/app/components/ui/balance/balance.component.js b/ui/app/components/ui/balance/balance.component.js deleted file mode 100644 index 9a6f71ce5f6e..000000000000 --- a/ui/app/components/ui/balance/balance.component.js +++ /dev/null @@ -1,92 +0,0 @@ -import React, { PureComponent } from 'react' -import PropTypes from 'prop-types' -import TokenBalance from '../token-balance' -import Identicon from '../identicon' -import UserPreferencedCurrencyDisplay from '../../app/user-preferenced-currency-display' -import { PRIMARY, SECONDARY } from '../../../helpers/constants/common' -import { formatBalance } from '../../../helpers/utils/util' - -export default class Balance extends PureComponent { - static propTypes = { - account: PropTypes.object, - assetImages: PropTypes.object, - nativeCurrency: PropTypes.string, - needsParse: PropTypes.bool, - network: PropTypes.string, - showFiat: PropTypes.bool, - token: PropTypes.object, - } - - static defaultProps = { - needsParse: true, - showFiat: true, - } - - renderBalance () { - const { account, nativeCurrency, needsParse, showFiat } = this.props - const balanceValue = account && account.balance - const formattedBalance = balanceValue - ? formatBalance(balanceValue, 6, needsParse, nativeCurrency) - : '...' - - if (formattedBalance === 'None' || formattedBalance === '...') { - return ( -
    -
    - { formattedBalance } -
    -
    - ) - } - - return ( -
    - - { - showFiat && ( - - ) - } -
    - ) - } - - renderTokenBalance () { - const { token } = this.props - - return ( -
    -
    - -
    -
    - ) - } - - render () { - const { token, network, assetImages } = this.props - const address = token && token.address - const image = assetImages && address ? assetImages[token.address] : undefined - - return ( -
    - - { token ? this.renderTokenBalance() : this.renderBalance() } -
    - ) - } -} diff --git a/ui/app/components/ui/balance/balance.container.js b/ui/app/components/ui/balance/balance.container.js deleted file mode 100644 index 2ad5c5ad8a64..000000000000 --- a/ui/app/components/ui/balance/balance.container.js +++ /dev/null @@ -1,32 +0,0 @@ -import { connect } from 'react-redux' -import Balance from './balance.component' -import { - getNativeCurrency, - getAssetImages, - conversionRateSelector, - getCurrentCurrency, - getMetaMaskAccounts, - getIsMainnet, - preferencesSelector, -} from '../../../selectors/selectors' - -const mapStateToProps = state => { - const { showFiatInTestnets } = preferencesSelector(state) - const isMainnet = getIsMainnet(state) - const accounts = getMetaMaskAccounts(state) - const network = state.metamask.network - const selectedAddress = state.metamask.selectedAddress || Object.keys(accounts)[0] - const account = accounts[selectedAddress] - - return { - account, - network, - nativeCurrency: getNativeCurrency(state), - conversionRate: conversionRateSelector(state), - currentCurrency: getCurrentCurrency(state), - assetImages: getAssetImages(state), - showFiat: (isMainnet || !!showFiatInTestnets), - } -} - -export default connect(mapStateToProps)(Balance) diff --git a/ui/app/components/ui/balance/index.js b/ui/app/components/ui/balance/index.js deleted file mode 100644 index f8fb9ea19a2f..000000000000 --- a/ui/app/components/ui/balance/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './balance.container' diff --git a/ui/app/components/ui/breadcrumbs/breadcrumbs.component.js b/ui/app/components/ui/breadcrumbs/breadcrumbs.component.js index 6644836db693..c407e4ead301 100644 --- a/ui/app/components/ui/breadcrumbs/breadcrumbs.component.js +++ b/ui/app/components/ui/breadcrumbs/breadcrumbs.component.js @@ -19,7 +19,7 @@ export default class Breadcrumbs extends PureComponent {
    )) } diff --git a/ui/app/components/ui/breadcrumbs/tests/breadcrumbs.component.test.js b/ui/app/components/ui/breadcrumbs/tests/breadcrumbs.component.test.js index 5013c5b60746..63b9a3f51e44 100644 --- a/ui/app/components/ui/breadcrumbs/tests/breadcrumbs.component.test.js +++ b/ui/app/components/ui/breadcrumbs/tests/breadcrumbs.component.test.js @@ -1,22 +1,22 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { shallow } from 'enzyme' import Breadcrumbs from '../breadcrumbs.component' -describe('Breadcrumbs Component', () => { - it('should render with the correct colors', () => { +describe('Breadcrumbs Component', function () { + it('should render with the correct colors', function () { const wrapper = shallow( + />, ) assert.ok(wrapper) assert.equal(wrapper.find('.breadcrumbs').length, 1) assert.equal(wrapper.find('.breadcrumb').length, 3) - assert.equal(wrapper.find('.breadcrumb').at(0).props().style['backgroundColor'], '#FFFFFF') - assert.equal(wrapper.find('.breadcrumb').at(1).props().style['backgroundColor'], '#D8D8D8') - assert.equal(wrapper.find('.breadcrumb').at(2).props().style['backgroundColor'], '#FFFFFF') + assert.equal(wrapper.find('.breadcrumb').at(0).props().style.backgroundColor, '#FFFFFF') + assert.equal(wrapper.find('.breadcrumb').at(1).props().style.backgroundColor, '#D8D8D8') + assert.equal(wrapper.find('.breadcrumb').at(2).props().style.backgroundColor, '#FFFFFF') }) }) diff --git a/ui/app/components/ui/button-group/button-group.stories.js b/ui/app/components/ui/button-group/button-group.stories.js index c58c628b3353..e79f8bfea549 100644 --- a/ui/app/components/ui/button-group/button-group.stories.js +++ b/ui/app/components/ui/button-group/button-group.stories.js @@ -1,49 +1,52 @@ import React from 'react' -import { storiesOf } from '@storybook/react' import { action } from '@storybook/addon-actions' -import ButtonGroup from '.' -import Button from '../button' import { text, boolean } from '@storybook/addon-knobs/react' +import Button from '../button' +import ButtonGroup from '.' + +export default { + title: 'ButtonGroup', +} + +export const withButtons = () => ( + + + + + +) -storiesOf('ButtonGroup', module) - .add('with Buttons', () => - ( + + - - - - ) - .add('with a disabled Button', () => - + - - - ) + {text('Button2', 'Disabled')} + + +) diff --git a/ui/app/components/ui/button-group/index.scss b/ui/app/components/ui/button-group/index.scss index 29713c75bcdd..4ba758c30331 100644 --- a/ui/app/components/ui/button-group/index.scss +++ b/ui/app/components/ui/button-group/index.scss @@ -4,7 +4,6 @@ align-items: center; &__button { - font-family: Roboto; font-size: 1rem; color: $tundora; border-style: solid; @@ -32,7 +31,7 @@ } &:disabled { - opacity: .5; + opacity: 0.5; } } -} \ No newline at end of file +} diff --git a/ui/app/components/ui/button-group/tests/button-group-component.test.js b/ui/app/components/ui/button-group/tests/button-group-component.test.js index 0bece90d6fc7..64a9353d90dc 100644 --- a/ui/app/components/ui/button-group/tests/button-group-component.test.js +++ b/ui/app/components/ui/button-group/tests/button-group-component.test.js @@ -1,111 +1,121 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { shallow } from 'enzyme' import sinon from 'sinon' -import ButtonGroup from '../button-group.component.js' +import ButtonGroup from '../button-group.component' -const childButtonSpies = { - onClick: sinon.spy(), -} +describe('ButtonGroup Component', function () { + let wrapper -sinon.spy(ButtonGroup.prototype, 'handleButtonClick') -sinon.spy(ButtonGroup.prototype, 'renderButtons') + const childButtonSpies = { + onClick: sinon.spy(), + } -const mockButtons = [ - , - , - , -] + const mockButtons = [ + , + , + , + ] -describe('ButtonGroup Component', function () { - let wrapper + before(function () { + sinon.spy(ButtonGroup.prototype, 'handleButtonClick') + sinon.spy(ButtonGroup.prototype, 'renderButtons') + }) - beforeEach(() => { - wrapper = shallow({mockButtons}) + beforeEach(function () { + wrapper = shallow(( + + {mockButtons} + + )) }) - afterEach(() => { + afterEach(function () { childButtonSpies.onClick.resetHistory() ButtonGroup.prototype.handleButtonClick.resetHistory() ButtonGroup.prototype.renderButtons.resetHistory() }) - describe('componentDidUpdate', () => { - it('should set the activeButtonIndex to the updated newActiveButtonIndex', () => { + after(function () { + sinon.restore() + }) + + describe('componentDidUpdate', function () { + it('should set the activeButtonIndex to the updated newActiveButtonIndex', function () { assert.equal(wrapper.state('activeButtonIndex'), 1) wrapper.setProps({ newActiveButtonIndex: 2 }) assert.equal(wrapper.state('activeButtonIndex'), 2) }) - it('should not set the activeButtonIndex to an updated newActiveButtonIndex that is not a number', () => { + it('should not set the activeButtonIndex to an updated newActiveButtonIndex that is not a number', function () { assert.equal(wrapper.state('activeButtonIndex'), 1) wrapper.setProps({ newActiveButtonIndex: null }) assert.equal(wrapper.state('activeButtonIndex'), 1) }) }) - describe('handleButtonClick', () => { - it('should set the activeButtonIndex', () => { + describe('handleButtonClick', function () { + it('should set the activeButtonIndex', function () { assert.equal(wrapper.state('activeButtonIndex'), 1) wrapper.instance().handleButtonClick(2) assert.equal(wrapper.state('activeButtonIndex'), 2) }) }) - describe('renderButtons', () => { - it('should render a button for each child', () => { - const childButtons = wrapper.find('.button-group__button') - assert.equal(childButtons.length, 3) + describe('renderButtons', function () { + it('should render a button for each child', function () { + const childButtons = wrapper.find('.button-group__button') + assert.equal(childButtons.length, 3) }) - it('should render the correct button with an active state', () => { - const childButtons = wrapper.find('.button-group__button') - const activeChildButton = wrapper.find('.button-group__button--active') - assert.deepEqual(childButtons.get(1), activeChildButton.get(0)) + it('should render the correct button with an active state', function () { + const childButtons = wrapper.find('.button-group__button') + const activeChildButton = wrapper.find('.button-group__button--active') + assert.deepEqual(childButtons.get(1), activeChildButton.get(0)) }) - it('should call handleButtonClick and the respective button\'s onClick method when a button is clicked', () => { - assert.equal(ButtonGroup.prototype.handleButtonClick.callCount, 0) - assert.equal(childButtonSpies.onClick.callCount, 0) - const childButtons = wrapper.find('.button-group__button') - childButtons.at(0).props().onClick() - childButtons.at(1).props().onClick() - childButtons.at(2).props().onClick() - assert.equal(ButtonGroup.prototype.handleButtonClick.callCount, 3) - assert.equal(childButtonSpies.onClick.callCount, 3) + it('should call handleButtonClick and the respective button\'s onClick method when a button is clicked', function () { + assert.equal(ButtonGroup.prototype.handleButtonClick.callCount, 0) + assert.equal(childButtonSpies.onClick.callCount, 0) + const childButtons = wrapper.find('.button-group__button') + childButtons.at(0).props().onClick() + childButtons.at(1).props().onClick() + childButtons.at(2).props().onClick() + assert.equal(ButtonGroup.prototype.handleButtonClick.callCount, 3) + assert.equal(childButtonSpies.onClick.callCount, 3) }) - it('should render all child buttons as disabled if props.disabled is true', () => { - const childButtons = wrapper.find('.button-group__button') - childButtons.forEach(button => { - assert.equal(button.props().disabled, undefined) - }) - wrapper.setProps({ disabled: true }) - const disabledChildButtons = wrapper.find('[disabled=true]') - assert.equal(disabledChildButtons.length, 3) + it('should render all child buttons as disabled if props.disabled is true', function () { + const childButtons = wrapper.find('.button-group__button') + childButtons.forEach((button) => { + assert.equal(button.props().disabled, undefined) + }) + wrapper.setProps({ disabled: true }) + const disabledChildButtons = wrapper.find('[disabled=true]') + assert.equal(disabledChildButtons.length, 3) }) - it('should render the children of the button', () => { - const mockClass = wrapper.find('.mockClass') - assert.equal(mockClass.length, 1) + it('should render the children of the button', function () { + const mockClass = wrapper.find('.mockClass') + assert.equal(mockClass.length, 1) }) }) - describe('render', () => { - it('should render a div with the expected class and style', () => { + describe('render', function () { + it('should render a div with the expected class and style', function () { assert.equal(wrapper.find('div').at(0).props().className, 'someClassName') assert.deepEqual(wrapper.find('div').at(0).props().style, { color: 'red' }) }) - it('should call renderButtons when rendering', () => { - assert.equal(ButtonGroup.prototype.renderButtons.callCount, 1) - wrapper.instance().render() - assert.equal(ButtonGroup.prototype.renderButtons.callCount, 2) + it('should call renderButtons when rendering', function () { + assert.equal(ButtonGroup.prototype.renderButtons.callCount, 1) + wrapper.instance().render() + assert.equal(ButtonGroup.prototype.renderButtons.callCount, 2) }) }) }) diff --git a/ui/app/components/ui/button/button.component.js b/ui/app/components/ui/button/button.component.js index 39e81317cc32..d0405aa3d45a 100644 --- a/ui/app/components/ui/button/button.component.js +++ b/ui/app/components/ui/button/button.component.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react' +import React from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' @@ -8,6 +8,7 @@ const CLASSNAME_SECONDARY = 'btn-secondary' const CLASSNAME_CONFIRM = 'btn-primary' const CLASSNAME_RAISED = 'btn-raised' const CLASSNAME_LARGE = 'btn--large' +const CLASSNAME_ROUNDED = 'btn--rounded' const CLASSNAME_FIRST_TIME = 'btn--first-time' const typeHash = { @@ -24,33 +25,35 @@ const typeHash = { 'first-time': CLASSNAME_FIRST_TIME, } -export default class Button extends Component { - static propTypes = { - type: PropTypes.string, - large: PropTypes.bool, - className: PropTypes.string, - children: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.array, - PropTypes.element, - ]), - } +const Button = ({ type, submit, large, children, icon, rounded, className, ...buttonProps }) => ( + +) - render () { - const { type, large, className, ...buttonProps } = this.props +Button.propTypes = { + type: PropTypes.string, + submit: PropTypes.bool, + large: PropTypes.bool, + rounded: PropTypes.bool, + className: PropTypes.string, + children: PropTypes.node, + icon: PropTypes.node, +} - return ( - - ) - } +Button.defaultProps = { + submit: false, } + +export default Button diff --git a/ui/app/components/ui/button/button.stories.js b/ui/app/components/ui/button/button.stories.js index 9df53439dde3..c19551835ba8 100644 --- a/ui/app/components/ui/button/button.stories.js +++ b/ui/app/components/ui/button/button.stories.js @@ -1,71 +1,69 @@ import React from 'react' -import { storiesOf } from '@storybook/react' import { action } from '@storybook/addon-actions' -import Button from '.' import { text, boolean } from '@storybook/addon-knobs/react' +import Button from '.' + +export default { + title: 'Button', +} + +export const primaryType = () => ( + +) + +export const secondaryType = () => ( + +) + +export const defaultType = () => ( + +) + +export const warningType = () => ( + +) + +export const dangerType = () => ( + +) + +export const dangerPrimaryType = () => ( + +) -// ', 'secondary', 'default', 'warning', 'danger', 'danger-primary', 'link'], 'primary')} -storiesOf('Button', module) - .add('Button - Primary', () => - - ) - .add('Button - Secondary', () => - - ) - .add('Button - Default', () => - - ) - .add('Button - Warning', () => - - ) - .add('Button - Danger', () => - - ) - .add('Button - Danger Primary', () => - - ) - .add('Button - Link', () => - - ) diff --git a/ui/app/components/ui/button/buttons.scss b/ui/app/components/ui/button/buttons.scss index f1366cffe582..a8364ca656e2 100644 --- a/ui/app/components/ui/button/buttons.scss +++ b/ui/app/components/ui/button/buttons.scss @@ -2,69 +2,40 @@ Buttons */ -$hover-secondary: #B0D7F2; -$hover-default: #B3B3B3; -$hover-confirm: #0372C3; -$hover-red: #FEB6BF; -$hover-red-primary: #C72837; -$hover-orange: #FFD3B5; +$hover-secondary: #b0d7f2; +$hover-default: #b3b3b3; +$hover-confirm: #0372c3; +$hover-red: #feb6bf; +$hover-red-primary: #c72837; +$hover-orange: #ffd3b5; +$warning-light-orange: #f8b588; -%button { - @include h6; +.button { + @include H6; font-weight: 500; - font-family: Roboto, Arial; line-height: 1.25rem; - padding: .75rem 1rem; + padding: 0.75rem 1rem; display: flex; justify-content: center; align-items: center; box-sizing: border-box; border-radius: 6px; width: 100%; - outline: none; - transition: border-color .3s ease, background-color .3s ease; + transition: border-color 0.3s ease, background-color 0.3s ease; &--disabled, &[disabled] { cursor: auto; - opacity: .5; + opacity: 0.5; pointer-events: none; } -} - -%link { - @include h4; - - color: $Blue-500; - line-height: 1.25rem; - cursor: pointer; - background-color: transparent; - - &:hover { - color: $Blue-400; - } - &:active { - color: $Blue-600; + &__icon { + display: flex; + align-items: center; + margin-right: 4px; } - - &--disabled, - &[disabled] { - cursor: auto; - opacity: 1; - pointer-events: none; - color: $hover-secondary; - } -} - -%small-link { - @extend %link; - @include h6; -} - -.button { - @extend %button; } .btn-secondary { @@ -162,7 +133,7 @@ $hover-orange: #FFD3B5; } &:active { - background: #FBFBFC; + background: #fbfbfc; border-color: $Grey-500; } @@ -196,7 +167,28 @@ $hover-orange: #FFD3B5; } .btn-link { - @extend %link; + @include H4; + + color: $Blue-500; + line-height: 1.25rem; + cursor: pointer; + background-color: transparent; + + &:hover { + color: $Blue-400; + } + + &:active { + color: $Blue-600; + } + + &--disabled, + &[disabled] { + cursor: auto; + opacity: 1; + pointer-events: none; + color: $hover-secondary; + } } .btn--large { @@ -208,9 +200,9 @@ $hover-orange: #FFD3B5; */ .btn-raised { - color: $curious-blue; + color: $primary-blue; background-color: $white; - box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.08); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08); padding: 6px; height: initial; min-height: initial; @@ -221,27 +213,118 @@ $hover-orange: #FFD3B5; .btn--first-time { height: 54px; width: 198px; - box-shadow: 0 2px 4px 0 rgba(0, 0, 0, .14); + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.14); color: $white; font-size: 1.25rem; font-weight: 500; transition: 200ms ease-in-out; - background-color: rgba(247, 134, 28, .9); + background-color: rgba(247, 134, 28, 0.9); border-radius: 0; } button[disabled], input[type="submit"][disabled] { cursor: not-allowed; - opacity: .5; + opacity: 0.5; } button.primary { padding: 8px 12px; background: #f7861c; - box-shadow: 0 3px 6px rgba(247, 134, 28, .36); + box-shadow: 0 3px 6px rgba(247, 134, 28, 0.36); color: $white; font-size: 1.1em; - font-family: Roboto; text-transform: uppercase; } + +.btn--rounded { + border-radius: 100px; + will-change: box-shadow; + transition: box-shadow cubic-bezier(0.6, -0.28, 0.735, 0.045) 200ms; + + &:hover { + box-shadow: 0 0 8px rgba(0, 0, 0, 0.1); + } + + &.btn-secondary { + border: 1px solid $Blue-500; + + &--disabled, + &[disabled] { + border-color: $hover-secondary; + color: $hover-secondary; + } + + &:active { + border-color: $Blue-600; + } + } + + &.btn-default { + border: 1px solid $Grey-500; + + &--disabled, + &[disabled] { + border-color: $Grey-100; + color: $hover-default; + } + + &:active { + border-color: $Grey-600; + } + } + + &.btn-danger { + border: 1px solid $Red-500; + + &--disabled, + &[disabled] { + border-color: $Red-100; + color: $Red-300; + } + + &:active { + border-color: $Red-600; + } + } + + &.btn-warning { + border: 1px solid $Orange-500; + + &--disabled, + &[disabled] { + border-color: $warning-light-orange; + color: $warning-light-orange; + } + + &:active { + border-color: $Orange-600; + } + } + + &.btn-primary { + background-color: $Blue-500; + + &--disabled, + &[disabled] { + background-color: $hover-secondary; + } + + &:active { + background-color: $Blue-600; + } + } + + &.btn-danger-primary { + background-color: $Red-500; + + &--disabled, + &[disabled] { + background-color: $Red-300; + } + + &:active { + background-color: $Red-600; + } + } +} diff --git a/ui/app/components/ui/button/index.js b/ui/app/components/ui/button/index.js index 33ae95ae21b5..19702ed25f10 100644 --- a/ui/app/components/ui/button/index.js +++ b/ui/app/components/ui/button/index.js @@ -1,2 +1,3 @@ import Button from './button.component' -module.exports = Button + +export default Button diff --git a/ui/app/components/ui/card/index.scss b/ui/app/components/ui/card/index.scss index bde54a15ebde..4fa32e1bc36e 100644 --- a/ui/app/components/ui/card/index.scss +++ b/ui/app/components/ui/card/index.scss @@ -1,6 +1,6 @@ .card { border-radius: 4px; - box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.08); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08); padding: 8px; &__title { diff --git a/ui/app/components/ui/card/tests/card.component.test.js b/ui/app/components/ui/card/tests/card.component.test.js index cea05033f1d9..9eb1043517ff 100644 --- a/ui/app/components/ui/card/tests/card.component.test.js +++ b/ui/app/components/ui/card/tests/card.component.test.js @@ -1,17 +1,17 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { shallow } from 'enzyme' import Card from '../card.component' -describe('Card Component', () => { - it('should render a card with a title and child element', () => { +describe('Card Component', function () { + it('should render a card with a title and child element', function () { const wrapper = shallow(
    Child
    -
    + , ) assert.ok(wrapper.hasClass('card-test-class')) diff --git a/ui/app/components/ui/check-box/check-box.component.js b/ui/app/components/ui/check-box/check-box.component.js new file mode 100644 index 000000000000..4a745714098f --- /dev/null +++ b/ui/app/components/ui/check-box/check-box.component.js @@ -0,0 +1,66 @@ +import React, { useLayoutEffect, useRef } from 'react' +import PropTypes from 'prop-types' +import classnames from 'classnames' + +const CHECKBOX_STATE = { + CHECKED: 'CHECKED', + INDETERMINATE: 'INDETERMINATE', + UNCHECKED: 'UNCHECKED', +} + +export const { CHECKED, INDETERMINATE, UNCHECKED } = CHECKBOX_STATE + +const CheckBox = ({ className, disabled, id, onClick, checked, title }) => { + if (typeof checked === 'boolean') { + // eslint-disable-next-line no-param-reassign + checked = checked + ? CHECKBOX_STATE.CHECKED + : CHECKBOX_STATE.UNCHECKED + } + const ref = useRef(null) + useLayoutEffect(() => { + ref.current.indeterminate = checked === CHECKBOX_STATE.INDETERMINATE + }, [checked]) + + return ( + { + event.preventDefault() + onClick() + } + : null + } + readOnly + ref={ref} + title={title} + type="checkbox" + /> + ) +} + +CheckBox.propTypes = { + className: PropTypes.string, + disabled: PropTypes.bool, + id: PropTypes.string, + onClick: PropTypes.func, + checked: PropTypes.oneOf([...Object.keys(CHECKBOX_STATE), true, false]).isRequired, + title: PropTypes.string, +} + +CheckBox.defaultProps = { + className: undefined, + disabled: false, + id: undefined, +} + +export default CheckBox diff --git a/ui/app/components/ui/check-box/check-box.stories.js b/ui/app/components/ui/check-box/check-box.stories.js new file mode 100644 index 000000000000..7a573a14c755 --- /dev/null +++ b/ui/app/components/ui/check-box/check-box.stories.js @@ -0,0 +1,25 @@ +import React from 'react' +import { action } from '@storybook/addon-actions' +import { boolean, select, text } from '@storybook/addon-knobs/react' +import CheckBox, { CHECKED, INDETERMINATE, UNCHECKED } from './check-box.component' + +export default { + title: 'Check Box', +} + +const checkboxOptions = { + [CHECKED]: CHECKED, + [INDETERMINATE]: INDETERMINATE, + [UNCHECKED]: UNCHECKED, + True: true, + False: false, +} + +export const primaryType = () => ( + +) diff --git a/ui/app/components/ui/check-box/index.js b/ui/app/components/ui/check-box/index.js new file mode 100644 index 000000000000..fc4dfd2f8160 --- /dev/null +++ b/ui/app/components/ui/check-box/index.js @@ -0,0 +1 @@ +export { default, CHECKED, INDETERMINATE, UNCHECKED } from './check-box.component' diff --git a/ui/app/components/ui/check-box/index.scss b/ui/app/components/ui/check-box/index.scss new file mode 100644 index 000000000000..8e6060bb36de --- /dev/null +++ b/ui/app/components/ui/check-box/index.scss @@ -0,0 +1,23 @@ +.check-box { + -webkit-appearance: none; + appearance: none; + background: $white; + color: $Grey-100; + width: 18px; + height: 18px; + font-size: 21px; + line-height: 0.9; + border-radius: 2px; + display: flex; + + &__checked, + &__indeterminate { + color: $primary-blue; + border-color: $primary-blue; + } + + &:disabled { + color: $Grey-100; + cursor: not-allowed; + } +} diff --git a/ui/app/components/ui/circle-icon/circle-icon.component.js b/ui/app/components/ui/circle-icon/circle-icon.component.js new file mode 100644 index 000000000000..0472455351e5 --- /dev/null +++ b/ui/app/components/ui/circle-icon/circle-icon.component.js @@ -0,0 +1,52 @@ +import React, { PureComponent } from 'react' +import PropTypes from 'prop-types' + +export default class CircleIcon extends PureComponent { + static propTypes = { + size: PropTypes.string, + circleClass: PropTypes.string, + iconSource: PropTypes.string.isRequired, + iconSize: PropTypes.string, + } + + static defaultProps = { + size: '56px', + iconSize: '18px', + circleClass: '', + } + + render () { + const { + size, + circleClass, + iconSize, + iconSource, + } = this.props + + return ( +
    +
    + +
    + ) + } +} diff --git a/ui/app/components/ui/circle-icon/circle-icon.stories.js b/ui/app/components/ui/circle-icon/circle-icon.stories.js new file mode 100644 index 000000000000..230a2f8a3249 --- /dev/null +++ b/ui/app/components/ui/circle-icon/circle-icon.stories.js @@ -0,0 +1,16 @@ +import React from 'react' +import CircleIcon from './circle-icon.component' + +export default { + title: 'CircleIcon', +} + +export const basicCircleIcon = () => ( + +) diff --git a/ui/app/components/ui/circle-icon/index.js b/ui/app/components/ui/circle-icon/index.js new file mode 100644 index 000000000000..d5cfd62c1382 --- /dev/null +++ b/ui/app/components/ui/circle-icon/index.js @@ -0,0 +1 @@ +export { default } from './circle-icon.component' diff --git a/ui/app/components/ui/circle-icon/index.scss b/ui/app/components/ui/circle-icon/index.scss new file mode 100644 index 000000000000..5002f83e6cd0 --- /dev/null +++ b/ui/app/components/ui/circle-icon/index.scss @@ -0,0 +1,23 @@ +.circle-icon { + &__container { + position: relative; + display: flex; + justify-content: center; + align-items: center; + } + + &__border { + border-radius: 50%; + position: absolute; + } + + &__circle { + border: 1px solid; + border-color: $black; + background: $white; + } + + &__icon { + position: relative; + } +} diff --git a/ui/app/components/ui/copyButton.js b/ui/app/components/ui/copyButton.js deleted file mode 100644 index a60d335233a7..000000000000 --- a/ui/app/components/ui/copyButton.js +++ /dev/null @@ -1,66 +0,0 @@ -const Component = require('react').Component -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const inherits = require('util').inherits -const copyToClipboard = require('copy-to-clipboard') -const connect = require('react-redux').connect - -const Tooltip = require('./tooltip') - -CopyButton.contextTypes = { - t: PropTypes.func, -} - -module.exports = connect()(CopyButton) - - -inherits(CopyButton, Component) -function CopyButton () { - Component.call(this) -} - -// As parameters, accepts: -// "value", which is the value to copy (mandatory) -// "title", which is the text to show on hover (optional, defaults to 'Copy') -CopyButton.prototype.render = function () { - const props = this.props - const state = this.state || {} - - const value = props.value - const copied = state.copied - - const message = copied ? this.context.t('copiedButton') : props.title || this.context.t('copyButton') - - return h('.copy-button', { - style: { - display: 'flex', - alignItems: 'center', - }, - }, [ - - h(Tooltip, { - title: message, - }, [ - h('i.fa.fa-clipboard.cursor-pointer.color-orange', { - style: { - margin: '5px', - }, - onClick: (event) => { - event.preventDefault() - event.stopPropagation() - copyToClipboard(value) - this.debounceRestore() - }, - }), - ]), - - ]) -} - -CopyButton.prototype.debounceRestore = function () { - this.setState({ copied: true }) - clearTimeout(this.timeout) - this.timeout = setTimeout(() => { - this.setState({ copied: false }) - }, 850) -} diff --git a/ui/app/components/ui/currency-display/currency-display.component.js b/ui/app/components/ui/currency-display/currency-display.component.js index c15668da3df0..e5bfc0bb1c21 100644 --- a/ui/app/components/ui/currency-display/currency-display.component.js +++ b/ui/app/components/ui/currency-display/currency-display.component.js @@ -1,46 +1,65 @@ -import React, { PureComponent } from 'react' +import React from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' import { GWEI } from '../../../helpers/constants/common' +import { useCurrencyDisplay } from '../../../hooks/useCurrencyDisplay' -export default class CurrencyDisplay extends PureComponent { - static propTypes = { - className: PropTypes.string, - displayValue: PropTypes.string, - prefix: PropTypes.string, - prefixComponent: PropTypes.node, - style: PropTypes.object, - suffix: PropTypes.string, - // Used in container - currency: PropTypes.string, - denomination: PropTypes.oneOf([GWEI]), - value: PropTypes.string, - numberOfDecimals: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), - hideLabel: PropTypes.bool, - hideTitle: PropTypes.bool, - } - - render () { - const { className, displayValue, prefix, prefixComponent, style, suffix, hideTitle } = this.props - const text = `${prefix || ''}${displayValue}` - const title = suffix ? `${text} ${suffix}` : text +export default function CurrencyDisplay ({ + value, + displayValue, + 'data-testid': dataTestId, + style, + className, + prefix, + prefixComponent, + hideLabel, + hideTitle, + numberOfDecimals, + denomination, + currency, + suffix, +}) { + const [title, parts] = useCurrencyDisplay(value, { + displayValue, + prefix, + numberOfDecimals, + hideLabel, + denomination, + currency, + suffix, + }) + return ( +
    + { prefixComponent } + { parts.prefix }{ parts.value } + { + parts.suffix && ( + + { parts.suffix } + + ) + } +
    + ) +} - return ( -
    - { prefixComponent } - { text } - { - suffix && ( - - { suffix } - - ) - } -
    - ) - } +CurrencyDisplay.propTypes = { + className: PropTypes.string, + currency: PropTypes.string, + 'data-testid': PropTypes.string, + denomination: PropTypes.oneOf([GWEI]), + displayValue: PropTypes.string, + hideLabel: PropTypes.bool, + hideTitle: PropTypes.bool, + numberOfDecimals: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + prefix: PropTypes.string, + prefixComponent: PropTypes.node, + style: PropTypes.object, + suffix: PropTypes.string, + value: PropTypes.string, } diff --git a/ui/app/components/ui/currency-display/currency-display.container.js b/ui/app/components/ui/currency-display/currency-display.container.js deleted file mode 100644 index 093d99c8e0e9..000000000000 --- a/ui/app/components/ui/currency-display/currency-display.container.js +++ /dev/null @@ -1,51 +0,0 @@ -import { connect } from 'react-redux' -import CurrencyDisplay from './currency-display.component' -import { getValueFromWeiHex, formatCurrency } from '../../../helpers/utils/confirm-tx.util' - -const mapStateToProps = state => { - const { metamask: { nativeCurrency, currentCurrency, conversionRate } } = state - - return { - currentCurrency, - conversionRate, - nativeCurrency, - } -} - -const mergeProps = (stateProps, dispatchProps, ownProps) => { - const { nativeCurrency, currentCurrency, conversionRate, ...restStateProps } = stateProps - const { - value, - numberOfDecimals = 2, - currency, - denomination, - hideLabel, - displayValue: propsDisplayValue, - suffix: propsSuffix, - ...restOwnProps - } = ownProps - - const toCurrency = currency || currentCurrency - - const displayValue = propsDisplayValue || formatCurrency( - getValueFromWeiHex({ - value, - fromCurrency: nativeCurrency, - toCurrency, conversionRate, - numberOfDecimals, - toDenomination: denomination, - }), - toCurrency - ) - const suffix = propsSuffix || (hideLabel ? undefined : toCurrency.toUpperCase()) - - return { - ...restStateProps, - ...dispatchProps, - ...restOwnProps, - displayValue, - suffix, - } -} - -export default connect(mapStateToProps, null, mergeProps)(CurrencyDisplay) diff --git a/ui/app/components/ui/currency-display/index.js b/ui/app/components/ui/currency-display/index.js index 38f08765fb51..f861bb91a3d1 100644 --- a/ui/app/components/ui/currency-display/index.js +++ b/ui/app/components/ui/currency-display/index.js @@ -1 +1 @@ -export { default } from './currency-display.container' +export { default } from './currency-display.component' diff --git a/ui/app/components/ui/currency-display/index.scss b/ui/app/components/ui/currency-display/index.scss index 6d069eb05428..074a65df3254 100644 --- a/ui/app/components/ui/currency-display/index.scss +++ b/ui/app/components/ui/currency-display/index.scss @@ -3,10 +3,11 @@ align-items: center; &__text { + /*rtl:ignore*/ + direction: ltr; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - } &__suffix { diff --git a/ui/app/components/ui/currency-display/tests/currency-display.component.test.js b/ui/app/components/ui/currency-display/tests/currency-display.component.test.js index d9ef052f1bf2..68bac84cf173 100644 --- a/ui/app/components/ui/currency-display/tests/currency-display.component.test.js +++ b/ui/app/components/ui/currency-display/tests/currency-display.component.test.js @@ -1,27 +1,46 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { shallow } from 'enzyme' +import sinon from 'sinon' +import * as reactRedux from 'react-redux' import CurrencyDisplay from '../currency-display.component' -describe('CurrencyDisplay Component', () => { - it('should render text with a className', () => { - const wrapper = shallow() +describe('CurrencyDisplay Component', function () { + beforeEach(function () { + const stub = sinon.stub(reactRedux, 'useSelector') + stub.callsFake(() => ({ + currentCurrency: 'usd', + nativeCurrency: 'ETH', + conversionRate: 280.45, + })) + }) + it('should render text with a className', function () { + const wrapper = shallow(( + + )) assert.ok(wrapper.hasClass('currency-display')) assert.equal(wrapper.text(), '$123.45') }) - it('should render text with a prefix', () => { - const wrapper = shallow() + it('should render text with a prefix', function () { + const wrapper = shallow(( + + )) assert.ok(wrapper.hasClass('currency-display')) assert.equal(wrapper.text(), '-$123.45') }) + afterEach(function () { + sinon.restore() + }) }) diff --git a/ui/app/components/ui/currency-display/tests/currency-display.container.test.js b/ui/app/components/ui/currency-display/tests/currency-display.container.test.js deleted file mode 100644 index 182524e59f99..000000000000 --- a/ui/app/components/ui/currency-display/tests/currency-display.container.test.js +++ /dev/null @@ -1,145 +0,0 @@ -import assert from 'assert' -import proxyquire from 'proxyquire' - -let mapStateToProps, mergeProps - -proxyquire('../currency-display.container.js', { - 'react-redux': { - connect: (ms, _, mp) => { - mapStateToProps = ms - mergeProps = mp - return () => ({}) - }, - }, -}) - -describe('CurrencyDisplay container', () => { - describe('mapStateToProps()', () => { - it('should return the correct props', () => { - const mockState = { - metamask: { - conversionRate: 280.45, - currentCurrency: 'usd', - nativeCurrency: 'ETH', - }, - } - - assert.deepEqual(mapStateToProps(mockState), { - conversionRate: 280.45, - currentCurrency: 'usd', - nativeCurrency: 'ETH', - }) - }) - }) - - describe('mergeProps()', () => { - it('should return the correct props', () => { - const mockStateProps = { - conversionRate: 280.45, - currentCurrency: 'usd', - nativeCurrency: 'ETH', - } - - const tests = [ - { - props: { - value: '0x2386f26fc10000', - numberOfDecimals: 2, - currency: 'usd', - nativeCurrency: 'ETH', - }, - result: { - displayValue: '$2.80', - suffix: 'USD', - nativeCurrency: 'ETH', - }, - }, - { - props: { - value: '0x2386f26fc10000', - currency: 'usd', - nativeCurrency: 'ETH', - }, - result: { - displayValue: '$2.80', - suffix: 'USD', - nativeCurrency: 'ETH', - }, - }, - { - props: { - value: '0x1193461d01595930', - currency: 'ETH', - nativeCurrency: 'ETH', - numberOfDecimals: 3, - }, - result: { - displayValue: '1.266', - suffix: 'ETH', - nativeCurrency: 'ETH', - }, - }, - { - props: { - value: '0x1193461d01595930', - currency: 'ETH', - nativeCurrency: 'ETH', - numberOfDecimals: 3, - hideLabel: true, - }, - result: { - nativeCurrency: 'ETH', - displayValue: '1.266', - suffix: undefined, - }, - }, - { - props: { - value: '0x3b9aca00', - currency: 'ETH', - nativeCurrency: 'ETH', - denomination: 'GWEI', - hideLabel: true, - }, - result: { - nativeCurrency: 'ETH', - displayValue: '1', - suffix: undefined, - }, - }, - { - props: { - value: '0x3b9aca00', - currency: 'ETH', - nativeCurrency: 'ETH', - denomination: 'WEI', - hideLabel: true, - }, - result: { - nativeCurrency: 'ETH', - displayValue: '1000000000', - suffix: undefined, - }, - }, - { - props: { - value: '0x3b9aca00', - currency: 'ETH', - nativeCurrency: 'ETH', - numberOfDecimals: 100, - hideLabel: true, - }, - result: { - nativeCurrency: 'ETH', - displayValue: '0.000000001', - suffix: undefined, - }, - }, - ] - - tests.forEach(({ props, result }) => { - assert.deepEqual(mergeProps(mockStateProps, {}, { ...props }), result) - }) - }) - }) -}) diff --git a/ui/app/components/ui/currency-input/currency-input.component.js b/ui/app/components/ui/currency-input/currency-input.component.js index 1876c9591d74..f17fb5792891 100644 --- a/ui/app/components/ui/currency-input/currency-input.component.js +++ b/ui/app/components/ui/currency-input/currency-input.component.js @@ -21,7 +21,6 @@ export default class CurrencyInput extends PureComponent { maxModeOn: PropTypes.bool, nativeCurrency: PropTypes.string, onChange: PropTypes.func, - onBlur: PropTypes.func, useFiat: PropTypes.bool, hideFiat: PropTypes.bool, value: PropTypes.string, @@ -79,12 +78,12 @@ export default class CurrencyInput extends PureComponent { swap = () => { const { isSwapped, decimalValue } = this.state - this.setState({isSwapped: !isSwapped}, () => { + this.setState({ isSwapped: !isSwapped }, () => { this.handleChange(decimalValue) }) } - handleChange = decimalValue => { + handleChange = (decimalValue) => { const { currentCurrency: fromCurrency, conversionRate, onChange } = this.props const hexValue = this.shouldUseFiat() @@ -99,10 +98,6 @@ export default class CurrencyInput extends PureComponent { onChange(hexValue) } - handleBlur = () => { - this.props.onBlur(this.state.hexValue) - } - renderConversionComponent () { const { currentCurrency, nativeCurrency, hideFiat } = this.props const { hexValue } = this.state @@ -141,22 +136,21 @@ export default class CurrencyInput extends PureComponent { const { decimalValue } = this.state return ( - - )} - > - { this.renderConversionComponent() } - + + )} + > + { this.renderConversionComponent() } + ) } } diff --git a/ui/app/components/ui/currency-input/currency-input.container.js b/ui/app/components/ui/currency-input/currency-input.container.js index 46e70baceec0..581e1c1a289b 100644 --- a/ui/app/components/ui/currency-input/currency-input.container.js +++ b/ui/app/components/ui/currency-input/currency-input.container.js @@ -1,14 +1,17 @@ import { connect } from 'react-redux' -import CurrencyInput from './currency-input.component' import { ETH } from '../../../helpers/constants/common' -import { getMaxModeOn } from '../../../pages/send/send-content/send-amount-row/amount-max-button/amount-max-button.selectors' -import {getIsMainnet, preferencesSelector} from '../../../selectors/selectors' +import { + getSendMaxModeState, + getIsMainnet, + getPreferences, +} from '../../../selectors' +import CurrencyInput from './currency-input.component' -const mapStateToProps = state => { +const mapStateToProps = (state) => { const { metamask: { nativeCurrency, currentCurrency, conversionRate } } = state - const { showFiatInTestnets } = preferencesSelector(state) + const { showFiatInTestnets } = getPreferences(state) const isMainnet = getIsMainnet(state) - const maxModeOn = getMaxModeOn(state) + const maxModeOn = getSendMaxModeState(state) return { nativeCurrency, diff --git a/ui/app/components/ui/currency-input/index.scss b/ui/app/components/ui/currency-input/index.scss index f659f5b351f6..b240ed097e1b 100644 --- a/ui/app/components/ui/currency-input/index.scss +++ b/ui/app/components/ui/currency-input/index.scss @@ -13,14 +13,14 @@ background-size: contain; background-repeat: no-repeat; cursor: pointer; - opacity: .4; + opacity: 0.4; &:hover { - opacity: .3; + opacity: 0.3; } &:active { - opacity: .5; + opacity: 0.5; } } } diff --git a/ui/app/components/ui/currency-input/tests/currency-input.component.test.js b/ui/app/components/ui/currency-input/tests/currency-input.component.test.js index 6d4612e3cfa5..1e7936978940 100644 --- a/ui/app/components/ui/currency-input/tests/currency-input.component.test.js +++ b/ui/app/components/ui/currency-input/tests/currency-input.component.test.js @@ -1,6 +1,6 @@ +import assert from 'assert' import React from 'react' import PropTypes from 'prop-types' -import assert from 'assert' import { shallow, mount } from 'enzyme' import sinon from 'sinon' import { Provider } from 'react-redux' @@ -9,18 +9,18 @@ import CurrencyInput from '../currency-input.component' import UnitInput from '../../unit-input' import CurrencyDisplay from '../../currency-display' -describe('CurrencyInput Component', () => { - describe('rendering', () => { - it('should render properly without a suffix', () => { +describe('CurrencyInput Component', function () { + describe('rendering', function () { + it('should render properly without a suffix', function () { const wrapper = shallow( - + , ) assert.ok(wrapper) assert.equal(wrapper.find(UnitInput).length, 1) }) - it('should render properly with a suffix', () => { + it('should render properly with a suffix', function () { const mockStore = { metamask: { nativeCurrency: 'ETH', @@ -37,7 +37,7 @@ describe('CurrencyInput Component', () => { fiatSuffix="USD" nativeCurrency="ETH" /> - + , ) assert.ok(wrapper) @@ -46,7 +46,7 @@ describe('CurrencyInput Component', () => { assert.equal(wrapper.find(CurrencyDisplay).length, 1) }) - it('should render properly with an ETH value', () => { + it('should render properly with an ETH value', function () { const mockStore = { metamask: { nativeCurrency: 'ETH', @@ -66,7 +66,7 @@ describe('CurrencyInput Component', () => { currentCurrency="usd" conversionRate={231.06} /> - + , ) assert.ok(wrapper) @@ -79,7 +79,7 @@ describe('CurrencyInput Component', () => { assert.equal(wrapper.find('.currency-display-component').text(), '$231.06USD') }) - it('should render properly with a fiat value', () => { + it('should render properly with a fiat value', function () { const mockStore = { metamask: { nativeCurrency: 'ETH', @@ -100,7 +100,7 @@ describe('CurrencyInput Component', () => { currentCurrency="usd" conversionRate={231.06} /> - + , ) assert.ok(wrapper) @@ -113,7 +113,7 @@ describe('CurrencyInput Component', () => { assert.equal(wrapper.find('.currency-display-component').text(), '0.004328ETH') }) - it('should render properly with a native value when hideFiat is true', () => { + it('should render properly with a native value when hideFiat is true', function () { const mockStore = { metamask: { nativeCurrency: 'ETH', @@ -130,16 +130,16 @@ describe('CurrencyInput Component', () => { fiatSuffix="USD" nativeSuffix="ETH" useFiat - hideFiat={true} + hideFiat nativeCurrency="ETH" currentCurrency="usd" conversionRate={231.06} /> , { - context: { t: str => str + '_t' }, + context: { t: (str) => `${str}_t` }, childContextTypes: { t: PropTypes.func }, - } + }, ) assert.ok(wrapper) @@ -153,16 +153,16 @@ describe('CurrencyInput Component', () => { }) }) - describe('handling actions', () => { + describe('handling actions', function () { const handleChangeSpy = sinon.spy() const handleBlurSpy = sinon.spy() - afterEach(() => { + afterEach(function () { handleChangeSpy.resetHistory() handleBlurSpy.resetHistory() }) - it('should call onChange and onBlur on input changes with the hex value for ETH', () => { + it('should call onChange on input changes with the hex value for ETH', function () { const mockStore = { metamask: { nativeCurrency: 'ETH', @@ -175,13 +175,12 @@ describe('CurrencyInput Component', () => { - + , ) assert.ok(wrapper) @@ -201,14 +200,9 @@ describe('CurrencyInput Component', () => { assert.equal(wrapper.find('.currency-display-component').text(), '$231.06USD') assert.equal(currencyInputInstance.state.decimalValue, 1) assert.equal(currencyInputInstance.state.hexValue, 'de0b6b3a7640000') - - assert.equal(handleBlurSpy.callCount, 0) - input.simulate('blur') - assert.equal(handleBlurSpy.callCount, 1) - assert.ok(handleBlurSpy.calledWith('de0b6b3a7640000')) }) - it('should call onChange and onBlur on input changes with the hex value for fiat', () => { + it('should call onChange on input changes with the hex value for fiat', function () { const mockStore = { metamask: { nativeCurrency: 'ETH', @@ -221,14 +215,13 @@ describe('CurrencyInput Component', () => { - + , ) assert.ok(wrapper) @@ -248,14 +241,9 @@ describe('CurrencyInput Component', () => { assert.equal(wrapper.find('.currency-display-component').text(), '0.004328ETH') assert.equal(currencyInputInstance.state.decimalValue, 1) assert.equal(currencyInputInstance.state.hexValue, 'f602f2234d0ea') - - assert.equal(handleBlurSpy.callCount, 0) - input.simulate('blur') - assert.equal(handleBlurSpy.callCount, 1) - assert.ok(handleBlurSpy.calledWith('f602f2234d0ea')) }) - it('should change the state and pass in a new decimalValue when props.value changes', () => { + it('should change the state and pass in a new decimalValue when props.value changes', function () { const mockStore = { metamask: { nativeCurrency: 'ETH', @@ -268,14 +256,13 @@ describe('CurrencyInput Component', () => { - + , ) assert.ok(wrapper) @@ -291,7 +278,7 @@ describe('CurrencyInput Component', () => { assert.equal(currencyInputInstance.find(UnitInput).props().value, 2) }) - it('should swap selected currency when swap icon is clicked', () => { + it('should swap selected currency when swap icon is clicked', function () { const mockStore = { metamask: { nativeCurrency: 'ETH', @@ -304,14 +291,13 @@ describe('CurrencyInput Component', () => { - + , ) assert.ok(wrapper) @@ -332,11 +318,6 @@ describe('CurrencyInput Component', () => { assert.equal(currencyInputInstance.state.decimalValue, 1) assert.equal(currencyInputInstance.state.hexValue, 'de0b6b3a7640000') - assert.equal(handleBlurSpy.callCount, 0) - input.simulate('blur') - assert.equal(handleBlurSpy.callCount, 1) - assert.ok(handleBlurSpy.calledWith('de0b6b3a7640000')) - const swap = wrapper.find('.currency-input__swap-component') swap.simulate('click') assert.equal(wrapper.find('.currency-display-component').text(), '0.004328ETH') diff --git a/ui/app/components/ui/currency-input/tests/currency-input.container.test.js b/ui/app/components/ui/currency-input/tests/currency-input.container.test.js index f10abe09a68b..1806d642542a 100644 --- a/ui/app/components/ui/currency-input/tests/currency-input.container.test.js +++ b/ui/app/components/ui/currency-input/tests/currency-input.container.test.js @@ -13,8 +13,8 @@ proxyquire('../currency-input.container.js', { }, }) -describe('CurrencyInput container', () => { - describe('mapStateToProps()', () => { +describe('CurrencyInput container', function () { + describe('mapStateToProps()', function () { const tests = [ // Test # 1 { @@ -127,11 +127,13 @@ describe('CurrencyInput container', () => { ] tests.forEach(({ mockState, expected, comment }) => { - it(comment, () => assert.deepEqual(mapStateToProps(mockState), expected)) + it(comment, function () { + return assert.deepEqual(mapStateToProps(mockState), expected) + }) }) }) - describe('mergeProps()', () => { + describe('mergeProps()', function () { const tests = [ // Test # 1 { @@ -178,7 +180,7 @@ describe('CurrencyInput container', () => { ] tests.forEach(({ mock: { stateProps, dispatchProps, ownProps }, expected, comment }) => { - it(comment, () => { + it(comment, function () { assert.deepEqual(mergeProps(stateProps, dispatchProps, ownProps), expected) }) }) diff --git a/ui/app/components/ui/dialog/dialog.scss b/ui/app/components/ui/dialog/dialog.scss new file mode 100644 index 000000000000..d113947ad50d --- /dev/null +++ b/ui/app/components/ui/dialog/dialog.scss @@ -0,0 +1,26 @@ +.dialog { + font-size: 0.75rem; + line-height: 1rem; + padding: 1rem; + border: 1px solid $black; + box-sizing: border-box; + border-radius: 8px; + + &--message { + border-color: $Blue-200; + color: $Blue-600; + background-color: $Blue-000; + } + + &--error { + border-color: $Red-300; + color: $Red-600; + background-color: $Red-000; + } + + &--warning { + border-color: $Orange-300; + color: $Orange-600; + background-color: $Orange-000; + } +} diff --git a/ui/app/components/ui/dialog/index.js b/ui/app/components/ui/dialog/index.js new file mode 100644 index 000000000000..50b777a7a751 --- /dev/null +++ b/ui/app/components/ui/dialog/index.js @@ -0,0 +1,26 @@ +import React from 'react' +import PropTypes from 'prop-types' +import classnames from 'classnames' + +export default function Dialog (props) { + const { children, type, className, onClick } = props + return ( +
    + { children } +
    + ) +} + +Dialog.propTypes = { + className: PropTypes.string, + children: PropTypes.node, + type: PropTypes.oneOf(['message', 'error', 'warning']), + onClick: PropTypes.func, +} diff --git a/ui/app/components/ui/dropdown/dropdown.js b/ui/app/components/ui/dropdown/dropdown.js new file mode 100644 index 000000000000..be4a052a47ba --- /dev/null +++ b/ui/app/components/ui/dropdown/dropdown.js @@ -0,0 +1,63 @@ +import React, { useCallback } from 'react' +import PropTypes from 'prop-types' +import classnames from 'classnames' + +const Dropdown = ({ className, disabled, onChange, options, selectedOption, style, title }) => { + const _onChange = useCallback( + (event) => { + event.preventDefault() + event.stopPropagation() + onChange(event.target.value) + }, + [onChange], + ) + + return ( + + ) +} + +Dropdown.propTypes = { + className: PropTypes.string, + disabled: PropTypes.bool, + title: PropTypes.string, + onChange: PropTypes.func.isRequired, + options: PropTypes.arrayOf( + PropTypes.exact({ + name: PropTypes.string, + value: PropTypes.string.isRequired, + }), + ).isRequired, + selectedOption: PropTypes.string, + style: PropTypes.object, +} + +Dropdown.defaultProps = { + className: undefined, + disabled: false, + title: undefined, + selectedOption: null, + style: undefined, +} + +export default Dropdown diff --git a/ui/app/components/ui/dropdown/dropdown.scss b/ui/app/components/ui/dropdown/dropdown.scss new file mode 100644 index 000000000000..49a684bb7ce3 --- /dev/null +++ b/ui/app/components/ui/dropdown/dropdown.scss @@ -0,0 +1,20 @@ +.dropdown { + appearance: none; + + // TODO: remove these after getting autoprefixer working in Storybook + -moz-appearance: none; + -webkit-appearance: none; + border: 1px solid $Grey-500; + border-radius: 6px; + background-image: url('/images/icons/caret-down.svg'); + background-repeat: no-repeat, repeat; + background-position: right 18px top 50%; + background-color: white; + padding: 8px 32px 8px 16px; + font-size: 14px; + + [dir='rtl'] & { + background-position: left 18px top 50%; + padding: 8px 16px 8px 32px; + } +} diff --git a/ui/app/components/ui/dropdown/dropdown.stories.js b/ui/app/components/ui/dropdown/dropdown.stories.js new file mode 100644 index 000000000000..1ecb31bc9ce7 --- /dev/null +++ b/ui/app/components/ui/dropdown/dropdown.stories.js @@ -0,0 +1,89 @@ +import React from 'react' +import { action } from '@storybook/addon-actions' +import { boolean, select, text } from '@storybook/addon-knobs/react' +import Dropdown from '.' + +export default { + title: 'Dropdown', +} + +const unnamedOptions = [...Array(10).keys()].map((index) => { + return { value: `option${index}` } +}) + +const namedOptions = unnamedOptions.map((option, index) => { + return { ...option, name: `Option ${index}` } +}) + +const namedOptionsWithVeryLongNames = unnamedOptions.map((option, index) => { + return { ...option, name: `Option ${index} with a very${', very'.repeat(index)} long name` } +}) + +export const simple = () => ( + option.value), + namedOptions[0].value, + ) + } + /> +) + +export const optionsWithoutNames = () => ( + option.value), + unnamedOptions[0].value, + ) + } + /> +) + +export const optionsWithLongNames = () => ( + option.value), + namedOptionsWithVeryLongNames[0].value, + ) + } + /> +) + +export const optionsWithLongNamesAndShortWidth = () => ( + option.value), + namedOptionsWithVeryLongNames[0].value, + ) + } + style={{ width: '200px' }} + /> +) diff --git a/ui/app/components/ui/dropdown/index.js b/ui/app/components/ui/dropdown/index.js new file mode 100644 index 000000000000..8d23b5709046 --- /dev/null +++ b/ui/app/components/ui/dropdown/index.js @@ -0,0 +1 @@ +export { default } from './dropdown' diff --git a/ui/app/components/ui/editable-label.js b/ui/app/components/ui/editable-label.js deleted file mode 100644 index eb41ec50c805..000000000000 --- a/ui/app/components/ui/editable-label.js +++ /dev/null @@ -1,88 +0,0 @@ -const { Component } = require('react') -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const classnames = require('classnames') - -class EditableLabel extends Component { - constructor (props) { - super(props) - - this.state = { - isEditing: false, - value: props.defaultValue || '', - } - } - - handleSubmit () { - const { value } = this.state - - if (value === '') { - return - } - - Promise.resolve(this.props.onSubmit(value)) - .then(() => this.setState({ isEditing: false })) - } - - saveIfEnter (event) { - if (event.key === 'Enter') { - this.handleSubmit() - } - } - - renderEditing () { - const { value } = this.state - - return ([ - h('input.large-input.editable-label__input', { - type: 'text', - required: true, - value: this.state.value, - onKeyPress: (event) => { - if (event.key === 'Enter') { - this.handleSubmit() - } - }, - onChange: event => this.setState({ value: event.target.value }), - className: classnames({ 'editable-label__input--error': value === '' }), - }), - h('div.editable-label__icon-wrapper', [ - h('i.fa.fa-check.editable-label__icon', { - onClick: () => this.handleSubmit(), - }), - ]), - ]) - } - - renderReadonly () { - return ([ - h('div.editable-label__value', this.state.value), - h('div.editable-label__icon-wrapper', [ - h('i.fa.fa-pencil.editable-label__icon', { - onClick: () => this.setState({ isEditing: true }), - }), - ]), - ]) - } - - render () { - const { isEditing } = this.state - const { className } = this.props - - return ( - h('div.editable-label', { className: classnames(className) }, - isEditing - ? this.renderEditing() - : this.renderReadonly() - ) - ) - } -} - -EditableLabel.propTypes = { - onSubmit: PropTypes.func.isRequired, - defaultValue: PropTypes.string, - className: PropTypes.string, -} - -module.exports = EditableLabel diff --git a/ui/app/components/ui/editable-label/editable-label.js b/ui/app/components/ui/editable-label/editable-label.js new file mode 100644 index 000000000000..d1788472eeb7 --- /dev/null +++ b/ui/app/components/ui/editable-label/editable-label.js @@ -0,0 +1,81 @@ +import classnames from 'classnames' +import PropTypes from 'prop-types' +import React, { Component } from 'react' + +class EditableLabel extends Component { + static propTypes = { + onSubmit: PropTypes.func.isRequired, + defaultValue: PropTypes.string, + className: PropTypes.string, + } + + state = { + isEditing: false, + value: this.props.defaultValue || '', + } + + handleSubmit () { + const { value } = this.state + + if (value === '') { + return + } + + Promise.resolve(this.props.onSubmit(value)) + .then(() => this.setState({ isEditing: false })) + } + + renderEditing () { + const { value } = this.state + + return [( + { + if (event.key === 'Enter') { + this.handleSubmit() + } + }} + onChange={(event) => this.setState({ value: event.target.value })} + className={classnames('large-input', 'editable-label__input', { + 'editable-label__input--error': value === '', + })} + /> + ), ( +
    + this.handleSubmit()} /> +
    + )] + } + + renderReadonly () { + return [( +
    {this.state.value}
    + ), ( +
    + this.setState({ isEditing: true })} /> +
    + )] + } + + render () { + const { isEditing } = this.state + const { className } = this.props + + return ( +
    + { + isEditing + ? this.renderEditing() + : this.renderReadonly() + } +
    + ) + } +} + +export default EditableLabel diff --git a/ui/app/components/ui/editable-label/index.js b/ui/app/components/ui/editable-label/index.js new file mode 100644 index 000000000000..43078e7f7435 --- /dev/null +++ b/ui/app/components/ui/editable-label/index.js @@ -0,0 +1 @@ +export { default } from './editable-label' diff --git a/ui/app/css/itcss/components/editable-label.scss b/ui/app/components/ui/editable-label/index.scss similarity index 100% rename from ui/app/css/itcss/components/editable-label.scss rename to ui/app/components/ui/editable-label/index.scss diff --git a/ui/app/components/ui/error-message/index.scss b/ui/app/components/ui/error-message/index.scss index 5915e21cf285..8b3860c37777 100644 --- a/ui/app/components/ui/error-message/index.scss +++ b/ui/app/components/ui/error-message/index.scss @@ -4,7 +4,7 @@ color: $monzo; background: lighten($monzo, 56%); border-radius: 4px; - font-size: .75rem; + font-size: 0.75rem; display: flex; justify-content: flex-start; align-items: center; diff --git a/ui/app/components/ui/error-message/tests/error-message.component.test.js b/ui/app/components/ui/error-message/tests/error-message.component.test.js index 8c534717386b..8e4025bc71d9 100644 --- a/ui/app/components/ui/error-message/tests/error-message.component.test.js +++ b/ui/app/components/ui/error-message/tests/error-message.component.test.js @@ -1,17 +1,17 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { shallow } from 'enzyme' import ErrorMessage from '../error-message.component' -describe('ErrorMessage Component', () => { - const t = key => `translate ${key}` +describe('ErrorMessage Component', function () { + const t = (key) => `translate ${key}` - it('should render a message from props.errorMessage', () => { + it('should render a message from props.errorMessage', function () { const wrapper = shallow( , - { context: { t }} + { context: { t } }, ) assert.ok(wrapper) @@ -20,12 +20,12 @@ describe('ErrorMessage Component', () => { assert.equal(wrapper.find('.error-message__text').text(), 'ALERT: This is an error.') }) - it('should render a message translated from props.errorKey', () => { + it('should render a message translated from props.errorKey', function () { const wrapper = shallow( , - { context: { t }} + { context: { t } }, ) assert.ok(wrapper) diff --git a/ui/app/components/ui/eth-balance.js b/ui/app/components/ui/eth-balance.js deleted file mode 100644 index 7d577b7162a3..000000000000 --- a/ui/app/components/ui/eth-balance.js +++ /dev/null @@ -1,102 +0,0 @@ -const { Component } = require('react') -const h = require('react-hyperscript') -const connect = require('react-redux').connect -const { inherits } = require('util') -const { - formatBalance, - generateBalanceObject, -} = require('../../helpers/utils/util') -const Tooltip = require('./tooltip.js') -const FiatValue = require('./fiat-value.js') - -module.exports = connect(mapStateToProps)(EthBalanceComponent) -function mapStateToProps (state) { - return { - ticker: state.metamask.ticker, - } -} - -inherits(EthBalanceComponent, Component) -function EthBalanceComponent () { - Component.call(this) -} - -EthBalanceComponent.prototype.render = function () { - const props = this.props - const { ticker, value, style, width, needsParse = true } = props - - const formattedValue = value ? formatBalance(value, 6, needsParse, ticker) : '...' - - return ( - - h('.ether-balance.ether-balance-amount', { - style, - }, [ - h('div', { - style: { - display: 'inline', - width, - }, - }, this.renderBalance(formattedValue)), - ]) - - ) -} -EthBalanceComponent.prototype.renderBalance = function (value) { - if (value === 'None') return value - if (value === '...') return value - - const { - conversionRate, - shorten, - incoming, - currentCurrency, - hideTooltip, - styleOveride = {}, - showFiat = true, - } = this.props - const { fontSize, color, fontFamily, lineHeight } = styleOveride - - const { shortBalance, balance, label } = generateBalanceObject(value, shorten ? 1 : 3) - const balanceToRender = shorten ? shortBalance : balance - - const [ethNumber, ethSuffix] = value.split(' ') - const containerProps = hideTooltip ? {} : { - position: 'bottom', - title: `${ethNumber} ${ethSuffix}`, - } - - return ( - h(hideTooltip ? 'div' : Tooltip, - containerProps, - h('div.flex-column', [ - h('.flex-row', { - style: { - alignItems: 'flex-end', - lineHeight: lineHeight || '13px', - fontFamily: fontFamily || 'Montserrat Light', - textRendering: 'geometricPrecision', - }, - }, [ - h('div', { - style: { - width: '100%', - textAlign: 'right', - fontSize: fontSize || 'inherit', - color: color || 'inherit', - }, - }, incoming ? `+${balanceToRender}` : balanceToRender), - h('div', { - style: { - color: color || '#AEAEAE', - fontSize: fontSize || '12px', - marginLeft: '5px', - }, - }, label), - ]), - - showFiat ? h(FiatValue, { value: this.props.value, conversionRate, currentCurrency }) : null, - ]) - ) - ) -} diff --git a/ui/app/components/ui/export-text-container/export-text-container.component.js b/ui/app/components/ui/export-text-container/export-text-container.component.js index c632e8f26910..1bd4d4e2f866 100644 --- a/ui/app/components/ui/export-text-container/export-text-container.component.js +++ b/ui/app/components/ui/export-text-container/export-text-container.component.js @@ -1,45 +1,47 @@ -const { Component } = require('react') -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const copyToClipboard = require('copy-to-clipboard') -const { exportAsFile } = require('../../../helpers/utils/util') +import React from 'react' +import PropTypes from 'prop-types' +import { exportAsFile } from '../../../helpers/utils/util' +import Copy from '../icon/copy-icon.component' +import { useI18nContext } from '../../../hooks/useI18nContext' +import { useCopyToClipboard } from '../../../hooks/useCopyToClipboard' -class ExportTextContainer extends Component { - render () { - const { text = '', filename = '' } = this.props - const { t } = this.context +function ExportTextContainer ({ text = '' }) { + const t = useI18nContext() + const [copied, handleCopy] = useCopyToClipboard() - return ( - h('.export-text-container', [ - h('.export-text-container__text-container', [ - h('.export-text-container__text', text), - ]), - h('.export-text-container__buttons-container', [ - h('.export-text-container__button.export-text-container__button--copy', { - onClick: () => copyToClipboard(text), - }, [ - h('img', { src: 'images/copy-to-clipboard.svg' }), - h('.export-text-container__button-text', t('copyToClipboard')), - ]), - h('.export-text-container__button', { - onClick: () => exportAsFile(filename, text), - }, [ - h('img', { src: 'images/download.svg' }), - h('.export-text-container__button-text', t('saveAsCsvFile')), - ]), - ]), - ]) - ) - } + return ( +
    +
    +
    {text}
    +
    +
    +
    { + handleCopy(text) + }} + > + +
    + {copied ? t('copiedExclamation') : t('copyToClipboard')} +
    +
    +
    exportAsFile('', text)} + > + +
    + {t('saveAsCsvFile')} +
    +
    +
    +
    + ) } ExportTextContainer.propTypes = { text: PropTypes.string, - filename: PropTypes.string, } -ExportTextContainer.contextTypes = { - t: PropTypes.func, -} - -module.exports = ExportTextContainer +export default React.memo(ExportTextContainer) diff --git a/ui/app/components/ui/export-text-container/index.js b/ui/app/components/ui/export-text-container/index.js index b2864a71734b..3c610389f07a 100644 --- a/ui/app/components/ui/export-text-container/index.js +++ b/ui/app/components/ui/export-text-container/index.js @@ -1,2 +1,3 @@ -const ExportTextContainer = require('./export-text-container.component') -module.exports = ExportTextContainer +import ExportTextContainer from './export-text-container.component' + +export default ExportTextContainer diff --git a/ui/app/components/ui/export-text-container/index.scss b/ui/app/components/ui/export-text-container/index.scss index 975d62f70070..c3e32895f612 100644 --- a/ui/app/components/ui/export-text-container/index.scss +++ b/ui/app/components/ui/export-text-container/index.scss @@ -39,7 +39,7 @@ align-items: center; font-size: 12px; cursor: pointer; - color: $curious-blue; + color: $primary-blue; &--copy { border-right: 1px solid $alto; diff --git a/ui/app/components/ui/fiat-value.js b/ui/app/components/ui/fiat-value.js deleted file mode 100644 index 02111ba49dd4..000000000000 --- a/ui/app/components/ui/fiat-value.js +++ /dev/null @@ -1,66 +0,0 @@ -const Component = require('react').Component -const h = require('react-hyperscript') -const inherits = require('util').inherits -const formatBalance = require('../../helpers/utils/util').formatBalance - -module.exports = FiatValue - -inherits(FiatValue, Component) -function FiatValue () { - Component.call(this) -} - -FiatValue.prototype.render = function () { - const props = this.props - const { conversionRate, currentCurrency, style } = props - const renderedCurrency = currentCurrency || '' - - const value = formatBalance(props.value, 6) - - if (value === 'None') return value - var fiatDisplayNumber, fiatTooltipNumber - var splitBalance = value.split(' ') - - if (conversionRate !== 0) { - fiatTooltipNumber = Number(splitBalance[0]) * conversionRate - fiatDisplayNumber = fiatTooltipNumber.toFixed(2) - } else { - fiatDisplayNumber = 'N/A' - fiatTooltipNumber = 'Unknown' - } - - return fiatDisplay(fiatDisplayNumber, renderedCurrency.toUpperCase(), style) -} - -function fiatDisplay (fiatDisplayNumber, fiatSuffix, styleOveride = {}) { - const { fontSize, color, fontFamily, lineHeight } = styleOveride - - if (fiatDisplayNumber !== 'N/A') { - return h('.flex-row', { - style: { - alignItems: 'flex-end', - lineHeight: lineHeight || '13px', - fontFamily: fontFamily || 'Montserrat Light', - textRendering: 'geometricPrecision', - }, - }, [ - h('div', { - style: { - width: '100%', - textAlign: 'right', - fontSize: fontSize || '12px', - color: color || '#333333', - }, - }, fiatDisplayNumber), - h('div', { - style: { - color: color || '#AEAEAE', - marginLeft: '5px', - fontSize: fontSize || '12px', - }, - }, fiatSuffix), - ]) - } else { - return h('div') - } -} diff --git a/ui/app/components/ui/hex-to-decimal/tests/hex-to-decimal.component.test.js b/ui/app/components/ui/hex-to-decimal/tests/hex-to-decimal.component.test.js index c98da9ad40ba..683bb29d5dcf 100644 --- a/ui/app/components/ui/hex-to-decimal/tests/hex-to-decimal.component.test.js +++ b/ui/app/components/ui/hex-to-decimal/tests/hex-to-decimal.component.test.js @@ -1,24 +1,28 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { shallow } from 'enzyme' import HexToDecimal from '../hex-to-decimal.component' -describe('HexToDecimal Component', () => { - it('should render a prefixed hex as a decimal with a className', () => { - const wrapper = shallow() +describe('HexToDecimal Component', function () { + it('should render a prefixed hex as a decimal with a className', function () { + const wrapper = shallow(( + + )) assert.ok(wrapper.hasClass('hex-to-decimal')) assert.equal(wrapper.text(), '12345') }) - it('should render an unprefixed hex as a decimal with a className', () => { - const wrapper = shallow() + it('should render an unprefixed hex as a decimal with a className', function () { + const wrapper = shallow(( + + )) assert.ok(wrapper.hasClass('hex-to-decimal')) assert.equal(wrapper.text(), '6789') diff --git a/ui/app/components/ui/icon-border/icon-border.js b/ui/app/components/ui/icon-border/icon-border.js new file mode 100644 index 000000000000..5911cf918e65 --- /dev/null +++ b/ui/app/components/ui/icon-border/icon-border.js @@ -0,0 +1,16 @@ +import React from 'react' +import PropTypes from 'prop-types' + +export default function IconBorder ({ children, size }) { + const borderStyle = { height: `${size}px`, width: `${size}px` } + return ( +
    + { children } +
    + ) +} + +IconBorder.propTypes = { + children: PropTypes.node.isRequired, + size: PropTypes.number.isRequired, +} diff --git a/ui/app/components/ui/icon-border/icon-border.scss b/ui/app/components/ui/icon-border/icon-border.scss new file mode 100644 index 000000000000..cd18ccc6e3cd --- /dev/null +++ b/ui/app/components/ui/icon-border/icon-border.scss @@ -0,0 +1,9 @@ + +.icon-border { + border-radius: 50%; + border: 1px solid #f2f3f4; + background: #fff; + display: flex; + justify-content: center; + align-items: center; +} diff --git a/ui/app/components/ui/icon-border/index.js b/ui/app/components/ui/icon-border/index.js new file mode 100644 index 000000000000..dea3f116e31d --- /dev/null +++ b/ui/app/components/ui/icon-border/index.js @@ -0,0 +1 @@ +export { default } from './icon-border' diff --git a/ui/app/components/ui/icon-with-fallback/icon-with-fallback.component.js b/ui/app/components/ui/icon-with-fallback/icon-with-fallback.component.js new file mode 100644 index 000000000000..898861468672 --- /dev/null +++ b/ui/app/components/ui/icon-with-fallback/icon-with-fallback.component.js @@ -0,0 +1,38 @@ +import React, { PureComponent } from 'react' +import PropTypes from 'prop-types' + +export default class IconWithFallback extends PureComponent { + static propTypes = { + icon: PropTypes.string, + name: PropTypes.string, + size: PropTypes.number.isRequired, + } + + static defaultProps = { + name: '', + icon: null, + } + + state = { + iconError: false, + } + + render () { + const { icon, name, size } = this.props + const style = { height: `${size}px`, width: `${size}px` } + + return !this.state.iconError && icon + ? ( + this.setState({ iconError: true })} + src={icon} + style={style} + /> + ) + : ( + + { name.length ? name.charAt(0).toUpperCase() : '' } + + ) + } +} diff --git a/ui/app/components/ui/icon-with-fallback/icon-with-fallback.scss b/ui/app/components/ui/icon-with-fallback/icon-with-fallback.scss new file mode 100644 index 000000000000..a0cb7cd42805 --- /dev/null +++ b/ui/app/components/ui/icon-with-fallback/icon-with-fallback.scss @@ -0,0 +1,5 @@ +.icon-with-fallback { + &__fallback { + color: black; + } +} diff --git a/ui/app/components/ui/icon-with-fallback/index.js b/ui/app/components/ui/icon-with-fallback/index.js new file mode 100644 index 000000000000..8c1f9a154bfe --- /dev/null +++ b/ui/app/components/ui/icon-with-fallback/index.js @@ -0,0 +1 @@ +export { default } from './icon-with-fallback.component' diff --git a/ui/app/components/ui/icon-with-label/icon-with-label.js b/ui/app/components/ui/icon-with-label/icon-with-label.js new file mode 100644 index 000000000000..9e282611be26 --- /dev/null +++ b/ui/app/components/ui/icon-with-label/icon-with-label.js @@ -0,0 +1,18 @@ +import React from 'react' +import classnames from 'classnames' +import PropTypes from 'prop-types' + +export default function IconWithLabel ({ icon, label, className }) { + return ( +
    + {icon} + {label && {label}} +
    + ) +} + +IconWithLabel.propTypes = { + icon: PropTypes.node.isRequired, + className: PropTypes.string, + label: PropTypes.string, +} diff --git a/ui/app/components/ui/icon-with-label/index.js b/ui/app/components/ui/icon-with-label/index.js new file mode 100644 index 000000000000..10432ac8fe4f --- /dev/null +++ b/ui/app/components/ui/icon-with-label/index.js @@ -0,0 +1 @@ +export { default } from './icon-with-label' diff --git a/ui/app/components/ui/icon-with-label/index.scss b/ui/app/components/ui/icon-with-label/index.scss new file mode 100644 index 000000000000..628a5427245c --- /dev/null +++ b/ui/app/components/ui/icon-with-label/index.scss @@ -0,0 +1,10 @@ +.icon-with-label { + display: flex; + align-items: center; + + &__label { + font-size: 10px; + margin-left: 4px; + color: $Grey-500; + } +} diff --git a/ui/app/components/ui/icon/approve-icon.component.js b/ui/app/components/ui/icon/approve-icon.component.js new file mode 100644 index 000000000000..38135a3cbaf2 --- /dev/null +++ b/ui/app/components/ui/icon/approve-icon.component.js @@ -0,0 +1,40 @@ +import React from 'react' +import PropTypes from 'prop-types' + +const Approve = ({ + className, + size, + color, +}) => ( + + + + +) + +Approve.defaultProps = { + className: undefined, +} + +Approve.propTypes = { + className: PropTypes.string, + size: PropTypes.number.isRequired, + color: PropTypes.string.isRequired, +} + +export default Approve diff --git a/ui/app/components/ui/icon/copy-icon.component.js b/ui/app/components/ui/icon/copy-icon.component.js new file mode 100644 index 000000000000..04175213db4b --- /dev/null +++ b/ui/app/components/ui/icon/copy-icon.component.js @@ -0,0 +1,36 @@ +import React from 'react' +import PropTypes from 'prop-types' + +const Copy = ({ + className, + size, + color, +}) => ( + + + +) + +Copy.defaultProps = { + className: undefined, +} + +Copy.propTypes = { + className: PropTypes.string, + size: PropTypes.number.isRequired, + color: PropTypes.string.isRequired, +} + +export default Copy diff --git a/ui/app/components/ui/icon/icon.stories.js b/ui/app/components/ui/icon/icon.stories.js new file mode 100644 index 000000000000..95ab1f422dd7 --- /dev/null +++ b/ui/app/components/ui/icon/icon.stories.js @@ -0,0 +1,57 @@ +import React from 'react' +import { color, number } from '@storybook/addon-knobs/react' +import Approve from './approve-icon.component' +import Copy from './copy-icon.component' +import Interaction from './interaction-icon.component' +import Preloader from './preloader' +import Receive from './receive-icon.component' +import Send from './send-icon.component' + +export default { + title: 'Icon', +} + +export const copy = () => ( + +) + +export const send = () => ( + +) + +export const receive = () => ( + +) + +export const siteInteraction = () => ( + +) + +export const approveSpendLimit = () => ( + +) + +export const preloader = () => ( + +) + +export const PaperAirplane = () => ( + +) diff --git a/ui/app/components/ui/icon/index.scss b/ui/app/components/ui/icon/index.scss new file mode 100644 index 000000000000..4e7e9c782269 --- /dev/null +++ b/ui/app/components/ui/icon/index.scss @@ -0,0 +1,19 @@ +.info-icon { + margin: 0 4px; + + &--success { + fill: $accent-green; + } + + &--info { + fill: $primary-blue; + } + + &--warning { + fill: $accent-yellow; + } + + &--danger { + fill: $accent-red; + } +} diff --git a/ui/app/components/ui/icon/info-icon.component.js b/ui/app/components/ui/icon/info-icon.component.js new file mode 100644 index 000000000000..1df0ec5e7122 --- /dev/null +++ b/ui/app/components/ui/icon/info-icon.component.js @@ -0,0 +1,21 @@ +import React from 'react' +import classnames from 'classnames' +import PropTypes from 'prop-types' + +export default function InfoIcon ({ severity }) { + const className = classnames('info-icon', { + 'info-icon--success': severity === 'success', + 'info-icon--warning': severity === 'warning', + 'info-icon--danger': severity === 'danger', + 'info-icon--info': severity === 'info', + }) + return ( + + + + ) +} + +InfoIcon.propTypes = { + severity: PropTypes.oneOf(['success', 'info', 'warning', 'danger']), +} diff --git a/ui/app/components/ui/icon/interaction-icon.component.js b/ui/app/components/ui/icon/interaction-icon.component.js new file mode 100644 index 000000000000..799f7e19d50a --- /dev/null +++ b/ui/app/components/ui/icon/interaction-icon.component.js @@ -0,0 +1,40 @@ +import React from 'react' +import PropTypes from 'prop-types' + +const Interaction = ({ + className, + size, + color, +}) => ( + + + + +) + +Interaction.defaultProps = { + className: undefined, +} + +Interaction.propTypes = { + className: PropTypes.string, + size: PropTypes.number.isRequired, + color: PropTypes.string.isRequired, +} + +export default Interaction diff --git a/ui/app/components/ui/icon/paper-airplane-icon.js b/ui/app/components/ui/icon/paper-airplane-icon.js new file mode 100644 index 000000000000..552f02d7c26e --- /dev/null +++ b/ui/app/components/ui/icon/paper-airplane-icon.js @@ -0,0 +1,33 @@ +import React from 'react' +import PropTypes from 'prop-types' + +export default function PaperAirplane ({ size, className, color }) { + return ( + + + + ) +} + +PaperAirplane.defaultProps = { + color: '#FFFFFF', +} + +PaperAirplane.propTypes = { + className: PropTypes.string, + size: PropTypes.number.isRequired, + color: PropTypes.string, +} + diff --git a/ui/app/components/ui/icon/preloader/index.js b/ui/app/components/ui/icon/preloader/index.js new file mode 100644 index 000000000000..b8c7793d64b6 --- /dev/null +++ b/ui/app/components/ui/icon/preloader/index.js @@ -0,0 +1,3 @@ +import preloader from './preloader-icon.component' + +export default preloader diff --git a/ui/app/components/ui/icon/preloader/index.scss b/ui/app/components/ui/icon/preloader/index.scss new file mode 100644 index 000000000000..e4c7cc9630ee --- /dev/null +++ b/ui/app/components/ui/icon/preloader/index.scss @@ -0,0 +1,16 @@ +.preloader__icon { + animation-name: spin; + animation-duration: 500ms; + animation-iteration-count: infinite; + animation-timing-function: linear; +} + +@keyframes spin { + from { + transform: rotate(0deg); + } + + to { + transform: rotate(360deg); + } +} diff --git a/ui/app/components/ui/icon/preloader/preloader-icon.component.js b/ui/app/components/ui/icon/preloader/preloader-icon.component.js new file mode 100644 index 000000000000..e67d0901d7c4 --- /dev/null +++ b/ui/app/components/ui/icon/preloader/preloader-icon.component.js @@ -0,0 +1,57 @@ +import React from 'react' +import PropTypes from 'prop-types' +import classnames from 'classnames' + +const Preloader = ({ + className, + size, +}) => ( + + + + + + + + + +) + +Preloader.defaultProps = { + className: undefined, +} + +Preloader.propTypes = { + className: PropTypes.string, + size: PropTypes.number.isRequired, +} + +export default Preloader diff --git a/ui/app/components/ui/icon/receive-icon.component.js b/ui/app/components/ui/icon/receive-icon.component.js new file mode 100644 index 000000000000..3ff9e3047cde --- /dev/null +++ b/ui/app/components/ui/icon/receive-icon.component.js @@ -0,0 +1,50 @@ +import React from 'react' +import PropTypes from 'prop-types' + +const Receive = ({ + className, + size, + color, +}) => ( + + + + + +) + +Receive.defaultProps = { + className: undefined, +} + +Receive.propTypes = { + className: PropTypes.string, + size: PropTypes.number.isRequired, + color: PropTypes.string.isRequired, +} + +export default Receive diff --git a/ui/app/components/ui/icon/send-icon.component.js b/ui/app/components/ui/icon/send-icon.component.js new file mode 100644 index 000000000000..eae7ace25da2 --- /dev/null +++ b/ui/app/components/ui/icon/send-icon.component.js @@ -0,0 +1,42 @@ +import React from 'react' +import PropTypes from 'prop-types' + +const Send = ({ + className, + size, + color, +}) => ( + + + + +) + +Send.defaultProps = { + className: undefined, +} + +Send.propTypes = { + className: PropTypes.string, + size: PropTypes.number.isRequired, + color: PropTypes.string.isRequired, +} + +export default Send diff --git a/ui/app/components/ui/icon/sign-icon.component.js b/ui/app/components/ui/icon/sign-icon.component.js new file mode 100644 index 000000000000..3552fb810b09 --- /dev/null +++ b/ui/app/components/ui/icon/sign-icon.component.js @@ -0,0 +1,23 @@ +import React from 'react' +import PropTypes from 'prop-types' + +export default function Sign ({ + className, + size, + color, +}) { + return ( + + + + + + ) +} + +Sign.propTypes = { + className: PropTypes.string, + size: PropTypes.number.isRequired, + color: PropTypes.string.isRequired, +} + diff --git a/ui/app/components/ui/identicon/blockieIdenticon/blockieIdenticon.component.js b/ui/app/components/ui/identicon/blockieIdenticon/blockieIdenticon.component.js new file mode 100644 index 000000000000..ae75e54748e9 --- /dev/null +++ b/ui/app/components/ui/identicon/blockieIdenticon/blockieIdenticon.component.js @@ -0,0 +1,39 @@ +import React, { useEffect, useRef, useState } from 'react' +import PropTypes from 'prop-types' +import { renderIcon } from '@download/blockies' + +const BlockieIdenticon = ({ address, diameter }) => { + const [dataUrl, setDataUrl] = useState(null) + const canvasRef = useRef(null) + + useEffect(() => { + const canvas = canvasRef.current + renderIcon({ seed: address.toLowerCase() }, canvas) + const updatedDataUrl = canvas.toDataURL() + + if (updatedDataUrl !== dataUrl) { + setDataUrl(updatedDataUrl) + } + }, [dataUrl, address]) + + return ( + <> + + + + ) +} + +BlockieIdenticon.propTypes = { + address: PropTypes.string.isRequired, + diameter: PropTypes.number.isRequired, +} + +export default BlockieIdenticon diff --git a/ui/app/components/ui/identicon/blockieIdenticon/index.js b/ui/app/components/ui/identicon/blockieIdenticon/index.js new file mode 100644 index 000000000000..a87ff932359e --- /dev/null +++ b/ui/app/components/ui/identicon/blockieIdenticon/index.js @@ -0,0 +1 @@ +export { default } from './blockieIdenticon.component' diff --git a/ui/app/components/ui/identicon/identicon.component.js b/ui/app/components/ui/identicon/identicon.component.js index 88521247c598..5b91bda234fd 100644 --- a/ui/app/components/ui/identicon/identicon.component.js +++ b/ui/app/components/ui/identicon/identicon.component.js @@ -1,12 +1,13 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' -import { toDataUrl } from '../../../../lib/blockies' import contractMap from 'eth-contract-metadata' + import { checksumAddress } from '../../../helpers/utils/util' import Jazzicon from '../jazzicon' +import BlockieIdenticon from './blockieIdenticon' -const getStyles = diameter => ( +const getStyles = (diameter) => ( { height: diameter, width: diameter, @@ -16,6 +17,7 @@ const getStyles = diameter => ( export default class Identicon extends PureComponent { static propTypes = { + addBorder: PropTypes.bool, address: PropTypes.string, className: PropTypes.string, diameter: PropTypes.number, @@ -24,7 +26,12 @@ export default class Identicon extends PureComponent { } static defaultProps = { + addBorder: false, + address: undefined, + className: undefined, diameter: 46, + image: undefined, + useBlockie: false, } renderImage () { @@ -60,17 +67,16 @@ export default class Identicon extends PureComponent { className={classnames('identicon', className)} style={getStyles(diameter)} > -
    ) } render () { - const { className, address, image, diameter, useBlockie } = this.props + const { className, address, image, diameter, useBlockie, addBorder } = this.props if (image) { return this.renderImage() @@ -83,14 +89,16 @@ export default class Identicon extends PureComponent { return this.renderJazzicon() } - return useBlockie - ? this.renderBlockie() - : this.renderJazzicon() + return ( +
    + { useBlockie ? this.renderBlockie() : this.renderJazzicon() } +
    + ) } return ( diff --git a/ui/app/components/ui/identicon/identicon.container.js b/ui/app/components/ui/identicon/identicon.container.js index bc49bc18ebe2..8565a2df2883 100644 --- a/ui/app/components/ui/identicon/identicon.container.js +++ b/ui/app/components/ui/identicon/identicon.container.js @@ -1,7 +1,7 @@ import { connect } from 'react-redux' import Identicon from './identicon.component' -const mapStateToProps = state => { +const mapStateToProps = (state) => { const { metamask: { useBlockie } } = state return { diff --git a/ui/app/components/ui/identicon/identicon.stories.js b/ui/app/components/ui/identicon/identicon.stories.js new file mode 100644 index 000000000000..3785080d5704 --- /dev/null +++ b/ui/app/components/ui/identicon/identicon.stories.js @@ -0,0 +1,45 @@ +import React from 'react' +import { text, boolean } from '@storybook/addon-knobs/react' +import { number } from '@storybook/addon-knobs' +import Identicon from './identicon.component' + +export default { title: 'Identicon' } + +const diameterOptions = { + range: true, + min: 10, + max: 200, + step: 1, +} +export const standard = () => ( + +) + +export const image = () => ( + +) + +export const blockie = () => ( + +) + +// The border size is hard-coded in CSS, and was designed with this size identicon in mind +const withBorderDiameter = 32 + +export const withBorder = () => ( + +) diff --git a/ui/app/components/ui/identicon/index.scss b/ui/app/components/ui/identicon/index.scss index 657afc48f5a9..427ac8d45c4d 100644 --- a/ui/app/components/ui/identicon/index.scss +++ b/ui/app/components/ui/identicon/index.scss @@ -1,7 +1,27 @@ .identicon { + /*rtl:ignore*/ + direction: ltr; display: flex; flex-shrink: 0; align-items: center; justify-content: center; overflow: hidden; + + &__address-wrapper { + height: 40px; + width: 40px; + border-radius: 18px; + display: flex; + justify-content: center; + align-items: center; + border-style: solid; + border-radius: 50%; + border-width: 2px; + border-color: $primary-blue; + } + + &__eth-logo { + border: 1px solid $alto; + background: $white; + } } diff --git a/ui/app/components/ui/identicon/tests/identicon.component.test.js b/ui/app/components/ui/identicon/tests/identicon.component.test.js index 2944818f5f31..f14229bfd3b1 100644 --- a/ui/app/components/ui/identicon/tests/identicon.component.test.js +++ b/ui/app/components/ui/identicon/tests/identicon.component.test.js @@ -1,11 +1,11 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import thunk from 'redux-thunk' import configureMockStore from 'redux-mock-store' import { mount } from 'enzyme' import Identicon from '../identicon.component' -describe('Identicon', () => { +describe('Identicon', function () { const state = { metamask: { useBlockie: false, @@ -16,34 +16,34 @@ describe('Identicon', () => { const mockStore = configureMockStore(middlewares) const store = mockStore(state) - it('renders default eth_logo identicon with no props', () => { + it('renders default eth_logo identicon with no props', function () { const wrapper = mount( - + , ) - assert.equal(wrapper.find('img.balance-icon').prop('src'), './images/eth_logo.svg') + assert.equal(wrapper.find('img.identicon__eth-logo').prop('src'), './images/eth_logo.svg') }) - it('renders custom image and add className props', () => { + it('renders custom image and add className props', function () { const wrapper = mount( + />, ) assert.equal(wrapper.find('img.test-image').prop('className'), 'identicon test-image') assert.equal(wrapper.find('img.test-image').prop('src'), 'test-image') }) - it('renders div with address prop', () => { + it('renders div with address prop', function () { const wrapper = mount( + />, ) assert.equal(wrapper.find('div.test-address').prop('className'), 'identicon test-address') diff --git a/ui/app/components/ui/info-tooltip/index.js b/ui/app/components/ui/info-tooltip/index.js new file mode 100644 index 000000000000..2fe0f2786e78 --- /dev/null +++ b/ui/app/components/ui/info-tooltip/index.js @@ -0,0 +1 @@ +export { default } from './info-tooltip' diff --git a/ui/app/components/ui/info-tooltip/index.scss b/ui/app/components/ui/info-tooltip/index.scss new file mode 100644 index 000000000000..a85f041ce0f1 --- /dev/null +++ b/ui/app/components/ui/info-tooltip/index.scss @@ -0,0 +1,39 @@ +.info-tooltip { + img { + height: 10px; + width: 10px; + } +} + +.tippy-popper[x-placement^=top] .info-theme [x-arrow] { + border-top-color: $white; +} + +.tippy-popper[x-placement^=right] .info-theme [x-arrow] { + border-right-color: $white; +} + +.tippy-popper[x-placement^=left] .info-theme [x-arrow] { + border-left-color: $white; +} + +.tippy-popper[x-placement^=bottom] .info-theme [x-arrow] { + border-bottom-color: $white; +} + +.tippy-tooltip.info-theme { + background: white; + color: black; + box-shadow: 0 0 14px rgba(0, 0, 0, 0.18); + border-radius: 8px; + max-width: 203px; + padding: 16px; + padding-bottom: 15px; + + .tippy-tooltip-content { + @include H8; + + text-align: left; + color: $Grey-500; + } +} diff --git a/ui/app/components/ui/info-tooltip/info-tooltip.js b/ui/app/components/ui/info-tooltip/info-tooltip.js new file mode 100644 index 000000000000..aecba58ef9db --- /dev/null +++ b/ui/app/components/ui/info-tooltip/info-tooltip.js @@ -0,0 +1,36 @@ +import React from 'react' +import PropTypes from 'prop-types' +import Tooltip from '../tooltip' + +const positionArrowClassMap = { + top: 'info-tooltip__top-tooltip-arrow', + bottom: 'info-tooltip__bottom-tooltip-arrow', + left: 'info-tooltip__left-tooltip-arrow', + right: 'info-tooltip__right-tooltip-arrow', +} + +export default function InfoTooltip ({ + contentText = '', + position = '', +}) { + return ( +
    + + + +
    + ) +} + +InfoTooltip.propTypes = { + contentText: PropTypes.string, + position: PropTypes.oneOf(['top', 'left', 'bottom', 'right']), +} diff --git a/ui/app/components/ui/info-tooltip/info-tooltip.stories.js b/ui/app/components/ui/info-tooltip/info-tooltip.stories.js new file mode 100644 index 000000000000..10e6bec09c39 --- /dev/null +++ b/ui/app/components/ui/info-tooltip/info-tooltip.stories.js @@ -0,0 +1,35 @@ +import React from 'react' +import { text } from '@storybook/addon-knobs/react' +import InfoTooltip from './info-tooltip' + +export default { + title: 'InfoTooltip', +} + +export const Top = () => ( + +) + +export const Bottom = () => ( + +) + +export const Left = () => ( + +) + +export const Right = () => ( + +) diff --git a/ui/app/components/ui/jazzicon/jazzicon.component.js b/ui/app/components/ui/jazzicon/jazzicon.component.js index 3a17e446f8ae..81c5c540a3f6 100644 --- a/ui/app/components/ui/jazzicon/jazzicon.component.js +++ b/ui/app/components/ui/jazzicon/jazzicon.component.js @@ -1,9 +1,8 @@ -import React, { PureComponent } from 'react' +import React, { createRef, PureComponent } from 'react' import PropTypes from 'prop-types' -import isNode from 'detect-node' -import { findDOMNode } from 'react-dom' import jazzicon from 'jazzicon' import iconFactoryGenerator from '../../../../lib/icon-factory' + const iconFactory = iconFactoryGenerator(jazzicon) /** @@ -22,38 +21,34 @@ export default class Jazzicon extends PureComponent { diameter: 46, } + container = createRef() + componentDidMount () { - if (!isNode) { - this.appendJazzicon() - } + this.appendJazzicon() } componentDidUpdate (prevProps) { - const { address: prevAddress } = prevProps - const { address } = this.props + const { address: prevAddress, diameter: prevDiameter } = prevProps + const { address, diameter } = this.props - if (!isNode && address !== prevAddress) { + if (address !== prevAddress || diameter !== prevDiameter) { this.removeExistingChildren() this.appendJazzicon() } } removeExistingChildren () { - // eslint-disable-next-line react/no-find-dom-node - const container = findDOMNode(this) - const { children } = container + const { children } = this.container.current for (let i = 0; i < children.length; i++) { - container.removeChild(children[i]) + this.container.current.removeChild(children[i]) } } appendJazzicon () { - // eslint-disable-next-line react/no-find-dom-node - const container = findDOMNode(this) const { address, diameter } = this.props const image = iconFactory.iconForAddress(address, diameter) - container.appendChild(image) + this.container.current.appendChild(image) } render () { @@ -62,6 +57,7 @@ export default class Jazzicon extends PureComponent { return (
    ) diff --git a/ui/app/components/ui/list-item/index.js b/ui/app/components/ui/list-item/index.js new file mode 100644 index 000000000000..569abb95405b --- /dev/null +++ b/ui/app/components/ui/list-item/index.js @@ -0,0 +1,2 @@ +export { default } from './list-item.component' + diff --git a/ui/app/components/ui/list-item/index.scss b/ui/app/components/ui/list-item/index.scss new file mode 100644 index 000000000000..2117dfc4d931 --- /dev/null +++ b/ui/app/components/ui/list-item/index.scss @@ -0,0 +1,102 @@ +.list-item { + width: 100%; + min-height: 86px; + margin: 0; + background: #fff; + padding: 24px 16px; + + @include Paragraph; + + border-top: 1px solid $mercury; + border-bottom: 1px solid $mercury; + color: $Black-100; + display: grid; + grid-template-columns: 0fr repeat(11, 1fr); + grid-template-areas: + 'icon head head head head head head head right right right right' + 'icon sub sub sub sub sub sub sub right right right right' + '. actions actions actions actions actions actions actions right right right right'; + align-items: start; + cursor: pointer; + + &:hover { + background-color: $Grey-000; + } + + &__icon { + grid-area: icon; + align-self: center; + + > * { + margin: 0 16px 0 0; + } + } + + &__actions { + grid-area: actions; + } + + &__heading { + grid-area: head; + font-size: 16px; + line-height: 160%; + position: relative; + display: flex; + align-items: center; + + > h2 { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + &-wrap { + display: inline-block; + margin-left: 8px; + } + } + + &__subheading { + grid-area: sub; + font-size: 12px; + line-height: 14px; + color: $Grey-500; + margin-top: 4px; + // all direct descendants should be truncated with ellipses + // allows flexibility in consuming components to use h3/other tag + > * { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + &:empty { + display: none; + } + } + + &__mid-content { + grid-area: mid; + font-size: 12px; + color: $Grey-500; + } + + &__right-content { + grid-area: right; + text-align: right; + align-items: flex-end; + } + + @media (max-width: 575px) { + &__mid-content { + display: none; + } + } + + @media (min-width: 576px) { + grid-template-areas: + 'icon head head head head mid mid mid mid right right right' + 'icon sub sub sub sub mid mid mid mid right right right' + '. actions actions actions actions mid mid mid mid right right right'; + } +} diff --git a/ui/app/components/ui/list-item/list-item.component.js b/ui/app/components/ui/list-item/list-item.component.js new file mode 100644 index 000000000000..11a722d7c96b --- /dev/null +++ b/ui/app/components/ui/list-item/list-item.component.js @@ -0,0 +1,69 @@ +import React from 'react' +import PropTypes from 'prop-types' +import classnames from 'classnames' + +export default function ListItem ({ + title, + subtitle, + onClick, + children, + titleIcon, + icon, + rightContent, + midContent, + className, + 'data-testid': dataTestId, +}) { + const primaryClassName = classnames('list-item', className) + + return ( +
    + {icon && ( +
    + {icon} +
    + )} +
    +

    { title }

    + {titleIcon && ( +
    + {titleIcon} +
    + )} +
    + {subtitle && ( +
    + {subtitle} +
    + )} + {children && ( +
    + { children } +
    + )} + {midContent && ( +
    + {midContent} +
    + )} + {rightContent && ( +
    + {rightContent} +
    + )} +
    + ) +} + +ListItem.propTypes = { + title: PropTypes.string.isRequired, + titleIcon: PropTypes.node, + subtitle: PropTypes.node, + children: PropTypes.node, + icon: PropTypes.node, + rightContent: PropTypes.node, + midContent: PropTypes.node, + className: PropTypes.string, + onClick: PropTypes.func, + 'data-testid': PropTypes.string, +} diff --git a/ui/app/components/ui/list-item/list-item.stories.js b/ui/app/components/ui/list-item/list-item.stories.js new file mode 100644 index 000000000000..197a06296a6f --- /dev/null +++ b/ui/app/components/ui/list-item/list-item.stories.js @@ -0,0 +1,90 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { text } from '@storybook/addon-knobs/react' +import Send from '../icon/send-icon.component' +import Interaction from '../icon/interaction-icon.component' +import Approve from '../icon/approve-icon.component' +import Receive from '../icon/receive-icon.component' +import Preloader from '../icon/preloader' +import Button from '../button' +import ListItem from './list-item.component' + +export default { + title: 'ListItem', +} + +function Currencies ({ primary, secondary }) { + return ( +
    +
    {primary}
    +
    {secondary}
    +
    + ) +} + +Currencies.propTypes = { + primary: PropTypes.string, + secondary: PropTypes.string, +} + +const okColor = '#2F80ED' +const failColor = '#D73A49' + +export const send = () => ( + } + titleIcon={ ( + + )} + title={text('title', 'Send DAI')} + className="list-item" + subtitle={text('subtitle', 'Sept 20 · To: 00X4...3058')} + rightContent={} + > +
    + + +
    +
    +) + +export const pending = () => ( + } + title={text('title', 'Hatch Turtles')} + className="list-item" + subtitleStatus={Unapproved · } + subtitle={text('subtitle', 'Turtlefarm.com')} + rightContent={} + /> +) + +export const approve = () => ( + } + title={text('title', 'Approve spend limit')} + className="list-item" + subtitle={text('subtitle', 'Sept 20 · oxuniverse.com')} + rightContent={} + /> +) + +export const receive = () => ( + } + title={text('title', 'Hatch Turtles')} + className="list-item" + subtitle={text('subtitle', 'Sept 20 · From: 00X4...3058')} + rightContent={} + /> +) diff --git a/ui/app/components/ui/list-item/tests/list-item.test.js b/ui/app/components/ui/list-item/tests/list-item.test.js new file mode 100644 index 000000000000..10e534446be8 --- /dev/null +++ b/ui/app/components/ui/list-item/tests/list-item.test.js @@ -0,0 +1,75 @@ +import assert from 'assert' +import { shallow } from 'enzyme' +import React from 'react' +import Sinon from 'sinon' +import ListItem from '../list-item.component' +import Preloader from '../../icon/preloader/preloader-icon.component' +import Send from '../../icon/send-icon.component' + +const TITLE = 'Hello World' +const SUBTITLE =

    I am a list item

    +const CLASSNAME = 'list-item-test' +const RIGHT_CONTENT =

    Content rendered to the right

    +const CHILDREN = +const MID_CONTENT =

    Content rendered in the middle

    + +describe('ListItem', function () { + let wrapper + let clickHandler + before(function () { + clickHandler = Sinon.fake() + wrapper = shallow( + } + titleIcon={} + onClick={clickHandler} + > + {CHILDREN} + , + ) + }) + it('includes the data-testid', function () { + assert.equal(wrapper.props()['data-testid'], 'test-id') + }) + it(`renders "${TITLE}" title`, function () { + assert.equal(wrapper.find('.list-item__heading h2').text(), TITLE) + }) + it('adds html title to heading element', function () { + assert.equal(wrapper.find('.list-item__heading').props().title, TITLE) + }) + it(`renders "I am a list item" subtitle`, function () { + assert.equal(wrapper.find('.list-item__subheading').text(), 'I am a list item') + }) + it('attaches external className', function () { + assert(wrapper.props().className.includes(CLASSNAME)) + }) + it('renders content on the right side of the list item', function () { + assert.equal(wrapper.find('.list-item__right-content p').text(), 'Content rendered to the right') + }) + it('renders content in the middle of the list item', function () { + assert.equal(wrapper.find('.list-item__mid-content p').text(), 'Content rendered in the middle') + }) + it('renders list item actions', function () { + assert.equal(wrapper.find('.list-item__actions button').text(), 'I am a button') + }) + it('renders the title icon', function () { + assert(wrapper.find(Preloader)) + }) + it('renders the list item icon', function () { + assert(wrapper.find(Send)) + }) + it('handles click action and fires onClick', function () { + wrapper.simulate('click') + assert.equal(clickHandler.callCount, 1) + }) + + after(function () { + Sinon.restore() + }) +}) diff --git a/ui/app/components/ui/loading-screen/index.js b/ui/app/components/ui/loading-screen/index.js index 191d953f72e7..e6ea29114db5 100644 --- a/ui/app/components/ui/loading-screen/index.js +++ b/ui/app/components/ui/loading-screen/index.js @@ -1,2 +1,3 @@ -const LoadingScreen = require('./loading-screen.component') -module.exports = LoadingScreen +import LoadingScreen from './loading-screen.component' + +export default LoadingScreen diff --git a/ui/app/components/ui/loading-screen/index.scss b/ui/app/components/ui/loading-screen/index.scss new file mode 100644 index 000000000000..d05286cee814 --- /dev/null +++ b/ui/app/components/ui/loading-screen/index.scss @@ -0,0 +1,61 @@ +.loading-overlay { + left: 0; + z-index: 51; + position: fixed; + flex-direction: column; + display: flex; + justify-content: center; + align-items: center; + flex: 1 1 auto; + width: 100%; + height: 100%; + background: rgba(255, 255, 255, 0.8); + + &__screen-content { + display: flex; + flex-direction: column; + align-items: center; + } + + &__container { + position: absolute; + top: 33%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + } + + &__message { + margin-top: 32px; + font-weight: 400; + font-size: 20px; + color: $manatee; + } + + &__error-screen { + display: flex; + flex-direction: column; + align-items: center; + height: 160px; + justify-content: space-evenly; + } + + &__error-buttons { + display: flex; + flex-direction: row; + + button { + margin: 5px; + } + } + + &__emoji { + font-size: 32px; + } + + &__spinner { + height: 58px; + width: 58px; + } +} diff --git a/ui/app/components/ui/loading-screen/loading-screen.component.js b/ui/app/components/ui/loading-screen/loading-screen.component.js index 6b843cfee0c4..e7f754acc954 100644 --- a/ui/app/components/ui/loading-screen/loading-screen.component.js +++ b/ui/app/components/ui/loading-screen/loading-screen.component.js @@ -1,31 +1,40 @@ -const { Component } = require('react') -const h = require('react-hyperscript') -const PropTypes = require('prop-types') -const Spinner = require('../spinner') +import React, { Component, isValidElement } from 'react' +import PropTypes from 'prop-types' +import Spinner from '../spinner' class LoadingScreen extends Component { + static defaultProps = { + loadingMessage: null, + showLoadingSpinner: true, + } + + static propTypes = { + loadingMessage: PropTypes.oneOf([PropTypes.string, PropTypes.element]), + showLoadingSpinner: PropTypes.bool, + header: PropTypes.element, + } + renderMessage () { const { loadingMessage } = this.props - return loadingMessage && h('span', loadingMessage) + if (isValidElement(loadingMessage)) { + return loadingMessage + } + return loadingMessage + ? {loadingMessage} + : null } render () { return ( - h('.loading-overlay', [ - h('.loading-overlay__container', [ - h(Spinner, { - color: '#F7C06C', - }), - - this.renderMessage(), - ]), - ]) +
    + {this.props.header && this.props.header} +
    + {this.props.showLoadingSpinner && } + {this.renderMessage()} +
    +
    ) } } -LoadingScreen.propTypes = { - loadingMessage: PropTypes.string, -} - -module.exports = LoadingScreen +export default LoadingScreen diff --git a/ui/app/components/ui/lock-icon/lock-icon.component.js b/ui/app/components/ui/lock-icon/lock-icon.component.js index d010cb6b2fa9..7724b75dda8a 100644 --- a/ui/app/components/ui/lock-icon/lock-icon.component.js +++ b/ui/app/components/ui/lock-icon/lock-icon.component.js @@ -12,7 +12,7 @@ export default function LockIcon (props) { width="401.998px" height="401.998px" viewBox="0 0 401.998 401.998" - style={{enableBackground: 'new 0 0 401.998 401.998'}} + style={{ enableBackground: 'new 0 0 401.998 401.998' }} xmlSpace="preserve" {...props} > diff --git a/ui/app/components/ui/mascot.js b/ui/app/components/ui/mascot.js deleted file mode 100644 index 3b0d3e31b416..000000000000 --- a/ui/app/components/ui/mascot.js +++ /dev/null @@ -1,59 +0,0 @@ -const inherits = require('util').inherits -const Component = require('react').Component -const h = require('react-hyperscript') -const metamaskLogo = require('metamask-logo') -const debounce = require('debounce') - -module.exports = Mascot - -inherits(Mascot, Component) -function Mascot ({width = '200', height = '200'}) { - Component.call(this) - this.logo = metamaskLogo({ - followMouse: true, - pxNotRatio: true, - width, - height, - }) - - this.refollowMouse = debounce(this.logo.setFollowMouse.bind(this.logo, true), 1000) - this.unfollowMouse = this.logo.setFollowMouse.bind(this.logo, false) -} - -Mascot.prototype.render = function () { - // this is a bit hacky - // the event emitter is on `this.props` - // and we dont get that until render - this.handleAnimationEvents() - - return h('#metamask-mascot-container', { - style: { zIndex: 0 }, - }) -} - -Mascot.prototype.componentDidMount = function () { - var targetDivId = 'metamask-mascot-container' - var container = document.getElementById(targetDivId) - container.appendChild(this.logo.container) -} - -Mascot.prototype.componentWillUnmount = function () { - this.animations = this.props.animationEventEmitter - this.animations.removeAllListeners() - this.logo.container.remove() - this.logo.stopAnimation() -} - -Mascot.prototype.handleAnimationEvents = function () { - // only setup listeners once - if (this.animations) return - this.animations = this.props.animationEventEmitter - this.animations.on('point', this.lookAt.bind(this)) - this.animations.on('setFollowMouse', this.logo.setFollowMouse.bind(this.logo)) -} - -Mascot.prototype.lookAt = function (target) { - this.unfollowMouse() - this.logo.lookAt(target) - this.refollowMouse() -} diff --git a/ui/app/components/ui/mascot/index.js b/ui/app/components/ui/mascot/index.js new file mode 100644 index 000000000000..ad6ece33136b --- /dev/null +++ b/ui/app/components/ui/mascot/index.js @@ -0,0 +1 @@ +export { default } from './mascot.component' diff --git a/ui/app/components/ui/mascot/mascot.component.js b/ui/app/components/ui/mascot/mascot.component.js new file mode 100644 index 000000000000..ccc295af88fe --- /dev/null +++ b/ui/app/components/ui/mascot/mascot.component.js @@ -0,0 +1,117 @@ +import PropTypes from 'prop-types' +import React, { createRef, Component } from 'react' +import MetaMaskLogo from '@metamask/logo' +import { debounce } from 'lodash' + +const directionTargetGenerator = ({ top, left, height, width }) => { + const horizontalMiddle = left + (width / 2) + const verticalMiddle = top + (height / 2) + return { + up: { x: horizontalMiddle, y: top - height }, + down: { x: horizontalMiddle, y: top + (height * 2) }, + left: { x: left - width, y: verticalMiddle }, + right: { x: left + (width * 2), y: verticalMiddle }, + middle: { x: horizontalMiddle, y: verticalMiddle }, + } +} + +export default class Mascot extends Component { + static propTypes = { + animationEventEmitter: PropTypes.object.isRequired, + width: PropTypes.string, + height: PropTypes.string, + followMouse: PropTypes.bool, + lookAtTarget: PropTypes.object, + lookAtDirection: PropTypes.oneOf(['up', 'down', 'left', 'right', 'middle']), + } + + static defaultProps = { + width: '200', + height: '200', + followMouse: true, + lookAtTarget: {}, + lookAtDirection: '', + } + + constructor (props) { + super(props) + + const { width, height, followMouse } = props + + this.logo = MetaMaskLogo({ + followMouse, + pxNotRatio: true, + width, + height, + }) + + this.mascotContainer = createRef() + + this.refollowMouse = debounce(this.logo.setFollowMouse.bind(this.logo, true), 1000) + this.unfollowMouse = this.logo.setFollowMouse.bind(this.logo, false) + } + + handleAnimationEvents () { + // only setup listeners once + if (this.animations) { + return + } + this.animations = this.props.animationEventEmitter + this.animations.on('point', this.lookAt.bind(this)) + this.animations.on('setFollowMouse', this.logo.setFollowMouse.bind(this.logo)) + } + + lookAt (target) { + this.unfollowMouse() + this.logo.lookAt(target) + this.refollowMouse() + } + + componentDidMount () { + this.mascotContainer.current.appendChild(this.logo.container) + this.directionTargetMap = directionTargetGenerator(this.mascotContainer.current.getBoundingClientRect()) + + const { lookAtTarget, lookAtDirection } = this.props + + if (lookAtTarget?.x && lookAtTarget?.y) { + this.logo.lookAtAndRender(lookAtTarget) + } else if (lookAtDirection) { + this.logo.lookAtAndRender(this.directionTargetMap[lookAtDirection]) + } + } + + componentDidUpdate (prevProps) { + const { lookAtTarget: prevTarget = {}, lookAtDirection: prevDirection = '', followMouse: prevFollowMouse } = prevProps + const { lookAtTarget = {}, followMouse, lookAtDirection } = this.props + + if (lookAtDirection && prevDirection !== lookAtDirection) { + this.logo.lookAtAndRender(this.directionTargetMap[lookAtDirection]) + } else if (lookAtTarget?.x !== prevTarget?.x || lookAtTarget?.y !== prevTarget?.y) { + this.logo.lookAtAndRender(lookAtTarget) + } + if (prevFollowMouse !== followMouse) { + this.unfollowMouse() + followMouse && this.refollowMouse() + } + } + + componentWillUnmount () { + this.animations = this.props.animationEventEmitter + this.animations.removeAllListeners() + this.logo.container.remove() + this.logo.stopAnimation() + } + + render () { + // this is a bit hacky + // the event emitter is on `this.props` + // and we dont get that until render + this.handleAnimationEvents() + return ( +
    + ) + } +} diff --git a/ui/app/components/ui/mascot/mascot.stories.js b/ui/app/components/ui/mascot/mascot.stories.js new file mode 100644 index 000000000000..0ce1ab09a593 --- /dev/null +++ b/ui/app/components/ui/mascot/mascot.stories.js @@ -0,0 +1,98 @@ +import EventEmitter from 'events' +import React, { useState } from 'react' +import Button from '../button' +import ButtonGroup from '../button-group' +import Mascot from './mascot.component' + +const animationEventEmitter = new EventEmitter() + +const containerStyle = { + height: '600px', + width: '357px', + border: '1px solid black', + display: 'flex', + flexFlow: 'column', + justifyContent: 'center', + alignItems: 'center', +} + +const buttonStyle = { + marginTop: '16px', +} + +export default { + title: 'Mascot', +} + +export function Demo () { + const [lookAtDirection, setLookAtDirection] = useState(null) + const [followMouseMode, setFollowMouseMode] = useState(false) + const [clickToLookMode, setClickToLookMode] = useState(false) + const [clickedTarget, setClickedTarget] = useState(null) + + const createDirectionOnClick = (direction) => () => { + setFollowMouseMode(false) + setClickToLookMode(false) + setLookAtDirection(direction) + } + + return ( +
    { + const isButtonClick = event.target.classList.contains('button-group__button') + if (clickToLookMode && !isButtonClick) { + setLookAtDirection(null) + setClickedTarget({ x: event.clientX, y: event.clientY }) + } + }} + > + +
    + + + + + + + + + +
    +
    + ) +} diff --git a/ui/app/components/ui/menu/index.js b/ui/app/components/ui/menu/index.js new file mode 100644 index 000000000000..2d624ff68c36 --- /dev/null +++ b/ui/app/components/ui/menu/index.js @@ -0,0 +1,2 @@ +export { default as Menu } from './menu' +export { default as MenuItem } from './menu-item' diff --git a/ui/app/components/ui/menu/menu-item.js b/ui/app/components/ui/menu/menu-item.js new file mode 100644 index 000000000000..c2893b444089 --- /dev/null +++ b/ui/app/components/ui/menu/menu-item.js @@ -0,0 +1,36 @@ +import React from 'react' +import PropTypes from 'prop-types' +import classnames from 'classnames' + +const MenuItem = ({ children, className, 'data-testid': dataTestId, iconClassName, onClick, subtitle }) => ( + +) + +MenuItem.propTypes = { + children: PropTypes.node.isRequired, + className: PropTypes.string, + 'data-testid': PropTypes.string, + iconClassName: PropTypes.string, + onClick: PropTypes.func, + subtitle: PropTypes.node, +} + +MenuItem.defaultProps = { + className: undefined, + 'data-testid': undefined, + iconClassName: undefined, + onClick: undefined, + subtitle: undefined, +} + +export default MenuItem diff --git a/ui/app/components/ui/menu/menu.js b/ui/app/components/ui/menu/menu.js new file mode 100644 index 000000000000..9682a8cc6e41 --- /dev/null +++ b/ui/app/components/ui/menu/menu.js @@ -0,0 +1,43 @@ +import PropTypes from 'prop-types' +import React, { useRef, useState } from 'react' +import { createPortal } from 'react-dom' +import { usePopper } from 'react-popper' +import classnames from 'classnames' + +const Menu = ({ anchorElement, children, className, onHide, popperOptions }) => { + const [popperElement, setPopperElement] = useState(null) + const popoverContainerElement = useRef(document.getElementById('popover-content')) + + const { attributes, styles } = usePopper(anchorElement, popperElement, popperOptions) + + return createPortal( + <> +
    +
    + { children } +
    + , + popoverContainerElement.current, + ) +} + +Menu.propTypes = { + anchorElement: PropTypes.instanceOf(window.Element), + children: PropTypes.node.isRequired, + className: PropTypes.string, + onHide: PropTypes.func.isRequired, + popperOptions: PropTypes.object, +} + +Menu.defaultProps = { + anchorElement: undefined, + className: undefined, + popperOptions: undefined, +} + +export default Menu diff --git a/ui/app/components/ui/menu/menu.scss b/ui/app/components/ui/menu/menu.scss new file mode 100644 index 000000000000..a34deda532d7 --- /dev/null +++ b/ui/app/components/ui/menu/menu.scss @@ -0,0 +1,56 @@ +.menu { + &__container { + background: $white; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.214); + border-radius: 8px; + width: 225px; + color: $Black-100; + display: flex; + flex-direction: column; + align-items: center; + padding: 0 16px; + font-size: 14px; + font-weight: normal; + line-height: 20px; + z-index: 1050; + } + + &__background { + position: absolute; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + z-index: 1050; + } +} + +.menu-item { + background: none; + font-size: inherit; + display: grid; + grid-template-columns: min-content auto; + text-align: start; + align-items: center; + width: 100%; + padding: 14px 0; + cursor: pointer; + + &__icon { + margin-right: 8px; + grid-row: 1 / span 2; + color: $Grey-500; + } + + .disconnect-icon { + &::before { + content: ""; + background-image: url(/images/icons/disconnect.svg); + background-size: contain; + background-repeat: no-repeat; + background-position: center; + padding: 8px; + display: flex; + } + } +} diff --git a/ui/app/components/ui/menu/menu.stories.js b/ui/app/components/ui/menu/menu.stories.js new file mode 100644 index 000000000000..02eb2186a4e0 --- /dev/null +++ b/ui/app/components/ui/menu/menu.stories.js @@ -0,0 +1,36 @@ +import React, { useState } from 'react' +import { action } from '@storybook/addon-actions' +import { Menu, MenuItem } from '.' + +export default { + title: 'Menu', +} + +export const Basic = () => { + return ( + + Menu Item 1 + Menu Item 2 + Menu Item 3 + + ) +} + +export const Anchored = () => { + const [anchorElement, setAnchorElement] = useState(null) + return ( + <> + + + Menu Item 1 + Menu Item 2 + Menu Item 3 + + + ) +} diff --git a/ui/app/components/ui/metafox-logo/index.js b/ui/app/components/ui/metafox-logo/index.js new file mode 100644 index 000000000000..0aeaed74369f --- /dev/null +++ b/ui/app/components/ui/metafox-logo/index.js @@ -0,0 +1 @@ +export { default } from './metafox-logo.component' diff --git a/ui/app/components/ui/metafox-logo/metafox-logo.component.js b/ui/app/components/ui/metafox-logo/metafox-logo.component.js new file mode 100644 index 000000000000..4b1509c6ecbf --- /dev/null +++ b/ui/app/components/ui/metafox-logo/metafox-logo.component.js @@ -0,0 +1,39 @@ +import React, { PureComponent } from 'react' +import PropTypes from 'prop-types' +import classnames from 'classnames' + +export default class MetaFoxLogo extends PureComponent { + static propTypes = { + onClick: PropTypes.func, + unsetIconHeight: PropTypes.bool, + } + + static defaultProps = { + onClick: undefined, + } + + render () { + const { onClick, unsetIconHeight } = this.props + const iconProps = unsetIconHeight ? {} : { height: 42, width: 42 } + + return ( +
    + + +
    + ) + } +} diff --git a/ui/app/components/ui/metafox-logo/tests/metafox-logo.component.test.js b/ui/app/components/ui/metafox-logo/tests/metafox-logo.component.test.js new file mode 100644 index 000000000000..acdf4c1c720f --- /dev/null +++ b/ui/app/components/ui/metafox-logo/tests/metafox-logo.component.test.js @@ -0,0 +1,25 @@ +import assert from 'assert' +import React from 'react' +import { mount } from 'enzyme' +import MetaFoxLogo from '..' + +describe('MetaFoxLogo', function () { + + it('sets icon height and width to 42 by default', function () { + const wrapper = mount( + , + ) + + assert.equal(wrapper.find('img.app-header__metafox-logo--icon').prop('width'), 42) + assert.equal(wrapper.find('img.app-header__metafox-logo--icon').prop('height'), 42) + }) + + it('does not set icon height and width when unsetIconHeight is true', function () { + const wrapper = mount( + , + ) + + assert.equal(wrapper.find('img.app-header__metafox-logo--icon').prop('width'), null) + assert.equal(wrapper.find('img.app-header__metafox-logo--icon').prop('height'), null) + }) +}) diff --git a/ui/app/components/ui/page-container/index.js b/ui/app/components/ui/page-container/index.js index 913b8c9c6d83..1c423e870172 100644 --- a/ui/app/components/ui/page-container/index.js +++ b/ui/app/components/ui/page-container/index.js @@ -1,4 +1,5 @@ import PageContainerHeader from './page-container-header' import PageContainerFooter from './page-container-footer' + export { default } from './page-container.component' export { PageContainerHeader, PageContainerFooter } diff --git a/ui/app/components/ui/page-container/index.scss b/ui/app/components/ui/page-container/index.scss index 003c5a0e2568..4c4969a2b57a 100644 --- a/ui/app/components/ui/page-container/index.scss +++ b/ui/app/components/ui/page-container/index.scss @@ -1,7 +1,7 @@ .page-container { width: 408px; background-color: $white; - box-shadow: 0 0 7px 0 rgba(0, 0, 0, .08); + box-shadow: 0 0 7px 0 rgba(0, 0, 0, 0.08); z-index: 25; display: flex; flex-flow: column; @@ -46,6 +46,7 @@ flex: 1; display: flex; flex-direction: column; + min-height: 0; } &__footer { @@ -55,7 +56,7 @@ border-top: 1px solid $geyser; flex: 0 0 auto; - header { + footer { display: flex; flex-flow: row; justify-content: center; @@ -63,14 +64,15 @@ flex: 0 0 auto; } - footer { + &-secondary { display: flex; flex-flow: row; justify-content: space-around; padding: 0 16px 16px; flex: 0 0 auto; - a, a:hover { + a, + a:hover { text-decoration: none; cursor: pointer; font-size: 0.75rem; @@ -104,9 +106,9 @@ } &__subtitle { - padding-top: .5rem; + padding-top: 0.5rem; line-height: initial; - font-size: .9rem; + font-size: 0.9rem; color: $gray; } @@ -117,23 +119,14 @@ &__tab { min-width: 5rem; - padding: 8px; color: $dusty-gray; - font-family: Roboto; font-size: 1rem; - text-align: center; - cursor: pointer; border-bottom: none; margin-right: 16px; &:last-of-type { margin-right: 0; } - - &--selected { - color: $curious-blue; - border-bottom: 2px solid $curious-blue; - } } &--full-width { diff --git a/ui/app/components/ui/page-container/page-container-content.component.js b/ui/app/components/ui/page-container/page-container-content.component.js index a1d6988ccbe8..476e25e5c2fc 100644 --- a/ui/app/components/ui/page-container/page-container-content.component.js +++ b/ui/app/components/ui/page-container/page-container-content.component.js @@ -5,7 +5,7 @@ export default class PageContainerContent extends Component { static propTypes = { children: PropTypes.node.isRequired, - }; + } render () { return ( diff --git a/ui/app/components/ui/page-container/page-container-footer/page-container-footer.component.js b/ui/app/components/ui/page-container/page-container-footer/page-container-footer.component.js index a2cf0100bf22..5468999a419c 100644 --- a/ui/app/components/ui/page-container/page-container-footer/page-container-footer.component.js +++ b/ui/app/components/ui/page-container/page-container-footer/page-container-footer.component.js @@ -14,6 +14,7 @@ export default class PageContainerFooter extends Component { disabled: PropTypes.bool, submitButtonType: PropTypes.string, hideCancel: PropTypes.bool, + buttonSizeLarge: PropTypes.bool, } static contextTypes = { @@ -31,36 +32,41 @@ export default class PageContainerFooter extends Component { submitButtonType, hideCancel, cancelButtonType, + buttonSizeLarge = false, } = this.props return (
    -
    - {!hideCancel && } +
    + {!hideCancel && ( + + )} -
    + {children && ( -
    +
    {children} -
    +
    )}
    diff --git a/ui/app/components/ui/page-container/page-container-footer/tests/page-container-footer.component.test.js b/ui/app/components/ui/page-container/page-container-footer/tests/page-container-footer.component.test.js index 64efabab0935..8a5cf1114f63 100644 --- a/ui/app/components/ui/page-container/page-container-footer/tests/page-container-footer.component.test.js +++ b/ui/app/components/ui/page-container/page-container-footer/tests/page-container-footer.component.test.js @@ -1,77 +1,79 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { shallow } from 'enzyme' import sinon from 'sinon' import Button from '../../../button' import PageFooter from '../page-container-footer.component' -describe('Page Footer', () => { +describe('Page Footer', function () { let wrapper const onCancel = sinon.spy() const onSubmit = sinon.spy() - beforeEach(() => { - wrapper = shallow() + beforeEach(function () { + wrapper = shallow(( + + )) }) - it('renders page container footer', () => { + it('renders page container footer', function () { assert.equal(wrapper.find('.page-container__footer').length, 1) }) - it('should render a footer inside page-container__footer when given children', () => { - const wrapper = shallow( + it('should render a secondary footer inside page-container__footer when given children', function () { + wrapper = shallow(
    Works
    , - { context: { t: sinon.spy((k) => `[${k}]`) } } + { context: { t: sinon.spy((k) => `[${k}]`) } }, ) - assert.equal(wrapper.find('.page-container__footer footer').length, 1) + assert.equal(wrapper.find('.page-container__footer-secondary').length, 1) }) - it('renders two button components', () => { + it('renders two button components', function () { assert.equal(wrapper.find(Button).length, 2) }) - describe('Cancel Button', () => { + describe('Cancel Button', function () { - it('has button type of default', () => { + it('has button type of default', function () { assert.equal(wrapper.find('.page-container__footer-button').first().prop('type'), 'default') }) - it('has children text of Cancel', () => { + it('has children text of Cancel', function () { assert.equal(wrapper.find('.page-container__footer-button').first().prop('children'), 'Cancel') }) - it('should call cancel when click is simulated', () => { + it('should call cancel when click is simulated', function () { wrapper.find('.page-container__footer-button').first().prop('onClick')() assert.equal(onCancel.callCount, 1) }) }) - describe('Submit Button', () => { + describe('Submit Button', function () { - it('assigns button type based on props', () => { + it('assigns button type based on props', function () { assert.equal(wrapper.find('.page-container__footer-button').last().prop('type'), 'Test Type') }) - it('has disabled prop', () => { + it('has disabled prop', function () { assert.equal(wrapper.find('.page-container__footer-button').last().prop('disabled'), false) }) - it('has children text when submitText prop exists', () => { + it('has children text when submitText prop exists', function () { assert.equal(wrapper.find('.page-container__footer-button').last().prop('children'), 'Submit') }) - it('should call submit when click is simulated', () => { + it('should call submit when click is simulated', function () { wrapper.find('.page-container__footer-button').last().prop('onClick')() assert.equal(onSubmit.callCount, 1) }) diff --git a/ui/app/components/ui/page-container/page-container-header/page-container-header.component.js b/ui/app/components/ui/page-container/page-container-header/page-container-header.component.js index 08f9c754465d..5d5a88a9ea4b 100644 --- a/ui/app/components/ui/page-container/page-container-header/page-container-header.component.js +++ b/ui/app/components/ui/page-container/page-container-header/page-container-header.component.js @@ -1,6 +1,7 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' +import Button from '../../button' export default class PageContainerHeader extends Component { static propTypes = { @@ -13,6 +14,7 @@ export default class PageContainerHeader extends Component { backButtonString: PropTypes.string, tabs: PropTypes.node, headerCloseText: PropTypes.string, + className: PropTypes.string, } renderTabs () { @@ -42,37 +44,42 @@ export default class PageContainerHeader extends Component { } render () { - const { title, subtitle, onClose, tabs, headerCloseText } = this.props + const { title, subtitle, onClose, tabs, headerCloseText, className } = this.props return ( -
    +
    { this.renderHeaderRow() } { - title &&
    - { title } -
    + title && ( +
    + { title } +
    + ) } { - subtitle &&
    - { subtitle } -
    + subtitle && ( +
    + { subtitle } +
    + ) } { onClose && headerCloseText - ?
    onClose()}>{ headerCloseText }
    - : onClose &&
    onClose()} - /> + ? + : onClose && ( +
    onClose()} + /> + ) } { this.renderTabs() } diff --git a/ui/app/components/ui/page-container/page-container-header/tests/page-container-header.component.test.js b/ui/app/components/ui/page-container/page-container-header/tests/page-container-header.component.test.js index 59304b2bd050..b544e6f4c2fc 100644 --- a/ui/app/components/ui/page-container/page-container-header/tests/page-container-header.component.test.js +++ b/ui/app/components/ui/page-container/page-container-header/tests/page-container-header.component.test.js @@ -1,49 +1,51 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { shallow } from 'enzyme' import sinon from 'sinon' import PageContainerHeader from '../page-container-header.component' -describe('Page Container Header', () => { +describe('Page Container Header', function () { let wrapper, style, onBackButtonClick, onClose - beforeEach(() => { - style = {test: 'style'} + beforeEach(function () { + style = { test: 'style' } onBackButtonClick = sinon.spy() onClose = sinon.spy() - wrapper = shallow() + wrapper = shallow(( + + )) }) - describe('Render Header Row', () => { + describe('Render Header Row', function () { - it('renders back button', () => { + it('renders back button', function () { assert.equal(wrapper.find('.page-container__back-button').length, 1) assert.equal(wrapper.find('.page-container__back-button').text(), 'Back') }) - it('ensures style prop', () => { + it('ensures style prop', function () { assert.equal(wrapper.find('.page-container__back-button').props().style, style) }) - it('should call back button when click is simulated', () => { + it('should call back button when click is simulated', function () { wrapper.find('.page-container__back-button').prop('onClick')() assert.equal(onBackButtonClick.callCount, 1) }) }) - describe('Render', () => { + describe('Render', function () { let header, headerRow, pageTitle, pageSubtitle, pageClose, pageTab - beforeEach(() => { + beforeEach(function () { header = wrapper.find('.page-container__header--no-padding-bottom') headerRow = wrapper.find('.page-container__header-row') pageTitle = wrapper.find('.page-container__title') @@ -52,7 +54,7 @@ describe('Page Container Header', () => { pageTab = wrapper.find('.page-container__tabs') }) - it('renders page container', () => { + it('renders page container', function () { assert.equal(header.length, 1) assert.equal(headerRow.length, 1) assert.equal(pageTitle.length, 1) @@ -61,19 +63,19 @@ describe('Page Container Header', () => { assert.equal(pageTab.length, 1) }) - it('renders title', () => { + it('renders title', function () { assert.equal(pageTitle.text(), 'Test Title') }) - it('renders subtitle', () => { + it('renders subtitle', function () { assert.equal(pageSubtitle.text(), 'Test Subtitle') }) - it('renders tabs', () => { + it('renders tabs', function () { assert.equal(pageTab.text(), 'Test Tab') }) - it('should call close when click is simulated', () => { + it('should call close when click is simulated', function () { pageClose.prop('onClick')() assert.equal(onClose.callCount, 1) }) diff --git a/ui/app/components/ui/page-container/page-container.component.js b/ui/app/components/ui/page-container/page-container.component.js index 45dfff5178bf..fd3b2eedeb3a 100644 --- a/ui/app/components/ui/page-container/page-container.component.js +++ b/ui/app/components/ui/page-container/page-container.component.js @@ -41,19 +41,18 @@ export default class PageContainer extends PureComponent { const { tabsComponent } = this.props if (!tabsComponent) { - return + return null } const numberOfTabs = React.Children.count(tabsComponent.props.children) return React.Children.map(tabsComponent.props.children, (child, tabIndex) => { return child && React.cloneElement(child, { - onClick: index => this.handleTabClick(index), + onClick: (index) => this.handleTabClick(index), tabIndex, isActive: numberOfTabs > 1 && tabIndex === this.state.activeTabIndex, key: tabIndex, className: 'page-container__tab', - activeClassName: 'page-container__tab--selected', }) }) } @@ -61,7 +60,7 @@ export default class PageContainer extends PureComponent { renderActiveTabContent () { const { tabsComponent } = this.props let { children } = tabsComponent.props - children = children.filter(child => child) + children = children.filter((child) => child) const { activeTabIndex } = this.state return children[activeTabIndex] @@ -76,9 +75,8 @@ export default class PageContainer extends PureComponent { return contentComponent } else if (tabsComponent) { return this.renderActiveTabContent() - } else { - return null } + return null } render () { diff --git a/ui/app/components/ui/page-container/tests/page-container.component.test.js b/ui/app/components/ui/page-container/tests/page-container.component.test.js deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/ui/app/components/ui/popover/index.js b/ui/app/components/ui/popover/index.js new file mode 100644 index 000000000000..416fee51a6c1 --- /dev/null +++ b/ui/app/components/ui/popover/index.js @@ -0,0 +1,3 @@ +import Item from './popover.component' + +export default Item diff --git a/ui/app/components/ui/popover/index.scss b/ui/app/components/ui/popover/index.scss new file mode 100644 index 000000000000..a1ef85b06df5 --- /dev/null +++ b/ui/app/components/ui/popover/index.scss @@ -0,0 +1,121 @@ +.popover { + &-wrap { + ::-webkit-scrollbar { + width: 6px; + } + + ::-webkit-scrollbar-thumb { + -webkit-border-radius: 10px; + border-radius: 10px; + background: #c4c4c4; + } + + display: flex; + flex-direction: column; + position: absolute; + width: 328px; + max-height: 94vh; + box-shadow: 0 4px 30px rgba(0, 0, 0, 0.25); + border-radius: 10px; + background: white; + } + + &-header { + display: flex; + padding: 24px; + flex-direction: column; + background: white; + position: relative; + border-radius: 10px; + + &__title { + display: flex; + align-items: center; + justify-content: space-between; + + @include H4; + + font-weight: bold; + line-height: 25px; + padding-bottom: 8px; + + h2 { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + + button { + margin-right: 24px; + } + } + } + + &__subtitle { + @include H6; + + line-height: 20px; + } + + &__button { + background: none; + font-size: inherit; + padding: 0; + } + + i { + cursor: pointer; + } + } + + &-bg { + width: 100%; + height: 100%; + background: black; + opacity: 0.2; + } + + &-content { + overflow-y: auto; + position: relative; + display: flex; + flex: 1; + flex-direction: column; + justify-content: flex-start; + align-items: stretch; + align-content: stretch; + border-radius: 10px; + } + + &-container { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + z-index: 1050; + } + + &-footer { + display: flex; + flex-direction: row; + justify-content: space-between; + border-top: 1px solid #d2d8dd; + padding: 16px 24px 24px; + + > :only-child { + margin: 0 auto; + } + } + + &-arrow { + width: 22px; + height: 22px; + background: white; + position: absolute; + transform: rotate(45deg); + box-shadow: 0 4px 30px rgba(0, 0, 0, 0.25); + } +} diff --git a/ui/app/components/ui/popover/popover.component.js b/ui/app/components/ui/popover/popover.component.js new file mode 100644 index 000000000000..e0190ff5ec38 --- /dev/null +++ b/ui/app/components/ui/popover/popover.component.js @@ -0,0 +1,119 @@ +import React, { PureComponent } from 'react' +import ReactDOM from 'react-dom' +import PropTypes from 'prop-types' +import classnames from 'classnames' +import { useI18nContext } from '../../../hooks/useI18nContext' + +const Popover = ({ + title, + subtitle = '', + children, + footer, + footerClassName, + onBack, + onClose, + className, + contentClassName, + showArrow, + CustomBackground, +}) => { + const t = useI18nContext() + return ( +
    + { CustomBackground + ? + :
    + } +
    + { showArrow ?
    : null} +
    +
    +

    + { + onBack + ? ( +

    +
    + { subtitle ?

    {subtitle}

    : null } +
    + { + children + ? ( +
    + {children} +
    + ) + : null + } + { + footer + ? ( +
    + {footer} +
    + ) + : null + } +
    +
    + ) +} + +Popover.propTypes = { + title: PropTypes.string.isRequired, + subtitle: PropTypes.string, + children: PropTypes.node, + footer: PropTypes.node, + footerClassName: PropTypes.string, + onBack: PropTypes.func, + onClose: PropTypes.func.isRequired, + CustomBackground: PropTypes.func, + contentClassName: PropTypes.string, + className: PropTypes.string, + showArrow: PropTypes.bool, +} + +export default class PopoverPortal extends PureComponent { + static propTypes = Popover.propTypes + + rootNode = document.getElementById('popover-content') + + instanceNode = document.createElement('div') + + componentDidMount () { + if (!this.rootNode) { + return + } + + this.rootNode.appendChild(this.instanceNode) + } + + componentWillUnmount () { + if (!this.rootNode) { + return + } + + this.rootNode.removeChild(this.instanceNode) + } + + render () { + const children = + return this.rootNode + ? ReactDOM.createPortal(children, this.instanceNode) + : children + } +} diff --git a/ui/app/components/ui/popover/popover.stories.js b/ui/app/components/ui/popover/popover.stories.js new file mode 100644 index 000000000000..5108e1f96a98 --- /dev/null +++ b/ui/app/components/ui/popover/popover.stories.js @@ -0,0 +1,35 @@ +import React from 'react' +import { text } from '@storybook/addon-knobs/react' +import { action } from '@storybook/addon-actions' +import Popover from './popover.component' + +const containerStyle = { + width: 800, + height: 600, + background: 'pink', + position: 'relative', +} + +const mainWrapperStyle = { + padding: '0 24px 24px', +} + +export default { + title: 'Popover', +} + +export const approve = () => ( +
    + Example Footer} + > +
    +

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Semper eget duis at tellus at urna condimentum. Posuere urna nec tincidunt praesent semper. Arcu dictum varius duis at. A lacus vestibulum sed arcu. Orci porta non pulvinar neque laoreet suspendisse interdum. Pretium fusce id velit ut. Ut consequat semper viverra nam libero justo laoreet sit. In ante metus dictum at tempor commodo ullamcorper a lacus. Posuere morbi leo urna molestie at elementum eu facilisis sed. Libero enim sed faucibus turpis in eu mi bibendum neque. Amet massa vitae tortor condimentum lacinia quis. Pretium viverra suspendisse potenti nullam ac. Pellentesque elit eget gravida cum sociis natoque penatibus. Proin libero nunc consequat interdum varius sit amet. Est ultricies integer quis auctor elit sed vulputate. Ornare arcu odio ut sem nulla pharetra. Eget nullam non nisi est sit. Leo vel fringilla est ullamcorper eget nulla.

    +

    Mattis pellentesque id nibh tortor id. Commodo sed egestas egestas fringilla phasellus. Semper eget duis at tellus at urna. Tristique nulla aliquet enim tortor at auctor urna nunc. Pellentesque habitant morbi tristique senectus et netus et. Turpis egestas sed tempus urna et pharetra pharetra massa massa. Mi eget mauris pharetra et ultrices neque ornare aenean. Facilisis volutpat est velit egestas dui id ornare arcu odio. Lacus sed turpis tincidunt id aliquet risus feugiat in. Cras tincidunt lobortis feugiat vivamus. Blandit libero volutpat sed cras ornare arcu. Facilisi morbi tempus iaculis urna id volutpat. Risus viverra adipiscing at in tellus. Leo vel orci porta non pulvinar neque. Malesuada fames ac turpis egestas integer. Euismod nisi porta lorem mollis aliquam.

    +
    +
    +
    +) diff --git a/ui/app/components/ui/pulse-loader/index.js b/ui/app/components/ui/pulse-loader/index.js new file mode 100644 index 000000000000..1fad53e562bf --- /dev/null +++ b/ui/app/components/ui/pulse-loader/index.js @@ -0,0 +1 @@ +export { default } from './pulse-loader' diff --git a/ui/app/components/ui/pulse-loader/index.scss b/ui/app/components/ui/pulse-loader/index.scss new file mode 100644 index 000000000000..2a0447ffe53a --- /dev/null +++ b/ui/app/components/ui/pulse-loader/index.scss @@ -0,0 +1,63 @@ +.pulse-loader { + display: flex; + + &__loading-dot-one, + &__loading-dot-two, + &__loading-dot-three { + background: $Blue-500; + width: 4px; + height: 4px; + margin-right: 2px; + border-radius: 100%; + animation-fill-mode: both; + } + + &__loading-dot-one { + -webkit-animation: loading-dot 0.75s 0.12s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08); + animation: loading-dot 0.75s 0.12s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08); + } + + &__loading-dot-two { + -webkit-animation: loading-dot 0.75s 0.24s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08); + animation: loading-dot 0.75s 0.24s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08); + } + + &__loading-dot-three { + -webkit-animation: loading-dot 0.75s 0.36s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08); + animation: loading-dot 0.75s 0.36s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08); + } + + @-webkit-keyframes loading-dot { + 0% { + transform: scale(1); + opacity: 1; + } + + 45% { + transform: scale(0.7); + opacity: 0.7; + } + + 80% { + transform: scale(1); + opacity: 1; + } + } + + @keyframes loading-dot { + 0% { + transform: scale(1); + opacity: 1; + } + + 45% { + transform: scale(0.7); + opacity: 0.7; + } + + 80% { + transform: scale(1); + opacity: 1; + } + } +} diff --git a/ui/app/components/ui/pulse-loader/pulse-loader.js b/ui/app/components/ui/pulse-loader/pulse-loader.js new file mode 100644 index 000000000000..b1cc13731736 --- /dev/null +++ b/ui/app/components/ui/pulse-loader/pulse-loader.js @@ -0,0 +1,11 @@ +import React from 'react' + +export default function PulseLoader () { + return ( +
    +
    +
    +
    +
    + ) +} diff --git a/ui/app/components/ui/pulse-loader/pulse-loader.stories.js b/ui/app/components/ui/pulse-loader/pulse-loader.stories.js new file mode 100644 index 000000000000..4823ac604a78 --- /dev/null +++ b/ui/app/components/ui/pulse-loader/pulse-loader.stories.js @@ -0,0 +1,8 @@ +import React from 'react' +import PulseLoader from '.' + +export default { + title: 'PulseLoader', +} + +export const common = () => () diff --git a/ui/app/components/ui/qr-code.js b/ui/app/components/ui/qr-code.js deleted file mode 100644 index 351e072e2c84..000000000000 --- a/ui/app/components/ui/qr-code.js +++ /dev/null @@ -1,63 +0,0 @@ -const Component = require('react').Component -const h = require('react-hyperscript') -const qrCode = require('qrcode-generator') -const inherits = require('util').inherits -const connect = require('react-redux').connect -const { isHexPrefixed } = require('ethereumjs-util') -const ReadOnlyInput = require('./readonly-input') -const { checksumAddress } = require('../../helpers/utils/util') - -module.exports = connect(mapStateToProps)(QrCodeView) - -function mapStateToProps (state) { - return { - // Qr code is not fetched from state. 'message' and 'data' props are passed instead. - buyView: state.appState.buyView, - warning: state.appState.warning, - } -} - -inherits(QrCodeView, Component) - -function QrCodeView () { - Component.call(this) -} - -QrCodeView.prototype.render = function () { - const props = this.props - const { message, data, network } = props.Qr - const address = `${isHexPrefixed(data) ? 'ethereum:' : ''}${checksumAddress(data, network)}` - const qrImage = qrCode(4, 'M') - qrImage.addData(address) - qrImage.make() - - return h('.div.flex-column.flex-center', [ - Array.isArray(message) - ? h('.message-container', this.renderMultiMessage()) - : message && h('.qr-header', message), - - this.props.warning ? this.props.warning && h('span.error.flex-center', { - style: { - }, - }, - this.props.warning) : null, - - h('.div.qr-wrapper', { - style: {}, - dangerouslySetInnerHTML: { - __html: qrImage.createTableTag(4), - }, - }), - h(ReadOnlyInput, { - wrapperClass: 'ellip-address-wrapper', - inputClass: 'qr-ellip-address', - value: checksumAddress(data, network), - }), - ]) -} - -QrCodeView.prototype.renderMultiMessage = function () { - var Qr = this.props.Qr - var multiMessage = Qr.message.map((message) => h('.qr-message', message)) - return multiMessage -} diff --git a/ui/app/components/ui/qr-code/index.js b/ui/app/components/ui/qr-code/index.js new file mode 100644 index 000000000000..f638ae4fb393 --- /dev/null +++ b/ui/app/components/ui/qr-code/index.js @@ -0,0 +1 @@ +export { default } from './qr-code' diff --git a/ui/app/components/ui/qr-code/index.scss b/ui/app/components/ui/qr-code/index.scss new file mode 100644 index 000000000000..86bd5af4332a --- /dev/null +++ b/ui/app/components/ui/qr-code/index.scss @@ -0,0 +1,25 @@ +.qr-code { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + + &__message-container > div:first-child { + margin-top: 18px; + font-size: 15px; + color: #4d4d4d; + } + + &__message { + font-size: 12px; + color: #f7861c; + } + + &__error { + display: flex; + justify-content: center; + align-items: center; + color: #f7861c; + margin-bottom: 9px; + } +} diff --git a/ui/app/components/ui/qr-code/qr-code.js b/ui/app/components/ui/qr-code/qr-code.js new file mode 100644 index 000000000000..53a0d85d5477 --- /dev/null +++ b/ui/app/components/ui/qr-code/qr-code.js @@ -0,0 +1,77 @@ +import PropTypes from 'prop-types' +import React from 'react' +import qrCode from 'qrcode-generator' +import { connect } from 'react-redux' +import { isHexPrefixed } from 'ethereumjs-util' +import ReadOnlyInput from '../readonly-input/readonly-input' +import { checksumAddress } from '../../../helpers/utils/util' + +export default connect(mapStateToProps)(QrCodeView) + +function mapStateToProps (state) { + return { + // Qr code is not fetched from state. 'message' and 'data' props are passed instead. + buyView: state.appState.buyView, + warning: state.appState.warning, + } +} + +function QrCodeView (props) { + const { message, data } = props.Qr + const address = `${isHexPrefixed(data) ? 'ethereum:' : ''}${checksumAddress(data)}` + const qrImage = qrCode(4, 'M') + qrImage.addData(address) + qrImage.make() + + return ( +
    + { + Array.isArray(message) + ? ( +
    + {props.Qr.message.map((msg, index) => ( +
    + {msg} +
    + ))} +
    + ) + : message && ( +
    + {message} +
    + ) + } + { + props.warning + ? (props.warning && ( + + {props.warning} + + )) + : null + } +
    + +
    + ) +} + +QrCodeView.propTypes = { + warning: PropTypes.node, + Qr: PropTypes.shape({ + message: PropTypes.oneOfType([ + PropTypes.arrayOf(PropTypes.node), + PropTypes.node, + ]), + data: PropTypes.string.isRequired, + }).isRequired, +} diff --git a/ui/app/components/ui/readonly-input.js b/ui/app/components/ui/readonly-input.js deleted file mode 100644 index fcf05fb9ed11..000000000000 --- a/ui/app/components/ui/readonly-input.js +++ /dev/null @@ -1,33 +0,0 @@ -const Component = require('react').Component -const h = require('react-hyperscript') -const inherits = require('util').inherits - -module.exports = ReadOnlyInput - -inherits(ReadOnlyInput, Component) -function ReadOnlyInput () { - Component.call(this) -} - -ReadOnlyInput.prototype.render = function () { - const { - wrapperClass = '', - inputClass = '', - value, - textarea, - onClick, - } = this.props - - const inputType = textarea ? 'textarea' : 'input' - - return h('div', {className: wrapperClass}, [ - h(inputType, { - className: inputClass, - value, - readOnly: true, - onFocus: event => event.target.select(), - onClick, - }), - ]) -} - diff --git a/ui/app/components/ui/readonly-input/index.js b/ui/app/components/ui/readonly-input/index.js new file mode 100644 index 000000000000..151a02ee8770 --- /dev/null +++ b/ui/app/components/ui/readonly-input/index.js @@ -0,0 +1 @@ +export { default } from './readonly-input' diff --git a/ui/app/components/ui/readonly-input/index.scss b/ui/app/components/ui/readonly-input/index.scss new file mode 100644 index 000000000000..9eff60bbb161 --- /dev/null +++ b/ui/app/components/ui/readonly-input/index.scss @@ -0,0 +1,8 @@ +.readonly-input { + &__input { + direction: ltr; + overflow: hidden; + text-overflow: ellipsis; + width: 100%; + } +} diff --git a/ui/app/components/ui/readonly-input/readonly-input.js b/ui/app/components/ui/readonly-input/readonly-input.js new file mode 100644 index 000000000000..eba6fd6c2e1c --- /dev/null +++ b/ui/app/components/ui/readonly-input/readonly-input.js @@ -0,0 +1,35 @@ +import PropTypes from 'prop-types' +import React from 'react' +import classnames from 'classnames' + +export default function ReadOnlyInput (props) { + const { + wrapperClass = '', + inputClass = '', + value, + textarea, + onClick, + } = props + + const InputType = textarea ? 'textarea' : 'input' + + return ( +
    + event.target.select()} + onClick={onClick} + /> +
    + ) +} + +ReadOnlyInput.propTypes = { + wrapperClass: PropTypes.string, + inputClass: PropTypes.string, + value: PropTypes.string, + textarea: PropTypes.bool, + onClick: PropTypes.func, +} diff --git a/ui/app/components/ui/search-icon/index.js b/ui/app/components/ui/search-icon/index.js new file mode 100644 index 000000000000..f6078b7be496 --- /dev/null +++ b/ui/app/components/ui/search-icon/index.js @@ -0,0 +1 @@ +export { default } from './search-icon.component' diff --git a/ui/app/components/ui/search-icon/search-icon.component.js b/ui/app/components/ui/search-icon/search-icon.component.js new file mode 100644 index 000000000000..b793518a4262 --- /dev/null +++ b/ui/app/components/ui/search-icon/search-icon.component.js @@ -0,0 +1,12 @@ +import React from 'react' + +export default function SearchIcon () { + return ( + + + + + + + ) +} diff --git a/ui/app/components/ui/sender-to-recipient/index.scss b/ui/app/components/ui/sender-to-recipient/index.scss index b21e4e1bbbee..3c0f7af2d166 100644 --- a/ui/app/components/ui/sender-to-recipient/index.scss +++ b/ui/app/components/ui/sender-to-recipient/index.scss @@ -50,6 +50,10 @@ display: flex; align-items: center; justify-content: center; + + [dir='rtl'] & { + transform: rotate(180deg); + } } &__arrow-circle { @@ -69,7 +73,22 @@ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; - font-size: .875rem; + font-size: 0.875rem; + + [dir='rtl'] & { + /*rtl:ignore*/ + direction: ltr; + + /*rtl:ignore*/ + text-align: right; + + span { + display: block; + + /*rtl:ignore*/ + direction: rtl; + } + } } } } @@ -83,7 +102,7 @@ justify-content: center; flex: 1; border-radius: 4px; - box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.08); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08); padding: 6px; background: $white; cursor: pointer; @@ -101,13 +120,32 @@ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; - font-size: .5rem; + font-size: 0.5rem; + + [dir='rtl'] & { + /*rtl:ignore*/ + direction: ltr; + + /*rtl:ignore*/ + text-align: right; + + span { + display: block; + + /*rtl:ignore*/ + direction: rtl; + } + } } &__arrow-container { display: flex; justify-content: center; align-items: center; + + [dir='rtl'] & { + transform: rotate(180deg); + } } } } @@ -136,13 +174,32 @@ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; - font-size: .6875rem; + font-size: 0.6875rem; + + [dir='rtl'] & { + /*rtl:ignore*/ + direction: ltr; + + /*rtl:ignore*/ + text-align: right; + + span { + display: block; + + /*rtl:ignore*/ + direction: rtl; + } + } } &__arrow-container { display: flex; justify-content: center; align-items: center; + + [dir='rtl'] & { + transform: rotate(180deg); + } } } } diff --git a/ui/app/components/ui/sender-to-recipient/sender-to-recipient.component.js b/ui/app/components/ui/sender-to-recipient/sender-to-recipient.component.js index 57b595d48ff9..de7e54745f4b 100644 --- a/ui/app/components/ui/sender-to-recipient/sender-to-recipient.component.js +++ b/ui/app/components/ui/sender-to-recipient/sender-to-recipient.component.js @@ -1,11 +1,13 @@ -import React, { PureComponent } from 'react' +import React, { useState } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' -import Identicon from '../identicon' -import Tooltip from '../tooltip-v2' import copyToClipboard from 'copy-to-clipboard' +import Tooltip from '../tooltip' +import Identicon from '../identicon' +import { checksumAddress, shortenAddress } from '../../../helpers/utils/util' +import AccountMismatchWarning from '../account-mismatch-warning/account-mismatch-warning.component' +import { useI18nContext } from '../../../hooks/useI18nContext' import { DEFAULT_VARIANT, CARDS_VARIANT, FLAT_VARIANT } from './sender-to-recipient.constants' -import { checksumAddress } from '../../../helpers/utils/util' const variantHash = { [DEFAULT_VARIANT]: 'sender-to-recipient--default', @@ -13,174 +15,247 @@ const variantHash = { [FLAT_VARIANT]: 'sender-to-recipient--flat', } -export default class SenderToRecipient extends PureComponent { - static propTypes = { - senderName: PropTypes.string, - senderAddress: PropTypes.string, - recipientName: PropTypes.string, - recipientAddress: PropTypes.string, - t: PropTypes.func, - variant: PropTypes.oneOf([DEFAULT_VARIANT, CARDS_VARIANT, FLAT_VARIANT]), - addressOnly: PropTypes.bool, - assetImage: PropTypes.string, - onRecipientClick: PropTypes.func, - onSenderClick: PropTypes.func, - } - - static defaultProps = { - variant: DEFAULT_VARIANT, +function SenderAddress ({ + addressOnly, + checksummedSenderAddress, + senderName, + onSenderClick, + senderAddress, + warnUserOnAccountMismatch, +}) { + const t = useI18nContext() + const [addressCopied, setAddressCopied] = useState(false) + let tooltipHtml =

    {t('copiedExclamation')}

    + if (!addressCopied) { + tooltipHtml = addressOnly + ?

    {t('copyAddress')}

    + : ( +

    + {shortenAddress(checksummedSenderAddress)}
    + {t('copyAddress')} +

    + ) } + return ( +
    { + setAddressCopied(true) + copyToClipboard(checksummedSenderAddress) + if (onSenderClick) { + onSenderClick() + } + }} + > + {!addressOnly && ( +
    + +
    + )} + setAddressCopied(false)} + > +
    + { + addressOnly + ? {`${t('from')}: ${senderName || checksummedSenderAddress}`} + : senderName + } +
    +
    + {warnUserOnAccountMismatch && } +
    + ) +} - static contextTypes = { - t: PropTypes.func, - } +SenderAddress.propTypes = { + senderName: PropTypes.string, + checksummedSenderAddress: PropTypes.string, + addressOnly: PropTypes.bool, + senderAddress: PropTypes.string, + onSenderClick: PropTypes.func, + warnUserOnAccountMismatch: PropTypes.bool, +} - state = { - senderAddressCopied: false, - recipientAddressCopied: false, - } +function RecipientWithAddress ({ + checksummedRecipientAddress, + assetImage, + onRecipientClick, + addressOnly, + recipientNickname, + recipientEns, + recipientName, +}) { + const t = useI18nContext() + const [addressCopied, setAddressCopied] = useState(false) - renderSenderIdenticon () { - return !this.props.addressOnly && ( -
    - -
    - ) + let tooltipHtml =

    {t('copiedExclamation')}

    + if (!addressCopied) { + if (addressOnly && !recipientNickname && !recipientEns) { + tooltipHtml =

    {t('copyAddress')}

    + } else { + tooltipHtml = ( +

    + {shortenAddress(checksummedRecipientAddress)}
    + {t('copyAddress')} +

    + ) + } } - - renderSenderAddress () { - const { t } = this.context - const { senderName, senderAddress, addressOnly } = this.props - const checksummedSenderAddress = checksumAddress(senderAddress) - - return ( + return ( +
    { + setAddressCopied(true) + copyToClipboard(checksummedRecipientAddress) + if (onRecipientClick) { + onRecipientClick() + } + }} + > + {!addressOnly && ( +
    + +
    + )} this.setState({ senderAddressCopied: false })} + onHidden={() => setAddressCopied(false)} > -
    - { addressOnly ? `${t('from')}: ${checksummedSenderAddress}` : senderName } -
    -
    - ) - } +
    + { addressOnly ? `${t('to')}: ` : '' } + { + addressOnly + ? (recipientNickname || recipientEns || checksummedRecipientAddress) + : (recipientNickname || recipientEns || recipientName || t('newContract')) + } +
    + +
    + ) +} - renderRecipientIdenticon () { - const { recipientAddress, assetImage } = this.props - const checksummedRecipientAddress = checksumAddress(recipientAddress) +RecipientWithAddress.propTypes = { + checksummedRecipientAddress: PropTypes.string, + recipientName: PropTypes.string, + recipientEns: PropTypes.string, + recipientNickname: PropTypes.string, + addressOnly: PropTypes.bool, + assetImage: PropTypes.string, + onRecipientClick: PropTypes.func, +} - return !this.props.addressOnly && ( -
    - +
    + +
    +
    + ) : ( +
    +
    ) - } +} - renderRecipientWithAddress () { - const { t } = this.context - const { recipientName, recipientAddress, addressOnly, onRecipientClick } = this.props - const checksummedRecipientAddress = checksumAddress(recipientAddress) +Arrow.propTypes = { + variant: PropTypes.oneOf([DEFAULT_VARIANT, CARDS_VARIANT, FLAT_VARIANT]), +} - return ( -
    { - this.setState({ recipientAddressCopied: true }) - copyToClipboard(checksummedRecipientAddress) - if (onRecipientClick) { - onRecipientClick() - } - }} - > - { this.renderRecipientIdenticon() } - this.setState({ recipientAddressCopied: false })} - > -
    - { - addressOnly - ? `${t('to')}: ${checksummedRecipientAddress}` - : (recipientName || this.context.t('newContract')) - } -
    -
    -
    - ) - } +export default function SenderToRecipient ({ + senderAddress, + addressOnly, + assetImage, + senderName, + recipientNickname, + recipientName, + recipientEns, + onRecipientClick, + onSenderClick, + recipientAddress, + variant, + warnUserOnAccountMismatch, +}) { + const t = useI18nContext() + const checksummedSenderAddress = checksumAddress(senderAddress) + const checksummedRecipientAddress = checksumAddress(recipientAddress) - renderRecipientWithoutAddress () { - return ( -
    - { !this.props.addressOnly && } -
    - { this.context.t('newContract') } -
    -
    - ) - } - - renderArrow () { - return this.props.variant === DEFAULT_VARIANT - ? ( -
    -
    - -
    -
    - ) : ( -
    - + + + {recipientAddress + ? ( + -
    - ) - } + ) + : ( +
    + { !addressOnly && } +
    + {t('newContract') } +
    +
    + ) + } +
    + ) +} - render () { - const { senderAddress, recipientAddress, variant, onSenderClick } = this.props - const checksummedSenderAddress = checksumAddress(senderAddress) +SenderToRecipient.defaultProps = { + variant: DEFAULT_VARIANT, + warnUserOnAccountMismatch: true, +} - return ( -
    -
    { - this.setState({ senderAddressCopied: true }) - copyToClipboard(checksummedSenderAddress) - if (onSenderClick) { - onSenderClick() - } - }} - > - { this.renderSenderIdenticon() } - { this.renderSenderAddress() } -
    - { this.renderArrow() } - { - recipientAddress - ? this.renderRecipientWithAddress() - : this.renderRecipientWithoutAddress() - } -
    - ) - } +SenderToRecipient.propTypes = { + senderName: PropTypes.string, + senderAddress: PropTypes.string, + recipientName: PropTypes.string, + recipientEns: PropTypes.string, + recipientAddress: PropTypes.string, + recipientNickname: PropTypes.string, + variant: PropTypes.oneOf([DEFAULT_VARIANT, CARDS_VARIANT, FLAT_VARIANT]), + addressOnly: PropTypes.bool, + assetImage: PropTypes.string, + onRecipientClick: PropTypes.func, + onSenderClick: PropTypes.func, + warnUserOnAccountMismatch: PropTypes.bool, } diff --git a/ui/app/components/ui/site-icon/index.js b/ui/app/components/ui/site-icon/index.js new file mode 100644 index 000000000000..a68d9779dc0e --- /dev/null +++ b/ui/app/components/ui/site-icon/index.js @@ -0,0 +1 @@ +export { default } from './site-icon' diff --git a/ui/app/components/ui/site-icon/site-icon.js b/ui/app/components/ui/site-icon/site-icon.js new file mode 100644 index 000000000000..2ddc9f34476c --- /dev/null +++ b/ui/app/components/ui/site-icon/site-icon.js @@ -0,0 +1,24 @@ +import React from 'react' +import PropTypes from 'prop-types' +import IconBorder from '../icon-border' +import IconWithFallback from '../icon-with-fallback' + +export default function SiteIcon ({ icon, name, size }) { + const iconSize = Math.floor(size * 0.75) + return ( + + + + ) +} + +SiteIcon.propTypes = { + icon: PropTypes.string, + name: PropTypes.string, + size: PropTypes.number.isRequired, +} + +SiteIcon.defaultProps = { + icon: undefined, + name: undefined, +} diff --git a/ui/app/components/ui/snackbar/index.js b/ui/app/components/ui/snackbar/index.js new file mode 100644 index 000000000000..3d3e0394dd97 --- /dev/null +++ b/ui/app/components/ui/snackbar/index.js @@ -0,0 +1 @@ +export { default } from './snackbar.component' diff --git a/ui/app/components/ui/snackbar/index.scss b/ui/app/components/ui/snackbar/index.scss new file mode 100644 index 000000000000..d2aac4879313 --- /dev/null +++ b/ui/app/components/ui/snackbar/index.scss @@ -0,0 +1,10 @@ +.snackbar { + padding: 0.75rem 1rem; + font-size: 0.75rem; + color: $Blue-600; + min-width: 360px; + width: fit-content; + background: $Blue-000; + border: 1px solid $Blue-200; + border-radius: 6px; +} diff --git a/ui/app/components/ui/snackbar/snackbar.component.js b/ui/app/components/ui/snackbar/snackbar.component.js new file mode 100644 index 000000000000..48b39c59f656 --- /dev/null +++ b/ui/app/components/ui/snackbar/snackbar.component.js @@ -0,0 +1,18 @@ +import React from 'react' +import PropTypes from 'prop-types' +import classnames from 'classnames' + +const Snackbar = ({ className = '', content }) => { + return ( +
    + { content } +
    + ) +} + +Snackbar.propTypes = { + className: PropTypes.string, + content: PropTypes.string.isRequired, +} + +export default Snackbar diff --git a/ui/app/components/ui/spinner/index.js b/ui/app/components/ui/spinner/index.js index 9589efcf0d79..d302d535b7e8 100644 --- a/ui/app/components/ui/spinner/index.js +++ b/ui/app/components/ui/spinner/index.js @@ -1,2 +1,3 @@ -const Spinner = require('./spinner.component') -module.exports = Spinner +import Spinner from './spinner.component' + +export default Spinner diff --git a/ui/app/components/ui/spinner/spinner.component.js b/ui/app/components/ui/spinner/spinner.component.js index b9a2eb52a58e..4ad2a21fee5e 100644 --- a/ui/app/components/ui/spinner/spinner.component.js +++ b/ui/app/components/ui/spinner/spinner.component.js @@ -4,7 +4,7 @@ import PropTypes from 'prop-types' const Spinner = ({ className = '', color = '#000000' }) => { return (
    - + @@ -75,4 +75,4 @@ Spinner.propTypes = { color: PropTypes.string, } -module.exports = Spinner +export default Spinner diff --git a/ui/app/components/ui/tabs/index.js b/ui/app/components/ui/tabs/index.js index 3a8d182481f3..46f0b18a5f98 100644 --- a/ui/app/components/ui/tabs/index.js +++ b/ui/app/components/ui/tabs/index.js @@ -1,3 +1,4 @@ import Tabs from './tabs.component' import Tab from './tab' + export { Tabs, Tab } diff --git a/ui/app/components/ui/tabs/index.scss b/ui/app/components/ui/tabs/index.scss index 25143ff353ab..ea22a7d528fa 100644 --- a/ui/app/components/ui/tabs/index.scss +++ b/ui/app/components/ui/tabs/index.scss @@ -1,11 +1,16 @@ @import 'tab/index'; .tabs { + // Just for Firefox — https://github.com/MetaMask/metamask-extension/issues/8700 + -moz-transform: translateZ(0); + &__list { display: flex; justify-content: flex-start; - background-color: #f9fafa; border-bottom: 1px solid $geyser; - padding: 0 16px; + background-color: $white; + position: sticky; + top: 0; + z-index: 1; } } diff --git a/ui/app/components/ui/tabs/tab/index.js b/ui/app/components/ui/tabs/tab/index.js index fbc309e8ef47..c6ef9bb68b59 100644 --- a/ui/app/components/ui/tabs/tab/index.js +++ b/ui/app/components/ui/tabs/tab/index.js @@ -1,2 +1,3 @@ import Tab from './tab.component' -module.exports = Tab + +export default Tab diff --git a/ui/app/components/ui/tabs/tab/index.scss b/ui/app/components/ui/tabs/tab/index.scss index 1de6ffa0e42b..b0fb0d30e9f3 100644 --- a/ui/app/components/ui/tabs/tab/index.scss +++ b/ui/app/components/ui/tabs/tab/index.scss @@ -1,15 +1,11 @@ .tab { - color: #8C8E94; - font-size: .75rem; - text-transform: uppercase; cursor: pointer; - padding: 8px 0; - margin: 0 8px; + padding: 8px; min-width: 50px; text-align: center; &--active { color: $black; - border-bottom: 2px solid $curious-blue; + border-bottom: 2px solid $primary-blue; } } diff --git a/ui/app/components/ui/tabs/tab/tab.component.js b/ui/app/components/ui/tabs/tab/tab.component.js index 9e590391c391..de65c70e3ea7 100644 --- a/ui/app/components/ui/tabs/tab/tab.component.js +++ b/ui/app/components/ui/tabs/tab/tab.component.js @@ -2,16 +2,29 @@ import React from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' -const Tab = props => { - const { name, onClick, isActive, tabIndex, className, activeClassName } = props +const Tab = (props) => { + const { + activeClassName, + className, + 'data-testid': dataTestId, + isActive, + name, + onClick, + tabIndex, + } = props return (
  • { + data-testid={dataTestId} + onClick={(event) => { event.preventDefault() onClick(tabIndex) }} @@ -22,17 +35,19 @@ const Tab = props => { } Tab.propTypes = { + activeClassName: PropTypes.string, + className: PropTypes.string, + 'data-testid': PropTypes.string, + isActive: PropTypes.bool, // required, but added using React.cloneElement name: PropTypes.string.isRequired, onClick: PropTypes.func, - isActive: PropTypes.bool, - tabIndex: PropTypes.number, - className: PropTypes.string, - activeClassName: PropTypes.string, + tabIndex: PropTypes.number, // required, but added using React.cloneElement } Tab.defaultProps = { - className: 'tab', - activeClassName: 'tab--active', + activeClassName: undefined, + className: undefined, + onClick: undefined, } export default Tab diff --git a/ui/app/components/ui/tabs/tabs.component.js b/ui/app/components/ui/tabs/tabs.component.js index d26dcff2f6d5..c524759fcc02 100644 --- a/ui/app/components/ui/tabs/tabs.component.js +++ b/ui/app/components/ui/tabs/tabs.component.js @@ -1,26 +1,36 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' +import classnames from 'classnames' export default class Tabs extends Component { - static propTypes = { - defaultActiveTabIndex: PropTypes.number, - children: PropTypes.node, + static defaultProps = { + defaultActiveTabName: null, + onTabClick: null, + tabsClassName: undefined, } - constructor (props) { - super(props) + static propTypes = { + defaultActiveTabName: PropTypes.string, + onTabClick: PropTypes.func, + children: PropTypes.node.isRequired, + tabsClassName: PropTypes.string, + } - this.state = { - activeTabIndex: props.defaultActiveTabIndex || 0, - } + state = { + activeTabIndex: Math.max(this._findChildByName(this.props.defaultActiveTabName), 0), } - handleTabClick (tabIndex) { + handleTabClick (tabIndex, tabName) { + const { onTabClick } = this.props const { activeTabIndex } = this.state if (tabIndex !== activeTabIndex) { this.setState({ activeTabIndex: tabIndex, + }, () => { + if (onTabClick) { + onTabClick(tabName) + } }) } } @@ -29,11 +39,11 @@ export default class Tabs extends Component { const numberOfTabs = React.Children.count(this.props.children) return React.Children.map(this.props.children, (child, index) => { + const tabName = child?.props.name return child && React.cloneElement(child, { - onClick: index => this.handleTabClick(index), + onClick: (idx) => this.handleTabClick(idx, tabName), tabIndex: index, isActive: numberOfTabs > 1 && index === this.state.activeTabIndex, - key: index, }) }) } @@ -42,15 +52,23 @@ export default class Tabs extends Component { const { children } = this.props const { activeTabIndex } = this.state + if ( + (Array.isArray(children) && !children[activeTabIndex]) || + (!Array.isArray(children) && activeTabIndex !== 0) + ) { + throw new Error(`Tab at index '${activeTabIndex}' does not exist`) + } + return children[activeTabIndex] ? children[activeTabIndex].props.children : children.props.children } render () { + const { tabsClassName } = this.props return (
    -
      +
        { this.renderTabs() }
      @@ -59,4 +77,14 @@ export default class Tabs extends Component {
      ) } + + /** + * Returns the index of the child with the given name + * @param {string} name - the name to search for + * @returns {number} the index of the child with the given name + * @private + */ + _findChildByName (name) { + return React.Children.toArray(this.props.children).findIndex((c) => c?.props.name === name) + } } diff --git a/ui/app/components/ui/tabs/tabs.stories.js b/ui/app/components/ui/tabs/tabs.stories.js new file mode 100644 index 000000000000..2cf40736c6a0 --- /dev/null +++ b/ui/app/components/ui/tabs/tabs.stories.js @@ -0,0 +1,53 @@ +import React from 'react' +import { text } from '@storybook/addon-knobs/react' +import Tab from './tab/tab.component' +import Tabs from './tabs.component' + +export default { + title: 'Tabs', +} + +function renderTab (id) { + return ( + + {text(`Tab ${id} Contents`, `Contents of Tab ${id}`)} + + ) +} + +export const twoTabs = () => { + return ( + + { + ['A', 'B'] + .map(renderTab) + } + + ) +} + +export const manyTabs = () => { + return ( + + { + ['A', 'B', 'C', 'D', 'E'] + .map(renderTab) + } + + ) +} + +export const singleTab = () => { + return ( + + + {text('Contents', 'Contents of tab')} + + + ) +} diff --git a/ui/app/components/ui/text-field/index.js b/ui/app/components/ui/text-field/index.js index 171caf7a41db..adc0669b8299 100644 --- a/ui/app/components/ui/text-field/index.js +++ b/ui/app/components/ui/text-field/index.js @@ -1,2 +1,3 @@ import TextField from './text-field.component' -module.exports = TextField + +export default TextField diff --git a/ui/app/components/ui/text-field/text-field.component.js b/ui/app/components/ui/text-field/text-field.component.js index 1153a595b4c3..9e80e3bc8725 100644 --- a/ui/app/components/ui/text-field/text-field.component.js +++ b/ui/app/components/ui/text-field/text-field.component.js @@ -1,7 +1,7 @@ import React from 'react' import PropTypes from 'prop-types' import { withStyles } from '@material-ui/core/styles' -import { default as MaterialTextField } from '@material-ui/core/TextField' +import MaterialTextField from '@material-ui/core/TextField' const inputLabelBase = { transform: 'none', @@ -28,6 +28,24 @@ const styles = { }, }, materialError: {}, + materialWhitePaddedRoot: { + color: '#aeaeae', + }, + materialWhitePaddedInput: { + padding: '8px', + + '&::placeholder': { + color: '#aeaeae', + }, + }, + materialWhitePaddedFocused: { + color: '#fff', + }, + materialWhitePaddedUnderline: { + '&:after': { + borderBottom: '2px solid #fff', + }, + }, // Non-material styles formLabel: { '&$formLabelFocused': { @@ -61,34 +79,104 @@ const styles = { ...inputLabelBase, fontSize: '.75rem', }, + inputMultiline: { + lineHeight: 'initial !important', + }, +} + +const getMaterialThemeInputProps = ({ + dir, + classes: { materialLabel, materialFocused, materialError, materialUnderline }, + startAdornment, +}) => ({ + InputLabelProps: { + classes: { + root: materialLabel, + focused: materialFocused, + error: materialError, + }, + }, + InputProps: { + startAdornment, + classes: { + underline: materialUnderline, + }, + inputProps: { + dir, + }, + }, +}) + +const getMaterialWhitePaddedThemeInputProps = ({ + dir, + classes: { materialWhitePaddedRoot, materialWhitePaddedFocused, materialWhitePaddedInput, materialWhitePaddedUnderline }, + startAdornment, +}) => ({ + InputProps: { + startAdornment, + classes: { + root: materialWhitePaddedRoot, + focused: materialWhitePaddedFocused, + input: materialWhitePaddedInput, + underline: materialWhitePaddedUnderline, + }, + inputProps: { + dir, + }, + }, +}) + +const getBorderedThemeInputProps = ({ + dir, + classes: { formLabel, formLabelFocused, materialError, largeInputLabel, inputLabel, inputRoot, input, inputFocused }, + largeLabel, + startAdornment, +}) => ({ + InputLabelProps: { + shrink: true, + className: largeLabel ? largeInputLabel : inputLabel, + classes: { + root: formLabel, + focused: formLabelFocused, + error: materialError, + }, + }, + InputProps: { + startAdornment, + disableUnderline: true, + classes: { + root: inputRoot, + input, + focused: inputFocused, + }, + inputProps: { + dir, + }, + }, +}) + +const themeToInputProps = { + 'material': getMaterialThemeInputProps, + 'bordered': getBorderedThemeInputProps, + 'material-white-padded': getMaterialWhitePaddedThemeInputProps, } -const TextField = props => { - const { error, classes, material, startAdornment, largeLabel, ...textFieldProps } = props +const TextField = ({ + error, + classes, + theme, + startAdornment, + largeLabel, + dir, + ...textFieldProps +}) => { + const inputProps = themeToInputProps[theme]({ classes, startAdornment, largeLabel, dir }) return ( ) @@ -96,12 +184,15 @@ const TextField = props => { TextField.defaultProps = { error: null, + dir: 'auto', + theme: 'bordered', } TextField.propTypes = { error: PropTypes.string, classes: PropTypes.object, - material: PropTypes.bool, + dir: PropTypes.string, + theme: PropTypes.oneOf(['bordered', 'material', 'material-white-padded']), startAdornment: PropTypes.element, largeLabel: PropTypes.bool, } diff --git a/ui/app/components/ui/text-field/text-field.stories.js b/ui/app/components/ui/text-field/text-field.stories.js index 337f78ecf73e..e9096bcc553b 100644 --- a/ui/app/components/ui/text-field/text-field.stories.js +++ b/ui/app/components/ui/text-field/text-field.stories.js @@ -1,53 +1,61 @@ import React from 'react' -import { storiesOf } from '@storybook/react' import TextField from '.' -storiesOf('TextField', module) - .add('text', () => - - ) - .add('password', () => - - ) - .add('error', () => - - ) - .add('Mascara text', () => - - ) - .add('Material text', () => - - ) - .add('Material password', () => - - ) - .add('Material error', () => - - ) +export default { + title: 'TextField', +} + +export const text = () => ( + +) + +export const password = () => ( + +) + +export const error = () => ( + +) + +export const mascaraText = () => ( + +) + +export const materialText = () => ( + +) + +export const materialPassword = () => ( + +) + +export const materialError = () => ( + +) diff --git a/ui/app/components/ui/toggle-button/index.js b/ui/app/components/ui/toggle-button/index.js new file mode 100644 index 000000000000..b0c4141e7a45 --- /dev/null +++ b/ui/app/components/ui/toggle-button/index.js @@ -0,0 +1,3 @@ +import ToggleButton from './toggle-button.component' + +export default ToggleButton diff --git a/ui/app/components/ui/toggle-button/index.scss b/ui/app/components/ui/toggle-button/index.scss new file mode 100644 index 000000000000..09827888cd2d --- /dev/null +++ b/ui/app/components/ui/toggle-button/index.scss @@ -0,0 +1,38 @@ +.toggle-button { + display: flex; + $self: &; + + &__status { + font-style: normal; + font-weight: normal; + font-size: 16px; + line-height: 23px; + display: flex; + align-items: center; + text-transform: uppercase; + display: grid; + } + + &__label-off, + &__label-on { + grid-area: 1 / 1 / 1 / 1; + } + + &__label-off { + visibility: hidden; + } + + &__label-on { + visibility: visible; + } + + &--off { + #{ $self }__label-off { + visibility: visible; + } + + #{ $self }__label-on { + visibility: hidden; + } + } +} diff --git a/ui/app/components/ui/toggle-button/toggle-button.component.js b/ui/app/components/ui/toggle-button/toggle-button.component.js new file mode 100644 index 000000000000..3809b7877697 --- /dev/null +++ b/ui/app/components/ui/toggle-button/toggle-button.component.js @@ -0,0 +1,80 @@ +import React from 'react' +import PropTypes from 'prop-types' +import ReactToggleButton from 'react-toggle-button' + +const trackStyle = { + width: '40px', + height: '24px', + padding: '0px', + borderRadius: '26px', + border: '2px solid rgb(3, 125, 214)', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', +} + +const offTrackStyle = { + ...trackStyle, + border: '2px solid #8E8E8E', +} + +const thumbStyle = { + width: '18px', + height: '18px', + display: 'flex', + boxShadow: 'none', + alignSelf: 'center', + borderRadius: '50%', + position: 'relative', +} + +const colors = { + activeThumb: { + base: '#037DD6', + }, + inactiveThumb: { + base: '#037DD6', + }, + active: { + base: '#ffffff', + hover: '#ffffff', + }, + inactive: { + base: '#DADADA', + hover: '#DADADA', + }, +} + +const ToggleButton = (props) => { + const { value, onToggle, offLabel, onLabel } = props + + const modifier = value ? 'on' : 'off' + + return ( +
      + +
      + {offLabel} + {onLabel} +
      +
      + ) +} + +ToggleButton.propTypes = { + value: PropTypes.bool, + onToggle: PropTypes.func, + offLabel: PropTypes.string, + onLabel: PropTypes.string, +} + +export default ToggleButton diff --git a/ui/app/components/ui/token-balance/index.js b/ui/app/components/ui/token-balance/index.js index f7da15cf83d1..97bc9bbc2ae8 100644 --- a/ui/app/components/ui/token-balance/index.js +++ b/ui/app/components/ui/token-balance/index.js @@ -1 +1 @@ -export { default } from './token-balance.container' +export { default } from './token-balance' diff --git a/ui/app/components/ui/token-balance/token-balance.component.js b/ui/app/components/ui/token-balance/token-balance.component.js deleted file mode 100644 index af1a32578dfc..000000000000 --- a/ui/app/components/ui/token-balance/token-balance.component.js +++ /dev/null @@ -1,25 +0,0 @@ -import React, { PureComponent } from 'react' -import PropTypes from 'prop-types' -import CurrencyDisplay from '../currency-display' - -export default class TokenBalance extends PureComponent { - static propTypes = { - string: PropTypes.string, - symbol: PropTypes.string, - error: PropTypes.string, - className: PropTypes.string, - withSymbol: PropTypes.bool, - } - - render () { - const { className, string, symbol } = this.props - - return ( - - ) - } -} diff --git a/ui/app/components/ui/token-balance/token-balance.container.js b/ui/app/components/ui/token-balance/token-balance.container.js deleted file mode 100644 index a0f1efc20dfe..000000000000 --- a/ui/app/components/ui/token-balance/token-balance.container.js +++ /dev/null @@ -1,16 +0,0 @@ -import { connect } from 'react-redux' -import { compose } from 'recompose' -import withTokenTracker from '../../../helpers/higher-order-components/with-token-tracker' -import TokenBalance from './token-balance.component' -import selectors from '../../../selectors/selectors' - -const mapStateToProps = state => { - return { - userAddress: selectors.getSelectedAddress(state), - } -} - -export default compose( - connect(mapStateToProps), - withTokenTracker -)(TokenBalance) diff --git a/ui/app/components/ui/token-balance/token-balance.js b/ui/app/components/ui/token-balance/token-balance.js new file mode 100644 index 000000000000..e439c2d36d81 --- /dev/null +++ b/ui/app/components/ui/token-balance/token-balance.js @@ -0,0 +1,30 @@ +import React from 'react' +import PropTypes from 'prop-types' +import CurrencyDisplay from '../currency-display' +import { useTokenTracker } from '../../../hooks/useTokenTracker' + +export default function TokenBalance ({ className, token }) { + const { tokensWithBalances } = useTokenTracker([token]) + + const { string, symbol } = tokensWithBalances[0] || {} + return ( + + ) +} + +TokenBalance.propTypes = { + className: PropTypes.string, + token: PropTypes.shape({ + address: PropTypes.string.isRequired, + decimals: PropTypes.number, + symbol: PropTypes.string, + }).isRequired, +} + +TokenBalance.defaultProps = { + className: undefined, +} diff --git a/ui/app/components/ui/token-currency-display/token-currency-display.component.js b/ui/app/components/ui/token-currency-display/token-currency-display.component.js index 3c2722b365f5..b8e46614a6e8 100644 --- a/ui/app/components/ui/token-currency-display/token-currency-display.component.js +++ b/ui/app/components/ui/token-currency-display/token-currency-display.component.js @@ -1,57 +1,24 @@ -import React, { PureComponent } from 'react' +import React from 'react' import PropTypes from 'prop-types' import CurrencyDisplay from '../currency-display' -import { getTokenData } from '../../../helpers/utils/transactions.util' -import { getTokenValue, calcTokenAmount } from '../../../helpers/utils/token-util' - -export default class TokenCurrencyDisplay extends PureComponent { - static propTypes = { - transactionData: PropTypes.string, - token: PropTypes.object, - } - - state = { - displayValue: '', - suffix: '', - } - - componentDidMount () { - this.setDisplayValue() - } - - componentDidUpdate (prevProps) { - const { transactionData } = this.props - const { transactionData: prevTransactionData } = prevProps - - if (transactionData !== prevTransactionData) { - this.setDisplayValue() - } - } - - setDisplayValue () { - const { transactionData: data, token } = this.props - const { decimals = '', symbol: suffix = '' } = token - const tokenData = getTokenData(data) - - let displayValue - - if (tokenData && tokenData.params && tokenData.params.length) { - const tokenValue = getTokenValue(tokenData.params) - displayValue = calcTokenAmount(tokenValue, decimals).toString() - } - - this.setState({ displayValue, suffix }) - } - - render () { - const { displayValue, suffix } = this.state +import { useTokenDisplayValue } from '../../../hooks/useTokenDisplayValue' + +export default function TokenCurrencyDisplay ({ className, transactionData, token, prefix }) { + const displayValue = useTokenDisplayValue(transactionData, token) + + return ( + + ) +} - return ( - - ) - } +TokenCurrencyDisplay.propTypes = { + className: PropTypes.string, + transactionData: PropTypes.string, + token: PropTypes.object, + prefix: PropTypes.string, } diff --git a/ui/app/components/ui/token-input/tests/token-input.component.test.js b/ui/app/components/ui/token-input/tests/token-input.component.test.js index 881101880366..a7cda504f05b 100644 --- a/ui/app/components/ui/token-input/tests/token-input.component.test.js +++ b/ui/app/components/ui/token-input/tests/token-input.component.test.js @@ -1,6 +1,6 @@ +import assert from 'assert' import React from 'react' import PropTypes from 'prop-types' -import assert from 'assert' import { shallow, mount } from 'enzyme' import sinon from 'sinon' import { Provider } from 'react-redux' @@ -9,21 +9,11 @@ import TokenInput from '../token-input.component' import UnitInput from '../../unit-input' import CurrencyDisplay from '../../currency-display' -describe('TokenInput Component', () => { - const t = key => `translate ${key}` - - describe('rendering', () => { - it('should render properly without a token', () => { - const wrapper = shallow( - , - { context: { t } } - ) +describe('TokenInput Component', function () { + const t = (key) => `translate ${key}` - assert.ok(wrapper) - assert.equal(wrapper.find(UnitInput).length, 1) - }) - - it('should render properly with a token', () => { + describe('rendering', function () { + it('should render properly', function () { const mockStore = { metamask: { currentCurrency: 'usd', @@ -35,15 +25,15 @@ describe('TokenInput Component', () => { const wrapper = mount( , - { context: { t }, + { + context: { t }, childContextTypes: { t: PropTypes.func, }, @@ -57,7 +47,7 @@ describe('TokenInput Component', () => { assert.equal(wrapper.find('.currency-input__conversion-component').text(), 'translate noConversionRateAvailable') }) - it('should render properly with a token and selectedTokenExchangeRate', () => { + it('should render properly with tokenExchangeRates', function () { const mockStore = { metamask: { currentCurrency: 'usd', @@ -69,16 +59,16 @@ describe('TokenInput Component', () => { const wrapper = mount( , - { context: { t }, + { + context: { t }, childContextTypes: { t: PropTypes.func, }, @@ -91,7 +81,7 @@ describe('TokenInput Component', () => { assert.equal(wrapper.find(CurrencyDisplay).length, 1) }) - it('should render properly with a token value for ETH', () => { + it('should render properly with a token value for ETH', function () { const mockStore = { metamask: { currentCurrency: 'usd', @@ -104,15 +94,14 @@ describe('TokenInput Component', () => { - + , ) assert.ok(wrapper) @@ -125,7 +114,7 @@ describe('TokenInput Component', () => { assert.equal(wrapper.find('.currency-display-component').text(), '2ETH') }) - it('should render properly with a token value for fiat', () => { + it('should render properly with a token value for fiat', function () { const mockStore = { metamask: { currentCurrency: 'usd', @@ -138,16 +127,15 @@ describe('TokenInput Component', () => { - + , ) assert.ok(wrapper) @@ -160,7 +148,7 @@ describe('TokenInput Component', () => { assert.equal(wrapper.find('.currency-display-component').text(), '$462.12USD') }) - it('should render properly with a token value for fiat, but hideConversion is true', () => { + it('should render properly with a token value for fiat, but hideConversion is true', function () { const mockStore = { metamask: { currentCurrency: 'usd', @@ -173,13 +161,12 @@ describe('TokenInput Component', () => { @@ -203,16 +190,16 @@ describe('TokenInput Component', () => { }) }) - describe('handling actions', () => { + describe('handling actions', function () { const handleChangeSpy = sinon.spy() const handleBlurSpy = sinon.spy() - afterEach(() => { + afterEach(function () { handleChangeSpy.resetHistory() handleBlurSpy.resetHistory() }) - it('should call onChange and onBlur on input changes with the hex value for ETH', () => { + it('should call onChange on input changes with the hex value for ETH', function () { const mockStore = { metamask: { currentCurrency: 'usd', @@ -224,16 +211,14 @@ describe('TokenInput Component', () => { - + , ) assert.ok(wrapper) @@ -253,14 +238,9 @@ describe('TokenInput Component', () => { assert.equal(wrapper.find('.currency-display-component').text(), '2ETH') assert.equal(tokenInputInstance.state.decimalValue, 1) assert.equal(tokenInputInstance.state.hexValue, '2710') - - assert.equal(handleBlurSpy.callCount, 0) - input.simulate('blur') - assert.equal(handleBlurSpy.callCount, 1) - assert.ok(handleBlurSpy.calledWith('2710')) }) - it('should call onChange and onBlur on input changes with the hex value for fiat', () => { + it('should call onChange on input changes with the hex value for fiat', function () { const mockStore = { metamask: { currentCurrency: 'usd', @@ -272,17 +252,15 @@ describe('TokenInput Component', () => { - + , ) assert.ok(wrapper) @@ -302,14 +280,9 @@ describe('TokenInput Component', () => { assert.equal(wrapper.find('.currency-display-component').text(), '$462.12USD') assert.equal(tokenInputInstance.state.decimalValue, 1) assert.equal(tokenInputInstance.state.hexValue, '2710') - - assert.equal(handleBlurSpy.callCount, 0) - input.simulate('blur') - assert.equal(handleBlurSpy.callCount, 1) - assert.ok(handleBlurSpy.calledWith('2710')) }) - it('should change the state and pass in a new decimalValue when props.value changes', () => { + it('should change the state and pass in a new decimalValue when props.value changes', function () { const mockStore = { metamask: { currentCurrency: 'usd', @@ -321,17 +294,15 @@ describe('TokenInput Component', () => { - + , ) assert.ok(wrapper) diff --git a/ui/app/components/ui/token-input/tests/token-input.container.test.js b/ui/app/components/ui/token-input/tests/token-input.container.test.js deleted file mode 100644 index 6f87e64a5032..000000000000 --- a/ui/app/components/ui/token-input/tests/token-input.container.test.js +++ /dev/null @@ -1,255 +0,0 @@ -import assert from 'assert' -import proxyquire from 'proxyquire' - -let mapStateToProps, mergeProps - -proxyquire('../token-input.container.js', { - 'react-redux': { - connect: (ms, _, mp) => { - mapStateToProps = ms - mergeProps = mp - return () => ({}) - }, - }, -}) - -describe('TokenInput container', () => { - describe('mapStateToProps()', () => { - it('should return the correct props when send is empty', () => { - const mockState = { - metamask: { - currentCurrency: 'usd', - tokens: [ - { - address: '0x1', - decimals: '4', - symbol: 'ABC', - }, - ], - selectedTokenAddress: '0x1', - contractExchangeRates: {}, - send: {}, - preferences: { - showFiatInTestnets: false, - }, - provider: { - type: 'mainnet', - }, - }, - } - - assert.deepEqual(mapStateToProps(mockState), { - currentCurrency: 'usd', - selectedToken: { - address: '0x1', - decimals: '4', - symbol: 'ABC', - }, - selectedTokenExchangeRate: 0, - hideConversion: false, - }) - }) - - it('should return the correct props when selectedTokenAddress is not found and send is populated', () => { - const mockState = { - metamask: { - currentCurrency: 'usd', - tokens: [ - { - address: '0x1', - decimals: '4', - symbol: 'ABC', - }, - ], - selectedTokenAddress: '0x2', - contractExchangeRates: {}, - send: { - token: { address: 'test' }, - }, - preferences: { - showFiatInTestnets: false, - }, - provider: { - type: 'mainnet', - }, - }, - } - - assert.deepEqual(mapStateToProps(mockState), { - currentCurrency: 'usd', - selectedToken: { - address: 'test', - }, - selectedTokenExchangeRate: 0, - hideConversion: false, - }) - }) - - it('should return the correct props when contractExchangeRates is populated', () => { - const mockState = { - metamask: { - currentCurrency: 'usd', - tokens: [ - { - address: '0x1', - decimals: '4', - symbol: 'ABC', - }, - ], - selectedTokenAddress: '0x1', - contractExchangeRates: { - '0x1': 5, - }, - send: {}, - preferences: { - showFiatInTestnets: false, - }, - provider: { - type: 'mainnet', - }, - }, - } - - assert.deepEqual(mapStateToProps(mockState), { - currentCurrency: 'usd', - selectedToken: { - address: '0x1', - decimals: '4', - symbol: 'ABC', - }, - selectedTokenExchangeRate: 5, - hideConversion: false, - }) - }) - - it('should return the correct props when not in mainnet and showFiatInTestnets is false', () => { - const mockState = { - metamask: { - currentCurrency: 'usd', - tokens: [ - { - address: '0x1', - decimals: '4', - symbol: 'ABC', - }, - ], - selectedTokenAddress: '0x1', - contractExchangeRates: {}, - send: {}, - preferences: { - showFiatInTestnets: false, - }, - provider: { - type: 'rinkeby', - }, - }, - } - - assert.deepEqual(mapStateToProps(mockState), { - currentCurrency: 'usd', - selectedToken: { - address: '0x1', - decimals: '4', - symbol: 'ABC', - }, - selectedTokenExchangeRate: 0, - hideConversion: true, - }) - }) - - it('should return the correct props when not in mainnet and showFiatInTestnets is true', () => { - const mockState = { - metamask: { - currentCurrency: 'usd', - tokens: [ - { - address: '0x1', - decimals: '4', - symbol: 'ABC', - }, - ], - selectedTokenAddress: '0x1', - contractExchangeRates: {}, - send: {}, - preferences: { - showFiatInTestnets: true, - }, - provider: { - type: 'rinkeby', - }, - }, - } - - assert.deepEqual(mapStateToProps(mockState), { - currentCurrency: 'usd', - selectedToken: { - address: '0x1', - decimals: '4', - symbol: 'ABC', - }, - selectedTokenExchangeRate: 0, - hideConversion: false, - }) - }) - - it('should return the correct props when in mainnet and showFiatInTestnets is true', () => { - const mockState = { - metamask: { - currentCurrency: 'usd', - tokens: [ - { - address: '0x1', - decimals: '4', - symbol: 'ABC', - }, - ], - selectedTokenAddress: '0x1', - contractExchangeRates: {}, - send: {}, - preferences: { - showFiatInTestnets: true, - }, - provider: { - type: 'mainnet', - }, - }, - } - - assert.deepEqual(mapStateToProps(mockState), { - currentCurrency: 'usd', - selectedToken: { - address: '0x1', - decimals: '4', - symbol: 'ABC', - }, - selectedTokenExchangeRate: 0, - hideConversion: false, - }) - }) - }) - - describe('mergeProps()', () => { - it('should return the correct props', () => { - const mockStateProps = { - currentCurrency: 'usd', - selectedToken: { - address: '0x1', - decimals: '4', - symbol: 'ABC', - }, - selectedTokenExchangeRate: 5, - } - - assert.deepEqual(mergeProps(mockStateProps, {}, {}), { - currentCurrency: 'usd', - selectedToken: { - address: '0x1', - decimals: '4', - symbol: 'ABC', - }, - selectedTokenExchangeRate: 5, - suffix: 'ABC', - }) - }) - }) -}) diff --git a/ui/app/components/ui/token-input/token-input.component.js b/ui/app/components/ui/token-input/token-input.component.js index c28af5fde6c0..78560117155d 100644 --- a/ui/app/components/ui/token-input/token-input.component.js +++ b/ui/app/components/ui/token-input/token-input.component.js @@ -1,9 +1,9 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' +import ethUtil from 'ethereumjs-util' import UnitInput from '../unit-input' import CurrencyDisplay from '../currency-display' import { getWeiHexFromDecimalValue } from '../../../helpers/utils/conversions.util' -import ethUtil from 'ethereumjs-util' import { conversionUtil, multiplyCurrencies } from '../../../helpers/utils/conversion-util' import { ETH } from '../../../helpers/constants/common' @@ -20,13 +20,15 @@ export default class TokenInput extends PureComponent { static propTypes = { currentCurrency: PropTypes.string, onChange: PropTypes.func, - onBlur: PropTypes.func, value: PropTypes.string, - suffix: PropTypes.string, showFiat: PropTypes.bool, hideConversion: PropTypes.bool, - selectedToken: PropTypes.object, - selectedTokenExchangeRate: PropTypes.number, + token: PropTypes.shape({ + address: PropTypes.string.isRequired, + decimals: PropTypes.number, + symbol: PropTypes.string, + }).isRequired, + tokenExchangeRates: PropTypes.object, } constructor (props) { @@ -53,7 +55,7 @@ export default class TokenInput extends PureComponent { } getValue (props) { - const { value: hexValue, selectedToken: { decimals, symbol } = {} } = props + const { value: hexValue, token: { decimals, symbol } = {} } = props const multiplier = Math.pow(10, Number(decimals || 0)) const decimalValueString = conversionUtil(ethUtil.addHexPrefix(hexValue), { @@ -67,8 +69,8 @@ export default class TokenInput extends PureComponent { return Number(decimalValueString) ? decimalValueString : '' } - handleChange = decimalValue => { - const { selectedToken: { decimals } = {}, onChange } = this.props + handleChange = (decimalValue) => { + const { token: { decimals } = {}, onChange } = this.props const multiplier = Math.pow(10, Number(decimals || 0)) const hexValue = multiplyCurrencies(decimalValue || 0, multiplier, { toNumericBase: 'hex' }) @@ -77,13 +79,11 @@ export default class TokenInput extends PureComponent { onChange(hexValue) } - handleBlur = () => { - this.props.onBlur(this.state.hexValue) - } - renderConversionComponent () { - const { selectedTokenExchangeRate, showFiat, currentCurrency, hideConversion } = this.props + const { tokenExchangeRates, showFiat, currentCurrency, hideConversion, token } = this.props const { decimalValue } = this.state + + const tokenExchangeRate = tokenExchangeRates?.[token.address] || 0 let currency, numberOfDecimals if (hideConversion) { @@ -104,14 +104,14 @@ export default class TokenInput extends PureComponent { numberOfDecimals = 6 } - const decimalEthValue = (decimalValue * selectedTokenExchangeRate) || 0 + const decimalEthValue = (decimalValue * tokenExchangeRate) || 0 const hexWeiValue = getWeiHexFromDecimalValue({ value: decimalEthValue, fromCurrency: ETH, fromDenomination: ETH, }) - return selectedTokenExchangeRate + return tokenExchangeRate ? ( { this.renderConversionComponent() } diff --git a/ui/app/components/ui/token-input/token-input.container.js b/ui/app/components/ui/token-input/token-input.container.js index 981cb3598b90..f20670d3180c 100644 --- a/ui/app/components/ui/token-input/token-input.container.js +++ b/ui/app/components/ui/token-input/token-input.container.js @@ -1,30 +1,32 @@ import { connect } from 'react-redux' +import PropTypes from 'prop-types' +import { + getIsMainnet, + getTokenExchangeRates, + getPreferences, +} from '../../../selectors' import TokenInput from './token-input.component' -import {getIsMainnet, getSelectedToken, getSelectedTokenExchangeRate, preferencesSelector} from '../../../selectors/selectors' -const mapStateToProps = state => { +const mapStateToProps = (state) => { const { metamask: { currentCurrency } } = state - const { showFiatInTestnets } = preferencesSelector(state) + const { showFiatInTestnets } = getPreferences(state) const isMainnet = getIsMainnet(state) return { currentCurrency, - selectedToken: getSelectedToken(state), - selectedTokenExchangeRate: getSelectedTokenExchangeRate(state), + tokenExchangeRates: getTokenExchangeRates(state), hideConversion: (!isMainnet && !showFiatInTestnets), } } -const mergeProps = (stateProps, dispatchProps, ownProps) => { - const { selectedToken } = stateProps - const suffix = selectedToken && selectedToken.symbol +const TokenInputContainer = connect(mapStateToProps)(TokenInput) - return { - ...stateProps, - ...dispatchProps, - ...ownProps, - suffix, - } +TokenInputContainer.propTypes = { + token: PropTypes.shape({ + address: PropTypes.string.isRequired, + decimals: PropTypes.number, + symbol: PropTypes.string, + }).isRequired, } -export default connect(mapStateToProps, null, mergeProps)(TokenInput) +export default TokenInputContainer diff --git a/ui/app/components/ui/tooltip-v2.js b/ui/app/components/ui/tooltip-v2.js deleted file mode 100644 index b5402679491a..000000000000 --- a/ui/app/components/ui/tooltip-v2.js +++ /dev/null @@ -1,70 +0,0 @@ -import PropTypes from 'prop-types' -import React, {PureComponent} from 'react' -import {Tooltip as ReactTippy} from 'react-tippy' - -export default class Tooltip extends PureComponent { - static defaultProps = { - arrow: true, - children: null, - containerClassName: '', - hideOnClick: false, - onHidden: null, - position: 'left', - size: 'small', - title: null, - trigger: 'mouseenter', - wrapperClassName: '', - } - - static propTypes = { - arrow: PropTypes.bool, - children: PropTypes.node, - containerClassName: PropTypes.string, - disabled: PropTypes.bool, - onHidden: PropTypes.func, - position: PropTypes.oneOf([ - 'top', - 'right', - 'bottom', - 'left', - ]), - size: PropTypes.oneOf([ - 'small', 'regular', 'big', - ]), - title: PropTypes.string, - trigger: PropTypes.any, - wrapperClassName: PropTypes.string, - style: PropTypes.object, - } - - render () { - const {arrow, children, containerClassName, disabled, position, size, title, trigger, onHidden, wrapperClassName, style } = this.props - - if (!title) { - return ( -
      - {children} -
      - ) - } - - return ( -
      - - {children} - -
      - ) - } -} diff --git a/ui/app/components/ui/tooltip.js b/ui/app/components/ui/tooltip.js deleted file mode 100644 index efab2c497847..000000000000 --- a/ui/app/components/ui/tooltip.js +++ /dev/null @@ -1,22 +0,0 @@ -const Component = require('react').Component -const h = require('react-hyperscript') -const inherits = require('util').inherits -const ReactTooltip = require('react-tooltip-component') - -module.exports = Tooltip - -inherits(Tooltip, Component) -function Tooltip () { - Component.call(this) -} - -Tooltip.prototype.render = function () { - const props = this.props - const { position, title, children } = props - - return h(ReactTooltip, { - position: position || 'left', - title, - fixed: true, - }, children) -} diff --git a/ui/app/components/ui/tooltip/index.js b/ui/app/components/ui/tooltip/index.js new file mode 100644 index 000000000000..00a8d178af39 --- /dev/null +++ b/ui/app/components/ui/tooltip/index.js @@ -0,0 +1 @@ +export { default } from './tooltip' diff --git a/ui/app/components/ui/tooltip/tooltip.js b/ui/app/components/ui/tooltip/tooltip.js new file mode 100644 index 000000000000..e6b5726d4287 --- /dev/null +++ b/ui/app/components/ui/tooltip/tooltip.js @@ -0,0 +1,97 @@ +import PropTypes from 'prop-types' +import React, { PureComponent } from 'react' +import { Tooltip as ReactTippy } from 'react-tippy' + +export default class Tooltip extends PureComponent { + static defaultProps = { + arrow: true, + children: null, + containerClassName: '', + html: null, + interactive: undefined, + onHidden: null, + position: 'left', + offset: 0, + size: 'small', + title: null, + trigger: 'mouseenter', + wrapperClassName: undefined, + theme: '', + } + + static propTypes = { + arrow: PropTypes.bool, + children: PropTypes.node, + containerClassName: PropTypes.string, + disabled: PropTypes.bool, + html: PropTypes.node, + interactive: PropTypes.bool, + offset: PropTypes.number, + onHidden: PropTypes.func, + position: PropTypes.oneOf([ + 'top', + 'right', + 'bottom', + 'left', + ]), + size: PropTypes.oneOf([ + 'small', 'regular', 'big', + ]), + title: PropTypes.string, + trigger: PropTypes.any, + wrapperClassName: PropTypes.string, + style: PropTypes.object, + theme: PropTypes.string, + } + + render () { + const { + arrow, + children, + containerClassName, + disabled, + position, + html, + interactive, + size, + title, + trigger, + onHidden, + offset, + wrapperClassName, + style, + theme, + } = this.props + + if (!title && !html) { + return ( +
      + {children} +
      + ) + } + + return ( +
      + + {children} + +
      + ) + } +} diff --git a/ui/app/components/ui/ui-components.scss b/ui/app/components/ui/ui-components.scss new file mode 100644 index 000000000000..2529ab73ba00 --- /dev/null +++ b/ui/app/components/ui/ui-components.scss @@ -0,0 +1,38 @@ +/** Please import your files in alphabetical order **/ +@import 'account-mismatch-warning/index'; +@import 'alert-circle-icon/index'; +@import 'alert/index'; +@import 'breadcrumbs/index'; +@import 'button-group/index'; +@import 'button/buttons'; +@import 'card/index'; +@import 'check-box/index'; +@import 'circle-icon/index'; +@import 'currency-display/index'; +@import 'currency-input/index'; +@import 'dialog/dialog'; +@import 'dropdown/dropdown'; +@import 'editable-label/index'; +@import 'error-message/index'; +@import 'export-text-container/index'; +@import 'icon-border/icon-border'; +@import 'icon-with-fallback/icon-with-fallback'; +@import 'icon-with-label/index'; +@import 'icon/index'; +@import 'icon/preloader/index'; +@import 'identicon/index'; +@import 'info-tooltip/index'; +@import 'list-item/index'; +@import 'loading-screen/index'; +@import 'menu/menu'; +@import 'page-container/index'; +@import 'popover/index'; +@import 'pulse-loader/index'; +@import 'qr-code/index'; +@import 'readonly-input/index'; +@import 'sender-to-recipient/index'; +@import 'snackbar/index'; +@import 'tabs/index'; +@import 'toggle-button/index'; +@import 'token-balance/index'; +@import 'unit-input/index'; diff --git a/ui/app/components/ui/unit-input/index.scss b/ui/app/components/ui/unit-input/index.scss index 58a10c9a1c3c..c86f487b5cef 100644 --- a/ui/app/components/ui/unit-input/index.scss +++ b/ui/app/components/ui/unit-input/index.scss @@ -36,9 +36,7 @@ &__input { color: #4d4d4d; font-size: 1rem; - font-family: Roboto; border: none; - outline: 0 !important; max-width: 22ch; height: 16px; line-height: 18px; @@ -65,7 +63,6 @@ } &__disabled { - background-color: #F2F3F4; + background-color: #f2f3f4; } - } diff --git a/ui/app/components/ui/unit-input/tests/unit-input.component.test.js b/ui/app/components/ui/unit-input/tests/unit-input.component.test.js index 97d987bc72fe..0b92fc5a0173 100644 --- a/ui/app/components/ui/unit-input/tests/unit-input.component.test.js +++ b/ui/app/components/ui/unit-input/tests/unit-input.component.test.js @@ -1,25 +1,25 @@ -import React from 'react' import assert from 'assert' +import React from 'react' import { shallow, mount } from 'enzyme' import sinon from 'sinon' import UnitInput from '../unit-input.component' -describe('UnitInput Component', () => { - describe('rendering', () => { - it('should render properly without a suffix', () => { +describe('UnitInput Component', function () { + describe('rendering', function () { + it('should render properly without a suffix', function () { const wrapper = shallow( - + , ) assert.ok(wrapper) assert.equal(wrapper.find('.unit-input__suffix').length, 0) }) - it('should render properly with a suffix', () => { + it('should render properly with a suffix', function () { const wrapper = shallow( + />, ) assert.ok(wrapper) @@ -27,13 +27,13 @@ describe('UnitInput Component', () => { assert.equal(wrapper.find('.unit-input__suffix').text(), 'ETH') }) - it('should render properly with a child omponent', () => { + it('should render properly with a child component', function () { const wrapper = shallow(
      TESTCOMPONENT
      -
      +
      , ) assert.ok(wrapper) @@ -41,11 +41,11 @@ describe('UnitInput Component', () => { assert.equal(wrapper.find('.testing').text(), 'TESTCOMPONENT') }) - it('should render with an error class when props.error === true', () => { + it('should render with an error class when props.error === true', function () { const wrapper = shallow( + />, ) assert.ok(wrapper) @@ -53,18 +53,18 @@ describe('UnitInput Component', () => { }) }) - describe('handling actions', () => { + describe('handling actions', function () { const handleChangeSpy = sinon.spy() const handleBlurSpy = sinon.spy() - afterEach(() => { + afterEach(function () { handleChangeSpy.resetHistory() handleBlurSpy.resetHistory() }) - it('should focus the input on component click', () => { + it('should focus the input on component click', function () { const wrapper = mount( - + , ) assert.ok(wrapper) @@ -76,59 +76,38 @@ describe('UnitInput Component', () => { assert.equal(handleFocusSpy.callCount, 1) }) - it('should call onChange on input changes with the value', () => { - const wrapper = mount( - - ) - - assert.ok(wrapper) - assert.equal(handleChangeSpy.callCount, 0) - const input = wrapper.find('input') - input.simulate('change', { target: { value: 123 } }) - assert.equal(handleChangeSpy.callCount, 1) - assert.ok(handleChangeSpy.calledWith(123)) - assert.equal(wrapper.state('value'), 123) - }) - - it('should call onBlur on blur with the value', () => { + it('should call onChange on input changes with the value', function () { const wrapper = mount( + />, ) assert.ok(wrapper) assert.equal(handleChangeSpy.callCount, 0) - assert.equal(handleBlurSpy.callCount, 0) const input = wrapper.find('input') input.simulate('change', { target: { value: 123 } }) assert.equal(handleChangeSpy.callCount, 1) assert.ok(handleChangeSpy.calledWith(123)) assert.equal(wrapper.state('value'), 123) - input.simulate('blur') - assert.equal(handleBlurSpy.callCount, 1) - assert.ok(handleBlurSpy.calledWith(123)) }) - it('should set the component state value with props.value', () => { + it('should set the component state value with props.value', function () { const wrapper = mount( + />, ) assert.ok(wrapper) assert.equal(wrapper.state('value'), 123) }) - it('should update the component state value with props.value', () => { + it('should update the component state value with props.value', function () { const wrapper = mount( + />, ) assert.ok(wrapper) diff --git a/ui/app/components/ui/unit-input/unit-input.component.js b/ui/app/components/ui/unit-input/unit-input.component.js index 9085a0677cb8..6a9b76e7c345 100644 --- a/ui/app/components/ui/unit-input/unit-input.component.js +++ b/ui/app/components/ui/unit-input/unit-input.component.js @@ -14,7 +14,6 @@ export default class UnitInput extends PureComponent { actionComponent: PropTypes.node, error: PropTypes.bool, maxModeOn: PropTypes.bool, - onBlur: PropTypes.func, onChange: PropTypes.func, placeholder: PropTypes.string, suffix: PropTypes.string, @@ -22,15 +21,12 @@ export default class UnitInput extends PureComponent { } static defaultProps = { + value: '', placeholder: '0', } - constructor (props) { - super(props) - - this.state = { - value: props.value || '', - } + state = { + value: this.props.value, } componentDidUpdate (prevProps) { @@ -47,7 +43,7 @@ export default class UnitInput extends PureComponent { this.unitInput.focus() } - handleChange = event => { + handleChange = (event) => { const { value: userInput } = event.target let value = userInput @@ -59,16 +55,11 @@ export default class UnitInput extends PureComponent { this.props.onChange(value) } - handleBlur = () => { - const { onBlur } = this.props - typeof onBlur === 'function' && onBlur(this.state.value) - } - getInputWidth (value) { const valueString = String(value) const valueLength = valueString.length || 1 - const decimalPointDeficit = valueString.match(/\./) ? -0.5 : 0 - return (valueLength + decimalPointDeficit + 0.5) + 'ch' + const decimalPointDeficit = valueString.match(/\./u) ? -0.5 : 0 + return `${valueLength + decimalPointDeficit + 0.5}ch` } render () { @@ -84,13 +75,15 @@ export default class UnitInput extends PureComponent {
      { this.unitInput = ref }} + ref={(ref) => { + this.unitInput = ref + }} disabled={maxModeOn} /> { diff --git a/ui/app/contexts/i18n.js b/ui/app/contexts/i18n.js new file mode 100644 index 000000000000..eb5d4e1cdcd7 --- /dev/null +++ b/ui/app/contexts/i18n.js @@ -0,0 +1,61 @@ +import React, { Component, createContext, useMemo } from 'react' +import PropTypes from 'prop-types' +import { useSelector } from 'react-redux' +import { getMessage } from '../helpers/utils/i18n-helper' +import { getCurrentLocale } from '../ducks/metamask/metamask' +import { getCurrentLocaleMessages, getEnLocaleMessages } from '../ducks/locale/locale' + +export const I18nContext = createContext((key) => `[${key}]`) + +export const I18nProvider = (props) => { + const currentLocale = useSelector(getCurrentLocale) + const current = useSelector(getCurrentLocaleMessages) + const en = useSelector(getEnLocaleMessages) + + const t = useMemo(() => { + return (key, ...args) => ( + getMessage(currentLocale, current, key, ...args) || + getMessage(currentLocale, en, key, ...args) + ) + }, [currentLocale, current, en]) + + return ( + + { props.children } + + ) +} + +I18nProvider.propTypes = { + children: PropTypes.node, +} + +I18nProvider.defaultProps = { + children: undefined, +} + +export class LegacyI18nProvider extends Component { + static propTypes = { + children: PropTypes.node, + } + + static defaultProps = { + children: undefined, + } + + static contextType = I18nContext + + static childContextTypes = { + t: PropTypes.func, + } + + getChildContext () { + return { + t: this.context, + } + } + + render () { + return this.props.children + } +} diff --git a/ui/app/contexts/metametrics.js b/ui/app/contexts/metametrics.js new file mode 100644 index 000000000000..11162258706d --- /dev/null +++ b/ui/app/contexts/metametrics.js @@ -0,0 +1,132 @@ +import React, { Component, createContext, useEffect, useCallback, useState } from 'react' +import { useSelector } from 'react-redux' +import PropTypes from 'prop-types' +import { useHistory } from 'react-router-dom' +import { captureException } from '@sentry/browser' + +import { + getCurrentNetworkId, + getAccountType, + getNumberOfAccounts, + getNumberOfTokens, +} from '../selectors/selectors' +import { getSendToken } from '../selectors/send' +import { + txDataSelector, +} from '../selectors/confirm-transaction' +import { getEnvironmentType } from '../../../app/scripts/lib/util' +import { + sendMetaMetricsEvent, + sendCountIsTrackable, +} from '../helpers/utils/metametrics.util' + +export const MetaMetricsContext = createContext(() => { + captureException( + Error(`MetaMetrics context function was called from a react node that is not a descendant of a MetaMetrics context provider`), + ) +}) + +export function MetaMetricsProvider ({ children }) { + const txData = useSelector(txDataSelector) || {} + const network = useSelector(getCurrentNetworkId) + const environmentType = getEnvironmentType() + const activeCurrency = useSelector(getSendToken)?.symbol + const accountType = useSelector(getAccountType) + const confirmTransactionOrigin = txData.origin + const metaMetricsId = useSelector((state) => state.metamask.metaMetricsId) + const participateInMetaMetrics = useSelector((state) => state.metamask.participateInMetaMetrics) + const metaMetricsSendCount = useSelector((state) => state.metamask.metaMetricsSendCount) + const numberOfTokens = useSelector(getNumberOfTokens) + const numberOfAccounts = useSelector(getNumberOfAccounts) + const history = useHistory() + const [state, setState] = useState(() => ({ + currentPath: (new URL(window.location.href)).pathname, + previousPath: '', + })) + + const { previousPath, currentPath } = state + + useEffect(() => { + const unlisten = history.listen(() => setState((prevState) => ({ + currentPath: (new URL(window.location.href)).pathname, + previousPath: prevState.currentPath, + }))) + // remove this listener if the component is no longer mounted + return unlisten + }, [history]) + + const metricsEvent = useCallback((config = {}, overrides = {}) => { + const { eventOpts = {} } = config + const { name = '' } = eventOpts + const { currentPath: overrideCurrentPath = '' } = overrides + const isSendFlow = Boolean(name.match(/^send|^confirm/u) || overrideCurrentPath.match(/send|confirm/u)) + + if (participateInMetaMetrics || config.isOptIn) { + return sendMetaMetricsEvent({ + network, + environmentType, + activeCurrency, + accountType, + confirmTransactionOrigin, + metaMetricsId, + numberOfTokens, + numberOfAccounts, + version: global.platform.getVersion(), + ...config, + previousPath, + currentPath, + excludeMetaMetricsId: isSendFlow && !sendCountIsTrackable(metaMetricsSendCount + 1), + ...overrides, + }) + } + + return undefined + }, [ + network, + environmentType, + activeCurrency, + accountType, + confirmTransactionOrigin, + participateInMetaMetrics, + previousPath, + metaMetricsId, + numberOfTokens, + numberOfAccounts, + currentPath, + metaMetricsSendCount, + ]) + + return ( + + {children} + + ) +} + +MetaMetricsProvider.propTypes = { children: PropTypes.node } + +export class LegacyMetaMetricsProvider extends Component { + static propTypes = { + children: PropTypes.node, + } + + static defaultProps = { + children: undefined, + } + + static contextType = MetaMetricsContext + + static childContextTypes = { + metricsEvent: PropTypes.func, + } + + getChildContext () { + return { + metricsEvent: this.context, + } + } + + render () { + return this.props.children + } +} diff --git a/ui/app/css/base-styles.scss b/ui/app/css/base-styles.scss new file mode 100644 index 000000000000..8b2220f9c6aa --- /dev/null +++ b/ui/app/css/base-styles.scss @@ -0,0 +1,133 @@ + + +* { + box-sizing: border-box; +} + +html, +body { + color: #4d4d4d; + width: 100%; + height: 100%; + margin: 0; + padding: 0; + font-size: 16px; + overflow: auto; +} + +html { + min-height: 500px; +} + +.mouse-user-styles { + button:focus, + input:focus, + textarea:focus, + .unit-input__input, + .currency-display__input { + outline: none; + } +} + +/* + This error class is used in the following files still: + /ui/app/pages/create-account/connect-hardware/index.js + /ui/app/pages/create-account/import-account/json.js + /ui/app/pages/create-account/import-account/private-key.js + /ui/app/pages/first-time-flow/create-password/import-with-seed-phrase/import-with-seed-phrase.component.js + /ui/app/pages/keychains/restore-vault.js +*/ +.error { + color: #f7861c; + margin-bottom: 9px; +} + +/* + This warning class is used in the following files still: + /ui/app/pages/create-account/import-account/json.js + /ui/app/pages/confirm-add-suggested-token/confirm-add-suggested-token.component.js +*/ +.warning { + color: #ffae00; +} + +/* stylelint-disable */ +#app-content { + overflow-x: hidden; + height: 100%; + display: flex; + flex-direction: column; + background: #f7f7f7; + + @media screen and (max-width: $break-small) { + background-color: $white; + } +} +/* stylelint-enable */ + +a { + text-decoration: none; + color: inherit; +} + +a:hover { + color: #df6b0e; +} + +input.large-input, +textarea.large-input { + padding: 8px; +} + +input.large-input { + height: 36px; +} + +.allcaps { + text-transform: uppercase; +} + +.input-label { + padding-bottom: 10px; + font-weight: 400; + display: inline-block; +} + +input.form-control { + padding-left: 10px; + font-size: 14px; + height: 40px; + border: 1px solid $alto; + border-radius: 3px; + width: 100%; + + &::-webkit-input-placeholder { + font-weight: 100; + color: $dusty-gray; + } + + &::-moz-placeholder { + font-weight: 100; + color: $dusty-gray; + } + + &:-ms-input-placeholder { + font-weight: 100; + color: $dusty-gray; + } + + &:-moz-placeholder { + font-weight: 100; + color: $dusty-gray; + } + + &--error { + border: 1px solid $monzo; + } +} + +/** Default Typography on base elements **/ +* { + font-family: $font-family; +} + diff --git a/ui/app/css/design-system/breakpoints.scss b/ui/app/css/design-system/breakpoints.scss new file mode 100644 index 000000000000..80a4176b0e57 --- /dev/null +++ b/ui/app/css/design-system/breakpoints.scss @@ -0,0 +1,6 @@ +/* +Responsive Breakpoints +*/ +$break-small: 575px; +$break-midpoint: 780px; +$break-large: 576px; diff --git a/ui/app/css/design-system/colors.scss b/ui/app/css/design-system/colors.scss new file mode 100644 index 000000000000..c945c0de1cc1 --- /dev/null +++ b/ui/app/css/design-system/colors.scss @@ -0,0 +1,76 @@ +// These are the colors of the MetaMask design system +// Only design system colors should be added, no superfluous variables +// See https://bit.ly/32mnoja (link to figma design system) +$Blue-000: #eaf6ff; +$Blue-100: #a7d9fe; +$Blue-200: #75c4fd; +$Blue-300: #43aefc; +$Blue-400: #1098fc; +$Blue-500: #037dd6; +$Blue-600: #0260a4; +$Blue-700: #024272; +$Blue-800: #01253f; +$Blue-900: #00080d; + +$Grey-000: #f2f3f4; +$Grey-100: #d6d9dc; +$Grey-200: #bbc0c5; +$Grey-300: #9fa6ae; +$Grey-400: #848c96; +$Grey-500: #6a737d; +$Grey-600: #535a61; +$Grey-700: #3b4046; +$Grey-800: #24272a; +$Grey-900: #141618; + +$Green-000: #f3fcf5; +$Green-100: #d6ffdf; +$Green-200: #afecbd; +$Green-300: #86e29b; +$Green-400: #5dd879; +$Green-500: #28a745; +$Green-600: #1e7e34; +$Green-700: #145523; +$Green-800: #0a2c12; +$Green-900: #041007; + +$Red-000: #fcf2f3; +$Red-100: #f7d5d8; +$Red-200: #f1b9be; +$Red-300: #e88f97; +$Red-400: #e06470; +$Red-500: #d73a49; +$Red-600: #b92534; +$Red-700: #8e1d28; +$Red-800: #64141c; +$Red-900: #3a0c10; + +$Orange-000: #fef5ef; +$Orange-100: #fde2cf; +$Orange-200: #fbc49d; +$Orange-300: #faa66c; +$Orange-400: #f8883b; +$Orange-500: #f66a0a; +$Orange-600: #c65507; +$Orange-700: #954005; +$Orange-800: #632b04; +$Orange-900: #321602; + +$Yellow-000: #fefae8; // Temporary placeholder +$Yellow-100: #fefcde; +$Yellow-500: #ffd33d; + +$Black-100: #24292e; + +$primary-blue: $Blue-500; +$primary-orange: $Orange-500; + +$accent-yellow: $Yellow-500; +$accent-green: $Green-500; +$accent-red: $Red-500; +$accent-purple: #6f42c1; +$accent-pink: #ff45d8; + +$neutral-white: #fff; +$neutral-black: $Black-100; +$neutral-grey: $Grey-500; diff --git a/ui/app/css/design-system/deprecated-colors.scss b/ui/app/css/design-system/deprecated-colors.scss new file mode 100644 index 000000000000..c65f0bfa0100 --- /dev/null +++ b/ui/app/css/design-system/deprecated-colors.scss @@ -0,0 +1,48 @@ +/** + These colors are either deprecated or will move into colors.scss + when approved for the design system +**/ + +// Base Colors +$white: #fff; +$black: #000; +$orange: #ffa500; +$red: #f00; +$gray: #808080; + +/* + Colors + http://chir.ag/projects/name-that-color + */ +$gallery: #efefef; +$wild-sand: #f6f6f6; +$dusty-gray: #9b9b9b; +$alto: #dedede; +$alabaster: #fafafa; +$silver-chalice: #aeaeae; +$tundora: #4d4d4d; +$nile-blue: #1b344d; +$scorpion: #5d5d5d; +$silver: #cdcdcd; +$caribbean-green: #02c9b1; +$monzo: #d0021b; +$crimson: #e91550; +$blue-lagoon: #038789; +$purple: #690496; +$tulip-tree: #ebb33f; +$malibu-blue: #7ac9fd; +$athens-grey: #e9edf0; +$geyser: #d2d8dd; +$manatee: #93949d; +$spindle: #c7ddec; +$mid-gray: #5b5d67; +$cape-cod: #38393a; +$dodger-blue: #3099f2; +$ecstasy: #f7861c; +$linen: #fdf4f4; +$oslo-gray: #8c8e94; +$polar: #fafcfe; +$blizzard-blue: #bfdef3; +$mischka: #dddee9; +$web-orange: #f2a202; +$mercury: #e5e5e5; diff --git a/ui/app/css/design-system/index.scss b/ui/app/css/design-system/index.scss new file mode 100644 index 000000000000..2d85fcae3b7c --- /dev/null +++ b/ui/app/css/design-system/index.scss @@ -0,0 +1,5 @@ +@import 'breakpoints'; +@import 'colors'; +@import 'deprecated-colors'; +@import 'typography'; +@import 'z-index'; diff --git a/ui/app/css/design-system/typography.scss b/ui/app/css/design-system/typography.scss new file mode 100644 index 000000000000..70cc4bef44ad --- /dev/null +++ b/ui/app/css/design-system/typography.scss @@ -0,0 +1,151 @@ +$fa-font-path: 'fonts/fontawesome'; + +@import '../../../../node_modules/@fortawesome/fontawesome-free/scss/fontawesome'; +@import '../../../../node_modules/@fortawesome/fontawesome-free/scss/solid'; +@import '../../../../node_modules/@fortawesome/fontawesome-free/scss/regular'; + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 100; + src: local('Roboto Thin'), local('Roboto-Thin'), url('fonts/Roboto/Roboto-Thin.ttf') format('truetype'); +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: local('Roboto Light'), local('Roboto-Light'), url('fonts/Roboto/Roboto-Light.ttf') format('truetype'); +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: local('Roboto'), local('Roboto-Regular'), url('fonts/Roboto/Roboto-Regular.ttf') format('truetype'); +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 500; + src: local('Roboto Medium'), local('Roboto-Medium'), url('fonts/Roboto/Roboto-Medium.ttf') format('truetype'); +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + src: local('Roboto Bold'), local('Roboto-Bold'), url('fonts/Roboto/Roboto-Bold.ttf') format('truetype'); +} + +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 900; + src: local('Roboto Black'), local('Roboto-Black'), url('fonts/Roboto/Roboto-Black.ttf') format('truetype'); +} + +@font-face { + font-family: 'Euclid'; + font-style: normal; + font-weight: 400; + src: url('fonts/Euclid/EuclidCircularB-Regular-WebXL.ttf') format('truetype'); +} + +@font-face { + font-family: 'Euclid'; + font-style: italic; + font-weight: 400; + src: url('fonts/Euclid/EuclidCircularB-RegularItalic-WebXL.ttf') format('truetype'); +} + +@font-face { + font-family: 'Euclid'; + font-style: normal; + font-weight: 700; + src: url('fonts/Euclid/EuclidCircularB-Bold-WebXL.ttf') format('truetype'); +} + +$font-family: Euclid, Roboto, Helvetica, Arial, sans-serif; + +// Typography +@mixin H1 { + font-style: normal; + font-weight: normal; + font-size: 2.5rem; + font-family: $font-family; + line-height: 140%; +} + + +@mixin H2 { + font-style: normal; + font-weight: normal; + font-size: 2rem; + font-family: $font-family; + line-height: 140%; +} + +@mixin H3 { + font-style: normal; + font-weight: normal; + font-size: 1.5rem; + font-family: $font-family; + line-height: 140%; +} + +@mixin H4 { + font-style: normal; + font-weight: normal; + font-size: 1.125rem; + font-family: $font-family; + line-height: 140%; +} + +@mixin H5 { + font-style: normal; + font-weight: normal; + font-size: 1rem; + font-family: $font-family; + line-height: 140%; +} + +@mixin H6 { + font-style: normal; + font-weight: normal; + font-size: 0.875rem; // 14px @default + line-height: 140%; +} + +@mixin Paragraph { + font-style: normal; + font-weight: normal; + font-size: 1rem; + font-family: $font-family; + line-height: 140%; +} + +@mixin H7 { + font-style: normal; + font-weight: normal; + font-size: 0.75rem; + font-family: $font-family; + line-height: 140%; +} + +@mixin H8 { + font-style: normal; + font-weight: normal; + font-size: 0.625rem; + font-family: $font-family; + line-height: 140%; +} + +@mixin H9 { + font-style: normal; + font-weight: normal; + font-size: 0.5rem; + font-family: $font-family; + line-height: 140%; +} diff --git a/ui/app/css/design-system/z-index.scss b/ui/app/css/design-system/z-index.scss new file mode 100644 index 000000000000..38086904a678 --- /dev/null +++ b/ui/app/css/design-system/z-index.scss @@ -0,0 +1,12 @@ +/* + Z-Indicies +*/ +$dropdown-z-index: 30; +$token-icon-z-index: 15; +$container-z-index: 15; +$header-z-index: 12; +$mobile-header-z-index: 26; +$main-container-z-index: 18; +$send-card-z-index: 20; +$sidebar-z-index: 26; +$sidebar-overlay-z-index: 25; diff --git a/ui/app/css/index.scss b/ui/app/css/index.scss index ffccbd64f70f..50978fbcb85c 100644 --- a/ui/app/css/index.scss +++ b/ui/app/css/index.scss @@ -1,18 +1,31 @@ +/* + MetaMask design system imports + The variables declared here should take precedence. + They are included first because they will be used to replace bad variable names in itcss + prior to it being fully removed from the system. +*/ +@import './reset.scss'; +@import './design-system/index'; +@import './base-styles.scss'; +@import '../components/app/app-components'; +@import '../components/ui/ui-components'; +@import '../pages/pages'; + /* ITCSS http://www.creativebloq.com/web-design/manage-large-css-projects-itcss-101517528 https://www.xfive.co/blog/itcss-scalable-maintainable-css-architecture/ - */ - -@import './itcss/settings/index.scss'; - -@import './itcss/tools/index.scss'; -@import './itcss/generic/index.scss'; - -@import './itcss/objects/index.scss'; - -@import './itcss/components/index.scss'; + DEPRECATED: This CSS architecture is deprecated. The following imports will be removed + overtime. + */ +@import './itcss/settings/index'; +@import './itcss/tools/index'; +@import './itcss/components/index'; -@import './itcss/trumps/index.scss'; +/* + Third Party Library Styles +*/ +@import '../../../node_modules/react-tippy/dist/tippy'; +@import '../../../node_modules/react-select/dist/react-select'; diff --git a/ui/app/css/itcss/README.md b/ui/app/css/itcss/README.md new file mode 100644 index 000000000000..cf295969a70d --- /dev/null +++ b/ui/app/css/itcss/README.md @@ -0,0 +1,2 @@ +### Deprecated +The [itcss](https://www.freecodecamp.org/news/managing-large-s-css-projects-using-the-inverted-triangle-architecture-3c03e4b1e6df/) folder is deprecated. The infrastructure here is from a former era of the extension. The files and some sporadic styling are still used in the codebase but should not be extended. The MetaMask team will gradually move the valid styles from this folder into the [css](/css) folder. Eventually the itcss folder will be removed. diff --git a/ui/app/css/itcss/components/account-details-dropdown.scss b/ui/app/css/itcss/components/account-details-dropdown.scss deleted file mode 100644 index 2a3007f83f62..000000000000 --- a/ui/app/css/itcss/components/account-details-dropdown.scss +++ /dev/null @@ -1,7 +0,0 @@ -.account-details-dropdown { - width: 60%; - position: absolute; - top: 120px; - right: 15px; - z-index: 2000; -} \ No newline at end of file diff --git a/ui/app/css/itcss/components/account-dropdown-mini.scss b/ui/app/css/itcss/components/account-dropdown-mini.scss deleted file mode 100644 index 996993db7701..000000000000 --- a/ui/app/css/itcss/components/account-dropdown-mini.scss +++ /dev/null @@ -1,48 +0,0 @@ -.account-dropdown-mini { - height: 22px; - background-color: $white; - font-family: Roboto; - line-height: 16px; - font-size: 12px; - width: 124px; - - &__close-area { - position: fixed; - top: 0; - left: 0; - z-index: 1000; - width: 100%; - height: 100%; - } - - &__list { - z-index: 1050; - position: absolute; - height: 180px; - width: 96pxpx; - border: 1px solid $geyser; - border-radius: 4px; - background-color: $white; - box-shadow: 0 3px 6px 0 rgba(0 ,0 ,0 ,.11); - overflow-y: scroll; - } - - .account-list-item { - margin-top: 6px; - } - - .account-list-item__account-name { - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - width: 80px; - } - - .account-list-item__top-row { - margin: 0; - } - - .account-list-item__icon { - position: initial; - } -} \ No newline at end of file diff --git a/ui/app/css/itcss/components/account-dropdown.scss b/ui/app/css/itcss/components/account-dropdown.scss deleted file mode 100644 index 716404cc3c0d..000000000000 --- a/ui/app/css/itcss/components/account-dropdown.scss +++ /dev/null @@ -1,111 +0,0 @@ -.account-dropdown-name { - font-family: Roboto; -} - -.account-dropdown-balance { - color: $dusty-gray; - line-height: 19px; -} - -.account-dropdown-edit-button { - color: $dusty-gray; - font-family: Roboto; - - &:hover { - color: $white; - } -} - -.account-list-item { - &__top-row { - display: flex; - margin-top: 10px; - margin-left: 8px; - position: relative; - } - - &__tooltip-wrapper { - left: -10px; - } - - &__account-balances { - height: auto; - border: none; - background-color: transparent; - color: #9b9b9b; - margin-left: 34px; - margin-top: 4px; - position: relative; - } - - &__primary-cached-container { - display: flex; - } - - &__cached-star { - margin-left: 4px; - } - - &__cached-balances { - div:first-of-type { - color: $web-orange; - } - - div:last-of-type { - color: rgba(220, 153, 18, 0.6901960784313725) - } - } - - &__account-name { - font-size: 16px; - margin-left: 8px; - } - - &__icon { - position: absolute; - right: 12px; - top: 1px; - } - - &__account-primary-balance, - &__account-secondary-balance { - font-family: Roboto; - line-height: 16px; - font-size: 12px; - } - - &__balance-flag { - position: absolute; - top: 3px; - left: -8px; - color: $curious-blue; - } - - &__account-primary-balance { - color: $scorpion; - border: none; - outline: 0 !important; - } - - &__account-secondary-balance { - color: $dusty-gray; - } - - &__account-address { - margin-left: 35px; - width: 80%; - overflow: hidden; - text-overflow: ellipsis; - } - - &__dropdown { - &:hover { - background: rgba($alto, .2); - cursor: pointer; - - input { - background: rgba($alto, .1); - } - } - } -} diff --git a/ui/app/css/itcss/components/alert.scss b/ui/app/css/itcss/components/alert.scss deleted file mode 100644 index 930fc3f54b02..000000000000 --- a/ui/app/css/itcss/components/alert.scss +++ /dev/null @@ -1,57 +0,0 @@ -.global-alert { - position: relative; - width: 100%; - background-color: #33A4E7; - - .msg { - width: 100%; - display: block; - color: white; - font-size: 12px; - text-align: center; - } -} - -.global-alert.hidden { - animation: alertHidden .5s ease forwards; -} - -.global-alert.visible { - animation: alert .5s ease forwards; -} - -/* Animation */ -@keyframes alert { - 0% { - opacity: 0; - top: -50px; - padding: 0px; - line-height: 12px; - } - - 50% { - opacity: 1; - } - - 100% { - top: 0; - padding: 8px; - line-height: 12px; - } -} - -@keyframes alertHidden { - 0% { - top: 0; - opacity: 1; - padding: 8px; - line-height: 12px; - } - - 100% { - opacity: 0; - top: -50px; - padding: 0px; - line-height: 0px; - } -} diff --git a/ui/app/css/itcss/components/confirm.scss b/ui/app/css/itcss/components/confirm.scss deleted file mode 100644 index 44cfcf87014c..000000000000 --- a/ui/app/css/itcss/components/confirm.scss +++ /dev/null @@ -1,354 +0,0 @@ -.confirm-screen-container { - position: relative; - align-items: center; - font-family: Roboto; - flex: 1 0 auto; - flex-flow: column nowrap; - box-shadow: 0 2px 4px 0 rgba($black, .08); - border-radius: 8px; - display: flex; - - @media screen and (max-width: 575px) { - width: 100%; - box-shadow: initial; - } - - @media screen and (min-width: 576px) { - // top: -26px; - } -} - -.notification { - .confirm-screen-wrapper { - - @media screen and (max-width: $break-small) { - height: calc(100vh - 85px); - } - } -} - -.confirm-screen-wrapper { - height: 100%; - width: 380px; - background-color: $white; - display: flex; - flex-flow: column nowrap; - z-index: 25; - align-items: center; - font-family: Roboto; - position: relative; - overflow-y: auto; - overflow-x: hidden; - border-top-left-radius: 8px; - border-top-right-radius: 8px; - - @media screen and (max-width: $break-small) { - width: 100%; - overflow-x: hidden; - overflow-y: auto; - top: 0; - box-shadow: none; - height: calc(100vh - 58px - 85px); - border-top-left-radius: 0; - border-top-right-radius: 0; - } -} - -.confirm-screen-wrapper > .confirm-screen-total-box { - margin-left: 10px; - margin-right: 10px; -} - -.confirm-screen-wrapper > .confirm-memo-wrapper { - margin: 0; -} - -.confirm-screen-header { - height: 88px; - background-color: $athens-grey; - position: relative; - display: flex; - justify-content: center; - align-items: center; - font-size: 22px; - line-height: 29px; - width: 100%; - padding: 25px 0; - flex: 0 0 auto; - - @media screen and (max-width: $break-small) { - font-size: 20px; - } -} - -.confirm-screen-header-tip { - height: 25px; - width: 25px; - background: $athens-grey; - position: absolute; - transform: rotate(45deg); - top: 71px; - left: 0; - right: 0; - margin: 0 auto; -} - -.confirm-screen-title { - line-height: 27px; - - @media screen and (max-width: $break-small) { - margin-left: 22px; - margin-right: 8px; - } -} - -.confirm-screen-back-button { - color: $curious-blue; - font-family: Roboto; - font-size: 1rem; - position: absolute; - top: 38px; - right: 38px; - background: none; -} - -.confirm-screen-account-wrapper { - display: flex; - flex-direction: column; - align-items: center; -} - -.confirm-screen-account-name { - margin-top: 12px; - font-size: 14px; - line-height: 19px; - color: $scorpion; - text-align: center; -} - -.confirm-screen-row-info { - font-size: 16px; - line-height: 21px; -} - -.confirm-screen-account-number { - font-size: 10px; - line-height: 16px; - color: $dusty-gray; - text-align: center; - height: 16px; -} - -.confirm-send-ether, -.confirm-send-token { - i.fa-arrow-right { - align-self: start; - margin: 24px 14px 0 !important; - } -} - -.confirm-screen-identicons { - margin-top: 24px; - flex: 0 0 auto; - - i.fa-arrow-right { - align-self: start; - margin: 42px 14px 0; - } - - i.fa-file-text-o { - font-size: 60px; - margin: 16px 8px 0 8px; - text-align: center; - } -} - -.confirm-screen-sending-to-message { - text-align: center; - font-size: 16px; - margin-top: 30px; - font-family: 'DIN NEXT Light'; -} - -.confirm-screen-send-amount { - color: $scorpion; - margin-top: 12px; - text-align: center; - font-size: 40px; - line-height: 53px; - flex: 0 0 auto; -} - -.confirm-screen-send-amount-currency { - font-size: 20px; - line-height: 20px; - text-align: center; - flex: 0 0 auto; -} - -.confirm-memo-wrapper { - min-height: 24px; - width: 100%; - border-bottom: 1px solid $alto; - flex: 0 0 auto; -} - -.confirm-screen-send-memo { - color: $scorpion; - font-size: 16px; - line-height: 19px; - font-weight: 400; -} - -.confirm-screen-label { - font-size: 16px; - line-height: 40px; - color: $scorpion; - text-align: left; -} - -section .confirm-screen-account-name, -section .confirm-screen-account-number, -.confirm-screen-row-info, -.confirm-screen-row-detail { - text-align: left; -} - -.confirm-screen-rows { - display: flex; - flex-flow: column nowrap; - width: 100%; - flex: 0 0 auto; -} - -.confirm-screen-section-column { - flex: .5; -} - -.confirm-screen-row { - display: flex; - flex-flow: row nowrap; - width: 100%; - align-items: center; - padding: 12px; - padding-left: 35px; - font-size: 16px; - line-height: 22px; - - &:not(:last-of-type) { - border-bottom: 1px solid $alto; - } -} - -@media screen and (max-width: 379px) { - .confirm-screen-row { - span.confirm-screen-section-column { - flex: 0.4; - } - - div.confirm-screen-section-column { - flex: 0.6; - } - - .currency-display__input { - font-size: 14px; - } - } -} - -.confirm-screen-row-detail { - font-size: 12px; - line-height: 16px; - color: $dusty-gray; -} - -.confirm-screen-total-box { - background-color: $wild-sand; - position: relative; - - .confirm-screen-label { - line-height: 21px; - } - - .confirm-screen-row-detail { - color: $scorpion; - } - - &__subtitle { - font-size: 12px; - line-height: 16px; - } - - .confirm-screen-row-info { - font-size: 16px; - font-weight: 500; - line-height: 21px; - } -} - -.confirm-screen-error { - font-size: 12px; - line-height: 12px; - color: #f00; - position: absolute; - right: 12px; - width: 80px; - text-align: right; -} - -.confirm-screen-row.confirm-screen-total-box { - .confirm-screen-section-column--with-error { - flex: 0.6; - } -} - -@media screen and (max-width: 379px) { - .confirm-screen-row.confirm-screen-total-box { - .confirm-screen-section-column--with-error { - flex: 0.4; - } - } -} - -.confirm-screen-form { - position: relative; - - .confirm-screen-error { - right: 0; - width: 100%; - margin-top: 7px; - text-align: center; - } -} - -.confirm-screen-confirm-button { - height: 50px; - border-radius: 4px; - background-color: #02c9b1; - font-size: 16px; - color: $white; - text-align: center; - font-family: Roboto; - padding-top: 15px; - padding-bottom: 15px; - border-width: 0; - box-shadow: none; - flex: 1 0 auto; - margin: 0 5px; -} - -.btn-light.confirm-screen-cancel-button { - height: 50px; - background: none; - border: none; - opacity: 1; - font-family: Roboto; - border-width: 0; - padding-top: 15px; - padding-bottom: 15px; - font-size: 16px; - box-shadow: none; - cursor: pointer; - flex: 1 0 auto; - margin: 0 5px; -} diff --git a/ui/app/css/itcss/components/currency-display.scss b/ui/app/css/itcss/components/currency-display.scss deleted file mode 100644 index b1a74dce22d4..000000000000 --- a/ui/app/css/itcss/components/currency-display.scss +++ /dev/null @@ -1,87 +0,0 @@ -.currency-display { - height: 54px; - border: 1px solid $alto; - border-radius: 4px; - background-color: $white; - color: $scorpion; - font-family: Roboto; - font-size: 16px; - padding: 8px 10px; - position: relative; - - &__primary-row { - display: flex; - } - - &__input { - color: $scorpion; - font-family: Roboto; - font-size: 16px; - line-height: 22px; - border: none; - outline: 0 !important; - max-width: 22ch; - } - - &__primary-currency { - color: $scorpion; - font-weight: 400; - font-family: Roboto; - font-size: 16px; - line-height: 22px; - } - - &__converted-row { - display: flex; - } - - &__converted-value, - &__converted-currency { - color: $dusty-gray; - font-family: Roboto; - font-size: 12px; - line-height: 12px; - } - - &__input-wrapper { - position: relative; - display: flex; - flex: 1; - max-width: 100%; - - input[type="number"] { - -moz-appearance: textfield; - } - - input[type="number"]::-webkit-inner-spin-button { - -webkit-appearance: none; - -moz-appearance: none; - display: none; - } - - input[type="number"]:hover::-webkit-inner-spin-button { - -webkit-appearance: none; - -moz-appearance: none; - display: none; - } - } - - &__currency-symbol { - margin-top: 1px; - color: $scorpion; - } - - .react-numeric-input { - input[type="number"]::-webkit-inner-spin-button { - -webkit-appearance: none; - -moz-appearance: none; - display: none; - } - - input[type="number"]:hover::-webkit-inner-spin-button { - -webkit-appearance: none; - -moz-appearance: none; - display: none; - } - } -} diff --git a/ui/app/css/itcss/components/footer.scss b/ui/app/css/itcss/components/footer.scss deleted file mode 100644 index 000a53eed847..000000000000 --- a/ui/app/css/itcss/components/footer.scss +++ /dev/null @@ -1,4 +0,0 @@ -.app-footer { - padding-bottom: 10px; - align-items: center; -} diff --git a/ui/app/css/itcss/components/gas-slider.scss b/ui/app/css/itcss/components/gas-slider.scss deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/ui/app/css/itcss/components/index.scss b/ui/app/css/itcss/components/index.scss index 3d426a33cf2c..c0bba546ad47 100644 --- a/ui/app/css/itcss/components/index.scss +++ b/ui/app/css/itcss/components/index.scss @@ -1,55 +1,6 @@ -@import '../../../components/ui/button/buttons'; - -@import './footer.scss'; - -@import './network.scss'; - -@import './modal.scss'; - -@import './alert.scss'; - -@import './newui-sections.scss'; - -@import './account-dropdown.scss'; - -@import './send.scss'; - -@import './confirm.scss'; - -@import './loading-overlay.scss'; - -// Balances -@import './wallet-balance.scss'; +@import './network'; +@import './newui-sections'; +@import './send'; // Tx List and Sections -@import './transaction-list.scss'; - -@import './sections.scss'; - -@import './token-list.scss'; - -@import './currency-display.scss'; - -@import './menu.scss'; - -@import './gas-slider.scss'; - -@import './tab-bar.scss'; - -@import './simple-dropdown.scss'; - -@import './request-signature.scss'; - -@import './account-details-dropdown.scss'; - -@import './account-dropdown-mini.scss'; - -@import './editable-label.scss'; - -@import './pages/index.scss'; - -@import './new-account.scss'; - -@import './tooltip.scss'; - -@import '../../../components/app/index'; +@import './simple-dropdown'; diff --git a/ui/app/css/itcss/components/loading-overlay.scss b/ui/app/css/itcss/components/loading-overlay.scss deleted file mode 100644 index a99c58a23880..000000000000 --- a/ui/app/css/itcss/components/loading-overlay.scss +++ /dev/null @@ -1,61 +0,0 @@ -.loading-overlay { - left: 0; - z-index: 51; - position: fixed; - flex-direction: column; - display: flex; - justify-content: center; - align-items: center; - flex: 1 1 auto; - width: 100%; - height: 100%; - background: rgba(255, 255, 255, .8); - - &__screen-content { - display: flex; - flex-direction: column; - align-items: center; - } - - &__container { - position: absolute; - top: 33%; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - } - - &__message { - margin-top: 32px; - font-weight: 400; - font-size: 20px; - color: $manatee; - } - - &__error-screen { - display: flex; - flex-direction: column; - align-items: center; - height: 160px; - justify-content: space-evenly; - } - - &__error-buttons { - display: flex; - flex-direction: row; - - button { - margin: 5px; - } - } - - &__emoji { - font-size: 32px; - } -} - -.spinner { - height: 58px; - width: 58px; -} diff --git a/ui/app/css/itcss/components/menu.scss b/ui/app/css/itcss/components/menu.scss deleted file mode 100644 index 7d71ea799254..000000000000 --- a/ui/app/css/itcss/components/menu.scss +++ /dev/null @@ -1,63 +0,0 @@ -.menu { - border-radius: 4px; - background: rgba($black, .8); - box-shadow: rgba($black, .15) 0 2px 2px 2px; - min-width: 150px; - color: $white; - - &__item { - padding: 18px; - display: flex; - flex-flow: row wrap; - align-items: center; - position: relative; - z-index: 201; - - @media screen and (max-width: 575px) { - padding: 14px; - } - - &--clickable { - cursor: pointer; - - &:hover { - background-color: rgba($white, .05); - } - - &:active { - background-color: rgba($white, .1); - } - } - - &__icon { - height: 16px; - width: 16px; - margin-right: 14px; - } - - &__text { - font-size: 16px; - line-height: 21px; - } - - &__subtext { - font-size: 12px; - padding: 5px 0px 0px 30px; - } - } - - &__divider { - background-color: $scorpion; - width: 100%; - height: 1px; - } - - &__close-area { - position: fixed; - width: 100%; - height: 100%; - top: 0; - left: 0; - z-index: 100; - } -} diff --git a/ui/app/css/itcss/components/modal.scss b/ui/app/css/itcss/components/modal.scss deleted file mode 100644 index 9c0a5cf61343..000000000000 --- a/ui/app/css/itcss/components/modal.scss +++ /dev/null @@ -1,867 +0,0 @@ -.modal > div:focus { - outline: none !important; -} - -// Buy Modal -.buy-modal-content { - flex-direction: column; - align-items: center; - justify-content: center; - text-align: center; - font-family: Roboto; - padding: 0 16px; -} - -.buy-modal-content-option { - cursor: pointer; - color: #5B5D67; -} - -.qr-ellip-address, .ellip-address { - width: 247px; - border: none; - font-family: Roboto; - font-size: 14px; -} - -@media screen and (max-width: 575px) { - .buy-modal-content-title-wrapper { - justify-content: space-around; - width: 100%; - height: 100px; - } - - .buy-modal-content-title { - font-size: 26px; - margin-top: 15px; - } - - .buy-modal-content-options { - flex-direction: column; - padding: 5% 33%; - } - - .buy-modal-content-footer { - text-transform: uppercase; - width: 100%; - height: 50px; - } - - div.buy-modal-content-option { - display: flex; - flex-direction: column; - width: 80vw; - height: 15vh; - margin: 10px; - text-align: center; - border-radius: 6px; - border: 1px solid $black; - padding: 0% 7%; - justify-content: center; - - div.buy-modal-content-option-title { - font-size: 20px; - } - - div.buy-modal-content-option-subtitle { - font-size: 16px; - } - } -} - -@media screen and (min-width: 576px) { - .buy-modal-content-title-wrapper { - justify-content: space-around; - width: 100%; - height: 110px; - } - - .buy-modal-content-title { - font-size: 26px; - margin-top: 15px; - } - - .buy-modal-content-footer { - text-transform: uppercase; - width: 100%; - height: 50px; - } - - .buy-modal-content-options { - flex-direction: row; - margin: 20px 0 60px; - } - - div.buy-modal-content-option { - display: flex; - flex-direction: column; - width: 20vw; - height: 120px; - text-align: center; - border-radius: 6px; - border: 1px solid $black; - margin: 0 8px; - padding: 18px 0; - - div.buy-modal-content-option-title { - font-size: 20px; - margin-bottom: 12px; - - @media screen and (max-width: 679px) { - font-size: 14px; - } - - @media screen and (min-width: 1281px) { - font-size: 20px; - } - } - - div.buy-modal-content-option-subtitle { - font-size: 16px; - padding: 0 10px; - height: 25%; - - @media screen and (max-width: 679px) { - font-size: 10px; - padding: 0 10px; - margin-bottom: 5px; - line-height: 15px; - } - - @media screen and (min-width: 680px) { - font-size: 14px; - padding: 0 4px; - margin-bottom: 2px; - } - - @media screen and (min-width: 1281px) { - font-size: 16px; - padding: 0; - } - } - - div.buy-modal-content-footer { - margin-top: 8vh; - } - } -} - -// Edit Account Name Modal -.edit-account-name-modal-content { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: center; - position: relative; -} - -.edit-account-name-modal-cancel { - position: absolute; - top: 12px; - right: 20px; - font-size: 25px; -} - -.edit-account-name-modal-title { - margin: 15px; -} - -.edit-account-name-modal-save-button { - width: 33%; - height: 45px; - margin: 15px; - font-weight: 700; - margin-top: 25px; -} - -.edit-account-name-modal-input { - width: 90%; - height: 50px; - text-align: left; - margin: 10px; - padding: 10px; - font-size: 18px; -} - -// Account Modal Container -.account-modal-container { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: center; - position: relative; - padding: 5px 0 31px 0; - border: 1px solid $silver; - border-radius: 4px; - font-family: Roboto; - - button { - cursor: pointer; - } -} - -.account-modal-back { - color: $dusty-gray; - position: absolute; - top: 13px; - left: 17px; - cursor: pointer; - - &__text { - margin-top: 2px; - font-family: Roboto; - font-size: 14px; - line-height: 18px; - } -} - -.account-modal-close::after { - content: '\00D7'; - font-size: 40px; - color: $dusty-gray; - position: absolute; - top: 10px; - right: 12px; - cursor: pointer; -} - -.account-modal-container .identicon { - position: relative; - left: 0; - right: 0; - margin: 0 auto; - top: -32px; - margin-bottom: -32px; -} - - -// Account Details Modal - -.account-modal-container { - - .qr-header { - margin-top: 9px; - font-size: 20px; - } - - .qr-wrapper { - margin-top: 5px; - } - - .ellip-address-wrapper { - display: flex; - justify-content: center; - border: 1px solid $alto; - padding: 5px 10px; - font-family: Roboto; - margin-top: 7px; - width: 286px; - } - - .account-modal__button { - margin-top: 17px; - padding: 10px 22px; - width: 286px; - } -} - -.account-modal-divider { - width: 100%; - height: 1px; - margin: 19px 0 8px 0; - background-color: $alto; -} - -// Export Private Key Modal - -.account-modal-container .account-name { - margin-top: 9px; - font-size: 20px; -} - -.account-modal-container .modal-body-title { - margin-top: 16px; - margin-bottom: 16px; - font-size: 18px; -} - -.account-modal__name { - margin-top: 9px; - font-size: 20px; -} - -.private-key-password { - display: flex; - flex-direction: column; -} - -.private-key-password-label, .private-key-password-error { - color: $scorpion; - font-size: 14px; - line-height: 18px; - margin-bottom: 10px; -} - -.private-key-password-error { - color: $crimson; - margin-bottom: 0; -} - -.private-key-password-input { - padding: 10px 0 13px 17px; - font-size: 16px; - line-height: 21px; - width: 291px; - height: 44px; -} - -.private-key-password::-webkit-input-placeholder { - color: $dusty-gray; - font-family: Roboto; -} - -.private-key-password-warning { - border-radius: 8px; - background-color: #FFF6F6; - font-size: 12px; - font-weight: 500; - line-height: 15px; - color: $crimson; - width: 292px; - padding: 9px 15px; - margin-top: 18px; - font-family: Roboto; -} - -.export-private-key-buttons { - display: flex; - flex-direction: row; - justify-content: center; -} - -.export-private-key__button { - margin-top: 17px; - width: 141px; - min-width: initial; -} - -.export-private-key__button--cancel { - margin-right: 15px; -} - -.private-key-password-display-wrapper { - height: 80px; - width: 291px; - border: 1px solid $silver; - border-radius: 2px; -} - -.private-key-password-display-textarea { - color: $crimson; - font-family: Roboto; - font-size: 16px; - line-height: 21px; - border: none; - height: 75px; - width: 100%; - overflow: hidden; - resize: none; - padding: 9px 13px 8px; - text-transform: uppercase; -} - - -// New Account Modal -.new-account-modal-wrapper { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: center; - position: relative; - border: 1px solid $alto; - box-shadow: 0 0 2px 2px $alto; - font-family: Roboto; -} - -.new-account-modal-header { - background: $wild-sand; - width: 100%; - display: flex; - justify-content: center; - padding: 30px; - font-size: 22px; - color: $nile-blue; - height: 79px; -} - -.modal-close-x::after { - content: '\00D7'; - font-size: 2em; - color: $dusty-gray; - position: absolute; - top: 25px; - right: 17.5px; - font-family: sans-serif; - cursor: pointer; -} - -.new-account-modal-content { - width: 100%; - display: flex; - justify-content: center; - margin-top: 15px; - font-size: 17px; - color: $nile-blue; -} - -.new-account-modal-content.after-input { - margin-top: 15px; - line-height: 25px; -} - -.new-account-input-wrapper { - display: flex; - width: 100%; - justify-content: center; - padding-bottom: 2px; - margin-top: 13px; -} - -.new-account-input { - padding: 15px; - padding-bottom: 20px; - border-radius: 8px; - border: 1px solid $alto; - width: 100%; - font-size: 1em; - color: $dusty-gray; - font-family: Roboto; - font-size: 17px; - margin: 0 60px; -} - -// For reference on below placeholder selectors: https://stackoverflow.com/questions/2610497/change-an-html5-inputs-placeholder-color-with-css -.new-account-input::-webkit-input-placeholder { - color: $dusty-gray; -} - -.new-account-input:-moz-placeholder { - color: $dusty-gray; - opacity: 1; -} - -.new-account-input::-moz-placeholder { - color: $dusty-gray; - opacity: 1; -} - -.new-account-input:-ms-input-placeholder { - color: $dusty-gray; -} - -.new-account-input::-ms-input-placeholder { - color: $dusty-gray; -} - -.new-account-modal-content.button { - margin-top: 22px; - margin-bottom: 30px; - width: 113px; - height: 44px; -} - -.new-account-modal-wrapper .btn-clear { - font-size: 14px; - font-weight: 700; - background: $white; - border: 1px solid; - border-radius: 2px; - color: $tundora; - flex: 1; -} - -// Hide token confirmation - -.hide-token-confirmation { - min-height: 250.72px; - border-radius: 4px; - background-color: $white; - box-shadow: 0 1px 7px 0 rgba(0, 0, 0, .5); - - &__container { - padding: 24px 27px 21px; - display: flex; - flex-direction: column; - align-items: center; - } - - &__identicon { - margin-bottom: 10px; - } - - &__symbol { - color: $tundora; - font-family: Roboto; - font-size: 16px; - line-height: 24px; - text-align: center; - margin-bottom: 7.5px; - } - - &__title { - height: 30px; - width: 271.28px; - color: $tundora; - font-family: Roboto; - font-size: 22px; - line-height: 30px; - text-align: center; - margin-bottom: 10.5px; - } - - &__copy { - height: 41px; - width: 318px; - color: $scorpion; - font-family: Roboto; - font-size: 14px; - line-height: 18px; - text-align: center; - } - - &__buttons { - display: flex; - flex-direction: row; - justify-content: center; - margin-top: 15px; - width: 100%; - } - - &__button { - @include paragraph; - @extend %button; - width: 141px; - margin: 0 5px; - } -} - -//Notification Modal - -.notification-modal { - - &__wrapper { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: center; - position: relative; - border: 1px solid $alto; - box-shadow: 0 0 2px 2px $alto; - font-family: Roboto; - } - - &__header { - background: $wild-sand; - width: 100%; - display: flex; - justify-content: center; - padding: 30px; - font-size: 22px; - color: $nile-blue; - } - - &__message { - padding: 20px; - width: 100%; - display: flex; - justify-content: center; - font-size: 17px; - color: $nile-blue; - } - - &__buttons { - display: flex; - justify-content: space-evenly; - width: 100%; - margin-bottom: 24px; - padding: 0px 42px; - - &__btn { - cursor: pointer; - } - } - - &__link { - color: $curious-blue; - } -} - -// Deposit Ether Modal -.deposit-ether-modal { - border-radius: 8px; - font-family: Roboto; - display: flex; - flex-flow: column; - height: 100%; - - &__header { - width: 100%; - border-radius: 8px 8px 0 0; - background-color: $mid-gray; - display: flex; - position: relative; - padding: 25px; - flex-flow: column; - align-items: flex-start; - - &__title { - color: $white; - font-size: 24px; - line-height: 32px; - } - - &__description { - color: $white; - font-size: 16px; - line-height: 22px; - margin-top: 10px; - } - - &__close::after { - content: '\00D7'; - font-size: 2em; - color: $white; - position: absolute; - top: 20.8px; - right: 28px; - cursor: pointer; - } - } - - &__buy-rows { - width: 100%; - padding: 0 30px; - display: flex; - flex-flow: column nowrap; - flex: 1; - align-items: center; - - @media screen and (max-width: 575px) { - height: 0; - } - - .shapeshift-form-wrapper { - display: flex; - flex-flow: column; - justify-content: center; - align-items: center; - flex: 1 0 auto; - - .shapeshift-form, .modal-shapeshift-form { - border-radius: 8px; - background-color: rgba(0, 0, 0, .05); - padding: 17px 15px; - margin-bottom: 10px; - - &__caret { - width: auto; - flex: 1; - } - } - } - } - - &__logo { - height: 60px; - background-repeat: no-repeat; - background-size: contain; - background-position: center; - width: 100%; - display: flex; - justify-content: center; - align-items: center; - } - - &__buy-row { - border-bottom: 1px solid $alto; - display: flex; - justify-content: space-between; - align-items: center; - flex: 1 0 auto; - padding: 30px 0 20px; - min-height: 170px; - - @media screen and (max-width: 575px) { - min-height: 270px; - flex-flow: column; - justify-content: flex-start; - } - - &__back { - position: absolute; - top: 10px; - left: 0px; - } - - &__shapeshift-buy { - padding-top: 25px; - position: relative; - @media screen and (max-width: 575px) { - display: flex; - justify-content: space-between; - align-items: center; - flex: 1; - padding-bottom: 25px; - flex-flow: column; - justify-content: center; - padding-top: 20px; - min-height: 240px; - border: none; - } - } - - &__logo-container { - display: flex; - justify-content: center; - flex: 0 0 auto; - padding: 0 20px; - - @media screen and (min-width: 576px) { - width: 12rem; - } - - @media screen and (max-width: 575px) { - width: 100%; - max-height: 6rem; - padding-bottom: 20px; - } - } - - &__coinbase-logo { - height: 40px; - } - - &__shapeshift-logo { - height: 60px; - } - - &__right { - display: flex; - } - - &__description { - color: $cape-cod; - padding-bottom: 20px; - align-self: flex-start; - - @media screen and (min-width: 575px) { - width: 15rem; - } - - &__title { - font-size: 20px; - line-height: 30px; - } - - &__text { - font-size: 14px; - line-height: 22px; - margin-top: 7px; - } - } - - &__button { - display: flex; - justify-content: flex-end; - - @media screen and (min-width: 575px) { - min-width: 300px; - } - } - } - - &__buy-row:last-of-type { - border-bottom: 0px; - } - - &__deposit-button, .shapeshift-form__shapeshift-buy-btn { - width: 257px; - } - - .shapeshift-form-wrapper { - display: flex; - flex-flow: column; - justify-content: center; - align-items: center; - margin-top: 28px; - flex: 1 0 auto; - - .shapeshift-form, .modal-shapeshift-form { - border-radius: 8px; - background-color: rgba(0, 0, 0, .05); - padding: 17px 15px; - - &__caret { - width: auto; - flex: 1; - } - } - } - - .shapeshift-form__shapeshift-buy-btn { - margin-top: 10px; - } - - .simple-dropdown { - color: #5B5D67; - font-size: 16px; - line-height: 21px; - border: 1px solid #D8D8D8; - background-color: #FFFFFF; - text-align: center; - width: 100%; - height: 45px; - line-height: 44px; - font-family: Montserrat Light; - } - - .simple-dropdown__selected { - text-align: center; - } -} - -//Notification Modal - -.notification-modal-wrapper { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: center; - position: relative; - border: 1px solid $alto; - box-shadow: 0 0 2px 2px $alto; - font-family: Roboto; -} - -.notification-modal-header { - background: $wild-sand; - width: 100%; - display: flex; - justify-content: center; - align-items: center; - padding: 30px; - font-size: 22px; - color: $nile-blue; -} - -.notification-modal-message { - padding: 20px; -} - -.notification-modal-message { - width: 100%; - display: flex; - justify-content: center; - font-size: 17px; - color: $nile-blue; -} diff --git a/ui/app/css/itcss/components/network.scss b/ui/app/css/itcss/components/network.scss index 4275ffe9284a..31ca8c201654 100644 --- a/ui/app/css/itcss/components/network.scss +++ b/ui/app/css/itcss/components/network.scss @@ -1,5 +1,4 @@ .network-component--disabled { - // border-color: transparent !important; cursor: not-allowed; .fa-caret-down { @@ -15,23 +14,23 @@ display: flex; &.ethereum-network .menu-icon-circle div { - background-color: rgba(3, 135, 137, .7) !important; + background-color: rgba(3, 135, 137, 0.7) !important; } &.ropsten-test-network .menu-icon-circle div { - background-color: rgba(233, 21, 80, .7) !important; + background-color: rgba(233, 21, 80, 0.7) !important; } &.kovan-test-network .menu-icon-circle div { - background-color: rgba(105, 4, 150, .7) !important; + background-color: rgba(105, 4, 150, 0.7) !important; } &.rinkeby-test-network .menu-icon-circle div { - background-color: rgba(235, 179, 63, .7) !important; + background-color: rgba(235, 179, 63, 0.7) !important; } &.goerli-test-network .menu-icon-circle div { - background-color: rgba(48, 153, 242, .7) !important; + background-color: rgba(48, 153, 242, 0.7) !important; } } @@ -45,7 +44,7 @@ .network-indicator { display: flex; align-items: center; - font-size: .6em; + font-size: 0.6em; &__down-arrow { height: 8px; @@ -67,7 +66,6 @@ .network-name { padding: 0 4px; - font-family: Roboto; font-size: 12px; line-height: 14px; flex: 1 1 auto; @@ -76,16 +74,15 @@ white-space: nowrap; text-overflow: ellipsis; overflow: hidden; - height: 16px; } .dropdown-menu-item .fa.delete { - margin-right: 10px; - display: none; + margin-right: 10px; + display: none; } .dropdown-menu-item:hover .fa.delete { - display: inherit; + display: inherit; } .network-droppo { @@ -137,7 +134,7 @@ .menu-icon-circle--active { border: 1px solid $white; - background: rgba(100, 100, 100, .4); + background: rgba(100, 100, 100, 0.4); } .menu-icon-circle div, @@ -169,17 +166,15 @@ height: 25px; width: 120px; color: $white; - font-family: Roboto; font-size: 18px; line-height: 25px; text-align: center; } .network-dropdown-content { - height: 36px; + min-height: 36px; width: 265px; color: $dusty-gray; - font-family: Roboto; font-size: 14px; line-height: 18px; } diff --git a/ui/app/css/itcss/components/new-account.scss b/ui/app/css/itcss/components/new-account.scss deleted file mode 100644 index b3aae8eec80f..000000000000 --- a/ui/app/css/itcss/components/new-account.scss +++ /dev/null @@ -1,538 +0,0 @@ -.new-account { - width: 375px; - background-color: #FFFFFF; - box-shadow: 0 0 7px 0 rgba(0,0,0,0.08); - z-index: 25; - height: 100%; - - &__header { - display: flex; - flex-flow: column; - border-bottom: 1px solid $geyser; - } - - &__title { - color: $tundora; - font-family: Roboto; - font-size: 32px; - font-weight: 500; - line-height: 43px; - margin-top: 22px; - margin-left: 29px; - } - - &__tabs { - margin-left: 22px; - display: flex; - margin-top: 10px; - - &__tab { - height: 54px; - padding: 15px 10px; - color: $dusty-gray; - font-family: Roboto; - font-size: 18px; - line-height: 24px; - text-align: center; - cursor: pointer; - } - - &__tab:hover { - color: $black; - border-bottom: none; - } - - &__selected { - color: $curious-blue; - border-bottom: 3px solid $curious-blue; - cursor: initial; - } - } -} - -.new-account-import-disclaimer { - width: 120%; - background-color: #F4F9FC; - display: inline-block; - align-items: center; - padding: 20px 30px 20px; - font-size: 12px; - line-height: 1.5; -} - -.new-account-import-form { - display: flex; - flex-flow: column; - align-items: center; - padding: 0 30px 30px; - - &__select-section { - display: flex; - justify-content: space-between; - align-items: center; - margin-top: 29px; - width: 100%; - } - - &__select-label { - color: $scorpion; - font-family: Roboto; - font-size: 16px; - line-height: 21px; - } - - &__select { - height: 54px; - width: 210px; - border: 1px solid #D2D8DD; - border-radius: 4px; - background-color: #FFFFFF; - display: flex; - align-items: center; - - .Select-control, - .Select-control:hover { - height: 100%; - border: none; - box-shadow: none; - - .Select-value { - display: flex; - align-items: center; - } - } - } - - &__private-key-password-container { - display: flex; - flex-flow: column; - align-items: center; - width: 100%; - } - - &__instruction { - color: $scorpion; - font-family: Roboto; - font-size: 16px; - line-height: 21px; - align-self: flex-start; - } - - &__private-key { - display: flex; - flex-flow: column; - align-items: flex-start; - margin-top: 34px; - } - - &__input-password { - height: 54px; - width: 315px; - border: 1px solid $geyser; - border-radius: 4px; - background-color: $white; - margin-top: 16px; - color: $scorpion; - font-family: Roboto; - font-size: 16px; - padding: 0px 20px; - } - - &__json { - display: flex; - flex-flow: column; - align-items: center; - margin-top: 29px; - width: 100%; - } - - &__buttons { - margin-top: 39px; - display: flex; - width: 100%; - justify-content: space-between; - } -} - -.hw-tutorial { - width: 375px; - border-top: 1px solid #D2D8DD; - border-bottom: 1px solid #D2D8DD; - overflow: visible; - display: block; - padding: 15px 30px; -} - -.hw-connect { - width: 100%; - - &__header { - &__title { - margin-top: 5px; - margin-bottom: 15px; - font-size: 22px; - } - - &__msg { - font-size: 14px; - color: #9b9b9b; - margin-top: 10px; - margin-bottom: 20px; - } - } - - &__btn-wrapper { - flex: 1; - flex-direction: row; - display: flex; - } - - &__connect-btn { - width: 315px; - margin: 20px; - } - - &__connect-btn.disabled { - cursor: not-allowed; - opacity: .5; - } - - &__btn { - background: #fbfbfb; - border: 1px solid #e5e5e5; - height: 100px; - width: 150px; - flex: 1; - display: flex; - align-items: center; - justify-content: center; - border-radius: 5px; - - &__img { - width: 95px; - } - } - - &__btn.selected { - border: 2px solid #00a8ee; - width: 149px; - } - - &__btn:first-child { - margin-right: 15px; - margin-left: 20px; - } - - &__btn:last-child { - margin-right: 20px; - } - - &__hdPath { - display: flex; - flex-direction: row; - margin-top: 15px; - margin-bottom: 30px; - font-size: 14px; - - &__title { - display: flex; - margin-top: 10px; - margin-right: 15px; - } - - &__select { - display: flex; - flex: 1; - } - } - - &__learn-more { - margin-top: 15px; - font-size: 14px; - color: #5B5D67; - line-height: 19px; - text-align: center; - cursor: pointer; - - &__arrow { - transform: rotate(90deg); - display: block; - text-align: center; - height: 30px; - margin: 0px auto 10px; - } - } - - &__title { - padding-top: 10px; - font-weight: 400; - font-size: 18px; - } - - &__unlock-title { - padding-top: 10px; - font-weight: 400; - font-size: 22px; - margin-bottom: 15px; - } - - &__msg { - font-size: 14px; - color: #9b9b9b; - margin-top: 10px; - margin-bottom: 15px; - } - - &__link { - color: #2f9ae0; - } - - &__footer { - &__title { - padding-top: 15px; - padding-bottom: 12px; - font-weight: 400; - font-size: 18px; - text-align: center; - } - - &__msg { - font-size: 14px; - color: #9b9b9b; - margin-top: 12px; - margin-bottom: 27px; - width: 100%; - display: block; - margin-left: 20px; - } - - &__link { - color: #2f9ae0; - margin-left: 5px; - } - } - - &__get-hw { - width: 100%; - padding-bottom: 10px; - padding-top: 10px; - - &__msg { - font-size: 14px; - color: #9b9b9b; - } - - &__link { - font-size: 14px; - text-align: center; - color: #2f9ae0; - cursor: pointer; - } - } - - &__step-asset { - margin: 0px auto 20px; - display: flex; - } -} - -.hw-account-list { - display: flex; - flex: 1; - flex-flow: column; - width: 100%; - - &__title_wrapper { - display: flex; - flex-direction: row; - flex: 1; - } - - &__title { - margin-bottom: 23px; - align-self: flex-start; - color: $scorpion; - font-family: Roboto; - font-size: 16px; - line-height: 21px; - font-weight: bold; - display: flex; - flex: 1; - } - - &__device { - margin-bottom: 23px; - align-self: flex-end; - color: $scorpion; - font-family: Roboto; - font-size: 16px; - line-height: 21px; - font-weight: normal; - display: flex; - } - - &__item { - font-size: 15px; - flex-direction: row; - display: flex; - padding-left: 10px; - padding-right: 10px; - } - - &__item:nth-of-type(even) { - background-color: #fbfbfb; - } - - &__item:nth-of-type(odd) { - background: rgba(0, 0, 0, 0.03); - } - - &__item:hover { - background-color: rgba(0, 0, 0, 0.06); - } - - &__item__index { - display: flex; - width: 24px; - } - - &__item__radio { - display: flex; - flex: 1; - - input { - padding: 10px; - margin-top: 13px; - } - } - - &__item__label { - display: flex; - flex: 1; - padding-left: 10px; - padding-top: 10px; - padding-bottom: 10px; - } - - &__item__balance { - display: flex; - flex: 1; - justify-content: center; - } - - &__item__link { - display: flex; - margin-top: 13px; - } - - &__item__link img { - width: 15px; - height: 15px; - } -} - -.hw-list-pagination { - display: flex; - align-self: flex-end; - margin-top: 10px; - - &__button { - background: #fff; - height: 19px; - display: flex; - color: #33a4e7; - font-size: 14px; - line-height: 19px; - border: none; - min-width: 46px; - margin-right: 0px; - margin-left: 16px; - padding: 0px; - text-transform: uppercase; - font-family: Roboto; - } -} - -.new-account-connect-form { - display: flex; - flex-flow: column; - align-items: center; - padding: 15px 30px 0; - height: 710px; - overflow: auto; - - &.unsupported-browser { - height: 210px; - } - - &.account-list { - height: auto; - padding-left: 20px; - padding-right: 20px; - } - - &__buttons { - margin-top: 39px; - display: flex; - width: 100%; - justify-content: space-between; - } - - &__button:not(:last-child) { - margin-right: 16px; - } -} - -.hw-forget-device-container { - display: flex; - flex-flow: column; - align-items: center; - padding: 22px; - - a { - color: #2f9ae0; - font-size: 14px; - cursor: pointer; - } -} - -.new-account-create-form { - display: flex; - flex-flow: column; - align-items: center; - padding: 30px; - - &__input-label { - color: $scorpion; - font-family: Roboto; - font-size: 16px; - line-height: 21px; - align-self: flex-start; - } - - &__input { - height: 54px; - width: 315.84px; - border: 1px solid $geyser; - border-radius: 4px; - background-color: $white; - color: $scorpion; - font-family: Roboto; - font-size: 16px; - line-height: 21px; - margin-top: 15px; - padding: 0px 20px; - } - - &__buttons { - margin-top: 39px; - display: flex; - width: 100%; - justify-content: space-between; - } - - &__button { - width: 150px; - min-width: initial; - } -} diff --git a/ui/app/css/itcss/components/newui-sections.scss b/ui/app/css/itcss/components/newui-sections.scss index 9a0b81aedeae..57c1f6d77085 100644 --- a/ui/app/css/itcss/components/newui-sections.scss +++ b/ui/app/css/itcss/components/newui-sections.scss @@ -5,9 +5,6 @@ $sub-mid-size-breakpoint-range: "screen and (min-width: #{$break-large}) and (ma NewUI Container Elements */ -// Component Colors -$wallet-view-bg: $alabaster; - .app { display: flex; flex-direction: column; @@ -19,12 +16,7 @@ $wallet-view-bg: $alabaster; // Main container .main-container { - // position: absolute; z-index: $main-container-z-index; - font-family: Roboto; - display: flex; - flex-wrap: wrap; - align-items: stretch; } .main-container::-webkit-scrollbar { @@ -39,138 +31,6 @@ $wallet-view-bg: $alabaster; width: 100%; } -//Account and transaction details -.account-and-transaction-details { - display: flex; - flex: 1 1 auto; - min-width: 0; -} - -// wallet view and sidebar - -.wallet-view { - display: flex; - flex-direction: column; - flex: 32 1 32%; - width: 0; - background: $wallet-view-bg; - z-index: 200; - position: relative; - - @media screen and (min-width: 576px) { - overflow-y: scroll; - overflow-x: hidden; - } - - @media #{$sub-mid-size-breakpoint-range} { - min-width: 160px; - } - - .wallet-view-account-details { - flex: 0 0 auto; - } - - &__name-container { - flex: 0 0 auto; - cursor: pointer; - width: 100%; - } - - &__keyring-label { - height: 50px; - color: $dusty-gray; - font-family: Roboto; - font-size: 10px; - text-align: right; - padding: 17px 20px 0; - box-sizing: border-box; - } - - &__details-button { - font-size: 10px; - border-radius: 17px; - background-color: transparent; - margin: 0 auto; - padding: 4px 12px; - flex: 0 0 auto; - } - - &__tooltip { - display: flex; - justify-content: center; - align-items: center; - padding: 24px; - } - - &__address { - border-radius: 3px; - background-color: $alto; - color: $scorpion; - font-size: 14px; - line-height: 12px; - padding: 4px 12px; - cursor: pointer; - flex: 0 0 auto; - - &__pressed { - background-color: $manatee, - } - } - - &__sidebar-close { - - @media screen and (max-width: 575px) { - &::after { - content: '\00D7'; - font-size: 40px; - color: $tundora; - position: absolute; - top: 12px; - left: 12px; - cursor: pointer; - } - } - } -} - -@media screen and (min-width: 576px) { - .wallet-view::-webkit-scrollbar { - display: none; - } -} - -.wallet-view-title-wrapper { - flex: 0 0 25px; -} - -.wallet-view-title { - margin-left: 15px; - font-size: 16px; - - // No title on mobile - @media screen and (max-width: 575px) { - display: none; - } -} - -.wallet-view.sidebar-right { - flex: 1 0 230px; - background: rgb(250, 250, 250); - z-index: $sidebar-z-index; - position: fixed; - top: 66px; - left: 0; - right: 0; - bottom: 0; - opacity: 1; - visibility: visible; - will-change: transform; - overflow-y: auto; - box-shadow: rgba(0, 0, 0, .15) 2px 2px 4px; - width: 85%; - height: calc(100% - 56px); -} - // main-container media queries @media screen and (min-width: 576px) { @@ -183,28 +43,26 @@ $wallet-view-bg: $alabaster; } .main-container { - // margin-top: 6.9vh; width: 85vw; - height: 90vh; - box-shadow: 0 0 7px 0 rgba(0, 0, 0, .08); + margin-bottom: 10vh; + min-height: 90vh; + box-shadow: 0 0 7px 0 rgba(0, 0, 0, 0.08); } } @media screen and (min-width: 769px) { .main-container { - // margin-top: 6.9vh; width: 80vw; - height: 82vh; - box-shadow: 0 0 7px 0 rgba(0, 0, 0, .08); + min-height: 82vh; + box-shadow: 0 0 7px 0 rgba(0, 0, 0, 0.08); } } @media screen and (min-width: 1281px) { .main-container { - // margin-top: 6.9vh; width: 62vw; - height: 82vh; - box-shadow: 0 0 7px 0 rgba(0, 0, 0, .08); + min-height: 82vh; + box-shadow: 0 0 7px 0 rgba(0, 0, 0, 0.08); } } @@ -228,27 +86,6 @@ $wallet-view-bg: $alabaster; } } -// wallet view -.account-name { - font-size: 24px; - color: $black; - margin-top: 8px; - margin-bottom: .9rem; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - width: 100%; - padding: 0 8px; - text-align: center; -} - -// account options dropdown -.account-options-menu { - align-items: center; - justify-content: flex-start; - margin: 5% 7% 0%; -} - .fiat-amount { text-transform: uppercase; } @@ -282,7 +119,6 @@ $wallet-view-bg: $alabaster; .unlock-screen-container { z-index: $main-container-z-index; - font-family: Roboto; display: flex; justify-content: center; align-items: center; diff --git a/ui/app/css/itcss/components/pages/index.scss b/ui/app/css/itcss/components/pages/index.scss deleted file mode 100644 index 45e47f447bba..000000000000 --- a/ui/app/css/itcss/components/pages/index.scss +++ /dev/null @@ -1,3 +0,0 @@ -@import './reveal-seed.scss'; - -@import './provider-approval.scss'; diff --git a/ui/app/css/itcss/components/pages/provider-approval.scss b/ui/app/css/itcss/components/pages/provider-approval.scss deleted file mode 100644 index f172165abd09..000000000000 --- a/ui/app/css/itcss/components/pages/provider-approval.scss +++ /dev/null @@ -1,11 +0,0 @@ -.provider_approval_content { - height: auto; - overflow: auto; - padding: 16px; -} - -.provider_approval_origin { - font-weight: 999; - margin-top: 16px; - word-wrap: break-word; -} diff --git a/ui/app/css/itcss/components/pages/reveal-seed.scss b/ui/app/css/itcss/components/pages/reveal-seed.scss deleted file mode 100644 index b8f13af4ae22..000000000000 --- a/ui/app/css/itcss/components/pages/reveal-seed.scss +++ /dev/null @@ -1,17 +0,0 @@ -.reveal-seed { - &__content { - padding: 20px; - } - - &__label { - padding-bottom: 10px; - font-weight: 400; - display: inline-block; - } - - &__error { - color: $crimson; - font-size: 14px; - padding-top: 5px; - } -} diff --git a/ui/app/css/itcss/components/request-signature.scss b/ui/app/css/itcss/components/request-signature.scss deleted file mode 100644 index 6c950d846b46..000000000000 --- a/ui/app/css/itcss/components/request-signature.scss +++ /dev/null @@ -1,231 +0,0 @@ -.request-signature { - &__container { - width: 380px; - border-radius: 8px; - background-color: $white; - box-shadow: 0 2px 4px 0 rgba(0,0,0,0.08); - display: flex; - flex-flow: column nowrap; - z-index: 25; - align-items: center; - font-family: Roboto; - position: relative; - height: 100%; - - @media screen and (max-width: $break-small) { - width: 100%; - top: 0; - box-shadow: none; - } - - @media screen and (min-width: $break-large) { - height: 620px; - } - } - - &__typed-container { - padding: 17px; - - h1 { - font-weight: 900; - margin-bottom: 5px; - } - - * { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - - > div { - margin-bottom: 10px; - } - } - - &__header { - height: 64px; - width: 100%; - position: relative; - display: flex; - flex-flow: column; - justify-content: center; - align-items: center; - flex: 0 0 auto; - } - - &__header-background { - position: absolute; - background-color: $athens-grey; - z-index: 2; - width: 100%; - height: 100%; - } - - &__header__text { - color: #5B5D67; - font-family: Roboto; - font-size: 22px; - line-height: 29px; - z-index: 3; - } - - &__header__tip-container { - width: 100%; - display: flex; - justify-content: center; - } - - &__header__tip { - height: 25px; - width: 25px; - background: $athens-grey; - transform: rotate(45deg); - position: absolute; - bottom: -8px; - z-index: 1; - } - - &__account-info { - display: flex; - justify-content: space-between; - margin-top: 18px; - margin-bottom: 20px; - } - - &__account { - color: $dusty-gray; - margin-left: 17px; - } - - &__account-text { - font-size: 14px; - } - - &__balance { - color: $dusty-gray; - margin-right: 17px; - width: 124px; - } - - &__balance-text { - text-align: right; - font-size: 14px; - } - - &__balance-value { - text-align: right; - margin-top: 2.5px; - } - - &__request-icon { - margin-top: 25px; - } - - &__body { - width: 100%; - height: 100%; - display: flex; - flex-flow: column; - flex: 1 1 auto; - height: 0; - } - - &__request-info { - display: flex; - justify-content: center; - } - - &__headline { - height: 48px; - width: 240px; - color: $tundora; - font-family: Roboto; - font-size: 18px; - line-height: 24px; - text-align: center; - margin-top: 20px; - } - - &__notice, - &__warning { - font-family: "Avenir Next"; - font-size: 14px; - line-height: 19px; - text-align: center; - margin-top: 41px; - margin-bottom: 11px; - width: 100%; - } - - &__notice { - color: $dusty-gray; - } - - &__warning { - color: $crimson; - } - - &__rows { - height: 100%; - overflow-y: scroll; - overflow-x: hidden; - border-top: 1px solid $geyser; - display: flex; - flex-flow: column; - } - - &__row { - display: flex; - flex-flow: column; - flex: 1 0 auto; - } - - &__row-title { - width: 80px; - color: $dusty-gray; - font-family: Roboto; - font-size: 16px; - line-height: 22px; - margin-top: 12px; - margin-left: 18px; - width: 100%; - } - - &__row-value { - color: $scorpion; - font-family: Roboto; - font-size: 14px; - line-height: 19px; - width: 100%; - overflow-wrap: break-word; - border-bottom: 1px solid #d2d8dd; - padding: 6px 18px 15px; - white-space: pre-line; - } - - &__help-link { - cursor: pointer; - text-decoration: underline; - color: $curious-blue; - } - - &__footer { - width: 100%; - display: flex; - align-items: center; - justify-content: center; - font-size: 22px; - position: relative; - flex: 0 0 auto; - border-top: 1px solid $geyser; - padding: 1.6rem; - - button { - width: 165px; - } - - &__cancel-button { - margin-right: 1.2rem; - } - } -} diff --git a/ui/app/css/itcss/components/sections.scss b/ui/app/css/itcss/components/sections.scss deleted file mode 100644 index feec71c89546..000000000000 --- a/ui/app/css/itcss/components/sections.scss +++ /dev/null @@ -1,441 +0,0 @@ -// Old scss, do not lint - clean up later -/* stylelint-disable */ - - -/* -App Sections - TODO: Move into separate files. -*/ - -/* initialize */ -textarea.twelve-word-phrase { - padding: 12px; - width: 300px; - height: 140px; - font-size: 16px; - background: $white; - resize: none; -} - -.initialize-screen { - width: 100%; - z-index: $main-container-z-index; - background: #f7f7f7; -} - -.initialize-screen hr { - width: 60px; - margin: 12px; - border-color: #f7861c; - border-style: solid; -} - -.initialize-screen label { - margin-top: 20px; -} - -.initialize-screen button.create-vault { - margin-top: 40px; -} - -.initialize-screen .warning { - font-size: 14px; - margin: 0 16px; -} - -/* unlock */ -.error { - // color: #e20202; - color: #f7861c; - margin-bottom: 9px; -} - -.warning { - color: #ffae00; -} - -.lock { - width: 50px; - height: 50px; -} - -.lock.locked { - transform: scale(1.5); - opacity: 0; - transition: opacity 400ms ease-in, transform 400ms ease-in; -} - -.lock.unlocked { - transform: scale(1); - opacity: 1; - transition: opacity 500ms ease-out, transform 500ms ease-out, background 200ms ease-in; -} - -.lock.locked .lock-top { - transform: scaleX(1) translateX(0); - transition: transform 250ms ease-in; -} - -.lock.unlocked .lock-top { - transform: scaleX(-1) translateX(-12px); - transition: transform 250ms ease-in; -} - -.lock.unlocked:hover { - border-radius: 4px; - background: #e5e5e5; - border: 1px solid #b1b1b1; -} - -.lock.unlocked:active { - background: #c3c3c3; -} - -.section-title .fa-arrow-left { - margin: -2px 8px 0px -8px; -} - -.sizing-input { - font-size: 14px; - height: 30px; - padding-left: 5px; -} - -.editable-label { - display: flex; -} - -/* accounts */ - -.accounts-section { - margin: 0 0px; -} - -.accounts-section .horizontal-line { - margin: 0 18px; -} - -.accounts-list-option { - height: 120px; -} - -.accounts-list-option .identicon-wrapper { - width: 100px; -} - -.unconftx-link { - margin-top: 24px; - cursor: pointer; -} - -.unconftx-link .fa-arrow-right { - margin: 0 -8px 0px 8px; -} - -/* identity panel */ - -.identity-panel { - font-weight: 500; -} - -.identity-panel .identicon-wrapper { - margin: 4px; - margin-top: 8px; - display: flex; - align-items: center; -} - -.identity-panel .identicon-wrapper span { - margin: 0 auto; -} - -.identity-panel .identity-data { - margin: 8px 8px 8px 18px; -} - -.identity-panel i { - margin-top: 32px; - margin-right: 6px; - color: #b9b9b9; -} - -.identity-panel .arrow-right { - padding-left: 18px; - width: 42px; - min-width: 18px; - height: 100%; -} - -.identity-copy.flex-column { - flex: .25 0 auto; - justify-content: center; -} - -/* accounts screen */ - -.identity-section { -} - -.identity-section .identity-panel { - background: #e9e9e9; - border-bottom: 1px solid #b1b1b1; - cursor: pointer; -} - -.identity-section .identity-panel.selected { - background: $white; - color: #f3c83e; -} - -.identity-section .identity-panel.selected .identicon { - border-color: $orange; -} - -.identity-section .accounts-list-option:hover, -.identity-section .accounts-list-option.selected { - background: $white; -} - -/* account detail screen */ - -.account-detail-section { - display: flex; - flex-wrap: wrap; - overflow-y: auto; - flex-direction: inherit; -} - -.grow-tenx { - flex-grow: 10; -} - -.name-label { -} - -.unapproved-tx-icon { - height: 16px; - width: 16px; - background: rgb(47, 174, 244); - border-color: $silver-chalice; - border-radius: 13px; -} - -.edit-text { - height: 100%; - visibility: hidden; -} - -.editing-label { - display: flex; - justify-content: flex-start; - margin-left: 50px; - margin-bottom: 2px; - font-size: 11px; - text-rendering: geometricPrecision; - color: #f7861c; -} - -.name-label:hover .edit-text { - visibility: visible; -} -/* tx confirm */ - -.unconftx-section input[type=password] { - height: 22px; - padding: 2px; - margin: 12px; - margin-bottom: 24px; - border-radius: 4px; - border: 2px solid #f3c83e; - background: #faf6f0; -} - -/* Ether Balance Widget */ - -.ether-balance-amount { - color: #f7861c; -} - -.ether-balance-label { - color: #aba9aa; -} - -/* Info screen */ -.info-gray { - font-family: Roboto; - text-transform: uppercase; - color: $silver-chalice; -} - -.icon-size { - width: 20px; -} - -.info { - font-family: Roboto, Arial; - padding-bottom: 10px; - display: inline-block; - padding-left: 5px; -} - -/* buy eth warning screen */ -.custom-radios { - justify-content: space-around; - align-items: center; -} - -.custom-radio-selected { - width: 17px; - height: 17px; - border: solid; - border-style: double; - border-radius: 15px; - border-width: 5px; - background: rgba(247, 134, 28, 1); - border-color: #f7f7f7; -} - -.custom-radio-inactive { - width: 14px; - height: 14px; - border: solid; - border-width: 1px; - border-radius: 24px; - border-color: $silver-chalice; -} - -.radio-titles { - color: rgba(247, 134, 28, 1); -} - -.eth-warning { - transition: opacity 400ms ease-in, transform 400ms ease-in; -} - -.buy-subview { - transition: opacity 400ms ease-in, transform 400ms ease-in; -} - -.input-container:hover .edit-text { - visibility: visible; -} - -.buy-inputs { - font-family: Roboto; - font-size: 13px; - height: 20px; - background: transparent; - box-sizing: border-box; - border: solid; - border-color: transparent; - border-width: .5px; - border-radius: 2px; -} - -.input-container:hover .buy-inputs { - box-sizing: inherit; - border: solid; - border-color: #f7861c; - border-width: .5px; - border-radius: 2px; -} - -.buy-inputs:focus { - border: solid; - border-color: #f7861c; - border-width: .5px; - border-radius: 2px; -} - -.activeForm { - background: #f7f7f7; - border: none; - border-radius: 8px 8px 0px 0px; - width: 50%; - text-align: center; - padding-bottom: 4px; -} - -.inactiveForm { - border: none; - border-radius: 8px 8px 0px 0px; - width: 50%; - text-align: center; - padding-bottom: 4px; -} - -.ex-coins { - font-family: Roboto; - text-transform: uppercase; - text-align: center; - font-size: 33px; - width: 118px; - height: 42px; - padding: 1px; - color: #4d4d4d; -} - -.marketinfo { - font-family: Roboto; - color: $silver-chalice; - font-size: 15px; - line-height: 17px; -} - -#fromCoin::-webkit-calendar-picker-indicator { - display: none; -} - -#coinList { - width: 400px; - height: 500px; - overflow: scroll; -} - -.icon-control .fa-refresh { - visibility: hidden; -} - -.icon-control:hover .fa-refresh { - visibility: visible; -} - -.icon-control:hover .fa-chevron-right { - visibility: hidden; -} - -.inactive { - color: $silver-chalice; -} - -.inactive button { - background: $silver-chalice; - color: $white; -} - -.qr-ellip-address, .ellip-address { - overflow: hidden; - text-overflow: ellipsis; -} - -.qr-header { - font-size: 25px; - margin-top: 40px; -} - -.qr-message { - font-size: 12px; - color: #f7861c; -} - -div.message-container > div:first-child { - margin-top: 18px; - font-size: 15px; - color: #4d4d4d; -} - -.pop-hover:hover { - transform: scale(1.1); -} - -/* stylelint-enable */ diff --git a/ui/app/css/itcss/components/send.scss b/ui/app/css/itcss/components/send.scss index c1a7381b67c0..df18572cd196 100644 --- a/ui/app/css/itcss/components/send.scss +++ b/ui/app/css/itcss/components/send.scss @@ -2,7 +2,6 @@ display: flex; flex-flow: column nowrap; z-index: 25; - font-family: Roboto; @media screen and (max-width: $break-small) { width: 100%; @@ -16,10 +15,9 @@ .send-screen-card { background-color: #fff; - box-shadow: 0 2px 4px 0 rgba(0, 0, 0, .08); + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08); padding: 46px 40.5px 26px; position: relative; - // top: -26px; align-items: center; display: flex; flex-flow: column nowrap; @@ -50,7 +48,7 @@ width: 70px; height: 70px; border: 1px solid $alto; - box-shadow: 0 0 4px 0 rgba(0, 0, 0, .2); + box-shadow: 0 0 4px 0 rgba(0, 0, 0, 0.2); position: absolute; top: -35px; z-index: 25; @@ -77,7 +75,6 @@ margin: 4px 0 20px; font-size: 16px; line-height: 22.4px; - font-family: Roboto; } .send-screen-gas-input { @@ -150,7 +147,7 @@ .currency-toggle { &__item { - color: $curious-blue; + color: $primary-blue; cursor: pointer; &--selected { @@ -161,7 +158,7 @@ } .send-screen-gas-input-customize { - color: $curious-blue; + color: $primary-blue; font-size: 12px; cursor: pointer; } @@ -187,7 +184,6 @@ padding: 13px 19px; font-size: 16px; border-radius: 4px; - font-family: "Lato"; font-weight: 500; } @@ -272,7 +268,7 @@ display: flex; flex-direction: column; color: #9b9b9b; - font-size: .8em; + font-size: 0.8em; padding: 1px 4px; cursor: pointer; } @@ -308,7 +304,7 @@ } &__send-button__disabled { - opacity: .5; + opacity: 0.5; cursor: auto; } } @@ -317,16 +313,14 @@ display: flex; flex-flow: column nowrap; z-index: 25; - font-family: Roboto; &__content { width: 498px; height: 605px; background-color: #fff; - box-shadow: 0 2px 4px 0 rgba(0, 0, 0, .08); + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08); padding: 46px 40.5px 26px; position: relative; - // top: -26px; align-items: center; display: flex; flex-flow: column nowrap; @@ -401,16 +395,14 @@ .send-v2 { &__container { - // height: 701px; width: 380px; border-radius: 8px; background-color: $white; - box-shadow: 0 2px 4px 0 rgba(0, 0, 0, .08); + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08); display: flex; flex-flow: column nowrap; z-index: 25; align-items: center; - font-family: Roboto; position: relative; @media screen and (max-width: $break-small) { @@ -536,8 +528,6 @@ } &__form { - padding: 10px 0 25px; - @media screen and (max-width: $break-small) { margin: 0; flex: 1 1 auto; @@ -553,7 +543,7 @@ } &__form-row { - margin: 8px 18px 0px; + margin: 1rem 1rem 0; position: relative; display: flex; flex-flow: row; @@ -570,7 +560,6 @@ &__form-field { flex: 1 1 auto; min-width: 0; - max-width: 277px; .currency-display { color: $tundora; @@ -594,7 +583,6 @@ &__form-label { color: $scorpion; - font-family: Roboto; font-size: 16px; line-height: 22px; width: 95px; @@ -608,7 +596,6 @@ border: 1px solid $alto; border-radius: 4px; background-color: $white; - font-family: Roboto; line-height: 16px; font-size: 12px; color: $tundora; @@ -631,7 +618,7 @@ border: 1px solid $geyser; border-radius: 4px; background-color: $white; - box-shadow: 0 3px 6px 0 rgba(0 ,0 ,0 ,.11); + box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.11); margin-top: 11px; margin-left: -1px; overflow-y: scroll; @@ -646,6 +633,17 @@ height: 54px; border: none; + &__single-asset { + display: flex; + flex-flow: row nowrap; + align-items: center; + padding: 8px 8px; + + &:hover { + background-color: rgba($alto, 0.2); + } + } + &__asset { display: flex; flex-flow: row nowrap; @@ -668,6 +666,7 @@ display: flex; flex-flow: column nowrap; margin-left: 8px; + flex-grow: 1; } &__symbol { @@ -681,7 +680,7 @@ font-size: 12px; &__label { - margin-right: .25rem; + margin-right: 0.25rem; } } @@ -697,7 +696,7 @@ border: 1px solid $geyser; border-radius: 4px; background-color: $white; - box-shadow: 0 3px 6px 0 rgba(0 ,0 ,0 ,.11); + box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.11); top: 65px; left: 0; box-sizing: content-box; @@ -722,6 +721,7 @@ .send-v2__asset-dropdown__asset { height: 100%; + &:hover { background-color: $white; } @@ -738,42 +738,13 @@ background-color: $white; color: $tundora; padding: 10px; - font-family: Roboto; font-size: 16px; line-height: 21px; } } - &__to-autocomplete { - position: relative; - - &__down-caret { - z-index: 1026; - position: absolute; - top: 18px; - right: 12px; - } - - &__qr-code { - z-index: 1026; - position: absolute; - top: 13px; - right: 33px; - cursor: pointer; - padding: 8px 5px 5px; - border-radius: 4px; - } - - &__qr-code:hover { - background: #f1f1f1; - } - - &__input.with-qr { - padding-right: 65px; - } - } - - &__to-autocomplete, &__memo-text-area, &__hex-data { + &__memo-text-area, + &__hex-data { &__input { z-index: 1025; position: relative; @@ -784,14 +755,12 @@ background-color: $white; color: $tundora; padding: 10px; - font-family: Roboto; font-size: 16px; line-height: 21px; } } &__amount-max { - font-family: Roboto; font-size: 12px; position: relative; display: inline-block; @@ -803,7 +772,7 @@ width: 56px; height: 20px; position: absolute; - border: 2px solid #B0D7F2; + border: 2px solid #b0d7f2; border-radius: 6px; cursor: pointer; top: 0; @@ -816,14 +785,14 @@ color: #2f9ae0; &__disabled { - color: #B0D7F2; + color: #b0d7f2; cursor: auto; } } input:checked + &__button { - background-color: #037DD6; - border: 2px solid #037DD6; + background-color: $primary-blue; + border: 2px solid $primary-blue; color: #fff; } } @@ -843,7 +812,6 @@ display: flex; align-items: center; } - } &__sliders-icon-container { @@ -852,7 +820,7 @@ justify-content: center; height: 24px; width: 24px; - border: 1px solid $curious-blue; + border: 1px solid $primary-blue; border-radius: 4px; background-color: $white; position: absolute; @@ -863,7 +831,7 @@ } &__sliders-icon { - color: $curious-blue; + color: $primary-blue; } &__memo-text-area { @@ -891,11 +859,10 @@ } &__customize-gas { - border: 1px solid #D8D8D8; + border: 1px solid #d8d8d8; border-radius: 4px; - background-color: #FFFFFF; - box-shadow: 0 2px 4px 0 rgba(0,0,0,0.14); - font-family: Roboto; + background-color: #fff; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.14); display: flex; flex-flow: column; @@ -925,7 +892,6 @@ content: '\00D7'; font-size: 1.8em; color: $dusty-gray; - font-family: sans-serif; cursor: pointer; margin-right: 19.25px; } @@ -966,7 +932,10 @@ margin-right: 21.25px; } - &__revert, &__cancel, &__save, &__save__error { + &__revert, + &__cancel, + &__save, + &__save__error { display: flex; justify-content: center; align-items: center; @@ -980,7 +949,9 @@ margin-left: 21.25px; } - &__cancel, &__save, &__save__error { + &__cancel, + &__save, + &__save__error { width: 85.74px; min-width: initial; } @@ -1017,7 +988,6 @@ &__title { height: 26px; color: $tundora; - font-family: Roboto; font-size: 20px; line-height: 26px; margin-top: 17px; @@ -1027,7 +997,6 @@ height: 38px; width: 314px; color: $tundora; - font-family: Roboto; font-size: 14px; line-height: 19px; margin-top: 17px; @@ -1051,7 +1020,7 @@ border-left: 1px solid #dadada; font-size: 18px; color: $tundora; - right: 0px; + right: 0; padding: 0; display: flex; justify-content: space-around; @@ -1077,7 +1046,6 @@ display: none; } } - } .advanced-gas-options-btn { @@ -1095,7 +1063,7 @@ justify-content: center; height: 24px; width: 24px; - border: 1px solid $curious-blue; + border: 1px solid $primary-blue; border-radius: 4px; background-color: $white; position: absolute; @@ -1119,9 +1087,8 @@ font-size: 1em; font-size: 14px; color: #2f9ae0; - font-family: Roboto; } .sliders-icon { - color: $curious-blue; + color: $primary-blue; } diff --git a/ui/app/css/itcss/components/simple-dropdown.scss b/ui/app/css/itcss/components/simple-dropdown.scss index a21095a3efae..d815de8df884 100644 --- a/ui/app/css/itcss/components/simple-dropdown.scss +++ b/ui/app/css/itcss/components/simple-dropdown.scss @@ -30,8 +30,8 @@ border: 1px solid #d2d8dd; border-radius: 4px; background-color: #fff; - -webkit-box-shadow: 0 3px 6px 0 rgba(0, 0, 0, .11); - box-shadow: 0 3px 6px 0 rgba(0, 0, 0, .11); + -webkit-box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.11); + box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.11); margin-top: 10px; overflow-y: scroll; left: 0; diff --git a/ui/app/css/itcss/components/tab-bar.scss b/ui/app/css/itcss/components/tab-bar.scss deleted file mode 100644 index bb9f8f261ed9..000000000000 --- a/ui/app/css/itcss/components/tab-bar.scss +++ /dev/null @@ -1,75 +0,0 @@ -.tab-bar { - display: flex; - flex-direction: column; - justify-content: flex-start; -} - -.tab-bar__tab { - display: flex; - flex-flow: row nowrap; - align-items: flex-start; - min-width: 0; - flex: 0 0 auto; - box-sizing: border-box; - font-size: 16px; - padding: 16px 24px; - opacity: .5; - transition: opacity 200ms ease-in-out; - - @media screen and (min-width: 576px) { - &:hover { - opacity: .4; - } - - &:active { - opacity: .6; - } - } - - @media screen and (max-width: 575px) { - font-size: 18px; - padding: 24px; - border-bottom: 1px solid $alto; - opacity: 1; - } - - &__content { - flex: 1 1 auto; - width: 0; - - &__description { - display: none; - - @media screen and (max-width: 575px) { - display: block; - font-size: 14px; - font-weight: 300; - margin-top: 8px; - min-height: 14px; - } - } - } - - &__caret { - display: none; - - @media screen and (max-width: 575px) { - display: block; - background-image: url('/images/caret-right.svg'); - width: 36px; - height: 36px; - opacity: .5; - background-size: contain; - background-repeat: no-repeat; - background-position: center; - } - } - - &--active { - opacity: 1 !important; - } -} - -.tab-bar__grow-tab { - flex-grow: 1; -} diff --git a/ui/app/css/itcss/components/token-list.scss b/ui/app/css/itcss/components/token-list.scss deleted file mode 100644 index 49d0c290e7ef..000000000000 --- a/ui/app/css/itcss/components/token-list.scss +++ /dev/null @@ -1,124 +0,0 @@ -$wallet-balance-breakpoint: 890px; -$wallet-balance-breakpoint-range: "screen and (min-width: #{$break-large}) and (max-width: #{$wallet-balance-breakpoint})"; - -.token-list-item { - display: flex; - flex-flow: row nowrap; - align-items: center; - padding: 20px 24px; - cursor: pointer; - transition: linear 200ms; - background-color: rgba($wallet-balance-bg, 0); - position: relative; - flex: 1; - min-width: 0; - - &__token-balance { - margin-right: 4px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - min-width: 0; - max-width: 100%; - } - - &__token-balance, &__token-symbol { - font-size: 1.5rem; - flex: 0 0 auto; - - @media #{$wallet-balance-breakpoint-range} { - font-size: 95%; - } - } - - &__fiat-amount { - margin-top: .25%; - font-size: 105%; - width: 100%; - text-transform: uppercase; - - @media #{$wallet-balance-breakpoint-range} { - font-size: 95%; - } - } - - @media #{$wallet-balance-breakpoint-range} { - padding: 10% 4%; - } - - &--active { - background-color: $manatee; - color: $white; - } - - &__identicon { - margin-right: 15px; - border: '1px solid #dedede'; - min-width: 50px; - - @media #{$wallet-balance-breakpoint-range} { - margin-right: 4%; - } - } - - &__balance-ellipsis { - display: flex; - align-items: center; - min-width: 0; - flex: 1; - } - - &__ellipsis { - line-height: 45px; - margin-left: 5px; - } - - &__balance-wrapper { - flex: 1; - flex-flow: row wrap; - display: flex; - min-width: 0; - } -} - -.token-menu-dropdown { - width: 80%; - position: absolute; - top: 52px; - right: 25px; - z-index: 2000; - - @media #{$wallet-balance-breakpoint-range} { - right: 18px; - } - - &__close-area { - position: fixed; - top: 0; - left: 0; - z-index: 2100; - width: 100%; - height: 100%; - cursor: default; - } - - &__container { - padding: 16px; - z-index: 2200; - position: relative; - } - - &__options { - display: flex; - flex-direction: column; - justify-content: center; - } - - &__option { - color: $white; - font-family: Roboto; - font-size: 16px; - line-height: 21px; - text-align: center; - } -} \ No newline at end of file diff --git a/ui/app/css/itcss/components/tooltip.scss b/ui/app/css/itcss/components/tooltip.scss deleted file mode 100644 index 78325865ed3f..000000000000 --- a/ui/app/css/itcss/components/tooltip.scss +++ /dev/null @@ -1,7 +0,0 @@ -.metamask-tooltip { - padding: 5px !important; -} - -// needed for react-tippy -// copied from node_modules/react-tippy/dist/tippy.css -.tippy-touch{cursor:pointer!important}.tippy-notransition{transition:none!important}.tippy-popper{max-width:400px;-webkit-perspective:800px;perspective:800px;z-index:9999;outline:0;transition-timing-function:cubic-bezier(.165,.84,.44,1);pointer-events:none}.tippy-popper.html-template{max-width:96%;max-width:calc(100% - 20px)}.tippy-popper[x-placement^=top] [x-arrow]{border-top:7px solid #333;border-right:7px solid transparent;border-left:7px solid transparent;bottom:-7px;margin:0 9px}.tippy-popper[x-placement^=top] [x-arrow].arrow-small{border-top:5px solid #333;border-right:5px solid transparent;border-left:5px solid transparent;bottom:-5px}.tippy-popper[x-placement^=top] [x-arrow].arrow-big{border-top:10px solid #333;border-right:10px solid transparent;border-left:10px solid transparent;bottom:-10px}.tippy-popper[x-placement^=top] [x-circle]{-webkit-transform-origin:0 33%;transform-origin:0 33%}.tippy-popper[x-placement^=top] [x-circle].enter{-webkit-transform:scale(1) translate(-50%,-55%);transform:scale(1) translate(-50%,-55%);opacity:1}.tippy-popper[x-placement^=top] [x-circle].leave{-webkit-transform:scale(.15) translate(-50%,-50%);transform:scale(.15) translate(-50%,-50%);opacity:0}.tippy-popper[x-placement^=top] .tippy-tooltip.light-theme [x-circle]{background-color:#fff}.tippy-popper[x-placement^=top] .tippy-tooltip.light-theme [x-arrow]{border-top:7px solid #fff;border-right:7px solid transparent;border-left:7px solid transparent}.tippy-popper[x-placement^=top] .tippy-tooltip.light-theme [x-arrow].arrow-small{border-top:5px solid #fff;border-right:5px solid transparent;border-left:5px solid transparent}.tippy-popper[x-placement^=top] .tippy-tooltip.light-theme [x-arrow].arrow-big{border-top:10px solid #fff;border-right:10px solid transparent;border-left:10px solid transparent}.tippy-popper[x-placement^=top] .tippy-tooltip.transparent-theme [x-circle]{background-color:rgba(0,0,0,.7)}.tippy-popper[x-placement^=top] .tippy-tooltip.transparent-theme [x-arrow]{border-top:7px solid rgba(0,0,0,.7);border-right:7px solid transparent;border-left:7px solid transparent}.tippy-popper[x-placement^=top] .tippy-tooltip.transparent-theme [x-arrow].arrow-small{border-top:5px solid rgba(0,0,0,.7);border-right:5px solid transparent;border-left:5px solid transparent}.tippy-popper[x-placement^=top] .tippy-tooltip.transparent-theme [x-arrow].arrow-big{border-top:10px solid rgba(0,0,0,.7);border-right:10px solid transparent;border-left:10px solid transparent}.tippy-popper[x-placement^=top] [data-animation=perspective]{-webkit-transform-origin:bottom;transform-origin:bottom}.tippy-popper[x-placement^=top] [data-animation=perspective].enter{opacity:1;-webkit-transform:translateY(-10px) rotateX(0);transform:translateY(-10px) rotateX(0)}.tippy-popper[x-placement^=top] [data-animation=perspective].leave{opacity:0;-webkit-transform:translateY(0) rotateX(90deg);transform:translateY(0) rotateX(90deg)}.tippy-popper[x-placement^=top] [data-animation=fade].enter{opacity:1;-webkit-transform:translateY(-10px);transform:translateY(-10px)}.tippy-popper[x-placement^=top] [data-animation=fade].leave{opacity:0;-webkit-transform:translateY(-10px);transform:translateY(-10px)}.tippy-popper[x-placement^=top] [data-animation=shift].enter{opacity:1;-webkit-transform:translateY(-10px);transform:translateY(-10px)}.tippy-popper[x-placement^=top] [data-animation=shift].leave{opacity:0;-webkit-transform:translateY(0);transform:translateY(0)}.tippy-popper[x-placement^=top] [data-animation=scale].enter{opacity:1;-webkit-transform:translateY(-10px) scale(1);transform:translateY(-10px) scale(1)}.tippy-popper[x-placement^=top] [data-animation=scale].leave{opacity:0;-webkit-transform:translateY(0) scale(0);transform:translateY(0) scale(0)}.tippy-popper[x-placement^=bottom] [x-arrow]{border-bottom:7px solid #333;border-right:7px solid transparent;border-left:7px solid transparent;top:-7px;margin:0 9px}.tippy-popper[x-placement^=bottom] [x-arrow].arrow-small{border-bottom:5px solid #333;border-right:5px solid transparent;border-left:5px solid transparent;top:-5px}.tippy-popper[x-placement^=bottom] [x-arrow].arrow-big{border-bottom:10px solid #333;border-right:10px solid transparent;border-left:10px solid transparent;top:-10px}.tippy-popper[x-placement^=bottom] [x-circle]{-webkit-transform-origin:0 -50%;transform-origin:0 -50%}.tippy-popper[x-placement^=bottom] [x-circle].enter{-webkit-transform:scale(1) translate(-50%,-45%);transform:scale(1) translate(-50%,-45%);opacity:1}.tippy-popper[x-placement^=bottom] [x-circle].leave{-webkit-transform:scale(.15) translate(-50%,-5%);transform:scale(.15) translate(-50%,-5%);opacity:0}.tippy-popper[x-placement^=bottom] .tippy-tooltip.light-theme [x-circle]{background-color:#fff}.tippy-popper[x-placement^=bottom] .tippy-tooltip.light-theme [x-arrow]{border-bottom:7px solid #fff;border-right:7px solid transparent;border-left:7px solid transparent}.tippy-popper[x-placement^=bottom] .tippy-tooltip.light-theme [x-arrow].arrow-small{border-bottom:5px solid #fff;border-right:5px solid transparent;border-left:5px solid transparent}.tippy-popper[x-placement^=bottom] .tippy-tooltip.light-theme [x-arrow].arrow-big{border-bottom:10px solid #fff;border-right:10px solid transparent;border-left:10px solid transparent}.tippy-popper[x-placement^=bottom] .tippy-tooltip.transparent-theme [x-circle]{background-color:rgba(0,0,0,.7)}.tippy-popper[x-placement^=bottom] .tippy-tooltip.transparent-theme [x-arrow]{border-bottom:7px solid rgba(0,0,0,.7);border-right:7px solid transparent;border-left:7px solid transparent}.tippy-popper[x-placement^=bottom] .tippy-tooltip.transparent-theme [x-arrow].arrow-small{border-bottom:5px solid rgba(0,0,0,.7);border-right:5px solid transparent;border-left:5px solid transparent}.tippy-popper[x-placement^=bottom] .tippy-tooltip.transparent-theme [x-arrow].arrow-big{border-bottom:10px solid rgba(0,0,0,.7);border-right:10px solid transparent;border-left:10px solid transparent}.tippy-popper[x-placement^=bottom] [data-animation=perspective]{-webkit-transform-origin:top;transform-origin:top}.tippy-popper[x-placement^=bottom] [data-animation=perspective].enter{opacity:1;-webkit-transform:translateY(10px) rotateX(0);transform:translateY(10px) rotateX(0)}.tippy-popper[x-placement^=bottom] [data-animation=perspective].leave{opacity:0;-webkit-transform:translateY(0) rotateX(-90deg);transform:translateY(0) rotateX(-90deg)}.tippy-popper[x-placement^=bottom] [data-animation=fade].enter{opacity:1;-webkit-transform:translateY(10px);transform:translateY(10px)}.tippy-popper[x-placement^=bottom] [data-animation=fade].leave{opacity:0;-webkit-transform:translateY(10px);transform:translateY(10px)}.tippy-popper[x-placement^=bottom] [data-animation=shift].enter{opacity:1;-webkit-transform:translateY(10px);transform:translateY(10px)}.tippy-popper[x-placement^=bottom] [data-animation=shift].leave{opacity:0;-webkit-transform:translateY(0);transform:translateY(0)}.tippy-popper[x-placement^=bottom] [data-animation=scale].enter{opacity:1;-webkit-transform:translateY(10px) scale(1);transform:translateY(10px) scale(1)}.tippy-popper[x-placement^=bottom] [data-animation=scale].leave{opacity:0;-webkit-transform:translateY(0) scale(0);transform:translateY(0) scale(0)}.tippy-popper[x-placement^=left] [x-arrow]{border-left:7px solid #333;border-top:7px solid transparent;border-bottom:7px solid transparent;right:-7px;margin:6px 0}.tippy-popper[x-placement^=left] [x-arrow].arrow-small{border-left:5px solid #333;border-top:5px solid transparent;border-bottom:5px solid transparent;right:-5px}.tippy-popper[x-placement^=left] [x-arrow].arrow-big{border-left:10px solid #333;border-top:10px solid transparent;border-bottom:10px solid transparent;right:-10px}.tippy-popper[x-placement^=left] [x-circle]{-webkit-transform-origin:50% 0;transform-origin:50% 0}.tippy-popper[x-placement^=left] [x-circle].enter{-webkit-transform:scale(1) translate(-50%,-50%);transform:scale(1) translate(-50%,-50%);opacity:1}.tippy-popper[x-placement^=left] [x-circle].leave{-webkit-transform:scale(.15) translate(-50%,-50%);transform:scale(.15) translate(-50%,-50%);opacity:0}.tippy-popper[x-placement^=left] .tippy-tooltip.light-theme [x-circle]{background-color:#fff}.tippy-popper[x-placement^=left] .tippy-tooltip.light-theme [x-arrow]{border-left:7px solid #fff;border-top:7px solid transparent;border-bottom:7px solid transparent}.tippy-popper[x-placement^=left] .tippy-tooltip.light-theme [x-arrow].arrow-small{border-left:5px solid #fff;border-top:5px solid transparent;border-bottom:5px solid transparent}.tippy-popper[x-placement^=left] .tippy-tooltip.light-theme [x-arrow].arrow-big{border-left:10px solid #fff;border-top:10px solid transparent;border-bottom:10px solid transparent}.tippy-popper[x-placement^=left] .tippy-tooltip.transparent-theme [x-circle]{background-color:rgba(0,0,0,.7)}.tippy-popper[x-placement^=left] .tippy-tooltip.transparent-theme [x-arrow]{border-left:7px solid rgba(0,0,0,.7);border-top:7px solid transparent;border-bottom:7px solid transparent}.tippy-popper[x-placement^=left] .tippy-tooltip.transparent-theme [x-arrow].arrow-small{border-left:5px solid rgba(0,0,0,.7);border-top:5px solid transparent;border-bottom:5px solid transparent}.tippy-popper[x-placement^=left] .tippy-tooltip.transparent-theme [x-arrow].arrow-big{border-left:10px solid rgba(0,0,0,.7);border-top:10px solid transparent;border-bottom:10px solid transparent}.tippy-popper[x-placement^=left] [data-animation=perspective]{-webkit-transform-origin:right;transform-origin:right}.tippy-popper[x-placement^=left] [data-animation=perspective].enter{opacity:1;-webkit-transform:translateX(-10px) rotateY(0);transform:translateX(-10px) rotateY(0)}.tippy-popper[x-placement^=left] [data-animation=perspective].leave{opacity:0;-webkit-transform:translateX(0) rotateY(-90deg);transform:translateX(0) rotateY(-90deg)}.tippy-popper[x-placement^=left] [data-animation=fade].enter{opacity:1;-webkit-transform:translateX(-10px);transform:translateX(-10px)}.tippy-popper[x-placement^=left] [data-animation=fade].leave{opacity:0;-webkit-transform:translateX(-10px);transform:translateX(-10px)}.tippy-popper[x-placement^=left] [data-animation=shift].enter{opacity:1;-webkit-transform:translateX(-10px);transform:translateX(-10px)}.tippy-popper[x-placement^=left] [data-animation=shift].leave{opacity:0;-webkit-transform:translateX(0);transform:translateX(0)}.tippy-popper[x-placement^=left] [data-animation=scale].enter{opacity:1;-webkit-transform:translateX(-10px) scale(1);transform:translateX(-10px) scale(1)}.tippy-popper[x-placement^=left] [data-animation=scale].leave{opacity:0;-webkit-transform:translateX(0) scale(0);transform:translateX(0) scale(0)}.tippy-popper[x-placement^=right] [x-arrow]{border-right:7px solid #333;border-top:7px solid transparent;border-bottom:7px solid transparent;left:-7px;margin:6px 0}.tippy-popper[x-placement^=right] [x-arrow].arrow-small{border-right:5px solid #333;border-top:5px solid transparent;border-bottom:5px solid transparent;left:-5px}.tippy-popper[x-placement^=right] [x-arrow].arrow-big{border-right:10px solid #333;border-top:10px solid transparent;border-bottom:10px solid transparent;left:-10px}.tippy-popper[x-placement^=right] [x-circle]{-webkit-transform-origin:-50% 0;transform-origin:-50% 0}.tippy-popper[x-placement^=right] [x-circle].enter{-webkit-transform:scale(1) translate(-50%,-50%);transform:scale(1) translate(-50%,-50%);opacity:1}.tippy-popper[x-placement^=right] [x-circle].leave{-webkit-transform:scale(.15) translate(-50%,-50%);transform:scale(.15) translate(-50%,-50%);opacity:0}.tippy-popper[x-placement^=right] .tippy-tooltip.light-theme [x-circle]{background-color:#fff}.tippy-popper[x-placement^=right] .tippy-tooltip.light-theme [x-arrow]{border-right:7px solid #fff;border-top:7px solid transparent;border-bottom:7px solid transparent}.tippy-popper[x-placement^=right] .tippy-tooltip.light-theme [x-arrow].arrow-small{border-right:5px solid #fff;border-top:5px solid transparent;border-bottom:5px solid transparent}.tippy-popper[x-placement^=right] .tippy-tooltip.light-theme [x-arrow].arrow-big{border-right:10px solid #fff;border-top:10px solid transparent;border-bottom:10px solid transparent}.tippy-popper[x-placement^=right] .tippy-tooltip.transparent-theme [x-circle]{background-color:rgba(0,0,0,.7)}.tippy-popper[x-placement^=right] .tippy-tooltip.transparent-theme [x-arrow]{border-right:7px solid rgba(0,0,0,.7);border-top:7px solid transparent;border-bottom:7px solid transparent}.tippy-popper[x-placement^=right] .tippy-tooltip.transparent-theme [x-arrow].arrow-small{border-right:5px solid rgba(0,0,0,.7);border-top:5px solid transparent;border-bottom:5px solid transparent}.tippy-popper[x-placement^=right] .tippy-tooltip.transparent-theme [x-arrow].arrow-big{border-right:10px solid rgba(0,0,0,.7);border-top:10px solid transparent;border-bottom:10px solid transparent}.tippy-popper[x-placement^=right] [data-animation=perspective]{-webkit-transform-origin:left;transform-origin:left}.tippy-popper[x-placement^=right] [data-animation=perspective].enter{opacity:1;-webkit-transform:translateX(10px) rotateY(0);transform:translateX(10px) rotateY(0)}.tippy-popper[x-placement^=right] [data-animation=perspective].leave{opacity:0;-webkit-transform:translateX(0) rotateY(90deg);transform:translateX(0) rotateY(90deg)}.tippy-popper[x-placement^=right] [data-animation=fade].enter{opacity:1;-webkit-transform:translateX(10px);transform:translateX(10px)}.tippy-popper[x-placement^=right] [data-animation=fade].leave{opacity:0;-webkit-transform:translateX(10px);transform:translateX(10px)}.tippy-popper[x-placement^=right] [data-animation=shift].enter{opacity:1;-webkit-transform:translateX(10px);transform:translateX(10px)}.tippy-popper[x-placement^=right] [data-animation=shift].leave{opacity:0;-webkit-transform:translateX(0);transform:translateX(0)}.tippy-popper[x-placement^=right] [data-animation=scale].enter{opacity:1;-webkit-transform:translateX(10px) scale(1);transform:translateX(10px) scale(1)}.tippy-popper[x-placement^=right] [data-animation=scale].leave{opacity:0;-webkit-transform:translateX(0) scale(0);transform:translateX(0) scale(0)}.tippy-popper .tippy-tooltip.transparent-theme{background-color:rgba(0,0,0,.7)}.tippy-popper .tippy-tooltip.transparent-theme[data-animatefill]{background-color:transparent}.tippy-popper .tippy-tooltip.light-theme{color:#26323d;box-shadow:0 4px 20px 4px rgba(0,20,60,.1),0 4px 80px -8px rgba(0,20,60,.2);background-color:#fff}.tippy-popper .tippy-tooltip.light-theme[data-animatefill]{background-color:transparent}.tippy-tooltip{position:relative;color:#fff;border-radius:4px;font-size:.95rem;padding:.4rem .8rem;text-align:center;will-change:transform;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-color:#333}.tippy-tooltip--small{padding:.25rem .5rem;font-size:.8rem}.tippy-tooltip--big{padding:.6rem 1.2rem;font-size:1.2rem}.tippy-tooltip[data-animatefill]{overflow:hidden;background-color:transparent}.tippy-tooltip[data-interactive]{pointer-events:auto}.tippy-tooltip[data-inertia]{transition-timing-function:cubic-bezier(.53,2,.36,.85)}.tippy-tooltip [x-arrow]{position:absolute;width:0;height:0}.tippy-tooltip [x-circle]{position:absolute;will-change:transform;background-color:#333;border-radius:50%;width:130%;width:calc(110% + 2rem);left:50%;top:50%;z-index:-1;overflow:hidden;transition:all ease}.tippy-tooltip [x-circle]:before{content:"";padding-top:90%;float:left}@media (max-width:450px){.tippy-popper{max-width:96%;max-width:calc(100% - 20px)}} diff --git a/ui/app/css/itcss/components/transaction-list.scss b/ui/app/css/itcss/components/transaction-list.scss deleted file mode 100644 index 3435353d9dc4..000000000000 --- a/ui/app/css/itcss/components/transaction-list.scss +++ /dev/null @@ -1,315 +0,0 @@ -.tx-list-container { - height: 87.5%; - - @media screen and (min-width: $break-large) { - overflow-y: scroll; - } -} - -.tx-list-header-wrapper { - flex: 0 0 auto; -} - -.tx-list-header { - text-transform: capitalize; -} - -@media screen and (max-width: $break-small) { - .tx-list-header-wrapper { - margin-top: .2em; - margin-bottom: .6em; - // TODO: Resolve Layout Conflicst in Wallet View - // - This fixes txlist "transactions" title dispay - // margin-top: 0.2em; - // margin-bottom: 0.6em; - justify-content: center; - flex: 0 0 auto; - } - - .tx-list-header { - align-self: center; - font-size: 12px; - color: $dusty-gray; - font-family: Roboto; - text-transform: uppercase; - } -} - -@media screen and (min-width: $break-large) { - .tx-list-header { - font-size: 16px; - margin: 1.1em 2.37em .8em; - } - - .tx-list-container::-webkit-scrollbar { - display: none; - } -} - -.tx-list-content-divider { - height: 1px; - background: rgb(231, 231, 231); - flex: 0 0 1px; - - @media screen and (max-width: $break-small) { - margin: .1em 0; - } - - @media screen and (min-width: $break-large) { - margin: .1em 2.37em; - } -} - -.tx-list-item-wrapper { - flex: 1 1 auto; - width: 0; - align-items: stretch; - justify-content: flex-start; - display: flex; - flex-flow: column nowrap; - - @media screen and (max-width: $break-small) { - padding: 0 1.3em .8em; - } - - @media screen and (min-width: $break-large) { - padding-bottom: 8px; - } -} - -.tx-list-clickable { - cursor: pointer; - - &:hover { - background: rgba($alto, .2); - } -} - -.tx-list-pending-item-container { - cursor: pointer; - opacity: .5; -} - -.tx-list-date-wrapper { - margin-top: 6px; - flex: 1 1 auto; -} - -.tx-list-content-wrapper { - align-items: stretch; - margin: 4px 0; - flex: 1 0 auto; - width: 100%; - display: flex; - flex-flow: row nowrap; - - @media screen and (max-width: $break-small) { - font-size: 12px; - - .tx-list-status { - font-size: 12px !important; - } - - .tx-list-account { - font-size: 14px !important; - } - - .tx-list-value { - font-size: 14px; - line-height: 18px; - } - - .tx-list-fiat-value { - font-size: 12px; - line-height: 22px; - } - } -} - -.tx-list-item-retry-container { - background: #d1edff; - width: 100%; - border-radius: 12px; - font-size: .75rem; - display: flex; - justify-content: center; - margin-left: 44px; - width: calc(100% - 44px); - padding: 4px; - cursor: pointer; - - @media screen and (min-width: 576px) and (max-width: 679px) { - flex-flow: column; - align-items: center; - } - - @media screen and (min-width: 380px) and (max-width: 575px) { - flex-flow: row; - } - - @media screen and (max-width: 379px) { - flex-flow: column; - align-items: center; - } -} - -.tx-list-item-retry-link { - text-decoration: underline; - margin-left: 6px; - cursor: pointer; - - @media screen and (min-width: 576px) and (max-width: 679px) { - margin-left: 0px; - } - - @media screen and (min-width: 380px) and (max-width: 575px) { - margin-left: 6px; - } - - @media screen and (max-width: 379px) { - margin-left: 0px; - text-align: center; - } -} - -.tx-list-date { - color: $dusty-gray; - font-size: 12px; - font-family: Roboto; -} - -.tx-list-identicon-wrapper { - align-self: center; - flex: 0 0 auto; - margin-right: 16px; - display: flex; -} - -.tx-list-account-and-status-wrapper { - display: flex; - flex: 1 1 auto; - flex-flow: row wrap; - width: 0; - - @media screen and (max-width: $break-small) { - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - align-self: center; - - .tx-list-account-wrapper { - height: 18px; - - .tx-list-account { - line-height: 14px; - } - } - } - - @media screen and (min-width: $break-large) { - flex-direction: row; - justify-content: flex-start; - align-items: center; - - .tx-list-account-wrapper { - flex: 1.3 2 auto; - min-width: 153px; - } - - .tx-list-status-wrapper { - flex: 6 6 auto; - } - } - - .tx-list-account { - font-size: 16px; - color: $scorpion; - } - - .tx-list-status { - color: $dusty-gray; - font-size: 16px; - text-transform: capitalize; - } - - .tx-list-status--rejected, - .tx-list-status--failed { - color: $monzo; - } - - .tx-list-status--dropped { - opacity: 0.5; - } -} - -.tx-list-item { - border-bottom: 1px solid $geyser; - flex: 0 0 auto; - display: flex; - flex-flow: row nowrap; - - @media screen and (max-width: $break-small) { - // margin: 0 1.3em .95em; !important - } - - @media screen and (min-width: $break-large) { - padding: 0 2.37em; - } - - &:last-of-type { - border-bottom: 1px solid rgb(231, 231, 231); - margin-bottom: 32px; - } - - &__wrapper { - align-self: center; - flex: 2 2 auto; - color: $dusty-gray; - - .tx-list-value { - font-size: 16px; - text-align: right; - } - - .tx-list-value--confirmed { - color: $caribbean-green; - } - - .tx-list-fiat-value { - font-size: 12px; - text-align: right; - } - } - - &--empty { - text-align: center; - border-bottom: none !important; - padding: 16px; - } -} - -.tx-list-details-wrapper { - overflow: hidden; - flex: 0 0 35%; -} - -.tx-list-value { - font-size: 16px; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} - -.tx-list-fiat-value { - font-size: 12px; - line-height: initial; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} - -.tx-list-value--confirmed { - color: $caribbean-green; -} diff --git a/ui/app/css/itcss/components/wallet-balance.scss b/ui/app/css/itcss/components/wallet-balance.scss deleted file mode 100644 index 3c3349ae0b6d..000000000000 --- a/ui/app/css/itcss/components/wallet-balance.scss +++ /dev/null @@ -1,73 +0,0 @@ -$wallet-balance-bg: #e7e7e7; -$wallet-balance-breakpoint: 890px; -$wallet-balance-breakpoint-range: "screen and (min-width: #{$break-large}) and (max-width: #{$wallet-balance-breakpoint})"; - -.wallet-balance-wrapper { - flex: 0 0 auto; - transition: linear 200ms; - background: rgba($wallet-balance-bg, 0); - - &--active { - background: $manatee; - color: $white; - } -} - -.wallet-balance { - background: inherit; - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - flex: 0 0 auto; - cursor: pointer; - border-top: 1px solid $wallet-balance-bg; - - .balance-container { - display: flex; - justify-content: flex-start; - align-items: center; - margin: 20px 24px; - flex-direction: row; - min-width: 0; - - @media #{$wallet-balance-breakpoint-range} { - margin: 10% 4%; - } - } - - .balance-display { - margin-left: 15px; - min-width: 0; - - .token-amount { - font-size: 1.5rem; - } - - .fiat-amount { - margin-top: .25%; - font-size: 105%; - } - - @media #{$wallet-balance-breakpoint-range} { - margin-left: 4%; - - .token-amount { - font-size: 105%; - } - - .fiat-amount { - font-size: 95%; - } - } - } -} - -.balance-icon { - border-radius: 25px; - width: 50px; - height: 50px; - border: 1px solid $alto; - padding: 5px; - background: $white; -} diff --git a/ui/app/css/itcss/generic/index.scss b/ui/app/css/itcss/generic/index.scss deleted file mode 100644 index 8b282aa1e48c..000000000000 --- a/ui/app/css/itcss/generic/index.scss +++ /dev/null @@ -1,124 +0,0 @@ -/* - Generic - */ - -@import './reset.scss'; - -* { - box-sizing: border-box; -} - -html, -body { - font-family: Roboto, Arial; - color: #4d4d4d; - font-weight: 400; - background: #f7f7f7; - width: 100%; - height: 100%; - margin: 0; - padding: 0; - font-size: 16px; - - @media screen and (max-width: $break-small) { - overflow-y: overlay; - } -} - -html { - min-height: 500px; -} - -.app-root { - overflow: hidden; - position: relative; -} - -.app-primary { - display: flex; -} - -input:focus, -textarea:focus { - outline: none; -} - -/* stylelint-disable */ -#app-content { - overflow-x: hidden; - height: 100%; - display: flex; - flex-direction: column; - - @media screen and (max-width: $break-small) { - background-color: $white; - } -} -/* stylelint-enable */ - -a { - text-decoration: none; - color: inherit; -} - -a:hover { - color: #df6b0e; -} - -input.large-input, -textarea.large-input { - padding: 8px; -} - -input.large-input { - height: 36px; -} - -.allcaps { - text-transform: uppercase; -} - -.input-label { - padding-bottom: 10px; - font-weight: 400; - display: inline-block; -} - -input.form-control { - padding-left: 10px; - font-size: 14px; - height: 40px; - border: 1px solid $alto; - border-radius: 3px; - width: 100%; - - &::-webkit-input-placeholder { - font-weight: 100; - color: $dusty-gray; - } - - &::-moz-placeholder { - font-weight: 100; - color: $dusty-gray; - } - - &:-ms-input-placeholder { - font-weight: 100; - color: $dusty-gray; - } - - &:-moz-placeholder { - font-weight: 100; - color: $dusty-gray; - } - - &--error { - border: 1px solid $monzo; - } -} - -.hide-text-overflow { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} diff --git a/ui/app/css/itcss/objects/index.scss b/ui/app/css/itcss/objects/index.scss deleted file mode 100644 index 22077568207a..000000000000 --- a/ui/app/css/itcss/objects/index.scss +++ /dev/null @@ -1 +0,0 @@ -// Objects diff --git a/ui/app/css/itcss/settings/index.scss b/ui/app/css/itcss/settings/index.scss index 58a7ca7b754d..a7152a435356 100644 --- a/ui/app/css/itcss/settings/index.scss +++ b/ui/app/css/itcss/settings/index.scss @@ -1,3 +1 @@ -@import './variables.scss'; - -@import './typography.scss'; +@import './variables'; diff --git a/ui/app/css/itcss/settings/typography.scss b/ui/app/css/itcss/settings/typography.scss deleted file mode 100644 index 93107a1060f9..000000000000 --- a/ui/app/css/itcss/settings/typography.scss +++ /dev/null @@ -1,442 +0,0 @@ -@import url('./fonts/Font_Awesome/font-awesome.min.css'); - -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('fonts/Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('fonts/Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('fonts/Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('fonts/Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('fonts/Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('fonts/Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('fonts/Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('fonts/Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('fonts/Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('fonts/Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('fonts/Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('fonts/Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('fonts/Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('fonts/Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('fonts/Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('fonts/Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('fonts/Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('fonts/Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('fonts/Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('fonts/Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('fonts/Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('fonts/Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('fonts/Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('fonts/Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('fonts/Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('fonts/Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('fonts/Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('fonts/Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('fonts/Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('fonts/Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('fonts/Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('fonts/Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('fonts/Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('fonts/Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('fonts/Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('fonts/Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('fonts/Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('fonts/Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('fonts/Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('fonts/Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('fonts/Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('fonts/Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} - -@font-face { - font-family: 'Montserrat Regular'; - src: url('./fonts/Montserrat/Montserrat-Regular.woff') format('woff'); - src: url('./fonts/Montserrat/Montserrat-Regular.ttf') format('truetype'); - font-weight: 400; - font-style: normal; - font-size: 'small'; -} - -@font-face { - font-family: 'Montserrat Bold'; - src: url('./fonts/Montserrat/Montserrat-Bold.woff') format('woff'); - src: url('./fonts/Montserrat/Montserrat-Bold.ttf') format('truetype'); - font-weight: 400; - font-style: normal; -} - -@font-face { - font-family: 'Montserrat Light'; - src: url('./fonts/Montserrat/Montserrat-Light.woff') format('woff'); - src: url('./fonts/Montserrat/Montserrat-Light.ttf') format('truetype'); - font-weight: 400; - font-style: normal; -} - -@font-face { - font-family: 'Montserrat UltraLight'; - src: url('./fonts/Montserrat/Montserrat-UltraLight.woff') format('woff'); - src: url('./fonts/Montserrat/Montserrat-UltraLight.ttf') format('truetype'); - font-weight: 400; - font-style: normal; -} - -@font-face { - font-family: 'DIN OT'; - src: url('./fonts/DIN_OT/DINOT-2.otf') format('opentype'); - font-weight: 400; - font-style: normal; -} - -@font-face { - font-family: 'DIN OT Light'; - src: url('./fonts/DIN_OT/DINOT-2.otf') format('opentype'); - font-weight: 200; - font-style: normal; -} - -@font-face { - font-family: 'DIN NEXT'; - src: url('./fonts/DIN Next/DIN Next W01 Regular.otf') format('opentype'); - font-weight: 400; - font-style: normal; -} - -@font-face { - font-family: 'DIN NEXT Light'; - src: url('./fonts/DIN Next/DIN Next W10 Light.otf') format('opentype'); - font-weight: 400; - font-style: normal; -} - -@font-face { - font-family: 'Lato'; - src: url('./fonts/Lato/Lato-Regular.ttf') format('truetype'); - font-weight: 400; - font-style: normal; -} - -@mixin fontScale($weight: 400, $size: 1rem) { - font-weight: $weight; - font-size: $size; -} - -@mixin h1($weight: 400, $size: 2.5rem){ - @include fontScale($weight, $size); -} - -@mixin h2($weight: 400, $size: 2rem){ - @include fontScale($weight, $size); -} - -@mixin h3($weight: 400, $size: 1.5rem){ - @include fontScale($weight, $size); -} - -@mixin h4($weight: 400, $size: 1.125rem){ - @include fontScale($weight, $size); -} - -@mixin h5($weight: 400, $size: 1rem){ - @include fontScale($weight, $size); -} - -@mixin h6($weight: 400, $size: .875rem){ - @include fontScale($weight, $size); -} - -@mixin h7($weight: 400, $size: .75rem){ - @include fontScale($weight, $size); -} - -@mixin paragraph($weight: 400, $size: 1rem){ - @include fontScale($weight, $size); -} diff --git a/ui/app/css/itcss/settings/variables.scss b/ui/app/css/itcss/settings/variables.scss index c02be0d9892d..6f95dc381d80 100644 --- a/ui/app/css/itcss/settings/variables.scss +++ b/ui/app/css/itcss/settings/variables.scss @@ -1,129 +1,23 @@ -/* - Variables - */ - -// Base Colors -$white: #fff; -$black: #000; -$orange: #ffa500; -$red: #f00; -$gray: #808080; - -/* - Colors - http://chir.ag/projects/name-that-color - */ -$white-linen: #faf6f0; // formerly 'faint orange (textfield shades)' -$rajah: #f5c26d; // formerly 'light orange (button shades)' -$buttercup: #f5a623; // formerly 'dark orange (text)' -$tundora: #4a4a4a; // formerly 'borders/font/any gray' -$gallery: #efefef; -$alabaster: #f7f7f7; -$shark: #22232c; -$wild-sand: #f6f6f6; -$white: #fff; -$dusty-gray: #9b9b9b; -$alto: #dedede; -$alabaster: #fafafa; -$silver-chalice: #aeaeae; -$curious-blue: #037DD6; -$concrete: #f3f3f3; -$tundora: #4d4d4d; -$nile-blue: #1b344d; -$scorpion: #5d5d5d; -$silver: #cdcdcd; -$caribbean-green: #02c9b1; -$monzo: #d0021b; -$crimson: #e91550; -$blue-lagoon: #038789; -$purple: #690496; -$tulip-tree: #ebb33f; -$malibu-blue: #7ac9fd; -$athens-grey: #e9edf0; -$jaffa: #f28930; -$geyser: #d2d8dd; -$manatee: #93949d; -$spindle: #c7ddec; -$mid-gray: #5b5d67; -$cape-cod: #38393a; -$onahau: #d1edff; -$java: #29b6af; -$wild-strawberry: #ff4a8d; -$cornflower-blue: #7057ff; -$saffron: #f6c343; -$dodger-blue: #3099f2; -$zumthor: #edf7ff; -$ecstasy: #f7861c; -$linen: #fdf4f4; -$oslo-gray: #8C8E94; -$polar: #fafcfe; -$blizzard-blue: #bfdef3; -$mischka: #dddee9; -$web-orange: #f2a202; - -/* - Z-Indicies - */ -$dropdown-z-index: 30; -$token-icon-z-index: 15; -$container-z-index: 15; -$header-z-index: 12; -$mobile-header-z-index: 26; -$main-container-z-index: 18; -$send-card-z-index: 20; -$sidebar-z-index: 26; -$sidebar-overlay-z-index: 25; - -/* - Z Indicies - Current - app - 11 - hex/bn as decimal input - 1 - remove? - dropdown - 11 - loading - 10 - higher? - mascot - 0 - remove? - */ - -/* - Responsive Breakpoints - */ -$break-small: 575px; -$break-midpoint: 780px; -$break-large: 576px; - - -$primary-font-type: Roboto; - -$Blue-000: #eaf6ff; -$Blue-400: #1098fc; -$Blue-500: #037DD6; -$Blue-600: #0260a4; - -$Grey-000: #f2f3f4; -$Grey-100: #D6D9DC; -$Grey-200: #bbc0c5; -$Grey-400: #848c96; -$Grey-500: #6A737D; -$Grey-800: #24272a; - -$Red-000: #fcf2f3; -$Red-500: #D73A49; -$Red-600: #b92534; - -$Orange-000: #fef5ef; -$Orange-500: #F66A0A; - - -/* - Spacing Variables -*/ -$no-spacing: 0px; -$xxs-spacing: 4px; -$xs-spacing: 8px; -$s-spacing: 16px; -$base-spacing: 24px; -$medium-spacing: 32px; -$large-spacing: 40px; -$xlarge-spacing: 48px; -$xxlarge-spacing: 64px; - - +// Flex +%row-nowrap { + display: flex; + flex-flow: row nowrap; +} + +%col-nowrap { + display: flex; + flex-flow: column nowrap; +} + +// Background Image Sizing +%bg-contain { + background-size: contain; + background-repeat: no-repeat; + background-position: center; +} + +%ellipsify { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} diff --git a/ui/app/css/itcss/tools/index.scss b/ui/app/css/itcss/tools/index.scss index 2236729e8dad..88cef5edfc58 100644 --- a/ui/app/css/itcss/tools/index.scss +++ b/ui/app/css/itcss/tools/index.scss @@ -1 +1 @@ -@import './utilities.scss'; +@import './utilities'; diff --git a/ui/app/css/itcss/tools/utilities.scss b/ui/app/css/itcss/tools/utilities.scss index 209614c6bc78..da185ccc9090 100644 --- a/ui/app/css/itcss/tools/utilities.scss +++ b/ui/app/css/itcss/tools/utilities.scss @@ -2,134 +2,17 @@ Utility Classes */ -/* color */ - -.color-orange { - color: #f7861c; // TODO: move to settings/variables -} - -.color-forest { - color: #0a5448; // TODO: move to settings/variables -} - /* lib */ - -.full-size { - height: 100%; - width: 100%; -} - -.full-width { - width: 100%; -} - -.full-flex-height { - display: flex; - flex: 1 1 auto; - flex-direction: column; -} - -.full-height { - height: 100%; -} - .flex-column { display: flex; flex-direction: column; } -.space-between { - justify-content: space-between; -} - -.space-around { - justify-content: space-around; -} - -.flex-column-bottom { - display: flex; - flex-direction: column-reverse; -} - .flex-row { display: flex; flex-direction: row; } -.flex-space-between { - justify-content: space-between; -} - -.flex-space-around { - justify-content: space-around; -} - -.flex-right { - display: flex; - flex-direction: row; - justify-content: flex-end; -} - -.flex-left { - display: flex; - flex-direction: row; - justify-content: flex-start; -} - -.flex-fixed { - flex: none; -} - -.flex-basis-auto { - flex-basis: auto; -} - -.flex-grow { - flex: 1 1 auto; -} - -.flex-wrap { - flex-wrap: wrap; -} - -.flex-center { - display: flex; - justify-content: center; - align-items: center; -} - -.flex-justify-center { - justify-content: center; -} - -.flex-align-center { - align-items: center; -} - -.flex-self-end { - align-self: flex-end; -} - -.flex-self-stretch { - align-self: stretch; -} - -.flex-vertical { - flex-direction: column; -} - -.z-bump { - z-index: 1; -} - -.select-none { - cursor: inherit; - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; -} - .pointer { cursor: pointer; } @@ -141,129 +24,11 @@ } .cursor-pointer:hover { - transform: scale(1.1); + transform: scale(1.05); } .cursor-pointer:active { - transform: scale(.95); -} - -.cursor-disabled { - cursor: not-allowed; -} - -.margin-bottom-sml { - margin-bottom: 20px; -} - -.margin-bottom-med { - margin-bottom: 40px; -} - -.margin-right-left { - margin: 0 20px; -} - -.bold { - font-weight: 500; -} - -.text-transform-uppercase { - text-transform: uppercase; -} - -.font-small { - font-size: 12px; -} - -.font-medium { - font-size: 1.2em; -} - -hr.horizontal-line { - display: block; - height: 1px; - border: 0; - border-top: 1px solid #ccc; - margin: 1em 0; - padding: 0; -} - -.hover-white:hover { - background: $white; -} - -.red-dot { - background: #e91550; - color: $white; - border-radius: 10px; -} - -.diamond { - transform: rotate(45deg); - background: #038789; -} - -.hollow-diamond { - transform: rotate(45deg); - border: 3px solid #690496; -} - -.golden-square { - background: #ebb33f; -} - -.pending-dot { - background: $red; - left: 14px; - top: 14px; - color: $white; - border-radius: 10px; - height: 20px; - min-width: 20px; - position: relative; - display: flex; - align-items: center; - justify-content: center; - padding: 4px; - z-index: 1; -} - -.keyring-label { - z-index: 1; - font-size: 8px; - line-height: 8px; - background: rgba(255, 255, 255, 0.4); - color: #fff; - border-radius: 10px; - padding: 4px; - text-align: center; - height: 15px; -} - -.ether-balance { - display: flex; - align-items: center; -} - -.tabSection { - min-width: 350px; -} - -.menu-icon { - display: inline-block; - height: 12px; - min-width: 12px; - margin: 13px; -} - -.ether-icon { - background: rgb(0, 163, 68); - border-radius: 20px; -} - -.testnet-icon { - background: #2465e1; + transform: scale(0.97); } .drop-menu-item { @@ -271,39 +36,8 @@ hr.horizontal-line { align-items: center; } -.invisible { - visibility: hidden; -} - -.one-line-concat { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - .critical-error { text-align: center; margin-top: 20px; color: $red; } - -/* - Misc - */ - -// TODO: move into component-level contextual 'active' state -.letter-spacey { - letter-spacing: .1em; -} - -.active { - color: #909090; -} - -.check { - margin-left: 7px; - color: #f7861c; - flex: 1 0 auto; - display: flex; - justify-content: flex-end; -} diff --git a/ui/app/css/itcss/trumps/index.scss b/ui/app/css/itcss/trumps/index.scss deleted file mode 100644 index d9a4202a44b5..000000000000 --- a/ui/app/css/itcss/trumps/index.scss +++ /dev/null @@ -1,72 +0,0 @@ -/* - Trumps - */ - -// Transitions - -/* universal */ -.app-primary .main-enter { - position: absolute; - width: 100%; -} - -/* center position */ -.app-primary.from-right .main-enter-active, -.app-primary.from-left .main-enter-active { - overflow-x: hidden; - transform: translateX(0); - transition: transform 300ms ease-in; -} - -/* exited positions */ -.app-primary.from-left .main-leave-active { - transform: translateX(360px); - transition: transform 300ms ease-in; -} - -.app-primary.from-right .main-leave-active { - transform: translateX(-360px); - transition: transform 300ms ease-in; -} - -.sidebar.from-left { - transform: translateX(-320px); - transition: transform 300ms ease-in; -} - -/* loader transitions */ -.loader-enter, -.loader-leave-active { - opacity: 0; - transition: opacity 150 ease-in; -} - -.loader-enter-active, -.loader-leave { - opacity: 1; - transition: opacity 150 ease-in; -} - -/* entering positions */ -.app-primary.from-right .main-enter:not(.main-enter-active) { - transform: translateX(360px); -} - -.app-primary.from-left .main-enter:not(.main-enter-active) { - transform: translateX(-360px); -} - -i.fa.fa-question-circle.fa-lg.menu-icon { - font-size: 18px; -} - -// This text is contained inside a div. -// ID needed to override user agent stylesheet. -// See components/modal.scss - -/* stylelint-disable */ -#buy-modal-content-footer-text { - font-family: 'DIN OT'; - font-size: 16px; -} -/* stylelint-enable */ diff --git a/ui/app/css/itcss/generic/reset.scss b/ui/app/css/reset.scss similarity index 83% rename from ui/app/css/itcss/generic/reset.scss rename to ui/app/css/reset.scss index a417a0453eee..9ee5607cf3aa 100644 --- a/ui/app/css/itcss/generic/reset.scss +++ b/ui/app/css/reset.scss @@ -88,9 +88,11 @@ video { padding: 0; border: 0; font-size: 100%; - /* stylelint-disable */ - font: inherit; - /* stylelint-enable */ + font-weight: inherit; + font-style: inherit; + font-variant: inherit; + font-size: inherit; + line-height: inherit; vertical-align: baseline; } @@ -122,10 +124,10 @@ q { quotes: none; } -blockquote:before, -blockquote:after, -q:before, -q:after { +blockquote::before, +blockquote::after, +q::before, +q::after { content: ''; content: none; } @@ -138,6 +140,10 @@ table { button { border-style: none; cursor: pointer; + + &::-moz-focus-inner { + border: none; + } } /* stylelint-enable */ diff --git a/ui/app/ducks/alerts/index.js b/ui/app/ducks/alerts/index.js new file mode 100644 index 000000000000..a28d23ecba92 --- /dev/null +++ b/ui/app/ducks/alerts/index.js @@ -0,0 +1 @@ +export { default as unconnectedAccount } from './unconnected-account' diff --git a/ui/app/ducks/alerts/unconnected-account.js b/ui/app/ducks/alerts/unconnected-account.js new file mode 100644 index 000000000000..397533463717 --- /dev/null +++ b/ui/app/ducks/alerts/unconnected-account.js @@ -0,0 +1,152 @@ +import { createSlice } from '@reduxjs/toolkit' +import { captureException } from '@sentry/browser' + +import { ALERT_TYPES } from '../../../../app/scripts/controllers/alert' +import * as actionConstants from '../../store/actionConstants' +import { + addPermittedAccount, + setAlertEnabledness, + setSelectedAddress, +} from '../../store/actions' +import { + getOriginOfCurrentTab, + getSelectedAddress, +} from '../../selectors' + +// Constants + +export const ALERT_STATE = { + CLOSED: 'CLOSED', + ERROR: 'ERROR', + LOADING: 'LOADING', + OPEN: 'OPEN', +} + +const name = ALERT_TYPES.unconnectedAccount + +const initialState = { + state: ALERT_STATE.CLOSED, +} + +// Slice (reducer plus auto-generated actions and action creators) + +const slice = createSlice({ + name, + initialState, + reducers: { + connectAccountFailed: (state) => { + state.state = ALERT_STATE.ERROR + }, + connectAccountRequested: (state) => { + state.state = ALERT_STATE.LOADING + }, + connectAccountSucceeded: (state) => { + state.state = ALERT_STATE.CLOSED + }, + disableAlertFailed: (state) => { + state.state = ALERT_STATE.ERROR + }, + disableAlertRequested: (state) => { + state.state = ALERT_STATE.LOADING + }, + disableAlertSucceeded: (state) => { + state.state = ALERT_STATE.CLOSED + }, + dismissAlert: (state) => { + state.state = ALERT_STATE.CLOSED + }, + switchAccountFailed: (state) => { + state.state = ALERT_STATE.ERROR + }, + switchAccountRequested: (state) => { + state.state = ALERT_STATE.LOADING + }, + switchAccountSucceeded: (state) => { + state.state = ALERT_STATE.CLOSED + }, + switchedToUnconnectedAccount: (state) => { + state.state = ALERT_STATE.OPEN + }, + }, + extraReducers: { + [actionConstants.SELECTED_ADDRESS_CHANGED]: (state) => { + // close the alert if the account is switched while it's open + if (state.state === ALERT_STATE.OPEN) { + state.state = ALERT_STATE.CLOSED + } + }, + }, +}) + +const { actions, reducer } = slice + +export default reducer + +// Selectors + +export const getAlertState = (state) => state[name].state + +export const alertIsOpen = (state) => state[name].state !== ALERT_STATE.CLOSED + +// Actions / action-creators + +const { + connectAccountFailed, + connectAccountRequested, + connectAccountSucceeded, + disableAlertFailed, + disableAlertRequested, + disableAlertSucceeded, + dismissAlert, + switchAccountFailed, + switchAccountRequested, + switchAccountSucceeded, + switchedToUnconnectedAccount, +} = actions + +export { dismissAlert, switchedToUnconnectedAccount } + +export const dismissAndDisableAlert = () => { + return async (dispatch) => { + try { + await dispatch(disableAlertRequested()) + await dispatch(setAlertEnabledness(name, false)) + await dispatch(disableAlertSucceeded()) + } catch (error) { + console.error(error) + captureException(error) + await dispatch(disableAlertFailed()) + } + } +} + +export const switchToAccount = (address) => { + return async (dispatch) => { + try { + await dispatch(switchAccountRequested()) + await dispatch(setSelectedAddress(address)) + await dispatch(switchAccountSucceeded()) + } catch (error) { + console.error(error) + captureException(error) + await dispatch(switchAccountFailed()) + } + } +} + +export const connectAccount = () => { + return async (dispatch, getState) => { + const state = getState() + const selectedAddress = getSelectedAddress(state) + const origin = getOriginOfCurrentTab(state) + try { + await dispatch(connectAccountRequested()) + await dispatch(addPermittedAccount(origin, selectedAddress)) + await dispatch(connectAccountSucceeded()) + } catch (error) { + console.error(error) + captureException(error) + await dispatch(connectAccountFailed()) + } + } +} diff --git a/ui/app/ducks/app/app.js b/ui/app/ducks/app/app.js index 04c8c7422794..2b905a1ace6c 100644 --- a/ui/app/ducks/app/app.js +++ b/ui/app/ducks/app/app.js @@ -1,41 +1,11 @@ -const extend = require('xtend') -const actions = require('../../store/actions') -const txHelper = require('../../../lib/tx-helper') -const log = require('loglevel') - -module.exports = reduceApp - - -function reduceApp (state, action) { - log.debug('App Reducer got ' + action.type) - // clone and defaults - const selectedAddress = state.metamask.selectedAddress - const hasUnconfActions = checkUnconfActions(state) - let name = 'accounts' - if (selectedAddress) { - name = 'accountDetail' - } - - if (hasUnconfActions) { - log.debug('pending txs detected, defaulting to conf-tx view.') - name = 'confTx' - } +import * as actionConstants from '../../store/actionConstants' - var defaultView = { - name, - detailView: null, - context: selectedAddress, - } - - // confirm seed words - var seedWords = state.metamask.seedWords - var seedConfView = { - name: 'createVaultComplete', - seedWords, - } +// actionConstants +const SET_THREEBOX_LAST_UPDATED = 'metamask/app/SET_THREEBOX_LAST_UPDATED' +export default function reduceApp (state = {}, action) { // default state - var appState = extend({ + const appState = { shouldClose: false, menuOpen: false, modal: { @@ -58,12 +28,9 @@ function reduceApp (state, action) { alertMessage: null, qrCodeData: null, networkDropdownOpen: false, - currentView: seedWords ? seedConfView : defaultView, accountDetail: { subview: 'transactions', }, - // Used to render transition direction - transForward: true, // Used to display loading indicator isLoading: false, // Used to display error text @@ -71,7 +38,6 @@ function reduceApp (state, action) { buyView: {}, isMouseUser: false, gasIsLoading: false, - networkNonce: null, defaultHdPaths: { trezor: `m/44'/60'/0'/0`, ledger: `m/44'/60'/0'/0/0`, @@ -80,727 +46,329 @@ function reduceApp (state, action) { networksTabSelectedRpcUrl: '', networksTabIsInAddMode: false, loadingMethodData: false, - }, state.appState) + show3BoxModalAfterImport: false, + threeBoxLastUpdated: null, + requestAccountTabs: {}, + openMetaMaskTabs: {}, + currentWindowTab: {}, + ...state, + } switch (action.type) { // dropdown methods - case actions.NETWORK_DROPDOWN_OPEN: - return extend(appState, { + case actionConstants.NETWORK_DROPDOWN_OPEN: + return { + ...appState, networkDropdownOpen: true, - }) + } - case actions.NETWORK_DROPDOWN_CLOSE: - return extend(appState, { + case actionConstants.NETWORK_DROPDOWN_CLOSE: + return { + ...appState, networkDropdownOpen: false, - }) + } // sidebar methods - case actions.SIDEBAR_OPEN: - return extend(appState, { + case actionConstants.SIDEBAR_OPEN: + return { + ...appState, sidebar: { ...action.value, isOpen: true, }, - }) + } - case actions.SIDEBAR_CLOSE: - return extend(appState, { + case actionConstants.SIDEBAR_CLOSE: + return { + ...appState, sidebar: { ...appState.sidebar, isOpen: false, }, - }) + } // alert methods - case actions.ALERT_OPEN: - return extend(appState, { + case actionConstants.ALERT_OPEN: + return { + ...appState, alertOpen: true, alertMessage: action.value, - }) + } - case actions.ALERT_CLOSE: - return extend(appState, { + case actionConstants.ALERT_CLOSE: + return { + ...appState, alertOpen: false, alertMessage: null, - }) + } // qr scanner methods - case actions.QR_CODE_DETECTED: - return extend(appState, { + case actionConstants.QR_CODE_DETECTED: + return { + ...appState, qrCodeData: action.value, - }) - + } // modal methods: - case actions.MODAL_OPEN: + case actionConstants.MODAL_OPEN: { const { name, ...modalProps } = action.payload - return extend(appState, { + return { + ...appState, modal: { open: true, modalState: { - name: name, + name, props: { ...modalProps }, }, previousModalState: { ...appState.modal.modalState }, }, - }) + } + } - case actions.MODAL_CLOSE: - return extend(appState, { + case actionConstants.MODAL_CLOSE: + return { + ...appState, modal: Object.assign( - state.appState.modal, + appState.modal, { open: false }, { modalState: { name: null, props: {} } }, - { previousModalState: appState.modal.modalState}, + { previousModalState: appState.modal.modalState }, ), - }) - - // transition methods - case actions.TRANSITION_FORWARD: - return extend(appState, { - transForward: true, - }) - - case actions.TRANSITION_BACKWARD: - return extend(appState, { - transForward: false, - }) - - // intialize - - case actions.SHOW_CREATE_VAULT: - return extend(appState, { - currentView: { - name: 'createVault', - }, - transForward: true, - warning: null, - }) + } - case actions.SHOW_RESTORE_VAULT: - return extend(appState, { - currentView: { - name: 'restoreVault', - }, - transForward: true, - forgottenPassword: true, - }) + case actionConstants.CLEAR_ACCOUNT_DETAILS: + return { + ...appState, + accountDetail: {}, + } - case actions.FORGOT_PASSWORD: - const newState = extend(appState, { + case actionConstants.FORGOT_PASSWORD: + return { + ...appState, forgottenPassword: action.value, - }) - - if (action.value) { - newState.currentView = { - name: 'restoreVault', - } } - return newState - - case actions.SHOW_INIT_MENU: - return extend(appState, { - currentView: defaultView, - transForward: false, - }) - - case actions.SHOW_CONFIG_PAGE: - return extend(appState, { - currentView: { - name: 'config', - context: appState.currentView.context, - }, - transForward: action.value, - }) - - case actions.SHOW_ADD_TOKEN_PAGE: - return extend(appState, { - currentView: { - name: 'add-token', - context: appState.currentView.context, - }, - transForward: action.value, - }) - - case actions.SHOW_ADD_SUGGESTED_TOKEN_PAGE: - return extend(appState, { - currentView: { - name: 'add-suggested-token', - context: appState.currentView.context, - }, - transForward: action.value, - }) - - case actions.SHOW_IMPORT_PAGE: - return extend(appState, { - currentView: { - name: 'import-menu', - }, - transForward: true, + case actionConstants.SHOW_SEND_TOKEN_PAGE: + return { + ...appState, warning: null, - }) - - case actions.SHOW_NEW_ACCOUNT_PAGE: - return extend(appState, { - currentView: { - name: 'new-account-page', - context: action.formToSelect, - }, - transForward: true, - warning: null, - }) - - case actions.SET_NEW_ACCOUNT_FORM: - return extend(appState, { - currentView: { - name: appState.currentView.name, - context: action.formToSelect, - }, - }) - - case actions.SHOW_INFO_PAGE: - return extend(appState, { - currentView: { - name: 'info', - context: appState.currentView.context, - }, - transForward: true, - }) - - case actions.CREATE_NEW_VAULT_IN_PROGRESS: - return extend(appState, { - currentView: { - name: 'createVault', - inProgress: true, - }, - transForward: true, - isLoading: true, - }) - - case actions.SHOW_NEW_VAULT_SEED: - return extend(appState, { - currentView: { - name: 'createVaultComplete', - seedWords: action.value, - }, - transForward: true, - isLoading: false, - }) - - case actions.NEW_ACCOUNT_SCREEN: - return extend(appState, { - currentView: { - name: 'new-account', - context: appState.currentView.context, - }, - transForward: true, - }) - - case actions.SHOW_SEND_PAGE: - return extend(appState, { - currentView: { - name: 'sendTransaction', - context: appState.currentView.context, - }, - transForward: true, - warning: null, - }) - - case actions.SHOW_SEND_TOKEN_PAGE: - return extend(appState, { - currentView: { - name: 'sendToken', - context: appState.currentView.context, - }, - transForward: true, - warning: null, - }) - - case actions.SHOW_NEW_KEYCHAIN: - return extend(appState, { - currentView: { - name: 'newKeychain', - context: appState.currentView.context, - }, - transForward: true, - }) - - // unlock - - case actions.UNLOCK_METAMASK: - return extend(appState, { - forgottenPassword: appState.forgottenPassword ? !appState.forgottenPassword : null, - detailView: {}, - transForward: true, - isLoading: false, - warning: null, - }) - - case actions.LOCK_METAMASK: - return extend(appState, { - currentView: defaultView, - transForward: false, - warning: null, - }) - - case actions.BACK_TO_INIT_MENU: - return extend(appState, { - warning: null, - transForward: false, - forgottenPassword: true, - currentView: { - name: 'InitMenu', - }, - }) + } - case actions.BACK_TO_UNLOCK_VIEW: - return extend(appState, { + case actionConstants.LOCK_METAMASK: + return { + ...appState, warning: null, - transForward: true, - forgottenPassword: false, - currentView: { - name: 'UnlockScreen', - }, - }) - // reveal seed words - - case actions.REVEAL_SEED_CONFIRMATION: - return extend(appState, { - currentView: { - name: 'reveal-seed-conf', - }, - transForward: true, - warning: null, - }) - - // accounts + } - case actions.SET_SELECTED_ACCOUNT: - return extend(appState, { - activeAddress: action.value, - }) + // accounts - case actions.GO_HOME: - return extend(appState, { - currentView: extend(appState.currentView, { - name: 'accountDetail', - }), + case actionConstants.GO_HOME: + return { + ...appState, accountDetail: { subview: 'transactions', accountExport: 'none', privateKey: '', }, - transForward: false, warning: null, - }) + } - case actions.SHOW_ACCOUNT_DETAIL: - return extend(appState, { + case actionConstants.SHOW_ACCOUNT_DETAIL: + return { + ...appState, forgottenPassword: appState.forgottenPassword ? !appState.forgottenPassword : null, - currentView: { - name: 'accountDetail', - context: action.value, - }, accountDetail: { subview: 'transactions', accountExport: 'none', privateKey: '', }, - transForward: false, - }) - - case actions.BACK_TO_ACCOUNT_DETAIL: - return extend(appState, { - currentView: { - name: 'accountDetail', - context: action.value, - }, - accountDetail: { - subview: 'transactions', - accountExport: 'none', - privateKey: '', - }, - transForward: false, - }) - - case actions.SHOW_ACCOUNTS_PAGE: - return extend(appState, { - currentView: { - name: seedWords ? 'createVaultComplete' : 'accounts', - seedWords, - }, - transForward: true, + } + + case actionConstants.SHOW_ACCOUNTS_PAGE: + return { + ...appState, isLoading: false, warning: null, scrollToBottom: false, forgottenPassword: false, - }) - - case actions.REVEAL_ACCOUNT: - return extend(appState, { - scrollToBottom: true, - }) - - case actions.SHOW_CONF_TX_PAGE: - return extend(appState, { - currentView: { - name: 'confTx', - context: action.id ? indexForPending(state, action.id) : 0, - }, - transForward: action.transForward, - warning: null, - isLoading: false, - }) + } - case actions.SHOW_CONF_MSG_PAGE: - return extend(appState, { - currentView: { - name: hasUnconfActions ? 'confTx' : 'account-detail', - context: 0, - }, - transForward: true, + case actionConstants.SHOW_CONF_TX_PAGE: + return { + ...appState, + txId: action.id, warning: null, isLoading: false, - }) - - case actions.COMPLETED_TX: - log.debug('reducing COMPLETED_TX for tx ' + action.value) - const otherUnconfActions = getUnconfActionList(state) - .filter(tx => tx.id !== action.value) - const hasOtherUnconfActions = otherUnconfActions.length > 0 - - if (hasOtherUnconfActions) { - log.debug('reducer detected txs - rendering confTx view') - return extend(appState, { - transForward: false, - currentView: { - name: 'confTx', - context: 0, - }, - warning: null, - }) - } else { - log.debug('attempting to close popup') - return extend(appState, { - // indicate notification should close - shouldClose: true, - transForward: false, - warning: null, - currentView: { - name: 'accountDetail', - context: state.metamask.selectedAddress, - }, - accountDetail: { - subview: 'transactions', - }, - }) } - case actions.NEXT_TX: - return extend(appState, { - transForward: true, - currentView: { - name: 'confTx', - context: ++appState.currentView.context, - warning: null, - }, - }) - - case actions.VIEW_PENDING_TX: - const context = indexForPending(state, action.value) - return extend(appState, { - transForward: true, - currentView: { - name: 'confTx', - context, - warning: null, - }, - }) - - case actions.PREVIOUS_TX: - return extend(appState, { - transForward: false, - currentView: { - name: 'confTx', - context: --appState.currentView.context, + case actionConstants.COMPLETED_TX: + if (action.value.unconfirmedActionsCount > 0) { + return { + ...appState, + txId: null, warning: null, + } + } + return { + ...appState, + // indicate notification should close + shouldClose: true, + warning: null, + txId: null, + accountDetail: { + subview: 'transactions', }, - }) + } - case actions.TRANSACTION_ERROR: - return extend(appState, { - currentView: { - name: 'confTx', - errorMessage: 'There was a problem submitting this transaction.', - }, - }) + case actionConstants.TRANSACTION_ERROR: + return { + ...appState, + } - case actions.UNLOCK_FAILED: - return extend(appState, { + case actionConstants.UNLOCK_FAILED: + return { + ...appState, warning: action.value || 'Incorrect password. Try again.', - }) + } - case actions.UNLOCK_SUCCEEDED: - return extend(appState, { + case actionConstants.UNLOCK_SUCCEEDED: + return { + ...appState, warning: '', - }) + } - case actions.SET_HARDWARE_WALLET_DEFAULT_HD_PATH: + case actionConstants.SET_HARDWARE_WALLET_DEFAULT_HD_PATH: { const { device, path } = action.value - const newDefaults = {...appState.defaultHdPaths} + const newDefaults = { ...appState.defaultHdPaths } newDefaults[device] = path - return extend(appState, { + return { + ...appState, defaultHdPaths: newDefaults, - }) + } + } - case actions.SHOW_LOADING: - return extend(appState, { + case actionConstants.SHOW_LOADING: + return { + ...appState, isLoading: true, loadingMessage: action.value, - }) + } - case actions.HIDE_LOADING: - return extend(appState, { - isLoading: false, - }) - - case actions.SHOW_SUB_LOADING_INDICATION: - return extend(appState, { - isSubLoading: true, - }) - - case actions.HIDE_SUB_LOADING_INDICATION: - return extend(appState, { - isSubLoading: false, - }) - case actions.CLEAR_SEED_WORD_CACHE: - return extend(appState, { - transForward: true, - currentView: {}, + case actionConstants.HIDE_LOADING: + return { + ...appState, isLoading: false, - accountDetail: { - subview: 'transactions', - accountExport: 'none', - privateKey: '', - }, - }) + } - case actions.DISPLAY_WARNING: - return extend(appState, { + case actionConstants.DISPLAY_WARNING: + return { + ...appState, warning: action.value, isLoading: false, - }) + } - case actions.HIDE_WARNING: - return extend(appState, { + case actionConstants.HIDE_WARNING: + return { + ...appState, warning: undefined, - }) - - case actions.REQUEST_ACCOUNT_EXPORT: - return extend(appState, { - transForward: true, - currentView: { - name: 'accountDetail', - context: appState.currentView.context, - }, - accountDetail: { - subview: 'export', - accountExport: 'requested', - }, - }) - - case actions.EXPORT_ACCOUNT: - return extend(appState, { - accountDetail: { - subview: 'export', - accountExport: 'completed', - }, - }) + } - case actions.SHOW_PRIVATE_KEY: - return extend(appState, { + case actionConstants.SHOW_PRIVATE_KEY: + return { + ...appState, accountDetail: { subview: 'export', accountExport: 'completed', privateKey: action.value, }, - }) - - case actions.BUY_ETH_VIEW: - return extend(appState, { - transForward: true, - currentView: { - name: 'buyEth', - context: appState.currentView.name, - }, - identity: state.metamask.identities[action.value], - buyView: { - subview: 'Coinbase', - amount: '15.00', - buyAddress: action.value, - formView: { - coinbase: true, - shapeshift: false, - }, - }, - }) - - case actions.ONBOARDING_BUY_ETH_VIEW: - return extend(appState, { - transForward: true, - currentView: { - name: 'onboardingBuyEth', - context: appState.currentView.name, - }, - identity: state.metamask.identities[action.value], - }) - - case actions.COINBASE_SUBVIEW: - return extend(appState, { - buyView: { - subview: 'Coinbase', - formView: { - coinbase: true, - shapeshift: false, - }, - buyAddress: appState.buyView.buyAddress, - amount: appState.buyView.amount, - }, - }) - - case actions.SHAPESHIFT_SUBVIEW: - return extend(appState, { - buyView: { - subview: 'ShapeShift', - formView: { - coinbase: false, - shapeshift: true, - marketinfo: action.value.marketinfo, - coinOptions: action.value.coinOptions, - }, - buyAddress: action.value.buyAddress || appState.buyView.buyAddress, - amount: appState.buyView.amount || 0, - }, - }) - - case actions.PAIR_UPDATE: - return extend(appState, { - buyView: { - subview: 'ShapeShift', - formView: { - coinbase: false, - shapeshift: true, - marketinfo: action.value.marketinfo, - coinOptions: appState.buyView.formView.coinOptions, - }, - buyAddress: appState.buyView.buyAddress, - amount: appState.buyView.amount, - warning: null, - }, - }) - - case actions.SHOW_QR: - return extend(appState, { - qrRequested: true, - transForward: true, - - Qr: { - message: action.value.message, - data: action.value.data, - }, - }) - - case actions.SHOW_QR_VIEW: - return extend(appState, { - currentView: { - name: 'qr', - context: appState.currentView.context, - }, - transForward: true, - Qr: { - message: action.value.message, - data: action.value.data, - }, - }) + } - case actions.SET_MOUSE_USER_STATE: - return extend(appState, { + case actionConstants.SET_MOUSE_USER_STATE: + return { + ...appState, isMouseUser: action.value, - }) + } - case actions.GAS_LOADING_STARTED: - return extend(appState, { + case actionConstants.GAS_LOADING_STARTED: + return { + ...appState, gasIsLoading: true, - }) + } - case actions.GAS_LOADING_FINISHED: - return extend(appState, { + case actionConstants.GAS_LOADING_FINISHED: + return { + ...appState, gasIsLoading: false, - }) - - case actions.SET_NETWORK_NONCE: - return extend(appState, { - networkNonce: action.value, - }) + } - case actions.SET_PREVIOUS_PROVIDER: + case actionConstants.SET_PREVIOUS_PROVIDER: if (action.value === 'loading') { return appState } - return extend(appState, { + return { + ...appState, lastSelectedProvider: action.value, - }) + } - case actions.SET_SELECTED_SETTINGS_RPC_URL: - return extend(appState, { + case actionConstants.SET_SELECTED_SETTINGS_RPC_URL: + return { + ...appState, networksTabSelectedRpcUrl: action.value, - }) + } - case actions.SET_NETWORKS_TAB_ADD_MODE: - return extend(appState, { + case actionConstants.SET_NETWORKS_TAB_ADD_MODE: + return { + ...appState, networksTabIsInAddMode: action.value, - }) + } - case actions.LOADING_METHOD_DATA_STARTED: - return extend(appState, { + case actionConstants.LOADING_METHOD_DATA_STARTED: + return { + ...appState, loadingMethodData: true, - }) + } - case actions.LOADING_METHOD_DATA_FINISHED: - return extend(appState, { + case actionConstants.LOADING_METHOD_DATA_FINISHED: + return { + ...appState, loadingMethodData: false, - }) + } + case SET_THREEBOX_LAST_UPDATED: + return { + ...appState, + threeBoxLastUpdated: action.value, + } - default: - return appState - } -} + case actionConstants.SET_REQUEST_ACCOUNT_TABS: + return { + ...appState, + requestAccountTabs: action.value, + } -function checkUnconfActions (state) { - const unconfActionList = getUnconfActionList(state) - const hasUnconfActions = unconfActionList.length > 0 - return hasUnconfActions -} + case actionConstants.SET_OPEN_METAMASK_TAB_IDS: + return { + ...appState, + openMetaMaskTabs: action.value, + } -function getUnconfActionList (state) { - const { unapprovedTxs, unapprovedMsgs, - unapprovedPersonalMsgs, unapprovedTypedMessages, network } = state.metamask + case actionConstants.SET_CURRENT_WINDOW_TAB: + return { + ...appState, + currentWindowTab: action.value, + } - const unconfActionList = txHelper(unapprovedTxs, unapprovedMsgs, unapprovedPersonalMsgs, unapprovedTypedMessages, network) - return unconfActionList + default: + return appState + } } -function indexForPending (state, txId) { - const unconfTxList = getUnconfActionList(state) - const match = unconfTxList.find((tx) => tx.id === txId) - const index = unconfTxList.indexOf(match) - return index +// Action Creators +export function setThreeBoxLastUpdated (lastUpdated) { + return { + type: SET_THREEBOX_LAST_UPDATED, + value: lastUpdated, + } } - -// function indexForLastPending (state) { -// return getUnconfActionList(state).length -// } diff --git a/ui/app/ducks/confirm-transaction/confirm-transaction.duck.js b/ui/app/ducks/confirm-transaction/confirm-transaction.duck.js index b8d1a7e81ec5..2285e8bd7646 100644 --- a/ui/app/ducks/confirm-transaction/confirm-transaction.duck.js +++ b/ui/app/ducks/confirm-transaction/confirm-transaction.duck.js @@ -1,9 +1,10 @@ +import { addHexPrefix } from 'ethereumjs-util' import { conversionRateSelector, currentCurrencySelector, unconfirmedTransactionsHashSelector, getNativeCurrency, -} from '../../selectors/confirm-transaction' +} from '../../selectors' import { getValueFromWeiHex, @@ -21,10 +22,9 @@ import { } from '../../helpers/utils/transactions.util' import { conversionUtil } from '../../helpers/utils/conversion-util' -import { addHexPrefix } from 'ethereumjs-util' // Actions -const createActionType = action => `metamask/confirm-transaction/${action}` +const createActionType = (action) => `metamask/confirm-transaction/${action}` const UPDATE_TX_DATA = createActionType('UPDATE_TX_DATA') const CLEAR_TX_DATA = createActionType('CLEAR_TX_DATA') @@ -66,102 +66,106 @@ const initState = { } // Reducer -export default function reducer ({ confirmTransaction: confirmState = initState }, action = {}) { +export default function reducer (state = initState, action = {}) { switch (action.type) { case UPDATE_TX_DATA: return { - ...confirmState, + ...state, txData: { ...action.payload, }, } case CLEAR_TX_DATA: return { - ...confirmState, + ...state, txData: {}, } case UPDATE_TOKEN_DATA: return { - ...confirmState, + ...state, tokenData: { ...action.payload, }, } case CLEAR_TOKEN_DATA: return { - ...confirmState, + ...state, tokenData: {}, } case UPDATE_METHOD_DATA: return { - ...confirmState, + ...state, methodData: { ...action.payload, }, } case CLEAR_METHOD_DATA: return { - ...confirmState, + ...state, methodData: {}, } - case UPDATE_TRANSACTION_AMOUNTS: + case UPDATE_TRANSACTION_AMOUNTS: { const { fiatTransactionAmount, ethTransactionAmount, hexTransactionAmount } = action.payload return { - ...confirmState, - fiatTransactionAmount: fiatTransactionAmount || confirmState.fiatTransactionAmount, - ethTransactionAmount: ethTransactionAmount || confirmState.ethTransactionAmount, - hexTransactionAmount: hexTransactionAmount || confirmState.hexTransactionAmount, + ...state, + fiatTransactionAmount: fiatTransactionAmount || state.fiatTransactionAmount, + ethTransactionAmount: ethTransactionAmount || state.ethTransactionAmount, + hexTransactionAmount: hexTransactionAmount || state.hexTransactionAmount, } - case UPDATE_TRANSACTION_FEES: + } + case UPDATE_TRANSACTION_FEES: { const { fiatTransactionFee, ethTransactionFee, hexTransactionFee } = action.payload return { - ...confirmState, - fiatTransactionFee: fiatTransactionFee || confirmState.fiatTransactionFee, - ethTransactionFee: ethTransactionFee || confirmState.ethTransactionFee, - hexTransactionFee: hexTransactionFee || confirmState.hexTransactionFee, + ...state, + fiatTransactionFee: fiatTransactionFee || state.fiatTransactionFee, + ethTransactionFee: ethTransactionFee || state.ethTransactionFee, + hexTransactionFee: hexTransactionFee || state.hexTransactionFee, } - case UPDATE_TRANSACTION_TOTALS: + } + case UPDATE_TRANSACTION_TOTALS: { const { fiatTransactionTotal, ethTransactionTotal, hexTransactionTotal } = action.payload return { - ...confirmState, - fiatTransactionTotal: fiatTransactionTotal || confirmState.fiatTransactionTotal, - ethTransactionTotal: ethTransactionTotal || confirmState.ethTransactionTotal, - hexTransactionTotal: hexTransactionTotal || confirmState.hexTransactionTotal, + ...state, + fiatTransactionTotal: fiatTransactionTotal || state.fiatTransactionTotal, + ethTransactionTotal: ethTransactionTotal || state.ethTransactionTotal, + hexTransactionTotal: hexTransactionTotal || state.hexTransactionTotal, } - case UPDATE_TOKEN_PROPS: + } + case UPDATE_TOKEN_PROPS: { const { tokenSymbol = '', tokenDecimals = '' } = action.payload return { - ...confirmState, + ...state, tokenProps: { - ...confirmState.tokenProps, + ...state.tokenProps, tokenSymbol, tokenDecimals, }, } + } case UPDATE_NONCE: return { - ...confirmState, + ...state, nonce: action.payload, } case UPDATE_TO_SMART_CONTRACT: return { - ...confirmState, + ...state, toSmartContract: action.payload, } case FETCH_DATA_START: return { - ...confirmState, + ...state, fetchingData: true, } case FETCH_DATA_END: return { - ...confirmState, + ...state, fetchingData: false, } case CLEAR_CONFIRM_TRANSACTION: return initState default: - return confirmState + return state } } @@ -254,16 +258,14 @@ export function setFetchingData (isFetching) { } export function updateGasAndCalculate ({ gasLimit, gasPrice }) { - gasLimit = addHexPrefix(gasLimit) - gasPrice = addHexPrefix(gasPrice) return (dispatch, getState) => { const { confirmTransaction: { txData } } = getState() const newTxData = { ...txData, txParams: { ...txData.txParams, - gas: gasLimit, - gasPrice, + gas: addHexPrefix(gasLimit), + gasPrice: addHexPrefix(gasPrice), }, } @@ -364,7 +366,6 @@ export function setTransactionToConfirm (transactionId) { if (txParams.data) { const { data } = txParams - const tokenData = getTokenData(data) dispatch(updateTokenData(tokenData)) diff --git a/ui/app/ducks/confirm-transaction/confirm-transaction.duck.test.js b/ui/app/ducks/confirm-transaction/confirm-transaction.duck.test.js index 9e26314e59a5..60ada9797da9 100644 --- a/ui/app/ducks/confirm-transaction/confirm-transaction.duck.test.js +++ b/ui/app/ducks/confirm-transaction/confirm-transaction.duck.test.js @@ -3,7 +3,7 @@ import configureMockStore from 'redux-mock-store' import thunk from 'redux-thunk' import sinon from 'sinon' -import ConfirmTransactionReducer, * as actions from './confirm-transaction.duck.js' +import ConfirmTransactionReducer, * as actions from './confirm-transaction.duck' const initialState = { txData: {}, @@ -43,56 +43,51 @@ const FETCH_DATA_START = 'metamask/confirm-transaction/FETCH_DATA_START' const FETCH_DATA_END = 'metamask/confirm-transaction/FETCH_DATA_END' const CLEAR_CONFIRM_TRANSACTION = 'metamask/confirm-transaction/CLEAR_CONFIRM_TRANSACTION' -describe('Confirm Transaction Duck', () => { - describe('State changes', () => { +describe('Confirm Transaction Duck', function () { + describe('State changes', function () { const mockState = { - confirmTransaction: { - txData: { - id: 1, - }, - tokenData: { - name: 'abcToken', - }, - methodData: { - name: 'approve', - }, - tokenProps: { - tokenDecimals: '3', - tokenSymbol: 'ABC', - }, - fiatTransactionAmount: '469.26', - fiatTransactionFee: '0.01', - fiatTransactionTotal: '1.000021', - ethTransactionAmount: '1', - ethTransactionFee: '0.000021', - ethTransactionTotal: '469.27', - hexTransactionAmount: '', - hexTransactionFee: '0x1319718a5000', - hexTransactionTotal: '', - nonce: '0x0', - toSmartContract: false, - fetchingData: false, + txData: { + id: 1, }, + tokenData: { + name: 'abcToken', + }, + methodData: { + name: 'approve', + }, + tokenProps: { + tokenDecimals: '3', + tokenSymbol: 'ABC', + }, + fiatTransactionAmount: '469.26', + fiatTransactionFee: '0.01', + fiatTransactionTotal: '1.000021', + ethTransactionAmount: '1', + ethTransactionFee: '0.000021', + ethTransactionTotal: '469.27', + hexTransactionAmount: '', + hexTransactionFee: '0x1319718a5000', + hexTransactionTotal: '', + nonce: '0x0', + toSmartContract: false, + fetchingData: false, } - it('should initialize state', () => { - assert.deepEqual( - ConfirmTransactionReducer({}), - initialState - ) + it('should initialize state', function () { + assert.deepEqual(ConfirmTransactionReducer(undefined, {}), initialState) }) - it('should return state unchanged if it does not match a dispatched actions type', () => { + it('should return state unchanged if it does not match a dispatched actions type', function () { assert.deepEqual( ConfirmTransactionReducer(mockState, { type: 'someOtherAction', value: 'someValue', }), - { ...mockState.confirmTransaction }, + { ...mockState }, ) }) - it('should set txData when receiving a UPDATE_TX_DATA action', () => { + it('should set txData when receiving a UPDATE_TX_DATA action', function () { assert.deepEqual( ConfirmTransactionReducer(mockState, { type: UPDATE_TX_DATA, @@ -101,28 +96,28 @@ describe('Confirm Transaction Duck', () => { }, }), { - ...mockState.confirmTransaction, + ...mockState, txData: { - ...mockState.confirmTransaction.txData, + ...mockState.txData, id: 2, }, - } + }, ) }) - it('should clear txData when receiving a CLEAR_TX_DATA action', () => { + it('should clear txData when receiving a CLEAR_TX_DATA action', function () { assert.deepEqual( ConfirmTransactionReducer(mockState, { type: CLEAR_TX_DATA, }), { - ...mockState.confirmTransaction, + ...mockState, txData: {}, - } + }, ) }) - it('should set tokenData when receiving a UPDATE_TOKEN_DATA action', () => { + it('should set tokenData when receiving a UPDATE_TOKEN_DATA action', function () { assert.deepEqual( ConfirmTransactionReducer(mockState, { type: UPDATE_TOKEN_DATA, @@ -131,28 +126,28 @@ describe('Confirm Transaction Duck', () => { }, }), { - ...mockState.confirmTransaction, + ...mockState, tokenData: { - ...mockState.confirmTransaction.tokenData, + ...mockState.tokenData, name: 'defToken', }, - } + }, ) }) - it('should clear tokenData when receiving a CLEAR_TOKEN_DATA action', () => { + it('should clear tokenData when receiving a CLEAR_TOKEN_DATA action', function () { assert.deepEqual( ConfirmTransactionReducer(mockState, { type: CLEAR_TOKEN_DATA, }), { - ...mockState.confirmTransaction, + ...mockState, tokenData: {}, - } + }, ) }) - it('should set methodData when receiving a UPDATE_METHOD_DATA action', () => { + it('should set methodData when receiving a UPDATE_METHOD_DATA action', function () { assert.deepEqual( ConfirmTransactionReducer(mockState, { type: UPDATE_METHOD_DATA, @@ -161,28 +156,28 @@ describe('Confirm Transaction Duck', () => { }, }), { - ...mockState.confirmTransaction, + ...mockState, methodData: { - ...mockState.confirmTransaction.methodData, + ...mockState.methodData, name: 'transferFrom', }, - } + }, ) }) - it('should clear methodData when receiving a CLEAR_METHOD_DATA action', () => { + it('should clear methodData when receiving a CLEAR_METHOD_DATA action', function () { assert.deepEqual( ConfirmTransactionReducer(mockState, { type: CLEAR_METHOD_DATA, }), { - ...mockState.confirmTransaction, + ...mockState, methodData: {}, - } + }, ) }) - it('should update transaction amounts when receiving an UPDATE_TRANSACTION_AMOUNTS action', () => { + it('should update transaction amounts when receiving an UPDATE_TRANSACTION_AMOUNTS action', function () { assert.deepEqual( ConfirmTransactionReducer(mockState, { type: UPDATE_TRANSACTION_AMOUNTS, @@ -193,15 +188,15 @@ describe('Confirm Transaction Duck', () => { }, }), { - ...mockState.confirmTransaction, + ...mockState, fiatTransactionAmount: '123.45', ethTransactionAmount: '.5', hexTransactionAmount: '0x1', - } + }, ) }) - it('should update transaction fees when receiving an UPDATE_TRANSACTION_FEES action', () => { + it('should update transaction fees when receiving an UPDATE_TRANSACTION_FEES action', function () { assert.deepEqual( ConfirmTransactionReducer(mockState, { type: UPDATE_TRANSACTION_FEES, @@ -212,15 +207,15 @@ describe('Confirm Transaction Duck', () => { }, }), { - ...mockState.confirmTransaction, + ...mockState, fiatTransactionFee: '123.45', ethTransactionFee: '.5', hexTransactionFee: '0x1', - } + }, ) }) - it('should update transaction totals when receiving an UPDATE_TRANSACTION_TOTALS action', () => { + it('should update transaction totals when receiving an UPDATE_TRANSACTION_TOTALS action', function () { assert.deepEqual( ConfirmTransactionReducer(mockState, { type: UPDATE_TRANSACTION_TOTALS, @@ -231,15 +226,15 @@ describe('Confirm Transaction Duck', () => { }, }), { - ...mockState.confirmTransaction, + ...mockState, fiatTransactionTotal: '123.45', ethTransactionTotal: '.5', hexTransactionTotal: '0x1', - } + }, ) }) - it('should update tokenProps when receiving an UPDATE_TOKEN_PROPS action', () => { + it('should update tokenProps when receiving an UPDATE_TOKEN_PROPS action', function () { assert.deepEqual( ConfirmTransactionReducer(mockState, { type: UPDATE_TOKEN_PROPS, @@ -249,78 +244,67 @@ describe('Confirm Transaction Duck', () => { }, }), { - ...mockState.confirmTransaction, + ...mockState, tokenProps: { tokenSymbol: 'DEF', tokenDecimals: '1', }, - } + }, ) }) - it('should update nonce when receiving an UPDATE_NONCE action', () => { + it('should update nonce when receiving an UPDATE_NONCE action', function () { assert.deepEqual( ConfirmTransactionReducer(mockState, { type: UPDATE_NONCE, payload: '0x1', }), { - ...mockState.confirmTransaction, + ...mockState, nonce: '0x1', - } + }, ) }) - it('should update nonce when receiving an UPDATE_TO_SMART_CONTRACT action', () => { + it('should update nonce when receiving an UPDATE_TO_SMART_CONTRACT action', function () { assert.deepEqual( ConfirmTransactionReducer(mockState, { type: UPDATE_TO_SMART_CONTRACT, payload: true, }), { - ...mockState.confirmTransaction, + ...mockState, toSmartContract: true, - } + }, ) }) - it('should set fetchingData to true when receiving a FETCH_DATA_START action', () => { + it('should set fetchingData to true when receiving a FETCH_DATA_START action', function () { assert.deepEqual( ConfirmTransactionReducer(mockState, { type: FETCH_DATA_START, }), { - ...mockState.confirmTransaction, + ...mockState, fetchingData: true, - } + }, ) }) - it('should set fetchingData to false when receiving a FETCH_DATA_END action', () => { + it('should set fetchingData to false when receiving a FETCH_DATA_END action', function () { assert.deepEqual( - ConfirmTransactionReducer({ confirmTransaction: { fetchingData: true } }, { - type: FETCH_DATA_END, - }), - { - fetchingData: false, - } + ConfirmTransactionReducer({ fetchingData: true }, { type: FETCH_DATA_END }), + { fetchingData: false }, ) }) - it('should clear confirmTransaction when receiving a FETCH_DATA_END action', () => { - assert.deepEqual( - ConfirmTransactionReducer(mockState, { - type: CLEAR_CONFIRM_TRANSACTION, - }), - { - ...initialState, - } - ) + it('should clear confirmTransaction when receiving a FETCH_DATA_END action', function () { + assert.deepEqual(ConfirmTransactionReducer(mockState, { type: CLEAR_CONFIRM_TRANSACTION }), initialState) }) }) - describe('Single actions', () => { - it('should create an action to update txData', () => { + describe('Single actions', function () { + it('should create an action to update txData', function () { const txData = { test: 123 } const expectedAction = { type: UPDATE_TX_DATA, @@ -329,22 +313,22 @@ describe('Confirm Transaction Duck', () => { assert.deepEqual( actions.updateTxData(txData), - expectedAction + expectedAction, ) }) - it('should create an action to clear txData', () => { + it('should create an action to clear txData', function () { const expectedAction = { type: CLEAR_TX_DATA, } assert.deepEqual( actions.clearTxData(), - expectedAction + expectedAction, ) }) - it('should create an action to update tokenData', () => { + it('should create an action to update tokenData', function () { const tokenData = { test: 123 } const expectedAction = { type: UPDATE_TOKEN_DATA, @@ -353,22 +337,22 @@ describe('Confirm Transaction Duck', () => { assert.deepEqual( actions.updateTokenData(tokenData), - expectedAction + expectedAction, ) }) - it('should create an action to clear tokenData', () => { + it('should create an action to clear tokenData', function () { const expectedAction = { type: CLEAR_TOKEN_DATA, } assert.deepEqual( actions.clearTokenData(), - expectedAction + expectedAction, ) }) - it('should create an action to update methodData', () => { + it('should create an action to update methodData', function () { const methodData = { test: 123 } const expectedAction = { type: UPDATE_METHOD_DATA, @@ -377,22 +361,22 @@ describe('Confirm Transaction Duck', () => { assert.deepEqual( actions.updateMethodData(methodData), - expectedAction + expectedAction, ) }) - it('should create an action to clear methodData', () => { + it('should create an action to clear methodData', function () { const expectedAction = { type: CLEAR_METHOD_DATA, } assert.deepEqual( actions.clearMethodData(), - expectedAction + expectedAction, ) }) - it('should create an action to update transaction amounts', () => { + it('should create an action to update transaction amounts', function () { const transactionAmounts = { test: 123 } const expectedAction = { type: UPDATE_TRANSACTION_AMOUNTS, @@ -401,11 +385,11 @@ describe('Confirm Transaction Duck', () => { assert.deepEqual( actions.updateTransactionAmounts(transactionAmounts), - expectedAction + expectedAction, ) }) - it('should create an action to update transaction fees', () => { + it('should create an action to update transaction fees', function () { const transactionFees = { test: 123 } const expectedAction = { type: UPDATE_TRANSACTION_FEES, @@ -414,11 +398,11 @@ describe('Confirm Transaction Duck', () => { assert.deepEqual( actions.updateTransactionFees(transactionFees), - expectedAction + expectedAction, ) }) - it('should create an action to update transaction totals', () => { + it('should create an action to update transaction totals', function () { const transactionTotals = { test: 123 } const expectedAction = { type: UPDATE_TRANSACTION_TOTALS, @@ -427,11 +411,11 @@ describe('Confirm Transaction Duck', () => { assert.deepEqual( actions.updateTransactionTotals(transactionTotals), - expectedAction + expectedAction, ) }) - it('should create an action to update tokenProps', () => { + it('should create an action to update tokenProps', function () { const tokenProps = { tokenDecimals: '1', tokenSymbol: 'abc', @@ -443,11 +427,11 @@ describe('Confirm Transaction Duck', () => { assert.deepEqual( actions.updateTokenProps(tokenProps), - expectedAction + expectedAction, ) }) - it('should create an action to update nonce', () => { + it('should create an action to update nonce', function () { const nonce = '0x1' const expectedAction = { type: UPDATE_NONCE, @@ -456,58 +440,58 @@ describe('Confirm Transaction Duck', () => { assert.deepEqual( actions.updateNonce(nonce), - expectedAction + expectedAction, ) }) - it('should create an action to set fetchingData to true', () => { + it('should create an action to set fetchingData to true', function () { const expectedAction = { type: FETCH_DATA_START, } assert.deepEqual( actions.setFetchingData(true), - expectedAction + expectedAction, ) }) - it('should create an action to set fetchingData to false', () => { + it('should create an action to set fetchingData to false', function () { const expectedAction = { type: FETCH_DATA_END, } assert.deepEqual( actions.setFetchingData(false), - expectedAction + expectedAction, ) }) - it('should create an action to clear confirmTransaction', () => { + it('should create an action to clear confirmTransaction', function () { const expectedAction = { type: CLEAR_CONFIRM_TRANSACTION, } assert.deepEqual( actions.clearConfirmTransaction(), - expectedAction + expectedAction, ) }) }) - describe('Thunk actions', () => { - beforeEach(() => { + describe('Thunk actions', function () { + beforeEach(function () { global.eth = { getCode: sinon.stub().callsFake( - address => Promise.resolve(address && address.match(/isContract/) ? 'not-0x' : '0x') + (address) => Promise.resolve(address && address.match(/isContract/u) ? 'not-0x' : '0x'), ), } }) - afterEach(() => { + afterEach(function () { global.eth.getCode.resetHistory() }) - it('updates txData and gas on an existing transaction in confirmTransaction', () => { + it('updates txData and gas on an existing transaction in confirmTransaction', function () { const mockState = { metamask: { conversionRate: 468.58, @@ -530,15 +514,11 @@ describe('Confirm Transaction Duck', () => { tokenSymbol: '', }, txData: { - estimatedGas: '0x5208', - gasLimitSpecified: false, - gasPriceSpecified: false, history: [], id: 2603411941761054, loadingDefaults: false, metamaskNetworkId: '3', origin: 'faucet.metamask.io', - simpleSend: true, status: 'unapproved', time: 1530838113716, }, @@ -562,17 +542,13 @@ describe('Confirm Transaction Duck', () => { storeActions.forEach((action, index) => assert.equal(action.type, expectedActions[index])) }) - it('updates txData and updates gas values in confirmTransaction', () => { + it('updates txData and updates gas values in confirmTransaction', function () { const txData = { - estimatedGas: '0x5208', - gasLimitSpecified: false, - gasPriceSpecified: false, history: [], id: 2603411941761054, loadingDefaults: false, metamaskNetworkId: '3', origin: 'faucet.metamask.io', - simpleSend: true, status: 'unapproved', time: 1530838113716, txParams: { @@ -630,7 +606,7 @@ describe('Confirm Transaction Duck', () => { storeActions.forEach((action, index) => assert.equal(action.type, expectedActions[index])) }) - it('updates confirmTransaction transaction', () => { + it('updates confirmTransaction transaction', function () { const mockState = { metamask: { conversionRate: 468.58, @@ -638,15 +614,11 @@ describe('Confirm Transaction Duck', () => { network: '3', unapprovedTxs: { 2603411941761054: { - estimatedGas: '0x5208', - gasLimitSpecified: false, - gasPriceSpecified: false, history: [], id: 2603411941761054, loadingDefaults: false, metamaskNetworkId: '3', origin: 'faucet.metamask.io', - simpleSend: true, status: 'unapproved', time: 1530838113716, txParams: { diff --git a/ui/app/ducks/gas/gas-duck.test.js b/ui/app/ducks/gas/gas-duck.test.js index b7e83a81c6c5..d7ae9b87368d 100644 --- a/ui/app/ducks/gas/gas-duck.test.js +++ b/ui/app/ducks/gas/gas-duck.test.js @@ -2,12 +2,10 @@ import assert from 'assert' import sinon from 'sinon' import proxyquire from 'proxyquire' +const fakeLocalStorage = {} const GasDuck = proxyquire('./gas.duck.js', { - '../../../lib/local-storage-helpers': { - loadLocalStorageData: sinon.spy(), - saveLocalStorageData: sinon.spy(), - }, + '../../../lib/local-storage-helpers': fakeLocalStorage, }) const { @@ -29,7 +27,7 @@ const { } = GasDuck const GasReducer = GasDuck.default -describe('Gas Duck', () => { +describe('Gas Duck', function () { let tempFetch let tempDateNow const mockEthGasApiResponse = { @@ -68,32 +66,34 @@ describe('Gas Duck', () => { { expectedTime: 1.1, expectedWait: 0.6, gasprice: 19.9, somethingElse: 'foobar' }, { expectedTime: 1, expectedWait: 0.5, gasprice: 20, somethingElse: 'foobar' }, ] - const fetchStub = sinon.stub().callsFake((url) => new Promise(resolve => { - const dataToResolve = url.match(/ethgasAPI|gasexpress/) + const fakeFetch = (url) => new Promise((resolve) => { + const dataToResolve = url.match(/ethgasAPI/u) ? mockEthGasApiResponse : mockPredictTableResponse resolve({ - json: () => new Promise(resolve => resolve(dataToResolve)), + json: () => Promise.resolve(dataToResolve), }) - })) + }) - beforeEach(() => { - tempFetch = global.fetch + beforeEach(function () { + tempFetch = window.fetch tempDateNow = global.Date.now - global.fetch = fetchStub + + fakeLocalStorage.loadLocalStorageData = sinon.stub() + fakeLocalStorage.saveLocalStorageData = sinon.spy() + window.fetch = sinon.stub().callsFake(fakeFetch) global.Date.now = () => 2000000 }) - afterEach(() => { - fetchStub.resetHistory() - global.fetch = tempFetch + afterEach(function () { + sinon.restore() + + window.fetch = tempFetch global.Date.now = tempDateNow }) const mockState = { - gas: { - mockProp: 123, - }, + mockProp: 123, } const initState = { customData: { @@ -118,7 +118,6 @@ describe('Gas Duck', () => { gasEstimatesLoading: true, priceAndTimeEstimates: [], priceAndTimeEstimatesLastRetrieved: 0, - basicPriceAndTimeEstimates: [], basicPriceAndTimeEstimatesLastRetrieved: 0, basicPriceEstimatesLastRetrieved: 0, } @@ -137,258 +136,293 @@ describe('Gas Duck', () => { const SET_BASIC_API_ESTIMATES_LAST_RETRIEVED = 'metamask/gas/SET_BASIC_API_ESTIMATES_LAST_RETRIEVED' const SET_BASIC_PRICE_ESTIMATES_LAST_RETRIEVED = 'metamask/gas/SET_BASIC_PRICE_ESTIMATES_LAST_RETRIEVED' - describe('GasReducer()', () => { - it('should initialize state', () => { - assert.deepEqual( - GasReducer({}), - initState - ) + describe('GasReducer()', function () { + it('should initialize state', function () { + assert.deepEqual(GasReducer(undefined, {}), initState) }) - it('should return state unchanged if it does not match a dispatched actions type', () => { + it('should return state unchanged if it does not match a dispatched actions type', function () { assert.deepEqual( GasReducer(mockState, { type: 'someOtherAction', value: 'someValue', }), - Object.assign({}, mockState.gas) + mockState, ) }) - it('should set basicEstimateIsLoading to true when receiving a BASIC_GAS_ESTIMATE_LOADING_STARTED action', () => { + it('should set basicEstimateIsLoading to true when receiving a BASIC_GAS_ESTIMATE_LOADING_STARTED action', function () { assert.deepEqual( - GasReducer(mockState, { - type: BASIC_GAS_ESTIMATE_LOADING_STARTED, - }), - Object.assign({basicEstimateIsLoading: true}, mockState.gas) + GasReducer(mockState, { type: BASIC_GAS_ESTIMATE_LOADING_STARTED }), + { basicEstimateIsLoading: true, ...mockState }, ) }) - it('should set basicEstimateIsLoading to false when receiving a BASIC_GAS_ESTIMATE_LOADING_FINISHED action', () => { + it('should set basicEstimateIsLoading to false when receiving a BASIC_GAS_ESTIMATE_LOADING_FINISHED action', function () { assert.deepEqual( - GasReducer(mockState, { - type: BASIC_GAS_ESTIMATE_LOADING_FINISHED, - }), - Object.assign({basicEstimateIsLoading: false}, mockState.gas) + GasReducer(mockState, { type: BASIC_GAS_ESTIMATE_LOADING_FINISHED }), + { basicEstimateIsLoading: false, ...mockState }, ) }) - it('should set gasEstimatesLoading to true when receiving a GAS_ESTIMATE_LOADING_STARTED action', () => { + it('should set gasEstimatesLoading to true when receiving a GAS_ESTIMATE_LOADING_STARTED action', function () { assert.deepEqual( - GasReducer(mockState, { - type: GAS_ESTIMATE_LOADING_STARTED, - }), - Object.assign({gasEstimatesLoading: true}, mockState.gas) + GasReducer(mockState, { type: GAS_ESTIMATE_LOADING_STARTED }), + { gasEstimatesLoading: true, ...mockState }, ) }) - it('should set gasEstimatesLoading to false when receiving a GAS_ESTIMATE_LOADING_FINISHED action', () => { + it('should set gasEstimatesLoading to false when receiving a GAS_ESTIMATE_LOADING_FINISHED action', function () { assert.deepEqual( - GasReducer(mockState, { - type: GAS_ESTIMATE_LOADING_FINISHED, - }), - Object.assign({gasEstimatesLoading: false}, mockState.gas) + GasReducer(mockState, { type: GAS_ESTIMATE_LOADING_FINISHED }), + { gasEstimatesLoading: false, ...mockState }, ) }) - it('should return a new object (and not just modify the existing state object)', () => { - assert.deepEqual(GasReducer(mockState), mockState.gas) - assert.notEqual(GasReducer(mockState), mockState.gas) - }) - - it('should set basicEstimates when receiving a SET_BASIC_GAS_ESTIMATE_DATA action', () => { + it('should set basicEstimates when receiving a SET_BASIC_GAS_ESTIMATE_DATA action', function () { assert.deepEqual( GasReducer(mockState, { type: SET_BASIC_GAS_ESTIMATE_DATA, value: { someProp: 'someData123' }, }), - Object.assign({basicEstimates: {someProp: 'someData123'} }, mockState.gas) + { basicEstimates: { someProp: 'someData123' }, ...mockState }, ) }) - it('should set priceAndTimeEstimates when receiving a SET_PRICE_AND_TIME_ESTIMATES action', () => { + it('should set priceAndTimeEstimates when receiving a SET_PRICE_AND_TIME_ESTIMATES action', function () { assert.deepEqual( GasReducer(mockState, { type: SET_PRICE_AND_TIME_ESTIMATES, value: { someProp: 'someData123' }, }), - Object.assign({priceAndTimeEstimates: {someProp: 'someData123'} }, mockState.gas) + { priceAndTimeEstimates: { someProp: 'someData123' }, ...mockState }, ) }) - it('should set customData.price when receiving a SET_CUSTOM_GAS_PRICE action', () => { + it('should set customData.price when receiving a SET_CUSTOM_GAS_PRICE action', function () { assert.deepEqual( GasReducer(mockState, { type: SET_CUSTOM_GAS_PRICE, value: 4321, }), - Object.assign({customData: {price: 4321} }, mockState.gas) + { customData: { price: 4321 }, ...mockState }, ) }) - it('should set customData.limit when receiving a SET_CUSTOM_GAS_LIMIT action', () => { + it('should set customData.limit when receiving a SET_CUSTOM_GAS_LIMIT action', function () { assert.deepEqual( GasReducer(mockState, { type: SET_CUSTOM_GAS_LIMIT, value: 9876, }), - Object.assign({customData: {limit: 9876} }, mockState.gas) + { customData: { limit: 9876 }, ...mockState }, ) }) - it('should set customData.total when receiving a SET_CUSTOM_GAS_TOTAL action', () => { + it('should set customData.total when receiving a SET_CUSTOM_GAS_TOTAL action', function () { assert.deepEqual( GasReducer(mockState, { type: SET_CUSTOM_GAS_TOTAL, value: 10000, }), - Object.assign({customData: {total: 10000} }, mockState.gas) + { customData: { total: 10000 }, ...mockState }, ) }) - it('should set priceAndTimeEstimatesLastRetrieved when receiving a SET_API_ESTIMATES_LAST_RETRIEVED action', () => { + it('should set priceAndTimeEstimatesLastRetrieved when receiving a SET_API_ESTIMATES_LAST_RETRIEVED action', function () { assert.deepEqual( GasReducer(mockState, { type: SET_API_ESTIMATES_LAST_RETRIEVED, value: 1500000000000, }), - Object.assign({ priceAndTimeEstimatesLastRetrieved: 1500000000000 }, mockState.gas) + { priceAndTimeEstimatesLastRetrieved: 1500000000000, ...mockState }, ) }) - it('should set priceAndTimeEstimatesLastRetrieved when receiving a SET_BASIC_API_ESTIMATES_LAST_RETRIEVED action', () => { + it('should set priceAndTimeEstimatesLastRetrieved when receiving a SET_BASIC_API_ESTIMATES_LAST_RETRIEVED action', function () { assert.deepEqual( GasReducer(mockState, { type: SET_BASIC_API_ESTIMATES_LAST_RETRIEVED, value: 1700000000000, }), - Object.assign({ basicPriceAndTimeEstimatesLastRetrieved: 1700000000000 }, mockState.gas) + { basicPriceAndTimeEstimatesLastRetrieved: 1700000000000, ...mockState }, ) }) - it('should set errors when receiving a SET_CUSTOM_GAS_ERRORS action', () => { + it('should set errors when receiving a SET_CUSTOM_GAS_ERRORS action', function () { assert.deepEqual( GasReducer(mockState, { type: SET_CUSTOM_GAS_ERRORS, value: { someError: 'error_error' }, }), - Object.assign({errors: {someError: 'error_error'} }, mockState.gas) + { errors: { someError: 'error_error' }, ...mockState }, ) }) - it('should return the initial state in response to a RESET_CUSTOM_GAS_STATE action', () => { + it('should return the initial state in response to a RESET_CUSTOM_GAS_STATE action', function () { assert.deepEqual( - GasReducer(mockState, { - type: RESET_CUSTOM_GAS_STATE, - }), - Object.assign({}, initState) + GasReducer(mockState, { type: RESET_CUSTOM_GAS_STATE }), + initState, ) }) }) - describe('basicGasEstimatesLoadingStarted', () => { - it('should create the correct action', () => { - assert.deepEqual( - basicGasEstimatesLoadingStarted(), - { type: BASIC_GAS_ESTIMATE_LOADING_STARTED } - ) + describe('basicGasEstimatesLoadingStarted', function () { + it('should create the correct action', function () { + assert.deepEqual(basicGasEstimatesLoadingStarted(), { type: BASIC_GAS_ESTIMATE_LOADING_STARTED }) }) }) - describe('basicGasEstimatesLoadingFinished', () => { - it('should create the correct action', () => { - assert.deepEqual( - basicGasEstimatesLoadingFinished(), - { type: BASIC_GAS_ESTIMATE_LOADING_FINISHED } - ) + describe('basicGasEstimatesLoadingFinished', function () { + it('should create the correct action', function () { + assert.deepEqual(basicGasEstimatesLoadingFinished(), { type: BASIC_GAS_ESTIMATE_LOADING_FINISHED }) }) }) - describe('fetchBasicGasEstimates', () => { - const mockDistpatch = sinon.spy() - it('should call fetch with the expected params', async () => { - await fetchBasicGasEstimates()(mockDistpatch, () => ({ gas: Object.assign( - {}, - initState, - { basicPriceAEstimatesLastRetrieved: 1000000 } - ) })) + describe('fetchBasicGasEstimates', function () { + it('should call fetch with the expected params', async function () { + const mockDistpatch = sinon.spy() + + await fetchBasicGasEstimates()(mockDistpatch, () => ({ + gas: { ...initState, basicPriceAEstimatesLastRetrieved: 1000000 }, + })) assert.deepEqual( mockDistpatch.getCall(0).args, - [{ type: BASIC_GAS_ESTIMATE_LOADING_STARTED} ] - ) - assert.deepEqual( - global.fetch.getCall(0).args, - [ - 'https://dev.blockscale.net/api/gasexpress.json', - { - 'headers': {}, - 'referrer': 'https://dev.blockscale.net/api/', - 'referrerPolicy': 'no-referrer-when-downgrade', - 'body': null, - 'method': 'GET', - 'mode': 'cors', + [{ type: BASIC_GAS_ESTIMATE_LOADING_STARTED }], + ) + assert.ok( + window.fetch.getCall(0).args[0].startsWith('https://ethgasstation.info/json/ethgasAPI.json'), + 'should fetch ETH Gas Station', + ) + assert.deepEqual( + mockDistpatch.getCall(1).args, + [{ type: SET_BASIC_PRICE_ESTIMATES_LAST_RETRIEVED, value: 2000000 }], + ) + assert.deepEqual( + mockDistpatch.getCall(2).args, + [{ + type: SET_BASIC_GAS_ESTIMATE_DATA, + value: { + average: 2, + blockTime: 'mockBlock_time', + blockNum: 'mockBlockNum', + fast: 3, + fastest: 4, + safeLow: 1, }, - ] + }], + ) + assert.deepEqual( + mockDistpatch.getCall(3).args, + [{ type: BASIC_GAS_ESTIMATE_LOADING_FINISHED }], ) + }) + + it('should fetch recently retrieved estimates from local storage', async function () { + const mockDistpatch = sinon.spy() + fakeLocalStorage.loadLocalStorageData + .withArgs('BASIC_PRICE_ESTIMATES_LAST_RETRIEVED') + .returns(2000000 - 1) // one second ago from "now" + fakeLocalStorage.loadLocalStorageData + .withArgs('BASIC_PRICE_ESTIMATES') + .returns({ + average: 25, + blockTime: 'mockBlock_time', + blockNum: 'mockBlockNum', + fast: 35, + fastest: 45, + safeLow: 15, + }) + await fetchBasicGasEstimates()(mockDistpatch, () => ({ gas: { ...initState } })) + assert.deepEqual( + mockDistpatch.getCall(0).args, + [{ type: BASIC_GAS_ESTIMATE_LOADING_STARTED }], + ) + assert.ok(window.fetch.notCalled) assert.deepEqual( mockDistpatch.getCall(1).args, - [{ type: SET_BASIC_PRICE_ESTIMATES_LAST_RETRIEVED, value: 2000000 } ] + [{ + type: SET_BASIC_GAS_ESTIMATE_DATA, + value: { + average: 25, + blockTime: 'mockBlock_time', + blockNum: 'mockBlockNum', + fast: 35, + fastest: 45, + safeLow: 15, + }, + }], ) + assert.deepEqual( + mockDistpatch.getCall(2).args, + [{ type: BASIC_GAS_ESTIMATE_LOADING_FINISHED }], + ) + }) + it('should fallback to network if retrieving estimates from local storage fails', async function () { + const mockDistpatch = sinon.spy() + fakeLocalStorage.loadLocalStorageData + .withArgs('BASIC_PRICE_ESTIMATES_LAST_RETRIEVED') + .returns(2000000 - 1) // one second ago from "now" + + await fetchBasicGasEstimates()(mockDistpatch, () => ({ gas: { ...initState } })) + assert.deepEqual( + mockDistpatch.getCall(0).args, + [{ type: BASIC_GAS_ESTIMATE_LOADING_STARTED }], + ) + assert.ok( + window.fetch.getCall(0).args[0].startsWith('https://ethgasstation.info/json/ethgasAPI.json'), + 'should fetch ETH Gas Station', + ) + assert.deepEqual( + mockDistpatch.getCall(1).args, + [{ type: SET_BASIC_PRICE_ESTIMATES_LAST_RETRIEVED, value: 2000000 }], + ) assert.deepEqual( mockDistpatch.getCall(2).args, [{ type: SET_BASIC_GAS_ESTIMATE_DATA, value: { - average: 20, + average: 2, blockTime: 'mockBlock_time', blockNum: 'mockBlockNum', - fast: 30, - fastest: 40, - safeLow: 10, + fast: 3, + fastest: 4, + safeLow: 1, }, - }] + }], ) assert.deepEqual( mockDistpatch.getCall(3).args, - [{ type: BASIC_GAS_ESTIMATE_LOADING_FINISHED }] + [{ type: BASIC_GAS_ESTIMATE_LOADING_FINISHED }], ) }) }) - describe('fetchBasicGasAndTimeEstimates', () => { - const mockDistpatch = sinon.spy() - it('should call fetch with the expected params', async () => { - await fetchBasicGasAndTimeEstimates()(mockDistpatch, () => ({ gas: Object.assign( - {}, - initState, - { basicPriceAndTimeEstimatesLastRetrieved: 1000000 } - ), + describe('fetchBasicGasAndTimeEstimates', function () { + it('should call fetch with the expected params', async function () { + const mockDistpatch = sinon.spy() + + await fetchBasicGasAndTimeEstimates()(mockDistpatch, () => ({ + gas: { + ...initState, + basicPriceAndTimeEstimatesLastRetrieved: 1000000, + }, metamask: { provider: { type: 'ropsten' } }, })) assert.deepEqual( mockDistpatch.getCall(0).args, - [{ type: BASIC_GAS_ESTIMATE_LOADING_STARTED} ] - ) - assert.deepEqual( - global.fetch.getCall(0).args, - [ - 'https://ethgasstation.info/json/ethgasAPI.json', - { - 'headers': {}, - 'referrer': 'http://ethgasstation.info/json/', - 'referrerPolicy': 'no-referrer-when-downgrade', - 'body': null, - 'method': 'GET', - 'mode': 'cors', - }, - ] + [{ type: BASIC_GAS_ESTIMATE_LOADING_STARTED }], + ) + assert.ok( + window.fetch.getCall(0).args[0].startsWith('https://ethgasstation.info/json/ethgasAPI.json'), + 'should fetch ETH Gas Station', ) assert.deepEqual( mockDistpatch.getCall(1).args, - [{ type: SET_BASIC_API_ESTIMATES_LAST_RETRIEVED, value: 2000000 } ] + [{ type: SET_BASIC_API_ESTIMATES_LAST_RETRIEVED, value: 2000000 }], ) assert.deepEqual( @@ -408,89 +442,182 @@ describe('Gas Duck', () => { safeLowWait: 'mockSafeLowWait', speed: 'mockSpeed', }, - }] + }], ) assert.deepEqual( mockDistpatch.getCall(3).args, - [{ type: BASIC_GAS_ESTIMATE_LOADING_FINISHED }] + [{ type: BASIC_GAS_ESTIMATE_LOADING_FINISHED }], + ) + }) + + it('should fetch recently retrieved estimates from local storage', async function () { + const mockDistpatch = sinon.spy() + fakeLocalStorage.loadLocalStorageData + .withArgs('BASIC_GAS_AND_TIME_API_ESTIMATES_LAST_RETRIEVED') + .returns(2000000 - 1) // one second ago from "now" + fakeLocalStorage.loadLocalStorageData + .withArgs('BASIC_GAS_AND_TIME_API_ESTIMATES') + .returns({ + average: 5, + avgWait: 'mockAvgWait', + blockTime: 'mockBlock_time', + blockNum: 'mockBlockNum', + fast: 6, + fastest: 7, + fastestWait: 'mockFastestWait', + fastWait: 'mockFastWait', + safeLow: 1, + safeLowWait: 'mockSafeLowWait', + speed: 'mockSpeed', + }) + + await fetchBasicGasAndTimeEstimates()(mockDistpatch, () => ({ + gas: { + ...initState, + }, + metamask: { provider: { type: 'ropsten' } }, + })) + assert.deepEqual( + mockDistpatch.getCall(0).args, + [{ type: BASIC_GAS_ESTIMATE_LOADING_STARTED }], + ) + assert.ok(window.fetch.notCalled) + + assert.deepEqual( + mockDistpatch.getCall(1).args, + [{ + type: SET_BASIC_GAS_ESTIMATE_DATA, + value: { + average: 5, + avgWait: 'mockAvgWait', + blockTime: 'mockBlock_time', + blockNum: 'mockBlockNum', + fast: 6, + fastest: 7, + fastestWait: 'mockFastestWait', + fastWait: 'mockFastWait', + safeLow: 1, + safeLowWait: 'mockSafeLowWait', + speed: 'mockSpeed', + }, + }], + ) + assert.deepEqual( + mockDistpatch.getCall(2).args, + [{ type: BASIC_GAS_ESTIMATE_LOADING_FINISHED }], ) }) - }) - describe('fetchGasEstimates', () => { - const mockDistpatch = sinon.spy() + it('should fallback to network if retrieving estimates from local storage fails', async function () { + const mockDistpatch = sinon.spy() + fakeLocalStorage.loadLocalStorageData + .withArgs('BASIC_GAS_AND_TIME_API_ESTIMATES_LAST_RETRIEVED') + .returns(2000000 - 1) // one second ago from "now" + + await fetchBasicGasAndTimeEstimates()(mockDistpatch, () => ({ + gas: { + ...initState, + }, + metamask: { provider: { type: 'ropsten' } }, + })) + assert.deepEqual( + mockDistpatch.getCall(0).args, + [{ type: BASIC_GAS_ESTIMATE_LOADING_STARTED }], + ) + assert.ok( + window.fetch.getCall(0).args[0].startsWith('https://ethgasstation.info/json/ethgasAPI.json'), + 'should fetch ETH Gas Station', + ) + + assert.deepEqual( + mockDistpatch.getCall(1).args, + [{ type: SET_BASIC_API_ESTIMATES_LAST_RETRIEVED, value: 2000000 }], + ) - beforeEach(() => { - mockDistpatch.resetHistory() + assert.deepEqual( + mockDistpatch.getCall(2).args, + [{ + type: SET_BASIC_GAS_ESTIMATE_DATA, + value: { + average: 2, + avgWait: 'mockAvgWait', + blockTime: 'mockBlock_time', + blockNum: 'mockBlockNum', + fast: 3, + fastest: 4, + fastestWait: 'mockFastestWait', + fastWait: 'mockFastWait', + safeLow: 1, + safeLowWait: 'mockSafeLowWait', + speed: 'mockSpeed', + }, + }], + ) + assert.deepEqual( + mockDistpatch.getCall(3).args, + [{ type: BASIC_GAS_ESTIMATE_LOADING_FINISHED }], + ) }) + }) - it('should call fetch with the expected params', async () => { - global.fetch.resetHistory() - await fetchGasEstimates(5)(mockDistpatch, () => ({ gas: Object.assign( - {}, - initState, - { priceAndTimeEstimatesLastRetrieved: 1000000 } - ), + describe('fetchGasEstimates', function () { + it('should call fetch with the expected params', async function () { + const mockDistpatch = sinon.spy() + + await fetchGasEstimates(5)(mockDistpatch, () => ({ + gas: { + ...initState, + priceAndTimeEstimatesLastRetrieved: 1000000, + }, metamask: { provider: { type: 'ropsten' } }, })) assert.deepEqual( mockDistpatch.getCall(0).args, - [{ type: GAS_ESTIMATE_LOADING_STARTED} ] - ) - assert.deepEqual( - global.fetch.getCall(0).args, - [ - 'https://ethgasstation.info/json/predictTable.json', - { - 'headers': {}, - 'referrer': 'http://ethgasstation.info/json/', - 'referrerPolicy': 'no-referrer-when-downgrade', - 'body': null, - 'method': 'GET', - 'mode': 'cors', - }, - ] + [{ type: GAS_ESTIMATE_LOADING_STARTED }], + ) + assert.ok( + window.fetch.getCall(0).args[0].startsWith('https://ethgasstation.info/json/predictTable.json'), + 'should fetch ETH Gas Station', ) assert.deepEqual( mockDistpatch.getCall(1).args, - [{ type: SET_API_ESTIMATES_LAST_RETRIEVED, value: 2000000 }] + [{ type: SET_API_ESTIMATES_LAST_RETRIEVED, value: 2000000 }], ) const { type: thirdDispatchCallType, value: priceAndTimeEstimateResult } = mockDistpatch.getCall(2).args[0] assert.equal(thirdDispatchCallType, SET_PRICE_AND_TIME_ESTIMATES) - assert(priceAndTimeEstimateResult.length < mockPredictTableResponse.length * 3 - 2) - assert(!priceAndTimeEstimateResult.find(d => d.expectedTime > 100)) + assert(priceAndTimeEstimateResult.length < ((mockPredictTableResponse.length * 3) - 2)) + assert(!priceAndTimeEstimateResult.find((d) => d.expectedTime > 100)) assert(!priceAndTimeEstimateResult.find((d, _, a) => a[a + 1] && d.expectedTime > a[a + 1].expectedTime)) assert(!priceAndTimeEstimateResult.find((d, _, a) => a[a + 1] && d.gasprice > a[a + 1].gasprice)) assert.deepEqual( mockDistpatch.getCall(3).args, - [{ type: GAS_ESTIMATE_LOADING_FINISHED }] + [{ type: GAS_ESTIMATE_LOADING_FINISHED }], ) }) - it('should not call fetch if the estimates were retrieved < 75000 ms ago', async () => { - global.fetch.resetHistory() - await fetchGasEstimates(5)(mockDistpatch, () => ({ gas: Object.assign( - {}, - initState, - { + it('should not call fetch if the estimates were retrieved < 75000 ms ago', async function () { + const mockDistpatch = sinon.spy() + + await fetchGasEstimates(5)(mockDistpatch, () => ({ + gas: { + ...initState, priceAndTimeEstimatesLastRetrieved: Date.now(), priceAndTimeEstimates: [{ expectedTime: '10', expectedWait: 2, gasprice: 50, }], - } - ), + }, metamask: { provider: { type: 'ropsten' } }, })) assert.deepEqual( mockDistpatch.getCall(0).args, - [{ type: GAS_ESTIMATE_LOADING_STARTED} ] + [{ type: GAS_ESTIMATE_LOADING_STARTED }], ) - assert.equal(global.fetch.callCount, 0) + assert.equal(window.fetch.callCount, 0) assert.deepEqual( mockDistpatch.getCall(1).args, @@ -504,103 +631,102 @@ describe('Gas Duck', () => { }, ], - }] + }], ) assert.deepEqual( mockDistpatch.getCall(2).args, - [{ type: GAS_ESTIMATE_LOADING_FINISHED }] + [{ type: GAS_ESTIMATE_LOADING_FINISHED }], ) }) }) - describe('gasEstimatesLoadingStarted', () => { - it('should create the correct action', () => { + describe('gasEstimatesLoadingStarted', function () { + it('should create the correct action', function () { assert.deepEqual( gasEstimatesLoadingStarted(), - { type: GAS_ESTIMATE_LOADING_STARTED } + { type: GAS_ESTIMATE_LOADING_STARTED }, ) }) }) - describe('gasEstimatesLoadingFinished', () => { - it('should create the correct action', () => { + describe('gasEstimatesLoadingFinished', function () { + it('should create the correct action', function () { assert.deepEqual( gasEstimatesLoadingFinished(), - { type: GAS_ESTIMATE_LOADING_FINISHED } + { type: GAS_ESTIMATE_LOADING_FINISHED }, ) }) }) - describe('setPricesAndTimeEstimates', () => { - it('should create the correct action', () => { + describe('setPricesAndTimeEstimates', function () { + it('should create the correct action', function () { assert.deepEqual( setPricesAndTimeEstimates('mockPricesAndTimeEstimates'), - { type: SET_PRICE_AND_TIME_ESTIMATES, value: 'mockPricesAndTimeEstimates' } + { type: SET_PRICE_AND_TIME_ESTIMATES, value: 'mockPricesAndTimeEstimates' }, ) }) }) - describe('setBasicGasEstimateData', () => { - it('should create the correct action', () => { + describe('setBasicGasEstimateData', function () { + it('should create the correct action', function () { assert.deepEqual( setBasicGasEstimateData('mockBasicEstimatData'), - { type: SET_BASIC_GAS_ESTIMATE_DATA, value: 'mockBasicEstimatData' } + { type: SET_BASIC_GAS_ESTIMATE_DATA, value: 'mockBasicEstimatData' }, ) }) }) - describe('setCustomGasPrice', () => { - it('should create the correct action', () => { + describe('setCustomGasPrice', function () { + it('should create the correct action', function () { assert.deepEqual( setCustomGasPrice('mockCustomGasPrice'), - { type: SET_CUSTOM_GAS_PRICE, value: 'mockCustomGasPrice' } + { type: SET_CUSTOM_GAS_PRICE, value: 'mockCustomGasPrice' }, ) }) }) - describe('setCustomGasLimit', () => { - it('should create the correct action', () => { + describe('setCustomGasLimit', function () { + it('should create the correct action', function () { assert.deepEqual( setCustomGasLimit('mockCustomGasLimit'), - { type: SET_CUSTOM_GAS_LIMIT, value: 'mockCustomGasLimit' } + { type: SET_CUSTOM_GAS_LIMIT, value: 'mockCustomGasLimit' }, ) }) }) - describe('setCustomGasTotal', () => { - it('should create the correct action', () => { + describe('setCustomGasTotal', function () { + it('should create the correct action', function () { assert.deepEqual( setCustomGasTotal('mockCustomGasTotal'), - { type: SET_CUSTOM_GAS_TOTAL, value: 'mockCustomGasTotal' } + { type: SET_CUSTOM_GAS_TOTAL, value: 'mockCustomGasTotal' }, ) }) }) - describe('setCustomGasErrors', () => { - it('should create the correct action', () => { + describe('setCustomGasErrors', function () { + it('should create the correct action', function () { assert.deepEqual( setCustomGasErrors('mockErrorObject'), - { type: SET_CUSTOM_GAS_ERRORS, value: 'mockErrorObject' } + { type: SET_CUSTOM_GAS_ERRORS, value: 'mockErrorObject' }, ) }) }) - describe('setApiEstimatesLastRetrieved', () => { - it('should create the correct action', () => { + describe('setApiEstimatesLastRetrieved', function () { + it('should create the correct action', function () { assert.deepEqual( setApiEstimatesLastRetrieved(1234), - { type: SET_API_ESTIMATES_LAST_RETRIEVED, value: 1234 } + { type: SET_API_ESTIMATES_LAST_RETRIEVED, value: 1234 }, ) }) }) - describe('resetCustomGasState', () => { - it('should create the correct action', () => { + describe('resetCustomGasState', function () { + it('should create the correct action', function () { assert.deepEqual( resetCustomGasState(), - { type: RESET_CUSTOM_GAS_STATE } + { type: RESET_CUSTOM_GAS_STATE }, ) }) }) - }) diff --git a/ui/app/ducks/gas/gas.duck.js b/ui/app/ducks/gas/gas.duck.js index 5a0a236e6f8f..9d83a66e09e2 100644 --- a/ui/app/ducks/gas/gas.duck.js +++ b/ui/app/ducks/gas/gas.duck.js @@ -1,4 +1,4 @@ -import { clone, uniqBy, flatten } from 'ramda' +import { uniqBy, cloneDeep, flatten } from 'lodash' import BigNumber from 'bignumber.js' import { loadLocalStorageData, @@ -9,7 +9,7 @@ import { } from '../../helpers/utils/conversions.util' import { isEthereumNetwork, -} from '../../selectors/selectors' +} from '../../selectors' // Actions const BASIC_GAS_ESTIMATE_LOADING_FINISHED = 'metamask/gas/BASIC_GAS_ESTIMATE_LOADING_FINISHED' @@ -28,7 +28,6 @@ const SET_API_ESTIMATES_LAST_RETRIEVED = 'metamask/gas/SET_API_ESTIMATES_LAST_RE const SET_BASIC_API_ESTIMATES_LAST_RETRIEVED = 'metamask/gas/SET_BASIC_API_ESTIMATES_LAST_RETRIEVED' const SET_BASIC_PRICE_ESTIMATES_LAST_RETRIEVED = 'metamask/gas/SET_BASIC_PRICE_ESTIMATES_LAST_RETRIEVED' -// TODO: determine if this approach to initState is consistent with conventional ducks pattern const initState = { customData: { price: null, @@ -50,7 +49,6 @@ const initState = { basicEstimateIsLoading: true, gasEstimatesLoading: true, priceAndTimeEstimates: [], - basicPriceAndTimeEstimates: [], priceAndTimeEstimatesLastRetrieved: 0, basicPriceAndTimeEstimatesLastRetrieved: 0, basicPriceEstimatesLastRetrieved: 0, @@ -58,96 +56,94 @@ const initState = { } // Reducer -export default function reducer ({ gas: gasState = initState }, action = {}) { - const newState = clone(gasState) - +export default function reducer (state = initState, action) { switch (action.type) { case BASIC_GAS_ESTIMATE_LOADING_STARTED: return { - ...newState, + ...state, basicEstimateIsLoading: true, } case BASIC_GAS_ESTIMATE_LOADING_FINISHED: return { - ...newState, + ...state, basicEstimateIsLoading: false, } case GAS_ESTIMATE_LOADING_STARTED: return { - ...newState, + ...state, gasEstimatesLoading: true, } case GAS_ESTIMATE_LOADING_FINISHED: return { - ...newState, + ...state, gasEstimatesLoading: false, } case SET_BASIC_GAS_ESTIMATE_DATA: return { - ...newState, + ...state, basicEstimates: action.value, } case SET_CUSTOM_GAS_PRICE: return { - ...newState, + ...state, customData: { - ...newState.customData, + ...state.customData, price: action.value, }, } case SET_CUSTOM_GAS_LIMIT: return { - ...newState, + ...state, customData: { - ...newState.customData, + ...state.customData, limit: action.value, }, } case SET_CUSTOM_GAS_TOTAL: return { - ...newState, + ...state, customData: { - ...newState.customData, + ...state.customData, total: action.value, }, } case SET_PRICE_AND_TIME_ESTIMATES: return { - ...newState, + ...state, priceAndTimeEstimates: action.value, } case SET_CUSTOM_GAS_ERRORS: return { - ...newState, + ...state, errors: { - ...newState.errors, + ...state.errors, ...action.value, }, } case SET_API_ESTIMATES_LAST_RETRIEVED: return { - ...newState, + ...state, priceAndTimeEstimatesLastRetrieved: action.value, } case SET_BASIC_API_ESTIMATES_LAST_RETRIEVED: return { - ...newState, + ...state, basicPriceAndTimeEstimatesLastRetrieved: action.value, } case SET_BASIC_PRICE_ESTIMATES_LAST_RETRIEVED: return { - ...newState, + ...state, basicPriceEstimatesLastRetrieved: action.value, } case RESET_CUSTOM_DATA: return { - ...newState, - customData: clone(initState.customData), + ...state, + customData: cloneDeep(initState.customData), } case RESET_CUSTOM_GAS_STATE: - return clone(initState) + return cloneDeep(initState) default: - return newState + return state } } @@ -176,152 +172,173 @@ export function gasEstimatesLoadingFinished () { } } +async function queryEthGasStationBasic () { + const apiKey = process.env.ETH_GAS_STATION_API_KEY ? `?api-key=${process.env.ETH_GAS_STATION_API_KEY}` : '' + const url = `https://ethgasstation.info/json/ethgasAPI.json${apiKey}` + return await window.fetch(url, { + 'headers': {}, + 'referrer': 'http://ethgasstation.info/json/', + 'referrerPolicy': 'no-referrer-when-downgrade', + 'body': null, + 'method': 'GET', + 'mode': 'cors', + }) +} + +async function queryEthGasStationPredictionTable () { + const apiKey = process.env.ETH_GAS_STATION_API_KEY ? `?api-key=${process.env.ETH_GAS_STATION_API_KEY}` : '' + const url = `https://ethgasstation.info/json/predictTable.json${apiKey}` + return await window.fetch(url, { + 'headers': {}, + 'referrer': 'http://ethgasstation.info/json/', + 'referrerPolicy': 'no-referrer-when-downgrade', + 'body': null, + 'method': 'GET', + 'mode': 'cors', + }) +} + export function fetchBasicGasEstimates () { - return (dispatch, getState) => { - const { - basicPriceEstimatesLastRetrieved, - basicPriceAndTimeEstimates, - } = getState().gas + return async (dispatch, getState) => { + const { basicPriceEstimatesLastRetrieved } = getState().gas const timeLastRetrieved = basicPriceEstimatesLastRetrieved || loadLocalStorageData('BASIC_PRICE_ESTIMATES_LAST_RETRIEVED') || 0 dispatch(basicGasEstimatesLoadingStarted()) - const promiseToFetch = Date.now() - timeLastRetrieved > 75000 - ? fetch('https://dev.blockscale.net/api/gasexpress.json', { - 'headers': {}, - 'referrer': 'https://dev.blockscale.net/api/', - 'referrerPolicy': 'no-referrer-when-downgrade', - 'body': null, - 'method': 'GET', - 'mode': 'cors'} - ) - .then(r => r.json()) - .then(({ - safeLow, - standard: average, - fast, - fastest, - block_time: blockTime, - blockNum, - }) => { - const basicEstimates = { - safeLow, - average, - fast, - fastest, - blockTime, - blockNum, - } - - const timeRetrieved = Date.now() - dispatch(setBasicPriceEstimatesLastRetrieved(timeRetrieved)) - saveLocalStorageData(timeRetrieved, 'BASIC_PRICE_ESTIMATES_LAST_RETRIEVED') - saveLocalStorageData(basicEstimates, 'BASIC_PRICE_ESTIMATES') - - return basicEstimates - }) - : Promise.resolve(basicPriceAndTimeEstimates.length - ? basicPriceAndTimeEstimates - : loadLocalStorageData('BASIC_PRICE_ESTIMATES') - ) - - return promiseToFetch.then(basicEstimates => { - dispatch(setBasicGasEstimateData(basicEstimates)) - dispatch(basicGasEstimatesLoadingFinished()) - return basicEstimates - }) + let basicEstimates + if (Date.now() - timeLastRetrieved > 75000) { + basicEstimates = await fetchExternalBasicGasEstimates(dispatch) + } else { + const cachedBasicEstimates = loadLocalStorageData('BASIC_PRICE_ESTIMATES') + basicEstimates = cachedBasicEstimates || await fetchExternalBasicGasEstimates(dispatch) + } + + dispatch(setBasicGasEstimateData(basicEstimates)) + dispatch(basicGasEstimatesLoadingFinished()) + + return basicEstimates } } +async function fetchExternalBasicGasEstimates (dispatch) { + const response = await queryEthGasStationBasic() + + const { + safeLow: safeLowTimes10, + average: averageTimes10, + fast: fastTimes10, + fastest: fastestTimes10, + block_time: blockTime, + blockNum, + } = await response.json() + + const [average, fast, fastest, safeLow] = [ + averageTimes10, + fastTimes10, + fastestTimes10, + safeLowTimes10, + ].map((price) => (new BigNumber(price)).div(10).toNumber()) + + const basicEstimates = { + safeLow, + average, + fast, + fastest, + blockTime, + blockNum, + } + + const timeRetrieved = Date.now() + saveLocalStorageData(basicEstimates, 'BASIC_PRICE_ESTIMATES') + saveLocalStorageData(timeRetrieved, 'BASIC_PRICE_ESTIMATES_LAST_RETRIEVED') + dispatch(setBasicPriceEstimatesLastRetrieved(timeRetrieved)) + + return basicEstimates +} + export function fetchBasicGasAndTimeEstimates () { - return (dispatch, getState) => { - const { - basicPriceAndTimeEstimatesLastRetrieved, - basicPriceAndTimeEstimates, - } = getState().gas + return async (dispatch, getState) => { + const { basicPriceAndTimeEstimatesLastRetrieved } = getState().gas const timeLastRetrieved = basicPriceAndTimeEstimatesLastRetrieved || loadLocalStorageData('BASIC_GAS_AND_TIME_API_ESTIMATES_LAST_RETRIEVED') || 0 dispatch(basicGasEstimatesLoadingStarted()) - const promiseToFetch = Date.now() - timeLastRetrieved > 75000 - ? fetch('https://ethgasstation.info/json/ethgasAPI.json', { - 'headers': {}, - 'referrer': 'http://ethgasstation.info/json/', - 'referrerPolicy': 'no-referrer-when-downgrade', - 'body': null, - 'method': 'GET', - 'mode': 'cors'} - ) - .then(r => r.json()) - .then(({ - average: averageTimes10, - avgWait, - block_time: blockTime, - blockNum, - fast: fastTimes10, - fastest: fastestTimes10, - fastestWait, - fastWait, - safeLow: safeLowTimes10, - safeLowWait, - speed, - }) => { - const [average, fast, fastest, safeLow] = [ - averageTimes10, - fastTimes10, - fastestTimes10, - safeLowTimes10, - ].map(price => (new BigNumber(price)).div(10).toNumber()) - - const basicEstimates = { - average, - avgWait, - blockTime, - blockNum, - fast, - fastest, - fastestWait, - fastWait, - safeLow, - safeLowWait, - speed, - } + let basicEstimates + if (Date.now() - timeLastRetrieved > 75000) { + basicEstimates = await fetchExternalBasicGasAndTimeEstimates(dispatch) + } else { + const cachedBasicEstimates = loadLocalStorageData('BASIC_GAS_AND_TIME_API_ESTIMATES') + basicEstimates = cachedBasicEstimates || await fetchExternalBasicGasAndTimeEstimates(dispatch) + } - const timeRetrieved = Date.now() - dispatch(setBasicApiEstimatesLastRetrieved(timeRetrieved)) - saveLocalStorageData(timeRetrieved, 'BASIC_GAS_AND_TIME_API_ESTIMATES_LAST_RETRIEVED') - saveLocalStorageData(basicEstimates, 'BASIC_GAS_AND_TIME_API_ESTIMATES') + dispatch(setBasicGasEstimateData(basicEstimates)) + dispatch(basicGasEstimatesLoadingFinished()) + return basicEstimates + } +} - return basicEstimates - }) - : Promise.resolve(basicPriceAndTimeEstimates.length - ? basicPriceAndTimeEstimates - : loadLocalStorageData('BASIC_GAS_AND_TIME_API_ESTIMATES') - ) - - return promiseToFetch.then(basicEstimates => { - dispatch(setBasicGasEstimateData(basicEstimates)) - dispatch(basicGasEstimatesLoadingFinished()) - return basicEstimates - }) +async function fetchExternalBasicGasAndTimeEstimates (dispatch) { + const response = await queryEthGasStationBasic() + + const { + average: averageTimes10, + avgWait, + block_time: blockTime, + blockNum, + fast: fastTimes10, + fastest: fastestTimes10, + fastestWait, + fastWait, + safeLow: safeLowTimes10, + safeLowWait, + speed, + } = await response.json() + const [average, fast, fastest, safeLow] = [ + averageTimes10, + fastTimes10, + fastestTimes10, + safeLowTimes10, + ].map((price) => (new BigNumber(price)).div(10).toNumber()) + + const basicEstimates = { + average, + avgWait, + blockTime, + blockNum, + fast, + fastest, + fastestWait, + fastWait, + safeLow, + safeLowWait, + speed, } + + const timeRetrieved = Date.now() + saveLocalStorageData(basicEstimates, 'BASIC_GAS_AND_TIME_API_ESTIMATES') + saveLocalStorageData(timeRetrieved, 'BASIC_GAS_AND_TIME_API_ESTIMATES_LAST_RETRIEVED') + dispatch(setBasicApiEstimatesLastRetrieved(timeRetrieved)) + + return basicEstimates } function extrapolateY ({ higherY, lowerY, higherX, lowerX, xForExtrapolation }) { + /* eslint-disable no-param-reassign */ higherY = new BigNumber(higherY, 10) lowerY = new BigNumber(lowerY, 10) higherX = new BigNumber(higherX, 10) lowerX = new BigNumber(lowerX, 10) xForExtrapolation = new BigNumber(xForExtrapolation, 10) + /* eslint-enable no-param-reassign */ const slope = (higherY.minus(lowerY)).div(higherX.minus(lowerX)) const newTimeEstimate = slope.times(higherX.minus(xForExtrapolation)).minus(higherY).negated() return Number(newTimeEstimate.toPrecision(10)) } -function getRandomArbitrary (min, max) { - min = new BigNumber(min, 10) - max = new BigNumber(max, 10) +function getRandomArbitrary (minStr, maxStr) { + const min = new BigNumber(minStr, 10) + const max = new BigNumber(maxStr, 10) const random = new BigNumber(String(Math.random()), 10) return new BigNumber(random.times(max.minus(min)).plus(min)).toPrecision(10) } @@ -347,11 +364,11 @@ function quartiles (data) { } function inliersByIQR (data, prop) { - const { lowerQuartile, upperQuartile } = quartiles(data.map(d => prop ? d[prop] : d)) + const { lowerQuartile, upperQuartile } = quartiles(data.map((d) => (prop ? d[prop] : d))) const IQR = upperQuartile - lowerQuartile - const lowerBound = lowerQuartile - 1.5 * IQR - const upperBound = upperQuartile + 1.5 * IQR - return data.filter(d => { + const lowerBound = lowerQuartile - (1.5 * IQR) + const upperBound = upperQuartile + (1.5 * IQR) + return data.filter((d) => { const value = prop ? d[prop] : d return value >= lowerBound && value <= upperBound }) @@ -374,46 +391,38 @@ export function fetchGasEstimates (blockTime) { dispatch(gasEstimatesLoadingStarted()) const promiseToFetch = Date.now() - timeLastRetrieved > 75000 - ? fetch('https://ethgasstation.info/json/predictTable.json', { - 'headers': {}, - 'referrer': 'http://ethgasstation.info/json/', - 'referrerPolicy': 'no-referrer-when-downgrade', - 'body': null, - 'method': 'GET', - 'mode': 'cors'} - ) - .then(r => r.json()) - .then(r => { + ? queryEthGasStationPredictionTable() + .then((r) => r.json()) + .then((r) => { const estimatedPricesAndTimes = r.map(({ expectedTime, expectedWait, gasprice }) => ({ expectedTime, expectedWait, gasprice })) - const estimatedTimeWithUniquePrices = uniqBy(({ expectedTime }) => expectedTime, estimatedPricesAndTimes) + const estimatedTimeWithUniquePrices = uniqBy(estimatedPricesAndTimes, ({ expectedTime }) => expectedTime) const withSupplementalTimeEstimates = flatten(estimatedTimeWithUniquePrices.map(({ expectedWait, gasprice }, i, arr) => { const next = arr[i + 1] if (!next) { return [{ expectedWait, gasprice }] - } else { - const supplementalPrice = getRandomArbitrary(gasprice, next.gasprice) - const supplementalTime = extrapolateY({ - higherY: next.expectedWait, - lowerY: expectedWait, - higherX: next.gasprice, - lowerX: gasprice, - xForExtrapolation: supplementalPrice, - }) - const supplementalPrice2 = getRandomArbitrary(supplementalPrice, next.gasprice) - const supplementalTime2 = extrapolateY({ - higherY: next.expectedWait, - lowerY: supplementalTime, - higherX: next.gasprice, - lowerX: supplementalPrice, - xForExtrapolation: supplementalPrice2, - }) - return [ - { expectedWait, gasprice }, - { expectedWait: supplementalTime, gasprice: supplementalPrice }, - { expectedWait: supplementalTime2, gasprice: supplementalPrice2 }, - ] } + const supplementalPrice = getRandomArbitrary(gasprice, next.gasprice) + const supplementalTime = extrapolateY({ + higherY: next.expectedWait, + lowerY: expectedWait, + higherX: next.gasprice, + lowerX: gasprice, + xForExtrapolation: supplementalPrice, + }) + const supplementalPrice2 = getRandomArbitrary(supplementalPrice, next.gasprice) + const supplementalTime2 = extrapolateY({ + higherY: next.expectedWait, + lowerY: supplementalTime, + higherX: next.gasprice, + lowerX: supplementalPrice, + xForExtrapolation: supplementalPrice2, + }) + return [ + { expectedWait, gasprice }, + { expectedWait: supplementalTime, gasprice: supplementalPrice }, + { expectedWait: supplementalTime2, gasprice: supplementalPrice2 }, + ] })) const withOutliersRemoved = inliersByIQR(withSupplementalTimeEstimates.slice(0).reverse(), 'expectedWait').reverse() const timeMappedToSeconds = withOutliersRemoved.map(({ expectedWait, gasprice }) => { @@ -432,24 +441,23 @@ export function fetchGasEstimates (blockTime) { return timeMappedToSeconds }) : Promise.resolve(priceAndTimeEstimates.length - ? priceAndTimeEstimates - : loadLocalStorageData('GAS_API_ESTIMATES') - ) - - return promiseToFetch.then(estimates => { - dispatch(setPricesAndTimeEstimates(estimates)) - dispatch(gasEstimatesLoadingFinished()) - }) + ? priceAndTimeEstimates + : loadLocalStorageData('GAS_API_ESTIMATES')) + + return promiseToFetch.then((estimates) => { + dispatch(setPricesAndTimeEstimates(estimates)) + dispatch(gasEstimatesLoadingFinished()) + }) } } export function setCustomGasPriceForRetry (newPrice) { return (dispatch) => { - if (newPrice !== '0x0') { - dispatch(setCustomGasPrice(newPrice)) - } else { + if (newPrice === '0x0') { const { fast } = loadLocalStorageData('BASIC_PRICE_ESTIMATES') dispatch(setCustomGasPrice(decGWEIToHexWEI(fast))) + } else { + dispatch(setCustomGasPrice(newPrice)) } } } diff --git a/ui/app/ducks/history/history.js b/ui/app/ducks/history/history.js new file mode 100644 index 000000000000..9b716375bf5e --- /dev/null +++ b/ui/app/ducks/history/history.js @@ -0,0 +1,38 @@ +import { createSlice } from '@reduxjs/toolkit' + +import { ASSET_ROUTE, DEFAULT_ROUTE } from '../../helpers/constants/routes' + +// Constants + +const initialState = { + mostRecentOverviewPage: DEFAULT_ROUTE, +} + +const name = 'history' + +// Slice (reducer plus auto-generated actions and action creators) + +const slice = createSlice({ + name, + initialState, + reducers: { + pageChanged: (state, action) => { + const path = action.payload + if (path === DEFAULT_ROUTE || path.startsWith(ASSET_ROUTE)) { + state.mostRecentOverviewPage = path + } + }, + }, +}) + +const { actions, reducer } = slice + +export default reducer + +// Selectors + +export const getMostRecentOverviewPage = (state) => state[name].mostRecentOverviewPage + +// Actions / action-creators + +export const { pageChanged } = actions diff --git a/ui/app/ducks/index.js b/ui/app/ducks/index.js index 2d33edcfa59b..91ba222cb1b3 100644 --- a/ui/app/ducks/index.js +++ b/ui/app/ducks/index.js @@ -1,95 +1,22 @@ -const clone = require('clone') -const extend = require('xtend') -const copyToClipboard = require('copy-to-clipboard') - -// -// Sub-Reducers take in the complete state and return their sub-state -// -const reduceMetamask = require('./metamask/metamask') -const reduceApp = require('./app/app') -const reduceLocale = require('./locale/locale') -const reduceSend = require('./send/send.duck').default -import reduceConfirmTransaction from './confirm-transaction/confirm-transaction.duck' -import reduceGas from './gas/gas.duck' - -window.METAMASK_CACHED_LOG_STATE = null - -module.exports = rootReducer - -function rootReducer (state, action) { - // clone - state = extend(state) - - if (action.type === 'GLOBAL_FORCE_UPDATE') { - return action.value - } - - // - // MetaMask - // - - state.metamask = reduceMetamask(state, action) - - // - // AppState - // - - state.appState = reduceApp(state, action) - - // - // LocaleMessages - // - - state.localeMessages = reduceLocale(state, action) - - // - // Send - // - - state.send = reduceSend(state, action) - - state.confirmTransaction = reduceConfirmTransaction(state, action) - - state.gas = reduceGas(state, action) - - window.METAMASK_CACHED_LOG_STATE = state - return state -} - -window.getCleanAppState = function () { - const state = clone(window.METAMASK_CACHED_LOG_STATE) - // append additional information - state.version = global.platform.getVersion() - state.browser = window.navigator.userAgent - // ensure seedWords are not included - if (state.metamask) delete state.metamask.seedWords - if (state.appState.currentView) delete state.appState.currentView.seedWords - return state -} - -window.logStateString = function (cb) { - const state = window.getCleanAppState() - global.platform.getPlatformInfo((err, platform) => { - if (err) return cb(err) - state.platform = platform - const stateString = JSON.stringify(state, removeSeedWords, 2) - cb(null, stateString) - }) -} - -window.logState = function (toClipboard) { - return window.logStateString((err, result) => { - if (err) { - console.error(err.message) - } else if (toClipboard) { - copyToClipboard(result) - console.log('State log copied') - } else { - console.log(result) - } - }) -} - -function removeSeedWords (key, value) { - return key === 'seedWords' ? undefined : value -} +import { combineReducers } from 'redux' +import { ALERT_TYPES } from '../../../app/scripts/controllers/alert' +import metamaskReducer from './metamask/metamask' +import localeMessagesReducer from './locale/locale' +import sendReducer from './send/send.duck' +import appStateReducer from './app/app' +import confirmTransactionReducer from './confirm-transaction/confirm-transaction.duck' +import gasReducer from './gas/gas.duck' +import { unconnectedAccount } from './alerts' +import historyReducer from './history/history' + +export default combineReducers({ + [ALERT_TYPES.unconnectedAccount]: unconnectedAccount, + activeTab: (s) => (s === undefined ? null : s), + metamask: metamaskReducer, + appState: appStateReducer, + history: historyReducer, + send: sendReducer, + confirmTransaction: confirmTransactionReducer, + gas: gasReducer, + localeMessages: localeMessagesReducer, +}) diff --git a/ui/app/ducks/locale/locale.js b/ui/app/ducks/locale/locale.js index bb8e1b08e466..5eecbad9badb 100644 --- a/ui/app/ducks/locale/locale.js +++ b/ui/app/ducks/locale/locale.js @@ -1,17 +1,17 @@ -const extend = require('xtend') -const actions = require('../../store/actions') +import * as actionConstants from '../../store/actionConstants' -module.exports = reduceMetamask - -function reduceMetamask (state, action) { - const localeMessagesState = extend({}, state.localeMessages) - - switch (action.type) { - case actions.SET_LOCALE_MESSAGES: - return extend(localeMessagesState, { - current: action.value, - }) +export default function reduceLocaleMessages (state = {}, { type, value }) { + switch (type) { + case actionConstants.SET_CURRENT_LOCALE: + return { + ...state, + current: value.messages, + } default: - return localeMessagesState + return state } } + +export const getCurrentLocaleMessages = (state) => state.localeMessages.current + +export const getEnLocaleMessages = (state) => state.localeMessages.en diff --git a/ui/app/ducks/metamask/metamask.js b/ui/app/ducks/metamask/metamask.js index 3ca487c1f044..c2058fc06564 100644 --- a/ui/app/ducks/metamask/metamask.js +++ b/ui/app/ducks/metamask/metamask.js @@ -1,30 +1,20 @@ -const extend = require('xtend') -const actions = require('../../store/actions') -const { getEnvironmentType } = require('../../../../app/scripts/lib/util') -const { ENVIRONMENT_TYPE_POPUP } = require('../../../../app/scripts/lib/enums') -const { OLD_UI_NETWORK_TYPE } = require('../../../../app/scripts/controllers/network/enums') +import * as actionConstants from '../../store/actionConstants' +import { ALERT_TYPES } from '../../../../app/scripts/controllers/alert' -module.exports = reduceMetamask - -function reduceMetamask (state, action) { - let newState - - // clone + defaults - var metamaskState = extend({ +export default function reduceMetamask (state = {}, action) { + const metamaskState = { isInitialized: false, isUnlocked: false, isAccountMenuOpen: false, - isPopup: getEnvironmentType(window.location.href) === ENVIRONMENT_TYPE_POPUP, rpcTarget: 'https://rawtestrpc.metamask.io/', identities: {}, unapprovedTxs: {}, frequentRpcList: [], addressBook: [], - selectedTokenAddress: null, contractExchangeRates: {}, - tokenExchangeRates: {}, tokens: [], pendingTokens: {}, + customNonceValue: '', send: { gasLimit: null, gasPrice: null, @@ -37,261 +27,231 @@ function reduceMetamask (state, action) { errors: {}, maxModeOn: false, editingTransactionId: null, - forceGasMin: null, toNickname: '', + ensResolution: null, + ensResolutionError: '', }, - coinOptions: {}, useBlockie: false, featureFlags: {}, - networkEndpointType: OLD_UI_NETWORK_TYPE, - isRevealingSeedWords: false, welcomeScreenSeen: false, currentLocale: '', preferences: { - useNativeCurrencyAsPrimaryCurrency: true, + autoLockTimeLimit: undefined, showFiatInTestnets: false, + useNativeCurrencyAsPrimaryCurrency: true, }, firstTimeFlowType: null, completedOnboarding: false, knownMethodData: {}, participateInMetaMetrics: null, metaMetricsSendCount: 0, - }, state.metamask) + nextNonce: null, + ...state, + } switch (action.type) { - case actions.SHOW_ACCOUNTS_PAGE: - newState = extend(metamaskState, { - isRevealingSeedWords: false, - }) - delete newState.seedWords - return newState - - case actions.UPDATE_METAMASK_STATE: - return extend(metamaskState, action.value) + case actionConstants.UPDATE_METAMASK_STATE: + return { ...metamaskState, ...action.value } - case actions.UNLOCK_METAMASK: - return extend(metamaskState, { - isUnlocked: true, - isInitialized: true, - selectedAddress: action.value, - }) - - case actions.LOCK_METAMASK: - return extend(metamaskState, { + case actionConstants.LOCK_METAMASK: + return { + ...metamaskState, isUnlocked: false, - }) - - case actions.SET_RPC_LIST: - return extend(metamaskState, { - frequentRpcList: action.value, - }) + } - case actions.SET_RPC_TARGET: - return extend(metamaskState, { + case actionConstants.SET_RPC_TARGET: + return { + ...metamaskState, provider: { type: 'rpc', rpcTarget: action.value, }, - }) + } - case actions.SET_PROVIDER_TYPE: - return extend(metamaskState, { + case actionConstants.SET_PROVIDER_TYPE: + return { + ...metamaskState, provider: { type: action.value, }, - }) - - case actions.COMPLETED_TX: - var stringId = String(action.id) - newState = extend(metamaskState, { - unapprovedTxs: {}, - unapprovedMsgs: {}, - }) - for (const id in metamaskState.unapprovedTxs) { - if (id !== stringId) { - newState.unapprovedTxs[id] = metamaskState.unapprovedTxs[id] - } } - for (const id in metamaskState.unapprovedMsgs) { - if (id !== stringId) { - newState.unapprovedMsgs[id] = metamaskState.unapprovedMsgs[id] - } - } - return newState - case actions.EDIT_TX: - return extend(metamaskState, { - send: { - ...metamaskState.send, - editingTransactionId: action.value, - }, - }) - - - case actions.SHOW_NEW_VAULT_SEED: - return extend(metamaskState, { - isRevealingSeedWords: true, - seedWords: action.value, - }) - - case actions.CLEAR_SEED_WORD_CACHE: - newState = extend(metamaskState, { + case actionConstants.SHOW_ACCOUNT_DETAIL: + return { + ...metamaskState, isUnlocked: true, isInitialized: true, selectedAddress: action.value, - }) - delete newState.seedWords - return newState - - case actions.SHOW_ACCOUNT_DETAIL: - newState = extend(metamaskState, { - isUnlocked: true, - isInitialized: true, - selectedAddress: action.value, - }) - delete newState.seedWords - return newState - - case actions.SET_SELECTED_TOKEN: - newState = extend(metamaskState, { - selectedTokenAddress: action.value, - }) - const newSend = extend(metamaskState.send) - - if (metamaskState.send.editingTransactionId && !action.value) { - delete newSend.token - const unapprovedTx = newState.unapprovedTxs[newSend.editingTransactionId] || {} - const txParams = unapprovedTx.txParams || {} - newState.unapprovedTxs = extend(newState.unapprovedTxs, { - [newSend.editingTransactionId]: extend(unapprovedTx, { - txParams: extend(txParams, { data: '' }), - }), - }) - newSend.tokenBalance = null - newSend.balance = '0' } - newState.send = newSend - return newState - - case actions.SET_ACCOUNT_LABEL: - const account = action.value.account + case actionConstants.SET_ACCOUNT_LABEL: { + const { account } = action.value const name = action.value.label const id = {} - id[account] = extend(metamaskState.identities[account], { name }) - const identities = extend(metamaskState.identities, id) - return extend(metamaskState, { identities }) + id[account] = { ...metamaskState.identities[account], name } + const identities = { ...metamaskState.identities, ...id } + return Object.assign(metamaskState, { identities }) + } - case actions.SET_CURRENT_FIAT: - return extend(metamaskState, { + case actionConstants.SET_CURRENT_FIAT: + return Object.assign(metamaskState, { currentCurrency: action.value.currentCurrency, conversionRate: action.value.conversionRate, conversionDate: action.value.conversionDate, }) - case actions.UPDATE_TOKENS: - return extend(metamaskState, { + case actionConstants.UPDATE_TOKENS: + return { + ...metamaskState, tokens: action.newTokens, - }) + } // metamask.send - case actions.UPDATE_GAS_LIMIT: - return extend(metamaskState, { + case actionConstants.UPDATE_GAS_LIMIT: + return { + ...metamaskState, send: { ...metamaskState.send, gasLimit: action.value, }, - }) - - case actions.UPDATE_GAS_PRICE: - return extend(metamaskState, { + } + case actionConstants.UPDATE_CUSTOM_NONCE: + return { + ...metamaskState, + customNonceValue: action.value, + } + case actionConstants.UPDATE_GAS_PRICE: + return { + ...metamaskState, send: { ...metamaskState.send, gasPrice: action.value, }, - }) + } - case actions.TOGGLE_ACCOUNT_MENU: - return extend(metamaskState, { + case actionConstants.TOGGLE_ACCOUNT_MENU: + return { + ...metamaskState, isAccountMenuOpen: !metamaskState.isAccountMenuOpen, - }) + } - case actions.UPDATE_GAS_TOTAL: - return extend(metamaskState, { + case actionConstants.UPDATE_GAS_TOTAL: + return { + ...metamaskState, send: { ...metamaskState.send, gasTotal: action.value, }, - }) + } - case actions.UPDATE_SEND_TOKEN_BALANCE: - return extend(metamaskState, { + case actionConstants.UPDATE_SEND_TOKEN_BALANCE: + return { + ...metamaskState, send: { ...metamaskState.send, tokenBalance: action.value, }, - }) + } - case actions.UPDATE_SEND_HEX_DATA: - return extend(metamaskState, { + case actionConstants.UPDATE_SEND_HEX_DATA: + return { + ...metamaskState, send: { ...metamaskState.send, data: action.value, }, - }) + } - case actions.UPDATE_SEND_FROM: - return extend(metamaskState, { + case actionConstants.UPDATE_SEND_TO: + return { + ...metamaskState, send: { ...metamaskState.send, - from: action.value, + to: action.value.to, + toNickname: action.value.nickname, }, - }) + } - case actions.UPDATE_SEND_TO: - return extend(metamaskState, { + case actionConstants.UPDATE_SEND_AMOUNT: + return { + ...metamaskState, send: { ...metamaskState.send, - to: action.value.to, - toNickname: action.value.nickname, + amount: action.value, }, - }) + } - case actions.UPDATE_SEND_AMOUNT: - return extend(metamaskState, { + case actionConstants.UPDATE_MAX_MODE: + return { + ...metamaskState, send: { ...metamaskState.send, - amount: action.value, + maxModeOn: action.value, }, - }) + } - case actions.UPDATE_SEND_MEMO: - return extend(metamaskState, { + case actionConstants.UPDATE_SEND: + return Object.assign(metamaskState, { send: { ...metamaskState.send, - memo: action.value, + ...action.value, }, }) - case actions.UPDATE_MAX_MODE: - return extend(metamaskState, { + case actionConstants.UPDATE_SEND_TOKEN: { + const newSend = { + ...metamaskState.send, + token: action.value, + } + // erase token-related state when switching back to native currency + if (newSend.editingTransactionId && !newSend.token) { + const unapprovedTx = newSend?.unapprovedTxs?.[newSend.editingTransactionId] || {} + const txParams = unapprovedTx.txParams || {} + Object.assign(newSend, { + tokenBalance: null, + balance: '0', + from: unapprovedTx.from || '', + unapprovedTxs: { + ...newSend.unapprovedTxs, + [newSend.editingTransactionId]: { + ...unapprovedTx, + txParams: { + ...txParams, + data: '', + }, + }, + }, + }) + } + return Object.assign(metamaskState, { + send: newSend, + }) + } + + case actionConstants.UPDATE_SEND_ENS_RESOLUTION: + return { + ...metamaskState, send: { ...metamaskState.send, - maxModeOn: action.value, + ensResolution: action.payload, + ensResolutionError: '', }, - }) + } - case actions.UPDATE_SEND: - return extend(metamaskState, { + case actionConstants.UPDATE_SEND_ENS_RESOLUTION_ERROR: + return { + ...metamaskState, send: { ...metamaskState.send, - ...action.value, + ensResolution: null, + ensResolutionError: action.payload, }, - }) + } - case actions.CLEAR_SEND: - return extend(metamaskState, { + case actionConstants.CLEAR_SEND: + return { + ...metamaskState, send: { gasLimit: null, gasPrice: null, @@ -304,119 +264,119 @@ function reduceMetamask (state, action) { errors: {}, maxModeOn: false, editingTransactionId: null, - forceGasMin: null, toNickname: '', }, - }) + } - case actions.UPDATE_TRANSACTION_PARAMS: + case actionConstants.UPDATE_TRANSACTION_PARAMS: { const { id: txId, value } = action - let { selectedAddressTxList } = metamaskState - selectedAddressTxList = selectedAddressTxList.map(tx => { + let { currentNetworkTxList } = metamaskState + currentNetworkTxList = currentNetworkTxList.map((tx) => { if (tx.id === txId) { - tx.txParams = value + const newTx = { ...tx } + newTx.txParams = value + return newTx } return tx }) - return extend(metamaskState, { - selectedAddressTxList, - }) - - case actions.PAIR_UPDATE: - const { value: { marketinfo: pairMarketInfo } } = action - return extend(metamaskState, { - tokenExchangeRates: { - ...metamaskState.tokenExchangeRates, - [pairMarketInfo.pair]: pairMarketInfo, - }, - }) - - case actions.SHAPESHIFT_SUBVIEW: - const { value: { marketinfo: ssMarketInfo, coinOptions } } = action - return extend(metamaskState, { - tokenExchangeRates: { - ...metamaskState.tokenExchangeRates, - [ssMarketInfo.pair]: ssMarketInfo, - }, - coinOptions, - }) + return { + ...metamaskState, + currentNetworkTxList, + } + } - case actions.SET_PARTICIPATE_IN_METAMETRICS: - return extend(metamaskState, { + case actionConstants.SET_PARTICIPATE_IN_METAMETRICS: + return { + ...metamaskState, participateInMetaMetrics: action.value, - }) + } - case actions.SET_METAMETRICS_SEND_COUNT: - return extend(metamaskState, { + case actionConstants.SET_METAMETRICS_SEND_COUNT: + return { + ...metamaskState, metaMetricsSendCount: action.value, - }) + } - case actions.SET_USE_BLOCKIE: - return extend(metamaskState, { + case actionConstants.SET_USE_BLOCKIE: + return { + ...metamaskState, useBlockie: action.value, - }) + } - case actions.UPDATE_FEATURE_FLAGS: - return extend(metamaskState, { + case actionConstants.UPDATE_FEATURE_FLAGS: + return { + ...metamaskState, featureFlags: action.value, - }) - - case actions.UPDATE_NETWORK_ENDPOINT_TYPE: - return extend(metamaskState, { - networkEndpointType: action.value, - }) + } - case actions.CLOSE_WELCOME_SCREEN: - return extend(metamaskState, { + case actionConstants.CLOSE_WELCOME_SCREEN: + return { + ...metamaskState, welcomeScreenSeen: true, - }) + } - case actions.SET_CURRENT_LOCALE: - return extend(metamaskState, { - currentLocale: action.value, - }) + case actionConstants.SET_CURRENT_LOCALE: + return { + ...metamaskState, + currentLocale: action.value.locale, + } - case actions.SET_PENDING_TOKENS: - return extend(metamaskState, { + case actionConstants.SET_PENDING_TOKENS: + return { + ...metamaskState, pendingTokens: { ...action.payload }, - }) + } - case actions.CLEAR_PENDING_TOKENS: { - return extend(metamaskState, { + case actionConstants.CLEAR_PENDING_TOKENS: { + return { + ...metamaskState, pendingTokens: {}, - }) + } } - case actions.UPDATE_PREFERENCES: { - return extend(metamaskState, { + case actionConstants.UPDATE_PREFERENCES: { + return { + ...metamaskState, preferences: { ...metamaskState.preferences, ...action.payload, }, - }) + } } - case actions.COMPLETE_ONBOARDING: { - return extend(metamaskState, { + case actionConstants.COMPLETE_ONBOARDING: { + return { + ...metamaskState, completedOnboarding: true, - }) + } } - case actions.COMPLETE_UI_MIGRATION: { - return extend(metamaskState, { - completedUiMigration: true, - }) + case actionConstants.SET_FIRST_TIME_FLOW_TYPE: { + return { + ...metamaskState, + firstTimeFlowType: action.value, + } } - case actions.SET_FIRST_TIME_FLOW_TYPE: { - return extend(metamaskState, { - firstTimeFlowType: action.value, - }) + case actionConstants.SET_NEXT_NONCE: { + return { + ...metamaskState, + nextNonce: action.value, + } } default: return metamaskState - } } + +export const getCurrentLocale = (state) => state.metamask.currentLocale + +export const getAlertEnabledness = (state) => state.metamask.alertEnabledness + +export const getUnconnectedAccountAlertEnabledness = (state) => getAlertEnabledness(state)[ALERT_TYPES.unconnectedAccount] + +export const getUnconnectedAccountAlertShown = (state) => state.metamask.unconnectedAccountAlertShownOrigins + +export const getTokens = (state) => state.metamask.tokens diff --git a/ui/app/ducks/send/send-duck.test.js b/ui/app/ducks/send/send-duck.test.js index 92c8dffd8d5c..9731d5b2cc8c 100644 --- a/ui/app/ducks/send/send-duck.test.js +++ b/ui/app/ducks/send/send-duck.test.js @@ -6,181 +6,120 @@ import SendReducer, { updateSendErrors, showGasButtonGroup, hideGasButtonGroup, - updateSendWarnings, -} from './send.duck.js' +} from './send.duck' -describe('Send Duck', () => { +describe('Send Duck', function () { const mockState = { - send: { - mockProp: 123, - }, + mockProp: 123, } const initState = { - fromDropdownOpen: false, toDropdownOpen: false, errors: {}, gasButtonGroupShown: true, - warnings: {}, } - const OPEN_FROM_DROPDOWN = 'metamask/send/OPEN_FROM_DROPDOWN' - const CLOSE_FROM_DROPDOWN = 'metamask/send/CLOSE_FROM_DROPDOWN' const OPEN_TO_DROPDOWN = 'metamask/send/OPEN_TO_DROPDOWN' const CLOSE_TO_DROPDOWN = 'metamask/send/CLOSE_TO_DROPDOWN' const UPDATE_SEND_ERRORS = 'metamask/send/UPDATE_SEND_ERRORS' - const UPDATE_SEND_WARNINGS = 'metamask/send/UPDATE_SEND_WARNINGS' const RESET_SEND_STATE = 'metamask/send/RESET_SEND_STATE' const SHOW_GAS_BUTTON_GROUP = 'metamask/send/SHOW_GAS_BUTTON_GROUP' const HIDE_GAS_BUTTON_GROUP = 'metamask/send/HIDE_GAS_BUTTON_GROUP' - describe('SendReducer()', () => { - it('should initialize state', () => { - assert.deepEqual( - SendReducer({}), - initState - ) + describe('SendReducer()', function () { + it('should initialize state', function () { + assert.deepEqual(SendReducer(undefined, {}), initState) }) - it('should return state unchanged if it does not match a dispatched actions type', () => { + it('should return state unchanged if it does not match a dispatched actions type', function () { assert.deepEqual( SendReducer(mockState, { type: 'someOtherAction', value: 'someValue', }), - Object.assign({}, mockState.send) - ) - }) - - it('should set fromDropdownOpen to true when receiving a OPEN_FROM_DROPDOWN action', () => { - assert.deepEqual( - SendReducer(mockState, { - type: OPEN_FROM_DROPDOWN, - }), - Object.assign({fromDropdownOpen: true}, mockState.send) - ) - }) - - it('should return a new object (and not just modify the existing state object)', () => { - assert.deepEqual(SendReducer(mockState), mockState.send) - assert.notEqual(SendReducer(mockState), mockState.send) - }) - - it('should set fromDropdownOpen to false when receiving a CLOSE_FROM_DROPDOWN action', () => { - assert.deepEqual( - SendReducer(mockState, { - type: CLOSE_FROM_DROPDOWN, - }), - Object.assign({fromDropdownOpen: false}, mockState.send) + mockState, ) }) - it('should set toDropdownOpen to true when receiving a OPEN_TO_DROPDOWN action', () => { + it('should set toDropdownOpen to true when receiving a OPEN_TO_DROPDOWN action', function () { assert.deepEqual( SendReducer(mockState, { type: OPEN_TO_DROPDOWN, }), - Object.assign({toDropdownOpen: true}, mockState.send) + { toDropdownOpen: true, ...mockState }, ) }) - it('should set toDropdownOpen to false when receiving a CLOSE_TO_DROPDOWN action', () => { + it('should set toDropdownOpen to false when receiving a CLOSE_TO_DROPDOWN action', function () { assert.deepEqual( SendReducer(mockState, { type: CLOSE_TO_DROPDOWN, }), - Object.assign({toDropdownOpen: false}, mockState.send) + { toDropdownOpen: false, ...mockState }, ) }) - it('should set gasButtonGroupShown to true when receiving a SHOW_GAS_BUTTON_GROUP action', () => { + it('should set gasButtonGroupShown to true when receiving a SHOW_GAS_BUTTON_GROUP action', function () { assert.deepEqual( - SendReducer(Object.assign({}, mockState, { gasButtonGroupShown: false }), { - type: SHOW_GAS_BUTTON_GROUP, - }), - Object.assign({gasButtonGroupShown: true}, mockState.send) + SendReducer({ ...mockState, gasButtonGroupShown: false }, { type: SHOW_GAS_BUTTON_GROUP }), + { gasButtonGroupShown: true, ...mockState }, ) }) - it('should set gasButtonGroupShown to false when receiving a HIDE_GAS_BUTTON_GROUP action', () => { + it('should set gasButtonGroupShown to false when receiving a HIDE_GAS_BUTTON_GROUP action', function () { assert.deepEqual( - SendReducer(mockState, { - type: HIDE_GAS_BUTTON_GROUP, - }), - Object.assign({gasButtonGroupShown: false}, mockState.send) + SendReducer(mockState, { type: HIDE_GAS_BUTTON_GROUP }), + { gasButtonGroupShown: false, ...mockState }, ) }) - it('should extend send.errors with the value of a UPDATE_SEND_ERRORS action', () => { - const modifiedMockState = Object.assign({}, mockState, { - send: { - errors: { - someError: false, - }, + it('should extend send.errors with the value of a UPDATE_SEND_ERRORS action', function () { + const modifiedMockState = { + ...mockState, + errors: { + someError: false, }, - }) + } assert.deepEqual( SendReducer(modifiedMockState, { type: UPDATE_SEND_ERRORS, value: { someOtherError: true }, }), - Object.assign({}, modifiedMockState.send, { + { + ...modifiedMockState, errors: { someError: false, someOtherError: true, }, - }) + }, ) }) - it('should return the initial state in response to a RESET_SEND_STATE action', () => { + it('should return the initial state in response to a RESET_SEND_STATE action', function () { assert.deepEqual( SendReducer(mockState, { type: RESET_SEND_STATE, }), - Object.assign({}, initState) + initState, ) }) }) - describe('openToDropdown', () => { - assert.deepEqual( - openToDropdown(), - { type: OPEN_TO_DROPDOWN } - ) + describe('openToDropdown', function () { + assert.deepEqual(openToDropdown(), { type: OPEN_TO_DROPDOWN }) }) - describe('closeToDropdown', () => { - assert.deepEqual( - closeToDropdown(), - { type: CLOSE_TO_DROPDOWN } - ) + describe('closeToDropdown', function () { + assert.deepEqual(closeToDropdown(), { type: CLOSE_TO_DROPDOWN }) }) - describe('showGasButtonGroup', () => { - assert.deepEqual( - showGasButtonGroup(), - { type: SHOW_GAS_BUTTON_GROUP } - ) + describe('showGasButtonGroup', function () { + assert.deepEqual(showGasButtonGroup(), { type: SHOW_GAS_BUTTON_GROUP }) }) - describe('hideGasButtonGroup', () => { - assert.deepEqual( - hideGasButtonGroup(), - { type: HIDE_GAS_BUTTON_GROUP } - ) + describe('hideGasButtonGroup', function () { + assert.deepEqual(hideGasButtonGroup(), { type: HIDE_GAS_BUTTON_GROUP }) }) - describe('updateSendErrors', () => { - assert.deepEqual( - updateSendErrors('mockErrorObject'), - { type: UPDATE_SEND_ERRORS, value: 'mockErrorObject' } - ) + describe('updateSendErrors', function () { + assert.deepEqual(updateSendErrors('mockErrorObject'), { type: UPDATE_SEND_ERRORS, value: 'mockErrorObject' }) }) - - describe('updateSendWarnings', () => { - assert.deepEqual( - updateSendWarnings('mockWarningObject'), - { type: UPDATE_SEND_WARNINGS, value: 'mockWarningObject' } - ) - }) - }) diff --git a/ui/app/ducks/send/send.duck.js b/ui/app/ducks/send/send.duck.js index 90e92140bded..fce3ee3e92d4 100644 --- a/ui/app/ducks/send/send.duck.js +++ b/ui/app/ducks/send/send.duck.js @@ -1,72 +1,52 @@ -import extend from 'xtend' - // Actions -const OPEN_FROM_DROPDOWN = 'metamask/send/OPEN_FROM_DROPDOWN' -const CLOSE_FROM_DROPDOWN = 'metamask/send/CLOSE_FROM_DROPDOWN' const OPEN_TO_DROPDOWN = 'metamask/send/OPEN_TO_DROPDOWN' const CLOSE_TO_DROPDOWN = 'metamask/send/CLOSE_TO_DROPDOWN' const UPDATE_SEND_ERRORS = 'metamask/send/UPDATE_SEND_ERRORS' -const UPDATE_SEND_WARNINGS = 'metamask/send/UPDATE_SEND_WARNINGS' const RESET_SEND_STATE = 'metamask/send/RESET_SEND_STATE' const SHOW_GAS_BUTTON_GROUP = 'metamask/send/SHOW_GAS_BUTTON_GROUP' const HIDE_GAS_BUTTON_GROUP = 'metamask/send/HIDE_GAS_BUTTON_GROUP' -// TODO: determine if this approach to initState is consistent with conventional ducks pattern const initState = { - fromDropdownOpen: false, toDropdownOpen: false, gasButtonGroupShown: true, errors: {}, - warnings: {}, } // Reducer -export default function reducer ({ send: sendState = initState }, action = {}) { - const newState = extend({}, sendState) - +export default function reducer (state = initState, action) { switch (action.type) { - case OPEN_FROM_DROPDOWN: - return extend(newState, { - fromDropdownOpen: true, - }) - case CLOSE_FROM_DROPDOWN: - return extend(newState, { - fromDropdownOpen: false, - }) case OPEN_TO_DROPDOWN: - return extend(newState, { + return { + ...state, toDropdownOpen: true, - }) + } case CLOSE_TO_DROPDOWN: - return extend(newState, { + return { + ...state, toDropdownOpen: false, - }) + } case UPDATE_SEND_ERRORS: - return extend(newState, { + return { + ...state, errors: { - ...newState.errors, - ...action.value, - }, - }) - case UPDATE_SEND_WARNINGS: - return extend(newState, { - warnings: { - ...newState.warnings, + ...state.errors, ...action.value, }, - }) + } case SHOW_GAS_BUTTON_GROUP: - return extend(newState, { + return { + ...state, gasButtonGroupShown: true, - }) + } case HIDE_GAS_BUTTON_GROUP: - return extend(newState, { + return { + ...state, gasButtonGroupShown: false, - }) + } case RESET_SEND_STATE: - return extend({}, initState) + return { ...initState } default: - return newState + return state } } @@ -94,13 +74,6 @@ export function updateSendErrors (errorObject) { } } -export function updateSendWarnings (warningObject) { - return { - type: UPDATE_SEND_WARNINGS, - value: warningObject, - } -} - export function resetSendState () { return { type: RESET_SEND_STATE } } diff --git a/ui/app/helpers/constants/available-conversions.json b/ui/app/helpers/constants/available-conversions.json new file mode 100644 index 000000000000..913e8795fb44 --- /dev/null +++ b/ui/app/helpers/constants/available-conversions.json @@ -0,0 +1,250 @@ +[ + { + "code": "aud", + "name": "Australian Dollar" + }, + { + "code": "hkd", + "name": "Hong Kong Dollar" + }, + { + "code": "sgd", + "name": "Singapore Dollar" + }, + { + "code": "idr", + "name": "Indonesian Rupiah" + }, + { + "code": "inr", + "name": "Indian Rupee" + }, + { + "code": "php", + "name": "Philippine Peso" + }, + { + "code": "1st", + "name": "FirstBlood" + }, + { + "code": "adt", + "name": "adToken" + }, + { + "code": "adx", + "name": "AdEx" + }, + { + "code": "ant", + "name": "Aragon" + }, + { + "code": "bat", + "name": "Basic Attention Token" + }, + { + "code": "bnt", + "name": "Bancor" + }, + { + "code": "btc", + "name": "Bitcoin" + }, + { + "code": "cad", + "name": "Canadian Dollar" + }, + { + "code": "cfi", + "name": "Cofound.it" + }, + { + "code": "crb", + "name": "CreditBit" + }, + { + "code": "cvc", + "name": "Civic" + }, + { + "code": "dash", + "name": "Dash" + }, + { + "code": "dgd", + "name": "DigixDAO" + }, + { + "code": "etc", + "name": "Ethereum Classic" + }, + { + "code": "eur", + "name": "Euro" + }, + { + "code": "fun", + "name": "FunFair" + }, + { + "code": "gbp", + "name": "Pound Sterling" + }, + { + "code": "gno", + "name": "Gnosis" + }, + { + "code": "gnt", + "name": "Golem" + }, + { + "code": "gup", + "name": "Matchpool" + }, + { + "code": "hmq", + "name": "Humaniq" + }, + { + "code": "jpy", + "name": "Japanese Yen" + }, + { + "code": "lgd", + "name": "Legends Room" + }, + { + "code": "lsk", + "name": "Lisk" + }, + { + "code": "ltc", + "name": "Litecoin" + }, + { + "code": "lun", + "name": "Lunyr" + }, + { + "code": "mco", + "name": "Monaco" + }, + { + "code": "mtl", + "name": "Metal" + }, + { + "code": "myst", + "name": "Mysterium" + }, + { + "code": "nmr", + "name": "Numeraire" + }, + { + "code": "omg", + "name": "OmiseGO" + }, + { + "code": "pay", + "name": "TenX" + }, + { + "code": "ptoy", + "name": "Patientory" + }, + { + "code": "qrl", + "name": "Quantum-Resistant Ledger" + }, + { + "code": "qtum", + "name": "Qtum" + }, + { + "code": "rep", + "name": "Augur" + }, + { + "code": "rlc", + "name": "iEx.ec" + }, + { + "code": "rub", + "name": "Russian Ruble" + }, + { + "code": "sc", + "name": "Siacoin" + }, + { + "code": "sngls", + "name": "SingularDTV" + }, + { + "code": "snt", + "name": "Status" + }, + { + "code": "steem", + "name": "Steem" + }, + { + "code": "storj", + "name": "Storj" + }, + { + "code": "time", + "name": "ChronoBank" + }, + { + "code": "tkn", + "name": "TokenCard" + }, + { + "code": "trst", + "name": "WeTrust" + }, + { + "code": "uah", + "name": "Ukrainian Hryvnia" + }, + { + "code": "usd", + "name": "United States Dollar" + }, + { + "code": "wings", + "name": "Wings" + }, + { + "code": "xem", + "name": "NEM" + }, + { + "code": "xlm", + "name": "Stellar Lumen" + }, + { + "code": "xmr", + "name": "Monero" + }, + { + "code": "xrp", + "name": "Ripple" + }, + { + "code": "zec", + "name": "Zcash" + }, + { + "code": "dai", + "name": "DAI" + }, + { + "code": "sai", + "name": "SAI" + } +] diff --git a/ui/app/helpers/constants/common.js b/ui/app/helpers/constants/common.js index a0d6e65b3ffa..5055f88a7e0d 100644 --- a/ui/app/helpers/constants/common.js +++ b/ui/app/helpers/constants/common.js @@ -12,3 +12,9 @@ export const NETWORK_TYPES = { ROPSTEN: 'ropsten', GOERLI: 'goerli', } + +export const GAS_ESTIMATE_TYPES = { + SLOW: 'SLOW', + AVERAGE: 'AVERAGE', + FAST: 'FAST', +} diff --git a/ui/app/helpers/constants/connected-sites.js b/ui/app/helpers/constants/connected-sites.js new file mode 100644 index 000000000000..b5d6ad6bd27e --- /dev/null +++ b/ui/app/helpers/constants/connected-sites.js @@ -0,0 +1,3 @@ +export const STATUS_CONNECTED = 'STATUS_CONNECTED' +export const STATUS_CONNECTED_TO_ANOTHER_ACCOUNT = 'STATUS_CONNECTED_TO_ANOTHER_ACCOUNT' +export const STATUS_NOT_CONNECTED = 'STATUS_NOT_CONNECTED' diff --git a/ui/app/helpers/constants/infura-conversion.json b/ui/app/helpers/constants/infura-conversion.json deleted file mode 100644 index 9a96fe069be4..000000000000 --- a/ui/app/helpers/constants/infura-conversion.json +++ /dev/null @@ -1,653 +0,0 @@ -{ - "objects": [ - { - "symbol": "ethaud", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "aud", - "name": "Australian Dollar" - } - }, - { - "symbol": "ethhkd", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "hkd", - "name": "Hong Kong Dollar" - } - }, - { - "symbol": "ethsgd", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "sgd", - "name": "Singapore Dollar" - } - }, - { - "symbol": "ethidr", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "idr", - "name": "Indonesian Rupiah" - } - }, - { - "symbol": "ethphp", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "php", - "name": "Philippine Peso" - } - }, - { - "symbol": "eth1st", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "1st", - "name": "FirstBlood" - } - }, - { - "symbol": "ethadt", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "adt", - "name": "adToken" - } - }, - { - "symbol": "ethadx", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "adx", - "name": "AdEx" - } - }, - { - "symbol": "ethant", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "ant", - "name": "Aragon" - } - }, - { - "symbol": "ethbat", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "bat", - "name": "Basic Attention Token" - } - }, - { - "symbol": "ethbnt", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "bnt", - "name": "Bancor" - } - }, - { - "symbol": "ethbtc", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "btc", - "name": "Bitcoin" - } - }, - { - "symbol": "ethcad", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "cad", - "name": "Canadian Dollar" - } - }, - { - "symbol": "ethcfi", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "cfi", - "name": "Cofound.it" - } - }, - { - "symbol": "ethcrb", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "crb", - "name": "CreditBit" - } - }, - { - "symbol": "ethcvc", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "cvc", - "name": "Civic" - } - }, - { - "symbol": "ethdash", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "dash", - "name": "Dash" - } - }, - { - "symbol": "ethdgd", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "dgd", - "name": "DigixDAO" - } - }, - { - "symbol": "ethetc", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "etc", - "name": "Ethereum Classic" - } - }, - { - "symbol": "etheur", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "eur", - "name": "Euro" - } - }, - { - "symbol": "ethfun", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "fun", - "name": "FunFair" - } - }, - { - "symbol": "ethgbp", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "gbp", - "name": "Pound Sterling" - } - }, - { - "symbol": "ethgno", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "gno", - "name": "Gnosis" - } - }, - { - "symbol": "ethgnt", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "gnt", - "name": "Golem" - } - }, - { - "symbol": "ethgup", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "gup", - "name": "Matchpool" - } - }, - { - "symbol": "ethhmq", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "hmq", - "name": "Humaniq" - } - }, - { - "symbol": "ethjpy", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "jpy", - "name": "Japanese Yen" - } - }, - { - "symbol": "ethlgd", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "lgd", - "name": "Legends Room" - } - }, - { - "symbol": "ethlsk", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "lsk", - "name": "Lisk" - } - }, - { - "symbol": "ethltc", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "ltc", - "name": "Litecoin" - } - }, - { - "symbol": "ethlun", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "lun", - "name": "Lunyr" - } - }, - { - "symbol": "ethmco", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "mco", - "name": "Monaco" - } - }, - { - "symbol": "ethmtl", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "mtl", - "name": "Metal" - } - }, - { - "symbol": "ethmyst", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "myst", - "name": "Mysterium" - } - }, - { - "symbol": "ethnmr", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "nmr", - "name": "Numeraire" - } - }, - { - "symbol": "ethomg", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "omg", - "name": "OmiseGO" - } - }, - { - "symbol": "ethpay", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "pay", - "name": "TenX" - } - }, - { - "symbol": "ethptoy", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "ptoy", - "name": "Patientory" - } - }, - { - "symbol": "ethqrl", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "qrl", - "name": "Quantum-Resistant Ledger" - } - }, - { - "symbol": "ethqtum", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "qtum", - "name": "Qtum" - } - }, - { - "symbol": "ethrep", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "rep", - "name": "Augur" - } - }, - { - "symbol": "ethrlc", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "rlc", - "name": "iEx.ec" - } - }, - { - "symbol": "ethrub", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "rub", - "name": "Russian Ruble" - } - }, - { - "symbol": "ethsc", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "sc", - "name": "Siacoin" - } - }, - { - "symbol": "ethsngls", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "sngls", - "name": "SingularDTV" - } - }, - { - "symbol": "ethsnt", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "snt", - "name": "Status" - } - }, - { - "symbol": "ethsteem", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "steem", - "name": "Steem" - } - }, - { - "symbol": "ethstorj", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "storj", - "name": "Storj" - } - }, - { - "symbol": "ethtime", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "time", - "name": "ChronoBank" - } - }, - { - "symbol": "ethtkn", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "tkn", - "name": "TokenCard" - } - }, - { - "symbol": "ethtrst", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "trst", - "name": "WeTrust" - } - }, - { - "symbol": "ethuah", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "uah", - "name": "Ukrainian Hryvnia" - } - }, - { - "symbol": "ethusd", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "usd", - "name": "United States Dollar" - } - }, - { - "symbol": "ethwings", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "wings", - "name": "Wings" - } - }, - { - "symbol": "ethxem", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "xem", - "name": "NEM" - } - }, - { - "symbol": "ethxlm", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "xlm", - "name": "Stellar Lumen" - } - }, - { - "symbol": "ethxmr", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "xmr", - "name": "Monero" - } - }, - { - "symbol": "ethxrp", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "xrp", - "name": "Ripple" - } - }, - { - "symbol": "ethzec", - "base": { - "code": "eth", - "name": "Ethereum" - }, - "quote": { - "code": "zec", - "name": "Zcash" - } - } - ] -} diff --git a/ui/app/helpers/constants/routes.js b/ui/app/helpers/constants/routes.js index d906fc8e6730..4dcb62670b78 100644 --- a/ui/app/helpers/constants/routes.js +++ b/ui/app/helpers/constants/routes.js @@ -1,17 +1,24 @@ const DEFAULT_ROUTE = '/' const UNLOCK_ROUTE = '/unlock' const LOCK_ROUTE = '/lock' +const ASSET_ROUTE = '/asset' const SETTINGS_ROUTE = '/settings' const GENERAL_ROUTE = '/settings/general' -const INFO_ROUTE = '/settings/info' +const CONNECTIONS_ROUTE = '/settings/connections' const ADVANCED_ROUTE = '/settings/advanced' const SECURITY_ROUTE = '/settings/security' -const COMPANY_ROUTE = '/settings/company' const ABOUT_US_ROUTE = '/settings/about-us' +const ALERTS_ROUTE = '/settings/alerts' const NETWORKS_ROUTE = '/settings/networks' +const CONTACT_LIST_ROUTE = '/settings/contact-list' +const CONTACT_EDIT_ROUTE = '/settings/contact-list/edit-contact' +const CONTACT_ADD_ROUTE = '/settings/contact-list/add-contact' +const CONTACT_VIEW_ROUTE = '/settings/contact-list/view-contact' +const CONTACT_MY_ACCOUNTS_ROUTE = '/settings/contact-list/my-accounts' +const CONTACT_MY_ACCOUNTS_VIEW_ROUTE = '/settings/contact-list/my-accounts/view' +const CONTACT_MY_ACCOUNTS_EDIT_ROUTE = '/settings/contact-list/my-accounts/edit' const REVEAL_SEED_ROUTE = '/seed' const MOBILE_SYNC_ROUTE = '/mobile-sync' -const CONFIRM_SEED_ROUTE = '/confirm-seed' const RESTORE_VAULT_ROUTE = '/restore-vault' const ADD_TOKEN_ROUTE = '/add-token' const CONFIRM_ADD_TOKEN_ROUTE = '/confirm-add-token' @@ -20,17 +27,19 @@ const NEW_ACCOUNT_ROUTE = '/new-account' const IMPORT_ACCOUNT_ROUTE = '/new-account/import' const CONNECT_HARDWARE_ROUTE = '/new-account/connect' const SEND_ROUTE = '/send' -const WELCOME_ROUTE = '/welcome' +const CONNECT_ROUTE = '/connect' +const CONNECT_CONFIRM_PERMISSIONS_ROUTE = '/confirm-permissions' +const CONNECTED_ROUTE = '/connected' +const CONNECTED_ACCOUNTS_ROUTE = '/connected/accounts' const INITIALIZE_ROUTE = '/initialize' const INITIALIZE_WELCOME_ROUTE = '/initialize/welcome' const INITIALIZE_UNLOCK_ROUTE = '/initialize/unlock' const INITIALIZE_CREATE_PASSWORD_ROUTE = '/initialize/create-password' -const INITIALIZE_IMPORT_ACCOUNT_ROUTE = '/initialize/create-password/import-account' const INITIALIZE_IMPORT_WITH_SEED_PHRASE_ROUTE = '/initialize/create-password/import-with-seed-phrase' -const INITIALIZE_UNIQUE_IMAGE_ROUTE = '/initialize/create-password/unique-image' const INITIALIZE_SELECT_ACTION_ROUTE = '/initialize/select-action' const INITIALIZE_SEED_PHRASE_ROUTE = '/initialize/seed-phrase' +const INITIALIZE_BACKUP_SEED_PHRASE_ROUTE = '/initialize/backup-seed-phrase' const INITIALIZE_END_OF_FLOW_ROUTE = '/initialize/end-of-flow' const INITIALIZE_CONFIRM_SEED_PHRASE_ROUTE = '/initialize/seed-phrase/confirm' const INITIALIZE_METAMETRICS_OPT_IN_ROUTE = '/initialize/metametrics-opt-in' @@ -43,16 +52,18 @@ const CONFIRM_APPROVE_PATH = '/approve' const CONFIRM_TRANSFER_FROM_PATH = '/transfer-from' const CONFIRM_TOKEN_METHOD_PATH = '/token-method' const SIGNATURE_REQUEST_PATH = '/signature-request' +const DECRYPT_MESSAGE_REQUEST_PATH = '/decrypt-message-request' +const ENCRYPTION_PUBLIC_KEY_REQUEST_PATH = '/encryption-public-key-request' -module.exports = { +export { DEFAULT_ROUTE, + ALERTS_ROUTE, + ASSET_ROUTE, UNLOCK_ROUTE, LOCK_ROUTE, SETTINGS_ROUTE, - INFO_ROUTE, REVEAL_SEED_ROUTE, MOBILE_SYNC_ROUTE, - CONFIRM_SEED_ROUTE, RESTORE_VAULT_ROUTE, ADD_TOKEN_ROUTE, CONFIRM_ADD_TOKEN_ROUTE, @@ -61,14 +72,11 @@ module.exports = { IMPORT_ACCOUNT_ROUTE, CONNECT_HARDWARE_ROUTE, SEND_ROUTE, - WELCOME_ROUTE, INITIALIZE_ROUTE, INITIALIZE_WELCOME_ROUTE, INITIALIZE_UNLOCK_ROUTE, INITIALIZE_CREATE_PASSWORD_ROUTE, - INITIALIZE_IMPORT_ACCOUNT_ROUTE, INITIALIZE_IMPORT_WITH_SEED_PHRASE_ROUTE, - INITIALIZE_UNIQUE_IMAGE_ROUTE, INITIALIZE_SELECT_ACTION_ROUTE, INITIALIZE_SEED_PHRASE_ROUTE, INITIALIZE_CONFIRM_SEED_PHRASE_ROUTE, @@ -81,11 +89,25 @@ module.exports = { CONFIRM_TRANSFER_FROM_PATH, CONFIRM_TOKEN_METHOD_PATH, SIGNATURE_REQUEST_PATH, + DECRYPT_MESSAGE_REQUEST_PATH, + ENCRYPTION_PUBLIC_KEY_REQUEST_PATH, INITIALIZE_METAMETRICS_OPT_IN_ROUTE, ADVANCED_ROUTE, SECURITY_ROUTE, - COMPANY_ROUTE, GENERAL_ROUTE, + CONNECTIONS_ROUTE, ABOUT_US_ROUTE, + CONTACT_LIST_ROUTE, + CONTACT_EDIT_ROUTE, + CONTACT_ADD_ROUTE, + CONTACT_VIEW_ROUTE, + CONTACT_MY_ACCOUNTS_ROUTE, + CONTACT_MY_ACCOUNTS_VIEW_ROUTE, + CONTACT_MY_ACCOUNTS_EDIT_ROUTE, NETWORKS_ROUTE, + INITIALIZE_BACKUP_SEED_PHRASE_ROUTE, + CONNECT_ROUTE, + CONNECT_CONFIRM_PERMISSIONS_ROUTE, + CONNECTED_ROUTE, + CONNECTED_ACCOUNTS_ROUTE, } diff --git a/ui/app/helpers/constants/transactions.js b/ui/app/helpers/constants/transactions.js index d0a819b9b238..c67a00590054 100644 --- a/ui/app/helpers/constants/transactions.js +++ b/ui/app/helpers/constants/transactions.js @@ -8,17 +8,45 @@ export const FAILED_STATUS = 'failed' export const DROPPED_STATUS = 'dropped' export const CANCELLED_STATUS = 'cancelled' +export const PENDING_STATUS_HASH = { + [UNAPPROVED_STATUS]: true, + [APPROVED_STATUS]: true, + [SUBMITTED_STATUS]: true, +} + +export const PRIORITY_STATUS_HASH = { + ...PENDING_STATUS_HASH, + [CONFIRMED_STATUS]: true, +} + export const TOKEN_METHOD_TRANSFER = 'transfer' export const TOKEN_METHOD_APPROVE = 'approve' export const TOKEN_METHOD_TRANSFER_FROM = 'transferfrom' +export const TOKEN_CATEGORY_HASH = { + [TOKEN_METHOD_APPROVE]: true, + [TOKEN_METHOD_TRANSFER]: true, + [TOKEN_METHOD_TRANSFER_FROM]: true, +} + +export const INCOMING_TRANSACTION = 'incoming' + export const SEND_ETHER_ACTION_KEY = 'sentEther' export const DEPLOY_CONTRACT_ACTION_KEY = 'contractDeployment' export const APPROVE_ACTION_KEY = 'approve' export const SEND_TOKEN_ACTION_KEY = 'sentTokens' export const TRANSFER_FROM_ACTION_KEY = 'transferFrom' export const SIGNATURE_REQUEST_KEY = 'signatureRequest' +export const DECRYPT_REQUEST_KEY = 'decryptRequest' +export const ENCRYPTION_PUBLIC_KEY_REQUEST_KEY = 'encryptionPublicKeyRequest' export const CONTRACT_INTERACTION_KEY = 'contractInteraction' export const CANCEL_ATTEMPT_ACTION_KEY = 'cancelAttempt' +export const DEPOSIT_TRANSACTION_KEY = 'deposit' -export const TRANSACTION_TYPE_SHAPESHIFT = 'shapeshift' +// Transaction List Item Categories +// Used for UI distinction between transactions in the history list +export const TRANSACTION_CATEGORY_SEND = 'send' +export const TRANSACTION_CATEGORY_RECEIVE = 'receive' +export const TRANSACTION_CATEGORY_INTERACTION = 'interaction' +export const TRANSACTION_CATEGORY_APPROVAL = 'approval' +export const TRANSACTION_CATEGORY_SIGNATURE_REQUEST = 'signature-request' diff --git a/ui/app/helpers/higher-order-components/authenticated/authenticated.container.js b/ui/app/helpers/higher-order-components/authenticated/authenticated.container.js index 6124b0fcdfb5..3b67b2cfe3e1 100644 --- a/ui/app/helpers/higher-order-components/authenticated/authenticated.container.js +++ b/ui/app/helpers/higher-order-components/authenticated/authenticated.container.js @@ -1,8 +1,9 @@ import { connect } from 'react-redux' import Authenticated from './authenticated.component' -const mapStateToProps = state => { +const mapStateToProps = (state) => { const { metamask: { isUnlocked, completedOnboarding } } = state + return { isUnlocked, completedOnboarding, diff --git a/ui/app/helpers/higher-order-components/i18n-provider.js b/ui/app/helpers/higher-order-components/i18n-provider.js deleted file mode 100644 index 5a6650147cb6..000000000000 --- a/ui/app/helpers/higher-order-components/i18n-provider.js +++ /dev/null @@ -1,65 +0,0 @@ -const { Component } = require('react') -const connect = require('react-redux').connect -const PropTypes = require('prop-types') -const { withRouter } = require('react-router-dom') -const { compose } = require('recompose') -const t = require('../utils/i18n-helper').getMessage - -class I18nProvider extends Component { - tOrDefault = (key, defaultValue, ...args) => { - const { localeMessages: { current, en } = {} } = this.props - return t(current, key, ...args) || t(en, key, ...args) || defaultValue - } - - getChildContext () { - const { localeMessages } = this.props - const { current, en } = localeMessages - return { - /** - * Returns a localized message for the given key - * @param {string} key The message key - * @param {string[]} args A list of message substitution replacements - * @return {string|undefined|null} The localized message if available - */ - t (key, ...args) { - if (key === undefined || key === null) { - return key - } - - return t(current, key, ...args) || t(en, key, ...args) || `[${key}]` - }, - tOrDefault: this.tOrDefault, - tOrKey: (key, ...args) => { - return this.tOrDefault(key, key, ...args) - }, - } - } - - render () { - return this.props.children - } -} - -I18nProvider.propTypes = { - localeMessages: PropTypes.object, - children: PropTypes.object, -} - -I18nProvider.childContextTypes = { - t: PropTypes.func, - tOrDefault: PropTypes.func, - tOrKey: PropTypes.func, -} - -const mapStateToProps = state => { - const { localeMessages } = state - return { - localeMessages, - } -} - -module.exports = compose( - withRouter, - connect(mapStateToProps) -)(I18nProvider) - diff --git a/ui/app/helpers/higher-order-components/initialized/index.js b/ui/app/helpers/higher-order-components/initialized/index.js index 863fcb389eb6..5aa9f08092d1 100644 --- a/ui/app/helpers/higher-order-components/initialized/index.js +++ b/ui/app/helpers/higher-order-components/initialized/index.js @@ -1 +1 @@ -export { default } from './initialized.container.js' +export { default } from './initialized.container' diff --git a/ui/app/helpers/higher-order-components/initialized/initialized.container.js b/ui/app/helpers/higher-order-components/initialized/initialized.container.js index 0e7f72bcb48d..2456559623cc 100644 --- a/ui/app/helpers/higher-order-components/initialized/initialized.container.js +++ b/ui/app/helpers/higher-order-components/initialized/initialized.container.js @@ -1,7 +1,7 @@ import { connect } from 'react-redux' import Initialized from './initialized.component' -const mapStateToProps = state => { +const mapStateToProps = (state) => { const { metamask: { completedOnboarding } } = state return { diff --git a/ui/app/helpers/higher-order-components/metametrics/metametrics.provider.js b/ui/app/helpers/higher-order-components/metametrics/metametrics.provider.js deleted file mode 100644 index 6281ddcc6061..000000000000 --- a/ui/app/helpers/higher-order-components/metametrics/metametrics.provider.js +++ /dev/null @@ -1,106 +0,0 @@ -import { Component } from 'react' -import { connect } from 'react-redux' -import PropTypes from 'prop-types' -import { withRouter } from 'react-router-dom' -import { compose } from 'recompose' -import { - getCurrentNetworkId, - getSelectedAsset, - getAccountType, - getNumberOfAccounts, - getNumberOfTokens, -} from '../../../selectors/selectors' -import { - txDataSelector, -} from '../../../selectors/confirm-transaction' -import { getEnvironmentType } from '../../../../../app/scripts/lib/util' -import { - sendMetaMetricsEvent, - sendCountIsTrackable, -} from '../../utils/metametrics.util' - -class MetaMetricsProvider extends Component { - static propTypes = { - network: PropTypes.string.isRequired, - environmentType: PropTypes.string.isRequired, - activeCurrency: PropTypes.string.isRequired, - accountType: PropTypes.string.isRequired, - metaMetricsSendCount: PropTypes.number.isRequired, - children: PropTypes.object.isRequired, - history: PropTypes.object.isRequired, - } - - static childContextTypes = { - metricsEvent: PropTypes.func, - } - - constructor (props) { - super(props) - - this.state = { - previousPath: '', - currentPath: window.location.href, - } - - props.history.listen(() => { - this.setState({ - previousPath: this.state.currentPath, - currentPath: window.location.href, - }) - }) - } - - getChildContext () { - const props = this.props - const { pathname } = location - const { previousPath, currentPath } = this.state - - return { - metricsEvent: (config = {}, overrides = {}) => { - const { eventOpts = {} } = config - const { name = '' } = eventOpts - const { pathname: overRidePathName = '' } = overrides - const isSendFlow = Boolean(name.match(/^send|^confirm/) || overRidePathName.match(/send|confirm/)) - - if (props.participateInMetaMetrics || config.isOptIn) { - return sendMetaMetricsEvent({ - ...props, - ...config, - previousPath, - currentPath, - pathname, - excludeMetaMetricsId: isSendFlow && !sendCountIsTrackable(props.metaMetricsSendCount + 1), - ...overrides, - }) - } - }, - } - } - - render () { - return this.props.children - } -} - -const mapStateToProps = state => { - const txData = txDataSelector(state) || {} - - return { - network: getCurrentNetworkId(state), - environmentType: getEnvironmentType(), - activeCurrency: getSelectedAsset(state), - accountType: getAccountType(state), - confirmTransactionOrigin: txData.origin, - metaMetricsId: state.metamask.metaMetricsId, - participateInMetaMetrics: state.metamask.participateInMetaMetrics, - metaMetricsSendCount: state.metamask.metaMetricsSendCount, - numberOfTokens: getNumberOfTokens(state), - numberOfAccounts: getNumberOfAccounts(state), - } -} - -module.exports = compose( - withRouter, - connect(mapStateToProps) -)(MetaMetricsProvider) - diff --git a/ui/app/helpers/higher-order-components/with-method-data/index.js b/ui/app/helpers/higher-order-components/with-method-data/index.js deleted file mode 100644 index f511e1ae7106..000000000000 --- a/ui/app/helpers/higher-order-components/with-method-data/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './with-method-data.component' diff --git a/ui/app/helpers/higher-order-components/with-method-data/with-method-data.component.js b/ui/app/helpers/higher-order-components/with-method-data/with-method-data.component.js deleted file mode 100644 index efa9ad0a2345..000000000000 --- a/ui/app/helpers/higher-order-components/with-method-data/with-method-data.component.js +++ /dev/null @@ -1,65 +0,0 @@ -import React, { PureComponent } from 'react' -import PropTypes from 'prop-types' -import { getMethodData, getFourBytePrefix } from '../../utils/transactions.util' - -export default function withMethodData (WrappedComponent) { - return class MethodDataWrappedComponent extends PureComponent { - static propTypes = { - transaction: PropTypes.object, - knownMethodData: PropTypes.object, - addKnownMethodData: PropTypes.func, - } - - static defaultProps = { - transaction: {}, - knownMethodData: {}, - } - - state = { - methodData: {}, - done: false, - error: null, - } - - componentDidMount () { - this.fetchMethodData() - } - - async fetchMethodData () { - const { transaction, knownMethodData, addKnownMethodData } = this.props - const { txParams: { data = '' } = {} } = transaction - - if (data) { - try { - let methodData - const fourBytePrefix = getFourBytePrefix(data) - if (fourBytePrefix in knownMethodData) { - methodData = knownMethodData[fourBytePrefix] - } else { - methodData = await getMethodData(data) - if (!Object.entries(methodData).length === 0) { - addKnownMethodData(fourBytePrefix, methodData) - } - } - - this.setState({ methodData, done: true }) - } catch (error) { - this.setState({ done: true, error }) - } - } else { - this.setState({ done: true }) - } - } - - render () { - const { methodData, done, error } = this.state - - return ( - - ) - } - } -} diff --git a/ui/app/helpers/higher-order-components/with-modal-props/tests/with-modal-props.test.js b/ui/app/helpers/higher-order-components/with-modal-props/tests/with-modal-props.test.js index 81a3512d178a..e14adb2ce3fe 100644 --- a/ui/app/helpers/higher-order-components/with-modal-props/tests/with-modal-props.test.js +++ b/ui/app/helpers/higher-order-components/with-modal-props/tests/with-modal-props.test.js @@ -19,15 +19,15 @@ const mockState = { }, } -describe('withModalProps', () => { - it('should return a component wrapped with modal state props', () => { +describe('withModalProps', function () { + it('should return a component wrapped with modal state props', function () { const TestComponent = () => (
      Testing
      ) const WrappedComponent = withModalProps(TestComponent) const store = configureMockStore()(mockState) const wrapper = mount( - + , ) assert.ok(wrapper) diff --git a/ui/app/helpers/higher-order-components/with-modal-props/with-modal-props.js b/ui/app/helpers/higher-order-components/with-modal-props/with-modal-props.js index aac6b5a61669..b702ff24f947 100644 --- a/ui/app/helpers/higher-order-components/with-modal-props/with-modal-props.js +++ b/ui/app/helpers/higher-order-components/with-modal-props/with-modal-props.js @@ -1,7 +1,7 @@ import { connect } from 'react-redux' import { hideModal } from '../../../store/actions' -const mapStateToProps = state => { +const mapStateToProps = (state) => { const { appState } = state const { props: modalProps } = appState.modal.modalState @@ -10,7 +10,7 @@ const mapStateToProps = state => { } } -const mapDispatchToProps = dispatch => { +const mapDispatchToProps = (dispatch) => { return { hideModal: () => dispatch(hideModal()), } diff --git a/ui/app/helpers/higher-order-components/with-token-tracker/index.js b/ui/app/helpers/higher-order-components/with-token-tracker/index.js deleted file mode 100644 index d401e81f1fba..000000000000 --- a/ui/app/helpers/higher-order-components/with-token-tracker/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './with-token-tracker.component' diff --git a/ui/app/helpers/higher-order-components/with-token-tracker/with-token-tracker.component.js b/ui/app/helpers/higher-order-components/with-token-tracker/with-token-tracker.component.js deleted file mode 100644 index 36f6a6efdd0e..000000000000 --- a/ui/app/helpers/higher-order-components/with-token-tracker/with-token-tracker.component.js +++ /dev/null @@ -1,106 +0,0 @@ -import React, { Component } from 'react' -import PropTypes from 'prop-types' -import TokenTracker from 'eth-token-tracker' - -export default function withTokenTracker (WrappedComponent) { - return class TokenTrackerWrappedComponent extends Component { - static propTypes = { - userAddress: PropTypes.string.isRequired, - token: PropTypes.object.isRequired, - } - - constructor (props) { - super(props) - - this.state = { - string: '', - symbol: '', - error: null, - } - - this.tracker = null - this.updateBalance = this.updateBalance.bind(this) - this.setError = this.setError.bind(this) - } - - componentDidMount () { - this.createFreshTokenTracker() - } - - componentDidUpdate (prevProps) { - const { userAddress: newAddress, token: { address: newTokenAddress } } = this.props - const { userAddress: oldAddress, token: { address: oldTokenAddress } } = prevProps - - if ((oldAddress === newAddress) && (oldTokenAddress === newTokenAddress)) { - return - } - - if ((!oldAddress || !newAddress) && (!oldTokenAddress || !newTokenAddress)) { - return - } - - this.createFreshTokenTracker() - } - - componentWillUnmount () { - this.removeListeners() - } - - createFreshTokenTracker () { - this.removeListeners() - - if (!global.ethereumProvider) { - return - } - - const { userAddress, token } = this.props - - this.tracker = new TokenTracker({ - userAddress, - provider: global.ethereumProvider, - tokens: [token], - pollingInterval: 8000, - }) - - this.tracker.on('update', this.updateBalance) - this.tracker.on('error', this.setError) - - this.tracker.updateBalances() - .then(() => this.updateBalance(this.tracker.serialize())) - .catch(error => this.setState({ error: error.message })) - } - - setError (error) { - this.setState({ error }) - } - - updateBalance (tokens = []) { - if (!this.tracker.running) { - return - } - const [{ string, symbol }] = tokens - this.setState({ string, symbol, error: null }) - } - - removeListeners () { - if (this.tracker) { - this.tracker.stop() - this.tracker.removeListener('update', this.updateBalance) - this.tracker.removeListener('error', this.setError) - } - } - - render () { - const { string, symbol, error } = this.state - - return ( - - ) - } - } -} diff --git a/ui/app/helpers/utils/common.util.js b/ui/app/helpers/utils/common.util.js index 0c02481e6ee8..4df816941849 100644 --- a/ui/app/helpers/utils/common.util.js +++ b/ui/app/helpers/utils/common.util.js @@ -1,5 +1,5 @@ export function camelCaseToCapitalize (str = '') { return str - .replace(/([A-Z])/g, ' $1') - .replace(/^./, str => str.toUpperCase()) + .replace(/([A-Z])/ug, ' $1') + .replace(/^./u, (s) => s.toUpperCase()) } diff --git a/ui/app/helpers/utils/common.util.test.js b/ui/app/helpers/utils/common.util.test.js index 6259f4a891d3..cd2d71b03117 100644 --- a/ui/app/helpers/utils/common.util.test.js +++ b/ui/app/helpers/utils/common.util.test.js @@ -1,9 +1,9 @@ -import * as utils from './common.util' import assert from 'assert' +import * as utils from './common.util' -describe('Common utils', () => { - describe('camelCaseToCapitalize', () => { - it('should return a capitalized string from a camel-cased string', () => { +describe('Common utils', function () { + describe('camelCaseToCapitalize', function () { + it('should return a capitalized string from a camel-cased string', function () { const tests = [ { test: undefined, diff --git a/ui/app/helpers/utils/confirm-tx.util.js b/ui/app/helpers/utils/confirm-tx.util.js index 853427b31bd9..a6319ef97b1b 100644 --- a/ui/app/helpers/utils/confirm-tx.util.js +++ b/ui/app/helpers/utils/confirm-tx.util.js @@ -3,6 +3,7 @@ import currencies from 'currency-formatter/currencies' import ethUtil from 'ethereumjs-util' import BigNumber from 'bignumber.js' +import { unconfirmedTransactionsCountSelector } from '../../selectors' import { conversionUtil, addCurrencies, @@ -10,8 +11,6 @@ import { conversionGreaterThan, } from './conversion-util' -import { unconfirmedTransactionsCountSelector } from '../../selectors/confirm-transaction' - export function increaseLastGasPrice (lastGasPrice) { return ethUtil.addHexPrefix(multiplyCurrencies(lastGasPrice || '0x0', 1.1, { multiplicandBase: 16, @@ -94,7 +93,7 @@ export function getTransactionFee ({ export function formatCurrency (value, currencyCode) { const upperCaseCurrencyCode = currencyCode.toUpperCase() - return currencies.find(currency => currency.code === upperCaseCurrencyCode) + return currencies.find((currency) => currency.code === upperCaseCurrencyCode) ? currencyFormatter.format(Number(value), { code: upperCaseCurrencyCode, style: 'currency' }) : value } diff --git a/ui/app/helpers/utils/confirm-tx.util.test.js b/ui/app/helpers/utils/confirm-tx.util.test.js index e818601ca8f5..065631c7d59e 100644 --- a/ui/app/helpers/utils/confirm-tx.util.test.js +++ b/ui/app/helpers/utils/confirm-tx.util.test.js @@ -1,99 +1,99 @@ -import * as utils from './confirm-tx.util' import assert from 'assert' +import * as utils from './confirm-tx.util' -describe('Confirm Transaction utils', () => { - describe('increaseLastGasPrice', () => { - it('should increase the gasPrice by 10%', () => { +describe('Confirm Transaction utils', function () { + describe('increaseLastGasPrice', function () { + it('should increase the gasPrice by 10%', function () { const increasedGasPrice = utils.increaseLastGasPrice('0xa') assert.equal(increasedGasPrice, '0xb') }) - it('should prefix the result with 0x', () => { + it('should prefix the result with 0x', function () { const increasedGasPrice = utils.increaseLastGasPrice('a') assert.equal(increasedGasPrice, '0xb') }) }) - describe('hexGreaterThan', () => { - it('should return true if the first value is greater than the second value', () => { + describe('hexGreaterThan', function () { + it('should return true if the first value is greater than the second value', function () { assert.equal( utils.hexGreaterThan('0xb', '0xa'), - true + true, ) }) - it('should return false if the first value is less than the second value', () => { + it('should return false if the first value is less than the second value', function () { assert.equal( utils.hexGreaterThan('0xa', '0xb'), - false + false, ) }) - it('should return false if the first value is equal to the second value', () => { + it('should return false if the first value is equal to the second value', function () { assert.equal( utils.hexGreaterThan('0xa', '0xa'), - false + false, ) }) - it('should correctly compare prefixed and non-prefixed hex values', () => { + it('should correctly compare prefixed and non-prefixed hex values', function () { assert.equal( utils.hexGreaterThan('0xb', 'a'), - true + true, ) }) }) - describe('getHexGasTotal', () => { - it('should multiply the hex gasLimit and hex gasPrice values together', () => { + describe('getHexGasTotal', function () { + it('should multiply the hex gasLimit and hex gasPrice values together', function () { assert.equal( utils.getHexGasTotal({ gasLimit: '0x5208', gasPrice: '0x3b9aca00' }), - '0x1319718a5000' + '0x1319718a5000', ) }) - it('should prefix the result with 0x', () => { + it('should prefix the result with 0x', function () { assert.equal( utils.getHexGasTotal({ gasLimit: '5208', gasPrice: '3b9aca00' }), - '0x1319718a5000' + '0x1319718a5000', ) }) }) - describe('addEth', () => { - it('should add two values together rounding to 6 decimal places', () => { + describe('addEth', function () { + it('should add two values together rounding to 6 decimal places', function () { assert.equal( utils.addEth('0.12345678', '0'), - '0.123457' + '0.123457', ) }) - it('should add any number of values together rounding to 6 decimal places', () => { + it('should add any number of values together rounding to 6 decimal places', function () { assert.equal( utils.addEth('0.1', '0.02', '0.003', '0.0004', '0.00005', '0.000006', '0.0000007'), - '0.123457' + '0.123457', ) }) }) - describe('addFiat', () => { - it('should add two values together rounding to 2 decimal places', () => { + describe('addFiat', function () { + it('should add two values together rounding to 2 decimal places', function () { assert.equal( utils.addFiat('0.12345678', '0'), - '0.12' + '0.12', ) }) - it('should add any number of values together rounding to 2 decimal places', () => { + it('should add any number of values together rounding to 2 decimal places', function () { assert.equal( utils.addFiat('0.1', '0.02', '0.003', '0.0004', '0.00005', '0.000006', '0.0000007'), - '0.12' + '0.12', ) }) }) - describe('getValueFromWeiHex', () => { - it('should get the transaction amount in ETH', () => { + describe('getValueFromWeiHex', function () { + it('should get the transaction amount in ETH', function () { const ethTransactionAmount = utils.getValueFromWeiHex({ value: '0xde0b6b3a7640000', toCurrency: 'ETH', conversionRate: 468.58, numberOfDecimals: 6, }) @@ -101,7 +101,7 @@ describe('Confirm Transaction utils', () => { assert.equal(ethTransactionAmount, '1') }) - it('should get the transaction amount in fiat', () => { + it('should get the transaction amount in fiat', function () { const fiatTransactionAmount = utils.getValueFromWeiHex({ value: '0xde0b6b3a7640000', toCurrency: 'usd', conversionRate: 468.58, numberOfDecimals: 2, }) @@ -110,8 +110,8 @@ describe('Confirm Transaction utils', () => { }) }) - describe('getTransactionFee', () => { - it('should get the transaction fee in ETH', () => { + describe('getTransactionFee', function () { + it('should get the transaction fee in ETH', function () { const ethTransactionFee = utils.getTransactionFee({ value: '0x1319718a5000', toCurrency: 'ETH', conversionRate: 468.58, numberOfDecimals: 6, }) @@ -119,7 +119,7 @@ describe('Confirm Transaction utils', () => { assert.equal(ethTransactionFee, '0.000021') }) - it('should get the transaction fee in fiat', () => { + it('should get the transaction fee in fiat', function () { const fiatTransactionFee = utils.getTransactionFee({ value: '0x1319718a5000', toCurrency: 'usd', conversionRate: 468.58, numberOfDecimals: 2, }) @@ -128,8 +128,8 @@ describe('Confirm Transaction utils', () => { }) }) - describe('formatCurrency', () => { - it('should format USD values', () => { + describe('formatCurrency', function () { + it('should format USD values', function () { const value = utils.formatCurrency('123.45', 'usd') assert.equal(value, '$123.45') }) diff --git a/ui/app/helpers/utils/conversion-util.js b/ui/app/helpers/utils/conversion-util.js index affddade7bac..6991e1482a30 100644 --- a/ui/app/helpers/utils/conversion-util.js +++ b/ui/app/helpers/utils/conversion-util.js @@ -4,7 +4,7 @@ * numeric base, denomination and currency, and the desired numeric base, denomination and * currency. It should return a single value. * -* @param {(number | string | BN)} value The value to convert. +* @param {(number | string | BN)} value - The value to convert. * @param {Object} [options] Options to specify details of the conversion * @param {string} [options.fromCurrency = 'ETH' | 'USD'] The currency of the passed value * @param {string} [options.toCurrency = 'ETH' | 'USD'] The desired currency of the result @@ -17,102 +17,115 @@ * @returns {(number | string | BN)} * * The utility passes value along with the options as a single object to the `converter` function. -* `converter` uses Ramda.js to apply a composition of conditional setters to the `value` property, depending -* on the accompanying options. Some of these conditional setters are selected via key-value maps, where -* the keys are specified in the options parameters and the values are setter functions. +* `converter` conditional modifies the supplied `value` property, depending +* on the accompanying options. */ -const BigNumber = require('bignumber.js') -const ethUtil = require('ethereumjs-util') -const BN = ethUtil.BN -const R = require('ramda') -const { stripHexPrefix } = require('ethereumjs-util') +import BigNumber from 'bignumber.js' -BigNumber.config({ - ROUNDING_MODE: BigNumber.ROUND_HALF_DOWN, -}) +import ethUtil, { stripHexPrefix } from 'ethereumjs-util' + +const { BN } = ethUtil // Big Number Constants const BIG_NUMBER_WEI_MULTIPLIER = new BigNumber('1000000000000000000') const BIG_NUMBER_GWEI_MULTIPLIER = new BigNumber('1000000000') const BIG_NUMBER_ETH_MULTIPLIER = new BigNumber('1') -// Individual Setters -const convert = R.invoker(1, 'times') -const round = R.invoker(2, 'round')(R.__, BigNumber.ROUND_HALF_DOWN) -const roundDown = R.invoker(2, 'round')(R.__, BigNumber.ROUND_DOWN) -const invertConversionRate = conversionRate => () => new BigNumber(1.0).div(conversionRate) -const decToBigNumberViaString = () => R.pipe(String, toBigNumber['dec']) - // Setter Maps const toBigNumber = { - hex: n => new BigNumber(stripHexPrefix(n), 16), - dec: n => new BigNumber(String(n), 10), - BN: n => new BigNumber(n.toString(16), 16), + hex: (n) => new BigNumber(stripHexPrefix(n), 16), + dec: (n) => new BigNumber(String(n), 10), + BN: (n) => new BigNumber(n.toString(16), 16), } const toNormalizedDenomination = { - WEI: bigNumber => bigNumber.div(BIG_NUMBER_WEI_MULTIPLIER), - GWEI: bigNumber => bigNumber.div(BIG_NUMBER_GWEI_MULTIPLIER), - ETH: bigNumber => bigNumber.div(BIG_NUMBER_ETH_MULTIPLIER), + WEI: (bigNumber) => bigNumber.div(BIG_NUMBER_WEI_MULTIPLIER), + GWEI: (bigNumber) => bigNumber.div(BIG_NUMBER_GWEI_MULTIPLIER), + ETH: (bigNumber) => bigNumber.div(BIG_NUMBER_ETH_MULTIPLIER), } const toSpecifiedDenomination = { - WEI: bigNumber => bigNumber.times(BIG_NUMBER_WEI_MULTIPLIER).round(), - GWEI: bigNumber => bigNumber.times(BIG_NUMBER_GWEI_MULTIPLIER).round(9), - ETH: bigNumber => bigNumber.times(BIG_NUMBER_ETH_MULTIPLIER).round(9), + WEI: (bigNumber) => bigNumber.times(BIG_NUMBER_WEI_MULTIPLIER).round(), + GWEI: (bigNumber) => bigNumber.times(BIG_NUMBER_GWEI_MULTIPLIER).round(9), + ETH: (bigNumber) => bigNumber.times(BIG_NUMBER_ETH_MULTIPLIER).round(9), } const baseChange = { - hex: n => n.toString(16), - dec: n => (new BigNumber(n)).toString(10), - BN: n => new BN(n.toString(16)), + hex: (n) => n.toString(16), + dec: (n) => (new BigNumber(n)).toString(10), + BN: (n) => new BN(n.toString(16)), } -// Predicates -const fromAndToCurrencyPropsNotEqual = R.compose( - R.not, - R.eqBy(R.__, 'fromCurrency', 'toCurrency'), - R.flip(R.prop) -) - -// Lens -const valuePropertyLens = R.over(R.lensProp('value')) -const conversionRateLens = R.over(R.lensProp('conversionRate')) - -// conditional conversionRate setting wrapper -const whenPredSetCRWithPropAndSetter = (pred, prop, setter) => R.when( - pred, - R.converge( - conversionRateLens, - [R.pipe(R.prop(prop), setter), R.identity] - ) -) - -// conditional 'value' setting wrappers -const whenPredSetWithPropAndSetter = (pred, prop, setter) => R.when( - pred, - R.converge( - valuePropertyLens, - [R.pipe(R.prop(prop), setter), R.identity] - ) -) -const whenPropApplySetterMap = (prop, setterMap) => whenPredSetWithPropAndSetter( - R.prop(prop), - prop, - R.prop(R.__, setterMap) -) - -// Conversion utility function -const converter = R.pipe( - whenPredSetCRWithPropAndSetter(R.prop('conversionRate'), 'conversionRate', decToBigNumberViaString), - whenPredSetCRWithPropAndSetter(R.prop('invertConversionRate'), 'conversionRate', invertConversionRate), - whenPropApplySetterMap('fromNumericBase', toBigNumber), - whenPropApplySetterMap('fromDenomination', toNormalizedDenomination), - whenPredSetWithPropAndSetter(fromAndToCurrencyPropsNotEqual, 'conversionRate', convert), - whenPropApplySetterMap('toDenomination', toSpecifiedDenomination), - whenPredSetWithPropAndSetter(R.prop('numberOfDecimals'), 'numberOfDecimals', round), - whenPredSetWithPropAndSetter(R.prop('roundDown'), 'roundDown', roundDown), - whenPropApplySetterMap('toNumericBase', baseChange), - R.view(R.lensProp('value')) -) +/** + * Defines the base type of numeric value + * @typedef {('hex' | 'dec' | 'BN')} NumericBase + */ + +/** + * Defines which type of denomination a value is in + * @typedef {('WEI' | 'GWEI' | 'ETH')} EthDenomination + */ + +/** + * Utility method to convert a value between denominations, formats and currencies. + * @param {Object} input + * @param {string | BigNumber} input.value + * @param {NumericBase} input.fromNumericBase + * @param {EthDenomination} [input.fromDenomination] + * @param {string} [input.fromCurrency] + * @param {NumericBase} input.toNumericBase + * @param {EthDenomination} [input.toDenomination] + * @param {string} [input.toCurrency] + * @param {number} [input.numberOfDecimals] + * @param {number} [input.conversionRate] + * @param {boolean} [input.invertConversionRate] + * @param {string} [input.roundDown] + */ +const converter = ({ + value, + fromNumericBase, + fromDenomination, + fromCurrency, + toNumericBase, + toDenomination, + toCurrency, + numberOfDecimals, + conversionRate, + invertConversionRate, + roundDown, +}) => { + let convertedValue = fromNumericBase ? toBigNumber[fromNumericBase](value) : value + + if (fromDenomination) { + convertedValue = toNormalizedDenomination[fromDenomination](convertedValue) + } + + if (fromCurrency !== toCurrency) { + if (conversionRate === null || conversionRate === undefined) { + throw new Error(`Converting from ${fromCurrency} to ${toCurrency} requires a conversionRate, but one was not provided`) + } + let rate = toBigNumber.dec(conversionRate) + if (invertConversionRate) { + rate = new BigNumber(1.0).div(conversionRate) + } + convertedValue = convertedValue.times(rate) + } + + if (toDenomination) { + convertedValue = toSpecifiedDenomination[toDenomination](convertedValue) + } + + if (numberOfDecimals) { + convertedValue = convertedValue.round(numberOfDecimals, BigNumber.ROUND_HALF_DOWN) + } + + if (roundDown) { + convertedValue = convertedValue.round(roundDown, BigNumber.ROUND_DOWN) + } + + if (toNumericBase) { + convertedValue = baseChange[toNumericBase](convertedValue) + } + return convertedValue +} const conversionUtil = (value, { fromCurrency = null, @@ -209,7 +222,7 @@ const conversionMax = ( ) => { const firstIsGreater = conversionGreaterThan( { ...firstProps }, - { ...secondProps } + { ...secondProps }, ) return firstIsGreater ? firstProps.value : secondProps.value @@ -237,7 +250,7 @@ const toNegative = (n, options = {}) => { return multiplyCurrencies(n, -1, options) } -module.exports = { +export { conversionUtil, addCurrencies, multiplyCurrencies, diff --git a/ui/app/helpers/utils/conversion-util.test.js b/ui/app/helpers/utils/conversion-util.test.js index 368ce3bbaa04..9c570f95d304 100644 --- a/ui/app/helpers/utils/conversion-util.test.js +++ b/ui/app/helpers/utils/conversion-util.test.js @@ -1,22 +1,59 @@ import assert from 'assert' -import {addCurrencies} from './conversion-util' +import BigNumber from 'bignumber.js' +import { addCurrencies, conversionUtil } from './conversion-util' - -describe('conversion utils', () => { - describe('addCurrencies()', () => { - it('add whole numbers', () => { +describe('conversion utils', function () { + describe('addCurrencies()', function () { + it('add whole numbers', function () { const result = addCurrencies(3, 9) assert.equal(result.toNumber(), 12) }) - it('add decimals', () => { + it('add decimals', function () { const result = addCurrencies(1.3, 1.9) assert.equal(result.toNumber(), 3.2) }) - it('add repeating decimals', () => { + it('add repeating decimals', function () { const result = addCurrencies(1 / 3, 1 / 9) assert.equal(result.toNumber(), 0.4444444444444444) }) }) + + describe('conversionUtil', function () { + it('Returns expected types', function () { + const conv1 = conversionUtil(1000000000000000000, { fromNumericBase: 'dec', toNumericBase: 'hex' }) + const conv2 = conversionUtil(1, { fromNumericBase: 'dec', fromDenomination: 'ETH', toDenomination: 'WEI' }) + assert(typeof conv1 === 'string', 'conversion 1 should return type string') + assert(conv2 instanceof BigNumber, 'conversion 2 should be a BigNumber') + }) + it('Converts from dec to hex', function () { + assert.equal(conversionUtil('1000000000000000000', { fromNumericBase: 'dec', toNumericBase: 'hex' }), 'de0b6b3a7640000') + assert.equal(conversionUtil('1500000000000000000', { fromNumericBase: 'dec', toNumericBase: 'hex' }), '14d1120d7b160000') + }) + it('Converts hex formatted numbers to dec', function () { + assert.equal(conversionUtil('0xde0b6b3a7640000', { fromNumericBase: 'hex', toNumericBase: 'dec' }), 1000000000000000000) + assert.equal(conversionUtil('0x14d1120d7b160000', { fromNumericBase: 'hex', toNumericBase: 'dec' }), 1500000000000000000) + }) + it('Converts WEI to ETH', function () { + assert.equal(conversionUtil('0xde0b6b3a7640000', { fromNumericBase: 'hex', toNumericBase: 'dec', fromDenomination: 'WEI', toDenomination: 'ETH' }), 1) + assert.equal(conversionUtil('0x14d1120d7b160000', { fromNumericBase: 'hex', toNumericBase: 'dec', fromDenomination: 'WEI', toDenomination: 'ETH' }), 1.5) + }) + it('Converts ETH to WEI', function () { + assert.equal(conversionUtil('1', { fromNumericBase: 'dec', fromDenomination: 'ETH', toDenomination: 'WEI' }), 1000000000000000000) + assert.equal(conversionUtil('1.5', { fromNumericBase: 'dec', fromDenomination: 'ETH', toDenomination: 'WEI' }), 1500000000000000000) + }) + it('Converts ETH to GWEI', function () { + assert.equal(conversionUtil('1', { fromNumericBase: 'dec', fromDenomination: 'ETH', toDenomination: 'GWEI' }), 1000000000) + assert.equal(conversionUtil('1.5', { fromNumericBase: 'dec', fromDenomination: 'ETH', toDenomination: 'GWEI' }), 1500000000) + }) + it('Converts ETH to USD', function () { + assert.equal(conversionUtil('1', { fromNumericBase: 'dec', toNumericBase: 'dec', toCurrency: 'usd', conversionRate: 468.58, numberOfDecimals: 2 }), 468.58) + assert.equal(conversionUtil('1.5', { fromNumericBase: 'dec', toNumericBase: 'dec', toCurrency: 'usd', conversionRate: 468.58, numberOfDecimals: 2 }), 702.87) + }) + it('Converts USD to ETH', function () { + assert.equal(conversionUtil('468.58', { fromNumericBase: 'dec', toNumericBase: 'dec', toCurrency: 'usd', conversionRate: 468.58, numberOfDecimals: 2, invertConversionRate: true }), 1) + assert.equal(conversionUtil('702.87', { fromNumericBase: 'dec', toNumericBase: 'dec', toCurrency: 'usd', conversionRate: 468.58, numberOfDecimals: 2, invertConversionRate: true }), 1.5) + }) + }) }) diff --git a/ui/app/helpers/utils/conversions.util.js b/ui/app/helpers/utils/conversions.util.js index 5e1c21ff7cc9..0cde0d0acff7 100644 --- a/ui/app/helpers/utils/conversions.util.js +++ b/ui/app/helpers/utils/conversions.util.js @@ -129,3 +129,12 @@ export function hexWEIToDecGWEI (decGWEI) { toDenomination: 'GWEI', }) } + +export function decETHToDecWEI (decEth) { + return conversionUtil(decEth, { + fromNumericBase: 'dec', + toNumericBase: 'dec', + fromDenomination: 'ETH', + toDenomination: 'WEI', + }) +} diff --git a/ui/app/helpers/utils/conversions.util.test.js b/ui/app/helpers/utils/conversions.util.test.js new file mode 100644 index 000000000000..f4c08cc749f7 --- /dev/null +++ b/ui/app/helpers/utils/conversions.util.test.js @@ -0,0 +1,29 @@ +import assert from 'assert' +import * as utils from './conversions.util' + +describe('decETHToDecWEI', function () { + it('should correctly convert 1 ETH to WEI', function () { + const weiValue = utils.decETHToDecWEI('1') + assert.equal(weiValue, '1000000000000000000') + }) + + it('should correctly convert 0.000000000000000001 ETH to WEI', function () { + const weiValue = utils.decETHToDecWEI('0.000000000000000001') + assert.equal(weiValue, '1') + }) + + it('should correctly convert 1000000.000000000000000001 ETH to WEI', function () { + const weiValue = utils.decETHToDecWEI('1000000.000000000000000001') + assert.equal(weiValue, '1000000000000000000000001') + }) + + it('should correctly convert 9876.543210 ETH to WEI', function () { + const weiValue = utils.decETHToDecWEI('9876.543210') + assert.equal(weiValue, '9876543210000000000000') + }) + + it('should correctly convert 1.0000000000000000 ETH to WEI', function () { + const weiValue = utils.decETHToDecWEI('1.0000000000000000') + assert.equal(weiValue, '1000000000000000000') + }) +}) diff --git a/ui/app/helpers/utils/fetch-with-cache.js b/ui/app/helpers/utils/fetch-with-cache.js index ac641c3c4d09..470f2a8d6f02 100644 --- a/ui/app/helpers/utils/fetch-with-cache.js +++ b/ui/app/helpers/utils/fetch-with-cache.js @@ -2,27 +2,51 @@ import { loadLocalStorageData, saveLocalStorageData, } from '../../../lib/local-storage-helpers' -import http from './fetch' +import fetchWithTimeout from '../../../../app/scripts/lib/fetch-with-timeout' -const fetch = http({ - timeout: 30000, -}) +const fetchWithCache = async (url, fetchOptions = {}, { cacheRefreshTime = 360000, timeout = 30000 } = {}) => { + if (fetchOptions.body || (fetchOptions.method && fetchOptions.method !== 'GET')) { + throw new Error('fetchWithCache only supports GET requests') + } + if (!(fetchOptions.headers instanceof window.Headers)) { + fetchOptions.headers = new window.Headers(fetchOptions.headers) + } + if ( + fetchOptions.headers && + fetchOptions.headers.has('Content-Type') && + fetchOptions.headers.get('Content-Type') !== 'application/json' + ) { + throw new Error('fetchWithCache only supports JSON responses') + } -export default function fetchWithCache (url, opts, cacheRefreshTime = 360000) { const currentTime = Date.now() const cachedFetch = loadLocalStorageData('cachedFetch') || {} - const { cachedUrl, cachedTime } = cachedFetch[url] || {} - if (cachedUrl && currentTime - cachedTime < cacheRefreshTime) { - return cachedFetch[url] - } else { - cachedFetch[url] = { cachedUrl: url, cachedTime: currentTime } - saveLocalStorageData(cachedFetch, 'cachedFetch') - return fetch(url, { - referrerPolicy: 'no-referrer-when-downgrade', - body: null, - method: 'GET', - mode: 'cors', - ...opts, - }) + const { cachedResponse, cachedTime } = cachedFetch[url] || {} + if (cachedResponse && currentTime - cachedTime < cacheRefreshTime) { + return cachedResponse } + fetchOptions.headers.set('Content-Type', 'application/json') + const _fetch = timeout + ? fetchWithTimeout({ timeout }) + : window.fetch + const response = await _fetch(url, { + referrerPolicy: 'no-referrer-when-downgrade', + body: null, + method: 'GET', + mode: 'cors', + ...fetchOptions, + }) + if (!response.ok) { + throw new Error(`Fetch failed with status '${response.status}': '${response.statusText}'`) + } + const responseJson = await response.json() + const cacheEntry = { + cachedResponse: responseJson, + cachedTime: currentTime, + } + cachedFetch[url] = cacheEntry + saveLocalStorageData(cachedFetch, 'cachedFetch') + return responseJson } + +export default fetchWithCache diff --git a/ui/app/helpers/utils/fetch-with-cache.test.js b/ui/app/helpers/utils/fetch-with-cache.test.js new file mode 100644 index 000000000000..3c57c3794083 --- /dev/null +++ b/ui/app/helpers/utils/fetch-with-cache.test.js @@ -0,0 +1,120 @@ +import assert from 'assert' +import nock from 'nock' +import sinon from 'sinon' +import proxyquire from 'proxyquire' + +const fakeLocalStorageHelpers = {} +const fetchWithCache = proxyquire('./fetch-with-cache', { + '../../../lib/local-storage-helpers': fakeLocalStorageHelpers, +}).default + +describe('Fetch with cache', function () { + beforeEach(function () { + fakeLocalStorageHelpers.loadLocalStorageData = sinon.stub() + fakeLocalStorageHelpers.saveLocalStorageData = sinon.stub() + }) + afterEach(function () { + sinon.restore() + nock.cleanAll() + }) + + it('fetches a url', async function () { + nock('https://fetchwithcache.metamask.io') + .get('/price') + .reply(200, '{"average": 1}') + + const response = await fetchWithCache('https://fetchwithcache.metamask.io/price') + assert.deepEqual(response, { + average: 1, + }) + }) + + it('returns cached response', async function () { + nock('https://fetchwithcache.metamask.io') + .get('/price') + .reply(200, '{"average": 2}') + + fakeLocalStorageHelpers.loadLocalStorageData.returns({ + 'https://fetchwithcache.metamask.io/price': { + cachedResponse: { average: 1 }, + cachedTime: Date.now(), + }, + }) + + const response = await fetchWithCache('https://fetchwithcache.metamask.io/price') + assert.deepEqual(response, { + average: 1, + }) + }) + + it('fetches URL again after cache refresh time has passed', async function () { + nock('https://fetchwithcache.metamask.io') + .get('/price') + .reply(200, '{"average": 3}') + + fakeLocalStorageHelpers.loadLocalStorageData.returns({ + 'https://fetchwithcache.metamask.io/cached': { + cachedResponse: { average: 1 }, + cachedTime: Date.now() - 1000, + }, + }) + + const response = await fetchWithCache('https://fetchwithcache.metamask.io/price', {}, { cacheRefreshTime: 123 }) + assert.deepEqual(response, { + average: 3, + }) + }) + + it('should abort the request when the custom timeout is hit', async function () { + nock('https://fetchwithcache.metamask.io') + .get('/price') + .delay(100) + .reply(200, '{"average": 4}') + + await assert.rejects( + () => fetchWithCache('https://fetchwithcache.metamask.io/price', {}, { timeout: 20 }), + { name: 'AbortError', message: 'Aborted' }, + ) + }) + + it('throws when the response is unsuccessful', async function () { + nock('https://fetchwithcache.metamask.io') + .get('/price') + .reply(500, '{"average": 6}') + + await assert.rejects( + () => fetchWithCache('https://fetchwithcache.metamask.io/price'), + ) + }) + + it('throws when a POST request is attempted', async function () { + nock('https://fetchwithcache.metamask.io') + .post('/price') + .reply(200, '{"average": 7}') + + await assert.rejects( + () => fetchWithCache('https://fetchwithcache.metamask.io/price', { method: 'POST' }), + ) + }) + + it('throws when the request has a truthy body', async function () { + nock('https://fetchwithcache.metamask.io') + .get('/price') + .reply(200, '{"average": 8}') + + await assert.rejects( + () => fetchWithCache('https://fetchwithcache.metamask.io/price', { body: 1 }), + ) + }) + + it('throws when the request has an invalid Content-Type header', async function () { + nock('https://fetchwithcache.metamask.io') + .get('/price') + .reply(200, '{"average": 9}') + + await assert.rejects( + () => fetchWithCache('https://fetchwithcache.metamask.io/price', { headers: { 'Content-Type': 'text/plain' } }), + { message: 'fetchWithCache only supports JSON responses' }, + ) + }) +}) diff --git a/ui/app/helpers/utils/fetch.js b/ui/app/helpers/utils/fetch.js deleted file mode 100644 index 7bb483818d2e..000000000000 --- a/ui/app/helpers/utils/fetch.js +++ /dev/null @@ -1,25 +0,0 @@ -/* global AbortController */ - -export default function ({ timeout = 120000 } = {}) { - return function _fetch (url, opts) { - return new Promise(async (resolve, reject) => { - const abortController = new AbortController() - const abortSignal = abortController.signal - const f = fetch(url, { - ...opts, - signal: abortSignal, - }) - - const timer = setTimeout(() => abortController.abort(), timeout) - - try { - const res = await f - clearTimeout(timer) - return resolve(res) - } catch (e) { - clearTimeout(timer) - return reject(e) - } - }) - } -} diff --git a/ui/app/helpers/utils/fetch.test.js b/ui/app/helpers/utils/fetch.test.js deleted file mode 100644 index 12724525a2b7..000000000000 --- a/ui/app/helpers/utils/fetch.test.js +++ /dev/null @@ -1,54 +0,0 @@ -import assert from 'assert' -import nock from 'nock' - -import http from './fetch' - -describe('custom fetch fn', () => { - it('fetches a url', async () => { - nock('https://api.infura.io') - .get('/money') - .reply(200, '{"hodl": false}') - - const fetch = http() - const response = await (await fetch('https://api.infura.io/money')).json() - assert.deepEqual(response, { - hodl: false, - }) - }) - - it('throws when the request hits a custom timeout', async () => { - nock('https://api.infura.io') - .get('/moon') - .delay(2000) - .reply(200, '{"moon": "2012-12-21T11:11:11Z"}') - - const fetch = http({ - timeout: 123, - }) - - try { - await fetch('https://api.infura.io/moon').then(r => r.json()) - assert.fail('Request should throw') - } catch (e) { - assert.ok(e) - } - }) - - it('should abort the request when the custom timeout is hit', async () => { - nock('https://api.infura.io') - .get('/moon') - .delay(2000) - .reply(200, '{"moon": "2012-12-21T11:11:11Z"}') - - const fetch = http({ - timeout: 123, - }) - - try { - await fetch('https://api.infura.io/moon').then(r => r.json()) - assert.fail('Request should be aborted') - } catch (e) { - assert.deepEqual(e.message, 'Aborted') - } - }) -}) diff --git a/ui/app/helpers/utils/formatters.js b/ui/app/helpers/utils/formatters.js index 106a2520dfb2..d722ef09b26b 100644 --- a/ui/app/helpers/utils/formatters.js +++ b/ui/app/helpers/utils/formatters.js @@ -1,3 +1,3 @@ export function formatETHFee (ethFee) { - return ethFee + ' ETH' + return `${ethFee} ETH` } diff --git a/ui/app/helpers/utils/gas-time-estimates.util.js b/ui/app/helpers/utils/gas-time-estimates.util.js new file mode 100644 index 000000000000..5aadacf3a224 --- /dev/null +++ b/ui/app/helpers/utils/gas-time-estimates.util.js @@ -0,0 +1,99 @@ +import BigNumber from 'bignumber.js' + +export function newBigSigDig (n) { + return new BigNumber((new BigNumber(String(n))).toPrecision(15)) +} + +const createOp = (a, b, op) => (newBigSigDig(a))[op](newBigSigDig(b)) + +export function bigNumMinus (a = 0, b = 0) { + return createOp(a, b, 'minus') +} + +export function bigNumDiv (a = 0, b = 1) { + return createOp(a, b, 'div') +} + +export function extrapolateY ({ higherY = 0, lowerY = 0, higherX = 0, lowerX = 0, xForExtrapolation = 0 }) { + const slope = bigNumMinus(higherY, lowerY).div(bigNumMinus(higherX, lowerX)) + const newTimeEstimate = slope.times(bigNumMinus(higherX, xForExtrapolation)).minus(newBigSigDig(higherY)).negated() + + return newTimeEstimate.toNumber() +} + +export function getAdjacentGasPrices ({ gasPrices, priceToPosition }) { + const closestLowerValueIndex = gasPrices.findIndex((e, i, a) => e <= priceToPosition && a[i + 1] >= priceToPosition) + const closestHigherValueIndex = gasPrices.findIndex((e) => e > priceToPosition) + return { + closestLowerValueIndex, + closestHigherValueIndex, + closestHigherValue: gasPrices[closestHigherValueIndex], + closestLowerValue: gasPrices[closestLowerValueIndex], + } +} + +export function formatTimeEstimate (totalSeconds, greaterThanMax, lessThanMin) { + const minutes = Math.floor(totalSeconds / 60) + const seconds = Math.floor(totalSeconds % 60) + + if (!minutes && !seconds) { + return '...' + } + + let symbol = '~' + if (greaterThanMax) { + symbol = '< ' + } else if (lessThanMin) { + symbol = '> ' + } + + const formattedMin = `${minutes ? `${minutes} min` : ''}` + const formattedSec = `${seconds ? `${seconds} sec` : ''}` + const formattedCombined = formattedMin && formattedSec + ? `${symbol}${formattedMin} ${formattedSec}` + : symbol + (formattedMin || formattedSec) + + return formattedCombined +} + +export function getRawTimeEstimateData (currentGasPrice, gasPrices, estimatedTimes) { + const minGasPrice = gasPrices[0] + const maxGasPrice = gasPrices[gasPrices.length - 1] + let priceForEstimation = currentGasPrice + if (currentGasPrice < minGasPrice) { + priceForEstimation = minGasPrice + } else if (currentGasPrice > maxGasPrice) { + priceForEstimation = maxGasPrice + } + + const { + closestLowerValueIndex, + closestHigherValueIndex, + closestHigherValue, + closestLowerValue, + } = getAdjacentGasPrices({ gasPrices, priceToPosition: priceForEstimation }) + + const newTimeEstimate = extrapolateY({ + higherY: estimatedTimes[closestHigherValueIndex], + lowerY: estimatedTimes[closestLowerValueIndex], + higherX: closestHigherValue, + lowerX: closestLowerValue, + xForExtrapolation: priceForEstimation, + }) + + return { + newTimeEstimate, + minGasPrice, + maxGasPrice, + } +} + +export function getRenderableTimeEstimate (currentGasPrice, gasPrices, estimatedTimes) { + const { + newTimeEstimate, + minGasPrice, + maxGasPrice, + } = getRawTimeEstimateData(currentGasPrice, gasPrices, estimatedTimes) + + return formatTimeEstimate(newTimeEstimate, currentGasPrice > maxGasPrice, currentGasPrice < minGasPrice) +} diff --git a/ui/app/helpers/utils/i18n-helper.js b/ui/app/helpers/utils/i18n-helper.js index db07049e165c..198e025d5b84 100644 --- a/ui/app/helpers/utils/i18n-helper.js +++ b/ui/app/helpers/utils/i18n-helper.js @@ -1,44 +1,109 @@ // cross-browser connection to extension i18n API -const log = require('loglevel') +import React from 'react' +import log from 'loglevel' + +import * as Sentry from '@sentry/browser' + +const warned = {} +const missingMessageErrors = {} +const missingSubstitutionErrors = {} /** * Returns a localized message for the given key - * @param {object} locale The locale - * @param {string} key The message key - * @param {string[]} substitutions A list of message substitution replacements - * @return {null|string} The localized message + * @param {string} localeCode - The code for the current locale + * @param {Object} localeMessages - The map of messages for the current locale + * @param {string} key - The message key + * @param {string[]} substitutions - A list of message substitution replacements + * @returns {null|string} - The localized message */ -const getMessage = (locale, key, substitutions) => { - if (!locale) { +export const getMessage = (localeCode, localeMessages, key, substitutions) => { + if (!localeMessages) { return null } - if (!locale[key]) { - log.warn(`Translator - Unable to find value for key "${key}"`) + if (!localeMessages[key]) { + if (localeCode === 'en') { + if (!missingMessageErrors[key]) { + missingMessageErrors[key] = new Error(`Unable to find value of key "${key}" for locale "${localeCode}"`) + Sentry.captureException(missingMessageErrors[key]) + log.error(missingMessageErrors[key]) + if (process.env.IN_TEST === 'true') { + throw missingMessageErrors[key] + } + } + } else if (!warned[localeCode] || !warned[localeCode][key]) { + if (!warned[localeCode]) { + warned[localeCode] = {} + } + warned[localeCode][key] = true + log.warn(`Translator - Unable to find value of key "${key}" for locale "${localeCode}"`) + } return null } - const entry = locale[key] + const entry = localeMessages[key] let phrase = entry.message + + const hasSubstitutions = Boolean(substitutions && substitutions.length) + const hasReactSubstitutions = hasSubstitutions && + substitutions.some((element) => element !== null && (typeof element === 'function' || typeof element === 'object')) + // perform substitutions - if (substitutions && substitutions.length) { - substitutions.forEach((substitution, index) => { - const regex = new RegExp(`\\$${index + 1}`, 'g') - phrase = phrase.replace(regex, substitution) + if (hasSubstitutions) { + const parts = phrase.split(/(\$\d)/ug) + + const substitutedParts = parts.map((part) => { + const subMatch = part.match(/\$(\d)/u) + if (!subMatch) { + return part + } + const substituteIndex = Number(subMatch[1]) - 1 + if ( + (substitutions[substituteIndex] === null || substitutions[substituteIndex] === undefined) && + !missingSubstitutionErrors[localeCode]?.[key] + ) { + if (!missingSubstitutionErrors[localeCode]) { + missingSubstitutionErrors[localeCode] = {} + } + missingSubstitutionErrors[localeCode][key] = true + const error = new Error(`Insufficient number of substitutions for message: '${phrase}'`) + log.error(error) + Sentry.captureException(error) + } + return substitutions[substituteIndex] }) + + phrase = hasReactSubstitutions + ? { substitutedParts } + : substitutedParts.join('') } + return phrase } -async function fetchLocale (localeName) { +export async function fetchLocale (localeCode) { try { - const response = await fetch(`./_locales/${localeName}/messages.json`) + const response = await window.fetch(`./_locales/${localeCode}/messages.json`) return await response.json() } catch (error) { - log.error(`failed to fetch ${localeName} locale because of ${error}`) + log.error(`failed to fetch ${localeCode} locale because of ${error}`) return {} } } -module.exports = { - getMessage, - fetchLocale, +const relativeTimeFormatLocaleData = new Set() + +export async function loadRelativeTimeFormatLocaleData (localeCode) { + const languageTag = localeCode.split('_')[0] + if ( + Intl.RelativeTimeFormat && + typeof Intl.RelativeTimeFormat.__addLocaleData === 'function' && + !relativeTimeFormatLocaleData.has(languageTag) + ) { + const localeData = await fetchRelativeTimeFormatData(languageTag) + Intl.RelativeTimeFormat.__addLocaleData(localeData) + } +} + +async function fetchRelativeTimeFormatData (languageTag) { + const response = await window.fetch(`./intl/${languageTag}/relative-time-format-data.json`) + return await response.json() } diff --git a/ui/app/helpers/utils/i18n-helper.test.js b/ui/app/helpers/utils/i18n-helper.test.js new file mode 100644 index 000000000000..4e41f8c2003f --- /dev/null +++ b/ui/app/helpers/utils/i18n-helper.test.js @@ -0,0 +1,160 @@ +import assert from 'assert' +import React from 'react' +import { shallow } from 'enzyme' +import { getMessage } from './i18n-helper' + +describe('i18n helper', function () { + const TEST_LOCALE_CODE = 'TEST_LOCALE_CODE' + + const TEST_KEY_1 = 'TEST_KEY_1' + const TEST_KEY_2 = 'TEST_KEY_2' + const TEST_KEY_3 = 'TEST_KEY_3' + const TEST_KEY_4 = 'TEST_KEY_4' + const TEST_KEY_5 = 'TEST_KEY_5' + const TEST_KEY_6 = 'TEST_KEY_6' + const TEST_KEY_6_HELPER = 'TEST_KEY_6_HELPER' + const TEST_KEY_7 = 'TEST_KEY_7' + const TEST_KEY_7_HELPER_1 = 'TEST_KEY_7_HELPER_1' + const TEST_KEY_7_HELPER_2 = 'TEST_KEY_7_HELPER_2' + const TEST_KEY_8 = 'TEST_KEY_8' + const TEST_KEY_8_HELPER_1 = 'TEST_KEY_8_HELPER_1' + const TEST_KEY_8_HELPER_2 = 'TEST_KEY_8_HELPER_2' + + const TEST_SUBSTITUTION_1 = 'TEST_SUBSTITUTION_1' + const TEST_SUBSTITUTION_2 = 'TEST_SUBSTITUTION_2' + const TEST_SUBSTITUTION_3 = 'TEST_SUBSTITUTION_3' + const TEST_SUBSTITUTION_4 = 'TEST_SUBSTITUTION_4' + const TEST_SUBSTITUTION_5 = 'TEST_SUBSTITUTION_5' + + const testLocaleMessages = { + [TEST_KEY_1]: { + message: 'This is a simple message.', + expectedResult: 'This is a simple message.', + }, + [TEST_KEY_2]: { + message: 'This is a message with a single non-react substitution $1.', + }, + [TEST_KEY_3]: { + message: 'This is a message with two non-react substitutions $1 and $2.', + }, + [TEST_KEY_4]: { + message: '$1 - $2 - $3 - $4 - $5', + }, + [TEST_KEY_5]: { + message: '$1 - $2 - $3', + }, + [TEST_KEY_6]: { + 'message': 'Testing a react substitution $1.', + }, + [TEST_KEY_6_HELPER]: { + 'message': TEST_SUBSTITUTION_1, + }, + [TEST_KEY_7]: { + 'message': 'Testing a react substitution $1 and another $2.', + }, + [TEST_KEY_7_HELPER_1]: { + 'message': TEST_SUBSTITUTION_1, + }, + [TEST_KEY_7_HELPER_2]: { + 'message': TEST_SUBSTITUTION_2, + }, + [TEST_KEY_8]: { + 'message': 'Testing a mix $1 of react substitutions $2 and string substitutions $3 + $4.', + }, + [TEST_KEY_8_HELPER_1]: { + 'message': TEST_SUBSTITUTION_3, + }, + [TEST_KEY_8_HELPER_2]: { + 'message': TEST_SUBSTITUTION_4, + }, + } + const t = getMessage.bind(null, TEST_LOCALE_CODE, testLocaleMessages) + + const TEST_SUBSTITUTION_6 = ( +
      + { t(TEST_KEY_6_HELPER) } +
      + ) + const TEST_SUBSTITUTION_7_1 = ( +
      + { t(TEST_KEY_7_HELPER_1) } +
      + ) + const TEST_SUBSTITUTION_7_2 = ( +
      + { t(TEST_KEY_7_HELPER_2) } +
      + ) + const TEST_SUBSTITUTION_8_1 = ( +
      + { t(TEST_KEY_8_HELPER_1) } +
      + ) + const TEST_SUBSTITUTION_8_2 = ( +
      + { t(TEST_KEY_8_HELPER_2) } +
      + ) + + describe('getMessage', function () { + it('should return the exact message paired with key if there are no substitutions', function () { + const result = t(TEST_KEY_1) + assert.equal(result, 'This is a simple message.') + }) + + it('should return the correct message when a single non-react substitution is made', function () { + const result = t(TEST_KEY_2, [TEST_SUBSTITUTION_1]) + assert.equal(result, `This is a message with a single non-react substitution ${TEST_SUBSTITUTION_1}.`) + }) + + it('should return the correct message when two non-react substitutions are made', function () { + const result = t(TEST_KEY_3, [TEST_SUBSTITUTION_1, TEST_SUBSTITUTION_2]) + assert.equal(result, `This is a message with two non-react substitutions ${TEST_SUBSTITUTION_1} and ${TEST_SUBSTITUTION_2}.`) + }) + + it('should return the correct message when multiple non-react substitutions are made', function () { + const result = t(TEST_KEY_4, [TEST_SUBSTITUTION_1, TEST_SUBSTITUTION_2, TEST_SUBSTITUTION_3, TEST_SUBSTITUTION_4, TEST_SUBSTITUTION_5]) + assert.equal(result, `${TEST_SUBSTITUTION_1} - ${TEST_SUBSTITUTION_2} - ${TEST_SUBSTITUTION_3} - ${TEST_SUBSTITUTION_4} - ${TEST_SUBSTITUTION_5}`) + }) + + it('should correctly render falsey substitutions', function () { + const result = t(TEST_KEY_4, [0, -0, '', false, NaN]) + assert.equal(result, '0 - 0 - - false - NaN') + }) + + it('should render nothing for "null" and "undefined" substitutions', function () { + const result = t(TEST_KEY_5, [null, TEST_SUBSTITUTION_2]) + assert.equal(result, ` - ${TEST_SUBSTITUTION_2} - `) + }) + + it('should return the correct message when a single react substitution is made', function () { + const result = t(TEST_KEY_6, [TEST_SUBSTITUTION_6]) + assert.equal(shallow(result).html(), ' Testing a react substitution
      TEST_SUBSTITUTION_1
      .
      ') + }) + + it('should return the correct message when two react substitutions are made', function () { + const result = t(TEST_KEY_7, [TEST_SUBSTITUTION_7_1, TEST_SUBSTITUTION_7_2]) + assert.equal(shallow(result).html(), ' Testing a react substitution
      TEST_SUBSTITUTION_1
      and another
      TEST_SUBSTITUTION_2
      .
      ') + }) + + it('should return the correct message when substituting a mix of react elements and strings', function () { + const result = t(TEST_KEY_8, [TEST_SUBSTITUTION_1, TEST_SUBSTITUTION_8_1, TEST_SUBSTITUTION_2, TEST_SUBSTITUTION_8_2]) + assert.equal(shallow(result).html(), ' Testing a mix TEST_SUBSTITUTION_1 of react substitutions
      TEST_SUBSTITUTION_3
      and string substitutions TEST_SUBSTITUTION_2 +
      TEST_SUBSTITUTION_4
      .
      ') + }) + }) +}) diff --git a/ui/app/helpers/utils/metametrics.util.js b/ui/app/helpers/utils/metametrics.util.js index 50270c6a8cbf..41a4bb22d73e 100644 --- a/ui/app/helpers/utils/metametrics.util.js +++ b/ui/app/helpers/utils/metametrics.util.js @@ -1,11 +1,16 @@ /* eslint camelcase: 0 */ -const ethUtil = require('ethereumjs-util') +import ethUtil from 'ethereumjs-util' -const inDevelopment = process.env.NODE_ENV === 'development' +const inDevelopment = process.env.METAMASK_DEBUG || process.env.IN_TEST + +let projectId = process.env.METAMETRICS_PROJECT_ID +if (!projectId) { + projectId = inDevelopment ? 1 : 2 +} const METAMETRICS_BASE_URL = 'https://chromeextensionmm.innocraft.cloud/piwik.php' -const METAMETRICS_REQUIRED_PARAMS = `?idsite=${inDevelopment ? 1 : 2}&rec=1&apiv=1` +const METAMETRICS_REQUIRED_PARAMS = `?idsite=${projectId}&rec=1&apiv=1` const METAMETRICS_BASE_FULL = METAMETRICS_BASE_URL + METAMETRICS_REQUIRED_PARAMS const METAMETRICS_TRACKING_URL = inDevelopment @@ -13,12 +18,12 @@ const METAMETRICS_TRACKING_URL = inDevelopment : 'http://www.metamask.io/metametrics-prod' /** ***************Custom variables*************** **/ -// Custon variable declarations +// Custom variable declarations const METAMETRICS_CUSTOM_GAS_LIMIT_CHANGE = 'gasLimitChange' const METAMETRICS_CUSTOM_GAS_PRICE_CHANGE = 'gasPriceChange' const METAMETRICS_CUSTOM_FUNCTION_TYPE = 'functionType' const METAMETRICS_CUSTOM_RECIPIENT_KNOWN = 'recipientKnown' -const METAMETRICS_CUSTOM_CONFIRM_SCREEN_ORIGIN = 'origin' +const METAMETRICS_REQUEST_ORIGIN = 'origin' const METAMETRICS_CUSTOM_FROM_NETWORK = 'fromNetwork' const METAMETRICS_CUSTOM_TO_NETWORK = 'toNetwork' const METAMETRICS_CUSTOM_ERROR_FIELD = 'errorField' @@ -31,7 +36,7 @@ const METAMETRICS_CUSTOM_ASSET_SELECTED = 'assetSelected' const customVariableNameIdMap = { [METAMETRICS_CUSTOM_FUNCTION_TYPE]: 1, [METAMETRICS_CUSTOM_RECIPIENT_KNOWN]: 2, - [METAMETRICS_CUSTOM_CONFIRM_SCREEN_ORIGIN]: 3, + [METAMETRICS_REQUEST_ORIGIN]: 3, [METAMETRICS_CUSTOM_GAS_LIMIT_CHANGE]: 4, [METAMETRICS_CUSTOM_GAS_PRICE_CHANGE]: 5, @@ -47,28 +52,30 @@ const customVariableNameIdMap = { [METAMETRICS_CUSTOM_GAS_CHANGED]: 1, [METAMETRICS_CUSTOM_ASSET_SELECTED]: 2, } + /** ********************************************************** **/ const METAMETRICS_CUSTOM_NETWORK = 'network' const METAMETRICS_CUSTOM_ENVIRONMENT_TYPE = 'environmentType' const METAMETRICS_CUSTOM_ACTIVE_CURRENCY = 'activeCurrency' const METAMETRICS_CUSTOM_ACCOUNT_TYPE = 'accountType' -const METAMETRICS_CUSTOM_NUMBER_OF_TOKENS = 'numberOfTokens' const METAMETRICS_CUSTOM_NUMBER_OF_ACCOUNTS = 'numberOfAccounts' - +const METAMETRICS_CUSTOM_NUMBER_OF_TOKENS = 'numberOfTokens' +const METAMETRICS_CUSTOM_VERSION = 'version' const customDimensionsNameIdMap = { [METAMETRICS_CUSTOM_NETWORK]: 5, [METAMETRICS_CUSTOM_ENVIRONMENT_TYPE]: 6, [METAMETRICS_CUSTOM_ACTIVE_CURRENCY]: 7, [METAMETRICS_CUSTOM_ACCOUNT_TYPE]: 8, - [METAMETRICS_CUSTOM_NUMBER_OF_TOKENS]: 9, - [METAMETRICS_CUSTOM_NUMBER_OF_ACCOUNTS]: 10, + [METAMETRICS_CUSTOM_NUMBER_OF_ACCOUNTS]: 9, + [METAMETRICS_CUSTOM_NUMBER_OF_TOKENS]: 10, + [METAMETRICS_CUSTOM_VERSION]: 11, } function composeUrlRefParamAddition (previousPath, confirmTransactionOrigin) { - const externalOrigin = confirmTransactionOrigin && confirmTransactionOrigin !== 'MetaMask' - return `&urlref=${externalOrigin ? 'EXTERNAL' : encodeURIComponent(previousPath.replace(/chrome-extension:\/\/\w+/, METAMETRICS_TRACKING_URL))}` + const externalOrigin = confirmTransactionOrigin && confirmTransactionOrigin !== 'metamask' + return `&urlref=${externalOrigin ? 'EXTERNAL' : encodeURIComponent(`${METAMETRICS_TRACKING_URL}${previousPath}`)}` } // composes query params of the form &dimension[0-999]=[value] @@ -109,14 +116,14 @@ function composeParamAddition (paramValue, paramName) { * @property {string} config.accountType The account type being used at the time of the event: 'hardware', 'imported' or 'default' * @property {number} config.numberOfTokens The number of tokens that the user has added at the time of the event * @property {number} config.numberOfAccounts The number of accounts the user has added at the time of the event - * @property {string} config.previousPath The location path the user was on prior to the path they are on at the time of the event - * @property {string} config.currentPath The location path the user is on at the time of the event + * @property {string} config.version The current version of the MetaMask extension + * @property {string} config.previousPath The pathname of the URL the user was on prior to the URL they are on at the time of the event + * @property {string} config.currentPath The pathname of the URL the user is on at the time of the event * @property {string} config.metaMetricsId A random id assigned to a user at the time of opting in to metametrics. A hexadecimal number * @property {string} config.confirmTransactionOrigin The origin on a transaction - * @property {string} config.url The url to track an event at. Overrides `currentPath` * @property {boolean} config.excludeMetaMetricsId Whether or not the tracked event data should be associated with a metametrics id * @property {boolean} config.isNewVisit Whether or not the event should be tracked as a new visit/user sessions - * @returns {String} Returns a url to be passed to fetch to make the appropriate request to matomo. + * @returns {string} - Returns a url to be passed to fetch to make the appropriate request to matomo. * Example: https://chromeextensionmm.innocraft.cloud/piwik.php?idsite=1&rec=1&apiv=1&e_c=Navigation&e_a=Home&e_n=Clicked%20Send:%20Eth&urlref=http%3A%2F%2Fwww.metamask.io%2Fmetametrics%2Fhome.html%23send&dimension5=3&dimension6=fullscreen&dimension7=ETH&dimension8=default&dimension9=0&dimension10=3&url=http%3A%2F%2Fwww.metamask.io%2Fmetametrics%2Fhome.html%23&_id=49c10aff19795e9a&rand=7906028754863992&pv_id=53acad&uid=49c1 */ function composeUrl (config) { @@ -130,11 +137,11 @@ function composeUrl (config) { accountType, numberOfTokens, numberOfAccounts, + version, previousPath = '', currentPath, metaMetricsId, confirmTransactionOrigin, - url: configUrl, excludeMetaMetricsId, isNewVisit, } = config @@ -145,35 +152,42 @@ function composeUrl (config) { const e_n = composeParamAddition(eventOpts.name, 'e_n') const new_visit = isNewVisit ? `&new_visit=1` : '' - const cvar = customVariables && composeCustomVarParamAddition(customVariables) || '' + const cvar = (customVariables && composeCustomVarParamAddition(customVariables)) || '' const action_name = '' const urlref = previousPath && composeUrlRefParamAddition(previousPath, confirmTransactionOrigin) - const dimensions = !pageOpts.hideDimensions ? composeCustomDimensionParamAddition({ - network, - environmentType, - activeCurrency, - accountType, - numberOfTokens: customVariables && customVariables.numberOfTokens || numberOfTokens, - numberOfAccounts: customVariables && customVariables.numberOfAccounts || numberOfAccounts, - }) : '' - const url = configUrl || currentPath ? `&url=${encodeURIComponent(currentPath.replace(/chrome-extension:\/\/\w+/, METAMETRICS_TRACKING_URL))}` : '' + const dimensions = pageOpts.hideDimensions + ? '' + : ( + composeCustomDimensionParamAddition({ + network, + environmentType, + activeCurrency, + accountType, + version, + numberOfTokens: (customVariables && customVariables.numberOfTokens) || numberOfTokens, + numberOfAccounts: (customVariables && customVariables.numberOfAccounts) || numberOfAccounts, + }) + ) + const url = currentPath ? `&url=${encodeURIComponent(`${METAMETRICS_TRACKING_URL}${currentPath}`)}` : '' const _id = metaMetricsId && !excludeMetaMetricsId ? `&_id=${metaMetricsId.slice(2, 18)}` : '' const rand = `&rand=${String(Math.random()).slice(2)}` - const pv_id = (url || currentPath) && `&pv_id=${ethUtil.bufferToHex(ethUtil.sha3(url || currentPath.match(/chrome-extension:\/\/\w+\/(.+)/)[0])).slice(2, 8)}` || '' - const uid = metaMetricsId && !excludeMetaMetricsId - ? `&uid=${metaMetricsId.slice(2, 18)}` - : excludeMetaMetricsId - ? '&uid=0000000000000000' - : '' - - return [ base, e_c, e_a, e_n, cvar, action_name, urlref, dimensions, url, _id, rand, pv_id, uid, new_visit ].join('') + const pv_id = currentPath ? `&pv_id=${ethUtil.bufferToHex(ethUtil.sha3(currentPath)).slice(2, 8)}` : '' + + let uid = '' + if (excludeMetaMetricsId) { + uid = '&uid=0000000000000000' + } else if (metaMetricsId) { + uid = `&uid=${metaMetricsId.slice(2, 18)}` + } + + return [base, e_c, e_a, e_n, cvar, action_name, urlref, dimensions, url, _id, rand, pv_id, uid, new_visit].join('') } -export function sendMetaMetricsEvent (config, permissionPreferences) { - return fetch(composeUrl(config, permissionPreferences), { +export function sendMetaMetricsEvent (config) { + return window.fetch(composeUrl(config), { 'headers': {}, 'method': 'GET', }) @@ -196,9 +210,8 @@ export function verifyUserPermission (config, props) { return true } else if (allowSendMetrics && eventOpts.name === 'send') { return true - } else { - return false } + return false } const trackableSendCounts = { diff --git a/ui/app/helpers/utils/switch-direction.js b/ui/app/helpers/utils/switch-direction.js new file mode 100644 index 000000000000..81170f43cbb7 --- /dev/null +++ b/ui/app/helpers/utils/switch-direction.js @@ -0,0 +1,34 @@ +/** + * Switch the CSS stylesheet used between 'rtl' and 'ltr' + * @param {('ltr' | 'rtl' | 'auto')} direction - Text direction, either left-to-right (ltr) or right-to-left (rtl) + * @return {Promise} + */ +const switchDirection = async (direction) => { + if (direction === 'auto') { + // eslint-disable-next-line no-param-reassign + direction = 'ltr' + } + let updatedLink + Array.from(document.getElementsByTagName('link')) + .filter((link) => link.rel === 'stylesheet') + .forEach((link) => { + if (link.title === direction && link.disabled) { + link.disabled = false + updatedLink = link + } else if (link.title !== direction && !link.disabled) { + link.disabled = true + } + }) + if (updatedLink) { + return new Promise((resolve, reject) => { + updatedLink.onload = () => { + resolve() + } + updatedLink.onerror = () => reject(new Error(`Failed to load '${direction}' stylesheet`)) + }) + } + + return undefined +} + +export default switchDirection diff --git a/ui/app/helpers/utils/token-util.js b/ui/app/helpers/utils/token-util.js index 3920045acde3..6d8516ba8abb 100644 --- a/ui/app/helpers/utils/token-util.js +++ b/ui/app/helpers/utils/token-util.js @@ -1,7 +1,9 @@ -const log = require('loglevel') -const util = require('./util') -const BigNumber = require('bignumber.js') +import log from 'loglevel' +import BigNumber from 'bignumber.js' import contractMap from 'eth-contract-metadata' +import * as util from './util' +import { conversionUtil, multiplyCurrencies } from './conversion-util' +import { formatCurrency } from './confirm-tx.util' const casedContractMap = Object.keys(contractMap).reduce((acc, base) => { return { @@ -21,6 +23,7 @@ async function getSymbolFromContract (tokenAddress) { return result[0] } catch (error) { log.warn(`symbol() call for token at address ${tokenAddress} resulted in error:`, error) + return undefined } } @@ -33,6 +36,7 @@ async function getDecimalsFromContract (tokenAddress) { return decimalsBN && decimalsBN.toString() } catch (error) { log.warn(`decimals() call for token at address ${tokenAddress} resulted in error:`, error) + return undefined } } @@ -128,12 +132,55 @@ export function calcTokenAmount (value, decimals) { return new BigNumber(String(value)).div(multiplier) } +export function calcTokenValue (value, decimals) { + const multiplier = Math.pow(10, Number(decimals || 0)) + return new BigNumber(String(value)).times(multiplier) +} + export function getTokenValue (tokenParams = []) { - const valueData = tokenParams.find(param => param.name === '_value') + const valueData = tokenParams.find((param) => param.name === '_value') return valueData && valueData.value } export function getTokenToAddress (tokenParams = []) { - const toAddressData = tokenParams.find(param => param.name === '_to') - return toAddressData && toAddressData.value + const toAddressData = tokenParams.find((param) => param.name === '_to') + return toAddressData ? toAddressData.value : tokenParams[0].value +} + +/** + * Get the token balance converted to fiat and formatted for display + * + * @param {number} [contractExchangeRate] - The exchange rate between the current token and the native currency + * @param {number} conversionRate - The exchange rate between the current fiat currency and the native currency + * @param {string} currentCurrency - The currency code for the user's chosen fiat currency + * @param {string} [tokenAmount] - The current token balance + * @param {string} [tokenSymbol] - The token symbol + * @returns {string|undefined} The formatted token amount in the user's chosen fiat currency + */ +export function getFormattedTokenFiatAmount ( + contractExchangeRate, + conversionRate, + currentCurrency, + tokenAmount, + tokenSymbol, +) { + // If the conversionRate is 0 (i.e. unknown) or the contract exchange rate + // is currently unknown, the fiat amount cannot be calculated so it is not + // shown to the user + if (conversionRate <= 0 || !contractExchangeRate || tokenAmount === undefined) { + return undefined + } + + const currentTokenToFiatRate = multiplyCurrencies( + contractExchangeRate, + conversionRate, + ) + const currentTokenInFiat = conversionUtil(tokenAmount, { + fromNumericBase: 'dec', + fromCurrency: tokenSymbol, + toCurrency: currentCurrency.toUpperCase(), + numberOfDecimals: 2, + conversionRate: currentTokenToFiatRate, + }) + return `${formatCurrency(currentTokenInFiat, currentCurrency)} ${currentCurrency.toUpperCase()}` } diff --git a/ui/app/helpers/utils/transactions.util.js b/ui/app/helpers/utils/transactions.util.js index b65bda5b2dd1..3c6481c80b1d 100644 --- a/ui/app/helpers/utils/transactions.util.js +++ b/ui/app/helpers/utils/transactions.util.js @@ -2,13 +2,13 @@ import ethUtil from 'ethereumjs-util' import MethodRegistry from 'eth-method-registry' import abi from 'human-standard-token-abi' import abiDecoder from 'abi-decoder' +import log from 'loglevel' import { TRANSACTION_TYPE_CANCEL, TRANSACTION_STATUS_CONFIRMED, } from '../../../../app/scripts/controllers/transactions/enums' -import prefixForNetwork from '../../../lib/etherscan-prefix-for-network' -import fetchWithCache from './fetch-with-cache' - +import { MESSAGE_TYPE } from '../../../../app/scripts/lib/enums' +import { getEtherscanNetworkPrefix } from '../../../lib/etherscan-prefix-for-network' import { TOKEN_METHOD_TRANSFER, TOKEN_METHOD_APPROVE, @@ -19,11 +19,14 @@ import { SEND_TOKEN_ACTION_KEY, TRANSFER_FROM_ACTION_KEY, SIGNATURE_REQUEST_KEY, + DECRYPT_REQUEST_KEY, + ENCRYPTION_PUBLIC_KEY_REQUEST_KEY, CONTRACT_INTERACTION_KEY, CANCEL_ATTEMPT_ACTION_KEY, + DEPOSIT_TRANSACTION_KEY, } from '../constants/transactions' +import fetchWithCache from './fetch-with-cache' -import log from 'loglevel' import { addCurrencies } from './conversion-util' abiDecoder.addABI(abi) @@ -40,16 +43,12 @@ async function getMethodFrom4Byte (fourBytePrefix) { mode: 'cors', })) - const fourByteJSON = await fourByteResponse.json() - - if (fourByteJSON.count === 1) { - return fourByteJSON.results[0].text_signature - } else { - return null + if (fourByteResponse.count === 1) { + return fourByteResponse.results[0].text_signature } + return null } - -const registry = new MethodRegistry({ provider: global.ethereumProvider }) +let registry /** * Attempts to return the method data from the MethodRegistry library, the message registry library and the token abi, in that order of preference @@ -63,6 +62,10 @@ export async function getMethodDataAsync (fourBytePrefix) { return null }) + if (!registry) { + registry = new MethodRegistry({ provider: global.ethereumProvider }) + } + let sig = await registry.lookup(fourBytePrefix) if (!sig) { @@ -124,11 +127,20 @@ export function isTokenMethodAction (transactionCategory) { export function getTransactionActionKey (transaction) { const { msgParams, type, transactionCategory } = transaction + if (transactionCategory === 'incoming') { + return DEPOSIT_TRANSACTION_KEY + } + if (type === 'cancel') { return CANCEL_ATTEMPT_ACTION_KEY } if (msgParams) { + if (type === MESSAGE_TYPE.ETH_DECRYPT) { + return DECRYPT_REQUEST_KEY + } else if (type === MESSAGE_TYPE.ETH_GET_ENCRYPTION_PUBLIC_KEY) { + return ENCRYPTION_PUBLIC_KEY_REQUEST_KEY + } return SIGNATURE_REQUEST_KEY } @@ -166,12 +178,12 @@ export function getLatestSubmittedTxWithNonce (transactions = [], nonce = '0x0') const { submittedTime, txParams: { nonce: currentNonce } = {} } = current if (currentNonce === nonce) { - return acc.submittedTime - ? submittedTime > acc.submittedTime ? current : acc - : current - } else { - return acc + if (!acc.submittedTime) { + return current + } + return submittedTime > acc.submittedTime ? current : acc } + return acc }, {}) } @@ -222,8 +234,8 @@ export function getStatusKey (transaction) { */ export function getBlockExplorerUrlForTx (networkId, hash, rpcPrefs = {}) { if (rpcPrefs.blockExplorerUrl) { - return `${rpcPrefs.blockExplorerUrl}/tx/${hash}` + return `${rpcPrefs.blockExplorerUrl.replace(/\/+$/u, '')}/tx/${hash}` } - const prefix = prefixForNetwork(networkId) + const prefix = getEtherscanNetworkPrefix(networkId) return `https://${prefix}etherscan.io/tx/${hash}` } diff --git a/ui/app/helpers/utils/transactions.util.test.js b/ui/app/helpers/utils/transactions.util.test.js index 4a8ca5c9d985..ab8b8ba7b510 100644 --- a/ui/app/helpers/utils/transactions.util.test.js +++ b/ui/app/helpers/utils/transactions.util.test.js @@ -1,9 +1,9 @@ -import * as utils from './transactions.util' import assert from 'assert' +import * as utils from './transactions.util' -describe('Transactions utils', () => { - describe('getTokenData', () => { - it('should return token data', () => { +describe('Transactions utils', function () { + describe('getTokenData', function () { + it('should return token data', function () { const tokenData = utils.getTokenData('0xa9059cbb00000000000000000000000050a9d56c2b8ba9a5c7f2c08c3d26e0499f23a7060000000000000000000000000000000000000000000000000000000000004e20') assert.ok(tokenData) const { name, params } = tokenData @@ -15,13 +15,13 @@ describe('Transactions utils', () => { assert.equal(value.type, 'uint256') }) - it('should not throw errors when called without arguments', () => { + it('should not throw errors when called without arguments', function () { assert.doesNotThrow(() => utils.getTokenData()) }) }) - describe('getStatusKey', () => { - it('should return the correct status', () => { + describe('getStatusKey', function () { + it('should return the correct status', function () { const tests = [ { transaction: { @@ -54,4 +54,44 @@ describe('Transactions utils', () => { }) }) }) + + describe('getBlockExplorerUrlForTx', function () { + it('should return the correct block explorer url for a transaction', function () { + const tests = [ + { + expected: 'https://etherscan.io/tx/0xabcd', + networkId: '1', + hash: '0xabcd', + }, + { + expected: 'https://ropsten.etherscan.io/tx/0xdef0', + networkId: '3', + hash: '0xdef0', + rpcPrefs: {}, + }, + { + // test handling of `blockExplorerUrl` for a custom RPC + expected: 'https://block.explorer/tx/0xabcd', + networkId: '31', + hash: '0xabcd', + rpcPrefs: { + blockExplorerUrl: 'https://block.explorer', + }, + }, + { + // test handling of trailing `/` in `blockExplorerUrl` for a custom RPC + expected: 'https://another.block.explorer/tx/0xdef0', + networkId: '33', + hash: '0xdef0', + rpcPrefs: { + blockExplorerUrl: 'https://another.block.explorer/', + }, + }, + ] + + tests.forEach(({ expected, networkId, hash, rpcPrefs }) => { + assert.equal(utils.getBlockExplorerUrlForTx(networkId, hash, rpcPrefs), expected) + }) + }) + }) }) diff --git a/ui/app/helpers/utils/util.js b/ui/app/helpers/utils/util.js index 94fa9ad42cb0..3382104fd592 100644 --- a/ui/app/helpers/utils/util.js +++ b/ui/app/helpers/utils/util.js @@ -1,18 +1,21 @@ -const abi = require('human-standard-token-abi') -const ethUtil = require('ethereumjs-util') -const hexToBn = require('../../../../app/scripts/lib/hex-to-bn') +import punycode from 'punycode' +import abi from 'human-standard-token-abi' +import BigNumber from 'bignumber.js' +import ethUtil from 'ethereumjs-util' import { DateTime } from 'luxon' -const MIN_GAS_PRICE_GWEI_BN = new ethUtil.BN(1) -const GWEI_FACTOR = new ethUtil.BN(1e9) -const MIN_GAS_PRICE_BN = MIN_GAS_PRICE_GWEI_BN.mul(GWEI_FACTOR) - // formatData :: ( date: ) -> String -function formatDate (date, format = 'M/d/y \'at\' T') { +export function formatDate (date, format = 'M/d/y \'at\' T') { return DateTime.fromMillis(date).toFormat(format) } -var valueTable = { +export function formatDateWithYearContext (date, formatThisYear = 'MMM d', fallback = 'MMM d, y') { + const dateTime = DateTime.fromMillis(date) + const now = DateTime.local() + return dateTime.toFormat(now.year === dateTime.year ? formatThisYear : fallback) +} + +const valueTable = { wei: '1000000000000000000', kwei: '1000000000000000', mwei: '1000000000000', @@ -25,45 +28,12 @@ var valueTable = { gether: '0.000000001', tether: '0.000000000001', } -var bnTable = {} -for (var currency in valueTable) { +const bnTable = {} +Object.keys(valueTable).forEach((currency) => { bnTable[currency] = new ethUtil.BN(valueTable[currency], 10) -} - -module.exports = { - valuesFor: valuesFor, - addressSummary: addressSummary, - miniAddressSummary: miniAddressSummary, - isAllOneCase: isAllOneCase, - isValidAddress: isValidAddress, - isValidENSAddress, - numericBalance: numericBalance, - parseBalance: parseBalance, - formatBalance: formatBalance, - generateBalanceObject: generateBalanceObject, - dataSize: dataSize, - readableDate: readableDate, - normalizeToWei: normalizeToWei, - normalizeEthStringToWei: normalizeEthStringToWei, - normalizeNumberToWei: normalizeNumberToWei, - valueTable: valueTable, - bnTable: bnTable, - isHex: isHex, - formatDate, - bnMultiplyByFraction, - getTxFeeBn, - shortenBalance, - getContractAtAddress, - exportAsFile: exportAsFile, - isInvalidChecksumAddress, - allNull, - getTokenAddressFromTokenObject, - checksumAddress, - addressSlicer, - isEthNetwork, -} +}) -function isEthNetwork (netId) { +export function isEthNetwork (netId) { if (!netId || netId === '1' || netId === '3' || netId === '4' || netId === '42' || netId === '5777') { return true } @@ -71,101 +41,110 @@ function isEthNetwork (netId) { return false } -function valuesFor (obj) { - if (!obj) return [] +export function valuesFor (obj) { + if (!obj) { + return [] + } return Object.keys(obj) - .map(function (key) { return obj[key] }) + .map(function (key) { + return obj[key] + }) } -function addressSummary (address, firstSegLength = 10, lastSegLength = 4, includeHex = true) { - if (!address) return '' +export function addressSummary (address, firstSegLength = 10, lastSegLength = 4, includeHex = true) { + if (!address) { + return '' + } let checked = checksumAddress(address) if (!includeHex) { checked = ethUtil.stripHexPrefix(checked) } - return checked ? checked.slice(0, firstSegLength) + '...' + checked.slice(checked.length - lastSegLength) : '...' -} - -function miniAddressSummary (address) { - if (!address) return '' - var checked = checksumAddress(address) - return checked ? checked.slice(0, 4) + '...' + checked.slice(-4) : '...' + return checked ? `${checked.slice(0, firstSegLength)}...${checked.slice(checked.length - lastSegLength)}` : '...' } -function isValidAddress (address) { - var prefixed = ethUtil.addHexPrefix(address) - if (address === '0x0000000000000000000000000000000000000000') return false - return (isAllOneCase(prefixed) && ethUtil.isValidAddress(prefixed)) || ethUtil.isValidChecksumAddress(prefixed) -} - -function isValidENSAddress (address) { - return address.match(/^.{7,}\.(eth|test)$/) +export function isValidAddress (address) { + if (!address || address === '0x0000000000000000000000000000000000000000') { + return false + } + const prefixed = address.startsWith('0X') ? address : ethUtil.addHexPrefix(address) + return (isAllOneCase(prefixed.slice(2)) && ethUtil.isValidAddress(prefixed)) || ethUtil.isValidChecksumAddress(prefixed) } -function isInvalidChecksumAddress (address) { - var prefixed = ethUtil.addHexPrefix(address) - if (address === '0x0000000000000000000000000000000000000000') return false - return !isAllOneCase(prefixed) && !ethUtil.isValidChecksumAddress(prefixed) && ethUtil.isValidAddress(prefixed) +export function isValidDomainName (address) { + const match = punycode.toASCII(address) + .toLowerCase() + // Checks that the domain consists of at least one valid domain pieces separated by periods, followed by a tld + // Each piece of domain name has only the characters a-z, 0-9, and a hyphen (but not at the start or end of chunk) + // A chunk has minimum length of 1, but minimum tld is set to 2 for now (no 1-character tlds exist yet) + .match(/^(?:[a-z0-9](?:[-a-z0-9]*[a-z0-9])?\.)+[a-z0-9][-a-z0-9]*[a-z0-9]$/u) + return match !== null } -function isAllOneCase (address) { - if (!address) return true - var lower = address.toLowerCase() - var upper = address.toUpperCase() +export function isAllOneCase (address) { + if (!address) { + return true + } + const lower = address.toLowerCase() + const upper = address.toUpperCase() return address === lower || address === upper } // Takes wei Hex, returns wei BN, even if input is null -function numericBalance (balance) { - if (!balance) return new ethUtil.BN(0, 16) - var stripped = ethUtil.stripHexPrefix(balance) +export function numericBalance (balance) { + if (!balance) { + return new ethUtil.BN(0, 16) + } + const stripped = ethUtil.stripHexPrefix(balance) return new ethUtil.BN(stripped, 16) } // Takes hex, returns [beforeDecimal, afterDecimal] -function parseBalance (balance) { - var beforeDecimal, afterDecimal +export function parseBalance (balance) { + let afterDecimal const wei = numericBalance(balance) - var weiString = wei.toString() - const trailingZeros = /0+$/ + const weiString = wei.toString() + const trailingZeros = /0+$/u - beforeDecimal = weiString.length > 18 ? weiString.slice(0, weiString.length - 18) : '0' - afterDecimal = ('000000000000000000' + wei).slice(-18).replace(trailingZeros, '') - if (afterDecimal === '') { afterDecimal = '0' } + const beforeDecimal = weiString.length > 18 ? weiString.slice(0, weiString.length - 18) : '0' + afterDecimal = (`000000000000000000${wei}`).slice(-18).replace(trailingZeros, '') + if (afterDecimal === '') { + afterDecimal = '0' + } return [beforeDecimal, afterDecimal] } // Takes wei hex, returns an object with three properties. // Its "formatted" property is what we generally use to render values. -function formatBalance (balance, decimalsToKeep, needsParse = true, ticker = 'ETH') { - var parsed = needsParse ? parseBalance(balance) : balance.split('.') - var beforeDecimal = parsed[0] - var afterDecimal = parsed[1] - var formatted = 'None' +export function formatBalance (balance, decimalsToKeep, needsParse = true, ticker = 'ETH') { + const parsed = needsParse ? parseBalance(balance) : balance.split('.') + const beforeDecimal = parsed[0] + let afterDecimal = parsed[1] + let formatted = 'None' if (decimalsToKeep === undefined) { if (beforeDecimal === '0') { if (afterDecimal !== '0') { - var sigFigs = afterDecimal.match(/^0*(.{2})/) // default: grabs 2 most significant digits - if (sigFigs) { afterDecimal = sigFigs[0] } - formatted = '0.' + afterDecimal + ` ${ticker}` + const sigFigs = afterDecimal.match(/^0*(.{2})/u) // default: grabs 2 most significant digits + if (sigFigs) { + afterDecimal = sigFigs[0] + } + formatted = `0.${afterDecimal} ${ticker}` } } else { - formatted = beforeDecimal + '.' + afterDecimal.slice(0, 3) + ` ${ticker}` + formatted = `${beforeDecimal}.${afterDecimal.slice(0, 3)} ${ticker}` } } else { afterDecimal += Array(decimalsToKeep).join('0') - formatted = beforeDecimal + '.' + afterDecimal.slice(0, decimalsToKeep) + ` ${ticker}` + formatted = `${beforeDecimal}.${afterDecimal.slice(0, decimalsToKeep)} ${ticker}` } return formatted } - -function generateBalanceObject (formattedBalance, decimalsToKeep = 1) { - var balance = formattedBalance.split(' ')[0] - var label = formattedBalance.split(' ')[1] - var beforeDecimal = balance.split('.')[0] - var afterDecimal = balance.split('.')[1] - var shortBalance = shortenBalance(balance, decimalsToKeep) +export function generateBalanceObject (formattedBalance, decimalsToKeep = 1) { + let balance = formattedBalance.split(' ')[0] + const label = formattedBalance.split(' ')[1] + const beforeDecimal = balance.split('.')[0] + const afterDecimal = balance.split('.')[1] + const shortBalance = shortenBalance(balance, decimalsToKeep) if (beforeDecimal === '0' && afterDecimal.substr(0, 5) === '00000') { // eslint-disable-next-line eqeqeq @@ -181,9 +160,9 @@ function generateBalanceObject (formattedBalance, decimalsToKeep = 1) { return { balance, label, shortBalance } } -function shortenBalance (balance, decimalsToKeep = 1) { - var truncatedValue - var convertedBalance = parseFloat(balance) +export function shortenBalance (balance, decimalsToKeep = 1) { + let truncatedValue + const convertedBalance = parseFloat(balance) if (convertedBalance > 1000000) { truncatedValue = (balance / 1000000).toFixed(decimalsToKeep) return `${truncatedValue}m` @@ -195,36 +174,30 @@ function shortenBalance (balance, decimalsToKeep = 1) { } else if (convertedBalance < 0.001) { return '<0.001' } else if (convertedBalance < 1) { - var stringBalance = convertedBalance.toString() + const stringBalance = convertedBalance.toString() if (stringBalance.split('.')[1].length > 3) { return convertedBalance.toFixed(3) - } else { - return stringBalance } - } else { - return convertedBalance.toFixed(decimalsToKeep) + return stringBalance } -} - -function dataSize (data) { - var size = data ? ethUtil.stripHexPrefix(data).length : 0 - return size + ' bytes' + return convertedBalance.toFixed(decimalsToKeep) } // Takes a BN and an ethereum currency name, // returns a BN in wei -function normalizeToWei (amount, currency) { +export function normalizeToWei (amount, currency) { try { return amount.mul(bnTable.wei).div(bnTable[currency]) - } catch (e) {} - return amount + } catch (e) { + return amount + } } -function normalizeEthStringToWei (str) { +export function normalizeEthStringToWei (str) { const parts = str.split('.') let eth = new ethUtil.BN(parts[0], 10).mul(bnTable.wei) if (parts[1]) { - var decimal = parts[1] + let decimal = parts[1] while (decimal.length < 18) { decimal += '0' } @@ -237,52 +210,40 @@ function normalizeEthStringToWei (str) { return eth } -var multiple = new ethUtil.BN('10000', 10) -function normalizeNumberToWei (n, currency) { - var enlarged = n * 10000 - var amount = new ethUtil.BN(String(enlarged), 10) +const multiple = new ethUtil.BN('10000', 10) +export function normalizeNumberToWei (n, currency) { + const enlarged = n * 10000 + const amount = new ethUtil.BN(String(enlarged), 10) return normalizeToWei(amount, currency).div(multiple) } -function readableDate (ms) { - var date = new Date(ms) - var month = date.getMonth() - var day = date.getDate() - var year = date.getFullYear() - var hours = date.getHours() - var minutes = '0' + date.getMinutes() - var seconds = '0' + date.getSeconds() - - var dateStr = `${month}/${day}/${year}` - var time = `${hours}:${minutes.substr(-2)}:${seconds.substr(-2)}` - return `${dateStr} ${time}` +export function isHex (str) { + return Boolean(str.match(/^(0x)?[0-9a-fA-F]+$/u)) } -function isHex (str) { - return Boolean(str.match(/^(0x)?[0-9a-fA-F]+$/)) -} - -function bnMultiplyByFraction (targetBN, numerator, denominator) { - const numBN = new ethUtil.BN(numerator) - const denomBN = new ethUtil.BN(denominator) - return targetBN.mul(numBN).div(denomBN) +export function getContractAtAddress (tokenAddress) { + return global.eth.contract(abi).at(tokenAddress) } -function getTxFeeBn (gas, gasPrice = MIN_GAS_PRICE_BN.toString(16)) { - const gasBn = hexToBn(gas) - const gasPriceBn = hexToBn(gasPrice) - const txFeeBn = gasBn.mul(gasPriceBn) +export function getRandomFileName () { + let fileName = '' + const charBank = [ + ...'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', + ] + const fileNameLength = Math.floor((Math.random() * 7) + 6) - return txFeeBn.toString(16) -} + for (let i = 0; i < fileNameLength; i++) { + fileName += charBank[Math.floor(Math.random() * charBank.length)] + } -function getContractAtAddress (tokenAddress) { - return global.eth.contract(abi).at(tokenAddress) + return fileName } -function exportAsFile (filename, data, type = 'text/csv') { +export function exportAsFile (filename, data, type = 'text/csv') { + // eslint-disable-next-line no-param-reassign + filename = filename || getRandomFileName() // source: https://stackoverflow.com/a/33542499 by Ludovic Feltz - const blob = new Blob([data], {type}) + const blob = new window.Blob([data], { type }) if (window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveBlob(blob, filename) } else { @@ -296,30 +257,115 @@ function exportAsFile (filename, data, type = 'text/csv') { } } -function allNull (obj) { - return Object.entries(obj).every(([_, value]) => value === null) -} - -function getTokenAddressFromTokenObject (token) { - return Object.values(token)[0].address.toLowerCase() -} - /** * Safely checksumms a potentially-null address * - * @param {String} [address] - address to checksum - * @returns {String} - checksummed address + * @param {string} [address] - address to checksum + * @returns {string} - checksummed address * */ -function checksumAddress (address) { +export function checksumAddress (address) { const checksummed = address ? ethUtil.toChecksumAddress(address) : '' return checksummed } -function addressSlicer (address = '') { +/** + * Shortens an Ethereum address for display, preserving the beginning and end. + * Returns the given address if it is no longer than 10 characters. + * Shortened addresses are 13 characters long. + * + * Example output: 0xabcd...1234 + * + * @param {string} address - The address to shorten. + * @returns {string} The shortened address, or the original if it was no longer + * than 10 characters. + */ +export function shortenAddress (address = '') { if (address.length < 11) { return address } return `${address.slice(0, 6)}...${address.slice(-4)}` } + +export function isValidAddressHead (address) { + const addressLengthIsLessThanFull = address.length < 42 + const addressIsHex = isHex(address) + + return addressLengthIsLessThanFull && addressIsHex +} + +export function getAccountByAddress (accounts = [], targetAddress) { + return accounts.find(({ address }) => address === targetAddress) +} + +/** + * Strips the following schemes from URL strings: + * - http + * - https + * + * @param {string} urlString - The URL string to strip the scheme from. + * @returns {string} The URL string, without the scheme, if it was stripped. + */ +export function stripHttpSchemes (urlString) { + return urlString.replace(/^https?:\/\//u, '') +} + +/** + * Checks whether a URL-like value (object or string) is an extension URL. + * + * @param {string | URL | object} urlLike - The URL-like value to test. + * @returns {boolean} Whether the URL-like value is an extension URL. + */ +export function isExtensionUrl (urlLike) { + + const EXT_PROTOCOLS = ['chrome-extension:', 'moz-extension:'] + + if (typeof urlLike === 'string') { + for (const protocol of EXT_PROTOCOLS) { + if (urlLike.startsWith(protocol)) { + return true + } + } + } + + if (urlLike?.protocol) { + return EXT_PROTOCOLS.includes(urlLike.protocol) + } + return false +} + +/** + * Checks whether an address is in a passed list of objects with address properties. The check is performed on the + * lowercased version of the addresses. + * + * @param {string} address - The hex address to check + * @param {array} list - The array of objects to check + * @returns {boolean} Whether or not the address is in the list + */ +export function checkExistingAddresses (address, list = []) { + if (!address) { + return false + } + + const matchesAddress = (obj) => { + return obj.address.toLowerCase() === address.toLowerCase() + } + + return list.some(matchesAddress) +} + +/** + * Given a number and specified precision, returns that number in base 10 with a maximum of precision + * significant digits, but without any trailing zeros after the decimal point To be used when wishing + * to display only as much digits to the user as necessary + * + * @param {string | number | BigNumber} n - The number to format + * @param {number} precision - The maximum number of significant digits in the return value + * @returns {string} The number in decimal form, with <= precision significant digits and no decimal trailing zeros + */ +export function toPrecisionWithoutTrailingZeros (n, precision) { + return (new BigNumber(n)) + .toPrecision(precision) + .replace(/(\.[0-9]*[1-9])0*|(\.0*)/u, '$1') +} diff --git a/ui/app/helpers/utils/util.test.js b/ui/app/helpers/utils/util.test.js new file mode 100644 index 000000000000..0a930e413542 --- /dev/null +++ b/ui/app/helpers/utils/util.test.js @@ -0,0 +1,395 @@ +import assert from 'assert' +import ethUtil from 'ethereumjs-util' +import * as util from './util' + +describe('util', function () { + let ethInWei = '1' + for (let i = 0; i < 18; i++) { + ethInWei += '0' + } + + describe('#parseBalance', function () { + it('should render 0.01 eth correctly', function () { + const input = '0x2386F26FC10000' + const output = util.parseBalance(input) + assert.deepEqual(output, ['0', '01']) + }) + + it('should render 12.023 eth correctly', function () { + const input = 'A6DA46CCA6858000' + const output = util.parseBalance(input) + assert.deepEqual(output, ['12', '023']) + }) + + it('should render 0.0000000342422 eth correctly', function () { + const input = '0x7F8FE81C0' + const output = util.parseBalance(input) + assert.deepEqual(output, ['0', '0000000342422']) + }) + + it('should render 0 eth correctly', function () { + const input = '0x0' + const output = util.parseBalance(input) + assert.deepEqual(output, ['0', '0']) + }) + }) + + describe('#addressSummary', function () { + it('should add case-sensitive checksum', function () { + const address = '0xfdea65c8e26263f6d9a1b5de9555d2931a33b825' + const result = util.addressSummary(address) + assert.equal(result, '0xFDEa65C8...b825') + }) + + it('should accept arguments for firstseg, lastseg, and keepPrefix', function () { + const address = '0xfdea65c8e26263f6d9a1b5de9555d2931a33b825' + const result = util.addressSummary(address, 4, 4, false) + assert.equal(result, 'FDEa...b825') + }) + }) + + describe('#isValidAddress', function () { + it('should allow 40-char non-prefixed hex', function () { + const address = 'fdea65c8e26263f6d9a1b5de9555d2931a33b825' + const result = util.isValidAddress(address) + assert.ok(result) + }) + + it('should allow 42-char non-prefixed hex', function () { + const address = '0xfdea65c8e26263f6d9a1b5de9555d2931a33b825' + const result = util.isValidAddress(address) + assert.ok(result) + }) + + it('should not allow less non hex-prefixed', function () { + const address = 'fdea65c8e26263f6d9a1b5de9555d2931a33b85' + const result = util.isValidAddress(address) + assert.ok(!result) + }) + + it('should not allow less hex-prefixed', function () { + const address = '0xfdea65ce26263f6d9a1b5de9555d2931a33b85' + const result = util.isValidAddress(address) + assert.ok(!result) + }) + + it('should recognize correct capitalized checksum', function () { + const address = '0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825' + const result = util.isValidAddress(address) + assert.ok(result) + }) + + it('should recognize incorrect capitalized checksum', function () { + const address = '0xFDea65C8e26263F6d9A1B5de9555D2931A33b825' + const result = util.isValidAddress(address) + assert.ok(!result) + }) + + it('should recognize this sample hashed address', function () { + const address = '0x5Fda30Bb72B8Dfe20e48A00dFc108d0915BE9Bb0' + const result = util.isValidAddress(address) + const hashed = ethUtil.toChecksumAddress(address.toLowerCase()) + assert.equal(hashed, address, 'example is hashed correctly') + assert.ok(result, 'is valid by our check') + }) + }) + + describe('isValidDomainName', function () { + it('should return true when given a valid domain name', function () { + assert.strictEqual(util.isValidDomainName('foo.bar'), true) + }) + + it('should return true when given a valid subdomain', function () { + assert.strictEqual(util.isValidDomainName('foo.foo.bar'), true) + }) + + it('should return true when given a single-character domain', function () { + assert.strictEqual(util.isValidDomainName('f.bar'), true) + }) + + it('should return true when given a unicode TLD', function () { + assert.strictEqual(util.isValidDomainName('å°ç£.中国'), true) + }) + + it('should return false when given a domain with unacceptable ASCII characters', function () { + assert.strictEqual(util.isValidDomainName('$.bar'), false) + }) + + it('should return false when given a TLD that starts with a dash', function () { + assert.strictEqual(util.isValidDomainName('foo.-bar'), false) + }) + + it('should return false when given a TLD that ends with a dash', function () { + assert.strictEqual(util.isValidDomainName('foo.bar-'), false) + }) + + it('should return false when given a domain name with a chunk that starts with a dash', function () { + assert.strictEqual(util.isValidDomainName('-foo.bar'), false) + }) + + it('should return false when given a domain name with a chunk that ends with a dash', function () { + assert.strictEqual(util.isValidDomainName('foo-.bar'), false) + }) + + it('should return false when given a bare TLD', function () { + assert.strictEqual(util.isValidDomainName('bar'), false) + }) + + it('should return false when given a domain that starts with a period', function () { + assert.strictEqual(util.isValidDomainName('.bar'), false) + }) + + it('should return false when given a subdomain that starts with a period', function () { + assert.strictEqual(util.isValidDomainName('.foo.bar'), false) + }) + + it('should return false when given a domain that ends with a period', function () { + assert.strictEqual(util.isValidDomainName('bar.'), false) + }) + + it('should return false when given a 1-character TLD', function () { + assert.strictEqual(util.isValidDomainName('foo.b'), false) + }) + }) + + describe('#numericBalance', function () { + it('should return a BN 0 if given nothing', function () { + const result = util.numericBalance() + assert.equal(result.toString(10), 0) + }) + + it('should work with hex prefix', function () { + const result = util.numericBalance('0x012') + assert.equal(result.toString(10), '18') + }) + + it('should work with no hex prefix', function () { + const result = util.numericBalance('012') + assert.equal(result.toString(10), '18') + }) + }) + + describe('#formatBalance', function () { + it('should return None when given nothing', function () { + const result = util.formatBalance() + assert.equal(result, 'None', 'should return "None"') + }) + + it('should return 1.0000 ETH', function () { + const input = new ethUtil.BN(ethInWei, 10).toJSON() + const result = util.formatBalance(input, 4) + assert.equal(result, '1.0000 ETH') + }) + + it('should return 0.500 ETH', function () { + const input = new ethUtil.BN(ethInWei, 10).div(new ethUtil.BN('2', 10)).toJSON() + const result = util.formatBalance(input, 3) + assert.equal(result, '0.500 ETH') + }) + + it('should display specified decimal points', function () { + const input = '0x128dfa6a90b28000' + const result = util.formatBalance(input, 2) + assert.equal(result, '1.33 ETH') + }) + it('should default to 3 decimal points', function () { + const input = '0x128dfa6a90b28000' + const result = util.formatBalance(input) + assert.equal(result, '1.337 ETH') + }) + it('should show 2 significant digits for tiny balances', function () { + const input = '0x1230fa6a90b28' + const result = util.formatBalance(input) + assert.equal(result, '0.00032 ETH') + }) + it('should not parse the balance and return value with 2 decimal points with ETH at the end', function () { + const value = '1.2456789' + const needsParse = false + const result = util.formatBalance(value, 2, needsParse) + assert.equal(result, '1.24 ETH') + }) + }) + + describe('normalizing values', function () { + describe('#normalizeToWei', function () { + it('should convert an eth to the appropriate equivalent values', function () { + const valueTable = { + wei: '1000000000000000000', + kwei: '1000000000000000', + mwei: '1000000000000', + gwei: '1000000000', + szabo: '1000000', + finney: '1000', + ether: '1', + // kether:'0.001', + // mether:'0.000001', + // AUDIT: We're getting BN numbers on these ones. + // I think they're big enough to ignore for now. + // gether:'0.000000001', + // tether:'0.000000000001', + } + const oneEthBn = new ethUtil.BN(ethInWei, 10) + + Object.keys(valueTable).forEach((currency) => { + const value = new ethUtil.BN(valueTable[currency], 10) + const output = util.normalizeToWei(value, currency) + assert.equal(output.toString(10), valueTable.wei, `value of ${output.toString(10)} ${currency} should convert to ${oneEthBn}`) + }) + }) + }) + + describe('#normalizeEthStringToWei', function () { + it('should convert decimal eth to pure wei BN', function () { + const input = '1.23456789' + const output = util.normalizeEthStringToWei(input) + assert.equal(output.toString(10), '1234567890000000000') + }) + + it('should convert 1 to expected wei', function () { + const input = '1' + const output = util.normalizeEthStringToWei(input) + assert.equal(output.toString(10), ethInWei) + }) + + it('should account for overflow numbers gracefully by dropping extra precision.', function () { + const input = '1.11111111111111111111' + const output = util.normalizeEthStringToWei(input) + assert.equal(output.toString(10), '1111111111111111111') + }) + + it('should not truncate very exact wei values that do not have extra precision.', function () { + const input = '1.100000000000000001' + const output = util.normalizeEthStringToWei(input) + assert.equal(output.toString(10), '1100000000000000001') + }) + }) + + describe('#normalizeNumberToWei', function () { + it('should handle a simple use case', function () { + const input = 0.0002 + const output = util.normalizeNumberToWei(input, 'ether') + const str = output.toString(10) + assert.equal(str, '200000000000000') + }) + + it('should convert a kwei number to the appropriate equivalent wei', function () { + const result = util.normalizeNumberToWei(1.111, 'kwei') + assert.equal(result.toString(10), '1111', 'accepts decimals') + }) + + it('should convert a ether number to the appropriate equivalent wei', function () { + const result = util.normalizeNumberToWei(1.111, 'ether') + assert.equal(result.toString(10), '1111000000000000000', 'accepts decimals') + }) + }) + describe('#isHex', function () { + it('should return true when given a hex string', function () { + const result = util.isHex('c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2') + assert(result) + }) + + it('should return false when given a non-hex string', function () { + const result = util.isHex('c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714imnotreal') + assert(!result) + }) + + it('should return false when given a string containing a non letter/number character', function () { + const result = util.isHex('c3ab8ff13720!8ad9047dd39466b3c%8974e592c2fa383d4a396071imnotreal') + assert(!result) + }) + + it('should return true when given a hex string with hex-prefix', function () { + const result = util.isHex('0xc3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2') + assert(result) + }) + }) + + describe('#getRandomFileName', function () { + it('should only return a string containing alphanumeric characters', function () { + const result = util.getRandomFileName() + assert(result.match(/^[a-zA-Z0-9]*$/ug)) + }) + + // 50 samples + it('should return a string that is between 6 and 12 characters in length', function () { + for (let i = 0; i < 50; i++) { + const result = util.getRandomFileName() + assert(result.length >= 6 && result.length <= 12) + } + }) + }) + }) + + describe('checkExistingAddresses', function () { + const tokenList = [ + { address: 'A' }, + { address: 'n' }, + { address: 'Q' }, + { address: 'z' }, + ] + + it('should return true when a lowercase address matches an uppercase address in the passed list', function () { + assert(util.checkExistingAddresses('q', tokenList) === true) + }) + + it('should return true when an uppercase address matches a lowercase address in the passed list', function () { + assert(util.checkExistingAddresses('N', tokenList) === true) + }) + + it('should return true when a lowercase address matches a lowercase address in the passed list', function () { + assert(util.checkExistingAddresses('z', tokenList) === true) + }) + + it('should return true when an uppercase address matches an uppercase address in the passed list', function () { + assert(util.checkExistingAddresses('Q', tokenList) === true) + }) + + it('should return false when the passed address is not in the passed list', function () { + assert(util.checkExistingAddresses('b', tokenList) === false) + }) + }) + + describe('toPrecisionWithoutTrailingZeros', function () { + const testData = [ + { args: ['0', 9], result: '0' }, + { args: [0, 9], result: '0' }, + { args: ['0.0', 9], result: '0' }, + { args: ['0.000000000000', 9], result: '0' }, + { args: ['1', 9], result: '1' }, + { args: [1], result: '1' }, + { args: ['1.0', 9], result: '1' }, + { args: ['1.000000000', 9], result: '1' }, + { args: ['000000001', 9], result: '1' }, + { args: ['000000001.0', 9], result: '1' }, + { args: ['100000000', 9], result: '100000000' }, + { args: ['100000000.00001', 9], result: '100000000' }, + { args: ['100.00001', 9], result: '100.00001' }, + { args: ['100.00001000', 9], result: '100.00001' }, + { args: ['100.000010001', 9], result: '100.00001' }, + { args: ['10.010101', 9], result: '10.010101' }, + { args: ['0.1', 5], result: '0.1' }, + { args: ['0.10', 5], result: '0.1' }, + { args: ['0.1010', 5], result: '0.101' }, + { args: ['0.01001', 5], result: '0.01001' }, + { args: ['0.010010', 5], result: '0.01001' }, + { args: ['0.010011', 5], result: '0.010011' }, + { args: ['1.01005', 5], result: '1.0101' }, + { args: ['1.000049', 5], result: '1' }, + { args: ['1.00005', 5], result: '1.0001' }, + { args: ['0.0000123456789', 9], result: '0.0000123456789' }, + { args: ['1.0000123456789', 10], result: '1.000012346' }, + { args: ['10000.0000012345679', 10], result: '10000' }, + { args: ['1000000000000', 10], result: '1e+12' }, + { args: ['1000050000000', 10], result: '1.00005e+12' }, + { args: ['100000000000000000000', 10], result: '1e+20' }, + { args: ['100005000000000000000', 10], result: '1.00005e+20' }, + { args: ['100005000000000000000.0', 10], result: '1.00005e+20' }, + ] + + testData.forEach(({ args, result }) => { + it(`should return ${result} when passed number ${args[0]} and precision ${args[1]}`, function () { + assert.equal(util.toPrecisionWithoutTrailingZeros(...args), result) + }) + }) + }) +}) diff --git a/ui/app/hooks/tests/useCancelTransaction.test.js b/ui/app/hooks/tests/useCancelTransaction.test.js new file mode 100644 index 000000000000..a355ee5e5e11 --- /dev/null +++ b/ui/app/hooks/tests/useCancelTransaction.test.js @@ -0,0 +1,112 @@ +import assert from 'assert' +import * as reactRedux from 'react-redux' +import { renderHook } from '@testing-library/react-hooks' +import sinon from 'sinon' +import transactions from '../../../../test/data/transaction-data.json' +import { getConversionRate, getSelectedAccount } from '../../selectors' +import { useCancelTransaction } from '../useCancelTransaction' +import { showModal } from '../../store/actions' +import { increaseLastGasPrice } from '../../helpers/utils/confirm-tx.util' + +describe('useCancelTransaction', function () { + let useSelector + const dispatch = sinon.spy() + + before(function () { + sinon.stub(reactRedux, 'useDispatch').returns(dispatch) + }) + + afterEach(function () { + dispatch.resetHistory() + }) + + describe('when account has insufficient balance to cover gas', function () { + before(function () { + useSelector = sinon.stub(reactRedux, 'useSelector') + useSelector.callsFake((selector) => { + if (selector === getConversionRate) { + return 280.46 + } else if (selector === getSelectedAccount) { + return { + balance: '0x3', + } + } + return undefined + }) + }) + transactions.forEach((transactionGroup) => { + const originalGasPrice = transactionGroup.primaryTransaction.txParams?.gasPrice + const gasPrice = originalGasPrice && increaseLastGasPrice(originalGasPrice) + const transactionId = transactionGroup.initialTransaction.id + it(`should indicate account has insufficient funds to cover ${gasPrice} gas price`, function () { + const { result } = renderHook(() => useCancelTransaction(transactionGroup)) + assert.equal(result.current[0], false) + }) + it(`should return a function that kicks off cancellation for id ${transactionId}`, function () { + const { result } = renderHook(() => useCancelTransaction(transactionGroup)) + assert.equal(typeof result.current[1], 'function') + result.current[1]({ preventDefault: () => undefined, stopPropagation: () => undefined }) + assert.equal( + dispatch.calledWith( + showModal({ + name: 'CANCEL_TRANSACTION', + transactionId, + originalGasPrice, + }), + ), + true, + ) + }) + }) + after(function () { + useSelector.restore() + }) + }) + + describe('when account has sufficient balance to cover gas', function () { + before(function () { + useSelector = sinon.stub(reactRedux, 'useSelector') + useSelector.callsFake((selector) => { + if (selector === getConversionRate) { + return 280.46 + } else if (selector === getSelectedAccount) { + return { + balance: '0x9C2007651B2500000', + } + } + return undefined + }) + }) + transactions.forEach((transactionGroup) => { + const originalGasPrice = transactionGroup.primaryTransaction.txParams?.gasPrice + const gasPrice = originalGasPrice && increaseLastGasPrice(originalGasPrice) + const transactionId = transactionGroup.initialTransaction.id + it(`should indicate account has funds to cover ${gasPrice} gas price`, function () { + const { result } = renderHook(() => useCancelTransaction(transactionGroup)) + assert.equal(result.current[0], true) + }) + it(`should return a function that kicks off cancellation for id ${transactionId}`, function () { + const { result } = renderHook(() => useCancelTransaction(transactionGroup)) + assert.equal(typeof result.current[1], 'function') + result.current[1]({ preventDefault: () => undefined, stopPropagation: () => undefined }) + assert.equal( + dispatch.calledWith( + showModal({ + name: 'CANCEL_TRANSACTION', + transactionId, + originalGasPrice, + }), + ), + true, + ) + }) + }) + after(function () { + useSelector.restore() + }) + }) + + after(function () { + sinon.restore() + }) +}) diff --git a/ui/app/hooks/tests/useCurrencyDisplay.test.js b/ui/app/hooks/tests/useCurrencyDisplay.test.js new file mode 100644 index 000000000000..8b3f6910ae15 --- /dev/null +++ b/ui/app/hooks/tests/useCurrencyDisplay.test.js @@ -0,0 +1,126 @@ +import assert from 'assert' +import { renderHook } from '@testing-library/react-hooks' +import * as reactRedux from 'react-redux' +import sinon from 'sinon' +import { useCurrencyDisplay } from '../useCurrencyDisplay' +import { getCurrentCurrency, getNativeCurrency, getConversionRate } from '../../selectors' + +const tests = [ + { + input: { + value: '0x2386f26fc10000', + numberOfDecimals: 2, + currency: 'usd', + }, + result: { + value: '$2.80', + suffix: 'USD', + displayValue: '$2.80 USD', + }, + }, + { + input: { + value: '0x2386f26fc10000', + currency: 'usd', + }, + result: { + value: '$2.80', + suffix: 'USD', + displayValue: '$2.80 USD', + }, + }, + { + input: { + value: '0x1193461d01595930', + currency: 'ETH', + numberOfDecimals: 3, + }, + result: { + value: '1.266', + suffix: 'ETH', + displayValue: '1.266 ETH', + }, + }, + { + input: { + value: '0x1193461d01595930', + currency: 'ETH', + numberOfDecimals: 3, + hideLabel: true, + }, + result: { + value: '1.266', + suffix: undefined, + displayValue: '1.266', + }, + }, + { + input: { + value: '0x3b9aca00', + currency: 'ETH', + denomination: 'GWEI', + hideLabel: true, + }, + result: { + value: '1', + suffix: undefined, + displayValue: '1', + }, + }, + { + input: { + value: '0x3b9aca00', + currency: 'ETH', + denomination: 'WEI', + hideLabel: true, + }, + result: { + value: '1000000000', + suffix: undefined, + displayValue: '1000000000', + }, + }, + { + input: { + value: '0x3b9aca00', + currency: 'ETH', + numberOfDecimals: 100, + hideLabel: true, + }, + result: { + value: '0.000000001', + suffix: undefined, + displayValue: '0.000000001', + }, + }, +] + +describe('useCurrencyDisplay', function () { + tests.forEach(({ input: { value, ...restProps }, result }) => { + describe(`when input is { value: ${value}, decimals: ${restProps.numberOfDecimals}, denomation: ${restProps.denomination} }`, function () { + const stub = sinon.stub(reactRedux, 'useSelector') + stub.callsFake((selector) => { + if (selector === getCurrentCurrency) { + return 'usd' + } else if (selector === getNativeCurrency) { + return 'ETH' + } else if (selector === getConversionRate) { + return 280.45 + } + return undefined + }) + const hookReturn = renderHook(() => useCurrencyDisplay(value, restProps)) + const [displayValue, parts] = hookReturn.result.current + stub.restore() + it(`should return ${result.displayValue} as displayValue`, function () { + assert.equal(displayValue, result.displayValue) + }) + it(`should return ${result.value} as value`, function () { + assert.equal(parts.value, result.value) + }) + it(`should return ${result.suffix} as suffix`, function () { + assert.equal(parts.suffix, result.suffix) + }) + }) + }) +}) diff --git a/ui/app/hooks/tests/useRetryTransaction.test.js b/ui/app/hooks/tests/useRetryTransaction.test.js new file mode 100644 index 000000000000..b922bd92c118 --- /dev/null +++ b/ui/app/hooks/tests/useRetryTransaction.test.js @@ -0,0 +1,66 @@ +import assert from 'assert' +import * as reactRedux from 'react-redux' +import { renderHook } from '@testing-library/react-hooks' +import sinon from 'sinon' +import transactions from '../../../../test/data/transaction-data.json' +import * as methodDataHook from '../useMethodData' +import * as metricEventHook from '../useMetricEvent' +import { showSidebar } from '../../store/actions' +import { useRetryTransaction } from '../useRetryTransaction' + +describe('useRetryTransaction', function () { + describe('when transaction meets retry enabled criteria', function () { + const dispatch = sinon.spy(() => Promise.resolve({ blockTime: 0 })) + const trackEvent = sinon.spy() + const event = { preventDefault: () => undefined, stopPropagation: () => undefined } + + before(function () { + sinon.stub(reactRedux, 'useDispatch').returns(dispatch) + sinon.stub(methodDataHook, 'useMethodData').returns({}) + sinon.stub(metricEventHook, 'useMetricEvent').returns(trackEvent) + }) + + afterEach(function () { + dispatch.resetHistory() + trackEvent.resetHistory() + }) + const retryEnabledTransaction = { + ...transactions[0], + transactions: [ + { + submittedTime: new Date() - 5001, + }, + ], + hasRetried: false, + } + + it('retryTransaction function should track metrics', function () { + const { result } = renderHook(() => useRetryTransaction(retryEnabledTransaction, true)) + const retry = result.current + retry(event) + assert.equal(trackEvent.calledOnce, true) + }) + + it('retryTransaction function should show retry sidebar', async function () { + const { result } = renderHook(() => useRetryTransaction(retryEnabledTransaction, true)) + const retry = result.current + await retry(event) + const calls = dispatch.getCalls() + assert.equal(calls.length, 5) + assert.equal( + dispatch.calledWith( + showSidebar({ + transitionName: 'sidebar-left', + type: 'customize-gas', + props: { transaction: retryEnabledTransaction.initialTransaction }, + }), + ), + true, + ) + }) + + after(function () { + sinon.restore() + }) + }) +}) diff --git a/ui/app/hooks/tests/useTokenData.test.js b/ui/app/hooks/tests/useTokenData.test.js new file mode 100644 index 000000000000..10482b63b226 --- /dev/null +++ b/ui/app/hooks/tests/useTokenData.test.js @@ -0,0 +1,76 @@ +import assert from 'assert' +import { renderHook } from '@testing-library/react-hooks' +import { useTokenData } from '../useTokenData' + +const tests = [ + { + data: '0xa9059cbb000000000000000000000000ffe5bc4e8f1f969934d773fa67da095d2e491a970000000000000000000000000000000000000000000000000000000000003a98', + tokenData: { + 'name': 'transfer', + 'params': [ + { + 'name': '_to', + 'value': '0xffe5bc4e8f1f969934d773fa67da095d2e491a97', + 'type': 'address', + }, + { + 'name': '_value', + 'value': '15000', + 'type': 'uint256', + }, + ], + }, + }, + { + data: '0xa9059cbb000000000000000000000000ffe5bc4e8f1f969934d773fa67da095d2e491a9700000000000000000000000000000000000000000000000000000000000061a8', + tokenData: { + 'name': 'transfer', + 'params': [ + { + 'name': '_to', + 'value': '0xffe5bc4e8f1f969934d773fa67da095d2e491a97', + 'type': 'address', + }, + { + 'name': '_value', + 'value': '25000', + 'type': 'uint256', + }, + ], + }, + }, + { + data: '0xa9059cbb000000000000000000000000ffe5bc4e8f1f969934d773fa67da095d2e491a970000000000000000000000000000000000000000000000000000000000002710', + tokenData: { + 'name': 'transfer', + 'params': [ + { + 'name': '_to', + 'value': '0xffe5bc4e8f1f969934d773fa67da095d2e491a97', + 'type': 'address', + }, + { + 'name': '_value', + 'value': '10000', + 'type': 'uint256', + }, + ], + }, + }, + { + data: undefined, + tokenData: null, + }, +] + +describe('useTokenData', function () { + tests.forEach((test) => { + const testTitle = test.tokenData === null + ? `should return null when no data provided` + : `should return properly decoded data with _value ${test.tokenData.params[1].value}` + it(testTitle, function () { + const { result } = renderHook(() => useTokenData(test.data)) + assert.deepEqual(result.current, test.tokenData) + }) + }) +}) diff --git a/ui/app/hooks/tests/useTokenDisplayValue.test.js b/ui/app/hooks/tests/useTokenDisplayValue.test.js new file mode 100644 index 000000000000..ed0c81e4f714 --- /dev/null +++ b/ui/app/hooks/tests/useTokenDisplayValue.test.js @@ -0,0 +1,135 @@ +import assert from 'assert' +import { renderHook } from '@testing-library/react-hooks' +import sinon from 'sinon' +import * as tokenUtil from '../../helpers/utils/token-util' +import * as txUtil from '../../helpers/utils/transactions.util' +import { useTokenDisplayValue } from '../useTokenDisplayValue' + +const tests = [ + { + token: { + symbol: 'DAI', + decimals: 18, + }, + tokenData: { + params: 'decoded-params1', + }, + tokenValue: '1000000000000000000', + displayValue: '1', + }, + { + token: { + symbol: 'DAI', + decimals: 18, + }, + tokenData: { + params: 'decoded-params2', + }, + tokenValue: '10000000000000000000', + displayValue: '10', + }, + { + token: { + symbol: 'DAI', + decimals: 18, + }, + tokenData: { + params: 'decoded-params3', + }, + tokenValue: '1500000000000000000', + displayValue: '1.5', + }, + { + token: { + symbol: 'DAI', + decimals: 18, + }, + tokenData: { + params: 'decoded-params4', + }, + tokenValue: '1756000000000000000', + displayValue: '1.756', + }, + { + token: { + symbol: 'DAI', + decimals: 18, + }, + tokenData: { + params: 'decoded-params5', + }, + tokenValue: '25500000000000000000', + displayValue: '25.5', + }, + { + token: { + symbol: 'USDC', + decimals: 6, + }, + tokenData: { + params: 'decoded-params6', + }, + tokenValue: '1000000', + displayValue: '1', + }, + { + token: { + symbol: 'USDC', + decimals: 6, + }, + tokenData: { + params: 'decoded-params7', + }, + tokenValue: '10000000', + displayValue: '10', + }, + { + token: { + symbol: 'USDC', + decimals: 6, + }, + tokenData: { + params: 'decoded-params8', + }, + tokenValue: '1500000', + displayValue: '1.5', + }, + { + token: { + symbol: 'USDC', + decimals: 6, + }, + tokenData: { + params: 'decoded-params9', + }, + tokenValue: '1756000', + displayValue: '1.756', + }, + { + token: { + symbol: 'USDC', + decimals: 6, + }, + tokenData: { + params: 'decoded-params10', + }, + tokenValue: '25500000', + displayValue: '25.5', + }, +] + +describe('useTokenDisplayValue', function () { + tests.forEach((test, idx) => { + describe(`when input is decimals: ${test.token.decimals} and value: ${test.tokenValue}`, function () { + it(`should return ${test.displayValue} as displayValue`, function () { + const getTokenValueStub = sinon.stub(tokenUtil, 'getTokenValue') + const getTokenDataStub = sinon.stub(txUtil, 'getTokenData') + getTokenDataStub.callsFake(() => test.tokenData) + getTokenValueStub.callsFake(() => test.tokenValue) + const { result } = renderHook(() => useTokenDisplayValue(`${idx}-fakestring`, test.token)) + sinon.restore() + assert.equal(result.current, test.displayValue) + }) + }) + }) +}) diff --git a/ui/app/hooks/tests/useTransactionDisplayData.test.js b/ui/app/hooks/tests/useTransactionDisplayData.test.js new file mode 100644 index 000000000000..a8eb15148a8e --- /dev/null +++ b/ui/app/hooks/tests/useTransactionDisplayData.test.js @@ -0,0 +1,168 @@ +import assert from 'assert' +import * as reactRedux from 'react-redux' +import { renderHook } from '@testing-library/react-hooks' +import sinon from 'sinon' +import transactions from '../../../../test/data/transaction-data.json' +import { useTransactionDisplayData } from '../useTransactionDisplayData' +import * as useTokenFiatAmountHooks from '../useTokenFiatAmount' +import { getPreferences, getShouldShowFiat, getNativeCurrency, getCurrentCurrency } from '../../selectors' +import { getTokens } from '../../ducks/metamask/metamask' +import * as i18nhooks from '../useI18nContext' +import { getMessage } from '../../helpers/utils/i18n-helper' +import messages from '../../../../app/_locales/en/messages.json' + +const expectedResults = [ + { + title: 'Send ETH', + category: 'send', + subtitle: 'To: 0xffe5...1a97', + subtitleContainsOrigin: false, + date: 'May 12', + primaryCurrency: '-1 ETH', + senderAddress: '0x9eca64466f257793eaa52fcfff5066894b76a149', + recipientAddress: '0xffe5bc4e8f1f969934d773fa67da095d2e491a97', + secondaryCurrency: '-1 ETH', + isPending: false, + status: 'confirmed', + }, + { + title: 'Send ETH', + category: 'send', + subtitle: 'To: 0x0ccc...8848', + subtitleContainsOrigin: false, + date: 'May 12', + primaryCurrency: '-2 ETH', + senderAddress: '0x9eca64466f257793eaa52fcfff5066894b76a149', + recipientAddress: '0x0ccc8aeeaf5ce790f3b448325981a143fdef8848', + secondaryCurrency: '-2 ETH', + isPending: false, + status: 'confirmed', + }, + { + title: 'Send ETH', + category: 'send', + subtitle: 'To: 0xffe5...1a97', + subtitleContainsOrigin: false, + date: 'May 12', + primaryCurrency: '-2 ETH', + senderAddress: '0x9eca64466f257793eaa52fcfff5066894b76a149', + recipientAddress: '0xffe5bc4e8f1f969934d773fa67da095d2e491a97', + secondaryCurrency: '-2 ETH', + isPending: false, + status: 'confirmed', + }, + { + title: 'Receive', + category: 'receive', + subtitle: 'From: 0x31b9...4523', + subtitleContainsOrigin: false, + date: 'May 12', + primaryCurrency: '18.75 ETH', + senderAddress: '0x31b98d14007bdee637298086988a0bbd31184523', + recipientAddress: '0x9eca64466f257793eaa52fcfff5066894b76a149', + secondaryCurrency: '18.75 ETH', + isPending: false, + status: 'confirmed', + }, + { + title: 'Receive', + category: 'receive', + subtitle: 'From: 0x9eca...a149', + subtitleContainsOrigin: false, + date: 'May 8', + primaryCurrency: '0 ETH', + senderAddress: '0x9eca64466f257793eaa52fcfff5066894b76a149', + recipientAddress: '0x9eca64466f257793eaa52fcfff5066894b76a149', + secondaryCurrency: '0 ETH', + isPending: false, + status: 'confirmed', + }, + { + title: 'Receive', + category: 'receive', + subtitle: 'From: 0xee01...febb', + subtitleContainsOrigin: false, + date: 'May 24', + primaryCurrency: '1 ETH', + senderAddress: '0xee014609ef9e09776ac5fe00bdbfef57bcdefebb', + recipientAddress: '0x9eca64466f257793eaa52fcfff5066894b76a149', + secondaryCurrency: '1 ETH', + isPending: false, + status: 'confirmed', + }, +] + +let useSelector, useI18nContext, useTokenFiatAmount + +describe('useTransactionDisplayData', function () { + before(function () { + useSelector = sinon.stub(reactRedux, 'useSelector') + useTokenFiatAmount = sinon.stub(useTokenFiatAmountHooks, 'useTokenFiatAmount') + useTokenFiatAmount.returns((tokenAddress) => { + return tokenAddress ? '1 TST' : undefined + }) + useI18nContext = sinon.stub(i18nhooks, 'useI18nContext') + useI18nContext.returns((key, variables) => getMessage('en', messages, key, variables)) + useSelector.callsFake((selector) => { + if (selector === getTokens) { + return [] + } else if (selector === getPreferences) { + return { + useNativeCurrencyAsPrimaryCurrency: true, + } + } else if (selector === getShouldShowFiat) { + return false + } else if (selector === getNativeCurrency) { + return 'ETH' + } else if (selector === getCurrentCurrency) { + return 'ETH' + } + return null + }) + }) + transactions.forEach((transactionGroup, idx) => { + describe(`when called with group containing primaryTransaction id ${transactionGroup.primaryTransaction.id}`, function () { + const expected = expectedResults[idx] + it(`should return a title of ${expected.title}`, function () { + const { result } = renderHook(() => useTransactionDisplayData(transactionGroup)) + assert.equal(result.current.title, expected.title) + }) + it(`should return a subtitle of ${expected.subtitle}`, function () { + const { result } = renderHook(() => useTransactionDisplayData(transactionGroup)) + assert.equal(result.current.subtitle, expected.subtitle) + }) + it(`should return a category of ${expected.category}`, function () { + const { result } = renderHook(() => useTransactionDisplayData(transactionGroup)) + assert.equal(result.current.category, expected.category) + }) + it(`should return a primaryCurrency of ${expected.primaryCurrency}`, function () { + const { result } = renderHook(() => useTransactionDisplayData(transactionGroup)) + assert.equal(result.current.primaryCurrency, expected.primaryCurrency) + }) + it(`should return a secondaryCurrency of ${expected.secondaryCurrency}`, function () { + const { result } = renderHook(() => useTransactionDisplayData(transactionGroup)) + assert.equal(result.current.secondaryCurrency, expected.secondaryCurrency) + }) + it(`should return a status of ${expected.status}`, function () { + const { result } = renderHook(() => useTransactionDisplayData(transactionGroup)) + assert.equal(result.current.status, expected.status) + }) + it(`should return a recipientAddress of ${expected.recipientAddress}`, function () { + const { result } = renderHook(() => useTransactionDisplayData(transactionGroup)) + assert.equal(result.current.recipientAddress, expected.recipientAddress) + }) + it(`should return a senderAddress of ${expected.senderAddress}`, function () { + const { result } = renderHook(() => useTransactionDisplayData(transactionGroup)) + assert.equal(result.current.senderAddress, expected.senderAddress) + }) + }) + }) + it('should return an appropriate object', function () { + const { result } = renderHook(() => useTransactionDisplayData(transactions[0])) + assert.deepEqual(result.current, expectedResults[0]) + }) + after(function () { + useSelector.restore() + useI18nContext.restore() + }) +}) diff --git a/ui/app/hooks/tests/useUserPreferencedCurrency.test.js b/ui/app/hooks/tests/useUserPreferencedCurrency.test.js new file mode 100644 index 000000000000..b5d7b47e9bbe --- /dev/null +++ b/ui/app/hooks/tests/useUserPreferencedCurrency.test.js @@ -0,0 +1,141 @@ +import assert from 'assert' +import { renderHook } from '@testing-library/react-hooks' +import * as reactRedux from 'react-redux' +import sinon from 'sinon' +import { useUserPreferencedCurrency } from '../useUserPreferencedCurrency' +import { getPreferences, getShouldShowFiat } from '../../selectors' + +const tests = [ + { + state: { + useNativeCurrencyAsPrimaryCurrency: true, + nativeCurrency: 'ETH', + showFiat: true, + }, + params: { + type: 'PRIMARY', + }, + result: { + currency: 'ETH', + numberOfDecimals: 6, + }, + }, + { + state: { + useNativeCurrencyAsPrimaryCurrency: false, + nativeCurrency: 'ETH', + showFiat: true, + }, + params: { + type: 'PRIMARY', + }, + result: { + currency: undefined, + numberOfDecimals: 2, + }, + }, + { + state: { + useNativeCurrencyAsPrimaryCurrency: true, + nativeCurrency: 'ETH', + showFiat: true, + }, + params: { + type: 'SECONDARY', + fiatNumberOfDecimals: 4, + fiatPrefix: '-', + }, + result: { + currency: undefined, + numberOfDecimals: 4, + }, + }, + { + state: { + useNativeCurrencyAsPrimaryCurrency: false, + nativeCurrency: 'ETH', + showFiat: true, + }, + params: { + type: 'SECONDARY', + fiatNumberOfDecimals: 4, + numberOfDecimals: 3, + fiatPrefix: 'a', + }, + result: { + currency: 'ETH', + numberOfDecimals: 3, + }, + }, + { + state: { + useNativeCurrencyAsPrimaryCurrency: false, + nativeCurrency: 'ETH', + showFiat: false, + }, + params: { + type: 'PRIMARY', + }, + result: { + currency: 'ETH', + numberOfDecimals: 6, + }, + }, + { + state: { + useNativeCurrencyAsPrimaryCurrency: false, + nativeCurrency: 'ETH', + showFiat: true, + }, + params: { + type: 'PRIMARY', + }, + result: { + currency: undefined, + numberOfDecimals: 2, + }, + }, + { + state: { + useNativeCurrencyAsPrimaryCurrency: false, + nativeCurrency: 'ETH', + showFiat: true, + }, + params: { + type: 'PRIMARY', + }, + result: { + currency: undefined, + numberOfDecimals: 2, + }, + }, +] + +function getFakeUseSelector (state) { + return (selector) => { + if (selector === getPreferences) { + return state + } else if (selector === getShouldShowFiat) { + return state.showFiat + } + return state.nativeCurrency + } +} + +describe('useUserPreferencedCurrency', function () { + tests.forEach(({ params: { type, ...otherParams }, state, result }) => { + describe(`when showFiat is ${state.showFiat}, useNativeCurrencyAsPrimary is ${state.useNativeCurrencyAsPrimaryCurrency} and type is ${type}`, function () { + const stub = sinon.stub(reactRedux, 'useSelector') + stub.callsFake(getFakeUseSelector(state)) + + const { result: hookResult } = renderHook(() => useUserPreferencedCurrency(type, otherParams)) + stub.restore() + it(`should return currency as ${result.currency || 'not modified by user preferences'}`, function () { + assert.equal(hookResult.current.currency, result.currency) + }) + it(`should return decimals as ${result.numberOfDecimals || 'not modified by user preferences'}`, function () { + assert.equal(hookResult.current.numberOfDecimals, result.numberOfDecimals) + }) + }) + }) +}) diff --git a/ui/app/hooks/useCancelTransaction.js b/ui/app/hooks/useCancelTransaction.js new file mode 100644 index 000000000000..54769736093b --- /dev/null +++ b/ui/app/hooks/useCancelTransaction.js @@ -0,0 +1,42 @@ +import { useDispatch, useSelector } from 'react-redux' +import { useCallback } from 'react' +import { showModal } from '../store/actions' +import { isBalanceSufficient } from '../pages/send/send.utils' +import { getHexGasTotal, increaseLastGasPrice } from '../helpers/utils/confirm-tx.util' +import { getConversionRate, getSelectedAccount } from '../selectors' + +/** + * Determine whether a transaction can be cancelled and provide a method to + * kick off the process of cancellation. + * + * Provides a reusable hook that, given a transactionGroup, will return + * whether or not the account has enough funds to cover the gas cancellation + * fee, and a method for beginning the cancellation process + * @param {Object} transactionGroup + * @return {[boolean, Function]} + */ +export function useCancelTransaction (transactionGroup) { + const { primaryTransaction, initialTransaction } = transactionGroup + const gasPrice = primaryTransaction.txParams?.gasPrice + const { id } = initialTransaction + const dispatch = useDispatch() + const selectedAccount = useSelector(getSelectedAccount) + const conversionRate = useSelector(getConversionRate) + const cancelTransaction = useCallback((event) => { + event.stopPropagation() + + return dispatch(showModal({ name: 'CANCEL_TRANSACTION', transactionId: id, originalGasPrice: gasPrice })) + }, [dispatch, id, gasPrice]) + + const hasEnoughCancelGas = primaryTransaction.txParams && isBalanceSufficient({ + amount: '0x0', + gasTotal: getHexGasTotal({ + gasPrice: increaseLastGasPrice(gasPrice), + gasLimit: primaryTransaction.txParams.gas, + }), + balance: selectedAccount.balance, + conversionRate, + }) + + return [hasEnoughCancelGas, cancelTransaction] +} diff --git a/ui/app/hooks/useCopyToClipboard.js b/ui/app/hooks/useCopyToClipboard.js new file mode 100644 index 000000000000..8d870d1b8cc0 --- /dev/null +++ b/ui/app/hooks/useCopyToClipboard.js @@ -0,0 +1,28 @@ +import { useState, useCallback } from 'react' +import copyToClipboard from 'copy-to-clipboard' +import { useTimeout } from './useTimeout' + +/** + * useCopyToClipboard + * + * @param {number} [delay=3000] - delay in ms + * + * @return {[boolean, Function]} + */ +const DEFAULT_DELAY = 3000 + +export function useCopyToClipboard (delay = DEFAULT_DELAY) { + const [copied, setCopied] = useState(false) + const startTimeout = useTimeout(() => setCopied(false), delay, false) + + const handleCopy = useCallback( + (text) => { + setCopied(true) + startTimeout() + copyToClipboard(text) + }, + [startTimeout], + ) + + return [copied, handleCopy] +} diff --git a/ui/app/hooks/useCurrencyDisplay.js b/ui/app/hooks/useCurrencyDisplay.js new file mode 100644 index 000000000000..4e2c99e3fdb5 --- /dev/null +++ b/ui/app/hooks/useCurrencyDisplay.js @@ -0,0 +1,65 @@ +import { useMemo } from 'react' +import { useSelector } from 'react-redux' +import { formatCurrency, getValueFromWeiHex } from '../helpers/utils/confirm-tx.util' +import { getCurrentCurrency, getConversionRate, getNativeCurrency } from '../selectors' + +/** + * Defines the shape of the options parameter for useCurrencyDisplay + * @typedef {Object} UseCurrencyOptions + * @property {string} [displayValue] - When present is used in lieu of formatting the inputValue + * @property {string} [prefix] - String to prepend to the final result + * @property {number} [numberOfDecimals] - Number of significant decimals to display + * @property {string} [denomination] - Denomination (wei, gwei) to convert to for display + * @property {string} [currency] - Currency type to convert to. Will override nativeCurrency + */ + +/** + * Defines the return shape of the second value in the tuple + * @typedef {Object} CurrencyDisplayParts + * @property {string} [prefix] - string to prepend to the value for display + * @property {string} value - string representing the value, formatted for display + * @property {string} [suffix] - string to append to the value for display + */ + +/** + * useCurrencyDisplay hook + * + * Given a hexadecimal encoded value string and an object of parameters used for formatting the + * display, produce both a fully formed string and the pieces of that string used for displaying + * the currency to the user + * @param {string} inputValue - The value to format for display + * @param {UseCurrencyOptions} opts - An object for options to format the inputValue + * @return {[string, CurrencyDisplayParts]} + */ +export function useCurrencyDisplay (inputValue, { displayValue, prefix, numberOfDecimals, denomination, currency, ...opts }) { + const currentCurrency = useSelector(getCurrentCurrency) + const nativeCurrency = useSelector(getNativeCurrency) + const conversionRate = useSelector(getConversionRate) + + const toCurrency = currency || currentCurrency + + const value = useMemo(() => { + if (displayValue) { + return displayValue + } + return formatCurrency( + getValueFromWeiHex({ + value: inputValue, + fromCurrency: nativeCurrency, + toCurrency, + conversionRate, + numberOfDecimals: numberOfDecimals || 2, + toDenomination: denomination, + }), + toCurrency, + ) + }, [inputValue, nativeCurrency, conversionRate, displayValue, numberOfDecimals, denomination, toCurrency]) + + let suffix + + if (!opts.hideLabel) { + suffix = opts.suffix || toCurrency.toUpperCase() + } + + return [`${prefix || ''}${value}${suffix ? ` ${suffix}` : ''}`, { prefix, value, suffix }] +} diff --git a/ui/app/hooks/useI18nContext.js b/ui/app/hooks/useI18nContext.js new file mode 100644 index 000000000000..819a85c7c6c2 --- /dev/null +++ b/ui/app/hooks/useI18nContext.js @@ -0,0 +1,13 @@ +import { useContext } from 'react' +import { I18nContext } from '../contexts/i18n' + +/** + * useI18ncContext + * + * A time saving shortcut to using useContext + I18ncontext in many + * different places. + * @return {Function} I18n function from contexts/I18n.js + */ +export function useI18nContext () { + return useContext(I18nContext) +} diff --git a/ui/app/hooks/useMethodData.js b/ui/app/hooks/useMethodData.js new file mode 100644 index 000000000000..c98060f6b0cd --- /dev/null +++ b/ui/app/hooks/useMethodData.js @@ -0,0 +1,30 @@ +import { useEffect, useCallback } from 'react' +import { useDispatch, useSelector } from 'react-redux' +import { getContractMethodData as getContractMethodDataAction } from '../store/actions' + +import { getKnownMethodData } from '../selectors/selectors' + +/** + * Access known method data and attempt to resolve unknown method data + * + * encapsulates an effect that will fetch methodData when the component mounts, + * and subsequently anytime the provided data attribute changes. Note that + * the getContractMethodData action handles over-fetching prevention, first checking + * if the data is in the store and returning it directly. While using this hook + * in multiple places in a tree for the same data will create extra event ticks and + * hit the action more frequently, it should only ever result in a single store update + * @param {string} data the transaction data to find method data for + * @return {Object} contract method data + */ +export function useMethodData (data) { + const dispatch = useDispatch() + const knownMethodData = useSelector((state) => getKnownMethodData(state, data)) + const getContractMethodData = useCallback((methodData) => dispatch(getContractMethodDataAction(methodData)), [dispatch]) + + useEffect(() => { + if (data) { + getContractMethodData(data) + } + }, [getContractMethodData, data]) + return knownMethodData +} diff --git a/ui/app/hooks/useMetricEvent.js b/ui/app/hooks/useMetricEvent.js new file mode 100644 index 000000000000..a701bd9334a9 --- /dev/null +++ b/ui/app/hooks/useMetricEvent.js @@ -0,0 +1,8 @@ +import { useContext, useCallback } from 'react' +import { MetaMetricsContext } from '../contexts/metametrics' + +export function useMetricEvent (config = {}, overrides = {}) { + const metricsEvent = useContext(MetaMetricsContext) + const trackEvent = useCallback(() => metricsEvent(config, overrides), [config, metricsEvent, overrides]) + return trackEvent +} diff --git a/ui/app/hooks/useRetryTransaction.js b/ui/app/hooks/useRetryTransaction.js new file mode 100644 index 000000000000..1f3ffe7011c9 --- /dev/null +++ b/ui/app/hooks/useRetryTransaction.js @@ -0,0 +1,50 @@ +import { useDispatch } from 'react-redux' +import { useCallback } from 'react' +import { showSidebar } from '../store/actions' +import { + fetchBasicGasAndTimeEstimates, + fetchGasEstimates, + setCustomGasPriceForRetry, + setCustomGasLimit, +} from '../ducks/gas/gas.duck' +import { increaseLastGasPrice } from '../helpers/utils/confirm-tx.util' +import { useMetricEvent } from './useMetricEvent' + +/** + * Provides a reusable hook that, given a transactionGroup, will return + * a method for beginning the retry process + * @param {Object} transactionGroup - the transaction group + * @return {Function} + */ +export function useRetryTransaction (transactionGroup) { + const { primaryTransaction, initialTransaction } = transactionGroup + // Signature requests do not have a txParams, but this hook is called indiscriminately + const gasPrice = primaryTransaction.txParams?.gasPrice + const trackMetricsEvent = useMetricEvent(({ + eventOpts: { + category: 'Navigation', + action: 'Activity Log', + name: 'Clicked "Speed Up"', + }, + })) + const dispatch = useDispatch() + + const retryTransaction = useCallback(async (event) => { + event.stopPropagation() + + trackMetricsEvent() + const basicEstimates = await dispatch(fetchBasicGasAndTimeEstimates) + await dispatch(fetchGasEstimates(basicEstimates.blockTime)) + const transaction = initialTransaction + const increasedGasPrice = increaseLastGasPrice(gasPrice) + dispatch(setCustomGasPriceForRetry(increasedGasPrice || transaction.txParams.gasPrice)) + dispatch(setCustomGasLimit(transaction.txParams.gas)) + dispatch(showSidebar({ + transitionName: 'sidebar-left', + type: 'customize-gas', + props: { transaction }, + })) + }, [dispatch, trackMetricsEvent, initialTransaction, gasPrice]) + + return retryTransaction +} diff --git a/ui/app/hooks/useShouldShowSpeedUp.js b/ui/app/hooks/useShouldShowSpeedUp.js new file mode 100644 index 000000000000..437c6cba24f3 --- /dev/null +++ b/ui/app/hooks/useShouldShowSpeedUp.js @@ -0,0 +1,46 @@ +import { useEffect, useState } from 'react' + +/** + * Evaluates whether the transaction is eligible to be sped up, and registers + * an effect to check the logic again after the transaction has surpassed 5 seconds + * of queue time. + * @param {Object} transactionGroup - the transaction group to check against + * @param {boolean} isEarliestNonce - Whether this group is currently the earliest nonce + */ +export function useShouldShowSpeedUp (transactionGroup, isEarliestNonce) { + const { transactions, hasRetried } = transactionGroup + const [earliestTransaction = {}] = transactions + const { submittedTime } = earliestTransaction + const [speedUpEnabled, setSpeedUpEnabled] = useState(() => { + return Date.now() - submittedTime > 5000 && isEarliestNonce && !hasRetried + }) + useEffect(() => { + // because this hook is optimized to only run on changes we have to + // key into the changing time delta between submittedTime and now() + // and if the status of the transaction changes based on that difference + // trigger a setState call to tell react to re-render. This effect will + // also immediately set retryEnabled and not create a timeout if the + // condition is already met. This effect will run anytime the variables + // for determining enabled status change + let timeoutId + if (!hasRetried && isEarliestNonce && !speedUpEnabled) { + if (Date.now() - submittedTime > 5000) { + setSpeedUpEnabled(true) + } else { + timeoutId = setTimeout(() => { + setSpeedUpEnabled(true) + clearTimeout(timeoutId) + }, 5001 - (Date.now() - submittedTime)) + } + } + // Anytime the effect is re-ran, make sure to remove a previously set timeout + // so as to avoid multiple timers potentially overlapping + return () => { + if (timeoutId) { + clearTimeout(timeoutId) + } + } + }, [submittedTime, speedUpEnabled, hasRetried, isEarliestNonce]) + + return speedUpEnabled +} diff --git a/ui/app/hooks/useTimeout.js b/ui/app/hooks/useTimeout.js new file mode 100644 index 000000000000..244e9a34cf5f --- /dev/null +++ b/ui/app/hooks/useTimeout.js @@ -0,0 +1,46 @@ +import { useState, useEffect, useRef, useCallback } from 'react' + +/** + * useTimeout + * + * @param {Function} cb - callback function inside setTimeout + * @param {number} delay - delay in ms + * @param {boolean} [immediate] - determines whether the timeout is invoked immediately + * + * @return {Function|undefined} + */ +export function useTimeout (cb, delay, immediate = true) { + const saveCb = useRef() + const [timeoutId, setTimeoutId] = useState(null) + + useEffect(() => { + saveCb.current = cb + }, [cb]) + + useEffect(() => { + if (timeoutId !== 'start') { + return undefined + } + + const id = setTimeout(() => { + saveCb.current() + }, delay) + + setTimeoutId(id) + + return () => { + clearTimeout(timeoutId) + } + }, [delay, timeoutId]) + + const startTimeout = useCallback(() => { + clearTimeout(timeoutId) + setTimeoutId('start') + }, [timeoutId]) + + if (immediate) { + startTimeout() + } + + return startTimeout +} diff --git a/ui/app/hooks/useTokenData.js b/ui/app/hooks/useTokenData.js new file mode 100644 index 000000000000..932a8752f540 --- /dev/null +++ b/ui/app/hooks/useTokenData.js @@ -0,0 +1,23 @@ +import { useMemo } from 'react' +import { getTokenData } from '../helpers/utils/transactions.util' + +/** + * useTokenData + * Given the data string from txParams return a decoded object of the details of the + * transaction data. + * @param {string} [transactionData] - Raw data string from token transaction + * @param {boolean} [isTokenTransaction] - Due to the nature of hooks, it isn't possible + * to conditionally call this hook. This flag will + * force this hook to return null if it set as false + * which indicates the transaction is not associated + * with a token. + * @return {Object} - Decoded token data + */ +export function useTokenData (transactionData, isTokenTransaction = true) { + return useMemo(() => { + if (!isTokenTransaction || !transactionData) { + return null + } + return getTokenData(transactionData) + }, [isTokenTransaction, transactionData]) +} diff --git a/ui/app/hooks/useTokenDisplayValue.js b/ui/app/hooks/useTokenDisplayValue.js new file mode 100644 index 000000000000..b7d92af7cb49 --- /dev/null +++ b/ui/app/hooks/useTokenDisplayValue.js @@ -0,0 +1,49 @@ +import { useMemo } from 'react' +import { getTokenValue, calcTokenAmount } from '../helpers/utils/token-util' +import { useTokenData } from './useTokenData' + +/** + * Defines the shape for the Token input parameter for useTokenDisplayValue + * @typedef {Object} Token + * @property {string} symbol - The string to use as a suffix for the token (eg. DAI) + * @property {number} decimals - The number of decimals to show when displaying this type of token + */ + +/** + * useTokenDisplayValue + * Given the data string from txParams and a token object with symbol and decimals, return + * a displayValue that represents a string representing that token amount as a string. Also + * return a tokenData object for downstream usage and the suffix for the token to use as props + * for other hooks and/or components + * @param {string} [transactionData] - Raw data string from token transaction + * @param {Token} [token] - The token associated with this transaction + * @param {boolean} [isTokenTransaction] - Due to the nature of hooks, it isn't possible + * to conditionally call this hook. This flag will + * force this hook to return null if it set as false + * which indicates the transaction is not associated + * with a token. + * @return {string} - The computed displayValue of the provided transactionData and token + */ +export function useTokenDisplayValue (transactionData, token, isTokenTransaction = true) { + const tokenData = useTokenData(transactionData, isTokenTransaction) + const shouldCalculateTokenValue = Boolean( + // If we are currently processing a token transaction + isTokenTransaction && + // and raw transaction data string is provided + transactionData && + // and a token object has been provided + token && + // and we are able to parse the token details from the raw data + tokenData?.params?.length, + ) + + const displayValue = useMemo(() => { + if (!shouldCalculateTokenValue) { + return null + } + const tokenValue = getTokenValue(tokenData.params) + return calcTokenAmount(tokenValue, token.decimals).toString() + }, [shouldCalculateTokenValue, tokenData, token]) + + return displayValue +} diff --git a/ui/app/hooks/useTokenFiatAmount.js b/ui/app/hooks/useTokenFiatAmount.js new file mode 100644 index 000000000000..b8b24da23ce2 --- /dev/null +++ b/ui/app/hooks/useTokenFiatAmount.js @@ -0,0 +1,38 @@ +import { useMemo } from 'react' +import { useSelector } from 'react-redux' +import { getTokenExchangeRates, getConversionRate, getCurrentCurrency, getShouldShowFiat } from '../selectors' +import { getFormattedTokenFiatAmount } from '../helpers/utils/token-util' + +/** + * Get the token balance converted to fiat and formatted for display + * + * @param {string} [tokenAddress] - The token address + * @param {string} [tokenAmount] - The token balance + * @param {string} [tokenSymbol] - The token symbol + * @return {string} - The formatted token amount in the user's chosen fiat currency + */ +export function useTokenFiatAmount (tokenAddress, tokenAmount, tokenSymbol) { + const contractExchangeRates = useSelector(getTokenExchangeRates) + const conversionRate = useSelector(getConversionRate) + const currentCurrency = useSelector(getCurrentCurrency) + const showFiat = useSelector(getShouldShowFiat) + + const tokenExchangeRate = contractExchangeRates[tokenAddress] + + const formattedFiat = useMemo( + () => getFormattedTokenFiatAmount( + tokenExchangeRate, + conversionRate, + currentCurrency, + tokenAmount, + tokenSymbol, + ), + [tokenExchangeRate, conversionRate, currentCurrency, tokenAmount, tokenSymbol], + ) + + if (!showFiat || currentCurrency.toUpperCase() === tokenSymbol) { + return undefined + } + + return formattedFiat +} diff --git a/ui/app/hooks/useTokenTracker.js b/ui/app/hooks/useTokenTracker.js new file mode 100644 index 000000000000..55a92273bfac --- /dev/null +++ b/ui/app/hooks/useTokenTracker.js @@ -0,0 +1,86 @@ +import { useState, useEffect, useRef, useCallback } from 'react' +import TokenTracker from '@metamask/eth-token-tracker' +import { useSelector } from 'react-redux' +import { getCurrentNetwork, getSelectedAddress } from '../selectors' + +export function useTokenTracker (tokens) { + const network = useSelector(getCurrentNetwork) + const userAddress = useSelector(getSelectedAddress) + + const [loading, setLoading] = useState(() => tokens?.length >= 0) + const [tokensWithBalances, setTokensWithBalances] = useState([]) + const [error, setError] = useState(null) + const tokenTracker = useRef(null) + + const updateBalances = useCallback((tokenWithBalances) => { + setTokensWithBalances(tokenWithBalances) + setLoading(false) + setError(null) + }, []) + + const showError = useCallback((err) => { + setError(err) + setLoading(false) + }, []) + + const teardownTracker = useCallback(() => { + if (tokenTracker.current) { + tokenTracker.current.stop() + tokenTracker.current.removeAllListeners('update') + tokenTracker.current.removeAllListeners('error') + tokenTracker.current = null + } + }, []) + + const buildTracker = useCallback((address, tokenList) => { + // clear out previous tracker, if it exists. + teardownTracker() + tokenTracker.current = new TokenTracker({ + userAddress: address, + provider: global.ethereumProvider, + tokens: tokenList, + pollingInterval: 8000, + }) + + tokenTracker.current.on('update', updateBalances) + tokenTracker.current.on('error', showError) + tokenTracker.current.updateBalances() + }, [updateBalances, showError, teardownTracker]) + + // Effect to remove the tracker when the component is removed from DOM + // Do not overload this effect with additional dependencies. teardownTracker + // is the only dependency here, which itself has no dependencies and will + // never update. The lack of dependencies that change is what confirms + // that this effect only runs on mount/unmount + useEffect(() => { + return teardownTracker + }, [teardownTracker]) + + // Effect to set loading state and initialize tracker when values change + useEffect(() => { + // This effect will only run initially and when: + // 1. network is updated, + // 2. userAddress is changed, + // 3. token list is updated and not equal to previous list + // in any of these scenarios, we should indicate to the user that their token + // values are in the process of updating by setting loading state. + setLoading(true) + + if (!userAddress || network === 'loading' || !global.ethereumProvider) { + // If we do not have enough information to build a TokenTracker, we exit early + // When the values above change, the effect will be restarted. We also teardown + // tracker because inevitably this effect will run again momentarily. + teardownTracker() + return + } + + if (tokens.length === 0) { + // sets loading state to false and token list to empty + updateBalances([]) + } + + buildTracker(userAddress, tokens) + }, [userAddress, teardownTracker, network, tokens, updateBalances, buildTracker]) + + return { loading, tokensWithBalances, error } +} diff --git a/ui/app/hooks/useTransactionDisplayData.js b/ui/app/hooks/useTransactionDisplayData.js new file mode 100644 index 000000000000..3793299f5bf4 --- /dev/null +++ b/ui/app/hooks/useTransactionDisplayData.js @@ -0,0 +1,163 @@ +import { useSelector } from 'react-redux' +import { getKnownMethodData } from '../selectors/selectors' +import { getTransactionActionKey, getStatusKey } from '../helpers/utils/transactions.util' +import { camelCaseToCapitalize } from '../helpers/utils/common.util' +import { PRIMARY, SECONDARY } from '../helpers/constants/common' +import { getTokenToAddress } from '../helpers/utils/token-util' +import { formatDateWithYearContext, shortenAddress, stripHttpSchemes } from '../helpers/utils/util' +import { + CONTRACT_INTERACTION_KEY, + DEPLOY_CONTRACT_ACTION_KEY, + INCOMING_TRANSACTION, + TOKEN_METHOD_TRANSFER, + TOKEN_METHOD_TRANSFER_FROM, + SEND_ETHER_ACTION_KEY, + TRANSACTION_CATEGORY_APPROVAL, + TRANSACTION_CATEGORY_INTERACTION, + TRANSACTION_CATEGORY_RECEIVE, + TRANSACTION_CATEGORY_SEND, + TRANSACTION_CATEGORY_SIGNATURE_REQUEST, + TOKEN_METHOD_APPROVE, + PENDING_STATUS_HASH, + TOKEN_CATEGORY_HASH, +} from '../helpers/constants/transactions' +import { getTokens } from '../ducks/metamask/metamask' +import { useI18nContext } from './useI18nContext' +import { useTokenFiatAmount } from './useTokenFiatAmount' +import { useUserPreferencedCurrency } from './useUserPreferencedCurrency' +import { useCurrencyDisplay } from './useCurrencyDisplay' +import { useTokenDisplayValue } from './useTokenDisplayValue' +import { useTokenData } from './useTokenData' + +/** + * @typedef {Object} TransactionDisplayData + * @property {string} title - primary description of the transaction + * @property {string} subtitle - supporting text describing the transaction + * @property {bool} subtitleContainsOrigin - true if the subtitle includes the origin of the tx + * @property {string} category - the transaction category + * @property {string} primaryCurrency - the currency string to display in the primary position + * @property {string} [secondaryCurrency] - the currency string to display in the secondary position + * @property {string} status - the status of the transaction + * @property {string} senderAddress - the Ethereum address of the sender + * @property {string} recipientAddress - the Ethereum address of the recipient + */ + +/** + * Get computed values used for displaying transaction data to a user + * + * The goal of this method is to perform all of the necessary computation and + * state access required to take a transactionGroup and derive from it a shape + * of data that can power all views related to a transaction. Presently the main + * case is for shared logic between transaction-list-item and transaction-detail-view + * @param {Object} transactionGroup group of transactions + * @return {TransactionDisplayData} + */ +export function useTransactionDisplayData (transactionGroup) { + const knownTokens = useSelector(getTokens) + const t = useI18nContext() + const { initialTransaction, primaryTransaction } = transactionGroup + // initialTransaction contains the data we need to derive the primary purpose of this transaction group + const { transactionCategory } = initialTransaction + + const { from: senderAddress, to } = initialTransaction.txParams || {} + + // for smart contract interactions, methodData can be used to derive the name of the action being taken + const methodData = useSelector((state) => getKnownMethodData(state, initialTransaction?.txParams?.data)) || {} + + const actionKey = getTransactionActionKey(initialTransaction) + const status = getStatusKey(primaryTransaction) + + const primaryValue = primaryTransaction.txParams?.value + let prefix = '-' + const date = formatDateWithYearContext(initialTransaction.time || 0) + let subtitle + let subtitleContainsOrigin = false + let recipientAddress = to + + // This value is used to determine whether we should look inside txParams.data + // to pull out and render token related information + const isTokenCategory = TOKEN_CATEGORY_HASH[transactionCategory] + + // these values are always instantiated because they are either + // used by or returned from hooks. Hooks must be called at the top level, + // so as an additional safeguard against inappropriately associating token + // transfers, we pass an additional argument to these hooks that will be + // false for non-token transactions. This additional argument forces the + // hook to return null + const token = isTokenCategory && knownTokens.find(({ address }) => address === recipientAddress) + const tokenData = useTokenData(initialTransaction?.txParams?.data, isTokenCategory) + const tokenDisplayValue = useTokenDisplayValue(initialTransaction?.txParams?.data, token, isTokenCategory) + const tokenFiatAmount = useTokenFiatAmount(token?.address, tokenDisplayValue, token?.symbol) + + const origin = stripHttpSchemes(initialTransaction.origin || initialTransaction.msgParams?.origin || '') + + let category + let title + // There are four types of transaction entries that are currently differentiated in the design + // 1. signature request + // 2. Send (sendEth sendTokens) + // 3. Deposit + // 4. Site interaction + // 5. Approval + if (transactionCategory === null || transactionCategory === undefined) { + category = TRANSACTION_CATEGORY_SIGNATURE_REQUEST + title = t('signatureRequest') + subtitle = origin + subtitleContainsOrigin = true + } else if (transactionCategory === TOKEN_METHOD_APPROVE) { + category = TRANSACTION_CATEGORY_APPROVAL + title = t('approveSpendLimit', [token?.symbol || t('token')]) + subtitle = origin + subtitleContainsOrigin = true + } else if (transactionCategory === DEPLOY_CONTRACT_ACTION_KEY || transactionCategory === CONTRACT_INTERACTION_KEY) { + category = TRANSACTION_CATEGORY_INTERACTION + title = (methodData?.name && camelCaseToCapitalize(methodData.name)) || (actionKey && t(actionKey)) || '' + subtitle = origin + subtitleContainsOrigin = true + } else if (transactionCategory === INCOMING_TRANSACTION) { + category = TRANSACTION_CATEGORY_RECEIVE + title = t('receive') + prefix = '' + subtitle = t('fromAddress', [shortenAddress(senderAddress)]) + } else if (transactionCategory === TOKEN_METHOD_TRANSFER_FROM || transactionCategory === TOKEN_METHOD_TRANSFER) { + category = TRANSACTION_CATEGORY_SEND + title = t('sendSpecifiedTokens', [token?.symbol || t('token')]) + recipientAddress = getTokenToAddress(tokenData.params) + subtitle = t('toAddress', [shortenAddress(recipientAddress)]) + } else if (transactionCategory === SEND_ETHER_ACTION_KEY) { + category = TRANSACTION_CATEGORY_SEND + title = t('sendETH') + subtitle = t('toAddress', [shortenAddress(recipientAddress)]) + } + + const primaryCurrencyPreferences = useUserPreferencedCurrency(PRIMARY) + const secondaryCurrencyPreferences = useUserPreferencedCurrency(SECONDARY) + + const [primaryCurrency] = useCurrencyDisplay(primaryValue, { + prefix, + displayValue: isTokenCategory ? tokenDisplayValue : undefined, + suffix: isTokenCategory ? token?.symbol : undefined, + ...primaryCurrencyPreferences, + }) + + const [secondaryCurrency] = useCurrencyDisplay(primaryValue, { + prefix, + displayValue: isTokenCategory ? tokenFiatAmount : undefined, + hideLabel: isTokenCategory ? true : undefined, + ...secondaryCurrencyPreferences, + }) + + return { + title, + category, + date, + subtitle, + subtitleContainsOrigin, + primaryCurrency, + senderAddress, + recipientAddress, + secondaryCurrency: isTokenCategory && !tokenFiatAmount ? undefined : secondaryCurrency, + status, + isPending: status in PENDING_STATUS_HASH, + } +} diff --git a/ui/app/hooks/useTransactionTimeRemaining.js b/ui/app/hooks/useTransactionTimeRemaining.js new file mode 100644 index 000000000000..10ac8545f138 --- /dev/null +++ b/ui/app/hooks/useTransactionTimeRemaining.js @@ -0,0 +1,104 @@ +import { useSelector } from 'react-redux' +import { useRef, useEffect, useState, useMemo } from 'react' +import { isEqual } from 'lodash' +import { captureException } from '@sentry/browser' +import { hexWEIToDecGWEI } from '../helpers/utils/conversions.util' +import { getEstimatedGasPrices, getEstimatedGasTimes, getFeatureFlags, getIsMainnet } from '../selectors' +import { getRawTimeEstimateData } from '../helpers/utils/gas-time-estimates.util' +import { getCurrentLocale } from '../ducks/metamask/metamask' + +/** + * Calculate the number of minutes remaining until the transaction completes. + * @param {number} initialTimeEstimate - timestamp for the projected completion time + * @param {number} submittedTime - timestamp of when the tx was submitted + * @return {number} minutes remaining + */ +function calcTransactionTimeRemaining (initialTimeEstimate, submittedTime) { + const currentTime = (new Date()).getTime() + const timeElapsedSinceSubmission = (currentTime - submittedTime) / 1000 + const timeRemainingOnEstimate = initialTimeEstimate - timeElapsedSinceSubmission + + const renderingTimeRemainingEstimate = Math.round(timeRemainingOnEstimate / 60) + return renderingTimeRemainingEstimate +} + +/** + * returns a string representing the number of minutes predicted for the transaction to be + * completed. Only returns this prediction if the transaction is the earliest pending + * transaction, and the feature flag for showing timing is enabled. + * @param {bool} isPending - is the transaction currently pending + * @param {bool} isEarliestNonce - is this transaction the earliest nonce in list + * @param {number} submittedTime - the timestamp for when the transaction was submitted + * @param {number} currentGasPrice - gas price to use for calculation of time + * @returns {string | undefined} i18n formatted string if applicable + */ +export function useTransactionTimeRemaining ( + isPending, + isEarliestNonce, + submittedTime, + currentGasPrice, +) { + // the following two selectors return the result of mapping over an array, as such they + // will always be new objects and trigger effects. To avoid this, we use isEqual as the + // equalityFn to only update when the data is new. + const gasPrices = useSelector(getEstimatedGasPrices, isEqual) + const estimatedTimes = useSelector(getEstimatedGasTimes, isEqual) + const locale = useSelector(getCurrentLocale) + const isMainNet = useSelector(getIsMainnet) + const interval = useRef() + const [timeRemaining, setTimeRemaining] = useState(null) + const featureFlags = useSelector(getFeatureFlags) + const transactionTimeFeatureActive = featureFlags?.transactionTime + + const rtf = new Intl.RelativeTimeFormat(locale.replace('_', '-'), { numeric: 'auto', style: 'narrow' }) + + // Memoize this value so it can be used as a dependency in the effect below + const initialTimeEstimate = useMemo(() => { + const customGasPrice = Number(hexWEIToDecGWEI(currentGasPrice)) + try { + const { + newTimeEstimate, + } = getRawTimeEstimateData(customGasPrice, gasPrices, estimatedTimes) + return newTimeEstimate + } catch (error) { + captureException(error) + return NaN + } + }, [currentGasPrice, gasPrices, estimatedTimes]) + + useEffect(() => { + if ( + isMainNet && + transactionTimeFeatureActive && + isPending && + isEarliestNonce && + !isNaN(initialTimeEstimate) + ) { + clearInterval(interval.current) + setTimeRemaining( + calcTransactionTimeRemaining(initialTimeEstimate, submittedTime), + ) + interval.current = setInterval(() => { + setTimeRemaining( + calcTransactionTimeRemaining(initialTimeEstimate, submittedTime), + ) + }, 10000) + return () => clearInterval(interval.current) + } + return undefined + }, [ + isMainNet, + transactionTimeFeatureActive, + isEarliestNonce, + isPending, + submittedTime, + initialTimeEstimate, + ]) + + // there are numerous checks to determine if time should be displayed. + // if any of the following are true, the timeRemaining will be null + // User is currently not on the mainnet + // User does not have the transactionTime feature flag enabled + // The transaction is not pending, or isn't the earliest nonce + return timeRemaining ? rtf.format(timeRemaining, 'minute') : undefined +} diff --git a/ui/app/hooks/useUserPreferencedCurrency.js b/ui/app/hooks/useUserPreferencedCurrency.js new file mode 100644 index 000000000000..986ef6dd7d2a --- /dev/null +++ b/ui/app/hooks/useUserPreferencedCurrency.js @@ -0,0 +1,52 @@ +import { useSelector } from 'react-redux' +import { getPreferences, getShouldShowFiat, getNativeCurrency } from '../selectors' +import { PRIMARY, SECONDARY, ETH } from '../helpers/constants/common' + +/** + * Defines the shape of the options parameter for useUserPreferencedCurrency + * @typedef {Object} UseUserPreferencedCurrencyOptions + * @property {number} [numberOfDecimals] - Number of significant decimals to display + * @property {number} [ethNumberOfDecimals] - Number of significant decimals to display + * when using ETH + * @property {number} [fiatNumberOfDecimals] - Number of significant decimals to display + * when using fiat + */ + +/** + * Defines the return shape of useUserPreferencedCurrency + * @typedef {Object} UserPreferredCurrency + * @property {string} currency - the currency type to use (eg: 'ETH', 'usd') + * @property {number} numberOfDecimals - Number of significant decimals to display + */ + +/** + * useUserPreferencedCurrency + * + * returns an object that contains what currency to use for displaying values based + * on the user's preference settings, as well as the significant number of decimals + * to display based on the currency + * @param {"PRIMARY" | "SECONDARY"} type - what display type is being rendered + * @param {UseUserPreferencedCurrencyOptions} opts - options to override default values + * @return {UserPreferredCurrency} + */ +export function useUserPreferencedCurrency (type, opts = {}) { + const nativeCurrency = useSelector(getNativeCurrency) + const { + useNativeCurrencyAsPrimaryCurrency, + } = useSelector(getPreferences) + const showFiat = useSelector(getShouldShowFiat) + + let currency, numberOfDecimals + if (!showFiat || (type === PRIMARY && useNativeCurrencyAsPrimaryCurrency) || + (type === SECONDARY && !useNativeCurrencyAsPrimaryCurrency)) { + // Display ETH + currency = nativeCurrency || ETH + numberOfDecimals = opts.numberOfDecimals || opts.ethNumberOfDecimals || 6 + } else if ((type === SECONDARY && useNativeCurrencyAsPrimaryCurrency) || + (type === PRIMARY && !useNativeCurrencyAsPrimaryCurrency)) { + // Display Fiat + numberOfDecimals = opts.numberOfDecimals || opts.fiatNumberOfDecimals || 2 + } + + return { currency, numberOfDecimals } +} diff --git a/ui/app/pages/add-token/add-token.component.js b/ui/app/pages/add-token/add-token.component.js index 40c1ff7fd321..48e306fc8768 100644 --- a/ui/app/pages/add-token/add-token.component.js +++ b/ui/app/pages/add-token/add-token.component.js @@ -1,18 +1,16 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' import ethUtil from 'ethereumjs-util' -import { checkExistingAddresses } from './util' +import { checkExistingAddresses } from '../../helpers/utils/util' import { tokenInfoGetter } from '../../helpers/utils/token-util' -import { DEFAULT_ROUTE, CONFIRM_ADD_TOKEN_ROUTE } from '../../helpers/constants/routes' +import { CONFIRM_ADD_TOKEN_ROUTE } from '../../helpers/constants/routes' import TextField from '../../components/ui/text-field' -import TokenList from './token-list' -import TokenSearch from './token-search' import PageContainer from '../../components/ui/page-container' import { Tabs, Tab } from '../../components/ui/tabs' +import TokenList from './token-list' +import TokenSearch from './token-search' const emptyAddr = '0x0000000000000000000000000000000000000000' -const SEARCH_TAB = 'SEARCH' -const CUSTOM_TOKEN_TAB = 'CUSTOM_TOKEN' class AddToken extends Component { static contextTypes = { @@ -26,25 +24,21 @@ class AddToken extends Component { clearPendingTokens: PropTypes.func, tokens: PropTypes.array, identities: PropTypes.object, + mostRecentOverviewPage: PropTypes.string.isRequired, } - constructor (props) { - super(props) - - this.state = { - customAddress: '', - customSymbol: '', - customDecimals: 0, - searchResults: [], - selectedTokens: {}, - tokenSelectorError: null, - customAddressError: null, - customSymbolError: null, - customDecimalsError: null, - autoFilled: false, - displayedTab: SEARCH_TAB, - forceEditSymbol: false, - } + state = { + customAddress: '', + customSymbol: '', + customDecimals: 0, + searchResults: [], + selectedTokens: {}, + tokenSelectorError: null, + customAddressError: null, + customSymbolError: null, + customDecimalsError: null, + autoFilled: false, + forceEditSymbol: false, } componentDidMount () { @@ -56,7 +50,7 @@ class AddToken extends Component { let selectedTokens = {} let customToken = {} - pendingTokenKeys.forEach(tokenAddress => { + pendingTokenKeys.forEach((tokenAddress) => { const token = pendingTokens[tokenAddress] const { isCustom } = token @@ -73,8 +67,7 @@ class AddToken extends Component { decimals: customDecimals = 0, } = customToken - const displayedTab = Object.keys(selectedTokens).length > 0 ? SEARCH_TAB : CUSTOM_TOKEN_TAB - this.setState({ selectedTokens, customAddress, customSymbol, customDecimals, displayedTab }) + this.setState({ selectedTokens, customAddress, customSymbol, customDecimals }) } } @@ -236,7 +229,7 @@ class AddToken extends Component { label={this.context.t('tokenContractAddress')} type="text" value={customAddress} - onChange={e => this.handleCustomAddressChange(e.target.value)} + onChange={(e) => this.handleCustomAddressChange(e.target.value)} error={customAddressError} fullWidth margin="normal" @@ -260,7 +253,7 @@ class AddToken extends Component { )} type="text" value={customSymbol} - onChange={e => this.handleCustomSymbolChange(e.target.value)} + onChange={(e) => this.handleCustomSymbolChange(e.target.value)} error={customSymbolError} fullWidth margin="normal" @@ -271,7 +264,7 @@ class AddToken extends Component { label={this.context.t('decimal')} type="number" value={customDecimals} - onChange={e => this.handleCustomDecimalsChange(e.target.value)} + onChange={(e) => this.handleCustomDecimalsChange(e.target.value)} error={customDecimalsError} fullWidth margin="normal" @@ -294,7 +287,7 @@ class AddToken extends Component { this.handleToggleToken(token)} + onToggleToken={(token) => this.handleToggleToken(token)} />
    @@ -315,17 +308,17 @@ class AddToken extends Component { } render () { - const { history, clearPendingTokens } = this.props + const { history, clearPendingTokens, mostRecentOverviewPage } = this.props return ( this.handleNext()} - disabled={this.hasError() || !this.hasSelected()} + disabled={Boolean(this.hasError()) || !this.hasSelected()} onCancel={() => { clearPendingTokens() - history.push(DEFAULT_ROUTE) + history.push(mostRecentOverviewPage) }} /> ) diff --git a/ui/app/pages/add-token/add-token.container.js b/ui/app/pages/add-token/add-token.container.js index eee16dfc789e..9f3f6d21ede5 100644 --- a/ui/app/pages/add-token/add-token.container.js +++ b/ui/app/pages/add-token/add-token.container.js @@ -1,20 +1,22 @@ import { connect } from 'react-redux' -import AddToken from './add-token.component' -const { setPendingTokens, clearPendingTokens } = require('../../store/actions') +import { setPendingTokens, clearPendingTokens } from '../../store/actions' +import { getMostRecentOverviewPage } from '../../ducks/history/history' +import AddToken from './add-token.component' -const mapStateToProps = ({ metamask }) => { - const { identities, tokens, pendingTokens } = metamask +const mapStateToProps = (state) => { + const { metamask: { identities, tokens, pendingTokens } } = state return { identities, + mostRecentOverviewPage: getMostRecentOverviewPage(state), tokens, pendingTokens, } } -const mapDispatchToProps = dispatch => { +const mapDispatchToProps = (dispatch) => { return { - setPendingTokens: tokens => dispatch(setPendingTokens(tokens)), + setPendingTokens: (tokens) => dispatch(setPendingTokens(tokens)), clearPendingTokens: () => dispatch(clearPendingTokens()), } } diff --git a/ui/app/pages/add-token/index.js b/ui/app/pages/add-token/index.js index 3666cae8207a..ab78bb05d833 100644 --- a/ui/app/pages/add-token/index.js +++ b/ui/app/pages/add-token/index.js @@ -1,2 +1,3 @@ import AddToken from './add-token.container' -module.exports = AddToken + +export default AddToken diff --git a/ui/app/pages/add-token/index.scss b/ui/app/pages/add-token/index.scss index ef6802f9635f..5060a6348b96 100644 --- a/ui/app/pages/add-token/index.scss +++ b/ui/app/pages/add-token/index.scss @@ -24,7 +24,6 @@ } &__custom-symbol { - &__label-wrapper { display: flex; flex-flow: row nowrap; @@ -37,7 +36,7 @@ &__edit { flex: 1 1 auto; text-align: right; - color: $curious-blue; + color: $primary-blue; padding-right: 4px; cursor: pointer; } diff --git a/ui/app/pages/add-token/tests/add-token.test.js b/ui/app/pages/add-token/tests/add-token.test.js new file mode 100644 index 000000000000..8138845e78e3 --- /dev/null +++ b/ui/app/pages/add-token/tests/add-token.test.js @@ -0,0 +1,96 @@ +import assert from 'assert' +import React from 'react' +import { Provider } from 'react-redux' +import sinon from 'sinon' +import configureMockStore from 'redux-mock-store' +import { mountWithRouter } from '../../../../../test/lib/render-helpers' +import AddToken from '..' + +describe('Add Token', function () { + let wrapper + + const state = { + metamask: { + tokens: [], + }, + } + + const store = configureMockStore()(state) + + const props = { + history: { + push: sinon.stub().callsFake(() => undefined), + }, + setPendingTokens: sinon.spy(), + clearPendingTokens: sinon.spy(), + tokens: [], + identities: {}, + mostRecentOverviewPage: '/', + } + + describe('Add Token', function () { + before(function () { + wrapper = mountWithRouter( + + + , store, + ) + + wrapper.find({ name: 'customToken' }).simulate('click') + }) + + afterEach(function () { + props.history.push.reset() + }) + + it('next button is disabled when no fields are populated', function () { + const nextButton = wrapper.find('.button.btn-secondary.page-container__footer-button') + + assert.equal(nextButton.props().disabled, true) + }) + + it('edits token address', function () { + const tokenAddress = '0x617b3f8050a0BD94b6b1da02B4384eE5B4DF13F4' + const event = { target: { value: tokenAddress } } + const customAddress = wrapper.find('input#custom-address') + + customAddress.simulate('change', event) + assert.equal(wrapper.find('AddToken').instance().state.customAddress, tokenAddress) + }) + + it('edits token symbol', function () { + const tokenSymbol = 'META' + const event = { target: { value: tokenSymbol } } + const customAddress = wrapper.find('#custom-symbol') + customAddress.last().simulate('change', event) + + assert.equal(wrapper.find('AddToken').instance().state.customSymbol, tokenSymbol) + }) + + it('edits token decimal precision', function () { + const tokenPrecision = '2' + const event = { target: { value: tokenPrecision } } + const customAddress = wrapper.find('#custom-decimals') + customAddress.last().simulate('change', event) + + assert.equal(wrapper.find('AddToken').instance().state.customDecimals, tokenPrecision) + }) + + it('next', function () { + const nextButton = wrapper.find('.button.btn-secondary.page-container__footer-button') + nextButton.simulate('click') + + assert(props.setPendingTokens.calledOnce) + assert(props.history.push.calledOnce) + assert.equal(props.history.push.getCall(0).args[0], '/confirm-add-token') + }) + + it('cancels', function () { + const cancelButton = wrapper.find('button.btn-default.page-container__footer-button') + cancelButton.simulate('click') + + assert(props.clearPendingTokens.calledOnce) + assert.equal(props.history.push.getCall(0).args[0], '/') + }) + }) +}) diff --git a/ui/app/pages/add-token/token-list/index.js b/ui/app/pages/add-token/token-list/index.js index 21dd5ac7201c..6174857284df 100644 --- a/ui/app/pages/add-token/token-list/index.js +++ b/ui/app/pages/add-token/token-list/index.js @@ -1,2 +1,3 @@ import TokenList from './token-list.container' -module.exports = TokenList + +export default TokenList diff --git a/ui/app/pages/add-token/token-list/index.scss b/ui/app/pages/add-token/token-list/index.scss index b7787a18e5d7..165b175f368a 100644 --- a/ui/app/pages/add-token/token-list/index.scss +++ b/ui/app/pages/add-token/token-list/index.scss @@ -2,7 +2,7 @@ .token-list { &__title { - font-size: .75rem; + font-size: 0.75rem; } &__tokens-container { @@ -24,7 +24,7 @@ position: relative; &:hover { - border: 2px solid rgba($malibu-blue, .5); + border: 2px solid rgba($malibu-blue, 0.5); } &--selected { @@ -32,7 +32,7 @@ } &--disabled { - opacity: .4; + opacity: 0.4; pointer-events: none; } } @@ -45,7 +45,7 @@ background-position: center; border-radius: 50%; background-color: $white; - box-shadow: 0 2px 4px 0 rgba($black, .24); + box-shadow: 0 2px 4px 0 rgba($black, 0.24); margin-right: 12px; flex: 0 0 auto; } @@ -58,6 +58,8 @@ } &__token-name { + /*rtl:ignore*/ + direction: ltr; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; diff --git a/ui/app/pages/add-token/token-list/token-list-placeholder/index.js b/ui/app/pages/add-token/token-list/token-list-placeholder/index.js index b82f45e93aa2..395e7b077f67 100644 --- a/ui/app/pages/add-token/token-list/token-list-placeholder/index.js +++ b/ui/app/pages/add-token/token-list/token-list-placeholder/index.js @@ -1,2 +1,3 @@ import TokenListPlaceholder from './token-list-placeholder.component' -module.exports = TokenListPlaceholder + +export default TokenListPlaceholder diff --git a/ui/app/pages/add-token/token-list/token-list-placeholder/index.scss b/ui/app/pages/add-token/token-list/token-list-placeholder/index.scss index a363c77c5c99..aa6d0a0e9eb4 100644 --- a/ui/app/pages/add-token/token-list/token-list-placeholder/index.scss +++ b/ui/app/pages/add-token/token-list/token-list-placeholder/index.scss @@ -4,7 +4,7 @@ padding-top: 36px; flex-direction: column; line-height: 22px; - opacity: .5; + opacity: 0.5; &__text { color: $silver-chalice; @@ -18,7 +18,6 @@ } &__link { - @extend %link; - margin-top: .5rem; + margin-top: 0.5rem; } } diff --git a/ui/app/pages/add-token/token-list/token-list-placeholder/token-list-placeholder.component.js b/ui/app/pages/add-token/token-list/token-list-placeholder/token-list-placeholder.component.js index 20f5509276d7..ae14581e8335 100644 --- a/ui/app/pages/add-token/token-list/token-list-placeholder/token-list-placeholder.component.js +++ b/ui/app/pages/add-token/token-list/token-list-placeholder/token-list-placeholder.component.js @@ -1,5 +1,6 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' +import Button from '../../../../components/ui/button' export default class TokenListPlaceholder extends Component { static contextTypes = { @@ -13,14 +14,15 @@ export default class TokenListPlaceholder extends Component {
    { this.context.t('addAcquiredTokens') }
    - { this.context.t('learnMore') } - +
  • ) } diff --git a/ui/app/pages/add-token/token-list/token-list.component.js b/ui/app/pages/add-token/token-list/token-list.component.js index 724a68d6eb6d..633ffea9c52c 100644 --- a/ui/app/pages/add-token/token-list/token-list.component.js +++ b/ui/app/pages/add-token/token-list/token-list.component.js @@ -1,7 +1,7 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' import classnames from 'classnames' -import { checkExistingAddresses } from '../util' +import { checkExistingAddresses } from '../../../helpers/utils/util' import TokenListPlaceholder from './token-list-placeholder' export default class InfoBox extends Component { @@ -44,7 +44,8 @@ export default class InfoBox extends Component { >
    + style={{ backgroundImage: logo && `url(images/contract/${logo})` }} + >
    { `${name} (${symbol})` } diff --git a/ui/app/pages/add-token/token-search/index.js b/ui/app/pages/add-token/token-search/index.js index acaa6b0840d4..bec39b3cf7d7 100644 --- a/ui/app/pages/add-token/token-search/index.js +++ b/ui/app/pages/add-token/token-search/index.js @@ -1,2 +1,3 @@ import TokenSearch from './token-search.component' -module.exports = TokenSearch + +export default TokenSearch diff --git a/ui/app/pages/add-token/token-search/token-search.component.js b/ui/app/pages/add-token/token-search/token-search.component.js index 5542a19ff438..460c7f15fc49 100644 --- a/ui/app/pages/add-token/token-search/token-search.component.js +++ b/ui/app/pages/add-token/token-search/token-search.component.js @@ -6,8 +6,8 @@ import InputAdornment from '@material-ui/core/InputAdornment' import TextField from '../../../components/ui/text-field' const contractList = Object.entries(contractMap) - .map(([ _, tokenData]) => tokenData) - .filter(tokenData => Boolean(tokenData.erc20)) + .map(([address, tokenData]) => ({ ...tokenData, address })) + .filter((tokenData) => Boolean(tokenData.erc20)) const fuse = new Fuse(contractList, { shouldSort: true, @@ -36,18 +36,14 @@ export default class TokenSearch extends Component { error: PropTypes.string, } - constructor (props) { - super(props) - - this.state = { - searchQuery: '', - } + state = { + searchQuery: '', } handleSearch (searchQuery) { this.setState({ searchQuery }) const fuseSearchResult = fuse.search(searchQuery) - const addressSearchResult = contractList.filter(token => { + const addressSearchResult = contractList.filter((token) => { return token.address.toLowerCase() === searchQuery.toLowerCase() }) const results = [...addressSearchResult, ...fuseSearchResult] @@ -75,7 +71,7 @@ export default class TokenSearch extends Component { placeholder={this.context.t('searchTokens')} type="text" value={searchQuery} - onChange={e => this.handleSearch(e.target.value)} + onChange={(e) => this.handleSearch(e.target.value)} error={error} fullWidth startAdornment={this.renderAdornment()} diff --git a/ui/app/pages/add-token/util.js b/ui/app/pages/add-token/util.js deleted file mode 100644 index 579c56cc0386..000000000000 --- a/ui/app/pages/add-token/util.js +++ /dev/null @@ -1,13 +0,0 @@ -import R from 'ramda' - -export function checkExistingAddresses (address, tokenList = []) { - if (!address) { - return false - } - - const matchesAddress = existingToken => { - return existingToken.address.toLowerCase() === address.toLowerCase() - } - - return R.any(matchesAddress)(tokenList) -} diff --git a/ui/app/pages/asset/asset.js b/ui/app/pages/asset/asset.js new file mode 100644 index 000000000000..fa9479eb0cb0 --- /dev/null +++ b/ui/app/pages/asset/asset.js @@ -0,0 +1,32 @@ +import React from 'react' +import { useSelector } from 'react-redux' +import { Redirect, useParams } from 'react-router-dom' +import { getTokens } from '../../ducks/metamask/metamask' +import { DEFAULT_ROUTE } from '../../helpers/constants/routes' + +import NativeAsset from './components/native-asset' +import TokenAsset from './components/token-asset' + +const Asset = () => { + const nativeCurrency = useSelector((state) => state.metamask.nativeCurrency) + const tokens = useSelector(getTokens) + const { asset } = useParams() + + const token = tokens.find(({ address }) => address === asset) + + let content + if (token) { + content = + } else if (asset === nativeCurrency) { + content = + } else { + content = + } + return ( +
    + { content } +
    + ) +} + +export default Asset diff --git a/ui/app/pages/asset/asset.scss b/ui/app/pages/asset/asset.scss new file mode 100644 index 000000000000..4445cb67e0c9 --- /dev/null +++ b/ui/app/pages/asset/asset.scss @@ -0,0 +1,45 @@ +.asset { + &__container { + background-color: white; + } + + &__overview { + box-shadow: 0 3px 4px rgba(135, 134, 134, 0.16); + } +} + +.asset-navigation { + display: flex; + justify-content: space-between; + align-items: center; + padding: 16px; + height: 54px; +} + +.asset-breadcrumb { + font-size: 14px; + color: $Black-100; + background-color: inherit; + + &__chevron { + padding: 0 10px 0 2px; + font-size: 16px; + } + + &__asset { + font-weight: bold; + } +} + +.token-options { + &__button { + font-size: 20px; + color: $Black-100; + background-color: inherit; + padding: 2px 8px; + } + + &__icon { + font-size: 16px; + } +} diff --git a/ui/app/pages/asset/components/asset-breadcrumb.js b/ui/app/pages/asset/components/asset-breadcrumb.js new file mode 100644 index 000000000000..136fec6b03f6 --- /dev/null +++ b/ui/app/pages/asset/components/asset-breadcrumb.js @@ -0,0 +1,25 @@ +import React from 'react' +import PropTypes from 'prop-types' + +const AssetBreadcrumb = ({ accountName, assetName, onBack }) => { + return ( + + ) +} + +AssetBreadcrumb.propTypes = { + accountName: PropTypes.string.isRequired, + assetName: PropTypes.string.isRequired, + onBack: PropTypes.func.isRequired, +} + +export default AssetBreadcrumb diff --git a/ui/app/pages/asset/components/asset-navigation.js b/ui/app/pages/asset/components/asset-navigation.js new file mode 100644 index 000000000000..5423b1094d1f --- /dev/null +++ b/ui/app/pages/asset/components/asset-navigation.js @@ -0,0 +1,26 @@ +import React from 'react' +import PropTypes from 'prop-types' + +import AssetBreadcrumb from './asset-breadcrumb' + +const AssetNavigation = ({ accountName, assetName, onBack, optionsButton }) => { + return ( +
    + + { optionsButton } +
    + ) +} + +AssetNavigation.propTypes = { + accountName: PropTypes.string.isRequired, + assetName: PropTypes.string.isRequired, + onBack: PropTypes.func.isRequired, + optionsButton: PropTypes.element, +} + +AssetNavigation.defaultProps = { + optionsButton: undefined, +} + +export default AssetNavigation diff --git a/ui/app/pages/asset/components/native-asset.js b/ui/app/pages/asset/components/native-asset.js new file mode 100644 index 000000000000..3bda491b8976 --- /dev/null +++ b/ui/app/pages/asset/components/native-asset.js @@ -0,0 +1,32 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { useSelector } from 'react-redux' +import { useHistory } from 'react-router-dom' + +import TransactionList from '../../../components/app/transaction-list' +import { EthOverview } from '../../../components/app/wallet-overview' +import { getSelectedIdentity } from '../../../selectors/selectors' +import { DEFAULT_ROUTE } from '../../../helpers/constants/routes' + +import AssetNavigation from './asset-navigation' + +export default function NativeAsset ({ nativeCurrency }) { + const selectedAccountName = useSelector((state) => getSelectedIdentity(state).name) + const history = useHistory() + + return ( + <> + history.push(DEFAULT_ROUTE)} + /> + + + + ) +} + +NativeAsset.propTypes = { + nativeCurrency: PropTypes.string.isRequired, +} diff --git a/ui/app/pages/asset/components/token-asset.js b/ui/app/pages/asset/components/token-asset.js new file mode 100644 index 000000000000..84c7eee37876 --- /dev/null +++ b/ui/app/pages/asset/components/token-asset.js @@ -0,0 +1,51 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { useDispatch, useSelector } from 'react-redux' +import { useHistory } from 'react-router-dom' +import { createAccountLink } from '@metamask/etherscan-link' + +import TransactionList from '../../../components/app/transaction-list' +import { TokenOverview } from '../../../components/app/wallet-overview' +import { getCurrentNetworkId, getSelectedIdentity } from '../../../selectors/selectors' +import { DEFAULT_ROUTE } from '../../../helpers/constants/routes' +import { showModal } from '../../../store/actions' + +import AssetNavigation from './asset-navigation' +import TokenOptions from './token-options' + +export default function TokenAsset ({ token }) { + const dispatch = useDispatch() + const network = useSelector(getCurrentNetworkId) + const selectedAccountName = useSelector((state) => getSelectedIdentity(state).name) + const history = useHistory() + + return ( + <> + history.push(DEFAULT_ROUTE)} + optionsButton={( + dispatch(showModal({ name: 'HIDE_TOKEN_CONFIRMATION', token }))} + onViewEtherscan={() => { + const url = createAccountLink(token.address, network) + global.platform.openTab({ url }) + }} + tokenSymbol={token.symbol} + /> + )} + /> + + + + ) +} + +TokenAsset.propTypes = { + token: PropTypes.shape({ + address: PropTypes.string.isRequired, + decimals: PropTypes.number, + symbol: PropTypes.string, + }).isRequired, +} diff --git a/ui/app/pages/asset/components/token-options.js b/ui/app/pages/asset/components/token-options.js new file mode 100644 index 000000000000..eaf142d34732 --- /dev/null +++ b/ui/app/pages/asset/components/token-options.js @@ -0,0 +1,59 @@ +import React, { useContext, useState } from 'react' +import PropTypes from 'prop-types' + +import { I18nContext } from '../../../contexts/i18n' +import { Menu, MenuItem } from '../../../components/ui/menu' + +const TokenOptions = ({ onRemove, onViewEtherscan, tokenSymbol }) => { + const t = useContext(I18nContext) + const [tokenOptionsButtonElement, setTokenOptionsButtonElement] = useState(null) + const [tokenOptionsOpen, setTokenOptionsOpen] = useState(false) + + return ( + <> +
    -
    +
    -
    +
    ) } + + checkTokenDuplicates (pendingTokens, tokens) { + const pending = Object.keys(pendingTokens) + const existing = tokens.map((token) => token.address) + const dupes = pending.filter((proposed) => { + return existing.includes(proposed) + }) + + return dupes.length > 0 + } + + /** + * Returns true if any pendingTokens both: + * - Share a symbol with an existing `tokens` member. + * - Does not share an address with that same `tokens` member. + * This should be flagged as possibly deceptive or confusing. + */ + checkNameReuse (pendingTokens, tokens) { + const duplicates = Object.keys(pendingTokens) + .map((addr) => pendingTokens[addr]) + .filter((token) => { + const dupes = tokens.filter((old) => old.symbol === token.symbol) + .filter((old) => old.address !== token.address) + return dupes.length > 0 + }) + return duplicates.length > 0 + } + } diff --git a/ui/app/pages/confirm-add-suggested-token/confirm-add-suggested-token.container.js b/ui/app/pages/confirm-add-suggested-token/confirm-add-suggested-token.container.js index cc73b2ea7880..319d1ed82599 100644 --- a/ui/app/pages/confirm-add-suggested-token/confirm-add-suggested-token.container.js +++ b/ui/app/pages/confirm-add-suggested-token/confirm-add-suggested-token.container.js @@ -1,29 +1,29 @@ import { connect } from 'react-redux' -import { compose } from 'recompose' -import ConfirmAddSuggestedToken from './confirm-add-suggested-token.component' +import { compose } from 'redux' import { withRouter } from 'react-router-dom' +import { addToken, removeSuggestedTokens } from '../../store/actions' +import { getMostRecentOverviewPage } from '../../ducks/history/history' +import ConfirmAddSuggestedToken from './confirm-add-suggested-token.component' -const extend = require('xtend') - -const { addToken, removeSuggestedTokens } = require('../../store/actions') - -const mapStateToProps = ({ metamask }) => { - const { pendingTokens, suggestedTokens } = metamask - const params = extend(pendingTokens, suggestedTokens) +const mapStateToProps = (state) => { + const { metamask: { pendingTokens, suggestedTokens, tokens } } = state + const params = { ...pendingTokens, ...suggestedTokens } return { + mostRecentOverviewPage: getMostRecentOverviewPage(state), pendingTokens: params, + tokens, } } -const mapDispatchToProps = dispatch => { +const mapDispatchToProps = (dispatch) => { return { - addToken: ({address, symbol, decimals, image}) => dispatch(addToken(address, symbol, Number(decimals), image)), + addToken: ({ address, symbol, decimals, image }) => dispatch(addToken(address, symbol, Number(decimals), image)), removeSuggestedTokens: () => dispatch(removeSuggestedTokens()), } } export default compose( withRouter, - connect(mapStateToProps, mapDispatchToProps) + connect(mapStateToProps, mapDispatchToProps), )(ConfirmAddSuggestedToken) diff --git a/ui/app/pages/confirm-add-suggested-token/index.js b/ui/app/pages/confirm-add-suggested-token/index.js index 2ca56b43c81b..275e0287ba13 100644 --- a/ui/app/pages/confirm-add-suggested-token/index.js +++ b/ui/app/pages/confirm-add-suggested-token/index.js @@ -1,2 +1,3 @@ import ConfirmAddSuggestedToken from './confirm-add-suggested-token.container' -module.exports = ConfirmAddSuggestedToken + +export default ConfirmAddSuggestedToken diff --git a/ui/app/pages/confirm-add-token/confirm-add-token.component.js b/ui/app/pages/confirm-add-token/confirm-add-token.component.js index f0a19e8d91d3..f79d962eb225 100644 --- a/ui/app/pages/confirm-add-token/confirm-add-token.component.js +++ b/ui/app/pages/confirm-add-token/confirm-add-token.component.js @@ -1,6 +1,6 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import { DEFAULT_ROUTE, ADD_TOKEN_ROUTE } from '../../helpers/constants/routes' +import { ASSET_ROUTE, ADD_TOKEN_ROUTE } from '../../helpers/constants/routes' import Button from '../../components/ui/button' import Identicon from '../../components/ui/identicon' import TokenBalance from '../../components/ui/token-balance' @@ -14,14 +14,15 @@ export default class ConfirmAddToken extends Component { history: PropTypes.object, clearPendingTokens: PropTypes.func, addTokens: PropTypes.func, + mostRecentOverviewPage: PropTypes.string.isRequired, pendingTokens: PropTypes.object, } componentDidMount () { - const { pendingTokens = {}, history } = this.props + const { mostRecentOverviewPage, pendingTokens = {}, history } = this.props if (Object.keys(pendingTokens).length === 0) { - history.push(DEFAULT_ROUTE) + history.push(mostRecentOverviewPage) } } @@ -32,7 +33,7 @@ export default class ConfirmAddToken extends Component { } render () { - const { history, addTokens, clearPendingTokens, pendingTokens } = this.props + const { history, addTokens, clearPendingTokens, mostRecentOverviewPage, pendingTokens } = this.props return (
    @@ -57,7 +58,7 @@ export default class ConfirmAddToken extends Component {
    { Object.entries(pendingTokens) - .map(([ address, token ]) => { + .map(([address, token]) => { const { name, symbol } = token return ( @@ -80,13 +81,13 @@ export default class ConfirmAddToken extends Component {
    ) - }) + }) }
    -
    +
    -
    +
    ) diff --git a/ui/app/pages/confirm-add-token/confirm-add-token.container.js b/ui/app/pages/confirm-add-token/confirm-add-token.container.js index 96162617723c..8c09ad837834 100644 --- a/ui/app/pages/confirm-add-token/confirm-add-token.container.js +++ b/ui/app/pages/confirm-add-token/confirm-add-token.container.js @@ -1,18 +1,20 @@ import { connect } from 'react-redux' -import ConfirmAddToken from './confirm-add-token.component' -const { addTokens, clearPendingTokens } = require('../../store/actions') +import { addTokens, clearPendingTokens } from '../../store/actions' +import { getMostRecentOverviewPage } from '../../ducks/history/history' +import ConfirmAddToken from './confirm-add-token.component' -const mapStateToProps = ({ metamask }) => { - const { pendingTokens } = metamask +const mapStateToProps = (state) => { + const { metamask: { pendingTokens } } = state return { + mostRecentOverviewPage: getMostRecentOverviewPage(state), pendingTokens, } } -const mapDispatchToProps = dispatch => { +const mapDispatchToProps = (dispatch) => { return { - addTokens: tokens => dispatch(addTokens(tokens)), + addTokens: (tokens) => dispatch(addTokens(tokens)), clearPendingTokens: () => dispatch(clearPendingTokens()), } } diff --git a/ui/app/pages/confirm-add-token/index.js b/ui/app/pages/confirm-add-token/index.js index b7decabec6ee..f6b9cc47c47c 100644 --- a/ui/app/pages/confirm-add-token/index.js +++ b/ui/app/pages/confirm-add-token/index.js @@ -1,2 +1,3 @@ import ConfirmAddToken from './confirm-add-token.container' -module.exports = ConfirmAddToken + +export default ConfirmAddToken diff --git a/ui/app/pages/confirm-add-token/index.scss b/ui/app/pages/confirm-add-token/index.scss index 66146cf78e8c..f1f021ddb1f7 100644 --- a/ui/app/pages/confirm-add-token/index.scss +++ b/ui/app/pages/confirm-add-token/index.scss @@ -2,7 +2,7 @@ padding: 16px; &__header { - font-size: .75rem; + font-size: 0.75rem; display: flex; } diff --git a/ui/app/pages/confirm-approve/confirm-approve-content/confirm-approve-content.component.js b/ui/app/pages/confirm-approve/confirm-approve-content/confirm-approve-content.component.js new file mode 100644 index 000000000000..8c7394e6f7c9 --- /dev/null +++ b/ui/app/pages/confirm-approve/confirm-approve-content/confirm-approve-content.component.js @@ -0,0 +1,247 @@ +import React, { Component } from 'react' +import PropTypes from 'prop-types' +import classnames from 'classnames' +import Identicon from '../../../components/ui/identicon' +import { + addressSummary, +} from '../../../helpers/utils/util' +import { formatCurrency } from '../../../helpers/utils/confirm-tx.util' + +export default class ConfirmApproveContent extends Component { + static contextTypes = { + t: PropTypes.func, + } + + static propTypes = { + decimals: PropTypes.number, + tokenAmount: PropTypes.string, + customTokenAmount: PropTypes.string, + tokenSymbol: PropTypes.string, + siteImage: PropTypes.string, + showCustomizeGasModal: PropTypes.func, + showEditApprovalPermissionModal: PropTypes.func, + origin: PropTypes.string, + setCustomAmount: PropTypes.func, + tokenBalance: PropTypes.string, + data: PropTypes.string, + toAddress: PropTypes.string, + currentCurrency: PropTypes.string, + fiatTransactionTotal: PropTypes.string, + ethTransactionTotal: PropTypes.string, + } + + state = { + showFullTxDetails: false, + } + + renderApproveContentCard ({ + symbol, + title, + showEdit, + onEditClick, + content, + footer, + noBorder, + }) { + return ( +
    +
    +
    { symbol }
    +
    { title }
    + {showEdit && ( +
    onEditClick()} + > + Edit +
    + )} +
    +
    + { content } +
    + { footer } +
    + ) + } + + // TODO: Add "Learn Why" with link to the feeAssociatedRequest text + renderTransactionDetailsContent () { + const { t } = this.context + const { + currentCurrency, + ethTransactionTotal, + fiatTransactionTotal, + } = this.props + return ( +
    +
    + { t('feeAssociatedRequest') } +
    +
    +
    + { formatCurrency(fiatTransactionTotal, currentCurrency) } +
    +
    + { `${ethTransactionTotal} ETH` } +
    +
    +
    + ) + } + + renderPermissionContent () { + const { t } = this.context + const { customTokenAmount, tokenAmount, tokenSymbol, origin, toAddress } = this.props + + return ( +
    +
    { t('accessAndSpendNotice', [origin]) }
    +
    +
    { t('amountWithColon') }
    +
    { `${Number(customTokenAmount || tokenAmount)} ${tokenSymbol}` }
    +
    +
    +
    { t('toWithColon') }
    +
    { addressSummary(toAddress) }
    +
    +
    + ) + } + + renderDataContent () { + const { t } = this.context + const { data } = this.props + return ( +
    +
    { t('functionApprove') }
    +
    { data }
    +
    + ) + } + + render () { + const { t } = this.context + const { + decimals, + siteImage, + tokenAmount, + customTokenAmount, + origin, + tokenSymbol, + showCustomizeGasModal, + showEditApprovalPermissionModal, + setCustomAmount, + tokenBalance, + } = this.props + const { showFullTxDetails } = this.state + + return ( +
    +
    + +
    +
    + { t('allowOriginSpendToken', [origin, tokenSymbol]) } +
    +
    + { t('trustSiteApprovePermission', [origin, tokenSymbol]) } +
    +
    +
    showEditApprovalPermissionModal({ + customTokenAmount, + decimals, + origin, + setCustomAmount, + tokenAmount, + tokenSymbol, + tokenBalance, + })} + > + { t('editPermission') } +
    +
    +
    + {this.renderApproveContentCard({ + symbol: , + title: 'Transaction Fee', + showEdit: true, + onEditClick: showCustomizeGasModal, + content: this.renderTransactionDetailsContent(), + noBorder: !showFullTxDetails, + footer: ( +
    this.setState({ showFullTxDetails: !this.state.showFullTxDetails })} + > +
    +
    + View full transaction details +
    + +
    +
    + ), + })} +
    + + { + showFullTxDetails + ? ( +
    +
    + {this.renderApproveContentCard({ + symbol: , + title: 'Permission', + content: this.renderPermissionContent(), + showEdit: true, + onEditClick: () => showEditApprovalPermissionModal({ + customTokenAmount, + decimals, + origin, + setCustomAmount, + tokenAmount, + tokenSymbol, + tokenBalance, + }), + })} +
    +
    + {this.renderApproveContentCard({ + symbol: , + title: 'Data', + content: this.renderDataContent(), + noBorder: true, + })} +
    +
    + ) + : null + } +
    + ) + } +} diff --git a/ui/app/pages/confirm-approve/confirm-approve-content/index.js b/ui/app/pages/confirm-approve/confirm-approve-content/index.js new file mode 100644 index 000000000000..8f225387a260 --- /dev/null +++ b/ui/app/pages/confirm-approve/confirm-approve-content/index.js @@ -0,0 +1 @@ +export { default } from './confirm-approve-content.component' diff --git a/ui/app/pages/confirm-approve/confirm-approve-content/index.scss b/ui/app/pages/confirm-approve/confirm-approve-content/index.scss new file mode 100644 index 000000000000..d6a5d71c904d --- /dev/null +++ b/ui/app/pages/confirm-approve/confirm-approve-content/index.scss @@ -0,0 +1,306 @@ +.confirm-approve-content { + display: flex; + flex-flow: column; + align-items: center; + width: 100%; + height: 100%; + font-style: normal; + + &__identicon-wrapper { + display: flex; + width: 100%; + justify-content: center; + margin-top: 22px; + padding-left: 24px; + padding-right: 24px; + } + + &__full-tx-content { + display: flex; + flex-flow: column; + align-items: center; + width: 390px; + font-style: normal; + padding-left: 24px; + padding-right: 24px; + } + + &__card-wrapper { + width: 100%; + } + + &__title { + font-weight: normal; + font-size: 24px; + line-height: 34px; + width: 100%; + display: flex; + justify-content: center; + text-align: center; + margin-top: 22px; + padding-left: 24px; + padding-right: 24px; + } + + &__description { + font-weight: normal; + font-size: 14px; + line-height: 20px; + margin-top: 16px; + margin-bottom: 16px; + color: #6a737d; + text-align: center; + padding-left: 24px; + padding-right: 24px; + } + + &__card, + &__card--no-border { + display: flex; + flex-flow: column; + border-bottom: 1px solid #d2d8dd; + position: relative; + padding-left: 24px; + padding-right: 24px; + + &__bold-text { + font-weight: bold; + font-size: 14px; + line-height: 20px; + } + + &__thin-text { + font-weight: normal; + font-size: 12px; + line-height: 17px; + color: #6a737d; + } + } + + &__card--no-border { + border-bottom: none; + } + + &__card-header { + display: flex; + flex-flow: row; + margin-top: 20px; + align-items: center; + position: relative; + + &__symbol { + width: auto; + } + + &__symbol--aligned { + width: 100%; + } + + &__title, + &__title-value { + font-weight: bold; + font-size: 14px; + line-height: 20px; + } + + &__title { + width: 100%; + margin-left: 16px; + } + + &__title--aligned { + margin-left: 27px; + position: absolute; + width: auto; + } + } + + &__card-content { + margin-top: 6px; + margin-bottom: 12px; + } + + &__card-content--aligned { + margin-left: 42px; + } + + &__transaction-total-symbol { + width: 16px; + display: flex; + justify-content: center; + align-items: center; + height: 16px; + + &__x { + display: flex; + justify-content: center; + align-items: center; + + div { + width: 22px; + height: 2px; + background: $primary-blue; + position: absolute; + } + + div:first-of-type { + transform: rotate(45deg); + } + + div:last-of-type { + transform: rotate(-45deg); + } + } + + &__circle { + width: 14px; + height: 14px; + border: 2px solid $primary-blue; + border-radius: 50%; + background: white; + position: absolute; + } + } + + &__transaction-details-content { + display: flex; + flex-flow: row; + justify-content: space-between; + + .confirm-approve-content__small-text { + width: 160px; + } + + &__fee { + display: flex; + flex-flow: column; + align-items: flex-end; + text-align: right; + } + + &__primary-fee { + font-weight: bold; + font-size: 18px; + line-height: 25px; + color: #000; + } + + &__secondary-fee { + font-weight: normal; + font-size: 14px; + line-height: 20px; + color: #8c8e94; + } + } + + &__view-full-tx-button-wrapper { + display: flex; + flex-flow: row; + margin-bottom: 16px; + justify-content: center; + + i { + margin-left: 6px; + display: flex; + color: #3099f2; + align-items: center; + } + } + + &__view-full-tx-button { + display: flex; + flex-flow: row; + } + + &__edit-submission-button-container { + display: flex; + flex-flow: row; + padding-top: 15px; + padding-bottom: 30px; + border-bottom: 1px solid #d2d8dd; + width: 100%; + justify-content: center; + padding-left: 24px; + padding-right: 24px; + } + + &__large-text { + font-size: 18px; + line-height: 25px; + color: #24292e; + } + + &__medium-link-text { + font-size: 14px; + line-height: 20px; + font-weight: 500; + color: $primary-blue; + } + + &__medium-text, + &__label { + font-weight: normal; + font-size: 14px; + line-height: 20px; + color: #24292e; + } + + &__label { + font-weight: bold; + margin-right: 4px; + } + + &__small-text, + &__small-blue-text, + &__info-row { + font-weight: normal; + font-size: 12px; + line-height: 17px; + color: #6a737d; + } + + &__small-blue-text { + color: $primary-blue; + } + + &__info-row { + display: flex; + justify-content: space-between; + margin-bottom: 6px; + } + + &__data, + &__permission { + width: 100%; + } + + &__permission { + .flex-row { + margin-top: 14px; + } + } + + &__data { + &__data-block { + overflow-wrap: break-word; + margin-right: 16px; + margin-top: 12px; + } + } + + &__footer { + display: flex; + align-items: flex-end; + margin-top: 16px; + padding-left: 34px; + padding-right: 24px; + + .confirm-approve-content__small-text { + margin-left: 16px; + } + } +} + +.confirm-approve-content--full { + height: auto; +} diff --git a/ui/app/pages/confirm-approve/confirm-approve.component.js b/ui/app/pages/confirm-approve/confirm-approve.component.js deleted file mode 100644 index b71eaa1d4804..000000000000 --- a/ui/app/pages/confirm-approve/confirm-approve.component.js +++ /dev/null @@ -1,21 +0,0 @@ -import React, { Component } from 'react' -import PropTypes from 'prop-types' -import ConfirmTokenTransactionBase from '../confirm-token-transaction-base' - -export default class ConfirmApprove extends Component { - static propTypes = { - tokenAmount: PropTypes.number, - tokenSymbol: PropTypes.string, - } - - render () { - const { tokenAmount, tokenSymbol } = this.props - - return ( - - ) - } -} diff --git a/ui/app/pages/confirm-approve/confirm-approve.container.js b/ui/app/pages/confirm-approve/confirm-approve.container.js deleted file mode 100644 index 5f8bb8f0b3ea..000000000000 --- a/ui/app/pages/confirm-approve/confirm-approve.container.js +++ /dev/null @@ -1,15 +0,0 @@ -import { connect } from 'react-redux' -import ConfirmApprove from './confirm-approve.component' -import { approveTokenAmountAndToAddressSelector } from '../../selectors/confirm-transaction' - -const mapStateToProps = state => { - const { confirmTransaction: { tokenProps: { tokenSymbol } = {} } } = state - const { tokenAmount } = approveTokenAmountAndToAddressSelector(state) - - return { - tokenAmount, - tokenSymbol, - } -} - -export default connect(mapStateToProps)(ConfirmApprove) diff --git a/ui/app/pages/confirm-approve/confirm-approve.js b/ui/app/pages/confirm-approve/confirm-approve.js new file mode 100644 index 000000000000..5bd634113477 --- /dev/null +++ b/ui/app/pages/confirm-approve/confirm-approve.js @@ -0,0 +1,143 @@ +import React, { useEffect, useRef, useState } from 'react' +import { useDispatch, useSelector } from 'react-redux' +import { useParams } from 'react-router-dom' +import ConfirmTransactionBase from '../confirm-transaction-base' +import { showModal } from '../../store/actions' +import { + getTokenData, +} from '../../helpers/utils/transactions.util' +import { + calcTokenAmount, + getTokenToAddress, + getTokenValue, +} from '../../helpers/utils/token-util' +import { useTokenTracker } from '../../hooks/useTokenTracker' +import { getTokens } from '../../ducks/metamask/metamask' +import { + transactionFeeSelector, + txDataSelector, +} from '../../selectors/confirm-transaction' +import { getCurrentCurrency, getDomainMetadata } from '../../selectors/selectors' +import { currentNetworkTxListSelector } from '../../selectors/transactions' +import { getCustomTxParamsData } from './confirm-approve.util' +import ConfirmApproveContent from './confirm-approve-content' + +export default function ConfirmApprove () { + const dispatch = useDispatch() + const { id: paramsTransactionId } = useParams() + const { + id: transactionId, + txParams: { + to: tokenAddress, + data, + } = {}, + } = useSelector(txDataSelector) + + const currentCurrency = useSelector(getCurrentCurrency) + const currentNetworkTxList = useSelector(currentNetworkTxListSelector) + const domainMetadata = useSelector(getDomainMetadata) + const tokens = useSelector(getTokens) + + const transaction = ( + currentNetworkTxList.find(({ id }) => id === (Number(paramsTransactionId) || transactionId)) || {} + ) + const { + ethTransactionTotal, + fiatTransactionTotal, + } = useSelector((state) => transactionFeeSelector(state, transaction)) + + const currentToken = (tokens && tokens.find(({ address }) => tokenAddress === address)) || { address: tokenAddress } + + const { tokensWithBalances } = useTokenTracker([currentToken]) + const tokenTrackerBalance = tokensWithBalances[0]?.balance || '' + + const tokenSymbol = currentToken?.symbol + const decimals = Number(currentToken?.decimals) + const tokenData = getTokenData(data) + const tokenValue = tokenData && getTokenValue(tokenData.params) + const toAddress = tokenData && getTokenToAddress(tokenData.params) + const tokenAmount = tokenData && calcTokenAmount(tokenValue, decimals).toString(10) + + const [customPermissionAmount, setCustomPermissionAmount] = useState('') + + const previousTokenAmount = useRef(tokenAmount) + + useEffect( + () => { + if (customPermissionAmount && previousTokenAmount.current !== tokenAmount) { + setCustomPermissionAmount(tokenAmount) + } + previousTokenAmount.current = tokenAmount + }, + [customPermissionAmount, tokenAmount], + ) + + const { origin } = transaction + const formattedOrigin = origin + ? origin[0].toUpperCase() + origin.slice(1) + : '' + const txData = transaction + + const { icon: siteImage = '' } = domainMetadata[origin] || {} + + const tokensText = `${Number(tokenAmount)} ${tokenSymbol}` + const tokenBalance = tokenTrackerBalance + ? calcTokenAmount(tokenTrackerBalance, decimals).toString(10) + : '' + const customData = customPermissionAmount + ? getCustomTxParamsData(data, { customPermissionAmount, decimals }) + : null + + return ( + dispatch(showModal({ name: 'CUSTOMIZE_GAS', txData }))} + showEditApprovalPermissionModal={ + ({ + /* eslint-disable no-shadow */ + customTokenAmount, + decimals, + origin, + setCustomAmount, + tokenAmount, + tokenBalance, + tokenSymbol, + /* eslint-enable no-shadow */ + }) => dispatch( + showModal({ + name: 'EDIT_APPROVAL_PERMISSION', + customTokenAmount, + decimals, + origin, + setCustomAmount, + tokenAmount, + tokenBalance, + tokenSymbol, + }), + ) + } + data={customData || data} + toAddress={toAddress} + currentCurrency={currentCurrency} + ethTransactionTotal={ethTransactionTotal} + fiatTransactionTotal={fiatTransactionTotal} + /> + )} + hideSenderToRecipient + customTxParamsData={customData} + /> + ) +} diff --git a/ui/app/pages/confirm-approve/confirm-approve.util.js b/ui/app/pages/confirm-approve/confirm-approve.util.js new file mode 100644 index 000000000000..02ae4fe1e774 --- /dev/null +++ b/ui/app/pages/confirm-approve/confirm-approve.util.js @@ -0,0 +1,33 @@ +import { decimalToHex } from '../../helpers/utils/conversions.util' +import { calcTokenValue } from '../../helpers/utils/token-util' +import { getTokenData } from '../../helpers/utils/transactions.util' + +export function getCustomTxParamsData (data, { customPermissionAmount, decimals }) { + const tokenData = getTokenData(data) + + if (!tokenData) { + throw new Error('Invalid data') + } else if (tokenData.name !== 'approve') { + throw new Error(`Invalid data; should be 'approve' method, but instead is '${tokenData.name}'`) + } + let spender = tokenData.params[0].value + if (spender.startsWith('0x')) { + spender = spender.substring(2) + } + const [signature, tokenValue] = data.split(spender) + + if (!signature || !tokenValue) { + throw new Error('Invalid data') + } else if (tokenValue.length !== 64) { + throw new Error('Invalid token value; should be exactly 64 hex digits long (u256)') + } + + let customPermissionValue = decimalToHex(calcTokenValue(customPermissionAmount, decimals)) + if (customPermissionValue.length > 64) { + throw new Error('Custom value is larger than u256') + } + + customPermissionValue = customPermissionValue.padStart(tokenValue.length, '0') + const customTxParamsData = `${signature}${spender}${customPermissionValue}` + return customTxParamsData +} diff --git a/ui/app/pages/confirm-approve/index.js b/ui/app/pages/confirm-approve/index.js index 791297be7117..20420933041c 100644 --- a/ui/app/pages/confirm-approve/index.js +++ b/ui/app/pages/confirm-approve/index.js @@ -1 +1 @@ -export { default } from './confirm-approve.container' +export { default } from './confirm-approve' diff --git a/ui/app/pages/confirm-approve/index.scss b/ui/app/pages/confirm-approve/index.scss new file mode 100644 index 000000000000..18d7c29e82e7 --- /dev/null +++ b/ui/app/pages/confirm-approve/index.scss @@ -0,0 +1 @@ +@import 'confirm-approve-content/index'; diff --git a/ui/app/pages/confirm-decrypt-message/confirm-decrypt-message.component.js b/ui/app/pages/confirm-decrypt-message/confirm-decrypt-message.component.js new file mode 100644 index 000000000000..57310d7b216b --- /dev/null +++ b/ui/app/pages/confirm-decrypt-message/confirm-decrypt-message.component.js @@ -0,0 +1,354 @@ +import React, { Component } from 'react' +import PropTypes from 'prop-types' +import copyToClipboard from 'copy-to-clipboard' +import classnames from 'classnames' + +import AccountListItem from '../../components/app/account-list-item' +import Button from '../../components/ui/button' +import Identicon from '../../components/ui/identicon' +import Tooltip from '../../components/ui/tooltip' +import Copy from '../../components/ui/icon/copy-icon.component' + +import { ENVIRONMENT_TYPE_NOTIFICATION } from '../../../../app/scripts/lib/enums' +import { getEnvironmentType } from '../../../../app/scripts/lib/util' +import { conversionUtil } from '../../helpers/utils/conversion-util' + +export default class ConfirmDecryptMessage extends Component { + static contextTypes = { + t: PropTypes.func.isRequired, + metricsEvent: PropTypes.func.isRequired, + } + + static propTypes = { + fromAccount: PropTypes.shape({ + address: PropTypes.string.isRequired, + balance: PropTypes.string, + name: PropTypes.string, + }).isRequired, + clearConfirmTransaction: PropTypes.func.isRequired, + cancelDecryptMessage: PropTypes.func.isRequired, + decryptMessage: PropTypes.func.isRequired, + decryptMessageInline: PropTypes.func.isRequired, + conversionRate: PropTypes.number, + history: PropTypes.object.isRequired, + mostRecentOverviewPage: PropTypes.string.isRequired, + requesterAddress: PropTypes.string, + txData: PropTypes.object, + domainMetadata: PropTypes.object, + } + + state = { + fromAccount: this.props.fromAccount, + copyToClipboardPressed: false, + hasCopied: false, + } + + componentDidMount = () => { + if (getEnvironmentType(window.location.href) === ENVIRONMENT_TYPE_NOTIFICATION) { + window.addEventListener('beforeunload', this._beforeUnload) + } + } + + componentWillUnmount = () => { + this._removeBeforeUnload() + } + + _beforeUnload = async (event) => { + const { + clearConfirmTransaction, + cancelDecryptMessage, + txData, + } = this.props + const { metricsEvent } = this.context + await cancelDecryptMessage(txData, event) + metricsEvent({ + eventOpts: { + category: 'Messages', + action: 'Decrypt Message Request', + name: 'Cancel Via Notification Close', + }, + }) + clearConfirmTransaction() + } + + _removeBeforeUnload = () => { + if (getEnvironmentType(window.location.href) === ENVIRONMENT_TYPE_NOTIFICATION) { + window.removeEventListener('beforeunload', this._beforeUnload) + } + } + + copyMessage = () => { + copyToClipboard(this.state.rawMessage) + this.context.metricsEvent({ + eventOpts: { + category: 'Messages', + action: 'Decrypt Message Copy', + name: 'Copy', + }, + }) + this.setState({ hasCopied: true }) + setTimeout(() => this.setState({ hasCopied: false }), 3000) + } + + renderHeader = () => { + return ( +
    +
    + +
    + { this.context.t('decryptRequest') } +
    + +
    +
    +
    +
    + ) + } + + renderAccount = () => { + const { fromAccount } = this.state + const { t } = this.context + + return ( +
    +
    + { `${t('account')}:` } +
    + +
    + +
    +
    + ) + } + + renderBalance = () => { + const { conversionRate } = this.props + const { fromAccount: { balance } } = this.state + const { t } = this.context + + const balanceInEther = conversionUtil(balance, { + fromNumericBase: 'hex', + toNumericBase: 'dec', + fromDenomination: 'WEI', + numberOfDecimals: 6, + conversionRate, + }) + + return ( +
    +
    + { `${t('balance')}:` } +
    +
    + { `${balanceInEther} ETH` } +
    +
    + ) + } + + renderRequestIcon = () => { + const { requesterAddress } = this.props + + return ( +
    + +
    + ) + } + + renderAccountInfo = () => { + return ( +
    + { this.renderAccount() } + { this.renderRequestIcon() } + { this.renderBalance() } +
    + ) + } + + renderBody = () => { + const { decryptMessageInline, domainMetadata, txData } = this.props + const { t } = this.context + + const origin = domainMetadata[txData.msgParams.origin] + const notice = t('decryptMessageNotice', [origin.name]) + + const { + hasCopied, + hasDecrypted, + hasError, + rawMessage, + errorMessage, + copyToClipboardPressed, + } = this.state + + return ( +
    + { this.renderAccountInfo() } +
    +
    + {origin.icon ? ( + + ) : ( + + {origin.name.charAt(0).toUpperCase()} + + )} +
    + { notice } +
    +
    +
    +
    +
    + { !hasDecrypted && !hasError ? txData.msgParams.data : rawMessage } + { hasError ? errorMessage : '' } +
    +
    +
    +
    { + decryptMessageInline(txData, event).then((result) => { + if (result.error) { + this.setState({ hasError: true, errorMessage: this.context.t('decryptInlineError', [result.error]) }) + } else { + this.setState({ hasDecrypted: true, rawMessage: result.rawData }) + } + }) + }} + > + +
    + {t('decryptMetamask')} +
    +
    +
    + { hasDecrypted ? + ( +
    this.copyMessage()} + onMouseDown={() => this.setState({ copyToClipboardPressed: true })} + onMouseUp={() => this.setState({ copyToClipboardPressed: false })} + > + +
    + {t('decryptCopy')} +
    + +
    +
    + ) + : +
    + } +
    + ) + } + + renderFooter = () => { + const { + cancelDecryptMessage, + clearConfirmTransaction, + decryptMessage, + history, + mostRecentOverviewPage, + txData, + } = this.props + const { metricsEvent, t } = this.context + + return ( +
    + + +
    + ) + } + + render = () => { + return ( +
    + { this.renderHeader() } + { this.renderBody() } + { this.renderFooter() } +
    + ) + } +} diff --git a/ui/app/pages/confirm-decrypt-message/confirm-decrypt-message.container.js b/ui/app/pages/confirm-decrypt-message/confirm-decrypt-message.container.js new file mode 100644 index 000000000000..57d00021a3ae --- /dev/null +++ b/ui/app/pages/confirm-decrypt-message/confirm-decrypt-message.container.js @@ -0,0 +1,70 @@ +import { connect } from 'react-redux' +import { compose } from 'redux' +import { withRouter } from 'react-router-dom' + +import { + goHome, + decryptMsg, + cancelDecryptMsg, + decryptMsgInline, +} from '../../store/actions' +import { + getTargetAccountWithSendEtherInfo, + conversionRateSelector, +} from '../../selectors' +import { clearConfirmTransaction } from '../../ducks/confirm-transaction/confirm-transaction.duck' +import { getMostRecentOverviewPage } from '../../ducks/history/history' +import ConfirmDecryptMessage from './confirm-decrypt-message.component' + +function mapStateToProps (state) { + const { + confirmTransaction, + metamask: { domainMetadata = {} }, + } = state + + const { + txData = {}, + } = confirmTransaction + + const { msgParams: { from } } = txData + + const fromAccount = getTargetAccountWithSendEtherInfo(state, from) + + return { + txData, + domainMetadata, + fromAccount, + requester: null, + requesterAddress: null, + conversionRate: conversionRateSelector(state), + mostRecentOverviewPage: getMostRecentOverviewPage(state), + } +} + +function mapDispatchToProps (dispatch) { + return { + goHome: () => dispatch(goHome()), + clearConfirmTransaction: () => dispatch(clearConfirmTransaction()), + decryptMessage: (msgData, event) => { + const params = msgData.msgParams + params.metamaskId = msgData.id + event.stopPropagation(event) + return dispatch(decryptMsg(params)) + }, + cancelDecryptMessage: (msgData, event) => { + event.stopPropagation(event) + return dispatch(cancelDecryptMsg(msgData)) + }, + decryptMessageInline: (msgData, event) => { + const params = msgData.msgParams + params.metamaskId = msgData.id + event.stopPropagation(event) + return dispatch(decryptMsgInline(params)) + }, + } +} + +export default compose( + withRouter, + connect(mapStateToProps, mapDispatchToProps), +)(ConfirmDecryptMessage) diff --git a/ui/app/pages/confirm-decrypt-message/confirm-decrypt-message.scss b/ui/app/pages/confirm-decrypt-message/confirm-decrypt-message.scss new file mode 100644 index 000000000000..fd2ee53a8a6f --- /dev/null +++ b/ui/app/pages/confirm-decrypt-message/confirm-decrypt-message.scss @@ -0,0 +1,290 @@ +.request-decrypt-message { + &__container { + width: 380px; + border-radius: 8px; + background-color: $white; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08); + display: flex; + flex-flow: column nowrap; + z-index: 25; + align-items: center; + position: relative; + height: 100%; + + @media screen and (max-width: $break-small) { + width: 100%; + top: 0; + box-shadow: none; + } + + @media screen and (min-width: $break-large) { + height: 620px; + } + } + + &__typed-container { + padding: 17px; + + h1 { + font-weight: 900; + margin-bottom: 5px; + } + + * { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + > div { + margin-bottom: 10px; + } + } + + &__header { + height: 64px; + width: 100%; + position: relative; + display: flex; + flex-flow: column; + justify-content: center; + align-items: center; + flex: 0 0 auto; + } + + &__header-background { + position: absolute; + background-color: $athens-grey; + z-index: 2; + width: 100%; + height: 100%; + } + + &__header__text { + color: #5b5d67; + font-size: 22px; + line-height: 29px; + z-index: 3; + text-align: center; + } + + &__header__tip-container { + width: 100%; + display: flex; + justify-content: center; + } + + &__header__tip { + height: 25px; + width: 25px; + background: $athens-grey; + transform: rotate(45deg); + position: absolute; + bottom: -8px; + z-index: 1; + } + + &__account-info { + display: flex; + justify-content: space-between; + margin-top: 18px; + margin-bottom: 20px; + } + + &__account { + color: $dusty-gray; + margin-left: 17px; + } + + &__account-text { + font-size: 14px; + } + + &__account-item { + height: 22px; + background-color: $white; + line-height: 16px; + font-size: 12px; + width: 124px; + + .account-list-item { + margin-top: 6px; + } + + .account-list-item__account-name { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + width: 80px; + } + + .account-list-item__top-row { + margin: 0; + } + } + + &__balance { + color: $dusty-gray; + margin-right: 17px; + width: 124px; + } + + &__balance-text { + text-align: right; + font-size: 14px; + } + + &__balance-value { + text-align: right; + margin-top: 2.5px; + } + + &__request-icon { + margin-top: 25px; + } + + &__body { + width: 100%; + height: 100%; + display: flex; + flex-flow: column; + flex: 1 1 auto; + height: 0; + } + + &__notice { + font-size: 14px; + line-height: 19px; + text-align: center; + margin-top: 15px; + margin-bottom: 11px; + width: 100%; + } + + &__message { + overflow-wrap: break-word; + margin: 20px; + overflow: hidden; + border: 1px solid #dedede; + padding: 5px; + border-radius: 5px; + position: relative; + + &-text { + font-size: 0.7em; + height: 115px; + } + + &-cover { + background-color: white; + opacity: 0.75; + position: absolute; + height: 100%; + width: 100%; + top: 0; + } + + &-lock { + position: absolute; + height: 100%; + width: 100%; + top: 0; + cursor: pointer; + + img { + padding: 5px; + background-color: #fff; + left: calc(50% - 24px); + position: absolute; + top: calc(50% - 34px); + border-radius: 3px; + } + + &--pressed { + display: none; + } + } + + &-lock-text { + width: 200px; + font-size: 0.75em; + position: absolute; + top: calc(50% + 5px); + text-align: center; + left: calc(50% - 100px); + background-color: white; + line-height: 1em; + border-radius: 3px; + } + + &-copy { + justify-content: space-evenly; + font-size: 0.75em; + margin-left: 20px; + margin-right: 20px; + display: flex; + cursor: pointer; + } + + &-copy-text { + margin-right: 10px; + display: inline; + } + + &-copy-tooltip { + float: right; + } + } + + &__footer { + width: 100%; + display: flex; + align-items: center; + justify-content: center; + font-size: 22px; + position: relative; + flex: 0 0 auto; + border-top: 1px solid $geyser; + padding: 1.6rem; + + button { + width: 165px; + } + + &__cancel-button { + margin-right: 1.2rem; + } + } + + &__visual { + display: flex; + flex-direction: row; + justify-content: space-evenly; + position: relative; + margin: 0 20px; + + section { + display: flex; + flex-direction: column; + align-items: center; + flex: 1; + } + + &-identicon { + width: 48px; + height: 48px; + + &--default { + background-color: #777a87; + color: white; + width: 48px; + height: 48px; + border-radius: 24px; + display: flex; + align-items: center; + justify-content: center; + font-weight: bold; + } + } + } +} diff --git a/ui/app/pages/confirm-decrypt-message/index.js b/ui/app/pages/confirm-decrypt-message/index.js new file mode 100644 index 000000000000..9cc67168198f --- /dev/null +++ b/ui/app/pages/confirm-decrypt-message/index.js @@ -0,0 +1 @@ +export { default } from './confirm-decrypt-message.container' diff --git a/ui/app/pages/confirm-deploy-contract/confirm-deploy-contract.component.js b/ui/app/pages/confirm-deploy-contract/confirm-deploy-contract.component.js index c90ccc917bd7..2bb2b81562be 100644 --- a/ui/app/pages/confirm-deploy-contract/confirm-deploy-contract.component.js +++ b/ui/app/pages/confirm-deploy-contract/confirm-deploy-contract.component.js @@ -56,7 +56,7 @@ export default class ConfirmDeployContract extends Component { render () { return ( ) diff --git a/ui/app/pages/confirm-deploy-contract/confirm-deploy-contract.container.js b/ui/app/pages/confirm-deploy-contract/confirm-deploy-contract.container.js index 336ee83ea3c6..e66dd3b60937 100644 --- a/ui/app/pages/confirm-deploy-contract/confirm-deploy-contract.container.js +++ b/ui/app/pages/confirm-deploy-contract/confirm-deploy-contract.container.js @@ -1,7 +1,7 @@ import { connect } from 'react-redux' import ConfirmDeployContract from './confirm-deploy-contract.component' -const mapStateToProps = state => { +const mapStateToProps = (state) => { const { confirmTransaction: { txData } = {} } = state return { diff --git a/ui/app/pages/confirm-encryption-public-key/confirm-encryption-public-key.component.js b/ui/app/pages/confirm-encryption-public-key/confirm-encryption-public-key.component.js new file mode 100644 index 000000000000..3dbba9b8f6df --- /dev/null +++ b/ui/app/pages/confirm-encryption-public-key/confirm-encryption-public-key.component.js @@ -0,0 +1,257 @@ +import React, { Component } from 'react' +import PropTypes from 'prop-types' + +import AccountListItem from '../../components/app/account-list-item' +import Button from '../../components/ui/button' +import Identicon from '../../components/ui/identicon' + +import { ENVIRONMENT_TYPE_NOTIFICATION } from '../../../../app/scripts/lib/enums' +import { getEnvironmentType } from '../../../../app/scripts/lib/util' +import { conversionUtil } from '../../helpers/utils/conversion-util' + +export default class ConfirmEncryptionPublicKey extends Component { + static contextTypes = { + t: PropTypes.func.isRequired, + metricsEvent: PropTypes.func.isRequired, + } + + static propTypes = { + fromAccount: PropTypes.shape({ + address: PropTypes.string.isRequired, + balance: PropTypes.string, + name: PropTypes.string, + }).isRequired, + clearConfirmTransaction: PropTypes.func.isRequired, + cancelEncryptionPublicKey: PropTypes.func.isRequired, + encryptionPublicKey: PropTypes.func.isRequired, + conversionRate: PropTypes.number, + history: PropTypes.object.isRequired, + requesterAddress: PropTypes.string, + txData: PropTypes.object, + domainMetadata: PropTypes.object, + mostRecentOverviewPage: PropTypes.string.isRequired, + } + + state = { + fromAccount: this.props.fromAccount, + } + + componentDidMount = () => { + if (getEnvironmentType(window.location.href) === ENVIRONMENT_TYPE_NOTIFICATION) { + window.addEventListener('beforeunload', this._beforeUnload) + } + } + + componentWillUnmount = () => { + this._removeBeforeUnload() + } + + _beforeUnload = async (event) => { + const { + clearConfirmTransaction, + cancelEncryptionPublicKey, + txData, + } = this.props + const { metricsEvent } = this.context + await cancelEncryptionPublicKey(txData, event) + metricsEvent({ + eventOpts: { + category: 'Messages', + action: 'Encryption public key Request', + name: 'Cancel Via Notification Close', + }, + }) + clearConfirmTransaction() + } + + _removeBeforeUnload = () => { + if (getEnvironmentType(window.location.href) === ENVIRONMENT_TYPE_NOTIFICATION) { + window.removeEventListener('beforeunload', this._beforeUnload) + } + } + + renderHeader = () => { + return ( +
    +
    + +
    + { this.context.t('encryptionPublicKeyRequest') } +
    + +
    +
    +
    +
    + ) + } + + renderAccount = () => { + const { fromAccount } = this.state + const { t } = this.context + + return ( +
    +
    + { `${t('account')}:` } +
    + +
    + +
    +
    + ) + } + + renderBalance = () => { + const { conversionRate } = this.props + const { t } = this.context + const { fromAccount: { balance } } = this.state + + const balanceInEther = conversionUtil(balance, { + fromNumericBase: 'hex', + toNumericBase: 'dec', + fromDenomination: 'WEI', + numberOfDecimals: 6, + conversionRate, + }) + + return ( +
    +
    + { `${t('balance')}:` } +
    +
    + { `${balanceInEther} ETH` } +
    +
    + ) + } + + renderRequestIcon = () => { + const { requesterAddress } = this.props + + return ( +
    + +
    + ) + } + + renderAccountInfo = () => { + return ( +
    + { this.renderAccount() } + { this.renderRequestIcon() } + { this.renderBalance() } +
    + ) + } + + renderBody = () => { + const { domainMetadata, txData } = this.props + const { t } = this.context + + const origin = domainMetadata[txData.origin] + const notice = t('encryptionPublicKeyNotice', [origin.name]) + + return ( +
    + { this.renderAccountInfo() } +
    +
    + {origin.icon ? ( + + ) : ( + + {origin.name.charAt(0).toUpperCase()} + + )} +
    + { notice } +
    +
    +
    +
    + ) + } + + renderFooter = () => { + const { + cancelEncryptionPublicKey, + clearConfirmTransaction, + encryptionPublicKey, + history, + mostRecentOverviewPage, + txData, + } = this.props + const { t, metricsEvent } = this.context + + return ( +
    + + +
    + ) + } + + render = () => { + return ( +
    + { this.renderHeader() } + { this.renderBody() } + { this.renderFooter() } +
    + ) + } +} diff --git a/ui/app/pages/confirm-encryption-public-key/confirm-encryption-public-key.container.js b/ui/app/pages/confirm-encryption-public-key/confirm-encryption-public-key.container.js new file mode 100644 index 000000000000..7a0b2c37f325 --- /dev/null +++ b/ui/app/pages/confirm-encryption-public-key/confirm-encryption-public-key.container.js @@ -0,0 +1,64 @@ +import { connect } from 'react-redux' +import { compose } from 'redux' +import { withRouter } from 'react-router-dom' + +import { + goHome, + encryptionPublicKeyMsg, + cancelEncryptionPublicKeyMsg, +} from '../../store/actions' + +import { + conversionRateSelector, + getTargetAccountWithSendEtherInfo, +} from '../../selectors' + +import { clearConfirmTransaction } from '../../ducks/confirm-transaction/confirm-transaction.duck' +import { getMostRecentOverviewPage } from '../../ducks/history/history' +import ConfirmEncryptionPublicKey from './confirm-encryption-public-key.component' + +function mapStateToProps (state) { + const { + confirmTransaction, + metamask: { domainMetadata = {} }, + } = state + + const { + txData = {}, + } = confirmTransaction + + const { msgParams: from } = txData + + const fromAccount = getTargetAccountWithSendEtherInfo(state, from) + + return { + txData, + domainMetadata, + fromAccount, + requester: null, + requesterAddress: null, + conversionRate: conversionRateSelector(state), + mostRecentOverviewPage: getMostRecentOverviewPage(state), + } +} + +function mapDispatchToProps (dispatch) { + return { + goHome: () => dispatch(goHome()), + clearConfirmTransaction: () => dispatch(clearConfirmTransaction()), + encryptionPublicKey: (msgData, event) => { + const params = { data: msgData.msgParams, metamaskId: msgData.id } + event.stopPropagation() + return dispatch(encryptionPublicKeyMsg(params)) + }, + cancelEncryptionPublicKey: (msgData, event) => { + event.stopPropagation() + return dispatch(cancelEncryptionPublicKeyMsg(msgData)) + }, + } +} + +export default compose( + withRouter, + connect(mapStateToProps, mapDispatchToProps), +)(ConfirmEncryptionPublicKey) diff --git a/ui/app/pages/confirm-encryption-public-key/confirm-encryption-public-key.scss b/ui/app/pages/confirm-encryption-public-key/confirm-encryption-public-key.scss new file mode 100644 index 000000000000..8860ca5d897b --- /dev/null +++ b/ui/app/pages/confirm-encryption-public-key/confirm-encryption-public-key.scss @@ -0,0 +1,218 @@ +.request-encryption-public-key { + &__container { + width: 380px; + border-radius: 8px; + background-color: $white; + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08); + display: flex; + flex-flow: column nowrap; + z-index: 25; + align-items: center; + position: relative; + height: 100%; + + @media screen and (max-width: $break-small) { + width: 100%; + top: 0; + box-shadow: none; + } + + @media screen and (min-width: $break-large) { + height: 620px; + } + } + + &__typed-container { + padding: 17px; + + h1 { + font-weight: 900; + margin-bottom: 5px; + } + + * { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + > div { + margin-bottom: 10px; + } + } + + &__header { + height: 64px; + width: 100%; + position: relative; + display: flex; + flex-flow: column; + justify-content: center; + align-items: center; + flex: 0 0 auto; + } + + &__header-background { + position: absolute; + background-color: $athens-grey; + z-index: 2; + width: 100%; + height: 100%; + } + + &__header__text { + color: #5b5d67; + font-size: 22px; + line-height: 29px; + z-index: 3; + text-align: center; + } + + &__header__tip-container { + width: 100%; + display: flex; + justify-content: center; + } + + &__header__tip { + height: 25px; + width: 25px; + background: $athens-grey; + transform: rotate(45deg); + position: absolute; + bottom: -8px; + z-index: 1; + } + + &__account-info { + display: flex; + justify-content: space-between; + margin-top: 18px; + margin-bottom: 20px; + } + + &__account { + color: $dusty-gray; + margin-left: 17px; + } + + &__account-text { + font-size: 14px; + } + + &__account-item { + height: 22px; + background-color: $white; + line-height: 16px; + font-size: 12px; + width: 124px; + + .account-list-item { + margin-top: 6px; + } + + .account-list-item__account-name { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + width: 80px; + } + + .account-list-item__top-row { + margin: 0; + } + } + + &__balance { + color: $dusty-gray; + margin-right: 17px; + width: 124px; + } + + &__balance-text { + text-align: right; + font-size: 14px; + } + + &__balance-value { + text-align: right; + margin-top: 2.5px; + } + + &__request-icon { + margin-top: 25px; + } + + &__body { + width: 100%; + height: 100%; + display: flex; + flex-flow: column; + flex: 1 1 auto; + height: 0; + } + + &__notice { + font-size: 14px; + line-height: 19px; + text-align: center; + margin-top: 41px; + margin-bottom: 11px; + width: 100%; + padding-left: 20px; + padding-right: 20px; + color: $dusty-gray; + } + + &__footer { + width: 100%; + display: flex; + align-items: center; + justify-content: center; + font-size: 22px; + position: relative; + flex: 0 0 auto; + border-top: 1px solid $geyser; + padding: 1.6rem; + + button { + width: 165px; + } + + &__cancel-button { + margin-right: 1.2rem; + } + } + + &__visual { + display: flex; + flex-direction: row; + justify-content: space-evenly; + position: relative; + margin: 0 20px; + + section { + display: flex; + flex-direction: column; + align-items: center; + flex: 1; + } + + &-identicon { + width: 48px; + height: 48px; + + &--default { + background-color: #777a87; + color: white; + width: 48px; + height: 48px; + border-radius: 24px; + display: flex; + align-items: center; + justify-content: center; + font-weight: bold; + } + } + } +} diff --git a/ui/app/pages/confirm-encryption-public-key/index.js b/ui/app/pages/confirm-encryption-public-key/index.js new file mode 100644 index 000000000000..9eb370e52ad1 --- /dev/null +++ b/ui/app/pages/confirm-encryption-public-key/index.js @@ -0,0 +1 @@ +export { default } from './confirm-encryption-public-key.container' diff --git a/ui/app/pages/confirm-send-ether/confirm-send-ether.component.js b/ui/app/pages/confirm-send-ether/confirm-send-ether.component.js index 68280f62452f..2fd23f45f2a7 100644 --- a/ui/app/pages/confirm-send-ether/confirm-send-ether.component.js +++ b/ui/app/pages/confirm-send-ether/confirm-send-ether.component.js @@ -30,9 +30,9 @@ export default class ConfirmSendEther extends Component { return ( this.handleEdit(confirmTransactionData)} + onEdit={(confirmTransactionData) => this.handleEdit(confirmTransactionData)} /> ) } diff --git a/ui/app/pages/confirm-send-ether/confirm-send-ether.container.js b/ui/app/pages/confirm-send-ether/confirm-send-ether.container.js index 713da702dbfc..03268571ede5 100644 --- a/ui/app/pages/confirm-send-ether/confirm-send-ether.container.js +++ b/ui/app/pages/confirm-send-ether/confirm-send-ether.container.js @@ -1,11 +1,11 @@ import { connect } from 'react-redux' -import { compose } from 'recompose' +import { compose } from 'redux' import { withRouter } from 'react-router-dom' import { updateSend } from '../../store/actions' import { clearConfirmTransaction } from '../../ducks/confirm-transaction/confirm-transaction.duck' import ConfirmSendEther from './confirm-send-ether.component' -const mapStateToProps = state => { +const mapStateToProps = (state) => { const { confirmTransaction: { txData: { txParams } = {} } } = state return { @@ -13,11 +13,12 @@ const mapStateToProps = state => { } } -const mapDispatchToProps = dispatch => { +const mapDispatchToProps = (dispatch) => { return { - editTransaction: txData => { + editTransaction: (txData) => { const { id, txParams } = txData const { + from, gas: gasLimit, gasPrice, to, @@ -25,6 +26,7 @@ const mapDispatchToProps = dispatch => { } = txParams dispatch(updateSend({ + from, gasLimit, gasPrice, gasTotal: null, @@ -41,5 +43,5 @@ const mapDispatchToProps = dispatch => { export default compose( withRouter, - connect(mapStateToProps, mapDispatchToProps) + connect(mapStateToProps, mapDispatchToProps), )(ConfirmSendEther) diff --git a/ui/app/pages/confirm-send-token/confirm-send-token.component.js b/ui/app/pages/confirm-send-token/confirm-send-token.component.js index 7f3b1c082d14..bde21a41c11c 100644 --- a/ui/app/pages/confirm-send-token/confirm-send-token.component.js +++ b/ui/app/pages/confirm-send-token/confirm-send-token.component.js @@ -1,6 +1,6 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import ConfirmTokenTransactionBase from '../confirm-token-transaction-base' +import ConfirmTokenTransactionBaseContainer from '../confirm-token-transaction-base' import { SEND_ROUTE } from '../../helpers/constants/routes' export default class ConfirmSendToken extends Component { @@ -20,8 +20,8 @@ export default class ConfirmSendToken extends Component { const { tokenAmount } = this.props return ( - this.handleEdit(confirmTransactionData)} + this.handleEdit(confirmTransactionData)} tokenAmount={tokenAmount} /> ) diff --git a/ui/app/pages/confirm-send-token/confirm-send-token.container.js b/ui/app/pages/confirm-send-token/confirm-send-token.container.js index db9b08c48b6b..330f614a884a 100644 --- a/ui/app/pages/confirm-send-token/confirm-send-token.container.js +++ b/ui/app/pages/confirm-send-token/confirm-send-token.container.js @@ -1,13 +1,13 @@ import { connect } from 'react-redux' -import { compose } from 'recompose' +import { compose } from 'redux' import { withRouter } from 'react-router-dom' -import ConfirmSendToken from './confirm-send-token.component' import { clearConfirmTransaction } from '../../ducks/confirm-transaction/confirm-transaction.duck' -import { setSelectedToken, updateSend, showSendTokenPage } from '../../store/actions' +import { updateSend, showSendTokenPage } from '../../store/actions' import { conversionUtil } from '../../helpers/utils/conversion-util' -import { sendTokenTokenAmountAndToAddressSelector } from '../../selectors/confirm-transaction' +import { sendTokenTokenAmountAndToAddressSelector } from '../../selectors' +import ConfirmSendToken from './confirm-send-token.component' -const mapStateToProps = state => { +const mapStateToProps = (state) => { const { tokenAmount } = sendTokenTokenAmountAndToAddressSelector(state) return { @@ -15,19 +15,31 @@ const mapStateToProps = state => { } } -const mapDispatchToProps = dispatch => { +const mapDispatchToProps = (dispatch) => { return { editTransaction: ({ txData, tokenData, tokenProps }) => { - const { txParams: { to: tokenAddress, gas: gasLimit, gasPrice } = {}, id } = txData + + const { + id, + txParams: { + from, + to: tokenAddress, + gas: gasLimit, + gasPrice, + } = {}, + } = txData + const { params = [] } = tokenData const { value: to } = params[0] || {} const { value: tokenAmountInDec } = params[1] || {} + const tokenAmountInHex = conversionUtil(tokenAmountInDec, { fromNumericBase: 'dec', toNumericBase: 'hex', }) - dispatch(setSelectedToken(tokenAddress)) + dispatch(updateSend({ + from, gasLimit, gasPrice, gasTotal: null, @@ -48,5 +60,5 @@ const mapDispatchToProps = dispatch => { export default compose( withRouter, - connect(mapStateToProps, mapDispatchToProps) + connect(mapStateToProps, mapDispatchToProps), )(ConfirmSendToken) diff --git a/ui/app/pages/confirm-token-transaction-base/confirm-token-transaction-base.component.js b/ui/app/pages/confirm-token-transaction-base/confirm-token-transaction-base.component.js index dbda3c1dc473..ca690a61ac45 100644 --- a/ui/app/pages/confirm-token-transaction-base/confirm-token-transaction-base.component.js +++ b/ui/app/pages/confirm-token-transaction-base/confirm-token-transaction-base.component.js @@ -28,6 +28,10 @@ export default class ConfirmTokenTransactionBase extends Component { currentCurrency: PropTypes.string, } + static defaultProps = { + tokenAmount: 0, + } + getFiatTransactionAmount () { const { tokenAmount, currentCurrency, conversionRate, contractExchangeRate } = this.props @@ -85,12 +89,11 @@ export default class ConfirmTokenTransactionBase extends Component { if (typeof contractExchangeRate === 'undefined') { return formatCurrency(fiatTransactionTotal, currentCurrency) - } else { - const fiatTransactionAmount = this.getFiatTransactionAmount() - const fiatTotal = addFiat(fiatTransactionAmount, fiatTransactionTotal) - const roundedFiatTotal = roundExponential(fiatTotal) - return formatCurrency(roundedFiatTotal, currentCurrency) } + const fiatTransactionAmount = this.getFiatTransactionAmount() + const fiatTotal = addFiat(fiatTransactionAmount, fiatTransactionTotal) + const roundedFiatTotal = roundExponential(fiatTotal) + return formatCurrency(roundedFiatTotal, currentCurrency) } render () { diff --git a/ui/app/pages/confirm-token-transaction-base/confirm-token-transaction-base.container.js b/ui/app/pages/confirm-token-transaction-base/confirm-token-transaction-base.container.js index 5d2ccb083a28..8583ea238475 100644 --- a/ui/app/pages/confirm-token-transaction-base/confirm-token-transaction-base.container.js +++ b/ui/app/pages/confirm-token-transaction-base/confirm-token-transaction-base.container.js @@ -1,12 +1,11 @@ import { connect } from 'react-redux' -import { compose } from 'recompose' +import { compose } from 'redux' import { withRouter } from 'react-router-dom' -import ConfirmTokenTransactionBase from './confirm-token-transaction-base.component' import { contractExchangeRateSelector, transactionFeeSelector, -} from '../../selectors/confirm-transaction' -import { tokenSelector } from '../../selectors/tokens' +} from '../../selectors' +import { getTokens } from '../../ducks/metamask/metamask' import { getTokenData, } from '../../helpers/utils/transactions.util' @@ -15,31 +14,37 @@ import { getTokenToAddress, getTokenValue, } from '../../helpers/utils/token-util' - +import ConfirmTokenTransactionBase from './confirm-token-transaction-base.component' const mapStateToProps = (state, ownProps) => { const { match: { params = {} } } = ownProps const { id: paramsTransactionId } = params - const { confirmTransaction, metamask: { currentCurrency, conversionRate, selectedAddressTxList } } = state + const { + confirmTransaction, + metamask: { currentCurrency, conversionRate, currentNetworkTxList }, + } = state const { txData: { id: transactionId, txParams: { to: tokenAddress, data } = {} } = {}, } = confirmTransaction - const transaction = selectedAddressTxList.find(({ id }) => id === (Number(paramsTransactionId) || transactionId)) || {} + const transaction = ( + currentNetworkTxList.find(({ id }) => id === (Number(paramsTransactionId) || + transactionId)) || {} + ) const { ethTransactionTotal, fiatTransactionTotal, } = transactionFeeSelector(state, transaction) - const tokens = tokenSelector(state) + const tokens = getTokens(state) const currentToken = tokens && tokens.find(({ address }) => tokenAddress === address) const { decimals, symbol: tokenSymbol } = currentToken || {} const tokenData = getTokenData(data) const tokenValue = tokenData && getTokenValue(tokenData.params) const toAddress = tokenData && getTokenToAddress(tokenData.params) - const tokenAmount = tokenData && calcTokenAmount(tokenValue, decimals).toString() + const tokenAmount = tokenData && calcTokenAmount(tokenValue, decimals).toNumber() const contractExchangeRate = contractExchangeRateSelector(state) return { @@ -57,5 +62,5 @@ const mapStateToProps = (state, ownProps) => { export default compose( withRouter, - connect(mapStateToProps) + connect(mapStateToProps), )(ConfirmTokenTransactionBase) diff --git a/ui/app/pages/confirm-transaction-base/confirm-transaction-base.component.js b/ui/app/pages/confirm-transaction-base/confirm-transaction-base.component.js index 5c46c84493e7..4c9ab94e1ba6 100644 --- a/ui/app/pages/confirm-transaction-base/confirm-transaction-base.component.js +++ b/ui/app/pages/confirm-transaction-base/confirm-transaction-base.component.js @@ -5,7 +5,7 @@ import { ENVIRONMENT_TYPE_NOTIFICATION } from '../../../../app/scripts/lib/enums import { getEnvironmentType } from '../../../../app/scripts/lib/util' import ConfirmPageContainer, { ConfirmDetailRow } from '../../components/app/confirm-page-container' import { isBalanceSufficient } from '../send/send.utils' -import { DEFAULT_ROUTE, CONFIRM_TRANSACTION_ROUTE } from '../../helpers/constants/routes' +import { CONFIRM_TRANSACTION_ROUTE } from '../../helpers/constants/routes' import { INSUFFICIENT_FUNDS_ERROR_KEY, TRANSACTION_ERROR_KEY, @@ -14,34 +14,25 @@ import { import { CONFIRMED_STATUS, DROPPED_STATUS } from '../../helpers/constants/transactions' import UserPreferencedCurrencyDisplay from '../../components/app/user-preferenced-currency-display' import { PRIMARY, SECONDARY } from '../../helpers/constants/common' +import { hexToDecimal } from '../../helpers/utils/conversions.util' import AdvancedGasInputs from '../../components/app/gas-customization/advanced-gas-inputs' +import TextField from '../../components/ui/text-field' export default class ConfirmTransactionBase extends Component { static contextTypes = { t: PropTypes.func, - tOrKey: PropTypes.func.isRequired, metricsEvent: PropTypes.func, } static propTypes = { // react-router props - match: PropTypes.object, history: PropTypes.object, // Redux props balance: PropTypes.string, cancelTransaction: PropTypes.func, cancelAllTransactions: PropTypes.func, clearConfirmTransaction: PropTypes.func, - clearSend: PropTypes.func, conversionRate: PropTypes.number, - currentCurrency: PropTypes.string, - editTransaction: PropTypes.func, - ethTransactionAmount: PropTypes.string, - ethTransactionFee: PropTypes.string, - ethTransactionTotal: PropTypes.string, - fiatTransactionAmount: PropTypes.string, - fiatTransactionFee: PropTypes.string, - fiatTransactionTotal: PropTypes.string, fromAddress: PropTypes.string, fromName: PropTypes.string, hexTransactionAmount: PropTypes.string, @@ -50,6 +41,9 @@ export default class ConfirmTransactionBase extends Component { isTxReprice: PropTypes.bool, methodData: PropTypes.object, nonce: PropTypes.string, + useNonceField: PropTypes.bool, + customNonceValue: PropTypes.string, + updateCustomNonce: PropTypes.func, assetImage: PropTypes.string, sendTransaction: PropTypes.func, showCustomizeGasModal: PropTypes.func, @@ -59,6 +53,8 @@ export default class ConfirmTransactionBase extends Component { tokenData: PropTypes.object, tokenProps: PropTypes.object, toName: PropTypes.string, + toEns: PropTypes.string, + toNickname: PropTypes.string, transactionStatus: PropTypes.string, txData: PropTypes.object, unapprovedTxCount: PropTypes.number, @@ -95,11 +91,19 @@ export default class ConfirmTransactionBase extends Component { insufficientBalance: PropTypes.bool, hideFiatConversion: PropTypes.bool, transactionCategory: PropTypes.string, + getNextNonce: PropTypes.func, + nextNonce: PropTypes.number, + tryReverseResolveAddress: PropTypes.func.isRequired, + hideSenderToRecipient: PropTypes.bool, + showAccountInHeader: PropTypes.bool, + mostRecentOverviewPage: PropTypes.string.isRequired, + isMainnet: PropTypes.bool, } state = { submitting: false, submitError: null, + submitWarning: '', } componentDidUpdate (prevProps) { @@ -108,20 +112,40 @@ export default class ConfirmTransactionBase extends Component { showTransactionConfirmedModal, history, clearConfirmTransaction, + mostRecentOverviewPage, + nextNonce, + customNonceValue, + toAddress, + tryReverseResolveAddress, } = this.props - const { transactionStatus: prevTxStatus } = prevProps + const { + customNonceValue: prevCustomNonceValue, + nextNonce: prevNextNonce, + toAddress: prevToAddress, + transactionStatus: prevTxStatus, + } = prevProps const statusUpdated = transactionStatus !== prevTxStatus const txDroppedOrConfirmed = transactionStatus === DROPPED_STATUS || transactionStatus === CONFIRMED_STATUS + if (nextNonce !== prevNextNonce || customNonceValue !== prevCustomNonceValue) { + if (customNonceValue > nextNonce) { + this.setState({ submitWarning: this.context.t('nextNonceWarning', [nextNonce]) }) + } else { + this.setState({ submitWarning: '' }) + } + } + if (statusUpdated && txDroppedOrConfirmed) { showTransactionConfirmedModal({ onSubmit: () => { clearConfirmTransaction() - history.push(DEFAULT_ROUTE) + history.push(mostRecentOverviewPage) }, }) + } - return + if (toAddress && toAddress !== prevToAddress) { + tryReverseResolveAddress(toAddress) } } @@ -153,7 +177,7 @@ export default class ConfirmTransactionBase extends Component { } } - if (customGas.gasLimit < 21000) { + if (hexToDecimal(customGas.gasLimit) < 21000) { return { valid: false, errorKey: GAS_LIMIT_TOO_LOW_ERROR_KEY, @@ -203,17 +227,25 @@ export default class ConfirmTransactionBase extends Component { hexTransactionFee, hexTransactionTotal, hideDetails, + useNonceField, + customNonceValue, + updateCustomNonce, advancedInlineGasShown, customGas, insufficientBalance, updateGasAndCalculate, hideFiatConversion, + nextNonce, + getNextNonce, + isMainnet, } = this.props if (hideDetails) { return null } + const notMainnetOrTest = !(isMainnet || process.env.IN_TEST) + return ( detailsComponent || (
    @@ -221,25 +253,27 @@ export default class ConfirmTransactionBase extends Component { this.handleEditGas()} + headerText={notMainnetOrTest ? '' : 'Edit'} + headerTextClassName={notMainnetOrTest ? '' : 'confirm-detail-row__header-text--edit'} + onHeaderClick={notMainnetOrTest ? null : () => this.handleEditGas()} secondaryText={hideFiatConversion ? this.context.t('noConversionRateAvailable') : ''} /> - {advancedInlineGasShown - ? updateGasAndCalculate({ ...customGas, gasPrice: newGasPrice })} - updateCustomGasLimit={newGasLimit => updateGasAndCalculate({ ...customGas, gasLimit: newGasLimit })} - customGasPrice={customGas.gasPrice} - customGasLimit={customGas.gasLimit} - insufficientBalance={insufficientBalance} - customPriceIsSafe={true} - isSpeedUp={false} - /> + {advancedInlineGasShown || notMainnetOrTest + ? ( + updateGasAndCalculate({ ...customGas, gasPrice: newGasPrice })} + updateCustomGasLimit={(newGasLimit) => updateGasAndCalculate({ ...customGas, gasLimit: newGasLimit })} + customGasPrice={customGas.gasPrice} + customGasLimit={customGas.gasLimit} + insufficientBalance={insufficientBalance} + customPriceIsSafe + isSpeedUp={false} + /> + ) : null }
    -
    +
    + {useNonceField ? ( +
    +
    +
    + { this.context.t('nonceFieldHeading') } +
    +
    + { + if (!value.length || Number(value) < 0) { + updateCustomNonce('') + } else { + updateCustomNonce(String(Math.floor(value))) + } + getNextNonce() + }} + fullWidth + margin="dense" + value={ customNonceValue || '' } + /> +
    +
    +
    + ) : null}
    ) ) } - renderData () { + renderData (functionType) { const { t } = this.context const { txData: { @@ -264,12 +325,10 @@ export default class ConfirmTransactionBase extends Component { } = {}, } = {}, methodData: { - name, params, } = {}, hideData, dataComponent, - transactionCategory, } = this.props if (hideData) { @@ -281,7 +340,7 @@ export default class ConfirmTransactionBase extends Component {
    {`${t('functionType')}:`} - { getMethodName(name) || this.context.tOrKey(transactionCategory) || this.context.t('contractInteraction') } + { functionType }
    { @@ -330,50 +389,78 @@ export default class ConfirmTransactionBase extends Component { cancelAllTransactions, clearConfirmTransaction, history, + mostRecentOverviewPage, showRejectTransactionsConfirmationModal, unapprovedTxCount, } = this.props showRejectTransactionsConfirmationModal({ unapprovedTxCount, - async onSubmit () { + onSubmit: async () => { + this._removeBeforeUnload() await cancelAllTransactions() clearConfirmTransaction() - history.push(DEFAULT_ROUTE) + history.push(mostRecentOverviewPage) }, }) } handleCancel () { const { metricsEvent } = this.context - const { onCancel, txData, cancelTransaction, history, clearConfirmTransaction, actionKey, txData: { origin }, methodData = {} } = this.props + const { + onCancel, + txData, + cancelTransaction, + history, + mostRecentOverviewPage, + clearConfirmTransaction, + actionKey, + txData: { origin }, + methodData = {}, + updateCustomNonce, + } = this.props + this._removeBeforeUnload() + metricsEvent({ + eventOpts: { + category: 'Transactions', + action: 'Confirm Screen', + name: 'Cancel', + }, + customVariables: { + recipientKnown: null, + functionType: actionKey || getMethodName(methodData.name) || 'contractInteraction', + origin, + }, + }) + updateCustomNonce('') if (onCancel) { - metricsEvent({ - eventOpts: { - category: 'Transactions', - action: 'Confirm Screen', - name: 'Cancel', - }, - customVariables: { - recipientKnown: null, - functionType: actionKey || getMethodName(methodData.name) || 'contractInteraction', - origin, - }, - }) onCancel(txData) } else { cancelTransaction(txData) .then(() => { clearConfirmTransaction() - history.push(DEFAULT_ROUTE) + history.push(mostRecentOverviewPage) }) } } handleSubmit () { const { metricsEvent } = this.context - const { txData: { origin }, sendTransaction, clearConfirmTransaction, txData, history, onSubmit, actionKey, metaMetricsSendCount = 0, setMetaMetricsSendCount, methodData = {} } = this.props + const { + txData: { origin }, + sendTransaction, + clearConfirmTransaction, + txData, + history, + onSubmit, + actionKey, + mostRecentOverviewPage, + metaMetricsSendCount = 0, + setMetaMetricsSendCount, + methodData = {}, + updateCustomNonce, + } = this.props const { submitting } = this.state if (submitting) { @@ -384,6 +471,7 @@ export default class ConfirmTransactionBase extends Component { submitting: true, submitError: null, }, () => { + this._removeBeforeUnload() metricsEvent({ eventOpts: { category: 'Transactions', @@ -405,6 +493,7 @@ export default class ConfirmTransactionBase extends Component { this.setState({ submitting: false, }) + updateCustomNonce('') }) } else { sendTransaction(txData) @@ -413,14 +502,16 @@ export default class ConfirmTransactionBase extends Component { this.setState({ submitting: false, }, () => { - history.push(DEFAULT_ROUTE) + history.push(mostRecentOverviewPage) + updateCustomNonce('') }) }) - .catch(error => { + .catch((error) => { this.setState({ submitting: false, submitError: error.message, }) + updateCustomNonce('') }) } }) @@ -475,7 +566,7 @@ export default class ConfirmTransactionBase extends Component { getNavigateTxData () { const { currentNetworkUnapprovedTxs, txData: { id } = {} } = this.props - const enumUnapprovedTxs = Object.keys(currentNetworkUnapprovedTxs).reverse() + const enumUnapprovedTxs = Object.keys(currentNetworkUnapprovedTxs) const currentPosition = enumUnapprovedTxs.indexOf(id ? id.toString() : '') return { @@ -491,9 +582,31 @@ export default class ConfirmTransactionBase extends Component { } } - componentDidMount () { + _beforeUnload = () => { const { txData: { origin, id } = {}, cancelTransaction } = this.props const { metricsEvent } = this.context + metricsEvent({ + eventOpts: { + category: 'Transactions', + action: 'Confirm Screen', + name: 'Cancel Tx Via Notification Close', + }, + customVariables: { + origin, + }, + }) + cancelTransaction({ id }) + } + + _removeBeforeUnload = () => { + if (getEnvironmentType() === ENVIRONMENT_TYPE_NOTIFICATION) { + window.removeEventListener('beforeunload', this._beforeUnload) + } + } + + componentDidMount () { + const { toAddress, txData: { origin } = {}, getNextNonce, tryReverseResolveAddress } = this.props + const { metricsEvent } = this.context metricsEvent({ eventOpts: { category: 'Transactions', @@ -505,30 +618,30 @@ export default class ConfirmTransactionBase extends Component { }, }) - if (getEnvironmentType(window.location.href) === ENVIRONMENT_TYPE_NOTIFICATION) { - window.onbeforeunload = () => { - metricsEvent({ - eventOpts: { - category: 'Transactions', - action: 'Confirm Screen', - name: 'Cancel Tx Via Notification Close', - }, - customVariables: { - origin, - }, - }) - cancelTransaction({ id }) - } + if (getEnvironmentType() === ENVIRONMENT_TYPE_NOTIFICATION) { + window.addEventListener('beforeunload', this._beforeUnload) } + + getNextNonce() + if (toAddress) { + tryReverseResolveAddress(toAddress) + } + } + + componentWillUnmount () { + this._removeBeforeUnload() } render () { + const { t } = this.context const { isTxReprice, fromName, fromAddress, toName, toAddress, + toEns, + toNickname, methodData, valid: propsValid = true, errorMessage, @@ -541,26 +654,40 @@ export default class ConfirmTransactionBase extends Component { contentComponent, onEdit, nonce, + customNonceValue, assetImage, warning, unapprovedTxCount, transactionCategory, + hideSenderToRecipient, + showAccountInHeader, } = this.props - const { submitting, submitError } = this.state + const { submitting, submitError, submitWarning } = this.state const { name } = methodData const { valid, errorKey } = this.getErrorKey() const { totalTx, positionOfCurrentTx, nextTxId, prevTxId, showNavigation, firstTx, lastTx, ofText, requestsWaitingText } = this.getNavigateTxData() + let functionType = getMethodName(name) + if (!functionType) { + if (transactionCategory) { + functionType = t(transactionCategory) || transactionCategory + } else { + functionType = t('contractInteraction') + } + } + return ( this.handleCancelAll()} onCancel={() => this.handleCancel()} onSubmit={() => this.handleSubmit()} + hideSenderToRecipient={hideSenderToRecipient} /> ) } @@ -603,7 +731,7 @@ export function getMethodName (camelCase) { } return camelCase - .replace(/([a-z])([A-Z])/g, '$1 $2') - .replace(/([A-Z])([a-z])/g, ' $1$2') - .replace(/ +/g, ' ') + .replace(/([a-z])([A-Z])/ug, '$1 $2') + .replace(/([A-Z])([a-z])/ug, ' $1$2') + .replace(/ +/ug, ' ') } diff --git a/ui/app/pages/confirm-transaction-base/confirm-transaction-base.container.js b/ui/app/pages/confirm-transaction-base/confirm-transaction-base.container.js index 2a1b78a8ef9a..08b0f4581211 100644 --- a/ui/app/pages/confirm-transaction-base/confirm-transaction-base.container.js +++ b/ui/app/pages/confirm-transaction-base/confirm-transaction-base.container.js @@ -1,14 +1,22 @@ import { connect } from 'react-redux' -import { compose } from 'recompose' +import { compose } from 'redux' import { withRouter } from 'react-router-dom' -import R from 'ramda' import contractMap from 'eth-contract-metadata' -import ConfirmTransactionBase from './confirm-transaction-base.component' import { clearConfirmTransaction, } from '../../ducks/confirm-transaction/confirm-transaction.duck' -import { clearSend, cancelTx, cancelTxs, updateAndApproveTx, showModal, setMetaMetricsSendCount, updateTransaction } from '../../store/actions' +import { + updateCustomNonce, + cancelTx, + cancelTxs, + updateAndApproveTx, + showModal, + setMetaMetricsSendCount, + updateTransaction, + getNextNonce, + tryReverseResolveAddress, +} from '../../store/actions' import { INSUFFICIENT_FUNDS_ERROR_KEY, GAS_LIMIT_TOO_LOW_ERROR_KEY, @@ -17,9 +25,19 @@ import { getHexGasTotal } from '../../helpers/utils/confirm-tx.util' import { isBalanceSufficient, calcGasTotal } from '../send/send.utils' import { conversionGreaterThan } from '../../helpers/utils/conversion-util' import { MIN_GAS_LIMIT_DEC } from '../send/send.constants' -import { checksumAddress, addressSlicer, valuesFor } from '../../helpers/utils/util' -import { getMetaMaskAccounts, getAdvancedInlineGasShown, preferencesSelector, getIsMainnet, getKnownMethodData } from '../../selectors/selectors' -import { transactionFeeSelector } from '../../selectors/confirm-transaction' +import { checksumAddress, shortenAddress, valuesFor } from '../../helpers/utils/util' +import { + getAdvancedInlineGasShown, + getCustomNonceValue, + getIsMainnet, + getKnownMethodData, + getMetaMaskAccounts, + getUseNonceField, + getPreferences, + transactionFeeSelector, +} from '../../selectors' +import { getMostRecentOverviewPage } from '../../ducks/history/history' +import ConfirmTransactionBase from './confirm-transaction-base.component' const casedContractMap = Object.keys(contractMap).reduce((acc, base) => { return { @@ -28,22 +46,28 @@ const casedContractMap = Object.keys(contractMap).reduce((acc, base) => { } }, {}) +let customNonceValue = '' +const customNonceMerge = (txData) => (customNonceValue ? ({ + ...txData, + customNonceValue, +}) : txData) + const mapStateToProps = (state, ownProps) => { - const { toAddress: propsToAddress, match: { params = {} } } = ownProps + const { toAddress: propsToAddress, customTxParamsData, match: { params = {} } } = ownProps const { id: paramsTransactionId } = params - const { showFiatInTestnets } = preferencesSelector(state) + const { showFiatInTestnets } = getPreferences(state) const isMainnet = getIsMainnet(state) const { confirmTransaction, metamask } = state const { + ensResolutionsByAddress, conversionRate, identities, - currentCurrency, - selectedAddress, - selectedAddressTxList, + addressBook, assetImages, network, unapprovedTxs, metaMetricsSendCount, + nextNonce, } = metamask const { tokenData, @@ -52,7 +76,9 @@ const mapStateToProps = (state, ownProps) => { nonce, } = confirmTransaction const { txParams = {}, lastGasPrice, id: transactionId, transactionCategory } = txData - const transaction = R.find(({ id }) => id === (transactionId || Number(paramsTransactionId)))(selectedAddressTxList) || {} + const transaction = Object.values(unapprovedTxs).find( + ({ id }) => id === (transactionId || Number(paramsTransactionId)), + ) || {} const { from: fromAddress, to: txParamsToAddress, @@ -60,31 +86,26 @@ const mapStateToProps = (state, ownProps) => { gas: gasLimit, value: amount, data, - } = transaction && transaction.txParams || txParams + } = (transaction && transaction.txParams) || txParams const accounts = getMetaMaskAccounts(state) const assetImage = assetImages[txParamsToAddress] - const { balance } = accounts[selectedAddress] - const { name: fromName } = identities[selectedAddress] + const { balance } = accounts[fromAddress] + const { name: fromName } = identities[fromAddress] const toAddress = propsToAddress || txParamsToAddress - const toName = identities[toAddress] - ? identities[toAddress].name - : ( - casedContractMap[toAddress] - ? casedContractMap[toAddress].name - : addressSlicer(checksumAddress(toAddress)) - ) + const toName = identities[toAddress]?.name || + casedContractMap[toAddress]?.name || + shortenAddress(checksumAddress(toAddress)) + + const checksummedAddress = checksumAddress(toAddress) + const addressBookObject = addressBook[checksummedAddress] + const toEns = ensResolutionsByAddress[checksummedAddress] || '' + const toNickname = addressBookObject ? addressBookObject.name : '' const isTxReprice = Boolean(lastGasPrice) const transactionStatus = transaction ? transaction.status : '' const { - ethTransactionAmount, - ethTransactionFee, - ethTransactionTotal, - fiatTransactionAmount, - fiatTransactionFee, - fiatTransactionTotal, hexTransactionAmount, hexTransactionFee, hexTransactionTotal, @@ -94,10 +115,9 @@ const mapStateToProps = (state, ownProps) => { txData.simulationFails = transaction.simulationFails } - const currentNetworkUnapprovedTxs = R.filter( - ({ metamaskNetworkId }) => metamaskNetworkId === network, - unapprovedTxs, - ) + const currentNetworkUnapprovedTxs = Object.keys(unapprovedTxs) + .filter((key) => unapprovedTxs[key].metamaskNetworkId === network) + .reduce((acc, key) => ({ ...acc, [key]: unapprovedTxs[key] }), {}) const unapprovedTxCount = valuesFor(currentNetworkUnapprovedTxs).length const insufficientBalance = !isBalanceSufficient({ @@ -109,27 +129,33 @@ const mapStateToProps = (state, ownProps) => { const methodData = getKnownMethodData(state, data) || {} + let fullTxData = { ...txData, ...transaction } + if (customTxParamsData) { + fullTxData = { + ...fullTxData, + txParams: { + ...fullTxData.txParams, + data: customTxParamsData, + }, + } + } + return { balance, fromAddress, fromName, toAddress, + toEns, toName, - ethTransactionAmount, - ethTransactionFee, - ethTransactionTotal, - fiatTransactionAmount, - fiatTransactionFee, - fiatTransactionTotal, + toNickname, hexTransactionAmount, hexTransactionFee, hexTransactionTotal, - txData: { ...txData, ...transaction }, + txData: fullTxData, tokenData, methodData, tokenProps, isTxReprice, - currentCurrency, conversionRate, transactionStatus, nonce, @@ -142,18 +168,29 @@ const mapStateToProps = (state, ownProps) => { gasPrice, }, advancedInlineGasShown: getAdvancedInlineGasShown(state), + useNonceField: getUseNonceField(state), + customNonceValue: getCustomNonceValue(state), insufficientBalance, hideSubtitle: (!isMainnet && !showFiatInTestnets), hideFiatConversion: (!isMainnet && !showFiatInTestnets), metaMetricsSendCount, transactionCategory, + nextNonce, + mostRecentOverviewPage: getMostRecentOverviewPage(state), + isMainnet, } } -const mapDispatchToProps = dispatch => { +export const mapDispatchToProps = (dispatch) => { return { + tryReverseResolveAddress: (address) => { + return dispatch(tryReverseResolveAddress(address)) + }, + updateCustomNonce: (value) => { + customNonceValue = value + dispatch(updateCustomNonce(value)) + }, clearConfirmTransaction: () => dispatch(clearConfirmTransaction()), - clearSend: () => dispatch(clearSend()), showTransactionConfirmedModal: ({ onSubmit }) => { return dispatch(showModal({ name: 'TRANSACTION_CONFIRMED', onSubmit })) }, @@ -168,8 +205,9 @@ const mapDispatchToProps = dispatch => { }, cancelTransaction: ({ id }) => dispatch(cancelTx({ id })), cancelAllTransactions: (txList) => dispatch(cancelTxs(txList)), - sendTransaction: txData => dispatch(updateAndApproveTx(txData)), - setMetaMetricsSendCount: val => dispatch(setMetaMetricsSendCount(val)), + sendTransaction: (txData) => dispatch(updateAndApproveTx(customNonceMerge(txData))), + setMetaMetricsSendCount: (val) => dispatch(setMetaMetricsSendCount(val)), + getNextNonce: () => dispatch(getNextNonce()), } } @@ -234,7 +272,7 @@ const mergeProps = (stateProps, dispatchProps, ownProps) => { ...ownProps, showCustomizeGasModal: () => dispatchShowCustomizeGasModal({ txData, - onSubmit: customGas => dispatchUpdateGasAndCalculate(customGas), + onSubmit: (customGas) => dispatchUpdateGasAndCalculate(customGas), validate: validateEditGas, }), cancelAllTransactions: () => dispatchCancelAllTransactions(valuesFor(unapprovedTxs)), @@ -254,5 +292,5 @@ const mergeProps = (stateProps, dispatchProps, ownProps) => { export default compose( withRouter, - connect(mapStateToProps, mapDispatchToProps, mergeProps) + connect(mapStateToProps, mapDispatchToProps, mergeProps), )(ConfirmTransactionBase) diff --git a/ui/app/pages/confirm-transaction-base/tests/confirm-transaction-base.component.test.js b/ui/app/pages/confirm-transaction-base/tests/confirm-transaction-base.component.test.js index 8ca7ca4e78a3..92ac0c66bc10 100644 --- a/ui/app/pages/confirm-transaction-base/tests/confirm-transaction-base.component.test.js +++ b/ui/app/pages/confirm-transaction-base/tests/confirm-transaction-base.component.test.js @@ -1,9 +1,9 @@ import assert from 'assert' import { getMethodName } from '../confirm-transaction-base.component' -describe('ConfirmTransactionBase Component', () => { - describe('getMethodName', () => { - it('should get correct method names', () => { +describe('ConfirmTransactionBase Component', function () { + describe('getMethodName', function () { + it('should get correct method names', function () { assert.equal(getMethodName(undefined), '') assert.equal(getMethodName({}), '') assert.equal(getMethodName('confirm'), 'confirm') diff --git a/ui/app/pages/confirm-transaction-switch/confirm-transaction-switch.component.js b/ui/app/pages/confirm-transaction-switch/confirm-transaction-switch.component.js index fc0606365b60..02014ee372f6 100644 --- a/ui/app/pages/confirm-transaction-switch/confirm-transaction-switch.component.js +++ b/ui/app/pages/confirm-transaction-switch/confirm-transaction-switch.component.js @@ -11,6 +11,8 @@ import { CONFIRM_TRANSFER_FROM_PATH, CONFIRM_TOKEN_METHOD_PATH, SIGNATURE_REQUEST_PATH, + DECRYPT_MESSAGE_REQUEST_PATH, + ENCRYPTION_PUBLIC_KEY_REQUEST_PATH, } from '../../helpers/constants/routes' import { TOKEN_METHOD_TRANSFER, @@ -19,12 +21,11 @@ import { DEPLOY_CONTRACT_ACTION_KEY, SEND_ETHER_ACTION_KEY, } from '../../helpers/constants/transactions' +import { MESSAGE_TYPE } from '../../../../app/scripts/lib/enums' export default class ConfirmTransactionSwitch extends Component { static propTypes = { txData: PropTypes.object, - isEtherTransaction: PropTypes.bool, - isTokenMethod: PropTypes.bool, } redirectToTransaction () { @@ -70,11 +71,15 @@ export default class ConfirmTransactionSwitch extends Component { render () { const { txData } = this.props - if (txData.txParams) { return this.redirectToTransaction() } else if (txData.msgParams) { - const pathname = `${CONFIRM_TRANSACTION_ROUTE}/${txData.id}${SIGNATURE_REQUEST_PATH}` + let pathname = `${CONFIRM_TRANSACTION_ROUTE}/${txData.id}${SIGNATURE_REQUEST_PATH}` + if (txData.type === MESSAGE_TYPE.ETH_DECRYPT) { + pathname = `${CONFIRM_TRANSACTION_ROUTE}/${txData.id}${DECRYPT_MESSAGE_REQUEST_PATH}` + } else if (txData.type === MESSAGE_TYPE.ETH_GET_ENCRYPTION_PUBLIC_KEY) { + pathname = `${CONFIRM_TRANSACTION_ROUTE}/${txData.id}${ENCRYPTION_PUBLIC_KEY_REQUEST_PATH}` + } return } diff --git a/ui/app/pages/confirm-transaction-switch/confirm-transaction-switch.container.js b/ui/app/pages/confirm-transaction-switch/confirm-transaction-switch.container.js index 230a931ad4c9..dd6970d87cea 100644 --- a/ui/app/pages/confirm-transaction-switch/confirm-transaction-switch.container.js +++ b/ui/app/pages/confirm-transaction-switch/confirm-transaction-switch.container.js @@ -1,30 +1,22 @@ import { connect } from 'react-redux' +import { unconfirmedTransactionsListSelector } from '../../selectors' import ConfirmTransactionSwitch from './confirm-transaction-switch.component' -import { - TOKEN_METHOD_TRANSFER, - TOKEN_METHOD_APPROVE, - TOKEN_METHOD_TRANSFER_FROM, - SEND_ETHER_ACTION_KEY, -} from '../../helpers/constants/transactions' -import { unconfirmedTransactionsListSelector } from '../../selectors/confirm-transaction' const mapStateToProps = (state, ownProps) => { const { metamask: { unapprovedTxs } } = state const { match: { params = {}, url } } = ownProps - const urlId = url && url.match(/\d+/) && url.match(/\d+/)[0] + const urlId = url && url.match(/\d+/u) && url.match(/\d+/u)[0] const { id: paramsId } = params const transactionId = paramsId || urlId const unconfirmedTransactions = unconfirmedTransactionsListSelector(state) const totalUnconfirmed = unconfirmedTransactions.length const transaction = totalUnconfirmed - ? unapprovedTxs[transactionId] || unconfirmedTransactions[totalUnconfirmed - 1] + ? unapprovedTxs[transactionId] || unconfirmedTransactions[0] : {} return { txData: transaction, - isEtherTransaction: transaction && transaction.transactionCategory === SEND_ETHER_ACTION_KEY, - isTokenMethod: [TOKEN_METHOD_APPROVE, TOKEN_METHOD_TRANSFER, TOKEN_METHOD_TRANSFER_FROM].includes(transaction && transaction.transactionCategory && transaction.transactionCategory.toLowerCase()), } } diff --git a/ui/app/pages/confirm-transaction-switch/index.js b/ui/app/pages/confirm-transaction-switch/index.js index c288acb1a6d9..86576d388b57 100644 --- a/ui/app/pages/confirm-transaction-switch/index.js +++ b/ui/app/pages/confirm-transaction-switch/index.js @@ -1,2 +1,3 @@ import ConfirmTransactionSwitch from './confirm-transaction-switch.container' -module.exports = ConfirmTransactionSwitch + +export default ConfirmTransactionSwitch diff --git a/ui/app/pages/confirm-transaction/conf-tx.js b/ui/app/pages/confirm-transaction/conf-tx.js index f9af6624e5e6..f9dbde2a5d64 100644 --- a/ui/app/pages/confirm-transaction/conf-tx.js +++ b/ui/app/pages/confirm-transaction/conf-tx.js @@ -1,225 +1,260 @@ -const inherits = require('util').inherits -const Component = require('react').Component -const h = require('react-hyperscript') -const connect = require('react-redux').connect -const { withRouter } = require('react-router-dom') -const { compose } = require('recompose') -const actions = require('../../store/actions') -const txHelper = require('../../../lib/tx-helper') -const log = require('loglevel') -const R = require('ramda') - -const SignatureRequest = require('../../components/app/signature-request') -const Loading = require('../../components/ui/loading-screen') -const { DEFAULT_ROUTE } = require('../../helpers/constants/routes') -const { getMetaMaskAccounts } = require('../../selectors/selectors') - -module.exports = compose( - withRouter, - connect(mapStateToProps) -)(ConfirmTxScreen) +import PropTypes from 'prop-types' +import React, { Component } from 'react' +import { connect } from 'react-redux' +import { withRouter } from 'react-router-dom' +import { compose } from 'redux' +import log from 'loglevel' +import * as actions from '../../store/actions' +import txHelper from '../../../lib/tx-helper' +import SignatureRequest from '../../components/app/signature-request' +import SignatureRequestOriginal from '../../components/app/signature-request-original' +import Loading from '../../components/ui/loading-screen' +import { getMostRecentOverviewPage } from '../../ducks/history/history' +import { MESSAGE_TYPE } from '../../../../app/scripts/lib/enums' function mapStateToProps (state) { - const { metamask } = state + const { metamask, appState } = state const { unapprovedMsgCount, unapprovedPersonalMsgCount, unapprovedTypedMessagesCount, } = metamask + const { + txId, + } = appState return { identities: state.metamask.identities, - accounts: getMetaMaskAccounts(state), - selectedAddress: state.metamask.selectedAddress, + mostRecentOverviewPage: getMostRecentOverviewPage(state), unapprovedTxs: state.metamask.unapprovedTxs, unapprovedMsgs: state.metamask.unapprovedMsgs, unapprovedPersonalMsgs: state.metamask.unapprovedPersonalMsgs, unapprovedTypedMessages: state.metamask.unapprovedTypedMessages, - index: state.appState.currentView.context, + index: txId, warning: state.appState.warning, network: state.metamask.network, provider: state.metamask.provider, - conversionRate: state.metamask.conversionRate, currentCurrency: state.metamask.currentCurrency, blockGasLimit: state.metamask.currentBlockGasLimit, - computedBalances: state.metamask.computedBalances, unapprovedMsgCount, unapprovedPersonalMsgCount, unapprovedTypedMessagesCount, send: state.metamask.send, - selectedAddressTxList: state.metamask.selectedAddressTxList, + currentNetworkTxList: state.metamask.currentNetworkTxList, } } -inherits(ConfirmTxScreen, Component) -function ConfirmTxScreen () { - Component.call(this) -} +class ConfirmTxScreen extends Component { + static propTypes = { + mostRecentOverviewPage: PropTypes.string.isRequired, + unapprovedMsgCount: PropTypes.number, + unapprovedPersonalMsgCount: PropTypes.number, + unapprovedTypedMessagesCount: PropTypes.number, + network: PropTypes.string, + index: PropTypes.number, + unapprovedTxs: PropTypes.object, + unapprovedMsgs: PropTypes.object, + unapprovedPersonalMsgs: PropTypes.object, + unapprovedTypedMessages: PropTypes.object, + match: PropTypes.shape({ + params: PropTypes.shape({ + id: PropTypes.string, + }), + }), -ConfirmTxScreen.prototype.getUnapprovedMessagesTotal = function () { - const { - unapprovedMsgCount = 0, - unapprovedPersonalMsgCount = 0, - unapprovedTypedMessagesCount = 0, - } = this.props + currentNetworkTxList: PropTypes.array, + currentCurrency: PropTypes.string, + blockGasLimit: PropTypes.string, + history: PropTypes.object, + identities: PropTypes.object, + dispatch: PropTypes.func.isRequired, + send: PropTypes.shape({ + to: PropTypes.string, + }).isRequired, + } - return unapprovedTypedMessagesCount + unapprovedMsgCount + unapprovedPersonalMsgCount -} + getUnapprovedMessagesTotal () { + const { + unapprovedMsgCount = 0, + unapprovedPersonalMsgCount = 0, + unapprovedTypedMessagesCount = 0, + } = this.props -ConfirmTxScreen.prototype.componentDidMount = function () { - const { - unapprovedTxs = {}, - network, - send, - } = this.props - const unconfTxList = txHelper(unapprovedTxs, {}, {}, {}, network) - - if (unconfTxList.length === 0 && !send.to && this.getUnapprovedMessagesTotal() === 0) { - this.props.history.push(DEFAULT_ROUTE) + return unapprovedTypedMessagesCount + unapprovedMsgCount + unapprovedPersonalMsgCount } -} -ConfirmTxScreen.prototype.componentDidUpdate = function (prevProps) { - const { - unapprovedTxs = {}, - network, - selectedAddressTxList, - send, - history, - match: { params: { id: transactionId } = {} }, - } = this.props - - let prevTx - - if (transactionId) { - prevTx = R.find(({ id }) => id + '' === transactionId)(selectedAddressTxList) - } else { - const { index: prevIndex, unapprovedTxs: prevUnapprovedTxs } = prevProps - const prevUnconfTxList = txHelper(prevUnapprovedTxs, {}, {}, {}, network) - const prevTxData = prevUnconfTxList[prevIndex] || {} - prevTx = selectedAddressTxList.find(({ id }) => id === prevTxData.id) || {} + getTxData () { + const { + network, + index, + unapprovedTxs, + unapprovedMsgs, + unapprovedPersonalMsgs, + unapprovedTypedMessages, + match: { params: { id: transactionId } = {} }, + } = this.props + + const unconfTxList = txHelper( + unapprovedTxs, + unapprovedMsgs, + unapprovedPersonalMsgs, + unapprovedTypedMessages, + network, + ) + + log.info(`rendering a combined ${unconfTxList.length} unconf msgs & txs`) + + return transactionId + ? unconfTxList.find(({ id }) => `${id}` === transactionId) + : unconfTxList[index] } - const unconfTxList = txHelper(unapprovedTxs, {}, {}, {}, network) + signatureSelect (type, version) { + // Temporarily direct only v3 and v4 requests to new code. + if (type === MESSAGE_TYPE.ETH_SIGN_TYPED_DATA && (version === 'V3' || version === 'V4')) { + return SignatureRequest + } - if (prevTx && prevTx.status === 'dropped') { - this.props.dispatch(actions.showModal({ - name: 'TRANSACTION_CONFIRMED', - onSubmit: () => history.push(DEFAULT_ROUTE), - })) + return SignatureRequestOriginal + } - return + signMessage (msgData, event) { + log.info('conf-tx.js: signing message') + const params = msgData.msgParams + params.metamaskId = msgData.id + this.stopPropagation(event) + return this.props.dispatch(actions.signMsg(params)) } - if (unconfTxList.length === 0 && !send.to && this.getUnapprovedMessagesTotal() === 0) { - this.props.history.push(DEFAULT_ROUTE) + stopPropagation (event) { + if (event.stopPropagation) { + event.stopPropagation() + } } -} -ConfirmTxScreen.prototype.getTxData = function () { - const { - network, - index, - unapprovedTxs, - unapprovedMsgs, - unapprovedPersonalMsgs, - unapprovedTypedMessages, - match: { params: { id: transactionId } = {} }, - } = this.props - - const unconfTxList = txHelper( - unapprovedTxs, - unapprovedMsgs, - unapprovedPersonalMsgs, - unapprovedTypedMessages, - network - ) - - log.info(`rendering a combined ${unconfTxList.length} unconf msgs & txs`) - - return transactionId - ? R.find(({ id }) => id + '' === transactionId)(unconfTxList) - : unconfTxList[index] -} + signPersonalMessage (msgData, event) { + log.info('conf-tx.js: signing personal message') + const params = msgData.msgParams + params.metamaskId = msgData.id + this.stopPropagation(event) + return this.props.dispatch(actions.signPersonalMsg(params)) + } -ConfirmTxScreen.prototype.render = function () { - const props = this.props - const { - currentCurrency, - conversionRate, - blockGasLimit, - } = props - - var txData = this.getTxData() || {} - const { msgParams } = txData - log.debug('msgParams detected, rendering pending msg') - - return msgParams - ? h(SignatureRequest, { - // Properties - txData: txData, - key: txData.id, - selectedAddress: props.selectedAddress, - accounts: props.accounts, - identities: props.identities, - conversionRate, - currentCurrency, - blockGasLimit, - // Actions - signMessage: this.signMessage.bind(this, txData), - signPersonalMessage: this.signPersonalMessage.bind(this, txData), - signTypedMessage: this.signTypedMessage.bind(this, txData), - cancelMessage: this.cancelMessage.bind(this, txData), - cancelPersonalMessage: this.cancelPersonalMessage.bind(this, txData), - cancelTypedMessage: this.cancelTypedMessage.bind(this, txData), - }) - : h(Loading) -} + signTypedMessage (msgData, event) { + log.info('conf-tx.js: signing typed message') + const params = msgData.msgParams + params.metamaskId = msgData.id + this.stopPropagation(event) + return this.props.dispatch(actions.signTypedMsg(params)) + } -ConfirmTxScreen.prototype.signMessage = function (msgData, event) { - log.info('conf-tx.js: signing message') - var params = msgData.msgParams - params.metamaskId = msgData.id - this.stopPropagation(event) - return this.props.dispatch(actions.signMsg(params)) -} + cancelMessage (msgData, event) { + log.info('canceling message') + this.stopPropagation(event) + return this.props.dispatch(actions.cancelMsg(msgData)) + } -ConfirmTxScreen.prototype.stopPropagation = function (event) { - if (event.stopPropagation) { - event.stopPropagation() + cancelPersonalMessage (msgData, event) { + log.info('canceling personal message') + this.stopPropagation(event) + return this.props.dispatch(actions.cancelPersonalMsg(msgData)) } -} -ConfirmTxScreen.prototype.signPersonalMessage = function (msgData, event) { - log.info('conf-tx.js: signing personal message') - var params = msgData.msgParams - params.metamaskId = msgData.id - this.stopPropagation(event) - return this.props.dispatch(actions.signPersonalMsg(params)) -} + cancelTypedMessage (msgData, event) { + log.info('canceling typed message') + this.stopPropagation(event) + return this.props.dispatch(actions.cancelTypedMsg(msgData)) + } -ConfirmTxScreen.prototype.signTypedMessage = function (msgData, event) { - log.info('conf-tx.js: signing typed message') - var params = msgData.msgParams - params.metamaskId = msgData.id - this.stopPropagation(event) - return this.props.dispatch(actions.signTypedMsg(params)) -} + componentDidMount () { + const { + unapprovedTxs = {}, + history, + mostRecentOverviewPage, + network, + send, + } = this.props + const unconfTxList = txHelper(unapprovedTxs, {}, {}, {}, network) -ConfirmTxScreen.prototype.cancelMessage = function (msgData, event) { - log.info('canceling message') - this.stopPropagation(event) - return this.props.dispatch(actions.cancelMsg(msgData)) -} + if (unconfTxList.length === 0 && !send.to && this.getUnapprovedMessagesTotal() === 0) { + history.push(mostRecentOverviewPage) + } + } -ConfirmTxScreen.prototype.cancelPersonalMessage = function (msgData, event) { - log.info('canceling personal message') - this.stopPropagation(event) - return this.props.dispatch(actions.cancelPersonalMsg(msgData)) -} + componentDidUpdate (prevProps) { + const { + unapprovedTxs = {}, + network, + currentNetworkTxList, + send, + history, + match: { params: { id: transactionId } = {} }, + mostRecentOverviewPage, + } = this.props + + let prevTx + + if (transactionId) { + prevTx = currentNetworkTxList.find(({ id }) => `${id}` === transactionId) + } else { + const { index: prevIndex, unapprovedTxs: prevUnapprovedTxs } = prevProps + const prevUnconfTxList = txHelper(prevUnapprovedTxs, {}, {}, {}, network) + const prevTxData = prevUnconfTxList[prevIndex] || {} + prevTx = currentNetworkTxList.find(({ id }) => id === prevTxData.id) || {} + } + + const unconfTxList = txHelper(unapprovedTxs, {}, {}, {}, network) + + if (prevTx && prevTx.status === 'dropped') { + this.props.dispatch(actions.showModal({ + name: 'TRANSACTION_CONFIRMED', + onSubmit: () => history.push(mostRecentOverviewPage), + })) -ConfirmTxScreen.prototype.cancelTypedMessage = function (msgData, event) { - log.info('canceling typed message') - this.stopPropagation(event) - return this.props.dispatch(actions.cancelTypedMsg(msgData)) + return + } + + if (unconfTxList.length === 0 && !send.to && this.getUnapprovedMessagesTotal() === 0) { + this.props.history.push(mostRecentOverviewPage) + } + } + + render () { + const { + currentCurrency, + blockGasLimit, + } = this.props + + const txData = this.getTxData() || {} + const { msgParams, type, msgParams: { version } } = txData + log.debug('msgParams detected, rendering pending msg') + + if (!msgParams) { + return ( + + ) + } + + const SigComponent = this.signatureSelect(type, version) + return ( + + ) + } } + +export default compose( + withRouter, + connect(mapStateToProps), +)(ConfirmTxScreen) diff --git a/ui/app/pages/confirm-transaction/confirm-transaction.component.js b/ui/app/pages/confirm-transaction/confirm-transaction.component.js index c8819dac3741..087b8e8b42ad 100644 --- a/ui/app/pages/confirm-transaction/confirm-transaction.component.js +++ b/ui/app/pages/confirm-transaction/confirm-transaction.component.js @@ -8,10 +8,11 @@ import ConfirmSendEther from '../confirm-send-ether' import ConfirmSendToken from '../confirm-send-token' import ConfirmDeployContract from '../confirm-deploy-contract' import ConfirmApprove from '../confirm-approve' -import ConfirmTokenTransactionBase from '../confirm-token-transaction-base' -import ConfTx from './conf-tx' +import ConfirmTokenTransactionBaseContainer from '../confirm-token-transaction-base' +import ConfirmDecryptMessage from '../confirm-decrypt-message' +import ConfirmEncryptionPublicKey from '../confirm-encryption-public-key' + import { - DEFAULT_ROUTE, CONFIRM_TRANSACTION_ROUTE, CONFIRM_DEPLOY_CONTRACT_PATH, CONFIRM_SEND_ETHER_PATH, @@ -20,19 +21,24 @@ import { CONFIRM_TRANSFER_FROM_PATH, CONFIRM_TOKEN_METHOD_PATH, SIGNATURE_REQUEST_PATH, + DECRYPT_MESSAGE_REQUEST_PATH, + ENCRYPTION_PUBLIC_KEY_REQUEST_PATH, } from '../../helpers/constants/routes' +import ConfTx from './conf-tx' export default class ConfirmTransaction extends Component { + static contextTypes = { + metricsEvent: PropTypes.func, + } + static propTypes = { history: PropTypes.object.isRequired, totalUnapprovedCount: PropTypes.number.isRequired, - match: PropTypes.object, send: PropTypes.object, - unconfirmedTransactions: PropTypes.array, setTransactionToConfirm: PropTypes.func, - confirmTransaction: PropTypes.object, clearConfirmTransaction: PropTypes.func, fetchBasicGasAndTimeEstimates: PropTypes.func, + mostRecentOverviewPage: PropTypes.string.isRequired, transaction: PropTypes.object, getContractMethodData: PropTypes.func, transactionId: PropTypes.string, @@ -41,16 +47,12 @@ export default class ConfirmTransaction extends Component { isTokenMethodAction: PropTypes.bool, } - getParamsTransactionId () { - const { match: { params: { id } = {} } } = this.props - return id || null - } - componentDidMount () { const { totalUnapprovedCount = 0, send = {}, history, + mostRecentOverviewPage, transaction: { txParams: { data, to } = {} } = {}, fetchBasicGasAndTimeEstimates, getContractMethodData, @@ -61,7 +63,7 @@ export default class ConfirmTransaction extends Component { } = this.props if (!totalUnapprovedCount && !send.to) { - history.replace(DEFAULT_ROUTE) + history.replace(mostRecentOverviewPage) return } @@ -70,7 +72,10 @@ export default class ConfirmTransaction extends Component { if (isTokenMethodAction) { getTokenParams(to) } - this.props.setTransactionToConfirm(transactionId || paramsTransactionId) + const txId = transactionId || paramsTransactionId + if (txId) { + this.props.setTransactionToConfirm(txId) + } } componentDidUpdate (prevProps) { @@ -82,6 +87,7 @@ export default class ConfirmTransaction extends Component { paramsTransactionId, transactionId, history, + mostRecentOverviewPage, totalUnapprovedCount, } = this.props @@ -89,13 +95,10 @@ export default class ConfirmTransaction extends Component { clearConfirmTransaction() getContractMethodData(data) setTransactionToConfirm(paramsTransactionId) - return } else if (prevProps.transactionId && !transactionId && !totalUnapprovedCount) { - history.replace(DEFAULT_ROUTE) - return + history.replace(mostRecentOverviewPage) } else if (prevProps.transactionId && transactionId && prevProps.transactionId !== transactionId) { - history.replace(DEFAULT_ROUTE) - return + history.replace(mostRecentOverviewPage) } } @@ -104,7 +107,6 @@ export default class ConfirmTransaction extends Component { // Show routes when state.confirmTransaction has been set and when either the ID in the params // isn't specified or is specified and matches the ID in state.confirmTransaction in order to // support URLs of /confirm-transaction or /confirm-transaction/ - return transactionId && (!paramsTransactionId || paramsTransactionId === transactionId) ? ( @@ -136,13 +138,23 @@ export default class ConfirmTransaction extends Component { + + ) diff --git a/ui/app/pages/confirm-transaction/confirm-transaction.container.js b/ui/app/pages/confirm-transaction/confirm-transaction.container.js index 6da855df285a..6ee2579ffff7 100644 --- a/ui/app/pages/confirm-transaction/confirm-transaction.container.js +++ b/ui/app/pages/confirm-transaction/confirm-transaction.container.js @@ -1,5 +1,5 @@ import { connect } from 'react-redux' -import { compose } from 'recompose' +import { compose } from 'redux' import { withRouter } from 'react-router-dom' import { setTransactionToConfirm, @@ -16,38 +16,43 @@ import { getContractMethodData, getTokenParams, } from '../../store/actions' +import { unconfirmedTransactionsListSelector } from '../../selectors' +import { getMostRecentOverviewPage } from '../../ducks/history/history' import ConfirmTransaction from './confirm-transaction.component' -import { unconfirmedTransactionsListSelector } from '../../selectors/confirm-transaction' const mapStateToProps = (state, ownProps) => { - const { metamask: { send, unapprovedTxs }, confirmTransaction } = state + const { + metamask: { + send, + unapprovedTxs, + }, + } = state const { match: { params = {} } } = ownProps const { id } = params const unconfirmedTransactions = unconfirmedTransactionsListSelector(state) const totalUnconfirmed = unconfirmedTransactions.length const transaction = totalUnconfirmed - ? unapprovedTxs[id] || unconfirmedTransactions[totalUnconfirmed - 1] + ? unapprovedTxs[id] || unconfirmedTransactions[0] : {} const { id: transactionId, transactionCategory } = transaction return { totalUnapprovedCount: totalUnconfirmed, send, - confirmTransaction, unapprovedTxs, id, + mostRecentOverviewPage: getMostRecentOverviewPage(state), paramsTransactionId: id && String(id), transactionId: transactionId && String(transactionId), - unconfirmedTransactions, transaction, isTokenMethodAction: isTokenMethodAction(transactionCategory), } } -const mapDispatchToProps = dispatch => { +const mapDispatchToProps = (dispatch) => { return { - setTransactionToConfirm: transactionId => { + setTransactionToConfirm: (transactionId) => { dispatch(setTransactionToConfirm(transactionId)) }, clearConfirmTransaction: () => dispatch(clearConfirmTransaction()), diff --git a/ui/app/pages/confirm-transaction/index.js b/ui/app/pages/confirm-transaction/index.js index 4bf42d85c271..a51e7b16298c 100644 --- a/ui/app/pages/confirm-transaction/index.js +++ b/ui/app/pages/confirm-transaction/index.js @@ -1,2 +1,3 @@ import ConfirmTransaction from './confirm-transaction.container' -module.exports = ConfirmTransaction + +export default ConfirmTransaction diff --git a/ui/app/pages/connected-accounts/connected-accounts.component.js b/ui/app/pages/connected-accounts/connected-accounts.component.js new file mode 100644 index 000000000000..3fea60ed3bd9 --- /dev/null +++ b/ui/app/pages/connected-accounts/connected-accounts.component.js @@ -0,0 +1,71 @@ +import PropTypes from 'prop-types' +import React, { PureComponent } from 'react' +import Popover from '../../components/ui/popover' +import ConnectedAccountsList from '../../components/app/connected-accounts-list' +import ConnectedAccountsPermissions from '../../components/app/connected-accounts-permissions' + +export default class ConnectedAccounts extends PureComponent { + static contextTypes = { + t: PropTypes.func.isRequired, + } + + static defaultProps = { + accountToConnect: null, + permissions: undefined, + } + + static propTypes = { + accountToConnect: PropTypes.object, + activeTabOrigin: PropTypes.string.isRequired, + connectAccount: PropTypes.func.isRequired, + connectedAccounts: PropTypes.array.isRequired, + mostRecentOverviewPage: PropTypes.string.isRequired, + permissions: PropTypes.array, + isActiveTabExtension: PropTypes.bool.isRequired, + selectedAddress: PropTypes.string.isRequired, + removePermittedAccount: PropTypes.func.isRequired, + setSelectedAddress: PropTypes.func.isRequired, + history: PropTypes.object.isRequired, + } + + render () { + const { + accountToConnect, + activeTabOrigin, + isActiveTabExtension, + connectAccount, + connectedAccounts, + history, + mostRecentOverviewPage, + permissions, + selectedAddress, + removePermittedAccount, + setSelectedAddress, + } = this.props + const { t } = this.context + + const connectedAccountsDescription = connectedAccounts.length > 1 + ? t('connectedAccountsDescriptionPlural', [connectedAccounts.length]) + : t('connectedAccountsDescriptionSingular') + + return ( + history.push(mostRecentOverviewPage)} + footerClassName="connected-accounts__footer" + footer={} + > + + + ) + } +} diff --git a/ui/app/pages/connected-accounts/connected-accounts.container.js b/ui/app/pages/connected-accounts/connected-accounts.container.js new file mode 100644 index 000000000000..0fe24583a8fa --- /dev/null +++ b/ui/app/pages/connected-accounts/connected-accounts.container.js @@ -0,0 +1,52 @@ +import { connect } from 'react-redux' +import { + getAccountToConnectToActiveTab, + getOrderedConnectedAccountsForActiveTab, + getPermissionsForActiveTab, + getSelectedAddress, +} from '../../selectors' +import { isExtensionUrl } from '../../helpers/utils/util' +import { addPermittedAccount, removePermittedAccount, setSelectedAddress } from '../../store/actions' +import { getMostRecentOverviewPage } from '../../ducks/history/history' +import ConnectedAccounts from './connected-accounts.component' + +const mapStateToProps = (state) => { + const { activeTab } = state + const accountToConnect = getAccountToConnectToActiveTab(state) + const connectedAccounts = getOrderedConnectedAccountsForActiveTab(state) + const permissions = getPermissionsForActiveTab(state) + const selectedAddress = getSelectedAddress(state) + + const isActiveTabExtension = isExtensionUrl(activeTab) + return { + accountToConnect, + isActiveTabExtension, + activeTabOrigin: activeTab.origin, + connectedAccounts, + mostRecentOverviewPage: getMostRecentOverviewPage(state), + permissions, + selectedAddress, + } +} + +const mapDispatchToProps = (dispatch) => { + return { + addPermittedAccount: (origin, address) => dispatch(addPermittedAccount(origin, address)), + removePermittedAccount: (origin, address) => dispatch(removePermittedAccount(origin, address)), + setSelectedAddress: (address) => dispatch(setSelectedAddress(address)), + } +} + +const mergeProps = (stateProps, dispatchProps, ownProps) => { + const { activeTabOrigin } = stateProps + + return { + ...ownProps, + ...stateProps, + ...dispatchProps, + connectAccount: (address) => dispatchProps.addPermittedAccount(activeTabOrigin, address), + removePermittedAccount: (address) => dispatchProps.removePermittedAccount(activeTabOrigin, address), + } +} + +export default connect(mapStateToProps, mapDispatchToProps, mergeProps)(ConnectedAccounts) diff --git a/ui/app/pages/connected-accounts/index.js b/ui/app/pages/connected-accounts/index.js new file mode 100644 index 000000000000..7497bc560e18 --- /dev/null +++ b/ui/app/pages/connected-accounts/index.js @@ -0,0 +1 @@ +export { default } from './connected-accounts.container' diff --git a/ui/app/pages/connected-accounts/index.scss b/ui/app/pages/connected-accounts/index.scss new file mode 100644 index 000000000000..a32c405f966c --- /dev/null +++ b/ui/app/pages/connected-accounts/index.scss @@ -0,0 +1,10 @@ +.connected-accounts { + &__footer { + a, + a:hover { + color: $primary-blue; + cursor: pointer; + font-size: 14px; + } + } +} diff --git a/ui/app/pages/connected-sites/connected-sites.component.js b/ui/app/pages/connected-sites/connected-sites.component.js new file mode 100644 index 000000000000..93a8d4e26e00 --- /dev/null +++ b/ui/app/pages/connected-sites/connected-sites.component.js @@ -0,0 +1,174 @@ +import PropTypes from 'prop-types' +import React, { Component } from 'react' +import ConnectedSitesList from '../../components/app/connected-sites-list' +import Popover from '../../components/ui/popover/popover.component' +import Button from '../../components/ui/button' + +export default class ConnectedSites extends Component { + static contextTypes = { + t: PropTypes.func, + } + + static defaultProps = { + tabToConnect: null, + } + + static propTypes = { + accountLabel: PropTypes.string.isRequired, + closePopover: PropTypes.func.isRequired, + connectedDomains: PropTypes.arrayOf(PropTypes.object).isRequired, + domainHostCount: PropTypes.objectOf(PropTypes.number).isRequired, + disconnectAllAccounts: PropTypes.func.isRequired, + disconnectAccount: PropTypes.func.isRequired, + getOpenMetamaskTabsIds: PropTypes.func.isRequired, + permittedAccountsByOrigin: PropTypes.objectOf( + PropTypes.arrayOf(PropTypes.string), + ).isRequired, + tabToConnect: PropTypes.object, + requestAccountsPermission: PropTypes.func.isRequired, + } + + state = { + sitePendingDisconnect: null, + } + + componentDidMount () { + const { getOpenMetamaskTabsIds } = this.props + getOpenMetamaskTabsIds() + } + + setPendingDisconnect = (domainKey) => { + this.setState({ + sitePendingDisconnect: { + domainKey, + }, + }) + } + + clearPendingDisconnect = () => { + this.setState({ + sitePendingDisconnect: null, + }) + } + + disconnectAccount = () => { + const { disconnectAccount } = this.props + const { sitePendingDisconnect } = this.state + + disconnectAccount(sitePendingDisconnect.domainKey) + this.clearPendingDisconnect() + } + + disconnectAllAccounts = () => { + const { disconnectAllAccounts } = this.props + const { sitePendingDisconnect } = this.state + + disconnectAllAccounts(sitePendingDisconnect.domainKey) + this.clearPendingDisconnect() + } + + renderConnectedSitesList () { + return ( + + ) + } + + renderConnectedSitesPopover () { + const { + accountLabel, + closePopover, + connectedDomains, + tabToConnect, + requestAccountsPermission, + } = this.props + const { t } = this.context + + return ( + + {t('connectManually')} +
    + ) + : null + } + footerClassName="connected-sites__add-site-manually" + > + {this.renderConnectedSitesList()} + + ) + } + + renderDisconnectPopover () { + + const { closePopover, permittedAccountsByOrigin } = this.props + const { t } = this.context + const { sitePendingDisconnect: { domainKey } } = this.state + + const numPermittedAccounts = permittedAccountsByOrigin[domainKey].length + + return ( + +
    + + +
    + { + numPermittedAccounts > 1 + ? ( + + ) + : null + } + + )} + footerClassName="connected-sites__confirmation" + /> + ) + } + + render () { + const { sitePendingDisconnect } = this.state + return ( + sitePendingDisconnect + ? this.renderDisconnectPopover() + : this.renderConnectedSitesPopover() + ) + } +} diff --git a/ui/app/pages/connected-sites/connected-sites.container.js b/ui/app/pages/connected-sites/connected-sites.container.js new file mode 100644 index 000000000000..f34558741e02 --- /dev/null +++ b/ui/app/pages/connected-sites/connected-sites.container.js @@ -0,0 +1,110 @@ +import { connect } from 'react-redux' +import { + getOpenMetamaskTabsIds, + requestAccountsPermissionWithId, + removePermissionsFor, + removePermittedAccount, +} from '../../store/actions' +import { + getConnectedDomainsForSelectedAddress, + getCurrentAccountWithSendEtherInfo, + getOriginOfCurrentTab, + getPermissionDomains, + getPermissionsMetadataHostCounts, + getPermittedAccountsByOrigin, + getSelectedAddress, +} from '../../selectors' +import { CONNECT_ROUTE } from '../../helpers/constants/routes' +import { getMostRecentOverviewPage } from '../../ducks/history/history' +import ConnectedSites from './connected-sites.component' + +const mapStateToProps = (state) => { + const { openMetaMaskTabs } = state.appState + const { id } = state.activeTab + const connectedDomains = getConnectedDomainsForSelectedAddress(state) + const originOfCurrentTab = getOriginOfCurrentTab(state) + const permittedAccountsByOrigin = getPermittedAccountsByOrigin(state) + const selectedAddress = getSelectedAddress(state) + + const currentTabHasNoAccounts = !permittedAccountsByOrigin[ + originOfCurrentTab + ]?.length + + let tabToConnect + if (originOfCurrentTab && currentTabHasNoAccounts && !openMetaMaskTabs[id]) { + tabToConnect = { + origin: originOfCurrentTab, + } + } + + return { + accountLabel: getCurrentAccountWithSendEtherInfo(state).name, + connectedDomains, + domains: getPermissionDomains(state), + domainHostCount: getPermissionsMetadataHostCounts(state), + mostRecentOverviewPage: getMostRecentOverviewPage(state), + permittedAccountsByOrigin, + selectedAddress, + tabToConnect, + } +} + +const mapDispatchToProps = (dispatch) => { + return { + getOpenMetamaskTabsIds: () => dispatch(getOpenMetamaskTabsIds()), + disconnectAccount: (domainKey, address) => { + dispatch(removePermittedAccount(domainKey, address)) + }, + disconnectAllAccounts: (domainKey, domain) => { + const permissionMethodNames = domain.permissions.map(({ parentCapability }) => parentCapability) + dispatch(removePermissionsFor({ + [domainKey]: permissionMethodNames, + })) + }, + requestAccountsPermissionWithId: (origin) => dispatch(requestAccountsPermissionWithId(origin)), + } +} + +const mergeProps = (stateProps, dispatchProps, ownProps) => { + const { + connectedDomains, + domains, + mostRecentOverviewPage, + selectedAddress, + tabToConnect, + } = stateProps + const { + disconnectAccount, + disconnectAllAccounts, + // eslint-disable-next-line no-shadow + requestAccountsPermissionWithId, + } = dispatchProps + const { history } = ownProps + + const closePopover = () => history.push(mostRecentOverviewPage) + + return { + ...ownProps, + ...stateProps, + ...dispatchProps, + closePopover, + disconnectAccount: (domainKey) => { + disconnectAccount(domainKey, selectedAddress) + if (connectedDomains.length === 1) { + closePopover() + } + }, + disconnectAllAccounts: (domainKey) => { + disconnectAllAccounts(domainKey, domains[domainKey]) + if (connectedDomains.length === 1) { + closePopover() + } + }, + requestAccountsPermission: async () => { + const id = await requestAccountsPermissionWithId(tabToConnect.origin) + history.push(`${CONNECT_ROUTE}/${id}`) + }, + } +} + +export default connect(mapStateToProps, mapDispatchToProps, mergeProps)(ConnectedSites) diff --git a/ui/app/pages/connected-sites/index.js b/ui/app/pages/connected-sites/index.js new file mode 100644 index 000000000000..96cf6e67de05 --- /dev/null +++ b/ui/app/pages/connected-sites/index.js @@ -0,0 +1 @@ +export { default } from './connected-sites.container' diff --git a/ui/app/pages/connected-sites/index.scss b/ui/app/pages/connected-sites/index.scss new file mode 100644 index 000000000000..5b963bf42b18 --- /dev/null +++ b/ui/app/pages/connected-sites/index.scss @@ -0,0 +1,34 @@ +.connected-sites { + h2 { + text-overflow: ellipsis; + margin-right: 10px; + } + + &__confirmation { + flex-direction: column; + + button:first-child { + margin-right: 24px; + } + } + + &__footer-row { + display: flex; + width: 100%; + flex-direction: row; + justify-content: space-between; + align-items: center; + } + + &__footer-row + &__footer-row { + margin-top: 15px; + } + + a, + a:hover { + font-size: 14px; + line-height: 20px; + color: $primary-blue; + cursor: pointer; + } +} diff --git a/ui/app/pages/create-account/connect-hardware/account-list.js b/ui/app/pages/create-account/connect-hardware/account-list.js index 247c27a5dcc2..f1f54ddbcc73 100644 --- a/ui/app/pages/create-account/connect-hardware/account-list.js +++ b/ui/app/pages/create-account/connect-hardware/account-list.js @@ -1,23 +1,22 @@ -const { Component } = require('react') -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const genAccountLink = require('../../../../lib/account-link.js') -const Select = require('react-select').default +import PropTypes from 'prop-types' +import React, { Component } from 'react' +import Select from 'react-select' +import getAccountLink from '../../../../lib/account-link' import Button from '../../../components/ui/button' class AccountList extends Component { - getHdPaths () { - return [ - { - label: `Ledger Live`, - value: `m/44'/60'/0'/0/0`, - }, - { - label: `Legacy (MEW / MyCrypto)`, - value: `m/44'/60'/0'`, - }, - ] - } + getHdPaths () { + return [ + { + label: `Ledger Live`, + value: `m/44'/60'/0'/0/0`, + }, + { + label: `Legacy (MEW / MyCrypto)`, + value: `m/44'/60'/0'`, + }, + ] + } goToNextPage = () => { // If we have < 5 accounts, it's restricted by BIP-44 @@ -36,22 +35,28 @@ class AccountList extends Component { const { onPathChange, selectedPath } = this.props const options = this.getHdPaths() - return h('div', [ - h('h3.hw-connect__hdPath__title', {}, this.context.t('selectHdPath')), - h('p.hw-connect__msg', {}, this.context.t('selectPathHelp')), - h('div.hw-connect__hdPath', [ - h(Select, { - className: 'hw-connect__hdPath__select', - name: 'hd-path-select', - clearable: false, - value: selectedPath, - options, - onChange: (opt) => { - onPathChange(opt.value) - }, - }), - ]), - ]) + return ( +
    +

    + {this.context.t('selectHdPath')} +

    +

    + {this.context.t('selectPathHelp')} +

    +
    + this.props.onAccountChange(e.target.value)} + checked={this.props.selectedAccount === account.index.toString()} + /> + +
    + + + +
    + ))} +
    + ) } - renderPagination () { - return h('div.hw-list-pagination', [ - h( - 'button.hw-list-pagination__button', - { - onClick: this.goToPreviousPage, - }, - `< ${this.context.t('prev')}` - ), - - h( - 'button.hw-list-pagination__button', - { - onClick: this.goToNextPage, - }, - `${this.context.t('next')} >` - ), - ]) - } - - renderButtons () { - const disabled = this.props.selectedAccount === null - const buttonProps = {} - if (disabled) { - buttonProps.disabled = true + renderPagination () { + return ( +
    + + +
    + ) } - return h('div.new-account-connect-form__buttons', {}, [ - h(Button, { - type: 'default', - large: true, - className: 'new-account-connect-form__button', - onClick: this.props.onCancel.bind(this), - }, [this.context.t('cancel')]), - - h(Button, { - type: 'primary', - large: true, - className: 'new-account-connect-form__button unlock', - disabled, - onClick: this.props.onUnlockAccount.bind(this, this.props.device), - }, [this.context.t('unlock')]), - ]) - } + renderButtons () { + const disabled = this.props.selectedAccount === null + const buttonProps = {} + if (disabled) { + buttonProps.disabled = true + } - renderForgetDevice () { - return h('div.hw-forget-device-container', {}, [ - h('a', { - onClick: this.props.onForgetDevice.bind(this, this.props.device), - }, this.context.t('forgetDevice')), - ]) - } + return ( +
    + + +
    + ) + } - render () { - return h('div.new-account-connect-form.account-list', {}, [ - this.renderHeader(), - this.renderAccounts(), - this.renderPagination(), - this.renderButtons(), - this.renderForgetDevice(), - ]) - } + renderForgetDevice () { + return ( + + ) + } -} + render () { + return ( +
    + {this.renderHeader()} + {this.renderAccounts()} + {this.renderPagination()} + {this.renderButtons()} + {this.renderForgetDevice()} +
    + ) + } +} AccountList.propTypes = { - onPathChange: PropTypes.func.isRequired, - selectedPath: PropTypes.string.isRequired, - device: PropTypes.string.isRequired, - accounts: PropTypes.array.isRequired, - onAccountChange: PropTypes.func.isRequired, - onForgetDevice: PropTypes.func.isRequired, - getPage: PropTypes.func.isRequired, - network: PropTypes.string, - selectedAccount: PropTypes.string, - history: PropTypes.object, - onUnlockAccount: PropTypes.func, - onCancel: PropTypes.func, - onAccountRestriction: PropTypes.func, + onPathChange: PropTypes.func.isRequired, + selectedPath: PropTypes.string.isRequired, + device: PropTypes.string.isRequired, + accounts: PropTypes.array.isRequired, + onAccountChange: PropTypes.func.isRequired, + onForgetDevice: PropTypes.func.isRequired, + getPage: PropTypes.func.isRequired, + network: PropTypes.string, + selectedAccount: PropTypes.string, + onUnlockAccount: PropTypes.func, + onCancel: PropTypes.func, + onAccountRestriction: PropTypes.func, } AccountList.contextTypes = { - t: PropTypes.func, + t: PropTypes.func, } -module.exports = AccountList +export default AccountList diff --git a/ui/app/pages/create-account/connect-hardware/connect-screen.js b/ui/app/pages/create-account/connect-hardware/connect-screen.js deleted file mode 100644 index a3b8ad246e47..000000000000 --- a/ui/app/pages/create-account/connect-hardware/connect-screen.js +++ /dev/null @@ -1,197 +0,0 @@ -const { Component } = require('react') -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -import Button from '../../../components/ui/button' - -class ConnectScreen extends Component { - constructor (props) { - super(props) - this.state = { - selectedDevice: null, - } - } - - connect = () => { - if (this.state.selectedDevice) { - this.props.connectToHardwareWallet(this.state.selectedDevice) - } - return null - } - - renderConnectToTrezorButton () { - return h( - `button.hw-connect__btn${this.state.selectedDevice === 'trezor' ? '.selected' : ''}`, - { onClick: _ => this.setState({selectedDevice: 'trezor'}) }, - h('img.hw-connect__btn__img', { - src: 'images/trezor-logo.svg', - }) - ) - } - - renderConnectToLedgerButton () { - return h( - `button.hw-connect__btn${this.state.selectedDevice === 'ledger' ? '.selected' : ''}`, - { onClick: _ => this.setState({selectedDevice: 'ledger'}) }, - h('img.hw-connect__btn__img', { - src: 'images/ledger-logo.svg', - }) - ) - } - - renderButtons () { - return ( - h('div', {}, [ - h('div.hw-connect__btn-wrapper', {}, [ - this.renderConnectToLedgerButton(), - this.renderConnectToTrezorButton(), - ]), - h(Button, { - type: 'primary', - large: true, - className: 'hw-connect__connect-btn', - onClick: this.connect, - disabled: !this.state.selectedDevice, - }, this.context.t('connect')), - ]) - ) - } - - renderUnsupportedBrowser () { - return ( - h('div.new-account-connect-form.unsupported-browser', {}, [ - h('div.hw-connect', [ - h('h3.hw-connect__title', {}, this.context.t('browserNotSupported')), - h('p.hw-connect__msg', {}, this.context.t('chromeRequiredForHardwareWallets')), - ]), - h(Button, { - type: 'primary', - large: true, - onClick: () => global.platform.openWindow({ - url: 'https://google.com/chrome', - }), - }, this.context.t('downloadGoogleChrome')), - ]) - ) - } - - renderHeader () { - return ( - h('div.hw-connect__header', {}, [ - h('h3.hw-connect__header__title', {}, this.context.t(`hardwareWallets`)), - h('p.hw-connect__header__msg', {}, this.context.t(`hardwareWalletsMsg`)), - ]) - ) - } - - getAffiliateLinks () { - const links = { - trezor: `Trezor`, - ledger: `Ledger`, - } - - const text = this.context.t('orderOneHere') - const response = text.replace('Trezor', links.trezor).replace('Ledger', links.ledger) - - return h('div.hw-connect__get-hw__msg', { dangerouslySetInnerHTML: {__html: response }}) - } - - renderTrezorAffiliateLink () { - return h('div.hw-connect__get-hw', {}, [ - h('p.hw-connect__get-hw__msg', {}, this.context.t(`dontHaveAHardwareWallet`)), - this.getAffiliateLinks(), - ]) - } - - - scrollToTutorial = () => { - if (this.referenceNode) this.referenceNode.scrollIntoView({behavior: 'smooth'}) - } - - renderLearnMore () { - return ( - h('p.hw-connect__learn-more', { - onClick: this.scrollToTutorial, - }, [ - this.context.t('learnMore'), - h('img.hw-connect__learn-more__arrow', { src: 'images/caret-right.svg'}), - ]) - ) - } - - renderTutorialSteps () { - const steps = [ - { - asset: 'hardware-wallet-step-1', - dimensions: {width: '225px', height: '75px'}, - }, - { - asset: 'hardware-wallet-step-2', - dimensions: {width: '300px', height: '100px'}, - }, - { - asset: 'hardware-wallet-step-3', - dimensions: {width: '120px', height: '90px'}, - }, - ] - - return h('.hw-tutorial', { - ref: node => { this.referenceNode = node }, - }, - steps.map((step, i) => ( - h('div.hw-connect', {}, [ - h('h3.hw-connect__title', {}, this.context.t(`step${i + 1}HardwareWallet`)), - h('p.hw-connect__msg', {}, this.context.t(`step${i + 1}HardwareWalletMsg`)), - h('img.hw-connect__step-asset', { src: `images/${step.asset}.svg`, ...step.dimensions }), - ]) - )) - ) - } - - renderFooter () { - return ( - h('div.hw-connect__footer', {}, [ - h('h3.hw-connect__footer__title', {}, this.context.t(`readyToConnect`)), - this.renderButtons(), - h('p.hw-connect__footer__msg', {}, [ - this.context.t(`havingTroubleConnecting`), - h('a.hw-connect__footer__link', { - href: 'https://support.metamask.io/', - target: '_blank', - }, this.context.t('getHelp')), - ]), - ]) - ) - } - - renderConnectScreen () { - return ( - h('div.new-account-connect-form', {}, [ - this.renderHeader(), - this.renderButtons(), - this.renderTrezorAffiliateLink(), - this.renderLearnMore(), - this.renderTutorialSteps(), - this.renderFooter(), - ]) - ) - } - - render () { - if (this.props.browserSupported) { - return this.renderConnectScreen() - } - return this.renderUnsupportedBrowser() - } -} - -ConnectScreen.propTypes = { - connectToHardwareWallet: PropTypes.func.isRequired, - browserSupported: PropTypes.bool.isRequired, -} - -ConnectScreen.contextTypes = { - t: PropTypes.func, -} - -module.exports = ConnectScreen - diff --git a/ui/app/pages/create-account/connect-hardware/index.js b/ui/app/pages/create-account/connect-hardware/index.js index 80a160205d12..4e537cacf032 100644 --- a/ui/app/pages/create-account/connect-hardware/index.js +++ b/ui/app/pages/create-account/connect-hardware/index.js @@ -1,56 +1,51 @@ -const { Component } = require('react') -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const connect = require('react-redux').connect -const actions = require('../../../store/actions') -const { getMetaMaskAccounts } = require('../../../selectors/selectors') -const ConnectScreen = require('./connect-screen') -const AccountList = require('./account-list') -const { DEFAULT_ROUTE } = require('../../../helpers/constants/routes') -const { formatBalance } = require('../../../helpers/utils/util') +import React, { Component } from 'react' +import PropTypes from 'prop-types' +import { connect } from 'react-redux' +import * as actions from '../../../store/actions' +import { getMetaMaskAccounts } from '../../../selectors' +import { formatBalance } from '../../../helpers/utils/util' +import { getMostRecentOverviewPage } from '../../../ducks/history/history' +import SelectHardware from './select-hardware' +import AccountList from './account-list' class ConnectHardwareForm extends Component { - constructor (props) { - super(props) - this.state = { - error: null, - selectedAccount: null, - accounts: [], - browserSupported: true, - unlocked: false, - device: null, - } + state = { + error: null, + selectedAccount: null, + accounts: [], + browserSupported: true, + unlocked: false, + device: null, } - componentWillReceiveProps (nextProps) { + UNSAFE_componentWillReceiveProps (nextProps) { const { accounts } = nextProps - const newAccounts = this.state.accounts.map(a => { + const newAccounts = this.state.accounts.map((a) => { const normalizedAddress = a.address.toLowerCase() - const balanceValue = accounts[normalizedAddress] && accounts[normalizedAddress].balance || null + const balanceValue = (accounts[normalizedAddress] && accounts[normalizedAddress].balance) || null a.balance = balanceValue ? formatBalance(balanceValue, 6) : '...' return a }) - this.setState({accounts: newAccounts}) + this.setState({ accounts: newAccounts }) } - componentDidMount () { this.checkIfUnlocked() } async checkIfUnlocked () { - ['trezor', 'ledger'].forEach(async device => { + for (const device of ['trezor', 'ledger']) { const unlocked = await this.props.checkHardwareStatus(device, this.props.defaultHdPaths[device]) if (unlocked) { - this.setState({unlocked: true}) + this.setState({ unlocked: true }) this.getPage(device, 0, this.props.defaultHdPaths[device]) } - }) + } } connectToHardwareWallet = (device) => { if (this.state.accounts.length) { - return null + return } // Default values @@ -58,22 +53,22 @@ class ConnectHardwareForm extends Component { } onPathChange = (path) => { - this.props.setHardwareWalletDefaultHdPath({device: this.state.device, path}) + this.props.setHardwareWalletDefaultHdPath({ device: this.state.device, path }) this.getPage(this.state.device, 0, path) } onAccountChange = (account) => { - this.setState({selectedAccount: account.toString(), error: null}) + this.setState({ selectedAccount: account.toString(), error: null }) } onAccountRestriction = () => { - this.setState({error: this.context.t('ledgerAccountRestriction') }) + this.setState({ error: this.context.t('ledgerAccountRestriction') }) } showTemporaryAlert () { this.props.showAlert(this.context.t('hardwareWalletConnected')) // Autohide the alert after 5 seconds - setTimeout(_ => { + setTimeout((_) => { this.props.hideAlert() }, 5000) } @@ -81,7 +76,7 @@ class ConnectHardwareForm extends Component { getPage = (device, page, hdPath) => { this.props .connectHardware(device, page, hdPath) - .then(accounts => { + .then((accounts) => { if (accounts.length) { // If we just loaded the accounts for the first time @@ -99,15 +94,14 @@ class ConnectHardwareForm extends Component { } }) // If the page doesn't contain the selected account, let's deselect it - } else if (!accounts.filter(a => a.index.toString() === this.state.selectedAccount).length) { + } else if (!accounts.filter((a) => a.index.toString() === this.state.selectedAccount).length) { newState.selectedAccount = null } - // Map accounts with balances - newState.accounts = accounts.map(account => { + newState.accounts = accounts.map((account) => { const normalizedAddress = account.address.toLowerCase() - const balanceValue = this.props.accounts[normalizedAddress] && this.props.accounts[normalizedAddress].balance || null + const balanceValue = (this.props.accounts[normalizedAddress] && this.props.accounts[normalizedAddress].balance) || null account.balance = balanceValue ? formatBalance(balanceValue, 6) : '...' return account }) @@ -115,107 +109,119 @@ class ConnectHardwareForm extends Component { this.setState(newState) } }) - .catch(e => { - if (e === 'Window blocked') { - this.setState({ browserSupported: false, error: null}) - } else if (e !== 'Window closed' && e !== 'Popup closed') { - this.setState({ error: e.toString() }) + .catch((e) => { + const errorMessage = e.message + if (errorMessage === 'Window blocked') { + this.setState({ browserSupported: false, error: null }) + } else if (errorMessage !== 'Window closed' && errorMessage !== 'Popup closed') { + this.setState({ error: errorMessage }) } }) } onForgetDevice = (device) => { this.props.forgetDevice(device) - .then(_ => { - this.setState({ - error: null, - selectedAccount: null, - accounts: [], - unlocked: false, + .then((_) => { + this.setState({ + error: null, + selectedAccount: null, + accounts: [], + unlocked: false, + }) + }).catch((e) => { + this.setState({ error: e.message }) }) - }).catch(e => { - this.setState({ error: e.toString() }) - }) } onUnlockAccount = (device) => { + const { history, mostRecentOverviewPage, unlockHardwareWalletAccount } = this.props if (this.state.selectedAccount === null) { this.setState({ error: this.context.t('accountSelectionRequired') }) } - this.props.unlockHardwareWalletAccount(this.state.selectedAccount, device) - .then(_ => { - this.context.metricsEvent({ - eventOpts: { - category: 'Accounts', - action: 'Connected Hardware Wallet', - name: 'Connected Account with: ' + device, - }, + unlockHardwareWalletAccount(this.state.selectedAccount, device) + .then((_) => { + this.context.metricsEvent({ + eventOpts: { + category: 'Accounts', + action: 'Connected Hardware Wallet', + name: `Connected Account with: ${device}`, + }, + }) + history.push(mostRecentOverviewPage) + }).catch((e) => { + this.context.metricsEvent({ + eventOpts: { + category: 'Accounts', + action: 'Connected Hardware Wallet', + name: 'Error connecting hardware wallet', + }, + customVariables: { + error: e.message, + }, + }) + this.setState({ error: e.message }) }) - this.props.history.push(DEFAULT_ROUTE) - }).catch(e => { - this.context.metricsEvent({ - eventOpts: { - category: 'Accounts', - action: 'Connected Hardware Wallet', - name: 'Error connecting hardware wallet', - }, - customVariables: { - error: e.toString(), - }, - }) - this.setState({ error: e.toString() }) - }) } onCancel = () => { - this.props.history.push(DEFAULT_ROUTE) + const { history, mostRecentOverviewPage } = this.props + history.push(mostRecentOverviewPage) } renderError () { return this.state.error - ? h('span.error', { style: { margin: '20px 20px 10px', display: 'block', textAlign: 'center' } }, this.state.error) + ? ( + + {this.state.error} + + ) : null } renderContent () { if (!this.state.accounts.length) { - return h(ConnectScreen, { - connectToHardwareWallet: this.connectToHardwareWallet, - browserSupported: this.state.browserSupported, - }) + return ( + + ) } - return h(AccountList, { - onPathChange: this.onPathChange, - selectedPath: this.props.defaultHdPaths[this.state.device], - device: this.state.device, - accounts: this.state.accounts, - selectedAccount: this.state.selectedAccount, - onAccountChange: this.onAccountChange, - network: this.props.network, - getPage: this.getPage, - history: this.props.history, - onUnlockAccount: this.onUnlockAccount, - onForgetDevice: this.onForgetDevice, - onCancel: this.onCancel, - onAccountRestriction: this.onAccountRestriction, - }) + return ( + + ) } render () { - return h('div', [ - this.renderError(), - this.renderContent(), - ]) + return ( + <> + {this.renderError()} + {this.renderContent()} + + ) } } ConnectHardwareForm.propTypes = { - hideModal: PropTypes.func, - showImportPage: PropTypes.func, - showConnectPage: PropTypes.func, connectHardware: PropTypes.func, checkHardwareStatus: PropTypes.func, forgetDevice: PropTypes.func, @@ -223,21 +229,19 @@ ConnectHardwareForm.propTypes = { hideAlert: PropTypes.func, unlockHardwareWalletAccount: PropTypes.func, setHardwareWalletDefaultHdPath: PropTypes.func, - numberOfExistingAccounts: PropTypes.number, history: PropTypes.object, - t: PropTypes.func, network: PropTypes.string, accounts: PropTypes.object, address: PropTypes.string, defaultHdPaths: PropTypes.object, + mostRecentOverviewPage: PropTypes.string.isRequired, } -const mapStateToProps = state => { +const mapStateToProps = (state) => { const { - metamask: { network, selectedAddress, identities = {} }, + metamask: { network, selectedAddress }, } = state const accounts = getMetaMaskAccounts(state) - const numberOfExistingAccounts = Object.keys(identities).length const { appState: { defaultHdPaths }, } = state @@ -246,15 +250,15 @@ const mapStateToProps = state => { network, accounts, address: selectedAddress, - numberOfExistingAccounts, defaultHdPaths, + mostRecentOverviewPage: getMostRecentOverviewPage(state), } } -const mapDispatchToProps = dispatch => { +const mapDispatchToProps = (dispatch) => { return { - setHardwareWalletDefaultHdPath: ({device, path}) => { - return dispatch(actions.setHardwareWalletDefaultHdPath({device, path})) + setHardwareWalletDefaultHdPath: ({ device, path }) => { + return dispatch(actions.setHardwareWalletDefaultHdPath({ device, path })) }, connectHardware: (deviceName, page, hdPath) => { return dispatch(actions.connectHardware(deviceName, page, hdPath)) @@ -268,8 +272,6 @@ const mapDispatchToProps = dispatch => { unlockHardwareWalletAccount: (index, deviceName, hdPath) => { return dispatch(actions.unlockHardwareWalletAccount(index, deviceName, hdPath)) }, - showImportPage: () => dispatch(actions.showImportPage()), - showConnectPage: () => dispatch(actions.showConnectPage()), showAlert: (msg) => dispatch(actions.showAlert(msg)), hideAlert: () => dispatch(actions.hideAlert()), } @@ -280,6 +282,6 @@ ConnectHardwareForm.contextTypes = { metricsEvent: PropTypes.func, } -module.exports = connect(mapStateToProps, mapDispatchToProps)( - ConnectHardwareForm +export default connect(mapStateToProps, mapDispatchToProps)( + ConnectHardwareForm, ) diff --git a/ui/app/pages/create-account/connect-hardware/index.scss b/ui/app/pages/create-account/connect-hardware/index.scss new file mode 100644 index 000000000000..887fd7ec9462 --- /dev/null +++ b/ui/app/pages/create-account/connect-hardware/index.scss @@ -0,0 +1,343 @@ +.hw-tutorial { + width: 375px; + border-top: 1px solid #d2d8dd; + border-bottom: 1px solid #d2d8dd; + overflow: visible; + display: block; + padding: 15px 30px; +} + +.hw-connect { + width: 100%; + + &__header { + &__title { + margin-top: 5px; + margin-bottom: 15px; + font-size: 22px; + } + + &__msg { + font-size: 14px; + color: #9b9b9b; + margin-top: 10px; + margin-bottom: 20px; + } + } + + &__btn-wrapper { + flex: 1; + flex-direction: row; + display: flex; + } + + &__connect-btn { + width: 315px; + margin: 20px; + } + + &__connect-btn.disabled { + cursor: not-allowed; + opacity: 0.5; + } + + &__btn { + background: #fbfbfb; + border: 2px solid #e5e5e5; + height: 100px; + width: 150px; + flex: 1; + display: flex; + align-items: center; + justify-content: center; + border-radius: 5px; + padding: 0; + + &__img { + width: 95px; + } + } + + &__btn.selected { + border: 2px solid #00a8ee; + width: 149px; + } + + &__btn:first-child { + margin-right: 15px; + margin-left: 20px; + } + + &__btn:last-child { + margin-right: 20px; + } + + &__hdPath { + display: flex; + flex-direction: row; + margin-top: 15px; + margin-bottom: 30px; + font-size: 14px; + + &__title { + display: flex; + margin-top: 10px; + margin-right: 15px; + } + + &__select { + display: flex; + flex: 1; + } + } + + &__learn-more { + margin-top: 15px; + font-size: 14px; + color: #5b5d67; + line-height: 19px; + text-align: center; + cursor: pointer; + + &__arrow { + transform: rotate(90deg); + display: block; + text-align: center; + height: 30px; + margin: 0 auto 10px; + } + } + + &__title { + padding-top: 10px; + font-weight: 400; + font-size: 18px; + } + + &__unlock-title { + padding-top: 10px; + font-weight: 400; + font-size: 22px; + margin-bottom: 15px; + } + + &__msg { + font-size: 14px; + color: #9b9b9b; + margin-top: 10px; + margin-bottom: 15px; + } + + &__link { + color: #2f9ae0; + } + + &__footer { + &__title { + padding-top: 15px; + padding-bottom: 12px; + font-weight: 400; + font-size: 18px; + text-align: center; + } + + &__msg { + font-size: 14px; + color: #9b9b9b; + margin-top: 12px; + margin-bottom: 27px; + width: 100%; + display: block; + margin-left: 20px; + } + + &__link { + color: #2f9ae0; + margin-left: 5px; + } + } + + &__get-hw { + width: 100%; + padding-bottom: 10px; + padding-top: 10px; + + &__msg { + font-size: 14px; + color: #9b9b9b; + } + + &__link { + font-size: 14px; + text-align: center; + color: #2f9ae0; + cursor: pointer; + } + } + + &__step-asset { + margin: 0 auto 20px; + display: flex; + } +} + +.hw-account-list { + display: flex; + flex: 1; + flex-flow: column; + width: 100%; + + &__title_wrapper { + display: flex; + flex-direction: row; + flex: 1; + } + + &__title { + margin-bottom: 23px; + align-self: flex-start; + color: $scorpion; + font-size: 16px; + line-height: 21px; + font-weight: bold; + display: flex; + flex: 1; + } + + &__device { + margin-bottom: 23px; + align-self: flex-end; + color: $scorpion; + font-size: 16px; + line-height: 21px; + font-weight: normal; + display: flex; + } + + &__item { + font-size: 15px; + flex-direction: row; + display: flex; + padding-left: 10px; + padding-right: 10px; + } + + &__item:nth-of-type(even) { + background-color: #fbfbfb; + } + + &__item:nth-of-type(odd) { + background: rgba(0, 0, 0, 0.03); + } + + &__item:hover { + background-color: rgba(0, 0, 0, 0.06); + } + + &__item__index { + display: flex; + width: 24px; + } + + &__item__radio { + display: flex; + flex: 1; + + input { + padding: 10px; + margin-top: 13px; + } + } + + &__item__label { + display: flex; + flex: 1; + padding-left: 10px; + padding-top: 10px; + padding-bottom: 10px; + } + + &__item__balance { + display: flex; + flex: 1; + justify-content: center; + } + + &__item__link { + display: flex; + margin-top: 13px; + } + + &__item__link img { + width: 15px; + height: 15px; + } +} + +.hw-list-pagination { + display: flex; + align-self: flex-end; + margin-top: 10px; + + &__button { + background: #fff; + height: 19px; + display: flex; + color: #33a4e7; + font-size: 14px; + line-height: 19px; + border: none; + min-width: 46px; + margin-right: 0; + margin-left: 16px; + padding: 0; + text-transform: uppercase; + } +} + +.new-external-account-form { + display: flex; + flex-flow: column; + align-items: center; + padding: 15px 30px 0; + + &.unsupported-browser { + height: 210px; + overflow: auto; + scrollbar-width: none; + + &::-webkit-scrollbar { + display: none; + } + } + + &.account-list { + height: auto; + padding-left: 20px; + padding-right: 20px; + } + + &__buttons { + margin-top: 39px; + display: flex; + width: 100%; + justify-content: space-between; + } + + &__button:not(:last-child) { + margin-right: 16px; + } +} + +.hw-forget-device-container { + display: flex; + flex-flow: column; + align-items: center; + padding: 22px; + + a { + color: #2f9ae0; + font-size: 14px; + cursor: pointer; + } +} diff --git a/ui/app/pages/create-account/connect-hardware/select-hardware.js b/ui/app/pages/create-account/connect-hardware/select-hardware.js new file mode 100644 index 000000000000..02c26c95e63b --- /dev/null +++ b/ui/app/pages/create-account/connect-hardware/select-hardware.js @@ -0,0 +1,225 @@ +import classnames from 'classnames' +import PropTypes from 'prop-types' +import React, { Component } from 'react' +import Button from '../../../components/ui/button' + +export default class SelectHardware extends Component { + static contextTypes = { + t: PropTypes.func, + } + + static propTypes = { + connectToHardwareWallet: PropTypes.func.isRequired, + browserSupported: PropTypes.bool.isRequired, + } + + state = { + selectedDevice: null, + } + + connect = () => { + if (this.state.selectedDevice) { + this.props.connectToHardwareWallet(this.state.selectedDevice) + } + return null + } + + renderConnectToTrezorButton () { + return ( + + ) + } + + renderConnectToLedgerButton () { + return ( + + ) + } + + renderButtons () { + return ( + <> +
    + {this.renderConnectToLedgerButton()} + {this.renderConnectToTrezorButton()} +
    + + + ) + } + + renderUnsupportedBrowser () { + return ( +
    +
    +

    {this.context.t('browserNotSupported')}

    +

    {this.context.t('chromeRequiredForHardwareWallets')}

    +
    + +
    + ) + } + + renderHeader () { + return ( +
    +

    {this.context.t('hardwareWallets')}

    +

    {this.context.t('hardwareWalletsMsg')}

    +
    + ) + } + + getAffiliateLinks () { + const links = { + trezor: `Trezor`, + ledger: `Ledger`, + } + + const text = this.context.t('orderOneHere') + const response = text.replace('Trezor', links.trezor).replace('Ledger', links.ledger) + + return ( +
    + ) + } + + renderTrezorAffiliateLink () { + return ( +
    +

    {this.context.t('dontHaveAHardwareWallet')}

    + {this.getAffiliateLinks()} +
    + ) + } + + scrollToTutorial = () => { + if (this.referenceNode) { + this.referenceNode.scrollIntoView({ behavior: 'smooth' }) + } + } + + renderLearnMore () { + return ( +

    + {this.context.t('learnMore')} + +

    + ) + } + + renderTutorialSteps () { + const steps = [ + { + asset: 'hardware-wallet-step-1', + dimensions: { width: '225px', height: '75px' }, + title: this.context.t('step1HardwareWallet'), + message: this.context.t('step1HardwareWalletMsg'), + }, + { + asset: 'hardware-wallet-step-2', + dimensions: { width: '300px', height: '100px' }, + title: this.context.t('step2HardwareWallet'), + message: this.context.t('step2HardwareWalletMsg'), + }, + { + asset: 'hardware-wallet-step-3', + dimensions: { width: '120px', height: '90px' }, + title: this.context.t('step3HardwareWallet'), + message: this.context.t('step3HardwareWalletMsg'), + }, + ] + + return ( +
    { + this.referenceNode = node + }} + > + {steps.map((step, index) => ( +
    +

    {step.title}

    +

    {step.message}

    + +
    + ))} +
    + ) + } + + renderFooter () { + return ( +
    +

    {this.context.t('readyToConnect')}

    + {this.renderButtons()} +

    + {this.context.t('havingTroubleConnecting')} + + {this.context.t('getHelp')} + +

    +
    + ) + } + + renderConnectScreen () { + return ( +
    + {this.renderHeader()} + {this.renderButtons()} + {this.renderTrezorAffiliateLink()} + {this.renderLearnMore()} + {this.renderTutorialSteps()} + {this.renderFooter()} +
    + ) + } + + render () { + if (this.props.browserSupported) { + return this.renderConnectScreen() + } + return this.renderUnsupportedBrowser() + } +} diff --git a/ui/app/pages/create-account/create-account.component.js b/ui/app/pages/create-account/create-account.component.js new file mode 100644 index 000000000000..2ff859144dcb --- /dev/null +++ b/ui/app/pages/create-account/create-account.component.js @@ -0,0 +1,78 @@ +import React, { Component } from 'react' +import { Switch, Route, matchPath } from 'react-router-dom' +import PropTypes from 'prop-types' +import classnames from 'classnames' +import { + NEW_ACCOUNT_ROUTE, + IMPORT_ACCOUNT_ROUTE, + CONNECT_HARDWARE_ROUTE, +} from '../../helpers/constants/routes' +import NewAccountCreateForm from './new-account.container' +import NewAccountImportForm from './import-account' +import ConnectHardwareForm from './connect-hardware' + +export default class CreateAccountPage extends Component { + renderTabs () { + const { history, location: { pathname } } = this.props + const getClassNames = (path) => classnames('new-account__tabs__tab', { + 'new-account__tabs__selected': matchPath(pathname, { + path, + exact: true, + }), + }) + + return ( +
    +
    history.push(NEW_ACCOUNT_ROUTE)}> + {this.context.t('create')} +
    +
    history.push(IMPORT_ACCOUNT_ROUTE)}> + {this.context.t('import')} +
    +
    history.push(CONNECT_HARDWARE_ROUTE)}> + {this.context.t('hardware')} +
    +
    + ) + } + + render () { + return ( +
    +
    +
    + {this.renderTabs()} +
    +
    +
    + + + + + +
    +
    + ) + } +} + +CreateAccountPage.propTypes = { + location: PropTypes.object, + history: PropTypes.object, +} + +CreateAccountPage.contextTypes = { + t: PropTypes.func, +} diff --git a/ui/app/pages/create-account/import-account/index.js b/ui/app/pages/create-account/import-account/index.js index 48d8f8838bf5..dee390024731 100644 --- a/ui/app/pages/create-account/import-account/index.js +++ b/ui/app/pages/create-account/import-account/index.js @@ -1,96 +1,84 @@ -const inherits = require('util').inherits -const Component = require('react').Component -const h = require('react-hyperscript') -const PropTypes = require('prop-types') -const connect = require('react-redux').connect +import React, { Component } from 'react' +import PropTypes from 'prop-types' import Select from 'react-select' // Subviews -const JsonImportView = require('./json.js') -const PrivateKeyImportView = require('./private-key.js') +import JsonImportView from './json' +import PrivateKeyImportView from './private-key' +export default class AccountImportSubview extends Component { + static contextTypes = { + t: PropTypes.func, + } -AccountImportSubview.contextTypes = { - t: PropTypes.func, -} - -module.exports = connect()(AccountImportSubview) - - -inherits(AccountImportSubview, Component) -function AccountImportSubview () { - Component.call(this) -} - -AccountImportSubview.prototype.getMenuItemTexts = function () { - return [ - this.context.t('privateKey'), - this.context.t('jsonFile'), - ] -} - -AccountImportSubview.prototype.render = function () { - const state = this.state || {} - const menuItems = this.getMenuItemTexts() - const { type } = state - - return ( - h('div.new-account-import-form', [ - - h('.new-account-import-disclaimer', [ - h('span', this.context.t('importAccountMsg')), - h('span', { - style: { - cursor: 'pointer', - textDecoration: 'underline', - }, - onClick: () => { - global.platform.openWindow({ - url: 'https://metamask.zendesk.com/hc/en-us/articles/360015289932', - }) - }, - }, this.context.t('here')), - ]), - - h('div.new-account-import-form__select-section', [ - - h('div.new-account-import-form__select-label', this.context.t('selectType')), - - h(Select, { - className: 'new-account-import-form__select', - name: 'import-type-select', - clearable: false, - value: type || menuItems[0], - options: menuItems.map((type) => { - return { - value: type, - label: type, - } - }), - onChange: (opt) => { - this.setState({ type: opt.value }) - }, - }), - - ]), + state = {} - this.renderImportView(), - ]) - ) -} + getMenuItemTexts () { + return [ + this.context.t('privateKey'), + this.context.t('jsonFile'), + ] + } -AccountImportSubview.prototype.renderImportView = function () { - const state = this.state || {} - const { type } = state - const menuItems = this.getMenuItemTexts() - const current = type || menuItems[0] + renderImportView () { + const { type } = this.state + const menuItems = this.getMenuItemTexts() + const current = type || menuItems[0] + + switch (current) { + case this.context.t('privateKey'): + return + case this.context.t('jsonFile'): + return + default: + return + } + } - switch (current) { - case this.context.t('privateKey'): - return h(PrivateKeyImportView) - case this.context.t('jsonFile'): - return h(JsonImportView) - default: - return h(JsonImportView) + render () { + const menuItems = this.getMenuItemTexts() + const { type } = this.state + + return ( +
    +
    + {this.context.t('importAccountMsg')} + { + global.platform.openTab({ + url: 'https://metamask.zendesk.com/hc/en-us/articles/360015289932', + }) + }} + > + {this.context.t('here')} + +
    +
    +
    + {this.context.t('selectType')} +
    + this.checkInputEmpty()} + ref={this.inputRef} + /> +
    + + +
    + { + error + ? {error} + : null + } +
    ) } - onLoad (event, file) { - this.setState({file: file, fileContents: event.target.result}) + onLoad (event) { + this.setState({ + fileContents: event.target.result, + }) } createKeyringOnEnter (event) { @@ -88,28 +89,28 @@ class JsonImportSubview extends Component { } createNewKeychain () { - const { firstAddress, displayWarning, importNewJsonAccount, setSelectedAddress, history } = this.props - const state = this.state - - if (!state) { - const message = this.context.t('validFileImport') - return displayWarning(message) - } - - const { fileContents } = state + const { + firstAddress, + displayWarning, + history, + importNewJsonAccount, + mostRecentOverviewPage, + setSelectedAddress, + } = this.props + const { fileContents } = this.state if (!fileContents) { const message = this.context.t('needImportFile') - return displayWarning(message) + displayWarning(message) + return } - const passwordInput = document.getElementById('json-password-box') - const password = passwordInput.value + const password = this.inputRef.current.value - importNewJsonAccount([ fileContents, password ]) + importNewJsonAccount([fileContents, password]) .then(({ selectedAddress }) => { if (selectedAddress) { - history.push(DEFAULT_ROUTE) + history.push(mostRecentOverviewPage) this.context.metricsEvent({ eventOpts: { category: 'Accounts', @@ -130,33 +131,41 @@ class JsonImportSubview extends Component { setSelectedAddress(firstAddress) } }) - .catch(err => err && displayWarning(err.message || err)) + .catch((err) => err && displayWarning(err.message || err)) + } + + checkInputEmpty () { + const password = this.inputRef.current.value + let isEmpty = true + if (password !== '') { + isEmpty = false + } + this.setState({ isEmpty }) } } JsonImportSubview.propTypes = { error: PropTypes.string, - goHome: PropTypes.func, displayWarning: PropTypes.func, firstAddress: PropTypes.string, importNewJsonAccount: PropTypes.func, history: PropTypes.object, setSelectedAddress: PropTypes.func, - t: PropTypes.func, + mostRecentOverviewPage: PropTypes.string.isRequired, } -const mapStateToProps = state => { +const mapStateToProps = (state) => { return { error: state.appState.warning, firstAddress: Object.keys(getMetaMaskAccounts(state))[0], + mostRecentOverviewPage: getMostRecentOverviewPage(state), } } -const mapDispatchToProps = dispatch => { +const mapDispatchToProps = (dispatch) => { return { - goHome: () => dispatch(actions.goHome()), - displayWarning: warning => dispatch(actions.displayWarning(warning)), - importNewJsonAccount: options => dispatch(actions.importNewAccount('JSON File', options)), + displayWarning: (warning) => dispatch(actions.displayWarning(warning)), + importNewJsonAccount: (options) => dispatch(actions.importNewAccount('JSON File', options)), setSelectedAddress: (address) => dispatch(actions.setSelectedAddress(address)), } } @@ -166,7 +175,7 @@ JsonImportSubview.contextTypes = { metricsEvent: PropTypes.func, } -module.exports = compose( +export default compose( withRouter, - connect(mapStateToProps, mapDispatchToProps) + connect(mapStateToProps, mapDispatchToProps), )(JsonImportSubview) diff --git a/ui/app/pages/create-account/import-account/private-key.js b/ui/app/pages/create-account/import-account/private-key.js index 0cdf25ce9b90..cbc155f815da 100644 --- a/ui/app/pages/create-account/import-account/private-key.js +++ b/ui/app/pages/create-account/import-account/private-key.js @@ -1,128 +1,150 @@ -const inherits = require('util').inherits -const Component = require('react').Component -const h = require('react-hyperscript') -const { withRouter } = require('react-router-dom') -const { compose } = require('recompose') -const PropTypes = require('prop-types') -const connect = require('react-redux').connect -const actions = require('../../../store/actions') -const { DEFAULT_ROUTE } = require('../../../helpers/constants/routes') -const { getMetaMaskAccounts } = require('../../../selectors/selectors') +import React, { Component } from 'react' +import { withRouter } from 'react-router-dom' +import { compose } from 'redux' +import PropTypes from 'prop-types' +import { connect } from 'react-redux' +import * as actions from '../../../store/actions' +import { getMetaMaskAccounts } from '../../../selectors' import Button from '../../../components/ui/button' +import { getMostRecentOverviewPage } from '../../../ducks/history/history' -PrivateKeyImportView.contextTypes = { - t: PropTypes.func, - metricsEvent: PropTypes.func, +class PrivateKeyImportView extends Component { + static contextTypes = { + t: PropTypes.func, + metricsEvent: PropTypes.func, + } + + static propTypes = { + importNewAccount: PropTypes.func.isRequired, + history: PropTypes.object.isRequired, + displayWarning: PropTypes.func.isRequired, + setSelectedAddress: PropTypes.func.isRequired, + firstAddress: PropTypes.string.isRequired, + error: PropTypes.node, + mostRecentOverviewPage: PropTypes.string.isRequired, + } + + inputRef = React.createRef() + + state = { isEmpty: true } + + createNewKeychain () { + const privateKey = this.inputRef.current.value + const { importNewAccount, history, displayWarning, mostRecentOverviewPage, setSelectedAddress, firstAddress } = this.props + + importNewAccount('Private Key', [privateKey]) + .then(({ selectedAddress }) => { + if (selectedAddress) { + this.context.metricsEvent({ + eventOpts: { + category: 'Accounts', + action: 'Import Account', + name: 'Imported Account with Private Key', + }, + }) + history.push(mostRecentOverviewPage) + displayWarning(null) + } else { + displayWarning('Error importing account.') + this.context.metricsEvent({ + eventOpts: { + category: 'Accounts', + action: 'Import Account', + name: 'Error importing with Private Key', + }, + }) + setSelectedAddress(firstAddress) + } + }) + .catch((err) => err && displayWarning(err.message || err)) + } + + createKeyringOnEnter = (event) => { + if (event.key === 'Enter') { + event.preventDefault() + this.createNewKeychain() + } + } + + checkInputEmpty () { + const privateKey = this.inputRef.current.value + let isEmpty = true + if (privateKey !== '') { + isEmpty = false + } + this.setState({ isEmpty }) + } + + render () { + const { error, displayWarning } = this.props + + return ( +
    + + {this.context.t('pastePrivateKey')} + +
    + this.createKeyringOnEnter(e)} + onChange={() => this.checkInputEmpty()} + ref={this.inputRef} + /> +
    +
    + + +
    + { + error + ? {error} + : null + } +
    + ) + } } -module.exports = compose( +export default compose( withRouter, - connect(mapStateToProps, mapDispatchToProps) + connect(mapStateToProps, mapDispatchToProps), )(PrivateKeyImportView) - function mapStateToProps (state) { return { error: state.appState.warning, firstAddress: Object.keys(getMetaMaskAccounts(state))[0], + mostRecentOverviewPage: getMostRecentOverviewPage(state), } } function mapDispatchToProps (dispatch) { return { - importNewAccount: (strategy, [ privateKey ]) => { - return dispatch(actions.importNewAccount(strategy, [ privateKey ])) + importNewAccount: (strategy, [privateKey]) => { + return dispatch(actions.importNewAccount(strategy, [privateKey])) }, displayWarning: (message) => dispatch(actions.displayWarning(message || null)), setSelectedAddress: (address) => dispatch(actions.setSelectedAddress(address)), } } - -inherits(PrivateKeyImportView, Component) -function PrivateKeyImportView () { - this.createKeyringOnEnter = this.createKeyringOnEnter.bind(this) - Component.call(this) -} - -PrivateKeyImportView.prototype.render = function () { - const { error, displayWarning } = this.props - - return ( - h('div.new-account-import-form__private-key', [ - - h('span.new-account-create-form__instruction', this.context.t('pastePrivateKey')), - - h('div.new-account-import-form__private-key-password-container', [ - - h('input.new-account-import-form__input-password', { - type: 'password', - id: 'private-key-box', - onKeyPress: e => this.createKeyringOnEnter(e), - }), - - ]), - - h('div.new-account-import-form__buttons', {}, [ - - h(Button, { - type: 'default', - large: true, - className: 'new-account-create-form__button', - onClick: () => { - displayWarning(null) - this.props.history.push(DEFAULT_ROUTE) - }, - }, [this.context.t('cancel')]), - - h(Button, { - type: 'secondary', - large: true, - className: 'new-account-create-form__button', - onClick: () => this.createNewKeychain(), - }, [this.context.t('import')]), - - ]), - - error ? h('span.error', error) : null, - ]) - ) -} - -PrivateKeyImportView.prototype.createKeyringOnEnter = function (event) { - if (event.key === 'Enter') { - event.preventDefault() - this.createNewKeychain() - } -} - -PrivateKeyImportView.prototype.createNewKeychain = function () { - const input = document.getElementById('private-key-box') - const privateKey = input.value - const { importNewAccount, history, displayWarning, setSelectedAddress, firstAddress } = this.props - - importNewAccount('Private Key', [ privateKey ]) - .then(({ selectedAddress }) => { - if (selectedAddress) { - this.context.metricsEvent({ - eventOpts: { - category: 'Accounts', - action: 'Import Account', - name: 'Imported Account with Private Key', - }, - }) - history.push(DEFAULT_ROUTE) - displayWarning(null) - } else { - displayWarning('Error importing account.') - this.context.metricsEvent({ - eventOpts: { - category: 'Accounts', - action: 'Import Account', - name: 'Error importing with Private Key', - }, - }) - setSelectedAddress(firstAddress) - } - }) - .catch(err => err && displayWarning(err.message || err)) -} diff --git a/ui/app/pages/create-account/import-account/seed.js b/ui/app/pages/create-account/import-account/seed.js deleted file mode 100644 index 73332f926123..000000000000 --- a/ui/app/pages/create-account/import-account/seed.js +++ /dev/null @@ -1,35 +0,0 @@ -const inherits = require('util').inherits -const Component = require('react').Component -const h = require('react-hyperscript') -const PropTypes = require('prop-types') -const connect = require('react-redux').connect - -SeedImportSubview.contextTypes = { - t: PropTypes.func, -} - -module.exports = connect(mapStateToProps)(SeedImportSubview) - - -function mapStateToProps () { - return {} -} - -inherits(SeedImportSubview, Component) -function SeedImportSubview () { - Component.call(this) -} - -SeedImportSubview.prototype.render = function () { - return ( - h('div', { - style: { - }, - }, [ - this.context.t('pasteSeed'), - h('textarea'), - h('br'), - h('button', this.context.t('submit')), - ]) - ) -} diff --git a/ui/app/pages/create-account/index.js b/ui/app/pages/create-account/index.js index ce84db028a40..a736bfff72b1 100644 --- a/ui/app/pages/create-account/index.js +++ b/ui/app/pages/create-account/index.js @@ -1,113 +1 @@ -const Component = require('react').Component -const { Switch, Route, matchPath } = require('react-router-dom') -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const connect = require('react-redux').connect -const actions = require('../../store/actions') -const { getCurrentViewContext } = require('../../selectors/selectors') -const classnames = require('classnames') -const NewAccountCreateForm = require('./new-account') -const NewAccountImportForm = require('./import-account') -const ConnectHardwareForm = require('./connect-hardware') -const { - NEW_ACCOUNT_ROUTE, - IMPORT_ACCOUNT_ROUTE, - CONNECT_HARDWARE_ROUTE, -} = require('../../helpers/constants/routes') - -class CreateAccountPage extends Component { - renderTabs () { - const { history, location } = this.props - - return h('div.new-account__tabs', [ - h('div.new-account__tabs__tab', { - className: classnames('new-account__tabs__tab', { - 'new-account__tabs__selected': matchPath(location.pathname, { - path: NEW_ACCOUNT_ROUTE, exact: true, - }), - }), - onClick: () => history.push(NEW_ACCOUNT_ROUTE), - }, [ - this.context.t('create'), - ]), - - h('div.new-account__tabs__tab', { - className: classnames('new-account__tabs__tab', { - 'new-account__tabs__selected': matchPath(location.pathname, { - path: IMPORT_ACCOUNT_ROUTE, exact: true, - }), - }), - onClick: () => history.push(IMPORT_ACCOUNT_ROUTE), - }, [ - this.context.t('import'), - ]), - h( - 'div.new-account__tabs__tab', - { - className: classnames('new-account__tabs__tab', { - 'new-account__tabs__selected': matchPath(location.pathname, { - path: CONNECT_HARDWARE_ROUTE, - exact: true, - }), - }), - onClick: () => history.push(CONNECT_HARDWARE_ROUTE), - }, - this.context.t('connect') - ), - ]) - } - - render () { - return h('div.new-account', {}, [ - h('div.new-account__header', [ - h('div.new-account__title', this.context.t('newAccount')), - this.renderTabs(), - ]), - h('div.new-account__form', [ - h(Switch, [ - h(Route, { - exact: true, - path: NEW_ACCOUNT_ROUTE, - component: NewAccountCreateForm, - }), - h(Route, { - exact: true, - path: IMPORT_ACCOUNT_ROUTE, - component: NewAccountImportForm, - }), - h(Route, { - exact: true, - path: CONNECT_HARDWARE_ROUTE, - component: ConnectHardwareForm, - }), - ]), - ]), - ]) - } -} - -CreateAccountPage.propTypes = { - location: PropTypes.object, - history: PropTypes.object, - t: PropTypes.func, -} - -CreateAccountPage.contextTypes = { - t: PropTypes.func, -} - -const mapStateToProps = state => ({ - displayedForm: getCurrentViewContext(state), -}) - -const mapDispatchToProps = dispatch => ({ - displayForm: form => dispatch(actions.setNewAccountForm(form)), - showQrView: (selected, identity) => dispatch(actions.showQrView(selected, identity)), - showExportPrivateKeyModal: () => { - dispatch(actions.showModal({ name: 'EXPORT_PRIVATE_KEY' })) - }, - hideModal: () => dispatch(actions.hideModal()), - setAccountLabel: (address, label) => dispatch(actions.setAccountLabel(address, label)), -}) - -module.exports = connect(mapStateToProps, mapDispatchToProps)(CreateAccountPage) +export { default } from './create-account.component' diff --git a/ui/app/pages/create-account/index.scss b/ui/app/pages/create-account/index.scss new file mode 100644 index 000000000000..d6b1717e07f4 --- /dev/null +++ b/ui/app/pages/create-account/index.scss @@ -0,0 +1,103 @@ +@import 'connect-hardware/index'; +@import 'import-account/index'; + +.new-account { + width: 375px; + background-color: #fff; + box-shadow: 0 0 7px 0 rgba(0, 0, 0, 0.08); + z-index: 25; + height: unset; + overflow: auto; + scrollbar-width: none; + + &::-webkit-scrollbar { + display: none; + } + + @media screen and (min-width: 576px) { + position: absolute; + } + + &__header { + display: flex; + flex-flow: column; + border-bottom: 1px solid $geyser; + } + + &__title { + color: $tundora; + font-size: 32px; + font-weight: 500; + line-height: 43px; + margin-top: 22px; + margin-left: 29px; + } + + &__tabs { + margin-left: 22px; + display: flex; + margin-top: 10px; + + &__tab { + height: 54px; + padding: 15px 10px; + color: $dusty-gray; + font-size: 18px; + line-height: 24px; + text-align: center; + cursor: pointer; + } + + &__tab:hover { + color: $black; + border-bottom: none; + } + + &__selected { + color: $primary-blue; + border-bottom: 3px solid $primary-blue; + cursor: initial; + pointer-events: none; + } + } +} + + +.new-account-create-form { + display: flex; + flex-flow: column; + align-items: center; + padding: 30px; + + &__input-label { + color: $scorpion; + font-size: 16px; + line-height: 21px; + align-self: flex-start; + } + + &__input { + height: 54px; + width: 315.84px; + border: 1px solid $geyser; + border-radius: 4px; + background-color: $white; + color: $scorpion; + font-size: 16px; + line-height: 21px; + margin-top: 15px; + padding: 0 20px; + } + + &__buttons { + margin-top: 39px; + display: flex; + width: 100%; + justify-content: space-between; + } + + &__button { + width: 150px; + min-width: initial; + } +} diff --git a/ui/app/pages/create-account/new-account.component.js b/ui/app/pages/create-account/new-account.component.js new file mode 100644 index 000000000000..ef811a84f691 --- /dev/null +++ b/ui/app/pages/create-account/new-account.component.js @@ -0,0 +1,92 @@ +import React, { Component } from 'react' +import PropTypes from 'prop-types' +import Button from '../../components/ui/button' + +export default class NewAccountCreateForm extends Component { + static defaultProps = { + newAccountNumber: 0, + } + + state = { + newAccountName: '', + defaultAccountName: this.context.t('newAccountNumberName', [ + this.props.newAccountNumber, + ]), + } + + render () { + const { newAccountName, defaultAccountName } = this.state + const { history, createAccount, mostRecentOverviewPage } = this.props + const createClick = (_) => { + createAccount(newAccountName || defaultAccountName) + .then(() => { + this.context.metricsEvent({ + eventOpts: { + category: 'Accounts', + action: 'Add New Account', + name: 'Added New Account', + }, + }) + history.push(mostRecentOverviewPage) + }) + .catch((e) => { + this.context.metricsEvent({ + eventOpts: { + category: 'Accounts', + action: 'Add New Account', + name: 'Error', + }, + customVariables: { + errorMessage: e.message, + }, + }) + }) + } + + return ( +
    +
    + {this.context.t('accountName')} +
    +
    + this.setState({ newAccountName: event.target.value })} + /> +
    + + +
    +
    +
    + ) + } +} + +NewAccountCreateForm.propTypes = { + createAccount: PropTypes.func, + newAccountNumber: PropTypes.number, + history: PropTypes.object, + mostRecentOverviewPage: PropTypes.string.isRequired, +} + +NewAccountCreateForm.contextTypes = { + t: PropTypes.func, + metricsEvent: PropTypes.func, +} diff --git a/ui/app/pages/create-account/new-account.container.js b/ui/app/pages/create-account/new-account.container.js new file mode 100644 index 000000000000..d1680b4b3f62 --- /dev/null +++ b/ui/app/pages/create-account/new-account.container.js @@ -0,0 +1,32 @@ +import { connect } from 'react-redux' +import * as actions from '../../store/actions' +import { getMostRecentOverviewPage } from '../../ducks/history/history' +import NewAccountCreateForm from './new-account.component' + +const mapStateToProps = (state) => { + const { metamask: { network, selectedAddress, identities = {} } } = state + const numberOfExistingAccounts = Object.keys(identities).length + const newAccountNumber = numberOfExistingAccounts + 1 + + return { + network, + address: selectedAddress, + newAccountNumber, + mostRecentOverviewPage: getMostRecentOverviewPage(state), + } +} + +const mapDispatchToProps = (dispatch) => { + return { + createAccount: (newAccountName) => { + return dispatch(actions.addNewAccount()) + .then((newAccountAddress) => { + if (newAccountName) { + dispatch(actions.setAccountLabel(newAccountAddress, newAccountName)) + } + }) + }, + } +} + +export default connect(mapStateToProps, mapDispatchToProps)(NewAccountCreateForm) diff --git a/ui/app/pages/create-account/new-account.js b/ui/app/pages/create-account/new-account.js deleted file mode 100644 index d19e6bc388d2..000000000000 --- a/ui/app/pages/create-account/new-account.js +++ /dev/null @@ -1,130 +0,0 @@ -const { Component } = require('react') -const PropTypes = require('prop-types') -const h = require('react-hyperscript') -const connect = require('react-redux').connect -const actions = require('../../store/actions') -const { DEFAULT_ROUTE } = require('../../helpers/constants/routes') -import Button from '../../components/ui/button' - -class NewAccountCreateForm extends Component { - constructor (props, context) { - super(props) - - const { numberOfExistingAccounts = 0 } = props - const newAccountNumber = numberOfExistingAccounts + 1 - - this.state = { - newAccountName: '', - defaultAccountName: context.t('newAccountNumberName', [newAccountNumber]), - } - } - - render () { - const { newAccountName, defaultAccountName } = this.state - const { history, createAccount } = this.props - - return h('div.new-account-create-form', [ - - h('div.new-account-create-form__input-label', {}, [ - this.context.t('accountName'), - ]), - - h('div.new-account-create-form__input-wrapper', {}, [ - h('input.new-account-create-form__input', { - value: newAccountName, - placeholder: defaultAccountName, - onChange: event => this.setState({ newAccountName: event.target.value }), - }, []), - ]), - - h('div.new-account-create-form__buttons', {}, [ - - h(Button, { - type: 'default', - large: true, - className: 'new-account-create-form__button', - onClick: () => history.push(DEFAULT_ROUTE), - }, [this.context.t('cancel')]), - - h(Button, { - type: 'secondary', - large: true, - className: 'new-account-create-form__button', - onClick: () => { - createAccount(newAccountName || defaultAccountName) - .then(() => { - this.context.metricsEvent({ - eventOpts: { - category: 'Accounts', - action: 'Add New Account', - name: 'Added New Account', - }, - }) - history.push(DEFAULT_ROUTE) - }) - .catch((e) => { - this.context.metricsEvent({ - eventOpts: { - category: 'Accounts', - action: 'Add New Account', - name: 'Error', - }, - customVariables: { - errorMessage: e.message, - }, - }) - }) - }, - }, [this.context.t('create')]), - - ]), - - ]) - } -} - -NewAccountCreateForm.propTypes = { - hideModal: PropTypes.func, - showImportPage: PropTypes.func, - showConnectPage: PropTypes.func, - createAccount: PropTypes.func, - numberOfExistingAccounts: PropTypes.number, - history: PropTypes.object, - t: PropTypes.func, -} - -const mapStateToProps = state => { - const { metamask: { network, selectedAddress, identities = {} } } = state - const numberOfExistingAccounts = Object.keys(identities).length - - return { - network, - address: selectedAddress, - numberOfExistingAccounts, - } -} - -const mapDispatchToProps = dispatch => { - return { - toCoinbase: address => dispatch(actions.buyEth({ network: '1', address, amount: 0 })), - hideModal: () => dispatch(actions.hideModal()), - createAccount: newAccountName => { - return dispatch(actions.addNewAccount()) - .then(newAccountAddress => { - if (newAccountName) { - dispatch(actions.setAccountLabel(newAccountAddress, newAccountName)) - } - }) - }, - showImportPage: () => dispatch(actions.showImportPage()), - showConnectPage: () => dispatch(actions.showConnectPage()), - } -} - -NewAccountCreateForm.contextTypes = { - t: PropTypes.func, - metricsEvent: PropTypes.func, -} - -module.exports = connect(mapStateToProps, mapDispatchToProps)(NewAccountCreateForm) - diff --git a/ui/app/pages/create-account/tests/create-account.test.js b/ui/app/pages/create-account/tests/create-account.test.js new file mode 100644 index 000000000000..f41aa27960ca --- /dev/null +++ b/ui/app/pages/create-account/tests/create-account.test.js @@ -0,0 +1,46 @@ +import assert from 'assert' +import React from 'react' +import sinon from 'sinon' +import { mountWithRouter } from '../../../../../test/lib/render-helpers' +import CreateAccountPage from '..' + +describe('Create Account Page', function () { + let wrapper + + const props = { + history: { + push: sinon.spy(), + }, + location: { + pathname: '/new-account', + }, + } + + before(function () { + wrapper = mountWithRouter( + , + ) + }) + + afterEach(function () { + props.history.push.resetHistory() + }) + + it('clicks create account and routes to new-account path', function () { + const createAccount = wrapper.find('.new-account__tabs__tab').at(0) + createAccount.simulate('click') + assert.equal(props.history.push.getCall(0).args[0], '/new-account') + }) + + it('clicks import account and routes to import new account path', function () { + const importAccount = wrapper.find('.new-account__tabs__tab').at(1) + importAccount.simulate('click') + assert.equal(props.history.push.getCall(0).args[0], '/new-account/import') + }) + + it('clicks connect HD Wallet and routes to connect new account path', function () { + const connectHdWallet = wrapper.find('.new-account__tabs__tab').at(2) + connectHdWallet.simulate('click') + assert.equal(props.history.push.getCall(0).args[0], '/new-account/connect') + }) +}) diff --git a/ui/app/pages/error/error.component.js b/ui/app/pages/error/error.component.js new file mode 100644 index 000000000000..1da1ac60937d --- /dev/null +++ b/ui/app/pages/error/error.component.js @@ -0,0 +1,74 @@ +import React, { PureComponent } from 'react' +import PropTypes from 'prop-types' +import { getEnvironmentType } from '../../../../app/scripts/lib/util' +import { ENVIRONMENT_TYPE_POPUP } from '../../../../app/scripts/lib/enums' + +class ErrorPage extends PureComponent { + static contextTypes = { + t: PropTypes.func.isRequired, + } + + static propTypes = { + error: PropTypes.object.isRequired, + } + + renderErrorDetail (content) { + return ( +
  • +

    + {content} +

    +
  • + ) + } + + renderErrorStack (title, stack) { + return ( +
  • + + {title} + +
    +          {stack}
    +        
    +
  • + ) + } + + render () { + const { error } = this.props + const { t } = this.context + + const isPopup = getEnvironmentType() === ENVIRONMENT_TYPE_POPUP + + return ( +
    +

    + {t('errorPageTitle')} +

    +

    + { + isPopup + ? t('errorPagePopupMessage') + : t('errorPageMessage') + } +

    +
    +
    + + {t('errorDetails')} + +
      + { error.message ? this.renderErrorDetail(t('errorMessage', [error.message])) : null } + { error.code ? this.renderErrorDetail(t('errorCode', [error.code])) : null } + { error.name ? this.renderErrorDetail(t('errorName', [error.name])) : null } + { error.stack ? this.renderErrorStack(t('errorStack'), error.stack) : null } +
    +
    +
    +
    + ) + } +} + +export default ErrorPage diff --git a/ui/app/pages/error/index.js b/ui/app/pages/error/index.js new file mode 100644 index 000000000000..c2a9f62d9adf --- /dev/null +++ b/ui/app/pages/error/index.js @@ -0,0 +1 @@ +export { default } from './error.component' diff --git a/ui/app/pages/error/index.scss b/ui/app/pages/error/index.scss new file mode 100644 index 000000000000..14ec9da846f4 --- /dev/null +++ b/ui/app/pages/error/index.scss @@ -0,0 +1,38 @@ +.error-page { + display: flex; + flex-flow: column nowrap; + align-items: center; + font-style: normal; + font-weight: normal; + padding: 35px 10px 10px 10px; + height: 100%; + + &__header { + display: flex; + justify-content: center; + font-size: 42px; + padding: 10px 0; + text-align: center; + } + + &__subheader { + font-size: 19px; + padding: 10px 0; + width: 100%; + max-width: 720px; + text-align: center; + } + + &__details { + font-size: 18px; + overflow-y: auto; + width: 100%; + max-width: 720px; + padding-top: 10px; + } + + &__stack { + overflow-x: auto; + background-color: #eee; + } +} diff --git a/ui/app/pages/first-time-flow/create-password/create-password.component.js b/ui/app/pages/first-time-flow/create-password/create-password.component.js index 5e67a2244460..a159601da7c2 100644 --- a/ui/app/pages/first-time-flow/create-password/create-password.component.js +++ b/ui/app/pages/first-time-flow/create-password/create-password.component.js @@ -1,13 +1,14 @@ import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import { Switch, Route } from 'react-router-dom' -import NewAccount from './new-account' -import ImportWithSeedPhrase from './import-with-seed-phrase' +import MetaFoxLogo from '../../../components/ui/metafox-logo' import { INITIALIZE_CREATE_PASSWORD_ROUTE, INITIALIZE_IMPORT_WITH_SEED_PHRASE_ROUTE, INITIALIZE_SEED_PHRASE_ROUTE, } from '../../../helpers/constants/routes' +import NewAccount from './new-account' +import ImportWithSeedPhrase from './import-with-seed-phrase' export default class CreatePassword extends PureComponent { static propTypes = { @@ -30,26 +31,14 @@ export default class CreatePassword extends PureComponent { return (
    -
    - - -
    + ( + render={(routeProps) => ( )} @@ -57,9 +46,9 @@ export default class CreatePassword extends PureComponent { ( + render={(routeProps) => ( )} diff --git a/ui/app/pages/first-time-flow/create-password/create-password.container.js b/ui/app/pages/first-time-flow/create-password/create-password.container.js index 89106f0168cf..728764d6c486 100644 --- a/ui/app/pages/first-time-flow/create-password/create-password.container.js +++ b/ui/app/pages/first-time-flow/create-password/create-password.container.js @@ -1,7 +1,7 @@ import { connect } from 'react-redux' import CreatePassword from './create-password.component' -const mapStateToProps = state => { +const mapStateToProps = (state) => { const { metamask: { isInitialized } } = state return { diff --git a/ui/app/pages/first-time-flow/create-password/import-with-seed-phrase/import-with-seed-phrase.component.js b/ui/app/pages/first-time-flow/create-password/import-with-seed-phrase/import-with-seed-phrase.component.js index a2fb5a3bfbd6..2c3dc1c78193 100644 --- a/ui/app/pages/first-time-flow/create-password/import-with-seed-phrase/import-with-seed-phrase.component.js +++ b/ui/app/pages/first-time-flow/create-password/import-with-seed-phrase/import-with-seed-phrase.component.js @@ -1,4 +1,4 @@ -import {validateMnemonic} from 'bip39' +import { validateMnemonic } from 'bip39' import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import TextField from '../../../../components/ui/text-field' @@ -17,10 +17,14 @@ export default class ImportWithSeedPhrase extends PureComponent { static propTypes = { history: PropTypes.object, onSubmit: PropTypes.func.isRequired, + setSeedPhraseBackedUp: PropTypes.func, + initializeThreeBox: PropTypes.func, + completeOnboarding: PropTypes.func, } state = { seedPhrase: '', + showSeedPhrase: false, password: '', confirmPassword: '', seedPhraseError: '', @@ -29,26 +33,10 @@ export default class ImportWithSeedPhrase extends PureComponent { termsChecked: false, } - parseSeedPhrase = (seedPhrase) => { - if (!seedPhrase) { - return '' - } - - const trimmed = seedPhrase.trim() - if (!trimmed) { - return '' - } - - const words = trimmed.match(/\w+/g) - if (!words) { - return '' - } - - return words.join(' ') - } + parseSeedPhrase = (seedPhrase) => (seedPhrase || '').trim().toLowerCase().match(/\w+/gu)?.join(' ') || '' - componentWillMount () { - window.onbeforeunload = () => this.context.metricsEvent({ + UNSAFE_componentWillMount () { + this._onBeforeUnload = () => this.context.metricsEvent({ eventOpts: { category: 'Onboarding', action: 'Import Seed Phrase', @@ -59,6 +47,11 @@ export default class ImportWithSeedPhrase extends PureComponent { errorMessage: this.state.seedPhraseError, }, }) + window.addEventListener('beforeunload', this._onBeforeUnload) + } + + componentWillUnmount () { + window.removeEventListener('beforeunload', this._onBeforeUnload) } handleSeedPhraseChange (seedPhrase) { @@ -66,7 +59,8 @@ export default class ImportWithSeedPhrase extends PureComponent { if (seedPhrase) { const parsedSeedPhrase = this.parseSeedPhrase(seedPhrase) - if (parsedSeedPhrase.split(' ').length !== 12) { + const wordCount = parsedSeedPhrase.split(/\s/u).length + if (wordCount % 3 !== 0 || wordCount > 24 || wordCount < 12) { seedPhraseError = this.context.t('seedPhraseReq') } else if (!validateMnemonic(parsedSeedPhrase)) { seedPhraseError = this.context.t('invalidSeedPhrase') @@ -79,7 +73,7 @@ export default class ImportWithSeedPhrase extends PureComponent { handlePasswordChange (password) { const { t } = this.context - this.setState(state => { + this.setState((state) => { const { confirmPassword } = state let confirmPasswordError = '' let passwordError = '' @@ -103,7 +97,7 @@ export default class ImportWithSeedPhrase extends PureComponent { handleConfirmPasswordChange (confirmPassword) { const { t } = this.context - this.setState(state => { + this.setState((state) => { const { password } = state let confirmPasswordError = '' @@ -118,7 +112,7 @@ export default class ImportWithSeedPhrase extends PureComponent { }) } - handleImport = async event => { + handleImport = async (event) => { event.preventDefault() if (!this.isValid()) { @@ -126,7 +120,7 @@ export default class ImportWithSeedPhrase extends PureComponent { } const { password, seedPhrase } = this.state - const { history, onSubmit } = this.props + const { history, onSubmit, setSeedPhraseBackedUp, initializeThreeBox, completeOnboarding } = this.props try { await onSubmit(password, this.parseSeedPhrase(seedPhrase)) @@ -137,7 +131,12 @@ export default class ImportWithSeedPhrase extends PureComponent { name: 'Import Complete', }, }) - history.push(INITIALIZE_END_OF_FLOW_ROUTE) + + setSeedPhraseBackedUp(true).then(async () => { + await completeOnboarding() + initializeThreeBox() + history.push(INITIALIZE_END_OF_FLOW_ROUTE) + }) } catch (error) { this.setState({ seedPhraseError: error.message }) } @@ -164,6 +163,12 @@ export default class ImportWithSeedPhrase extends PureComponent { return !passwordError && !confirmPasswordError && !seedPhraseError } + onTermsKeyPress = ({ key }) => { + if (key === ' ' || key === 'Enter') { + this.toggleTermsCheck() + } + } + toggleTermsCheck = () => { this.context.metricsEvent({ eventOpts: { @@ -172,15 +177,20 @@ export default class ImportWithSeedPhrase extends PureComponent { name: 'Check ToS', }, }) - this.setState((prevState) => ({ - termsChecked: !prevState.termsChecked, + termsChecked: !prevState.termsChecked, + })) + } + + toggleShowSeedPhrase = () => { + this.setState(({ showSeedPhrase }) => ({ + showSeedPhrase: !showSeedPhrase, })) } render () { const { t } = this.context - const { seedPhraseError, passwordError, confirmPasswordError, termsChecked } = this.state + const { seedPhraseError, showSeedPhrase, passwordError, confirmPasswordError, termsChecked } = this.state return (
    -